xref: /openbmc/linux/net/smc/smc_netlink.c (revision e8372d9d21451a2f2947c2b63b5184f3d4d0bff9)
1*e8372d9dSGuvenc Gulce // SPDX-License-Identifier: GPL-2.0
2*e8372d9dSGuvenc Gulce /*
3*e8372d9dSGuvenc Gulce  *  Shared Memory Communications over RDMA (SMC-R) and RoCE
4*e8372d9dSGuvenc Gulce  *
5*e8372d9dSGuvenc Gulce  *  Generic netlink support functions to interact with SMC module
6*e8372d9dSGuvenc Gulce  *
7*e8372d9dSGuvenc Gulce  *  Copyright IBM Corp. 2020
8*e8372d9dSGuvenc Gulce  *
9*e8372d9dSGuvenc Gulce  *  Author(s):	Guvenc Gulce <guvenc@linux.ibm.com>
10*e8372d9dSGuvenc Gulce  */
11*e8372d9dSGuvenc Gulce 
12*e8372d9dSGuvenc Gulce #include <linux/module.h>
13*e8372d9dSGuvenc Gulce #include <linux/list.h>
14*e8372d9dSGuvenc Gulce #include <linux/ctype.h>
15*e8372d9dSGuvenc Gulce #include <linux/mutex.h>
16*e8372d9dSGuvenc Gulce #include <linux/if.h>
17*e8372d9dSGuvenc Gulce #include <linux/smc.h>
18*e8372d9dSGuvenc Gulce 
19*e8372d9dSGuvenc Gulce #include "smc_core.h"
20*e8372d9dSGuvenc Gulce #include "smc_netlink.h"
21*e8372d9dSGuvenc Gulce 
22*e8372d9dSGuvenc Gulce #define SMC_CMD_MAX_ATTR 1
23*e8372d9dSGuvenc Gulce 
24*e8372d9dSGuvenc Gulce /* SMC_GENL generic netlink operation definition */
25*e8372d9dSGuvenc Gulce static const struct genl_ops smc_gen_nl_ops[] = {
26*e8372d9dSGuvenc Gulce };
27*e8372d9dSGuvenc Gulce 
28*e8372d9dSGuvenc Gulce static const struct nla_policy smc_gen_nl_policy[2] = {
29*e8372d9dSGuvenc Gulce 	[SMC_CMD_MAX_ATTR]	= { .type = NLA_REJECT, },
30*e8372d9dSGuvenc Gulce };
31*e8372d9dSGuvenc Gulce 
32*e8372d9dSGuvenc Gulce /* SMC_GENL family definition */
33*e8372d9dSGuvenc Gulce struct genl_family smc_gen_nl_family __ro_after_init = {
34*e8372d9dSGuvenc Gulce 	.hdrsize =	0,
35*e8372d9dSGuvenc Gulce 	.name =		SMC_GENL_FAMILY_NAME,
36*e8372d9dSGuvenc Gulce 	.version =	SMC_GENL_FAMILY_VERSION,
37*e8372d9dSGuvenc Gulce 	.maxattr =	SMC_CMD_MAX_ATTR,
38*e8372d9dSGuvenc Gulce 	.policy =	smc_gen_nl_policy,
39*e8372d9dSGuvenc Gulce 	.netnsok =	true,
40*e8372d9dSGuvenc Gulce 	.module =	THIS_MODULE,
41*e8372d9dSGuvenc Gulce 	.ops =		smc_gen_nl_ops,
42*e8372d9dSGuvenc Gulce 	.n_ops =	ARRAY_SIZE(smc_gen_nl_ops)
43*e8372d9dSGuvenc Gulce };
44*e8372d9dSGuvenc Gulce 
45*e8372d9dSGuvenc Gulce int __init smc_nl_init(void)
46*e8372d9dSGuvenc Gulce {
47*e8372d9dSGuvenc Gulce 	return genl_register_family(&smc_gen_nl_family);
48*e8372d9dSGuvenc Gulce }
49*e8372d9dSGuvenc Gulce 
50*e8372d9dSGuvenc Gulce void smc_nl_exit(void)
51*e8372d9dSGuvenc Gulce {
52*e8372d9dSGuvenc Gulce 	genl_unregister_family(&smc_gen_nl_family);
53*e8372d9dSGuvenc Gulce }
54