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