xref: /openbmc/linux/net/smc/smc_netlink.c (revision f0dd7bf5e33066e554442c509ef6351728b95b51)
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"
228c40602bSGuvenc Gulce #include "smc_stats.h"
23e8372d9dSGuvenc Gulce #include "smc_netlink.h"
24e8372d9dSGuvenc Gulce 
25e8372d9dSGuvenc Gulce #define SMC_CMD_MAX_ATTR 1
26e8372d9dSGuvenc Gulce 
27e8372d9dSGuvenc Gulce /* SMC_GENL generic netlink operation definition */
28e8372d9dSGuvenc Gulce static const struct genl_ops smc_gen_nl_ops[] = {
29099b990bSGuvenc Gulce 	{
30099b990bSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_SYS_INFO,
31099b990bSGuvenc Gulce 		/* can be retrieved by unprivileged users */
32099b990bSGuvenc Gulce 		.dumpit = smc_nl_get_sys_info,
33099b990bSGuvenc Gulce 	},
34e9b8c845SGuvenc Gulce 	{
35e9b8c845SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_LGR_SMCR,
36e9b8c845SGuvenc Gulce 		/* can be retrieved by unprivileged users */
37e9b8c845SGuvenc Gulce 		.dumpit = smcr_nl_get_lgr,
38e9b8c845SGuvenc Gulce 	},
395a7e09d5SGuvenc Gulce 	{
405a7e09d5SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_LINK_SMCR,
415a7e09d5SGuvenc Gulce 		/* can be retrieved by unprivileged users */
425a7e09d5SGuvenc Gulce 		.dumpit = smcr_nl_get_link,
435a7e09d5SGuvenc Gulce 	},
448f9dde4bSGuvenc Gulce 	{
458f9dde4bSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_LGR_SMCD,
468f9dde4bSGuvenc Gulce 		/* can be retrieved by unprivileged users */
478f9dde4bSGuvenc Gulce 		.dumpit = smcd_nl_get_lgr,
488f9dde4bSGuvenc Gulce 	},
49aaf95523SGuvenc Gulce 	{
50aaf95523SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_DEV_SMCD,
51aaf95523SGuvenc Gulce 		/* can be retrieved by unprivileged users */
52aaf95523SGuvenc Gulce 		.dumpit = smcd_nl_get_device,
53aaf95523SGuvenc Gulce 	},
54a3db10efSGuvenc Gulce 	{
55a3db10efSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_DEV_SMCR,
56a3db10efSGuvenc Gulce 		/* can be retrieved by unprivileged users */
57a3db10efSGuvenc Gulce 		.dumpit = smcr_nl_get_device,
58a3db10efSGuvenc Gulce 	},
598c40602bSGuvenc Gulce 	{
608c40602bSGuvenc Gulce 		.cmd = SMC_NETLINK_GET_STATS,
618c40602bSGuvenc Gulce 		/* can be retrieved by unprivileged users */
628c40602bSGuvenc Gulce 		.dumpit = smc_nl_get_stats,
638c40602bSGuvenc Gulce 	},
64*f0dd7bf5SGuvenc Gulce 	{
65*f0dd7bf5SGuvenc Gulce 		.cmd = SMC_NETLINK_GET_FBACK_STATS,
66*f0dd7bf5SGuvenc Gulce 		/* can be retrieved by unprivileged users */
67*f0dd7bf5SGuvenc Gulce 		.dumpit = smc_nl_get_fback_stats,
68*f0dd7bf5SGuvenc Gulce 	},
69e8372d9dSGuvenc Gulce };
70e8372d9dSGuvenc Gulce 
71e8372d9dSGuvenc Gulce static const struct nla_policy smc_gen_nl_policy[2] = {
72e8372d9dSGuvenc Gulce 	[SMC_CMD_MAX_ATTR]	= { .type = NLA_REJECT, },
73e8372d9dSGuvenc Gulce };
74e8372d9dSGuvenc Gulce 
75e8372d9dSGuvenc Gulce /* SMC_GENL family definition */
76e8372d9dSGuvenc Gulce struct genl_family smc_gen_nl_family __ro_after_init = {
77e8372d9dSGuvenc Gulce 	.hdrsize =	0,
78e8372d9dSGuvenc Gulce 	.name =		SMC_GENL_FAMILY_NAME,
79e8372d9dSGuvenc Gulce 	.version =	SMC_GENL_FAMILY_VERSION,
80e8372d9dSGuvenc Gulce 	.maxattr =	SMC_CMD_MAX_ATTR,
81e8372d9dSGuvenc Gulce 	.policy =	smc_gen_nl_policy,
82e8372d9dSGuvenc Gulce 	.netnsok =	true,
83e8372d9dSGuvenc Gulce 	.module =	THIS_MODULE,
84e8372d9dSGuvenc Gulce 	.ops =		smc_gen_nl_ops,
85e8372d9dSGuvenc Gulce 	.n_ops =	ARRAY_SIZE(smc_gen_nl_ops)
86e8372d9dSGuvenc Gulce };
87e8372d9dSGuvenc Gulce 
88e8372d9dSGuvenc Gulce int __init smc_nl_init(void)
89e8372d9dSGuvenc Gulce {
90e8372d9dSGuvenc Gulce 	return genl_register_family(&smc_gen_nl_family);
91e8372d9dSGuvenc Gulce }
92e8372d9dSGuvenc Gulce 
93e8372d9dSGuvenc Gulce void smc_nl_exit(void)
94e8372d9dSGuvenc Gulce {
95e8372d9dSGuvenc Gulce 	genl_unregister_family(&smc_gen_nl_family);
96e8372d9dSGuvenc Gulce }
97