1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Shared Memory Communications over RDMA (SMC-R) and RoCE |
4 | * |
5 | * Generic netlink support functions to interact with SMC module |
6 | * |
7 | * Copyright IBM Corp. 2020 |
8 | * |
9 | * Author(s): Guvenc Gulce <guvenc@linux.ibm.com> |
10 | */ |
11 | |
12 | #include <linux/module.h> |
13 | #include <linux/list.h> |
14 | #include <linux/ctype.h> |
15 | #include <linux/mutex.h> |
16 | #include <linux/if.h> |
17 | #include <linux/smc.h> |
18 | |
19 | #include "smc_core.h" |
20 | #include "smc_ism.h" |
21 | #include "smc_ib.h" |
22 | #include "smc_clc.h" |
23 | #include "smc_stats.h" |
24 | #include "smc_netlink.h" |
25 | |
26 | const struct nla_policy |
27 | smc_gen_ueid_policy[SMC_NLA_EID_TABLE_MAX + 1] = { |
28 | [SMC_NLA_EID_TABLE_UNSPEC] = { .type = NLA_UNSPEC }, |
29 | [SMC_NLA_EID_TABLE_ENTRY] = { .type = NLA_STRING, |
30 | .len = SMC_MAX_EID_LEN, |
31 | }, |
32 | }; |
33 | |
34 | #define SMC_CMD_MAX_ATTR 1 |
35 | /* SMC_GENL generic netlink operation definition */ |
36 | static const struct genl_ops smc_gen_nl_ops[] = { |
37 | { |
38 | .cmd = SMC_NETLINK_GET_SYS_INFO, |
39 | /* can be retrieved by unprivileged users */ |
40 | .dumpit = smc_nl_get_sys_info, |
41 | }, |
42 | { |
43 | .cmd = SMC_NETLINK_GET_LGR_SMCR, |
44 | /* can be retrieved by unprivileged users */ |
45 | .dumpit = smcr_nl_get_lgr, |
46 | }, |
47 | { |
48 | .cmd = SMC_NETLINK_GET_LINK_SMCR, |
49 | /* can be retrieved by unprivileged users */ |
50 | .dumpit = smcr_nl_get_link, |
51 | }, |
52 | { |
53 | .cmd = SMC_NETLINK_GET_LGR_SMCD, |
54 | /* can be retrieved by unprivileged users */ |
55 | .dumpit = smcd_nl_get_lgr, |
56 | }, |
57 | { |
58 | .cmd = SMC_NETLINK_GET_DEV_SMCD, |
59 | /* can be retrieved by unprivileged users */ |
60 | .dumpit = smcd_nl_get_device, |
61 | }, |
62 | { |
63 | .cmd = SMC_NETLINK_GET_DEV_SMCR, |
64 | /* can be retrieved by unprivileged users */ |
65 | .dumpit = smcr_nl_get_device, |
66 | }, |
67 | { |
68 | .cmd = SMC_NETLINK_GET_STATS, |
69 | /* can be retrieved by unprivileged users */ |
70 | .dumpit = smc_nl_get_stats, |
71 | }, |
72 | { |
73 | .cmd = SMC_NETLINK_GET_FBACK_STATS, |
74 | /* can be retrieved by unprivileged users */ |
75 | .dumpit = smc_nl_get_fback_stats, |
76 | }, |
77 | { |
78 | .cmd = SMC_NETLINK_DUMP_UEID, |
79 | /* can be retrieved by unprivileged users */ |
80 | .dumpit = smc_nl_dump_ueid, |
81 | }, |
82 | { |
83 | .cmd = SMC_NETLINK_ADD_UEID, |
84 | .flags = GENL_ADMIN_PERM, |
85 | .doit = smc_nl_add_ueid, |
86 | .policy = smc_gen_ueid_policy, |
87 | }, |
88 | { |
89 | .cmd = SMC_NETLINK_REMOVE_UEID, |
90 | .flags = GENL_ADMIN_PERM, |
91 | .doit = smc_nl_remove_ueid, |
92 | .policy = smc_gen_ueid_policy, |
93 | }, |
94 | { |
95 | .cmd = SMC_NETLINK_FLUSH_UEID, |
96 | .flags = GENL_ADMIN_PERM, |
97 | .doit = smc_nl_flush_ueid, |
98 | }, |
99 | { |
100 | .cmd = SMC_NETLINK_DUMP_SEID, |
101 | /* can be retrieved by unprivileged users */ |
102 | .dumpit = smc_nl_dump_seid, |
103 | }, |
104 | { |
105 | .cmd = SMC_NETLINK_ENABLE_SEID, |
106 | .flags = GENL_ADMIN_PERM, |
107 | .doit = smc_nl_enable_seid, |
108 | }, |
109 | { |
110 | .cmd = SMC_NETLINK_DISABLE_SEID, |
111 | .flags = GENL_ADMIN_PERM, |
112 | .doit = smc_nl_disable_seid, |
113 | }, |
114 | { |
115 | .cmd = SMC_NETLINK_DUMP_HS_LIMITATION, |
116 | /* can be retrieved by unprivileged users */ |
117 | .dumpit = smc_nl_dump_hs_limitation, |
118 | }, |
119 | { |
120 | .cmd = SMC_NETLINK_ENABLE_HS_LIMITATION, |
121 | .flags = GENL_ADMIN_PERM, |
122 | .doit = smc_nl_enable_hs_limitation, |
123 | }, |
124 | { |
125 | .cmd = SMC_NETLINK_DISABLE_HS_LIMITATION, |
126 | .flags = GENL_ADMIN_PERM, |
127 | .doit = smc_nl_disable_hs_limitation, |
128 | }, |
129 | }; |
130 | |
131 | static const struct nla_policy smc_gen_nl_policy[2] = { |
132 | [SMC_CMD_MAX_ATTR] = { .type = NLA_REJECT, }, |
133 | }; |
134 | |
135 | /* SMC_GENL family definition */ |
136 | struct genl_family smc_gen_nl_family __ro_after_init = { |
137 | .hdrsize = 0, |
138 | .name = SMC_GENL_FAMILY_NAME, |
139 | .version = SMC_GENL_FAMILY_VERSION, |
140 | .maxattr = SMC_CMD_MAX_ATTR, |
141 | .policy = smc_gen_nl_policy, |
142 | .netnsok = true, |
143 | .module = THIS_MODULE, |
144 | .ops = smc_gen_nl_ops, |
145 | .n_ops = ARRAY_SIZE(smc_gen_nl_ops), |
146 | .resv_start_op = SMC_NETLINK_DISABLE_HS_LIMITATION + 1, |
147 | }; |
148 | |
149 | int __init smc_nl_init(void) |
150 | { |
151 | return genl_register_family(family: &smc_gen_nl_family); |
152 | } |
153 | |
154 | void smc_nl_exit(void) |
155 | { |
156 | genl_unregister_family(family: &smc_gen_nl_family); |
157 | } |
158 | |