File Index
Files and directories
Sign in
FILE

netlink_gen.c

File preview with syntax highlighting.

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