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