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