xref: /openbmc/linux/net/smc/smc_netlink.c (revision a3db10ef)
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"
21*a3db10efSGuvenc Gulce #include "smc_ib.h"
22e8372d9dSGuvenc Gulce #include "smc_netlink.h"
23e8372d9dSGuvenc Gulce 
24e8372d9dSGuvenc Gulce #define SMC_CMD_MAX_ATTR 1
25e8372d9dSGuvenc Gulce 
26e8372d9dSGuvenc Gulce /* SMC_GENL generic netlink operation definition */
27e8372d9dSGuvenc Gulce static const struct genl_ops smc_gen_nl_ops[] = {
28099b990bSGuvenc Gulce 	{
29099b990bSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_SYS_INFO,
30099b990bSGuvenc Gulce 		/* can be retrieved by unprivileged users */
31099b990bSGuvenc Gulce 		.dumpit = smc_nl_get_sys_info,
32099b990bSGuvenc Gulce 	},
33e9b8c845SGuvenc Gulce 	{
34e9b8c845SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_LGR_SMCR,
35e9b8c845SGuvenc Gulce 		/* can be retrieved by unprivileged users */
36e9b8c845SGuvenc Gulce 		.dumpit = smcr_nl_get_lgr,
37e9b8c845SGuvenc Gulce 	},
385a7e09d5SGuvenc Gulce 	{
395a7e09d5SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_LINK_SMCR,
405a7e09d5SGuvenc Gulce 		/* can be retrieved by unprivileged users */
415a7e09d5SGuvenc Gulce 		.dumpit = smcr_nl_get_link,
425a7e09d5SGuvenc Gulce 	},
438f9dde4bSGuvenc Gulce 	{
448f9dde4bSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_LGR_SMCD,
458f9dde4bSGuvenc Gulce 		/* can be retrieved by unprivileged users */
468f9dde4bSGuvenc Gulce 		.dumpit = smcd_nl_get_lgr,
478f9dde4bSGuvenc Gulce 	},
48aaf95523SGuvenc Gulce 	{
49aaf95523SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_DEV_SMCD,
50aaf95523SGuvenc Gulce 		/* can be retrieved by unprivileged users */
51aaf95523SGuvenc Gulce 		.dumpit = smcd_nl_get_device,
52aaf95523SGuvenc Gulce 	},
53*a3db10efSGuvenc Gulce 	{
54*a3db10efSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_DEV_SMCR,
55*a3db10efSGuvenc Gulce 		/* can be retrieved by unprivileged users */
56*a3db10efSGuvenc Gulce 		.dumpit = smcr_nl_get_device,
57*a3db10efSGuvenc Gulce 	},
58e8372d9dSGuvenc Gulce };
59e8372d9dSGuvenc Gulce 
60e8372d9dSGuvenc Gulce static const struct nla_policy smc_gen_nl_policy[2] = {
61e8372d9dSGuvenc Gulce 	[SMC_CMD_MAX_ATTR]	= { .type = NLA_REJECT, },
62e8372d9dSGuvenc Gulce };
63e8372d9dSGuvenc Gulce 
64e8372d9dSGuvenc Gulce /* SMC_GENL family definition */
65e8372d9dSGuvenc Gulce struct genl_family smc_gen_nl_family __ro_after_init = {
66e8372d9dSGuvenc Gulce 	.hdrsize =	0,
67e8372d9dSGuvenc Gulce 	.name =		SMC_GENL_FAMILY_NAME,
68e8372d9dSGuvenc Gulce 	.version =	SMC_GENL_FAMILY_VERSION,
69e8372d9dSGuvenc Gulce 	.maxattr =	SMC_CMD_MAX_ATTR,
70e8372d9dSGuvenc Gulce 	.policy =	smc_gen_nl_policy,
71e8372d9dSGuvenc Gulce 	.netnsok =	true,
72e8372d9dSGuvenc Gulce 	.module =	THIS_MODULE,
73e8372d9dSGuvenc Gulce 	.ops =		smc_gen_nl_ops,
74e8372d9dSGuvenc Gulce 	.n_ops =	ARRAY_SIZE(smc_gen_nl_ops)
75e8372d9dSGuvenc Gulce };
76e8372d9dSGuvenc Gulce 
77e8372d9dSGuvenc Gulce int __init smc_nl_init(void)
78e8372d9dSGuvenc Gulce {
79e8372d9dSGuvenc Gulce 	return genl_register_family(&smc_gen_nl_family);
80e8372d9dSGuvenc Gulce }
81e8372d9dSGuvenc Gulce 
82e8372d9dSGuvenc Gulce void smc_nl_exit(void)
83e8372d9dSGuvenc Gulce {
84e8372d9dSGuvenc Gulce 	genl_unregister_family(&smc_gen_nl_family);
85e8372d9dSGuvenc Gulce }
86