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