1 // SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
2 /* Do not edit directly, auto-generated from: */
3 /* Documentation/netlink/specs/devlink.yaml */
4 /* YNL-GEN kernel source */
5
6 #include <net/netlink.h>
7 #include <net/genetlink.h>
8
9 #include "netlink_gen.h"
10
11 #include <uapi/linux/devlink.h>
12
13 /* Sparse enums validation callbacks */
14 static int
devlink_attr_param_type_validate(const struct nlattr * attr,struct netlink_ext_ack * extack)15 devlink_attr_param_type_validate(const struct nlattr *attr,
16 struct netlink_ext_ack *extack)
17 {
18 switch (nla_get_u8(attr)) {
19 case DEVLINK_VAR_ATTR_TYPE_U8:
20 fallthrough;
21 case DEVLINK_VAR_ATTR_TYPE_U16:
22 fallthrough;
23 case DEVLINK_VAR_ATTR_TYPE_U32:
24 fallthrough;
25 case DEVLINK_VAR_ATTR_TYPE_U64:
26 fallthrough;
27 case DEVLINK_VAR_ATTR_TYPE_STRING:
28 fallthrough;
29 case DEVLINK_VAR_ATTR_TYPE_FLAG:
30 fallthrough;
31 case DEVLINK_VAR_ATTR_TYPE_NUL_STRING:
32 fallthrough;
33 case DEVLINK_VAR_ATTR_TYPE_BINARY:
34 return 0;
35 }
36 NL_SET_ERR_MSG_ATTR(extack, attr, "invalid enum value");
37 return -EINVAL;
38 }
39
40 /* Common nested types */
41 const struct nla_policy devlink_dl_port_function_nl_policy[DEVLINK_PORT_FN_ATTR_CAPS + 1] = {
42 [DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] = { .type = NLA_BINARY, },
43 [DEVLINK_PORT_FN_ATTR_STATE] = NLA_POLICY_MAX(NLA_U8, 1),
44 [DEVLINK_PORT_FN_ATTR_OPSTATE] = NLA_POLICY_MAX(NLA_U8, 1),
45 [DEVLINK_PORT_FN_ATTR_CAPS] = NLA_POLICY_BITFIELD32(15),
46 };
47
48 const struct nla_policy devlink_dl_rate_tc_bws_nl_policy[DEVLINK_RATE_TC_ATTR_BW + 1] = {
49 [DEVLINK_RATE_TC_ATTR_INDEX] = NLA_POLICY_MAX(NLA_U8, DEVLINK_RATE_TC_INDEX_MAX),
50 [DEVLINK_RATE_TC_ATTR_BW] = { .type = NLA_U32, },
51 };
52
53 const struct nla_policy devlink_dl_selftest_id_nl_policy[DEVLINK_ATTR_SELFTEST_ID_FLASH + 1] = {
54 [DEVLINK_ATTR_SELFTEST_ID_FLASH] = { .type = NLA_FLAG, },
55 };
56
57 /* DEVLINK_CMD_GET - do */
58 static const struct nla_policy devlink_get_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
59 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
60 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
61 };
62
63 /* DEVLINK_CMD_PORT_GET - do */
64 static const struct nla_policy devlink_port_get_do_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
65 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
66 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
67 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
68 };
69
70 /* DEVLINK_CMD_PORT_GET - dump */
71 static const struct nla_policy devlink_port_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
72 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
73 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
74 };
75
76 /* DEVLINK_CMD_PORT_SET - do */
77 static const struct nla_policy devlink_port_set_nl_policy[DEVLINK_ATTR_PORT_FUNCTION + 1] = {
78 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
79 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
80 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
81 [DEVLINK_ATTR_PORT_TYPE] = NLA_POLICY_MAX(NLA_U16, 3),
82 [DEVLINK_ATTR_PORT_FUNCTION] = NLA_POLICY_NESTED(devlink_dl_port_function_nl_policy),
83 };
84
85 /* DEVLINK_CMD_PORT_NEW - do */
86 static const struct nla_policy devlink_port_new_nl_policy[DEVLINK_ATTR_PORT_PCI_SF_NUMBER + 1] = {
87 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
88 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
89 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
90 [DEVLINK_ATTR_PORT_FLAVOUR] = NLA_POLICY_MAX(NLA_U16, 7),
91 [DEVLINK_ATTR_PORT_PCI_PF_NUMBER] = { .type = NLA_U16, },
92 [DEVLINK_ATTR_PORT_PCI_SF_NUMBER] = { .type = NLA_U32, },
93 [DEVLINK_ATTR_PORT_CONTROLLER_NUMBER] = { .type = NLA_U32, },
94 };
95
96 /* DEVLINK_CMD_PORT_DEL - do */
97 static const struct nla_policy devlink_port_del_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
98 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
99 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
100 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
101 };
102
103 /* DEVLINK_CMD_PORT_SPLIT - do */
104 static const struct nla_policy devlink_port_split_nl_policy[DEVLINK_ATTR_PORT_SPLIT_COUNT + 1] = {
105 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
106 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
107 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
108 [DEVLINK_ATTR_PORT_SPLIT_COUNT] = { .type = NLA_U32, },
109 };
110
111 /* DEVLINK_CMD_PORT_UNSPLIT - do */
112 static const struct nla_policy devlink_port_unsplit_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
113 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
114 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
115 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
116 };
117
118 /* DEVLINK_CMD_SB_GET - do */
119 static const struct nla_policy devlink_sb_get_do_nl_policy[DEVLINK_ATTR_SB_INDEX + 1] = {
120 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
121 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
122 [DEVLINK_ATTR_SB_INDEX] = { .type = NLA_U32, },
123 };
124
125 /* DEVLINK_CMD_SB_GET - dump */
126 static const struct nla_policy devlink_sb_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
127 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
128 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
129 };
130
131 /* DEVLINK_CMD_SB_POOL_GET - do */
132 static const struct nla_policy devlink_sb_pool_get_do_nl_policy[DEVLINK_ATTR_SB_POOL_INDEX + 1] = {
133 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
134 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
135 [DEVLINK_ATTR_SB_INDEX] = { .type = NLA_U32, },
136 [DEVLINK_ATTR_SB_POOL_INDEX] = { .type = NLA_U16, },
137 };
138
139 /* DEVLINK_CMD_SB_POOL_GET - dump */
140 static const struct nla_policy devlink_sb_pool_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
141 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
142 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
143 };
144
145 /* DEVLINK_CMD_SB_POOL_SET - do */
146 static const struct nla_policy devlink_sb_pool_set_nl_policy[DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE + 1] = {
147 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
148 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
149 [DEVLINK_ATTR_SB_INDEX] = { .type = NLA_U32, },
150 [DEVLINK_ATTR_SB_POOL_INDEX] = { .type = NLA_U16, },
151 [DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE] = NLA_POLICY_MAX(NLA_U8, 1),
152 [DEVLINK_ATTR_SB_POOL_SIZE] = { .type = NLA_U32, },
153 };
154
155 /* DEVLINK_CMD_SB_PORT_POOL_GET - do */
156 static const struct nla_policy devlink_sb_port_pool_get_do_nl_policy[DEVLINK_ATTR_SB_POOL_INDEX + 1] = {
157 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
158 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
159 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
160 [DEVLINK_ATTR_SB_INDEX] = { .type = NLA_U32, },
161 [DEVLINK_ATTR_SB_POOL_INDEX] = { .type = NLA_U16, },
162 };
163
164 /* DEVLINK_CMD_SB_PORT_POOL_GET - dump */
165 static const struct nla_policy devlink_sb_port_pool_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
166 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
167 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
168 };
169
170 /* DEVLINK_CMD_SB_PORT_POOL_SET - do */
171 static const struct nla_policy devlink_sb_port_pool_set_nl_policy[DEVLINK_ATTR_SB_THRESHOLD + 1] = {
172 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
173 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
174 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
175 [DEVLINK_ATTR_SB_INDEX] = { .type = NLA_U32, },
176 [DEVLINK_ATTR_SB_POOL_INDEX] = { .type = NLA_U16, },
177 [DEVLINK_ATTR_SB_THRESHOLD] = { .type = NLA_U32, },
178 };
179
180 /* DEVLINK_CMD_SB_TC_POOL_BIND_GET - do */
181 static const struct nla_policy devlink_sb_tc_pool_bind_get_do_nl_policy[DEVLINK_ATTR_SB_TC_INDEX + 1] = {
182 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
183 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
184 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
185 [DEVLINK_ATTR_SB_INDEX] = { .type = NLA_U32, },
186 [DEVLINK_ATTR_SB_POOL_TYPE] = NLA_POLICY_MAX(NLA_U8, 1),
187 [DEVLINK_ATTR_SB_TC_INDEX] = { .type = NLA_U16, },
188 };
189
190 /* DEVLINK_CMD_SB_TC_POOL_BIND_GET - dump */
191 static const struct nla_policy devlink_sb_tc_pool_bind_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
192 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
193 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
194 };
195
196 /* DEVLINK_CMD_SB_TC_POOL_BIND_SET - do */
197 static const struct nla_policy devlink_sb_tc_pool_bind_set_nl_policy[DEVLINK_ATTR_SB_TC_INDEX + 1] = {
198 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
199 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
200 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
201 [DEVLINK_ATTR_SB_INDEX] = { .type = NLA_U32, },
202 [DEVLINK_ATTR_SB_POOL_INDEX] = { .type = NLA_U16, },
203 [DEVLINK_ATTR_SB_POOL_TYPE] = NLA_POLICY_MAX(NLA_U8, 1),
204 [DEVLINK_ATTR_SB_TC_INDEX] = { .type = NLA_U16, },
205 [DEVLINK_ATTR_SB_THRESHOLD] = { .type = NLA_U32, },
206 };
207
208 /* DEVLINK_CMD_SB_OCC_SNAPSHOT - do */
209 static const struct nla_policy devlink_sb_occ_snapshot_nl_policy[DEVLINK_ATTR_SB_INDEX + 1] = {
210 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
211 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
212 [DEVLINK_ATTR_SB_INDEX] = { .type = NLA_U32, },
213 };
214
215 /* DEVLINK_CMD_SB_OCC_MAX_CLEAR - do */
216 static const struct nla_policy devlink_sb_occ_max_clear_nl_policy[DEVLINK_ATTR_SB_INDEX + 1] = {
217 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
218 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
219 [DEVLINK_ATTR_SB_INDEX] = { .type = NLA_U32, },
220 };
221
222 /* DEVLINK_CMD_ESWITCH_GET - do */
223 static const struct nla_policy devlink_eswitch_get_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
224 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
225 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
226 };
227
228 /* DEVLINK_CMD_ESWITCH_SET - do */
229 static const struct nla_policy devlink_eswitch_set_nl_policy[DEVLINK_ATTR_ESWITCH_ENCAP_MODE + 1] = {
230 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
231 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
232 [DEVLINK_ATTR_ESWITCH_MODE] = NLA_POLICY_MAX(NLA_U16, 1),
233 [DEVLINK_ATTR_ESWITCH_INLINE_MODE] = NLA_POLICY_MAX(NLA_U8, 3),
234 [DEVLINK_ATTR_ESWITCH_ENCAP_MODE] = NLA_POLICY_MAX(NLA_U8, 1),
235 };
236
237 /* DEVLINK_CMD_DPIPE_TABLE_GET - do */
238 static const struct nla_policy devlink_dpipe_table_get_nl_policy[DEVLINK_ATTR_DPIPE_TABLE_NAME + 1] = {
239 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
240 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
241 [DEVLINK_ATTR_DPIPE_TABLE_NAME] = { .type = NLA_NUL_STRING, },
242 };
243
244 /* DEVLINK_CMD_DPIPE_ENTRIES_GET - do */
245 static const struct nla_policy devlink_dpipe_entries_get_nl_policy[DEVLINK_ATTR_DPIPE_TABLE_NAME + 1] = {
246 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
247 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
248 [DEVLINK_ATTR_DPIPE_TABLE_NAME] = { .type = NLA_NUL_STRING, },
249 };
250
251 /* DEVLINK_CMD_DPIPE_HEADERS_GET - do */
252 static const struct nla_policy devlink_dpipe_headers_get_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
253 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
254 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
255 };
256
257 /* DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET - do */
258 static const struct nla_policy devlink_dpipe_table_counters_set_nl_policy[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED + 1] = {
259 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
260 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
261 [DEVLINK_ATTR_DPIPE_TABLE_NAME] = { .type = NLA_NUL_STRING, },
262 [DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED] = { .type = NLA_U8, },
263 };
264
265 /* DEVLINK_CMD_RESOURCE_SET - do */
266 static const struct nla_policy devlink_resource_set_nl_policy[DEVLINK_ATTR_RESOURCE_SIZE + 1] = {
267 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
268 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
269 [DEVLINK_ATTR_RESOURCE_ID] = { .type = NLA_U64, },
270 [DEVLINK_ATTR_RESOURCE_SIZE] = { .type = NLA_U64, },
271 };
272
273 /* DEVLINK_CMD_RESOURCE_DUMP - do */
274 static const struct nla_policy devlink_resource_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
275 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
276 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
277 };
278
279 /* DEVLINK_CMD_RELOAD - do */
280 static const struct nla_policy devlink_reload_nl_policy[DEVLINK_ATTR_RELOAD_LIMITS + 1] = {
281 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
282 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
283 [DEVLINK_ATTR_RELOAD_ACTION] = NLA_POLICY_RANGE(NLA_U8, 1, 2),
284 [DEVLINK_ATTR_RELOAD_LIMITS] = NLA_POLICY_BITFIELD32(6),
285 [DEVLINK_ATTR_NETNS_PID] = { .type = NLA_U32, },
286 [DEVLINK_ATTR_NETNS_FD] = { .type = NLA_U32, },
287 [DEVLINK_ATTR_NETNS_ID] = { .type = NLA_U32, },
288 };
289
290 /* DEVLINK_CMD_PARAM_GET - do */
291 static const struct nla_policy devlink_param_get_do_nl_policy[DEVLINK_ATTR_PARAM_NAME + 1] = {
292 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
293 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
294 [DEVLINK_ATTR_PARAM_NAME] = { .type = NLA_NUL_STRING, },
295 };
296
297 /* DEVLINK_CMD_PARAM_GET - dump */
298 static const struct nla_policy devlink_param_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
299 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
300 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
301 };
302
303 /* DEVLINK_CMD_PARAM_SET - do */
304 static const struct nla_policy devlink_param_set_nl_policy[DEVLINK_ATTR_PARAM_VALUE_CMODE + 1] = {
305 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
306 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
307 [DEVLINK_ATTR_PARAM_NAME] = { .type = NLA_NUL_STRING, },
308 [DEVLINK_ATTR_PARAM_TYPE] = NLA_POLICY_VALIDATE_FN(NLA_U8, &devlink_attr_param_type_validate),
309 [DEVLINK_ATTR_PARAM_VALUE_CMODE] = NLA_POLICY_MAX(NLA_U8, 2),
310 };
311
312 /* DEVLINK_CMD_REGION_GET - do */
313 static const struct nla_policy devlink_region_get_do_nl_policy[DEVLINK_ATTR_REGION_NAME + 1] = {
314 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
315 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
316 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
317 [DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING, },
318 };
319
320 /* DEVLINK_CMD_REGION_GET - dump */
321 static const struct nla_policy devlink_region_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
322 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
323 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
324 };
325
326 /* DEVLINK_CMD_REGION_NEW - do */
327 static const struct nla_policy devlink_region_new_nl_policy[DEVLINK_ATTR_REGION_SNAPSHOT_ID + 1] = {
328 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
329 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
330 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
331 [DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING, },
332 [DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .type = NLA_U32, },
333 };
334
335 /* DEVLINK_CMD_REGION_DEL - do */
336 static const struct nla_policy devlink_region_del_nl_policy[DEVLINK_ATTR_REGION_SNAPSHOT_ID + 1] = {
337 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
338 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
339 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
340 [DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING, },
341 [DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .type = NLA_U32, },
342 };
343
344 /* DEVLINK_CMD_REGION_READ - dump */
345 static const struct nla_policy devlink_region_read_nl_policy[DEVLINK_ATTR_REGION_DIRECT + 1] = {
346 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
347 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
348 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
349 [DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING, },
350 [DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .type = NLA_U32, },
351 [DEVLINK_ATTR_REGION_DIRECT] = { .type = NLA_FLAG, },
352 [DEVLINK_ATTR_REGION_CHUNK_ADDR] = { .type = NLA_U64, },
353 [DEVLINK_ATTR_REGION_CHUNK_LEN] = { .type = NLA_U64, },
354 };
355
356 /* DEVLINK_CMD_PORT_PARAM_GET - do */
357 static const struct nla_policy devlink_port_param_get_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
358 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
359 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
360 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
361 };
362
363 /* DEVLINK_CMD_PORT_PARAM_SET - do */
364 static const struct nla_policy devlink_port_param_set_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
365 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
366 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
367 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
368 };
369
370 /* DEVLINK_CMD_INFO_GET - do */
371 static const struct nla_policy devlink_info_get_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
372 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
373 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
374 };
375
376 /* DEVLINK_CMD_HEALTH_REPORTER_GET - do */
377 static const struct nla_policy devlink_health_reporter_get_do_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
378 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
379 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
380 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
381 [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
382 };
383
384 /* DEVLINK_CMD_HEALTH_REPORTER_GET - dump */
385 static const struct nla_policy devlink_health_reporter_get_dump_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
386 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
387 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
388 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
389 };
390
391 /* DEVLINK_CMD_HEALTH_REPORTER_SET - do */
392 static const struct nla_policy devlink_health_reporter_set_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP + 1] = {
393 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
394 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
395 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
396 [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
397 [DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD] = { .type = NLA_U64, },
398 [DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER] = { .type = NLA_U8, },
399 [DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP] = { .type = NLA_U8, },
400 };
401
402 /* DEVLINK_CMD_HEALTH_REPORTER_RECOVER - do */
403 static const struct nla_policy devlink_health_reporter_recover_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
404 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
405 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
406 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
407 [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
408 };
409
410 /* DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE - do */
411 static const struct nla_policy devlink_health_reporter_diagnose_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
412 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
413 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
414 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
415 [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
416 };
417
418 /* DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET - dump */
419 static const struct nla_policy devlink_health_reporter_dump_get_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
420 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
421 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
422 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
423 [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
424 };
425
426 /* DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR - do */
427 static const struct nla_policy devlink_health_reporter_dump_clear_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
428 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
429 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
430 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
431 [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
432 };
433
434 /* DEVLINK_CMD_FLASH_UPDATE - do */
435 static const struct nla_policy devlink_flash_update_nl_policy[DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK + 1] = {
436 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
437 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
438 [DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME] = { .type = NLA_NUL_STRING, },
439 [DEVLINK_ATTR_FLASH_UPDATE_COMPONENT] = { .type = NLA_NUL_STRING, },
440 [DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK] = NLA_POLICY_BITFIELD32(3),
441 };
442
443 /* DEVLINK_CMD_TRAP_GET - do */
444 static const struct nla_policy devlink_trap_get_do_nl_policy[DEVLINK_ATTR_TRAP_NAME + 1] = {
445 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
446 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
447 [DEVLINK_ATTR_TRAP_NAME] = { .type = NLA_NUL_STRING, },
448 };
449
450 /* DEVLINK_CMD_TRAP_GET - dump */
451 static const struct nla_policy devlink_trap_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
452 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
453 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
454 };
455
456 /* DEVLINK_CMD_TRAP_SET - do */
457 static const struct nla_policy devlink_trap_set_nl_policy[DEVLINK_ATTR_TRAP_ACTION + 1] = {
458 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
459 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
460 [DEVLINK_ATTR_TRAP_NAME] = { .type = NLA_NUL_STRING, },
461 [DEVLINK_ATTR_TRAP_ACTION] = NLA_POLICY_MAX(NLA_U8, 2),
462 };
463
464 /* DEVLINK_CMD_TRAP_GROUP_GET - do */
465 static const struct nla_policy devlink_trap_group_get_do_nl_policy[DEVLINK_ATTR_TRAP_GROUP_NAME + 1] = {
466 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
467 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
468 [DEVLINK_ATTR_TRAP_GROUP_NAME] = { .type = NLA_NUL_STRING, },
469 };
470
471 /* DEVLINK_CMD_TRAP_GROUP_GET - dump */
472 static const struct nla_policy devlink_trap_group_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
473 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
474 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
475 };
476
477 /* DEVLINK_CMD_TRAP_GROUP_SET - do */
478 static const struct nla_policy devlink_trap_group_set_nl_policy[DEVLINK_ATTR_TRAP_POLICER_ID + 1] = {
479 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
480 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
481 [DEVLINK_ATTR_TRAP_GROUP_NAME] = { .type = NLA_NUL_STRING, },
482 [DEVLINK_ATTR_TRAP_ACTION] = NLA_POLICY_MAX(NLA_U8, 2),
483 [DEVLINK_ATTR_TRAP_POLICER_ID] = { .type = NLA_U32, },
484 };
485
486 /* DEVLINK_CMD_TRAP_POLICER_GET - do */
487 static const struct nla_policy devlink_trap_policer_get_do_nl_policy[DEVLINK_ATTR_TRAP_POLICER_ID + 1] = {
488 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
489 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
490 [DEVLINK_ATTR_TRAP_POLICER_ID] = { .type = NLA_U32, },
491 };
492
493 /* DEVLINK_CMD_TRAP_POLICER_GET - dump */
494 static const struct nla_policy devlink_trap_policer_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
495 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
496 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
497 };
498
499 /* DEVLINK_CMD_TRAP_POLICER_SET - do */
500 static const struct nla_policy devlink_trap_policer_set_nl_policy[DEVLINK_ATTR_TRAP_POLICER_BURST + 1] = {
501 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
502 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
503 [DEVLINK_ATTR_TRAP_POLICER_ID] = { .type = NLA_U32, },
504 [DEVLINK_ATTR_TRAP_POLICER_RATE] = { .type = NLA_U64, },
505 [DEVLINK_ATTR_TRAP_POLICER_BURST] = { .type = NLA_U64, },
506 };
507
508 /* DEVLINK_CMD_HEALTH_REPORTER_TEST - do */
509 static const struct nla_policy devlink_health_reporter_test_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
510 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
511 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
512 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
513 [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
514 };
515
516 /* DEVLINK_CMD_RATE_GET - do */
517 static const struct nla_policy devlink_rate_get_do_nl_policy[DEVLINK_ATTR_RATE_NODE_NAME + 1] = {
518 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
519 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
520 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
521 [DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
522 };
523
524 /* DEVLINK_CMD_RATE_GET - dump */
525 static const struct nla_policy devlink_rate_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
526 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
527 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
528 };
529
530 /* DEVLINK_CMD_RATE_SET - do */
531 static const struct nla_policy devlink_rate_set_nl_policy[DEVLINK_ATTR_RATE_TC_BWS + 1] = {
532 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
533 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
534 [DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
535 [DEVLINK_ATTR_RATE_TX_SHARE] = { .type = NLA_U64, },
536 [DEVLINK_ATTR_RATE_TX_MAX] = { .type = NLA_U64, },
537 [DEVLINK_ATTR_RATE_TX_PRIORITY] = { .type = NLA_U32, },
538 [DEVLINK_ATTR_RATE_TX_WEIGHT] = { .type = NLA_U32, },
539 [DEVLINK_ATTR_RATE_PARENT_NODE_NAME] = { .type = NLA_NUL_STRING, },
540 [DEVLINK_ATTR_RATE_TC_BWS] = NLA_POLICY_NESTED(devlink_dl_rate_tc_bws_nl_policy),
541 };
542
543 /* DEVLINK_CMD_RATE_NEW - do */
544 static const struct nla_policy devlink_rate_new_nl_policy[DEVLINK_ATTR_RATE_TC_BWS + 1] = {
545 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
546 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
547 [DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
548 [DEVLINK_ATTR_RATE_TX_SHARE] = { .type = NLA_U64, },
549 [DEVLINK_ATTR_RATE_TX_MAX] = { .type = NLA_U64, },
550 [DEVLINK_ATTR_RATE_TX_PRIORITY] = { .type = NLA_U32, },
551 [DEVLINK_ATTR_RATE_TX_WEIGHT] = { .type = NLA_U32, },
552 [DEVLINK_ATTR_RATE_PARENT_NODE_NAME] = { .type = NLA_NUL_STRING, },
553 [DEVLINK_ATTR_RATE_TC_BWS] = NLA_POLICY_NESTED(devlink_dl_rate_tc_bws_nl_policy),
554 };
555
556 /* DEVLINK_CMD_RATE_DEL - do */
557 static const struct nla_policy devlink_rate_del_nl_policy[DEVLINK_ATTR_RATE_NODE_NAME + 1] = {
558 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
559 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
560 [DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
561 };
562
563 /* DEVLINK_CMD_LINECARD_GET - do */
564 static const struct nla_policy devlink_linecard_get_do_nl_policy[DEVLINK_ATTR_LINECARD_INDEX + 1] = {
565 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
566 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
567 [DEVLINK_ATTR_LINECARD_INDEX] = { .type = NLA_U32, },
568 };
569
570 /* DEVLINK_CMD_LINECARD_GET - dump */
571 static const struct nla_policy devlink_linecard_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
572 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
573 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
574 };
575
576 /* DEVLINK_CMD_LINECARD_SET - do */
577 static const struct nla_policy devlink_linecard_set_nl_policy[DEVLINK_ATTR_LINECARD_TYPE + 1] = {
578 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
579 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
580 [DEVLINK_ATTR_LINECARD_INDEX] = { .type = NLA_U32, },
581 [DEVLINK_ATTR_LINECARD_TYPE] = { .type = NLA_NUL_STRING, },
582 };
583
584 /* DEVLINK_CMD_SELFTESTS_GET - do */
585 static const struct nla_policy devlink_selftests_get_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
586 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
587 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
588 };
589
590 /* DEVLINK_CMD_SELFTESTS_RUN - do */
591 static const struct nla_policy devlink_selftests_run_nl_policy[DEVLINK_ATTR_SELFTESTS + 1] = {
592 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
593 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
594 [DEVLINK_ATTR_SELFTESTS] = NLA_POLICY_NESTED(devlink_dl_selftest_id_nl_policy),
595 };
596
597 /* DEVLINK_CMD_NOTIFY_FILTER_SET - do */
598 static const struct nla_policy devlink_notify_filter_set_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
599 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
600 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
601 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
602 };
603
604 /* Ops table for devlink */
605 const struct genl_split_ops devlink_nl_ops[74] = {
606 {
607 .cmd = DEVLINK_CMD_GET,
608 .validate = GENL_DONT_VALIDATE_STRICT,
609 .pre_doit = devlink_nl_pre_doit,
610 .doit = devlink_nl_get_doit,
611 .post_doit = devlink_nl_post_doit,
612 .policy = devlink_get_nl_policy,
613 .maxattr = DEVLINK_ATTR_DEV_NAME,
614 .flags = GENL_CMD_CAP_DO,
615 },
616 {
617 .cmd = DEVLINK_CMD_GET,
618 .validate = GENL_DONT_VALIDATE_DUMP,
619 .dumpit = devlink_nl_get_dumpit,
620 .flags = GENL_CMD_CAP_DUMP,
621 },
622 {
623 .cmd = DEVLINK_CMD_PORT_GET,
624 .validate = GENL_DONT_VALIDATE_STRICT,
625 .pre_doit = devlink_nl_pre_doit_port,
626 .doit = devlink_nl_port_get_doit,
627 .post_doit = devlink_nl_post_doit,
628 .policy = devlink_port_get_do_nl_policy,
629 .maxattr = DEVLINK_ATTR_PORT_INDEX,
630 .flags = GENL_CMD_CAP_DO,
631 },
632 {
633 .cmd = DEVLINK_CMD_PORT_GET,
634 .dumpit = devlink_nl_port_get_dumpit,
635 .policy = devlink_port_get_dump_nl_policy,
636 .maxattr = DEVLINK_ATTR_DEV_NAME,
637 .flags = GENL_CMD_CAP_DUMP,
638 },
639 {
640 .cmd = DEVLINK_CMD_PORT_SET,
641 .validate = GENL_DONT_VALIDATE_STRICT,
642 .pre_doit = devlink_nl_pre_doit_port,
643 .doit = devlink_nl_port_set_doit,
644 .post_doit = devlink_nl_post_doit,
645 .policy = devlink_port_set_nl_policy,
646 .maxattr = DEVLINK_ATTR_PORT_FUNCTION,
647 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
648 },
649 {
650 .cmd = DEVLINK_CMD_PORT_NEW,
651 .validate = GENL_DONT_VALIDATE_STRICT,
652 .pre_doit = devlink_nl_pre_doit,
653 .doit = devlink_nl_port_new_doit,
654 .post_doit = devlink_nl_post_doit,
655 .policy = devlink_port_new_nl_policy,
656 .maxattr = DEVLINK_ATTR_PORT_PCI_SF_NUMBER,
657 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
658 },
659 {
660 .cmd = DEVLINK_CMD_PORT_DEL,
661 .validate = GENL_DONT_VALIDATE_STRICT,
662 .pre_doit = devlink_nl_pre_doit_port,
663 .doit = devlink_nl_port_del_doit,
664 .post_doit = devlink_nl_post_doit,
665 .policy = devlink_port_del_nl_policy,
666 .maxattr = DEVLINK_ATTR_PORT_INDEX,
667 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
668 },
669 {
670 .cmd = DEVLINK_CMD_PORT_SPLIT,
671 .validate = GENL_DONT_VALIDATE_STRICT,
672 .pre_doit = devlink_nl_pre_doit_port,
673 .doit = devlink_nl_port_split_doit,
674 .post_doit = devlink_nl_post_doit,
675 .policy = devlink_port_split_nl_policy,
676 .maxattr = DEVLINK_ATTR_PORT_SPLIT_COUNT,
677 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
678 },
679 {
680 .cmd = DEVLINK_CMD_PORT_UNSPLIT,
681 .validate = GENL_DONT_VALIDATE_STRICT,
682 .pre_doit = devlink_nl_pre_doit_port,
683 .doit = devlink_nl_port_unsplit_doit,
684 .post_doit = devlink_nl_post_doit,
685 .policy = devlink_port_unsplit_nl_policy,
686 .maxattr = DEVLINK_ATTR_PORT_INDEX,
687 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
688 },
689 {
690 .cmd = DEVLINK_CMD_SB_GET,
691 .validate = GENL_DONT_VALIDATE_STRICT,
692 .pre_doit = devlink_nl_pre_doit,
693 .doit = devlink_nl_sb_get_doit,
694 .post_doit = devlink_nl_post_doit,
695 .policy = devlink_sb_get_do_nl_policy,
696 .maxattr = DEVLINK_ATTR_SB_INDEX,
697 .flags = GENL_CMD_CAP_DO,
698 },
699 {
700 .cmd = DEVLINK_CMD_SB_GET,
701 .dumpit = devlink_nl_sb_get_dumpit,
702 .policy = devlink_sb_get_dump_nl_policy,
703 .maxattr = DEVLINK_ATTR_DEV_NAME,
704 .flags = GENL_CMD_CAP_DUMP,
705 },
706 {
707 .cmd = DEVLINK_CMD_SB_POOL_GET,
708 .validate = GENL_DONT_VALIDATE_STRICT,
709 .pre_doit = devlink_nl_pre_doit,
710 .doit = devlink_nl_sb_pool_get_doit,
711 .post_doit = devlink_nl_post_doit,
712 .policy = devlink_sb_pool_get_do_nl_policy,
713 .maxattr = DEVLINK_ATTR_SB_POOL_INDEX,
714 .flags = GENL_CMD_CAP_DO,
715 },
716 {
717 .cmd = DEVLINK_CMD_SB_POOL_GET,
718 .dumpit = devlink_nl_sb_pool_get_dumpit,
719 .policy = devlink_sb_pool_get_dump_nl_policy,
720 .maxattr = DEVLINK_ATTR_DEV_NAME,
721 .flags = GENL_CMD_CAP_DUMP,
722 },
723 {
724 .cmd = DEVLINK_CMD_SB_POOL_SET,
725 .validate = GENL_DONT_VALIDATE_STRICT,
726 .pre_doit = devlink_nl_pre_doit,
727 .doit = devlink_nl_sb_pool_set_doit,
728 .post_doit = devlink_nl_post_doit,
729 .policy = devlink_sb_pool_set_nl_policy,
730 .maxattr = DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE,
731 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
732 },
733 {
734 .cmd = DEVLINK_CMD_SB_PORT_POOL_GET,
735 .validate = GENL_DONT_VALIDATE_STRICT,
736 .pre_doit = devlink_nl_pre_doit_port,
737 .doit = devlink_nl_sb_port_pool_get_doit,
738 .post_doit = devlink_nl_post_doit,
739 .policy = devlink_sb_port_pool_get_do_nl_policy,
740 .maxattr = DEVLINK_ATTR_SB_POOL_INDEX,
741 .flags = GENL_CMD_CAP_DO,
742 },
743 {
744 .cmd = DEVLINK_CMD_SB_PORT_POOL_GET,
745 .dumpit = devlink_nl_sb_port_pool_get_dumpit,
746 .policy = devlink_sb_port_pool_get_dump_nl_policy,
747 .maxattr = DEVLINK_ATTR_DEV_NAME,
748 .flags = GENL_CMD_CAP_DUMP,
749 },
750 {
751 .cmd = DEVLINK_CMD_SB_PORT_POOL_SET,
752 .validate = GENL_DONT_VALIDATE_STRICT,
753 .pre_doit = devlink_nl_pre_doit_port,
754 .doit = devlink_nl_sb_port_pool_set_doit,
755 .post_doit = devlink_nl_post_doit,
756 .policy = devlink_sb_port_pool_set_nl_policy,
757 .maxattr = DEVLINK_ATTR_SB_THRESHOLD,
758 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
759 },
760 {
761 .cmd = DEVLINK_CMD_SB_TC_POOL_BIND_GET,
762 .validate = GENL_DONT_VALIDATE_STRICT,
763 .pre_doit = devlink_nl_pre_doit_port,
764 .doit = devlink_nl_sb_tc_pool_bind_get_doit,
765 .post_doit = devlink_nl_post_doit,
766 .policy = devlink_sb_tc_pool_bind_get_do_nl_policy,
767 .maxattr = DEVLINK_ATTR_SB_TC_INDEX,
768 .flags = GENL_CMD_CAP_DO,
769 },
770 {
771 .cmd = DEVLINK_CMD_SB_TC_POOL_BIND_GET,
772 .dumpit = devlink_nl_sb_tc_pool_bind_get_dumpit,
773 .policy = devlink_sb_tc_pool_bind_get_dump_nl_policy,
774 .maxattr = DEVLINK_ATTR_DEV_NAME,
775 .flags = GENL_CMD_CAP_DUMP,
776 },
777 {
778 .cmd = DEVLINK_CMD_SB_TC_POOL_BIND_SET,
779 .validate = GENL_DONT_VALIDATE_STRICT,
780 .pre_doit = devlink_nl_pre_doit_port,
781 .doit = devlink_nl_sb_tc_pool_bind_set_doit,
782 .post_doit = devlink_nl_post_doit,
783 .policy = devlink_sb_tc_pool_bind_set_nl_policy,
784 .maxattr = DEVLINK_ATTR_SB_TC_INDEX,
785 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
786 },
787 {
788 .cmd = DEVLINK_CMD_SB_OCC_SNAPSHOT,
789 .validate = GENL_DONT_VALIDATE_STRICT,
790 .pre_doit = devlink_nl_pre_doit,
791 .doit = devlink_nl_sb_occ_snapshot_doit,
792 .post_doit = devlink_nl_post_doit,
793 .policy = devlink_sb_occ_snapshot_nl_policy,
794 .maxattr = DEVLINK_ATTR_SB_INDEX,
795 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
796 },
797 {
798 .cmd = DEVLINK_CMD_SB_OCC_MAX_CLEAR,
799 .validate = GENL_DONT_VALIDATE_STRICT,
800 .pre_doit = devlink_nl_pre_doit,
801 .doit = devlink_nl_sb_occ_max_clear_doit,
802 .post_doit = devlink_nl_post_doit,
803 .policy = devlink_sb_occ_max_clear_nl_policy,
804 .maxattr = DEVLINK_ATTR_SB_INDEX,
805 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
806 },
807 {
808 .cmd = DEVLINK_CMD_ESWITCH_GET,
809 .validate = GENL_DONT_VALIDATE_STRICT,
810 .pre_doit = devlink_nl_pre_doit,
811 .doit = devlink_nl_eswitch_get_doit,
812 .post_doit = devlink_nl_post_doit,
813 .policy = devlink_eswitch_get_nl_policy,
814 .maxattr = DEVLINK_ATTR_DEV_NAME,
815 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
816 },
817 {
818 .cmd = DEVLINK_CMD_ESWITCH_SET,
819 .validate = GENL_DONT_VALIDATE_STRICT,
820 .pre_doit = devlink_nl_pre_doit,
821 .doit = devlink_nl_eswitch_set_doit,
822 .post_doit = devlink_nl_post_doit,
823 .policy = devlink_eswitch_set_nl_policy,
824 .maxattr = DEVLINK_ATTR_ESWITCH_ENCAP_MODE,
825 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
826 },
827 {
828 .cmd = DEVLINK_CMD_DPIPE_TABLE_GET,
829 .validate = GENL_DONT_VALIDATE_STRICT,
830 .pre_doit = devlink_nl_pre_doit,
831 .doit = devlink_nl_dpipe_table_get_doit,
832 .post_doit = devlink_nl_post_doit,
833 .policy = devlink_dpipe_table_get_nl_policy,
834 .maxattr = DEVLINK_ATTR_DPIPE_TABLE_NAME,
835 .flags = GENL_CMD_CAP_DO,
836 },
837 {
838 .cmd = DEVLINK_CMD_DPIPE_ENTRIES_GET,
839 .validate = GENL_DONT_VALIDATE_STRICT,
840 .pre_doit = devlink_nl_pre_doit,
841 .doit = devlink_nl_dpipe_entries_get_doit,
842 .post_doit = devlink_nl_post_doit,
843 .policy = devlink_dpipe_entries_get_nl_policy,
844 .maxattr = DEVLINK_ATTR_DPIPE_TABLE_NAME,
845 .flags = GENL_CMD_CAP_DO,
846 },
847 {
848 .cmd = DEVLINK_CMD_DPIPE_HEADERS_GET,
849 .validate = GENL_DONT_VALIDATE_STRICT,
850 .pre_doit = devlink_nl_pre_doit,
851 .doit = devlink_nl_dpipe_headers_get_doit,
852 .post_doit = devlink_nl_post_doit,
853 .policy = devlink_dpipe_headers_get_nl_policy,
854 .maxattr = DEVLINK_ATTR_DEV_NAME,
855 .flags = GENL_CMD_CAP_DO,
856 },
857 {
858 .cmd = DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
859 .validate = GENL_DONT_VALIDATE_STRICT,
860 .pre_doit = devlink_nl_pre_doit,
861 .doit = devlink_nl_dpipe_table_counters_set_doit,
862 .post_doit = devlink_nl_post_doit,
863 .policy = devlink_dpipe_table_counters_set_nl_policy,
864 .maxattr = DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED,
865 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
866 },
867 {
868 .cmd = DEVLINK_CMD_RESOURCE_SET,
869 .validate = GENL_DONT_VALIDATE_STRICT,
870 .pre_doit = devlink_nl_pre_doit,
871 .doit = devlink_nl_resource_set_doit,
872 .post_doit = devlink_nl_post_doit,
873 .policy = devlink_resource_set_nl_policy,
874 .maxattr = DEVLINK_ATTR_RESOURCE_SIZE,
875 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
876 },
877 {
878 .cmd = DEVLINK_CMD_RESOURCE_DUMP,
879 .validate = GENL_DONT_VALIDATE_STRICT,
880 .pre_doit = devlink_nl_pre_doit,
881 .doit = devlink_nl_resource_dump_doit,
882 .post_doit = devlink_nl_post_doit,
883 .policy = devlink_resource_dump_nl_policy,
884 .maxattr = DEVLINK_ATTR_DEV_NAME,
885 .flags = GENL_CMD_CAP_DO,
886 },
887 {
888 .cmd = DEVLINK_CMD_RELOAD,
889 .validate = GENL_DONT_VALIDATE_STRICT,
890 .pre_doit = devlink_nl_pre_doit_dev_lock,
891 .doit = devlink_nl_reload_doit,
892 .post_doit = devlink_nl_post_doit_dev_lock,
893 .policy = devlink_reload_nl_policy,
894 .maxattr = DEVLINK_ATTR_RELOAD_LIMITS,
895 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
896 },
897 {
898 .cmd = DEVLINK_CMD_PARAM_GET,
899 .validate = GENL_DONT_VALIDATE_STRICT,
900 .pre_doit = devlink_nl_pre_doit,
901 .doit = devlink_nl_param_get_doit,
902 .post_doit = devlink_nl_post_doit,
903 .policy = devlink_param_get_do_nl_policy,
904 .maxattr = DEVLINK_ATTR_PARAM_NAME,
905 .flags = GENL_CMD_CAP_DO,
906 },
907 {
908 .cmd = DEVLINK_CMD_PARAM_GET,
909 .dumpit = devlink_nl_param_get_dumpit,
910 .policy = devlink_param_get_dump_nl_policy,
911 .maxattr = DEVLINK_ATTR_DEV_NAME,
912 .flags = GENL_CMD_CAP_DUMP,
913 },
914 {
915 .cmd = DEVLINK_CMD_PARAM_SET,
916 .validate = GENL_DONT_VALIDATE_STRICT,
917 .pre_doit = devlink_nl_pre_doit,
918 .doit = devlink_nl_param_set_doit,
919 .post_doit = devlink_nl_post_doit,
920 .policy = devlink_param_set_nl_policy,
921 .maxattr = DEVLINK_ATTR_PARAM_VALUE_CMODE,
922 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
923 },
924 {
925 .cmd = DEVLINK_CMD_REGION_GET,
926 .validate = GENL_DONT_VALIDATE_STRICT,
927 .pre_doit = devlink_nl_pre_doit_port_optional,
928 .doit = devlink_nl_region_get_doit,
929 .post_doit = devlink_nl_post_doit,
930 .policy = devlink_region_get_do_nl_policy,
931 .maxattr = DEVLINK_ATTR_REGION_NAME,
932 .flags = GENL_CMD_CAP_DO,
933 },
934 {
935 .cmd = DEVLINK_CMD_REGION_GET,
936 .dumpit = devlink_nl_region_get_dumpit,
937 .policy = devlink_region_get_dump_nl_policy,
938 .maxattr = DEVLINK_ATTR_DEV_NAME,
939 .flags = GENL_CMD_CAP_DUMP,
940 },
941 {
942 .cmd = DEVLINK_CMD_REGION_NEW,
943 .validate = GENL_DONT_VALIDATE_STRICT,
944 .pre_doit = devlink_nl_pre_doit_port_optional,
945 .doit = devlink_nl_region_new_doit,
946 .post_doit = devlink_nl_post_doit,
947 .policy = devlink_region_new_nl_policy,
948 .maxattr = DEVLINK_ATTR_REGION_SNAPSHOT_ID,
949 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
950 },
951 {
952 .cmd = DEVLINK_CMD_REGION_DEL,
953 .validate = GENL_DONT_VALIDATE_STRICT,
954 .pre_doit = devlink_nl_pre_doit_port_optional,
955 .doit = devlink_nl_region_del_doit,
956 .post_doit = devlink_nl_post_doit,
957 .policy = devlink_region_del_nl_policy,
958 .maxattr = DEVLINK_ATTR_REGION_SNAPSHOT_ID,
959 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
960 },
961 {
962 .cmd = DEVLINK_CMD_REGION_READ,
963 .validate = GENL_DONT_VALIDATE_DUMP_STRICT,
964 .dumpit = devlink_nl_region_read_dumpit,
965 .policy = devlink_region_read_nl_policy,
966 .maxattr = DEVLINK_ATTR_REGION_DIRECT,
967 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DUMP,
968 },
969 {
970 .cmd = DEVLINK_CMD_PORT_PARAM_GET,
971 .validate = GENL_DONT_VALIDATE_STRICT,
972 .pre_doit = devlink_nl_pre_doit_port,
973 .doit = devlink_nl_port_param_get_doit,
974 .post_doit = devlink_nl_post_doit,
975 .policy = devlink_port_param_get_nl_policy,
976 .maxattr = DEVLINK_ATTR_PORT_INDEX,
977 .flags = GENL_CMD_CAP_DO,
978 },
979 {
980 .cmd = DEVLINK_CMD_PORT_PARAM_GET,
981 .validate = GENL_DONT_VALIDATE_DUMP_STRICT,
982 .dumpit = devlink_nl_port_param_get_dumpit,
983 .flags = GENL_CMD_CAP_DUMP,
984 },
985 {
986 .cmd = DEVLINK_CMD_PORT_PARAM_SET,
987 .validate = GENL_DONT_VALIDATE_STRICT,
988 .pre_doit = devlink_nl_pre_doit_port,
989 .doit = devlink_nl_port_param_set_doit,
990 .post_doit = devlink_nl_post_doit,
991 .policy = devlink_port_param_set_nl_policy,
992 .maxattr = DEVLINK_ATTR_PORT_INDEX,
993 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
994 },
995 {
996 .cmd = DEVLINK_CMD_INFO_GET,
997 .validate = GENL_DONT_VALIDATE_STRICT,
998 .pre_doit = devlink_nl_pre_doit,
999 .doit = devlink_nl_info_get_doit,
1000 .post_doit = devlink_nl_post_doit,
1001 .policy = devlink_info_get_nl_policy,
1002 .maxattr = DEVLINK_ATTR_DEV_NAME,
1003 .flags = GENL_CMD_CAP_DO,
1004 },
1005 {
1006 .cmd = DEVLINK_CMD_INFO_GET,
1007 .validate = GENL_DONT_VALIDATE_DUMP,
1008 .dumpit = devlink_nl_info_get_dumpit,
1009 .flags = GENL_CMD_CAP_DUMP,
1010 },
1011 {
1012 .cmd = DEVLINK_CMD_HEALTH_REPORTER_GET,
1013 .validate = GENL_DONT_VALIDATE_STRICT,
1014 .pre_doit = devlink_nl_pre_doit_port_optional,
1015 .doit = devlink_nl_health_reporter_get_doit,
1016 .post_doit = devlink_nl_post_doit,
1017 .policy = devlink_health_reporter_get_do_nl_policy,
1018 .maxattr = DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1019 .flags = GENL_CMD_CAP_DO,
1020 },
1021 {
1022 .cmd = DEVLINK_CMD_HEALTH_REPORTER_GET,
1023 .dumpit = devlink_nl_health_reporter_get_dumpit,
1024 .policy = devlink_health_reporter_get_dump_nl_policy,
1025 .maxattr = DEVLINK_ATTR_PORT_INDEX,
1026 .flags = GENL_CMD_CAP_DUMP,
1027 },
1028 {
1029 .cmd = DEVLINK_CMD_HEALTH_REPORTER_SET,
1030 .validate = GENL_DONT_VALIDATE_STRICT,
1031 .pre_doit = devlink_nl_pre_doit_port_optional,
1032 .doit = devlink_nl_health_reporter_set_doit,
1033 .post_doit = devlink_nl_post_doit,
1034 .policy = devlink_health_reporter_set_nl_policy,
1035 .maxattr = DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP,
1036 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1037 },
1038 {
1039 .cmd = DEVLINK_CMD_HEALTH_REPORTER_RECOVER,
1040 .validate = GENL_DONT_VALIDATE_STRICT,
1041 .pre_doit = devlink_nl_pre_doit_port_optional,
1042 .doit = devlink_nl_health_reporter_recover_doit,
1043 .post_doit = devlink_nl_post_doit,
1044 .policy = devlink_health_reporter_recover_nl_policy,
1045 .maxattr = DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1046 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1047 },
1048 {
1049 .cmd = DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE,
1050 .validate = GENL_DONT_VALIDATE_STRICT,
1051 .pre_doit = devlink_nl_pre_doit_port_optional,
1052 .doit = devlink_nl_health_reporter_diagnose_doit,
1053 .post_doit = devlink_nl_post_doit,
1054 .policy = devlink_health_reporter_diagnose_nl_policy,
1055 .maxattr = DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1056 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1057 },
1058 {
1059 .cmd = DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET,
1060 .validate = GENL_DONT_VALIDATE_DUMP_STRICT,
1061 .dumpit = devlink_nl_health_reporter_dump_get_dumpit,
1062 .policy = devlink_health_reporter_dump_get_nl_policy,
1063 .maxattr = DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1064 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DUMP,
1065 },
1066 {
1067 .cmd = DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR,
1068 .validate = GENL_DONT_VALIDATE_STRICT,
1069 .pre_doit = devlink_nl_pre_doit_port_optional,
1070 .doit = devlink_nl_health_reporter_dump_clear_doit,
1071 .post_doit = devlink_nl_post_doit,
1072 .policy = devlink_health_reporter_dump_clear_nl_policy,
1073 .maxattr = DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1074 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1075 },
1076 {
1077 .cmd = DEVLINK_CMD_FLASH_UPDATE,
1078 .validate = GENL_DONT_VALIDATE_STRICT,
1079 .pre_doit = devlink_nl_pre_doit,
1080 .doit = devlink_nl_flash_update_doit,
1081 .post_doit = devlink_nl_post_doit,
1082 .policy = devlink_flash_update_nl_policy,
1083 .maxattr = DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK,
1084 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1085 },
1086 {
1087 .cmd = DEVLINK_CMD_TRAP_GET,
1088 .validate = GENL_DONT_VALIDATE_STRICT,
1089 .pre_doit = devlink_nl_pre_doit,
1090 .doit = devlink_nl_trap_get_doit,
1091 .post_doit = devlink_nl_post_doit,
1092 .policy = devlink_trap_get_do_nl_policy,
1093 .maxattr = DEVLINK_ATTR_TRAP_NAME,
1094 .flags = GENL_CMD_CAP_DO,
1095 },
1096 {
1097 .cmd = DEVLINK_CMD_TRAP_GET,
1098 .dumpit = devlink_nl_trap_get_dumpit,
1099 .policy = devlink_trap_get_dump_nl_policy,
1100 .maxattr = DEVLINK_ATTR_DEV_NAME,
1101 .flags = GENL_CMD_CAP_DUMP,
1102 },
1103 {
1104 .cmd = DEVLINK_CMD_TRAP_SET,
1105 .validate = GENL_DONT_VALIDATE_STRICT,
1106 .pre_doit = devlink_nl_pre_doit,
1107 .doit = devlink_nl_trap_set_doit,
1108 .post_doit = devlink_nl_post_doit,
1109 .policy = devlink_trap_set_nl_policy,
1110 .maxattr = DEVLINK_ATTR_TRAP_ACTION,
1111 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1112 },
1113 {
1114 .cmd = DEVLINK_CMD_TRAP_GROUP_GET,
1115 .validate = GENL_DONT_VALIDATE_STRICT,
1116 .pre_doit = devlink_nl_pre_doit,
1117 .doit = devlink_nl_trap_group_get_doit,
1118 .post_doit = devlink_nl_post_doit,
1119 .policy = devlink_trap_group_get_do_nl_policy,
1120 .maxattr = DEVLINK_ATTR_TRAP_GROUP_NAME,
1121 .flags = GENL_CMD_CAP_DO,
1122 },
1123 {
1124 .cmd = DEVLINK_CMD_TRAP_GROUP_GET,
1125 .dumpit = devlink_nl_trap_group_get_dumpit,
1126 .policy = devlink_trap_group_get_dump_nl_policy,
1127 .maxattr = DEVLINK_ATTR_DEV_NAME,
1128 .flags = GENL_CMD_CAP_DUMP,
1129 },
1130 {
1131 .cmd = DEVLINK_CMD_TRAP_GROUP_SET,
1132 .validate = GENL_DONT_VALIDATE_STRICT,
1133 .pre_doit = devlink_nl_pre_doit,
1134 .doit = devlink_nl_trap_group_set_doit,
1135 .post_doit = devlink_nl_post_doit,
1136 .policy = devlink_trap_group_set_nl_policy,
1137 .maxattr = DEVLINK_ATTR_TRAP_POLICER_ID,
1138 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1139 },
1140 {
1141 .cmd = DEVLINK_CMD_TRAP_POLICER_GET,
1142 .validate = GENL_DONT_VALIDATE_STRICT,
1143 .pre_doit = devlink_nl_pre_doit,
1144 .doit = devlink_nl_trap_policer_get_doit,
1145 .post_doit = devlink_nl_post_doit,
1146 .policy = devlink_trap_policer_get_do_nl_policy,
1147 .maxattr = DEVLINK_ATTR_TRAP_POLICER_ID,
1148 .flags = GENL_CMD_CAP_DO,
1149 },
1150 {
1151 .cmd = DEVLINK_CMD_TRAP_POLICER_GET,
1152 .dumpit = devlink_nl_trap_policer_get_dumpit,
1153 .policy = devlink_trap_policer_get_dump_nl_policy,
1154 .maxattr = DEVLINK_ATTR_DEV_NAME,
1155 .flags = GENL_CMD_CAP_DUMP,
1156 },
1157 {
1158 .cmd = DEVLINK_CMD_TRAP_POLICER_SET,
1159 .validate = GENL_DONT_VALIDATE_STRICT,
1160 .pre_doit = devlink_nl_pre_doit,
1161 .doit = devlink_nl_trap_policer_set_doit,
1162 .post_doit = devlink_nl_post_doit,
1163 .policy = devlink_trap_policer_set_nl_policy,
1164 .maxattr = DEVLINK_ATTR_TRAP_POLICER_BURST,
1165 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1166 },
1167 {
1168 .cmd = DEVLINK_CMD_HEALTH_REPORTER_TEST,
1169 .validate = GENL_DONT_VALIDATE_STRICT,
1170 .pre_doit = devlink_nl_pre_doit_port_optional,
1171 .doit = devlink_nl_health_reporter_test_doit,
1172 .post_doit = devlink_nl_post_doit,
1173 .policy = devlink_health_reporter_test_nl_policy,
1174 .maxattr = DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1175 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1176 },
1177 {
1178 .cmd = DEVLINK_CMD_RATE_GET,
1179 .validate = GENL_DONT_VALIDATE_STRICT,
1180 .pre_doit = devlink_nl_pre_doit,
1181 .doit = devlink_nl_rate_get_doit,
1182 .post_doit = devlink_nl_post_doit,
1183 .policy = devlink_rate_get_do_nl_policy,
1184 .maxattr = DEVLINK_ATTR_RATE_NODE_NAME,
1185 .flags = GENL_CMD_CAP_DO,
1186 },
1187 {
1188 .cmd = DEVLINK_CMD_RATE_GET,
1189 .dumpit = devlink_nl_rate_get_dumpit,
1190 .policy = devlink_rate_get_dump_nl_policy,
1191 .maxattr = DEVLINK_ATTR_DEV_NAME,
1192 .flags = GENL_CMD_CAP_DUMP,
1193 },
1194 {
1195 .cmd = DEVLINK_CMD_RATE_SET,
1196 .validate = GENL_DONT_VALIDATE_STRICT,
1197 .pre_doit = devlink_nl_pre_doit,
1198 .doit = devlink_nl_rate_set_doit,
1199 .post_doit = devlink_nl_post_doit,
1200 .policy = devlink_rate_set_nl_policy,
1201 .maxattr = DEVLINK_ATTR_RATE_TC_BWS,
1202 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1203 },
1204 {
1205 .cmd = DEVLINK_CMD_RATE_NEW,
1206 .validate = GENL_DONT_VALIDATE_STRICT,
1207 .pre_doit = devlink_nl_pre_doit,
1208 .doit = devlink_nl_rate_new_doit,
1209 .post_doit = devlink_nl_post_doit,
1210 .policy = devlink_rate_new_nl_policy,
1211 .maxattr = DEVLINK_ATTR_RATE_TC_BWS,
1212 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1213 },
1214 {
1215 .cmd = DEVLINK_CMD_RATE_DEL,
1216 .validate = GENL_DONT_VALIDATE_STRICT,
1217 .pre_doit = devlink_nl_pre_doit,
1218 .doit = devlink_nl_rate_del_doit,
1219 .post_doit = devlink_nl_post_doit,
1220 .policy = devlink_rate_del_nl_policy,
1221 .maxattr = DEVLINK_ATTR_RATE_NODE_NAME,
1222 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1223 },
1224 {
1225 .cmd = DEVLINK_CMD_LINECARD_GET,
1226 .validate = GENL_DONT_VALIDATE_STRICT,
1227 .pre_doit = devlink_nl_pre_doit,
1228 .doit = devlink_nl_linecard_get_doit,
1229 .post_doit = devlink_nl_post_doit,
1230 .policy = devlink_linecard_get_do_nl_policy,
1231 .maxattr = DEVLINK_ATTR_LINECARD_INDEX,
1232 .flags = GENL_CMD_CAP_DO,
1233 },
1234 {
1235 .cmd = DEVLINK_CMD_LINECARD_GET,
1236 .dumpit = devlink_nl_linecard_get_dumpit,
1237 .policy = devlink_linecard_get_dump_nl_policy,
1238 .maxattr = DEVLINK_ATTR_DEV_NAME,
1239 .flags = GENL_CMD_CAP_DUMP,
1240 },
1241 {
1242 .cmd = DEVLINK_CMD_LINECARD_SET,
1243 .validate = GENL_DONT_VALIDATE_STRICT,
1244 .pre_doit = devlink_nl_pre_doit,
1245 .doit = devlink_nl_linecard_set_doit,
1246 .post_doit = devlink_nl_post_doit,
1247 .policy = devlink_linecard_set_nl_policy,
1248 .maxattr = DEVLINK_ATTR_LINECARD_TYPE,
1249 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1250 },
1251 {
1252 .cmd = DEVLINK_CMD_SELFTESTS_GET,
1253 .validate = GENL_DONT_VALIDATE_STRICT,
1254 .pre_doit = devlink_nl_pre_doit,
1255 .doit = devlink_nl_selftests_get_doit,
1256 .post_doit = devlink_nl_post_doit,
1257 .policy = devlink_selftests_get_nl_policy,
1258 .maxattr = DEVLINK_ATTR_DEV_NAME,
1259 .flags = GENL_CMD_CAP_DO,
1260 },
1261 {
1262 .cmd = DEVLINK_CMD_SELFTESTS_GET,
1263 .validate = GENL_DONT_VALIDATE_DUMP,
1264 .dumpit = devlink_nl_selftests_get_dumpit,
1265 .flags = GENL_CMD_CAP_DUMP,
1266 },
1267 {
1268 .cmd = DEVLINK_CMD_SELFTESTS_RUN,
1269 .validate = GENL_DONT_VALIDATE_STRICT,
1270 .pre_doit = devlink_nl_pre_doit,
1271 .doit = devlink_nl_selftests_run_doit,
1272 .post_doit = devlink_nl_post_doit,
1273 .policy = devlink_selftests_run_nl_policy,
1274 .maxattr = DEVLINK_ATTR_SELFTESTS,
1275 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1276 },
1277 {
1278 .cmd = DEVLINK_CMD_NOTIFY_FILTER_SET,
1279 .doit = devlink_nl_notify_filter_set_doit,
1280 .policy = devlink_notify_filter_set_nl_policy,
1281 .maxattr = DEVLINK_ATTR_PORT_INDEX,
1282 .flags = GENL_CMD_CAP_DO,
1283 },
1284 };
1285