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