xref: /openbmc/linux/net/smc/smc_netlink.c (revision fa0866625543b4d8b3d026e4e0ef5ec25a453920)
1e8372d9dSGuvenc Gulce // SPDX-License-Identifier: GPL-2.0
2e8372d9dSGuvenc Gulce /*
3e8372d9dSGuvenc Gulce  *  Shared Memory Communications over RDMA (SMC-R) and RoCE
4e8372d9dSGuvenc Gulce  *
5e8372d9dSGuvenc Gulce  *  Generic netlink support functions to interact with SMC module
6e8372d9dSGuvenc Gulce  *
7e8372d9dSGuvenc Gulce  *  Copyright IBM Corp. 2020
8e8372d9dSGuvenc Gulce  *
9e8372d9dSGuvenc Gulce  *  Author(s):	Guvenc Gulce <guvenc@linux.ibm.com>
10e8372d9dSGuvenc Gulce  */
11e8372d9dSGuvenc Gulce 
12e8372d9dSGuvenc Gulce #include <linux/module.h>
13e8372d9dSGuvenc Gulce #include <linux/list.h>
14e8372d9dSGuvenc Gulce #include <linux/ctype.h>
15e8372d9dSGuvenc Gulce #include <linux/mutex.h>
16e8372d9dSGuvenc Gulce #include <linux/if.h>
17e8372d9dSGuvenc Gulce #include <linux/smc.h>
18e8372d9dSGuvenc Gulce 
19e8372d9dSGuvenc Gulce #include "smc_core.h"
20aaf95523SGuvenc Gulce #include "smc_ism.h"
21a3db10efSGuvenc Gulce #include "smc_ib.h"
22*fa086662SKarsten Graul #include "smc_clc.h"
238c40602bSGuvenc Gulce #include "smc_stats.h"
24e8372d9dSGuvenc Gulce #include "smc_netlink.h"
25e8372d9dSGuvenc Gulce 
26*fa086662SKarsten Graul const struct nla_policy
27*fa086662SKarsten Graul smc_gen_ueid_policy[SMC_NLA_EID_TABLE_MAX + 1] = {
28*fa086662SKarsten Graul 	[SMC_NLA_EID_TABLE_UNSPEC]	= { .type = NLA_UNSPEC },
29*fa086662SKarsten Graul 	[SMC_NLA_EID_TABLE_ENTRY]	= { .type = NLA_STRING,
30*fa086662SKarsten Graul 					    .len = SMC_MAX_EID_LEN,
31*fa086662SKarsten Graul 					  },
32*fa086662SKarsten Graul };
33e8372d9dSGuvenc Gulce 
34*fa086662SKarsten Graul #define SMC_CMD_MAX_ATTR 1
35e8372d9dSGuvenc Gulce /* SMC_GENL generic netlink operation definition */
36e8372d9dSGuvenc Gulce static const struct genl_ops smc_gen_nl_ops[] = {
37099b990bSGuvenc Gulce 	{
38099b990bSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_SYS_INFO,
39099b990bSGuvenc Gulce 		/* can be retrieved by unprivileged users */
40099b990bSGuvenc Gulce 		.dumpit = smc_nl_get_sys_info,
41099b990bSGuvenc Gulce 	},
42e9b8c845SGuvenc Gulce 	{
43e9b8c845SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_LGR_SMCR,
44e9b8c845SGuvenc Gulce 		/* can be retrieved by unprivileged users */
45e9b8c845SGuvenc Gulce 		.dumpit = smcr_nl_get_lgr,
46e9b8c845SGuvenc Gulce 	},
475a7e09d5SGuvenc Gulce 	{
485a7e09d5SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_LINK_SMCR,
495a7e09d5SGuvenc Gulce 		/* can be retrieved by unprivileged users */
505a7e09d5SGuvenc Gulce 		.dumpit = smcr_nl_get_link,
515a7e09d5SGuvenc Gulce 	},
528f9dde4bSGuvenc Gulce 	{
538f9dde4bSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_LGR_SMCD,
548f9dde4bSGuvenc Gulce 		/* can be retrieved by unprivileged users */
558f9dde4bSGuvenc Gulce 		.dumpit = smcd_nl_get_lgr,
568f9dde4bSGuvenc Gulce 	},
57aaf95523SGuvenc Gulce 	{
58aaf95523SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_DEV_SMCD,
59aaf95523SGuvenc Gulce 		/* can be retrieved by unprivileged users */
60aaf95523SGuvenc Gulce 		.dumpit = smcd_nl_get_device,
61aaf95523SGuvenc Gulce 	},
62a3db10efSGuvenc Gulce 	{
63a3db10efSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_DEV_SMCR,
64a3db10efSGuvenc Gulce 		/* can be retrieved by unprivileged users */
65a3db10efSGuvenc Gulce 		.dumpit = smcr_nl_get_device,
66a3db10efSGuvenc Gulce 	},
678c40602bSGuvenc Gulce 	{
688c40602bSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_STATS,
698c40602bSGuvenc Gulce 		/* can be retrieved by unprivileged users */
708c40602bSGuvenc Gulce 		.dumpit = smc_nl_get_stats,
718c40602bSGuvenc Gulce 	},
72f0dd7bf5SGuvenc Gulce 	{
73f0dd7bf5SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_FBACK_STATS,
74f0dd7bf5SGuvenc Gulce 		/* can be retrieved by unprivileged users */
75f0dd7bf5SGuvenc Gulce 		.dumpit = smc_nl_get_fback_stats,
76f0dd7bf5SGuvenc Gulce 	},
77*fa086662SKarsten Graul 	{
78*fa086662SKarsten Graul 		.cmd = SMC_NETLINK_DUMP_UEID,
79*fa086662SKarsten Graul 		/* can be retrieved by unprivileged users */
80*fa086662SKarsten Graul 		.dumpit = smc_nl_dump_ueid,
81*fa086662SKarsten Graul 	},
82*fa086662SKarsten Graul 	{
83*fa086662SKarsten Graul 		.cmd = SMC_NETLINK_ADD_UEID,
84*fa086662SKarsten Graul 		.flags = GENL_ADMIN_PERM,
85*fa086662SKarsten Graul 		.doit = smc_nl_add_ueid,
86*fa086662SKarsten Graul 		.policy = smc_gen_ueid_policy,
87*fa086662SKarsten Graul 	},
88*fa086662SKarsten Graul 	{
89*fa086662SKarsten Graul 		.cmd = SMC_NETLINK_REMOVE_UEID,
90*fa086662SKarsten Graul 		.flags = GENL_ADMIN_PERM,
91*fa086662SKarsten Graul 		.doit = smc_nl_remove_ueid,
92*fa086662SKarsten Graul 		.policy = smc_gen_ueid_policy,
93*fa086662SKarsten Graul 	},
94*fa086662SKarsten Graul 	{
95*fa086662SKarsten Graul 		.cmd = SMC_NETLINK_FLUSH_UEID,
96*fa086662SKarsten Graul 		.flags = GENL_ADMIN_PERM,
97*fa086662SKarsten Graul 		.doit = smc_nl_flush_ueid,
98*fa086662SKarsten Graul 	},
99e8372d9dSGuvenc Gulce };
100e8372d9dSGuvenc Gulce 
101e8372d9dSGuvenc Gulce static const struct nla_policy smc_gen_nl_policy[2] = {
102e8372d9dSGuvenc Gulce 	[SMC_CMD_MAX_ATTR]	= { .type = NLA_REJECT, },
103e8372d9dSGuvenc Gulce };
104e8372d9dSGuvenc Gulce 
105e8372d9dSGuvenc Gulce /* SMC_GENL family definition */
106e8372d9dSGuvenc Gulce struct genl_family smc_gen_nl_family __ro_after_init = {
107e8372d9dSGuvenc Gulce 	.hdrsize =	0,
108e8372d9dSGuvenc Gulce 	.name =		SMC_GENL_FAMILY_NAME,
109e8372d9dSGuvenc Gulce 	.version =	SMC_GENL_FAMILY_VERSION,
110e8372d9dSGuvenc Gulce 	.maxattr =	SMC_CMD_MAX_ATTR,
111e8372d9dSGuvenc Gulce 	.policy =	smc_gen_nl_policy,
112e8372d9dSGuvenc Gulce 	.netnsok =	true,
113e8372d9dSGuvenc Gulce 	.module =	THIS_MODULE,
114e8372d9dSGuvenc Gulce 	.ops =		smc_gen_nl_ops,
115e8372d9dSGuvenc Gulce 	.n_ops =	ARRAY_SIZE(smc_gen_nl_ops)
116e8372d9dSGuvenc Gulce };
117e8372d9dSGuvenc Gulce 
118e8372d9dSGuvenc Gulce int __init smc_nl_init(void)
119e8372d9dSGuvenc Gulce {
120e8372d9dSGuvenc Gulce 	return genl_register_family(&smc_gen_nl_family);
121e8372d9dSGuvenc Gulce }
122e8372d9dSGuvenc Gulce 
123e8372d9dSGuvenc Gulce void smc_nl_exit(void)
124e8372d9dSGuvenc Gulce {
125e8372d9dSGuvenc Gulce 	genl_unregister_family(&smc_gen_nl_family);
126e8372d9dSGuvenc Gulce }
127