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
devlink_attr_param_type_validate(const struct nlattr * attr,struct netlink_ext_ack * extack)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_nl_policy[DEVLINK_PORT_FN_ATTR_CAPS + 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_OPSTATE] = NLA_POLICY_MAX(NLA_U8, 1),
59 [DEVLINK_PORT_FN_ATTR_CAPS] = NLA_POLICY_BITFIELD32(15),
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_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(6),
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_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
622 [DEVLINK_ATTR_RATE_TX_SHARE] = { .type = NLA_U64, },
623 [DEVLINK_ATTR_RATE_TX_MAX] = { .type = NLA_U64, },
624 [DEVLINK_ATTR_RATE_TX_PRIORITY] = { .type = NLA_U32, },
625 [DEVLINK_ATTR_RATE_TX_WEIGHT] = { .type = NLA_U32, },
626 [DEVLINK_ATTR_RATE_PARENT_NODE_NAME] = { .type = NLA_NUL_STRING, },
627 [DEVLINK_ATTR_RATE_TC_BWS] = NLA_POLICY_NESTED(devlink_dl_rate_tc_bws_nl_policy),
628 [DEVLINK_ATTR_PARENT_DEV] = NLA_POLICY_NESTED(devlink_dl_parent_dev_nl_policy),
629 };
630
631 /* DEVLINK_CMD_RATE_NEW - do */
632 static const struct nla_policy devlink_rate_new_nl_policy[DEVLINK_ATTR_PARENT_DEV + 1] = {
633 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
634 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
635 [DEVLINK_ATTR_INDEX] = NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_index_range),
636 [DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
637 [DEVLINK_ATTR_RATE_TX_SHARE] = { .type = NLA_U64, },
638 [DEVLINK_ATTR_RATE_TX_MAX] = { .type = NLA_U64, },
639 [DEVLINK_ATTR_RATE_TX_PRIORITY] = { .type = NLA_U32, },
640 [DEVLINK_ATTR_RATE_TX_WEIGHT] = { .type = NLA_U32, },
641 [DEVLINK_ATTR_RATE_PARENT_NODE_NAME] = { .type = NLA_NUL_STRING, },
642 [DEVLINK_ATTR_RATE_TC_BWS] = NLA_POLICY_NESTED(devlink_dl_rate_tc_bws_nl_policy),
643 [DEVLINK_ATTR_PARENT_DEV] = NLA_POLICY_NESTED(devlink_dl_parent_dev_nl_policy),
644 };
645
646 /* DEVLINK_CMD_RATE_DEL - do */
647 static const struct nla_policy devlink_rate_del_nl_policy[DEVLINK_ATTR_INDEX + 1] = {
648 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
649 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
650 [DEVLINK_ATTR_INDEX] = NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_index_range),
651 [DEVLINK_ATTR_RATE_NODE_NAME] = { .type = NLA_NUL_STRING, },
652 };
653
654 /* DEVLINK_CMD_LINECARD_GET - do */
655 static const struct nla_policy devlink_linecard_get_do_nl_policy[DEVLINK_ATTR_INDEX + 1] = {
656 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
657 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
658 [DEVLINK_ATTR_INDEX] = NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_index_range),
659 [DEVLINK_ATTR_LINECARD_INDEX] = { .type = NLA_U32, },
660 };
661
662 /* DEVLINK_CMD_LINECARD_GET - dump */
663 static const struct nla_policy devlink_linecard_get_dump_nl_policy[DEVLINK_ATTR_INDEX + 1] = {
664 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
665 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
666 [DEVLINK_ATTR_INDEX] = NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_index_range),
667 };
668
669 /* DEVLINK_CMD_LINECARD_SET - do */
670 static const struct nla_policy devlink_linecard_set_nl_policy[DEVLINK_ATTR_INDEX + 1] = {
671 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
672 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
673 [DEVLINK_ATTR_INDEX] = NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_index_range),
674 [DEVLINK_ATTR_LINECARD_INDEX] = { .type = NLA_U32, },
675 [DEVLINK_ATTR_LINECARD_TYPE] = { .type = NLA_NUL_STRING, },
676 };
677
678 /* DEVLINK_CMD_SELFTESTS_GET - do */
679 static const struct nla_policy devlink_selftests_get_nl_policy[DEVLINK_ATTR_INDEX + 1] = {
680 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
681 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
682 [DEVLINK_ATTR_INDEX] = NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_index_range),
683 };
684
685 /* DEVLINK_CMD_SELFTESTS_RUN - do */
686 static const struct nla_policy devlink_selftests_run_nl_policy[DEVLINK_ATTR_INDEX + 1] = {
687 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
688 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
689 [DEVLINK_ATTR_INDEX] = NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_index_range),
690 [DEVLINK_ATTR_SELFTESTS] = NLA_POLICY_NESTED(devlink_dl_selftest_id_nl_policy),
691 };
692
693 /* DEVLINK_CMD_NOTIFY_FILTER_SET - do */
694 static const struct nla_policy devlink_notify_filter_set_nl_policy[DEVLINK_ATTR_INDEX + 1] = {
695 [DEVLINK_ATTR_BUS_NAME] = { .type = NLA_NUL_STRING, },
696 [DEVLINK_ATTR_DEV_NAME] = { .type = NLA_NUL_STRING, },
697 [DEVLINK_ATTR_INDEX] = NLA_POLICY_FULL_RANGE(NLA_UINT, &devlink_attr_index_range),
698 [DEVLINK_ATTR_PORT_INDEX] = { .type = NLA_U32, },
699 };
700
701 /* Ops table for devlink */
702 const struct genl_split_ops devlink_nl_ops[75] = {
703 {
704 .cmd = DEVLINK_CMD_GET,
705 .validate = GENL_DONT_VALIDATE_STRICT,
706 .pre_doit = devlink_nl_pre_doit,
707 .doit = devlink_nl_get_doit,
708 .post_doit = devlink_nl_post_doit,
709 .policy = devlink_get_nl_policy,
710 .maxattr = DEVLINK_ATTR_INDEX,
711 .flags = GENL_CMD_CAP_DO,
712 },
713 {
714 .cmd = DEVLINK_CMD_GET,
715 .validate = GENL_DONT_VALIDATE_DUMP,
716 .dumpit = devlink_nl_get_dumpit,
717 .flags = GENL_CMD_CAP_DUMP,
718 },
719 {
720 .cmd = DEVLINK_CMD_PORT_GET,
721 .validate = GENL_DONT_VALIDATE_STRICT,
722 .pre_doit = devlink_nl_pre_doit_port,
723 .doit = devlink_nl_port_get_doit,
724 .post_doit = devlink_nl_post_doit,
725 .policy = devlink_port_get_do_nl_policy,
726 .maxattr = DEVLINK_ATTR_INDEX,
727 .flags = GENL_CMD_CAP_DO,
728 },
729 {
730 .cmd = DEVLINK_CMD_PORT_GET,
731 .dumpit = devlink_nl_port_get_dumpit,
732 .policy = devlink_port_get_dump_nl_policy,
733 .maxattr = DEVLINK_ATTR_INDEX,
734 .flags = GENL_CMD_CAP_DUMP,
735 },
736 {
737 .cmd = DEVLINK_CMD_PORT_SET,
738 .validate = GENL_DONT_VALIDATE_STRICT,
739 .pre_doit = devlink_nl_pre_doit_port,
740 .doit = devlink_nl_port_set_doit,
741 .post_doit = devlink_nl_post_doit,
742 .policy = devlink_port_set_nl_policy,
743 .maxattr = DEVLINK_ATTR_INDEX,
744 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
745 },
746 {
747 .cmd = DEVLINK_CMD_PORT_NEW,
748 .validate = GENL_DONT_VALIDATE_STRICT,
749 .pre_doit = devlink_nl_pre_doit,
750 .doit = devlink_nl_port_new_doit,
751 .post_doit = devlink_nl_post_doit,
752 .policy = devlink_port_new_nl_policy,
753 .maxattr = DEVLINK_ATTR_INDEX,
754 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
755 },
756 {
757 .cmd = DEVLINK_CMD_PORT_DEL,
758 .validate = GENL_DONT_VALIDATE_STRICT,
759 .pre_doit = devlink_nl_pre_doit_port,
760 .doit = devlink_nl_port_del_doit,
761 .post_doit = devlink_nl_post_doit,
762 .policy = devlink_port_del_nl_policy,
763 .maxattr = DEVLINK_ATTR_INDEX,
764 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
765 },
766 {
767 .cmd = DEVLINK_CMD_PORT_SPLIT,
768 .validate = GENL_DONT_VALIDATE_STRICT,
769 .pre_doit = devlink_nl_pre_doit_port,
770 .doit = devlink_nl_port_split_doit,
771 .post_doit = devlink_nl_post_doit,
772 .policy = devlink_port_split_nl_policy,
773 .maxattr = DEVLINK_ATTR_INDEX,
774 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
775 },
776 {
777 .cmd = DEVLINK_CMD_PORT_UNSPLIT,
778 .validate = GENL_DONT_VALIDATE_STRICT,
779 .pre_doit = devlink_nl_pre_doit_port,
780 .doit = devlink_nl_port_unsplit_doit,
781 .post_doit = devlink_nl_post_doit,
782 .policy = devlink_port_unsplit_nl_policy,
783 .maxattr = DEVLINK_ATTR_INDEX,
784 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
785 },
786 {
787 .cmd = DEVLINK_CMD_SB_GET,
788 .validate = GENL_DONT_VALIDATE_STRICT,
789 .pre_doit = devlink_nl_pre_doit,
790 .doit = devlink_nl_sb_get_doit,
791 .post_doit = devlink_nl_post_doit,
792 .policy = devlink_sb_get_do_nl_policy,
793 .maxattr = DEVLINK_ATTR_INDEX,
794 .flags = GENL_CMD_CAP_DO,
795 },
796 {
797 .cmd = DEVLINK_CMD_SB_GET,
798 .dumpit = devlink_nl_sb_get_dumpit,
799 .policy = devlink_sb_get_dump_nl_policy,
800 .maxattr = DEVLINK_ATTR_INDEX,
801 .flags = GENL_CMD_CAP_DUMP,
802 },
803 {
804 .cmd = DEVLINK_CMD_SB_POOL_GET,
805 .validate = GENL_DONT_VALIDATE_STRICT,
806 .pre_doit = devlink_nl_pre_doit,
807 .doit = devlink_nl_sb_pool_get_doit,
808 .post_doit = devlink_nl_post_doit,
809 .policy = devlink_sb_pool_get_do_nl_policy,
810 .maxattr = DEVLINK_ATTR_INDEX,
811 .flags = GENL_CMD_CAP_DO,
812 },
813 {
814 .cmd = DEVLINK_CMD_SB_POOL_GET,
815 .dumpit = devlink_nl_sb_pool_get_dumpit,
816 .policy = devlink_sb_pool_get_dump_nl_policy,
817 .maxattr = DEVLINK_ATTR_INDEX,
818 .flags = GENL_CMD_CAP_DUMP,
819 },
820 {
821 .cmd = DEVLINK_CMD_SB_POOL_SET,
822 .validate = GENL_DONT_VALIDATE_STRICT,
823 .pre_doit = devlink_nl_pre_doit,
824 .doit = devlink_nl_sb_pool_set_doit,
825 .post_doit = devlink_nl_post_doit,
826 .policy = devlink_sb_pool_set_nl_policy,
827 .maxattr = DEVLINK_ATTR_INDEX,
828 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
829 },
830 {
831 .cmd = DEVLINK_CMD_SB_PORT_POOL_GET,
832 .validate = GENL_DONT_VALIDATE_STRICT,
833 .pre_doit = devlink_nl_pre_doit_port,
834 .doit = devlink_nl_sb_port_pool_get_doit,
835 .post_doit = devlink_nl_post_doit,
836 .policy = devlink_sb_port_pool_get_do_nl_policy,
837 .maxattr = DEVLINK_ATTR_INDEX,
838 .flags = GENL_CMD_CAP_DO,
839 },
840 {
841 .cmd = DEVLINK_CMD_SB_PORT_POOL_GET,
842 .dumpit = devlink_nl_sb_port_pool_get_dumpit,
843 .policy = devlink_sb_port_pool_get_dump_nl_policy,
844 .maxattr = DEVLINK_ATTR_INDEX,
845 .flags = GENL_CMD_CAP_DUMP,
846 },
847 {
848 .cmd = DEVLINK_CMD_SB_PORT_POOL_SET,
849 .validate = GENL_DONT_VALIDATE_STRICT,
850 .pre_doit = devlink_nl_pre_doit_port,
851 .doit = devlink_nl_sb_port_pool_set_doit,
852 .post_doit = devlink_nl_post_doit,
853 .policy = devlink_sb_port_pool_set_nl_policy,
854 .maxattr = DEVLINK_ATTR_INDEX,
855 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
856 },
857 {
858 .cmd = DEVLINK_CMD_SB_TC_POOL_BIND_GET,
859 .validate = GENL_DONT_VALIDATE_STRICT,
860 .pre_doit = devlink_nl_pre_doit_port,
861 .doit = devlink_nl_sb_tc_pool_bind_get_doit,
862 .post_doit = devlink_nl_post_doit,
863 .policy = devlink_sb_tc_pool_bind_get_do_nl_policy,
864 .maxattr = DEVLINK_ATTR_INDEX,
865 .flags = GENL_CMD_CAP_DO,
866 },
867 {
868 .cmd = DEVLINK_CMD_SB_TC_POOL_BIND_GET,
869 .dumpit = devlink_nl_sb_tc_pool_bind_get_dumpit,
870 .policy = devlink_sb_tc_pool_bind_get_dump_nl_policy,
871 .maxattr = DEVLINK_ATTR_INDEX,
872 .flags = GENL_CMD_CAP_DUMP,
873 },
874 {
875 .cmd = DEVLINK_CMD_SB_TC_POOL_BIND_SET,
876 .validate = GENL_DONT_VALIDATE_STRICT,
877 .pre_doit = devlink_nl_pre_doit_port,
878 .doit = devlink_nl_sb_tc_pool_bind_set_doit,
879 .post_doit = devlink_nl_post_doit,
880 .policy = devlink_sb_tc_pool_bind_set_nl_policy,
881 .maxattr = DEVLINK_ATTR_INDEX,
882 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
883 },
884 {
885 .cmd = DEVLINK_CMD_SB_OCC_SNAPSHOT,
886 .validate = GENL_DONT_VALIDATE_STRICT,
887 .pre_doit = devlink_nl_pre_doit,
888 .doit = devlink_nl_sb_occ_snapshot_doit,
889 .post_doit = devlink_nl_post_doit,
890 .policy = devlink_sb_occ_snapshot_nl_policy,
891 .maxattr = DEVLINK_ATTR_INDEX,
892 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
893 },
894 {
895 .cmd = DEVLINK_CMD_SB_OCC_MAX_CLEAR,
896 .validate = GENL_DONT_VALIDATE_STRICT,
897 .pre_doit = devlink_nl_pre_doit,
898 .doit = devlink_nl_sb_occ_max_clear_doit,
899 .post_doit = devlink_nl_post_doit,
900 .policy = devlink_sb_occ_max_clear_nl_policy,
901 .maxattr = DEVLINK_ATTR_INDEX,
902 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
903 },
904 {
905 .cmd = DEVLINK_CMD_ESWITCH_GET,
906 .validate = GENL_DONT_VALIDATE_STRICT,
907 .pre_doit = devlink_nl_pre_doit,
908 .doit = devlink_nl_eswitch_get_doit,
909 .post_doit = devlink_nl_post_doit,
910 .policy = devlink_eswitch_get_nl_policy,
911 .maxattr = DEVLINK_ATTR_INDEX,
912 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
913 },
914 {
915 .cmd = DEVLINK_CMD_ESWITCH_SET,
916 .validate = GENL_DONT_VALIDATE_STRICT,
917 .pre_doit = devlink_nl_pre_doit,
918 .doit = devlink_nl_eswitch_set_doit,
919 .post_doit = devlink_nl_post_doit,
920 .policy = devlink_eswitch_set_nl_policy,
921 .maxattr = DEVLINK_ATTR_INDEX,
922 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
923 },
924 {
925 .cmd = DEVLINK_CMD_DPIPE_TABLE_GET,
926 .validate = GENL_DONT_VALIDATE_STRICT,
927 .pre_doit = devlink_nl_pre_doit,
928 .doit = devlink_nl_dpipe_table_get_doit,
929 .post_doit = devlink_nl_post_doit,
930 .policy = devlink_dpipe_table_get_nl_policy,
931 .maxattr = DEVLINK_ATTR_INDEX,
932 .flags = GENL_CMD_CAP_DO,
933 },
934 {
935 .cmd = DEVLINK_CMD_DPIPE_ENTRIES_GET,
936 .validate = GENL_DONT_VALIDATE_STRICT,
937 .pre_doit = devlink_nl_pre_doit,
938 .doit = devlink_nl_dpipe_entries_get_doit,
939 .post_doit = devlink_nl_post_doit,
940 .policy = devlink_dpipe_entries_get_nl_policy,
941 .maxattr = DEVLINK_ATTR_INDEX,
942 .flags = GENL_CMD_CAP_DO,
943 },
944 {
945 .cmd = DEVLINK_CMD_DPIPE_HEADERS_GET,
946 .validate = GENL_DONT_VALIDATE_STRICT,
947 .pre_doit = devlink_nl_pre_doit,
948 .doit = devlink_nl_dpipe_headers_get_doit,
949 .post_doit = devlink_nl_post_doit,
950 .policy = devlink_dpipe_headers_get_nl_policy,
951 .maxattr = DEVLINK_ATTR_INDEX,
952 .flags = GENL_CMD_CAP_DO,
953 },
954 {
955 .cmd = DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
956 .validate = GENL_DONT_VALIDATE_STRICT,
957 .pre_doit = devlink_nl_pre_doit,
958 .doit = devlink_nl_dpipe_table_counters_set_doit,
959 .post_doit = devlink_nl_post_doit,
960 .policy = devlink_dpipe_table_counters_set_nl_policy,
961 .maxattr = DEVLINK_ATTR_INDEX,
962 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
963 },
964 {
965 .cmd = DEVLINK_CMD_RESOURCE_SET,
966 .validate = GENL_DONT_VALIDATE_STRICT,
967 .pre_doit = devlink_nl_pre_doit,
968 .doit = devlink_nl_resource_set_doit,
969 .post_doit = devlink_nl_post_doit,
970 .policy = devlink_resource_set_nl_policy,
971 .maxattr = DEVLINK_ATTR_INDEX,
972 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
973 },
974 {
975 .cmd = DEVLINK_CMD_RESOURCE_DUMP,
976 .validate = GENL_DONT_VALIDATE_STRICT,
977 .pre_doit = devlink_nl_pre_doit_port_optional,
978 .doit = devlink_nl_resource_dump_doit,
979 .post_doit = devlink_nl_post_doit,
980 .policy = devlink_resource_dump_do_nl_policy,
981 .maxattr = DEVLINK_ATTR_INDEX,
982 .flags = GENL_CMD_CAP_DO,
983 },
984 {
985 .cmd = DEVLINK_CMD_RESOURCE_DUMP,
986 .dumpit = devlink_nl_resource_dump_dumpit,
987 .policy = devlink_resource_dump_dump_nl_policy,
988 .maxattr = DEVLINK_ATTR_RESOURCE_SCOPE_MASK,
989 .flags = GENL_CMD_CAP_DUMP,
990 },
991 {
992 .cmd = DEVLINK_CMD_RELOAD,
993 .validate = GENL_DONT_VALIDATE_STRICT,
994 .pre_doit = devlink_nl_pre_doit_dev_lock,
995 .doit = devlink_nl_reload_doit,
996 .post_doit = devlink_nl_post_doit_dev_lock,
997 .policy = devlink_reload_nl_policy,
998 .maxattr = DEVLINK_ATTR_INDEX,
999 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1000 },
1001 {
1002 .cmd = DEVLINK_CMD_PARAM_GET,
1003 .validate = GENL_DONT_VALIDATE_STRICT,
1004 .pre_doit = devlink_nl_pre_doit,
1005 .doit = devlink_nl_param_get_doit,
1006 .post_doit = devlink_nl_post_doit,
1007 .policy = devlink_param_get_do_nl_policy,
1008 .maxattr = DEVLINK_ATTR_INDEX,
1009 .flags = GENL_CMD_CAP_DO,
1010 },
1011 {
1012 .cmd = DEVLINK_CMD_PARAM_GET,
1013 .dumpit = devlink_nl_param_get_dumpit,
1014 .policy = devlink_param_get_dump_nl_policy,
1015 .maxattr = DEVLINK_ATTR_INDEX,
1016 .flags = GENL_CMD_CAP_DUMP,
1017 },
1018 {
1019 .cmd = DEVLINK_CMD_PARAM_SET,
1020 .validate = GENL_DONT_VALIDATE_STRICT,
1021 .pre_doit = devlink_nl_pre_doit,
1022 .doit = devlink_nl_param_set_doit,
1023 .post_doit = devlink_nl_post_doit,
1024 .policy = devlink_param_set_nl_policy,
1025 .maxattr = DEVLINK_ATTR_INDEX,
1026 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1027 },
1028 {
1029 .cmd = DEVLINK_CMD_REGION_GET,
1030 .validate = GENL_DONT_VALIDATE_STRICT,
1031 .pre_doit = devlink_nl_pre_doit_port_optional,
1032 .doit = devlink_nl_region_get_doit,
1033 .post_doit = devlink_nl_post_doit,
1034 .policy = devlink_region_get_do_nl_policy,
1035 .maxattr = DEVLINK_ATTR_INDEX,
1036 .flags = GENL_CMD_CAP_DO,
1037 },
1038 {
1039 .cmd = DEVLINK_CMD_REGION_GET,
1040 .dumpit = devlink_nl_region_get_dumpit,
1041 .policy = devlink_region_get_dump_nl_policy,
1042 .maxattr = DEVLINK_ATTR_INDEX,
1043 .flags = GENL_CMD_CAP_DUMP,
1044 },
1045 {
1046 .cmd = DEVLINK_CMD_REGION_NEW,
1047 .validate = GENL_DONT_VALIDATE_STRICT,
1048 .pre_doit = devlink_nl_pre_doit_port_optional,
1049 .doit = devlink_nl_region_new_doit,
1050 .post_doit = devlink_nl_post_doit,
1051 .policy = devlink_region_new_nl_policy,
1052 .maxattr = DEVLINK_ATTR_INDEX,
1053 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1054 },
1055 {
1056 .cmd = DEVLINK_CMD_REGION_DEL,
1057 .validate = GENL_DONT_VALIDATE_STRICT,
1058 .pre_doit = devlink_nl_pre_doit_port_optional,
1059 .doit = devlink_nl_region_del_doit,
1060 .post_doit = devlink_nl_post_doit,
1061 .policy = devlink_region_del_nl_policy,
1062 .maxattr = DEVLINK_ATTR_INDEX,
1063 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1064 },
1065 {
1066 .cmd = DEVLINK_CMD_REGION_READ,
1067 .validate = GENL_DONT_VALIDATE_DUMP_STRICT,
1068 .dumpit = devlink_nl_region_read_dumpit,
1069 .policy = devlink_region_read_nl_policy,
1070 .maxattr = DEVLINK_ATTR_INDEX,
1071 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DUMP,
1072 },
1073 {
1074 .cmd = DEVLINK_CMD_PORT_PARAM_GET,
1075 .validate = GENL_DONT_VALIDATE_STRICT,
1076 .pre_doit = devlink_nl_pre_doit_port,
1077 .doit = devlink_nl_port_param_get_doit,
1078 .post_doit = devlink_nl_post_doit,
1079 .policy = devlink_port_param_get_nl_policy,
1080 .maxattr = DEVLINK_ATTR_INDEX,
1081 .flags = GENL_CMD_CAP_DO,
1082 },
1083 {
1084 .cmd = DEVLINK_CMD_PORT_PARAM_GET,
1085 .validate = GENL_DONT_VALIDATE_DUMP_STRICT,
1086 .dumpit = devlink_nl_port_param_get_dumpit,
1087 .flags = GENL_CMD_CAP_DUMP,
1088 },
1089 {
1090 .cmd = DEVLINK_CMD_PORT_PARAM_SET,
1091 .validate = GENL_DONT_VALIDATE_STRICT,
1092 .pre_doit = devlink_nl_pre_doit_port,
1093 .doit = devlink_nl_port_param_set_doit,
1094 .post_doit = devlink_nl_post_doit,
1095 .policy = devlink_port_param_set_nl_policy,
1096 .maxattr = DEVLINK_ATTR_INDEX,
1097 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1098 },
1099 {
1100 .cmd = DEVLINK_CMD_INFO_GET,
1101 .validate = GENL_DONT_VALIDATE_STRICT,
1102 .pre_doit = devlink_nl_pre_doit,
1103 .doit = devlink_nl_info_get_doit,
1104 .post_doit = devlink_nl_post_doit,
1105 .policy = devlink_info_get_nl_policy,
1106 .maxattr = DEVLINK_ATTR_INDEX,
1107 .flags = GENL_CMD_CAP_DO,
1108 },
1109 {
1110 .cmd = DEVLINK_CMD_INFO_GET,
1111 .validate = GENL_DONT_VALIDATE_DUMP,
1112 .dumpit = devlink_nl_info_get_dumpit,
1113 .flags = GENL_CMD_CAP_DUMP,
1114 },
1115 {
1116 .cmd = DEVLINK_CMD_HEALTH_REPORTER_GET,
1117 .validate = GENL_DONT_VALIDATE_STRICT,
1118 .pre_doit = devlink_nl_pre_doit_port_optional,
1119 .doit = devlink_nl_health_reporter_get_doit,
1120 .post_doit = devlink_nl_post_doit,
1121 .policy = devlink_health_reporter_get_do_nl_policy,
1122 .maxattr = DEVLINK_ATTR_INDEX,
1123 .flags = GENL_CMD_CAP_DO,
1124 },
1125 {
1126 .cmd = DEVLINK_CMD_HEALTH_REPORTER_GET,
1127 .dumpit = devlink_nl_health_reporter_get_dumpit,
1128 .policy = devlink_health_reporter_get_dump_nl_policy,
1129 .maxattr = DEVLINK_ATTR_INDEX,
1130 .flags = GENL_CMD_CAP_DUMP,
1131 },
1132 {
1133 .cmd = DEVLINK_CMD_HEALTH_REPORTER_SET,
1134 .validate = GENL_DONT_VALIDATE_STRICT,
1135 .pre_doit = devlink_nl_pre_doit_port_optional,
1136 .doit = devlink_nl_health_reporter_set_doit,
1137 .post_doit = devlink_nl_post_doit,
1138 .policy = devlink_health_reporter_set_nl_policy,
1139 .maxattr = DEVLINK_ATTR_INDEX,
1140 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1141 },
1142 {
1143 .cmd = DEVLINK_CMD_HEALTH_REPORTER_RECOVER,
1144 .validate = GENL_DONT_VALIDATE_STRICT,
1145 .pre_doit = devlink_nl_pre_doit_port_optional,
1146 .doit = devlink_nl_health_reporter_recover_doit,
1147 .post_doit = devlink_nl_post_doit,
1148 .policy = devlink_health_reporter_recover_nl_policy,
1149 .maxattr = DEVLINK_ATTR_INDEX,
1150 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1151 },
1152 {
1153 .cmd = DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE,
1154 .validate = GENL_DONT_VALIDATE_STRICT,
1155 .pre_doit = devlink_nl_pre_doit_port_optional,
1156 .doit = devlink_nl_health_reporter_diagnose_doit,
1157 .post_doit = devlink_nl_post_doit,
1158 .policy = devlink_health_reporter_diagnose_nl_policy,
1159 .maxattr = DEVLINK_ATTR_INDEX,
1160 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1161 },
1162 {
1163 .cmd = DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET,
1164 .validate = GENL_DONT_VALIDATE_DUMP_STRICT,
1165 .dumpit = devlink_nl_health_reporter_dump_get_dumpit,
1166 .policy = devlink_health_reporter_dump_get_nl_policy,
1167 .maxattr = DEVLINK_ATTR_INDEX,
1168 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DUMP,
1169 },
1170 {
1171 .cmd = DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR,
1172 .validate = GENL_DONT_VALIDATE_STRICT,
1173 .pre_doit = devlink_nl_pre_doit_port_optional,
1174 .doit = devlink_nl_health_reporter_dump_clear_doit,
1175 .post_doit = devlink_nl_post_doit,
1176 .policy = devlink_health_reporter_dump_clear_nl_policy,
1177 .maxattr = DEVLINK_ATTR_INDEX,
1178 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1179 },
1180 {
1181 .cmd = DEVLINK_CMD_FLASH_UPDATE,
1182 .validate = GENL_DONT_VALIDATE_STRICT,
1183 .pre_doit = devlink_nl_pre_doit,
1184 .doit = devlink_nl_flash_update_doit,
1185 .post_doit = devlink_nl_post_doit,
1186 .policy = devlink_flash_update_nl_policy,
1187 .maxattr = DEVLINK_ATTR_INDEX,
1188 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1189 },
1190 {
1191 .cmd = DEVLINK_CMD_TRAP_GET,
1192 .validate = GENL_DONT_VALIDATE_STRICT,
1193 .pre_doit = devlink_nl_pre_doit,
1194 .doit = devlink_nl_trap_get_doit,
1195 .post_doit = devlink_nl_post_doit,
1196 .policy = devlink_trap_get_do_nl_policy,
1197 .maxattr = DEVLINK_ATTR_INDEX,
1198 .flags = GENL_CMD_CAP_DO,
1199 },
1200 {
1201 .cmd = DEVLINK_CMD_TRAP_GET,
1202 .dumpit = devlink_nl_trap_get_dumpit,
1203 .policy = devlink_trap_get_dump_nl_policy,
1204 .maxattr = DEVLINK_ATTR_INDEX,
1205 .flags = GENL_CMD_CAP_DUMP,
1206 },
1207 {
1208 .cmd = DEVLINK_CMD_TRAP_SET,
1209 .validate = GENL_DONT_VALIDATE_STRICT,
1210 .pre_doit = devlink_nl_pre_doit,
1211 .doit = devlink_nl_trap_set_doit,
1212 .post_doit = devlink_nl_post_doit,
1213 .policy = devlink_trap_set_nl_policy,
1214 .maxattr = DEVLINK_ATTR_INDEX,
1215 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1216 },
1217 {
1218 .cmd = DEVLINK_CMD_TRAP_GROUP_GET,
1219 .validate = GENL_DONT_VALIDATE_STRICT,
1220 .pre_doit = devlink_nl_pre_doit,
1221 .doit = devlink_nl_trap_group_get_doit,
1222 .post_doit = devlink_nl_post_doit,
1223 .policy = devlink_trap_group_get_do_nl_policy,
1224 .maxattr = DEVLINK_ATTR_INDEX,
1225 .flags = GENL_CMD_CAP_DO,
1226 },
1227 {
1228 .cmd = DEVLINK_CMD_TRAP_GROUP_GET,
1229 .dumpit = devlink_nl_trap_group_get_dumpit,
1230 .policy = devlink_trap_group_get_dump_nl_policy,
1231 .maxattr = DEVLINK_ATTR_INDEX,
1232 .flags = GENL_CMD_CAP_DUMP,
1233 },
1234 {
1235 .cmd = DEVLINK_CMD_TRAP_GROUP_SET,
1236 .validate = GENL_DONT_VALIDATE_STRICT,
1237 .pre_doit = devlink_nl_pre_doit,
1238 .doit = devlink_nl_trap_group_set_doit,
1239 .post_doit = devlink_nl_post_doit,
1240 .policy = devlink_trap_group_set_nl_policy,
1241 .maxattr = DEVLINK_ATTR_INDEX,
1242 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1243 },
1244 {
1245 .cmd = DEVLINK_CMD_TRAP_POLICER_GET,
1246 .validate = GENL_DONT_VALIDATE_STRICT,
1247 .pre_doit = devlink_nl_pre_doit,
1248 .doit = devlink_nl_trap_policer_get_doit,
1249 .post_doit = devlink_nl_post_doit,
1250 .policy = devlink_trap_policer_get_do_nl_policy,
1251 .maxattr = DEVLINK_ATTR_INDEX,
1252 .flags = GENL_CMD_CAP_DO,
1253 },
1254 {
1255 .cmd = DEVLINK_CMD_TRAP_POLICER_GET,
1256 .dumpit = devlink_nl_trap_policer_get_dumpit,
1257 .policy = devlink_trap_policer_get_dump_nl_policy,
1258 .maxattr = DEVLINK_ATTR_INDEX,
1259 .flags = GENL_CMD_CAP_DUMP,
1260 },
1261 {
1262 .cmd = DEVLINK_CMD_TRAP_POLICER_SET,
1263 .validate = GENL_DONT_VALIDATE_STRICT,
1264 .pre_doit = devlink_nl_pre_doit,
1265 .doit = devlink_nl_trap_policer_set_doit,
1266 .post_doit = devlink_nl_post_doit,
1267 .policy = devlink_trap_policer_set_nl_policy,
1268 .maxattr = DEVLINK_ATTR_INDEX,
1269 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1270 },
1271 {
1272 .cmd = DEVLINK_CMD_HEALTH_REPORTER_TEST,
1273 .validate = GENL_DONT_VALIDATE_STRICT,
1274 .pre_doit = devlink_nl_pre_doit_port_optional,
1275 .doit = devlink_nl_health_reporter_test_doit,
1276 .post_doit = devlink_nl_post_doit,
1277 .policy = devlink_health_reporter_test_nl_policy,
1278 .maxattr = DEVLINK_ATTR_INDEX,
1279 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1280 },
1281 {
1282 .cmd = DEVLINK_CMD_RATE_GET,
1283 .validate = GENL_DONT_VALIDATE_STRICT,
1284 .pre_doit = devlink_nl_pre_doit,
1285 .doit = devlink_nl_rate_get_doit,
1286 .post_doit = devlink_nl_post_doit,
1287 .policy = devlink_rate_get_do_nl_policy,
1288 .maxattr = DEVLINK_ATTR_INDEX,
1289 .flags = GENL_CMD_CAP_DO,
1290 },
1291 {
1292 .cmd = DEVLINK_CMD_RATE_GET,
1293 .dumpit = devlink_nl_rate_get_dumpit,
1294 .policy = devlink_rate_get_dump_nl_policy,
1295 .maxattr = DEVLINK_ATTR_INDEX,
1296 .flags = GENL_CMD_CAP_DUMP,
1297 },
1298 {
1299 .cmd = DEVLINK_CMD_RATE_SET,
1300 .validate = GENL_DONT_VALIDATE_STRICT,
1301 .pre_doit = devlink_nl_pre_doit_parent_dev_optional,
1302 .doit = devlink_nl_rate_set_doit,
1303 .post_doit = devlink_nl_post_doit_parent_dev_optional,
1304 .policy = devlink_rate_set_nl_policy,
1305 .maxattr = DEVLINK_ATTR_PARENT_DEV,
1306 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1307 },
1308 {
1309 .cmd = DEVLINK_CMD_RATE_NEW,
1310 .validate = GENL_DONT_VALIDATE_STRICT,
1311 .pre_doit = devlink_nl_pre_doit_parent_dev_optional,
1312 .doit = devlink_nl_rate_new_doit,
1313 .post_doit = devlink_nl_post_doit_parent_dev_optional,
1314 .policy = devlink_rate_new_nl_policy,
1315 .maxattr = DEVLINK_ATTR_PARENT_DEV,
1316 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1317 },
1318 {
1319 .cmd = DEVLINK_CMD_RATE_DEL,
1320 .validate = GENL_DONT_VALIDATE_STRICT,
1321 .pre_doit = devlink_nl_pre_doit,
1322 .doit = devlink_nl_rate_del_doit,
1323 .post_doit = devlink_nl_post_doit,
1324 .policy = devlink_rate_del_nl_policy,
1325 .maxattr = DEVLINK_ATTR_INDEX,
1326 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1327 },
1328 {
1329 .cmd = DEVLINK_CMD_LINECARD_GET,
1330 .validate = GENL_DONT_VALIDATE_STRICT,
1331 .pre_doit = devlink_nl_pre_doit,
1332 .doit = devlink_nl_linecard_get_doit,
1333 .post_doit = devlink_nl_post_doit,
1334 .policy = devlink_linecard_get_do_nl_policy,
1335 .maxattr = DEVLINK_ATTR_INDEX,
1336 .flags = GENL_CMD_CAP_DO,
1337 },
1338 {
1339 .cmd = DEVLINK_CMD_LINECARD_GET,
1340 .dumpit = devlink_nl_linecard_get_dumpit,
1341 .policy = devlink_linecard_get_dump_nl_policy,
1342 .maxattr = DEVLINK_ATTR_INDEX,
1343 .flags = GENL_CMD_CAP_DUMP,
1344 },
1345 {
1346 .cmd = DEVLINK_CMD_LINECARD_SET,
1347 .validate = GENL_DONT_VALIDATE_STRICT,
1348 .pre_doit = devlink_nl_pre_doit,
1349 .doit = devlink_nl_linecard_set_doit,
1350 .post_doit = devlink_nl_post_doit,
1351 .policy = devlink_linecard_set_nl_policy,
1352 .maxattr = DEVLINK_ATTR_INDEX,
1353 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1354 },
1355 {
1356 .cmd = DEVLINK_CMD_SELFTESTS_GET,
1357 .validate = GENL_DONT_VALIDATE_STRICT,
1358 .pre_doit = devlink_nl_pre_doit,
1359 .doit = devlink_nl_selftests_get_doit,
1360 .post_doit = devlink_nl_post_doit,
1361 .policy = devlink_selftests_get_nl_policy,
1362 .maxattr = DEVLINK_ATTR_INDEX,
1363 .flags = GENL_CMD_CAP_DO,
1364 },
1365 {
1366 .cmd = DEVLINK_CMD_SELFTESTS_GET,
1367 .validate = GENL_DONT_VALIDATE_DUMP,
1368 .dumpit = devlink_nl_selftests_get_dumpit,
1369 .flags = GENL_CMD_CAP_DUMP,
1370 },
1371 {
1372 .cmd = DEVLINK_CMD_SELFTESTS_RUN,
1373 .validate = GENL_DONT_VALIDATE_STRICT,
1374 .pre_doit = devlink_nl_pre_doit,
1375 .doit = devlink_nl_selftests_run_doit,
1376 .post_doit = devlink_nl_post_doit,
1377 .policy = devlink_selftests_run_nl_policy,
1378 .maxattr = DEVLINK_ATTR_INDEX,
1379 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
1380 },
1381 {
1382 .cmd = DEVLINK_CMD_NOTIFY_FILTER_SET,
1383 .doit = devlink_nl_notify_filter_set_doit,
1384 .policy = devlink_notify_filter_set_nl_policy,
1385 .maxattr = DEVLINK_ATTR_INDEX,
1386 .flags = GENL_CMD_CAP_DO,
1387 },
1388 };
1389