xref: /linux/net/devlink/netlink_gen.c (revision 17fa6ee35bd4b78752a2d33b92614a1c230a1ced)
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
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, 2),
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_RESET_DEFAULT + 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 	[DEVLINK_ATTR_PARAM_RESET_DEFAULT] = { .type = NLA_FLAG, },
311 };
312 
313 /* DEVLINK_CMD_REGION_GET - do */
314 static const struct nla_policy devlink_region_get_do_nl_policy[DEVLINK_ATTR_REGION_NAME + 1] = {
315 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
316 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
317 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
318 	[DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING, },
319 };
320 
321 /* DEVLINK_CMD_REGION_GET - dump */
322 static const struct nla_policy devlink_region_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
323 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
324 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
325 };
326 
327 /* DEVLINK_CMD_REGION_NEW - do */
328 static const struct nla_policy devlink_region_new_nl_policy[DEVLINK_ATTR_REGION_SNAPSHOT_ID + 1] = {
329 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
330 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
331 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
332 	[DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING, },
333 	[DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .type = NLA_U32, },
334 };
335 
336 /* DEVLINK_CMD_REGION_DEL - do */
337 static const struct nla_policy devlink_region_del_nl_policy[DEVLINK_ATTR_REGION_SNAPSHOT_ID + 1] = {
338 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
339 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
340 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
341 	[DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING, },
342 	[DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .type = NLA_U32, },
343 };
344 
345 /* DEVLINK_CMD_REGION_READ - dump */
346 static const struct nla_policy devlink_region_read_nl_policy[DEVLINK_ATTR_REGION_DIRECT + 1] = {
347 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
348 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
349 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
350 	[DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING, },
351 	[DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .type = NLA_U32, },
352 	[DEVLINK_ATTR_REGION_DIRECT] = { .type = NLA_FLAG, },
353 	[DEVLINK_ATTR_REGION_CHUNK_ADDR] = { .type = NLA_U64, },
354 	[DEVLINK_ATTR_REGION_CHUNK_LEN] = { .type = NLA_U64, },
355 };
356 
357 /* DEVLINK_CMD_PORT_PARAM_GET - do */
358 static const struct nla_policy devlink_port_param_get_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
359 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
360 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
361 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
362 };
363 
364 /* DEVLINK_CMD_PORT_PARAM_SET - do */
365 static const struct nla_policy devlink_port_param_set_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
366 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
367 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
368 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
369 };
370 
371 /* DEVLINK_CMD_INFO_GET - do */
372 static const struct nla_policy devlink_info_get_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
373 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
374 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
375 };
376 
377 /* DEVLINK_CMD_HEALTH_REPORTER_GET - do */
378 static const struct nla_policy devlink_health_reporter_get_do_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
379 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
380 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
381 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
382 	[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
383 };
384 
385 /* DEVLINK_CMD_HEALTH_REPORTER_GET - dump */
386 static const struct nla_policy devlink_health_reporter_get_dump_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
387 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
388 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
389 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
390 };
391 
392 /* DEVLINK_CMD_HEALTH_REPORTER_SET - do */
393 static const struct nla_policy devlink_health_reporter_set_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD + 1] = {
394 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
395 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
396 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
397 	[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
398 	[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD] = { .type = NLA_U64, },
399 	[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER] = { .type = NLA_U8, },
400 	[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP] = { .type = NLA_U8, },
401 	[DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD] = { .type = NLA_U64, },
402 };
403 
404 /* DEVLINK_CMD_HEALTH_REPORTER_RECOVER - do */
405 static const struct nla_policy devlink_health_reporter_recover_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
406 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
407 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
408 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
409 	[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
410 };
411 
412 /* DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE - do */
413 static const struct nla_policy devlink_health_reporter_diagnose_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
414 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
415 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
416 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
417 	[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
418 };
419 
420 /* DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET - dump */
421 static const struct nla_policy devlink_health_reporter_dump_get_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
422 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
423 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
424 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
425 	[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
426 };
427 
428 /* DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR - do */
429 static const struct nla_policy devlink_health_reporter_dump_clear_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
430 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
431 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
432 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
433 	[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
434 };
435 
436 /* DEVLINK_CMD_FLASH_UPDATE - do */
437 static const struct nla_policy devlink_flash_update_nl_policy[DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK + 1] = {
438 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
439 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
440 	[DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME] = { .type = NLA_NUL_STRING, },
441 	[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT] = { .type = NLA_NUL_STRING, },
442 	[DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK] = NLA_POLICY_BITFIELD32(3),
443 };
444 
445 /* DEVLINK_CMD_TRAP_GET - do */
446 static const struct nla_policy devlink_trap_get_do_nl_policy[DEVLINK_ATTR_TRAP_NAME + 1] = {
447 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
448 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
449 	[DEVLINK_ATTR_TRAP_NAME] = { .type = NLA_NUL_STRING, },
450 };
451 
452 /* DEVLINK_CMD_TRAP_GET - dump */
453 static const struct nla_policy devlink_trap_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
454 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
455 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
456 };
457 
458 /* DEVLINK_CMD_TRAP_SET - do */
459 static const struct nla_policy devlink_trap_set_nl_policy[DEVLINK_ATTR_TRAP_ACTION + 1] = {
460 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
461 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
462 	[DEVLINK_ATTR_TRAP_NAME] = { .type = NLA_NUL_STRING, },
463 	[DEVLINK_ATTR_TRAP_ACTION] = NLA_POLICY_MAX(NLA_U8, 2),
464 };
465 
466 /* DEVLINK_CMD_TRAP_GROUP_GET - do */
467 static const struct nla_policy devlink_trap_group_get_do_nl_policy[DEVLINK_ATTR_TRAP_GROUP_NAME + 1] = {
468 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
469 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
470 	[DEVLINK_ATTR_TRAP_GROUP_NAME] = { .type = NLA_NUL_STRING, },
471 };
472 
473 /* DEVLINK_CMD_TRAP_GROUP_GET - dump */
474 static const struct nla_policy devlink_trap_group_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
475 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
476 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
477 };
478 
479 /* DEVLINK_CMD_TRAP_GROUP_SET - do */
480 static const struct nla_policy devlink_trap_group_set_nl_policy[DEVLINK_ATTR_TRAP_POLICER_ID + 1] = {
481 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
482 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
483 	[DEVLINK_ATTR_TRAP_GROUP_NAME] = { .type = NLA_NUL_STRING, },
484 	[DEVLINK_ATTR_TRAP_ACTION] = NLA_POLICY_MAX(NLA_U8, 2),
485 	[DEVLINK_ATTR_TRAP_POLICER_ID] = { .type = NLA_U32, },
486 };
487 
488 /* DEVLINK_CMD_TRAP_POLICER_GET - do */
489 static const struct nla_policy devlink_trap_policer_get_do_nl_policy[DEVLINK_ATTR_TRAP_POLICER_ID + 1] = {
490 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
491 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
492 	[DEVLINK_ATTR_TRAP_POLICER_ID] = { .type = NLA_U32, },
493 };
494 
495 /* DEVLINK_CMD_TRAP_POLICER_GET - dump */
496 static const struct nla_policy devlink_trap_policer_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
497 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
498 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
499 };
500 
501 /* DEVLINK_CMD_TRAP_POLICER_SET - do */
502 static const struct nla_policy devlink_trap_policer_set_nl_policy[DEVLINK_ATTR_TRAP_POLICER_BURST + 1] = {
503 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
504 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
505 	[DEVLINK_ATTR_TRAP_POLICER_ID] = { .type = NLA_U32, },
506 	[DEVLINK_ATTR_TRAP_POLICER_RATE] = { .type = NLA_U64, },
507 	[DEVLINK_ATTR_TRAP_POLICER_BURST] = { .type = NLA_U64, },
508 };
509 
510 /* DEVLINK_CMD_HEALTH_REPORTER_TEST - do */
511 static const struct nla_policy devlink_health_reporter_test_nl_policy[DEVLINK_ATTR_HEALTH_REPORTER_NAME + 1] = {
512 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
513 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
514 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
515 	[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .type = NLA_NUL_STRING, },
516 };
517 
518 /* DEVLINK_CMD_RATE_GET - do */
519 static const struct nla_policy devlink_rate_get_do_nl_policy[DEVLINK_ATTR_RATE_NODE_NAME + 1] = {
520 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
521 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
522 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
523 	[DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
524 };
525 
526 /* DEVLINK_CMD_RATE_GET - dump */
527 static const struct nla_policy devlink_rate_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
528 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
529 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
530 };
531 
532 /* DEVLINK_CMD_RATE_SET - do */
533 static const struct nla_policy devlink_rate_set_nl_policy[DEVLINK_ATTR_RATE_TC_BWS + 1] = {
534 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
535 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
536 	[DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
537 	[DEVLINK_ATTR_RATE_TX_SHARE] = { .type = NLA_U64, },
538 	[DEVLINK_ATTR_RATE_TX_MAX] = { .type = NLA_U64, },
539 	[DEVLINK_ATTR_RATE_TX_PRIORITY] = { .type = NLA_U32, },
540 	[DEVLINK_ATTR_RATE_TX_WEIGHT] = { .type = NLA_U32, },
541 	[DEVLINK_ATTR_RATE_PARENT_NODE_NAME] = { .type = NLA_NUL_STRING, },
542 	[DEVLINK_ATTR_RATE_TC_BWS] = NLA_POLICY_NESTED(devlink_dl_rate_tc_bws_nl_policy),
543 };
544 
545 /* DEVLINK_CMD_RATE_NEW - do */
546 static const struct nla_policy devlink_rate_new_nl_policy[DEVLINK_ATTR_RATE_TC_BWS + 1] = {
547 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
548 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
549 	[DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
550 	[DEVLINK_ATTR_RATE_TX_SHARE] = { .type = NLA_U64, },
551 	[DEVLINK_ATTR_RATE_TX_MAX] = { .type = NLA_U64, },
552 	[DEVLINK_ATTR_RATE_TX_PRIORITY] = { .type = NLA_U32, },
553 	[DEVLINK_ATTR_RATE_TX_WEIGHT] = { .type = NLA_U32, },
554 	[DEVLINK_ATTR_RATE_PARENT_NODE_NAME] = { .type = NLA_NUL_STRING, },
555 	[DEVLINK_ATTR_RATE_TC_BWS] = NLA_POLICY_NESTED(devlink_dl_rate_tc_bws_nl_policy),
556 };
557 
558 /* DEVLINK_CMD_RATE_DEL - do */
559 static const struct nla_policy devlink_rate_del_nl_policy[DEVLINK_ATTR_RATE_NODE_NAME + 1] = {
560 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
561 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
562 	[DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
563 };
564 
565 /* DEVLINK_CMD_LINECARD_GET - do */
566 static const struct nla_policy devlink_linecard_get_do_nl_policy[DEVLINK_ATTR_LINECARD_INDEX + 1] = {
567 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
568 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
569 	[DEVLINK_ATTR_LINECARD_INDEX] = { .type = NLA_U32, },
570 };
571 
572 /* DEVLINK_CMD_LINECARD_GET - dump */
573 static const struct nla_policy devlink_linecard_get_dump_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
574 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
575 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
576 };
577 
578 /* DEVLINK_CMD_LINECARD_SET - do */
579 static const struct nla_policy devlink_linecard_set_nl_policy[DEVLINK_ATTR_LINECARD_TYPE + 1] = {
580 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
581 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
582 	[DEVLINK_ATTR_LINECARD_INDEX] = { .type = NLA_U32, },
583 	[DEVLINK_ATTR_LINECARD_TYPE] = { .type = NLA_NUL_STRING, },
584 };
585 
586 /* DEVLINK_CMD_SELFTESTS_GET - do */
587 static const struct nla_policy devlink_selftests_get_nl_policy[DEVLINK_ATTR_DEV_NAME + 1] = {
588 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
589 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
590 };
591 
592 /* DEVLINK_CMD_SELFTESTS_RUN - do */
593 static const struct nla_policy devlink_selftests_run_nl_policy[DEVLINK_ATTR_SELFTESTS + 1] = {
594 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
595 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
596 	[DEVLINK_ATTR_SELFTESTS] = NLA_POLICY_NESTED(devlink_dl_selftest_id_nl_policy),
597 };
598 
599 /* DEVLINK_CMD_NOTIFY_FILTER_SET - do */
600 static const struct nla_policy devlink_notify_filter_set_nl_policy[DEVLINK_ATTR_PORT_INDEX + 1] = {
601 	[DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
602 	[DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
603 	[DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
604 };
605 
606 /* Ops table for devlink */
607 const struct genl_split_ops devlink_nl_ops[74] = {
608 	{
609 		.cmd		= DEVLINK_CMD_GET,
610 		.validate	= GENL_DONT_VALIDATE_STRICT,
611 		.pre_doit	= devlink_nl_pre_doit,
612 		.doit		= devlink_nl_get_doit,
613 		.post_doit	= devlink_nl_post_doit,
614 		.policy		= devlink_get_nl_policy,
615 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
616 		.flags		= GENL_CMD_CAP_DO,
617 	},
618 	{
619 		.cmd		= DEVLINK_CMD_GET,
620 		.validate	= GENL_DONT_VALIDATE_DUMP,
621 		.dumpit		= devlink_nl_get_dumpit,
622 		.flags		= GENL_CMD_CAP_DUMP,
623 	},
624 	{
625 		.cmd		= DEVLINK_CMD_PORT_GET,
626 		.validate	= GENL_DONT_VALIDATE_STRICT,
627 		.pre_doit	= devlink_nl_pre_doit_port,
628 		.doit		= devlink_nl_port_get_doit,
629 		.post_doit	= devlink_nl_post_doit,
630 		.policy		= devlink_port_get_do_nl_policy,
631 		.maxattr	= DEVLINK_ATTR_PORT_INDEX,
632 		.flags		= GENL_CMD_CAP_DO,
633 	},
634 	{
635 		.cmd		= DEVLINK_CMD_PORT_GET,
636 		.dumpit		= devlink_nl_port_get_dumpit,
637 		.policy		= devlink_port_get_dump_nl_policy,
638 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
639 		.flags		= GENL_CMD_CAP_DUMP,
640 	},
641 	{
642 		.cmd		= DEVLINK_CMD_PORT_SET,
643 		.validate	= GENL_DONT_VALIDATE_STRICT,
644 		.pre_doit	= devlink_nl_pre_doit_port,
645 		.doit		= devlink_nl_port_set_doit,
646 		.post_doit	= devlink_nl_post_doit,
647 		.policy		= devlink_port_set_nl_policy,
648 		.maxattr	= DEVLINK_ATTR_PORT_FUNCTION,
649 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
650 	},
651 	{
652 		.cmd		= DEVLINK_CMD_PORT_NEW,
653 		.validate	= GENL_DONT_VALIDATE_STRICT,
654 		.pre_doit	= devlink_nl_pre_doit,
655 		.doit		= devlink_nl_port_new_doit,
656 		.post_doit	= devlink_nl_post_doit,
657 		.policy		= devlink_port_new_nl_policy,
658 		.maxattr	= DEVLINK_ATTR_PORT_PCI_SF_NUMBER,
659 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
660 	},
661 	{
662 		.cmd		= DEVLINK_CMD_PORT_DEL,
663 		.validate	= GENL_DONT_VALIDATE_STRICT,
664 		.pre_doit	= devlink_nl_pre_doit_port,
665 		.doit		= devlink_nl_port_del_doit,
666 		.post_doit	= devlink_nl_post_doit,
667 		.policy		= devlink_port_del_nl_policy,
668 		.maxattr	= DEVLINK_ATTR_PORT_INDEX,
669 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
670 	},
671 	{
672 		.cmd		= DEVLINK_CMD_PORT_SPLIT,
673 		.validate	= GENL_DONT_VALIDATE_STRICT,
674 		.pre_doit	= devlink_nl_pre_doit_port,
675 		.doit		= devlink_nl_port_split_doit,
676 		.post_doit	= devlink_nl_post_doit,
677 		.policy		= devlink_port_split_nl_policy,
678 		.maxattr	= DEVLINK_ATTR_PORT_SPLIT_COUNT,
679 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
680 	},
681 	{
682 		.cmd		= DEVLINK_CMD_PORT_UNSPLIT,
683 		.validate	= GENL_DONT_VALIDATE_STRICT,
684 		.pre_doit	= devlink_nl_pre_doit_port,
685 		.doit		= devlink_nl_port_unsplit_doit,
686 		.post_doit	= devlink_nl_post_doit,
687 		.policy		= devlink_port_unsplit_nl_policy,
688 		.maxattr	= DEVLINK_ATTR_PORT_INDEX,
689 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
690 	},
691 	{
692 		.cmd		= DEVLINK_CMD_SB_GET,
693 		.validate	= GENL_DONT_VALIDATE_STRICT,
694 		.pre_doit	= devlink_nl_pre_doit,
695 		.doit		= devlink_nl_sb_get_doit,
696 		.post_doit	= devlink_nl_post_doit,
697 		.policy		= devlink_sb_get_do_nl_policy,
698 		.maxattr	= DEVLINK_ATTR_SB_INDEX,
699 		.flags		= GENL_CMD_CAP_DO,
700 	},
701 	{
702 		.cmd		= DEVLINK_CMD_SB_GET,
703 		.dumpit		= devlink_nl_sb_get_dumpit,
704 		.policy		= devlink_sb_get_dump_nl_policy,
705 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
706 		.flags		= GENL_CMD_CAP_DUMP,
707 	},
708 	{
709 		.cmd		= DEVLINK_CMD_SB_POOL_GET,
710 		.validate	= GENL_DONT_VALIDATE_STRICT,
711 		.pre_doit	= devlink_nl_pre_doit,
712 		.doit		= devlink_nl_sb_pool_get_doit,
713 		.post_doit	= devlink_nl_post_doit,
714 		.policy		= devlink_sb_pool_get_do_nl_policy,
715 		.maxattr	= DEVLINK_ATTR_SB_POOL_INDEX,
716 		.flags		= GENL_CMD_CAP_DO,
717 	},
718 	{
719 		.cmd		= DEVLINK_CMD_SB_POOL_GET,
720 		.dumpit		= devlink_nl_sb_pool_get_dumpit,
721 		.policy		= devlink_sb_pool_get_dump_nl_policy,
722 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
723 		.flags		= GENL_CMD_CAP_DUMP,
724 	},
725 	{
726 		.cmd		= DEVLINK_CMD_SB_POOL_SET,
727 		.validate	= GENL_DONT_VALIDATE_STRICT,
728 		.pre_doit	= devlink_nl_pre_doit,
729 		.doit		= devlink_nl_sb_pool_set_doit,
730 		.post_doit	= devlink_nl_post_doit,
731 		.policy		= devlink_sb_pool_set_nl_policy,
732 		.maxattr	= DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE,
733 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
734 	},
735 	{
736 		.cmd		= DEVLINK_CMD_SB_PORT_POOL_GET,
737 		.validate	= GENL_DONT_VALIDATE_STRICT,
738 		.pre_doit	= devlink_nl_pre_doit_port,
739 		.doit		= devlink_nl_sb_port_pool_get_doit,
740 		.post_doit	= devlink_nl_post_doit,
741 		.policy		= devlink_sb_port_pool_get_do_nl_policy,
742 		.maxattr	= DEVLINK_ATTR_SB_POOL_INDEX,
743 		.flags		= GENL_CMD_CAP_DO,
744 	},
745 	{
746 		.cmd		= DEVLINK_CMD_SB_PORT_POOL_GET,
747 		.dumpit		= devlink_nl_sb_port_pool_get_dumpit,
748 		.policy		= devlink_sb_port_pool_get_dump_nl_policy,
749 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
750 		.flags		= GENL_CMD_CAP_DUMP,
751 	},
752 	{
753 		.cmd		= DEVLINK_CMD_SB_PORT_POOL_SET,
754 		.validate	= GENL_DONT_VALIDATE_STRICT,
755 		.pre_doit	= devlink_nl_pre_doit_port,
756 		.doit		= devlink_nl_sb_port_pool_set_doit,
757 		.post_doit	= devlink_nl_post_doit,
758 		.policy		= devlink_sb_port_pool_set_nl_policy,
759 		.maxattr	= DEVLINK_ATTR_SB_THRESHOLD,
760 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
761 	},
762 	{
763 		.cmd		= DEVLINK_CMD_SB_TC_POOL_BIND_GET,
764 		.validate	= GENL_DONT_VALIDATE_STRICT,
765 		.pre_doit	= devlink_nl_pre_doit_port,
766 		.doit		= devlink_nl_sb_tc_pool_bind_get_doit,
767 		.post_doit	= devlink_nl_post_doit,
768 		.policy		= devlink_sb_tc_pool_bind_get_do_nl_policy,
769 		.maxattr	= DEVLINK_ATTR_SB_TC_INDEX,
770 		.flags		= GENL_CMD_CAP_DO,
771 	},
772 	{
773 		.cmd		= DEVLINK_CMD_SB_TC_POOL_BIND_GET,
774 		.dumpit		= devlink_nl_sb_tc_pool_bind_get_dumpit,
775 		.policy		= devlink_sb_tc_pool_bind_get_dump_nl_policy,
776 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
777 		.flags		= GENL_CMD_CAP_DUMP,
778 	},
779 	{
780 		.cmd		= DEVLINK_CMD_SB_TC_POOL_BIND_SET,
781 		.validate	= GENL_DONT_VALIDATE_STRICT,
782 		.pre_doit	= devlink_nl_pre_doit_port,
783 		.doit		= devlink_nl_sb_tc_pool_bind_set_doit,
784 		.post_doit	= devlink_nl_post_doit,
785 		.policy		= devlink_sb_tc_pool_bind_set_nl_policy,
786 		.maxattr	= DEVLINK_ATTR_SB_TC_INDEX,
787 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
788 	},
789 	{
790 		.cmd		= DEVLINK_CMD_SB_OCC_SNAPSHOT,
791 		.validate	= GENL_DONT_VALIDATE_STRICT,
792 		.pre_doit	= devlink_nl_pre_doit,
793 		.doit		= devlink_nl_sb_occ_snapshot_doit,
794 		.post_doit	= devlink_nl_post_doit,
795 		.policy		= devlink_sb_occ_snapshot_nl_policy,
796 		.maxattr	= DEVLINK_ATTR_SB_INDEX,
797 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
798 	},
799 	{
800 		.cmd		= DEVLINK_CMD_SB_OCC_MAX_CLEAR,
801 		.validate	= GENL_DONT_VALIDATE_STRICT,
802 		.pre_doit	= devlink_nl_pre_doit,
803 		.doit		= devlink_nl_sb_occ_max_clear_doit,
804 		.post_doit	= devlink_nl_post_doit,
805 		.policy		= devlink_sb_occ_max_clear_nl_policy,
806 		.maxattr	= DEVLINK_ATTR_SB_INDEX,
807 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
808 	},
809 	{
810 		.cmd		= DEVLINK_CMD_ESWITCH_GET,
811 		.validate	= GENL_DONT_VALIDATE_STRICT,
812 		.pre_doit	= devlink_nl_pre_doit,
813 		.doit		= devlink_nl_eswitch_get_doit,
814 		.post_doit	= devlink_nl_post_doit,
815 		.policy		= devlink_eswitch_get_nl_policy,
816 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
817 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
818 	},
819 	{
820 		.cmd		= DEVLINK_CMD_ESWITCH_SET,
821 		.validate	= GENL_DONT_VALIDATE_STRICT,
822 		.pre_doit	= devlink_nl_pre_doit,
823 		.doit		= devlink_nl_eswitch_set_doit,
824 		.post_doit	= devlink_nl_post_doit,
825 		.policy		= devlink_eswitch_set_nl_policy,
826 		.maxattr	= DEVLINK_ATTR_ESWITCH_ENCAP_MODE,
827 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
828 	},
829 	{
830 		.cmd		= DEVLINK_CMD_DPIPE_TABLE_GET,
831 		.validate	= GENL_DONT_VALIDATE_STRICT,
832 		.pre_doit	= devlink_nl_pre_doit,
833 		.doit		= devlink_nl_dpipe_table_get_doit,
834 		.post_doit	= devlink_nl_post_doit,
835 		.policy		= devlink_dpipe_table_get_nl_policy,
836 		.maxattr	= DEVLINK_ATTR_DPIPE_TABLE_NAME,
837 		.flags		= GENL_CMD_CAP_DO,
838 	},
839 	{
840 		.cmd		= DEVLINK_CMD_DPIPE_ENTRIES_GET,
841 		.validate	= GENL_DONT_VALIDATE_STRICT,
842 		.pre_doit	= devlink_nl_pre_doit,
843 		.doit		= devlink_nl_dpipe_entries_get_doit,
844 		.post_doit	= devlink_nl_post_doit,
845 		.policy		= devlink_dpipe_entries_get_nl_policy,
846 		.maxattr	= DEVLINK_ATTR_DPIPE_TABLE_NAME,
847 		.flags		= GENL_CMD_CAP_DO,
848 	},
849 	{
850 		.cmd		= DEVLINK_CMD_DPIPE_HEADERS_GET,
851 		.validate	= GENL_DONT_VALIDATE_STRICT,
852 		.pre_doit	= devlink_nl_pre_doit,
853 		.doit		= devlink_nl_dpipe_headers_get_doit,
854 		.post_doit	= devlink_nl_post_doit,
855 		.policy		= devlink_dpipe_headers_get_nl_policy,
856 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
857 		.flags		= GENL_CMD_CAP_DO,
858 	},
859 	{
860 		.cmd		= DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
861 		.validate	= GENL_DONT_VALIDATE_STRICT,
862 		.pre_doit	= devlink_nl_pre_doit,
863 		.doit		= devlink_nl_dpipe_table_counters_set_doit,
864 		.post_doit	= devlink_nl_post_doit,
865 		.policy		= devlink_dpipe_table_counters_set_nl_policy,
866 		.maxattr	= DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED,
867 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
868 	},
869 	{
870 		.cmd		= DEVLINK_CMD_RESOURCE_SET,
871 		.validate	= GENL_DONT_VALIDATE_STRICT,
872 		.pre_doit	= devlink_nl_pre_doit,
873 		.doit		= devlink_nl_resource_set_doit,
874 		.post_doit	= devlink_nl_post_doit,
875 		.policy		= devlink_resource_set_nl_policy,
876 		.maxattr	= DEVLINK_ATTR_RESOURCE_SIZE,
877 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
878 	},
879 	{
880 		.cmd		= DEVLINK_CMD_RESOURCE_DUMP,
881 		.validate	= GENL_DONT_VALIDATE_STRICT,
882 		.pre_doit	= devlink_nl_pre_doit,
883 		.doit		= devlink_nl_resource_dump_doit,
884 		.post_doit	= devlink_nl_post_doit,
885 		.policy		= devlink_resource_dump_nl_policy,
886 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
887 		.flags		= GENL_CMD_CAP_DO,
888 	},
889 	{
890 		.cmd		= DEVLINK_CMD_RELOAD,
891 		.validate	= GENL_DONT_VALIDATE_STRICT,
892 		.pre_doit	= devlink_nl_pre_doit_dev_lock,
893 		.doit		= devlink_nl_reload_doit,
894 		.post_doit	= devlink_nl_post_doit_dev_lock,
895 		.policy		= devlink_reload_nl_policy,
896 		.maxattr	= DEVLINK_ATTR_RELOAD_LIMITS,
897 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
898 	},
899 	{
900 		.cmd		= DEVLINK_CMD_PARAM_GET,
901 		.validate	= GENL_DONT_VALIDATE_STRICT,
902 		.pre_doit	= devlink_nl_pre_doit,
903 		.doit		= devlink_nl_param_get_doit,
904 		.post_doit	= devlink_nl_post_doit,
905 		.policy		= devlink_param_get_do_nl_policy,
906 		.maxattr	= DEVLINK_ATTR_PARAM_NAME,
907 		.flags		= GENL_CMD_CAP_DO,
908 	},
909 	{
910 		.cmd		= DEVLINK_CMD_PARAM_GET,
911 		.dumpit		= devlink_nl_param_get_dumpit,
912 		.policy		= devlink_param_get_dump_nl_policy,
913 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
914 		.flags		= GENL_CMD_CAP_DUMP,
915 	},
916 	{
917 		.cmd		= DEVLINK_CMD_PARAM_SET,
918 		.validate	= GENL_DONT_VALIDATE_STRICT,
919 		.pre_doit	= devlink_nl_pre_doit,
920 		.doit		= devlink_nl_param_set_doit,
921 		.post_doit	= devlink_nl_post_doit,
922 		.policy		= devlink_param_set_nl_policy,
923 		.maxattr	= DEVLINK_ATTR_PARAM_RESET_DEFAULT,
924 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
925 	},
926 	{
927 		.cmd		= DEVLINK_CMD_REGION_GET,
928 		.validate	= GENL_DONT_VALIDATE_STRICT,
929 		.pre_doit	= devlink_nl_pre_doit_port_optional,
930 		.doit		= devlink_nl_region_get_doit,
931 		.post_doit	= devlink_nl_post_doit,
932 		.policy		= devlink_region_get_do_nl_policy,
933 		.maxattr	= DEVLINK_ATTR_REGION_NAME,
934 		.flags		= GENL_CMD_CAP_DO,
935 	},
936 	{
937 		.cmd		= DEVLINK_CMD_REGION_GET,
938 		.dumpit		= devlink_nl_region_get_dumpit,
939 		.policy		= devlink_region_get_dump_nl_policy,
940 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
941 		.flags		= GENL_CMD_CAP_DUMP,
942 	},
943 	{
944 		.cmd		= DEVLINK_CMD_REGION_NEW,
945 		.validate	= GENL_DONT_VALIDATE_STRICT,
946 		.pre_doit	= devlink_nl_pre_doit_port_optional,
947 		.doit		= devlink_nl_region_new_doit,
948 		.post_doit	= devlink_nl_post_doit,
949 		.policy		= devlink_region_new_nl_policy,
950 		.maxattr	= DEVLINK_ATTR_REGION_SNAPSHOT_ID,
951 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
952 	},
953 	{
954 		.cmd		= DEVLINK_CMD_REGION_DEL,
955 		.validate	= GENL_DONT_VALIDATE_STRICT,
956 		.pre_doit	= devlink_nl_pre_doit_port_optional,
957 		.doit		= devlink_nl_region_del_doit,
958 		.post_doit	= devlink_nl_post_doit,
959 		.policy		= devlink_region_del_nl_policy,
960 		.maxattr	= DEVLINK_ATTR_REGION_SNAPSHOT_ID,
961 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
962 	},
963 	{
964 		.cmd		= DEVLINK_CMD_REGION_READ,
965 		.validate	= GENL_DONT_VALIDATE_DUMP_STRICT,
966 		.dumpit		= devlink_nl_region_read_dumpit,
967 		.policy		= devlink_region_read_nl_policy,
968 		.maxattr	= DEVLINK_ATTR_REGION_DIRECT,
969 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DUMP,
970 	},
971 	{
972 		.cmd		= DEVLINK_CMD_PORT_PARAM_GET,
973 		.validate	= GENL_DONT_VALIDATE_STRICT,
974 		.pre_doit	= devlink_nl_pre_doit_port,
975 		.doit		= devlink_nl_port_param_get_doit,
976 		.post_doit	= devlink_nl_post_doit,
977 		.policy		= devlink_port_param_get_nl_policy,
978 		.maxattr	= DEVLINK_ATTR_PORT_INDEX,
979 		.flags		= GENL_CMD_CAP_DO,
980 	},
981 	{
982 		.cmd		= DEVLINK_CMD_PORT_PARAM_GET,
983 		.validate	= GENL_DONT_VALIDATE_DUMP_STRICT,
984 		.dumpit		= devlink_nl_port_param_get_dumpit,
985 		.flags		= GENL_CMD_CAP_DUMP,
986 	},
987 	{
988 		.cmd		= DEVLINK_CMD_PORT_PARAM_SET,
989 		.validate	= GENL_DONT_VALIDATE_STRICT,
990 		.pre_doit	= devlink_nl_pre_doit_port,
991 		.doit		= devlink_nl_port_param_set_doit,
992 		.post_doit	= devlink_nl_post_doit,
993 		.policy		= devlink_port_param_set_nl_policy,
994 		.maxattr	= DEVLINK_ATTR_PORT_INDEX,
995 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
996 	},
997 	{
998 		.cmd		= DEVLINK_CMD_INFO_GET,
999 		.validate	= GENL_DONT_VALIDATE_STRICT,
1000 		.pre_doit	= devlink_nl_pre_doit,
1001 		.doit		= devlink_nl_info_get_doit,
1002 		.post_doit	= devlink_nl_post_doit,
1003 		.policy		= devlink_info_get_nl_policy,
1004 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
1005 		.flags		= GENL_CMD_CAP_DO,
1006 	},
1007 	{
1008 		.cmd		= DEVLINK_CMD_INFO_GET,
1009 		.validate	= GENL_DONT_VALIDATE_DUMP,
1010 		.dumpit		= devlink_nl_info_get_dumpit,
1011 		.flags		= GENL_CMD_CAP_DUMP,
1012 	},
1013 	{
1014 		.cmd		= DEVLINK_CMD_HEALTH_REPORTER_GET,
1015 		.validate	= GENL_DONT_VALIDATE_STRICT,
1016 		.pre_doit	= devlink_nl_pre_doit_port_optional,
1017 		.doit		= devlink_nl_health_reporter_get_doit,
1018 		.post_doit	= devlink_nl_post_doit,
1019 		.policy		= devlink_health_reporter_get_do_nl_policy,
1020 		.maxattr	= DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1021 		.flags		= GENL_CMD_CAP_DO,
1022 	},
1023 	{
1024 		.cmd		= DEVLINK_CMD_HEALTH_REPORTER_GET,
1025 		.dumpit		= devlink_nl_health_reporter_get_dumpit,
1026 		.policy		= devlink_health_reporter_get_dump_nl_policy,
1027 		.maxattr	= DEVLINK_ATTR_PORT_INDEX,
1028 		.flags		= GENL_CMD_CAP_DUMP,
1029 	},
1030 	{
1031 		.cmd		= DEVLINK_CMD_HEALTH_REPORTER_SET,
1032 		.validate	= GENL_DONT_VALIDATE_STRICT,
1033 		.pre_doit	= devlink_nl_pre_doit_port_optional,
1034 		.doit		= devlink_nl_health_reporter_set_doit,
1035 		.post_doit	= devlink_nl_post_doit,
1036 		.policy		= devlink_health_reporter_set_nl_policy,
1037 		.maxattr	= DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD,
1038 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1039 	},
1040 	{
1041 		.cmd		= DEVLINK_CMD_HEALTH_REPORTER_RECOVER,
1042 		.validate	= GENL_DONT_VALIDATE_STRICT,
1043 		.pre_doit	= devlink_nl_pre_doit_port_optional,
1044 		.doit		= devlink_nl_health_reporter_recover_doit,
1045 		.post_doit	= devlink_nl_post_doit,
1046 		.policy		= devlink_health_reporter_recover_nl_policy,
1047 		.maxattr	= DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1048 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1049 	},
1050 	{
1051 		.cmd		= DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE,
1052 		.validate	= GENL_DONT_VALIDATE_STRICT,
1053 		.pre_doit	= devlink_nl_pre_doit_port_optional,
1054 		.doit		= devlink_nl_health_reporter_diagnose_doit,
1055 		.post_doit	= devlink_nl_post_doit,
1056 		.policy		= devlink_health_reporter_diagnose_nl_policy,
1057 		.maxattr	= DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1058 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1059 	},
1060 	{
1061 		.cmd		= DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET,
1062 		.validate	= GENL_DONT_VALIDATE_DUMP_STRICT,
1063 		.dumpit		= devlink_nl_health_reporter_dump_get_dumpit,
1064 		.policy		= devlink_health_reporter_dump_get_nl_policy,
1065 		.maxattr	= DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1066 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DUMP,
1067 	},
1068 	{
1069 		.cmd		= DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR,
1070 		.validate	= GENL_DONT_VALIDATE_STRICT,
1071 		.pre_doit	= devlink_nl_pre_doit_port_optional,
1072 		.doit		= devlink_nl_health_reporter_dump_clear_doit,
1073 		.post_doit	= devlink_nl_post_doit,
1074 		.policy		= devlink_health_reporter_dump_clear_nl_policy,
1075 		.maxattr	= DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1076 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1077 	},
1078 	{
1079 		.cmd		= DEVLINK_CMD_FLASH_UPDATE,
1080 		.validate	= GENL_DONT_VALIDATE_STRICT,
1081 		.pre_doit	= devlink_nl_pre_doit,
1082 		.doit		= devlink_nl_flash_update_doit,
1083 		.post_doit	= devlink_nl_post_doit,
1084 		.policy		= devlink_flash_update_nl_policy,
1085 		.maxattr	= DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK,
1086 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1087 	},
1088 	{
1089 		.cmd		= DEVLINK_CMD_TRAP_GET,
1090 		.validate	= GENL_DONT_VALIDATE_STRICT,
1091 		.pre_doit	= devlink_nl_pre_doit,
1092 		.doit		= devlink_nl_trap_get_doit,
1093 		.post_doit	= devlink_nl_post_doit,
1094 		.policy		= devlink_trap_get_do_nl_policy,
1095 		.maxattr	= DEVLINK_ATTR_TRAP_NAME,
1096 		.flags		= GENL_CMD_CAP_DO,
1097 	},
1098 	{
1099 		.cmd		= DEVLINK_CMD_TRAP_GET,
1100 		.dumpit		= devlink_nl_trap_get_dumpit,
1101 		.policy		= devlink_trap_get_dump_nl_policy,
1102 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
1103 		.flags		= GENL_CMD_CAP_DUMP,
1104 	},
1105 	{
1106 		.cmd		= DEVLINK_CMD_TRAP_SET,
1107 		.validate	= GENL_DONT_VALIDATE_STRICT,
1108 		.pre_doit	= devlink_nl_pre_doit,
1109 		.doit		= devlink_nl_trap_set_doit,
1110 		.post_doit	= devlink_nl_post_doit,
1111 		.policy		= devlink_trap_set_nl_policy,
1112 		.maxattr	= DEVLINK_ATTR_TRAP_ACTION,
1113 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1114 	},
1115 	{
1116 		.cmd		= DEVLINK_CMD_TRAP_GROUP_GET,
1117 		.validate	= GENL_DONT_VALIDATE_STRICT,
1118 		.pre_doit	= devlink_nl_pre_doit,
1119 		.doit		= devlink_nl_trap_group_get_doit,
1120 		.post_doit	= devlink_nl_post_doit,
1121 		.policy		= devlink_trap_group_get_do_nl_policy,
1122 		.maxattr	= DEVLINK_ATTR_TRAP_GROUP_NAME,
1123 		.flags		= GENL_CMD_CAP_DO,
1124 	},
1125 	{
1126 		.cmd		= DEVLINK_CMD_TRAP_GROUP_GET,
1127 		.dumpit		= devlink_nl_trap_group_get_dumpit,
1128 		.policy		= devlink_trap_group_get_dump_nl_policy,
1129 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
1130 		.flags		= GENL_CMD_CAP_DUMP,
1131 	},
1132 	{
1133 		.cmd		= DEVLINK_CMD_TRAP_GROUP_SET,
1134 		.validate	= GENL_DONT_VALIDATE_STRICT,
1135 		.pre_doit	= devlink_nl_pre_doit,
1136 		.doit		= devlink_nl_trap_group_set_doit,
1137 		.post_doit	= devlink_nl_post_doit,
1138 		.policy		= devlink_trap_group_set_nl_policy,
1139 		.maxattr	= DEVLINK_ATTR_TRAP_POLICER_ID,
1140 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1141 	},
1142 	{
1143 		.cmd		= DEVLINK_CMD_TRAP_POLICER_GET,
1144 		.validate	= GENL_DONT_VALIDATE_STRICT,
1145 		.pre_doit	= devlink_nl_pre_doit,
1146 		.doit		= devlink_nl_trap_policer_get_doit,
1147 		.post_doit	= devlink_nl_post_doit,
1148 		.policy		= devlink_trap_policer_get_do_nl_policy,
1149 		.maxattr	= DEVLINK_ATTR_TRAP_POLICER_ID,
1150 		.flags		= GENL_CMD_CAP_DO,
1151 	},
1152 	{
1153 		.cmd		= DEVLINK_CMD_TRAP_POLICER_GET,
1154 		.dumpit		= devlink_nl_trap_policer_get_dumpit,
1155 		.policy		= devlink_trap_policer_get_dump_nl_policy,
1156 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
1157 		.flags		= GENL_CMD_CAP_DUMP,
1158 	},
1159 	{
1160 		.cmd		= DEVLINK_CMD_TRAP_POLICER_SET,
1161 		.validate	= GENL_DONT_VALIDATE_STRICT,
1162 		.pre_doit	= devlink_nl_pre_doit,
1163 		.doit		= devlink_nl_trap_policer_set_doit,
1164 		.post_doit	= devlink_nl_post_doit,
1165 		.policy		= devlink_trap_policer_set_nl_policy,
1166 		.maxattr	= DEVLINK_ATTR_TRAP_POLICER_BURST,
1167 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1168 	},
1169 	{
1170 		.cmd		= DEVLINK_CMD_HEALTH_REPORTER_TEST,
1171 		.validate	= GENL_DONT_VALIDATE_STRICT,
1172 		.pre_doit	= devlink_nl_pre_doit_port_optional,
1173 		.doit		= devlink_nl_health_reporter_test_doit,
1174 		.post_doit	= devlink_nl_post_doit,
1175 		.policy		= devlink_health_reporter_test_nl_policy,
1176 		.maxattr	= DEVLINK_ATTR_HEALTH_REPORTER_NAME,
1177 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1178 	},
1179 	{
1180 		.cmd		= DEVLINK_CMD_RATE_GET,
1181 		.validate	= GENL_DONT_VALIDATE_STRICT,
1182 		.pre_doit	= devlink_nl_pre_doit,
1183 		.doit		= devlink_nl_rate_get_doit,
1184 		.post_doit	= devlink_nl_post_doit,
1185 		.policy		= devlink_rate_get_do_nl_policy,
1186 		.maxattr	= DEVLINK_ATTR_RATE_NODE_NAME,
1187 		.flags		= GENL_CMD_CAP_DO,
1188 	},
1189 	{
1190 		.cmd		= DEVLINK_CMD_RATE_GET,
1191 		.dumpit		= devlink_nl_rate_get_dumpit,
1192 		.policy		= devlink_rate_get_dump_nl_policy,
1193 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
1194 		.flags		= GENL_CMD_CAP_DUMP,
1195 	},
1196 	{
1197 		.cmd		= DEVLINK_CMD_RATE_SET,
1198 		.validate	= GENL_DONT_VALIDATE_STRICT,
1199 		.pre_doit	= devlink_nl_pre_doit,
1200 		.doit		= devlink_nl_rate_set_doit,
1201 		.post_doit	= devlink_nl_post_doit,
1202 		.policy		= devlink_rate_set_nl_policy,
1203 		.maxattr	= DEVLINK_ATTR_RATE_TC_BWS,
1204 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1205 	},
1206 	{
1207 		.cmd		= DEVLINK_CMD_RATE_NEW,
1208 		.validate	= GENL_DONT_VALIDATE_STRICT,
1209 		.pre_doit	= devlink_nl_pre_doit,
1210 		.doit		= devlink_nl_rate_new_doit,
1211 		.post_doit	= devlink_nl_post_doit,
1212 		.policy		= devlink_rate_new_nl_policy,
1213 		.maxattr	= DEVLINK_ATTR_RATE_TC_BWS,
1214 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1215 	},
1216 	{
1217 		.cmd		= DEVLINK_CMD_RATE_DEL,
1218 		.validate	= GENL_DONT_VALIDATE_STRICT,
1219 		.pre_doit	= devlink_nl_pre_doit,
1220 		.doit		= devlink_nl_rate_del_doit,
1221 		.post_doit	= devlink_nl_post_doit,
1222 		.policy		= devlink_rate_del_nl_policy,
1223 		.maxattr	= DEVLINK_ATTR_RATE_NODE_NAME,
1224 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1225 	},
1226 	{
1227 		.cmd		= DEVLINK_CMD_LINECARD_GET,
1228 		.validate	= GENL_DONT_VALIDATE_STRICT,
1229 		.pre_doit	= devlink_nl_pre_doit,
1230 		.doit		= devlink_nl_linecard_get_doit,
1231 		.post_doit	= devlink_nl_post_doit,
1232 		.policy		= devlink_linecard_get_do_nl_policy,
1233 		.maxattr	= DEVLINK_ATTR_LINECARD_INDEX,
1234 		.flags		= GENL_CMD_CAP_DO,
1235 	},
1236 	{
1237 		.cmd		= DEVLINK_CMD_LINECARD_GET,
1238 		.dumpit		= devlink_nl_linecard_get_dumpit,
1239 		.policy		= devlink_linecard_get_dump_nl_policy,
1240 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
1241 		.flags		= GENL_CMD_CAP_DUMP,
1242 	},
1243 	{
1244 		.cmd		= DEVLINK_CMD_LINECARD_SET,
1245 		.validate	= GENL_DONT_VALIDATE_STRICT,
1246 		.pre_doit	= devlink_nl_pre_doit,
1247 		.doit		= devlink_nl_linecard_set_doit,
1248 		.post_doit	= devlink_nl_post_doit,
1249 		.policy		= devlink_linecard_set_nl_policy,
1250 		.maxattr	= DEVLINK_ATTR_LINECARD_TYPE,
1251 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1252 	},
1253 	{
1254 		.cmd		= DEVLINK_CMD_SELFTESTS_GET,
1255 		.validate	= GENL_DONT_VALIDATE_STRICT,
1256 		.pre_doit	= devlink_nl_pre_doit,
1257 		.doit		= devlink_nl_selftests_get_doit,
1258 		.post_doit	= devlink_nl_post_doit,
1259 		.policy		= devlink_selftests_get_nl_policy,
1260 		.maxattr	= DEVLINK_ATTR_DEV_NAME,
1261 		.flags		= GENL_CMD_CAP_DO,
1262 	},
1263 	{
1264 		.cmd		= DEVLINK_CMD_SELFTESTS_GET,
1265 		.validate	= GENL_DONT_VALIDATE_DUMP,
1266 		.dumpit		= devlink_nl_selftests_get_dumpit,
1267 		.flags		= GENL_CMD_CAP_DUMP,
1268 	},
1269 	{
1270 		.cmd		= DEVLINK_CMD_SELFTESTS_RUN,
1271 		.validate	= GENL_DONT_VALIDATE_STRICT,
1272 		.pre_doit	= devlink_nl_pre_doit,
1273 		.doit		= devlink_nl_selftests_run_doit,
1274 		.post_doit	= devlink_nl_post_doit,
1275 		.policy		= devlink_selftests_run_nl_policy,
1276 		.maxattr	= DEVLINK_ATTR_SELFTESTS,
1277 		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1278 	},
1279 	{
1280 		.cmd		= DEVLINK_CMD_NOTIFY_FILTER_SET,
1281 		.doit		= devlink_nl_notify_filter_set_doit,
1282 		.policy		= devlink_notify_filter_set_nl_policy,
1283 		.maxattr	= DEVLINK_ATTR_PORT_INDEX,
1284 		.flags		= GENL_CMD_CAP_DO,
1285 	},
1286 };
1287