at v6.7 6864 lines 206 kB view raw
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 user source */ 5 6#include <stdlib.h> 7#include <string.h> 8#include "devlink-user.h" 9#include "ynl.h" 10#include <linux/devlink.h> 11 12#include <libmnl/libmnl.h> 13#include <linux/genetlink.h> 14 15/* Enums */ 16static const char * const devlink_op_strmap[] = { 17 [3] = "get", 18 // skip "port-get", duplicate reply value 19 [DEVLINK_CMD_PORT_NEW] = "port-new", 20 [13] = "sb-get", 21 [17] = "sb-pool-get", 22 [21] = "sb-port-pool-get", 23 [25] = "sb-tc-pool-bind-get", 24 [DEVLINK_CMD_ESWITCH_GET] = "eswitch-get", 25 [DEVLINK_CMD_DPIPE_TABLE_GET] = "dpipe-table-get", 26 [DEVLINK_CMD_DPIPE_ENTRIES_GET] = "dpipe-entries-get", 27 [DEVLINK_CMD_DPIPE_HEADERS_GET] = "dpipe-headers-get", 28 [DEVLINK_CMD_RESOURCE_DUMP] = "resource-dump", 29 [DEVLINK_CMD_RELOAD] = "reload", 30 [DEVLINK_CMD_PARAM_GET] = "param-get", 31 [DEVLINK_CMD_REGION_GET] = "region-get", 32 [DEVLINK_CMD_REGION_NEW] = "region-new", 33 [DEVLINK_CMD_REGION_READ] = "region-read", 34 [DEVLINK_CMD_PORT_PARAM_GET] = "port-param-get", 35 [DEVLINK_CMD_INFO_GET] = "info-get", 36 [DEVLINK_CMD_HEALTH_REPORTER_GET] = "health-reporter-get", 37 [DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET] = "health-reporter-dump-get", 38 [63] = "trap-get", 39 [67] = "trap-group-get", 40 [71] = "trap-policer-get", 41 [76] = "rate-get", 42 [80] = "linecard-get", 43 [DEVLINK_CMD_SELFTESTS_GET] = "selftests-get", 44}; 45 46const char *devlink_op_str(int op) 47{ 48 if (op < 0 || op >= (int)MNL_ARRAY_SIZE(devlink_op_strmap)) 49 return NULL; 50 return devlink_op_strmap[op]; 51} 52 53static const char * const devlink_sb_pool_type_strmap[] = { 54 [0] = "ingress", 55 [1] = "egress", 56}; 57 58const char *devlink_sb_pool_type_str(enum devlink_sb_pool_type value) 59{ 60 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_sb_pool_type_strmap)) 61 return NULL; 62 return devlink_sb_pool_type_strmap[value]; 63} 64 65static const char * const devlink_port_type_strmap[] = { 66 [0] = "notset", 67 [1] = "auto", 68 [2] = "eth", 69 [3] = "ib", 70}; 71 72const char *devlink_port_type_str(enum devlink_port_type value) 73{ 74 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_port_type_strmap)) 75 return NULL; 76 return devlink_port_type_strmap[value]; 77} 78 79static const char * const devlink_port_flavour_strmap[] = { 80 [0] = "physical", 81 [1] = "cpu", 82 [2] = "dsa", 83 [3] = "pci_pf", 84 [4] = "pci_vf", 85 [5] = "virtual", 86 [6] = "unused", 87 [7] = "pci_sf", 88}; 89 90const char *devlink_port_flavour_str(enum devlink_port_flavour value) 91{ 92 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_port_flavour_strmap)) 93 return NULL; 94 return devlink_port_flavour_strmap[value]; 95} 96 97static const char * const devlink_port_fn_state_strmap[] = { 98 [0] = "inactive", 99 [1] = "active", 100}; 101 102const char *devlink_port_fn_state_str(enum devlink_port_fn_state value) 103{ 104 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_port_fn_state_strmap)) 105 return NULL; 106 return devlink_port_fn_state_strmap[value]; 107} 108 109static const char * const devlink_port_fn_opstate_strmap[] = { 110 [0] = "detached", 111 [1] = "attached", 112}; 113 114const char *devlink_port_fn_opstate_str(enum devlink_port_fn_opstate value) 115{ 116 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_port_fn_opstate_strmap)) 117 return NULL; 118 return devlink_port_fn_opstate_strmap[value]; 119} 120 121static const char * const devlink_port_fn_attr_cap_strmap[] = { 122 [0] = "roce-bit", 123 [1] = "migratable-bit", 124 [2] = "ipsec-crypto-bit", 125 [3] = "ipsec-packet-bit", 126}; 127 128const char *devlink_port_fn_attr_cap_str(enum devlink_port_fn_attr_cap value) 129{ 130 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_port_fn_attr_cap_strmap)) 131 return NULL; 132 return devlink_port_fn_attr_cap_strmap[value]; 133} 134 135static const char * const devlink_sb_threshold_type_strmap[] = { 136 [0] = "static", 137 [1] = "dynamic", 138}; 139 140const char *devlink_sb_threshold_type_str(enum devlink_sb_threshold_type value) 141{ 142 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_sb_threshold_type_strmap)) 143 return NULL; 144 return devlink_sb_threshold_type_strmap[value]; 145} 146 147static const char * const devlink_eswitch_mode_strmap[] = { 148 [0] = "legacy", 149 [1] = "switchdev", 150}; 151 152const char *devlink_eswitch_mode_str(enum devlink_eswitch_mode value) 153{ 154 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_eswitch_mode_strmap)) 155 return NULL; 156 return devlink_eswitch_mode_strmap[value]; 157} 158 159static const char * const devlink_eswitch_inline_mode_strmap[] = { 160 [0] = "none", 161 [1] = "link", 162 [2] = "network", 163 [3] = "transport", 164}; 165 166const char * 167devlink_eswitch_inline_mode_str(enum devlink_eswitch_inline_mode value) 168{ 169 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_eswitch_inline_mode_strmap)) 170 return NULL; 171 return devlink_eswitch_inline_mode_strmap[value]; 172} 173 174static const char * const devlink_eswitch_encap_mode_strmap[] = { 175 [0] = "none", 176 [1] = "basic", 177}; 178 179const char * 180devlink_eswitch_encap_mode_str(enum devlink_eswitch_encap_mode value) 181{ 182 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_eswitch_encap_mode_strmap)) 183 return NULL; 184 return devlink_eswitch_encap_mode_strmap[value]; 185} 186 187static const char * const devlink_dpipe_match_type_strmap[] = { 188 [0] = "field-exact", 189}; 190 191const char *devlink_dpipe_match_type_str(enum devlink_dpipe_match_type value) 192{ 193 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_dpipe_match_type_strmap)) 194 return NULL; 195 return devlink_dpipe_match_type_strmap[value]; 196} 197 198static const char * const devlink_dpipe_action_type_strmap[] = { 199 [0] = "field-modify", 200}; 201 202const char *devlink_dpipe_action_type_str(enum devlink_dpipe_action_type value) 203{ 204 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_dpipe_action_type_strmap)) 205 return NULL; 206 return devlink_dpipe_action_type_strmap[value]; 207} 208 209static const char * const devlink_dpipe_field_mapping_type_strmap[] = { 210 [0] = "none", 211 [1] = "ifindex", 212}; 213 214const char * 215devlink_dpipe_field_mapping_type_str(enum devlink_dpipe_field_mapping_type value) 216{ 217 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_dpipe_field_mapping_type_strmap)) 218 return NULL; 219 return devlink_dpipe_field_mapping_type_strmap[value]; 220} 221 222static const char * const devlink_resource_unit_strmap[] = { 223 [0] = "entry", 224}; 225 226const char *devlink_resource_unit_str(enum devlink_resource_unit value) 227{ 228 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_resource_unit_strmap)) 229 return NULL; 230 return devlink_resource_unit_strmap[value]; 231} 232 233static const char * const devlink_reload_action_strmap[] = { 234 [1] = "driver-reinit", 235 [2] = "fw-activate", 236}; 237 238const char *devlink_reload_action_str(enum devlink_reload_action value) 239{ 240 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_reload_action_strmap)) 241 return NULL; 242 return devlink_reload_action_strmap[value]; 243} 244 245static const char * const devlink_param_cmode_strmap[] = { 246 [0] = "runtime", 247 [1] = "driverinit", 248 [2] = "permanent", 249}; 250 251const char *devlink_param_cmode_str(enum devlink_param_cmode value) 252{ 253 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_param_cmode_strmap)) 254 return NULL; 255 return devlink_param_cmode_strmap[value]; 256} 257 258static const char * const devlink_flash_overwrite_strmap[] = { 259 [0] = "settings-bit", 260 [1] = "identifiers-bit", 261}; 262 263const char *devlink_flash_overwrite_str(enum devlink_flash_overwrite value) 264{ 265 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_flash_overwrite_strmap)) 266 return NULL; 267 return devlink_flash_overwrite_strmap[value]; 268} 269 270static const char * const devlink_trap_action_strmap[] = { 271 [0] = "drop", 272 [1] = "trap", 273 [2] = "mirror", 274}; 275 276const char *devlink_trap_action_str(enum devlink_trap_action value) 277{ 278 if (value < 0 || value >= (int)MNL_ARRAY_SIZE(devlink_trap_action_strmap)) 279 return NULL; 280 return devlink_trap_action_strmap[value]; 281} 282 283/* Policies */ 284struct ynl_policy_attr devlink_dl_dpipe_match_policy[DEVLINK_ATTR_MAX + 1] = { 285 [DEVLINK_ATTR_DPIPE_MATCH_TYPE] = { .name = "dpipe-match-type", .type = YNL_PT_U32, }, 286 [DEVLINK_ATTR_DPIPE_HEADER_ID] = { .name = "dpipe-header-id", .type = YNL_PT_U32, }, 287 [DEVLINK_ATTR_DPIPE_HEADER_GLOBAL] = { .name = "dpipe-header-global", .type = YNL_PT_U8, }, 288 [DEVLINK_ATTR_DPIPE_HEADER_INDEX] = { .name = "dpipe-header-index", .type = YNL_PT_U32, }, 289 [DEVLINK_ATTR_DPIPE_FIELD_ID] = { .name = "dpipe-field-id", .type = YNL_PT_U32, }, 290}; 291 292struct ynl_policy_nest devlink_dl_dpipe_match_nest = { 293 .max_attr = DEVLINK_ATTR_MAX, 294 .table = devlink_dl_dpipe_match_policy, 295}; 296 297struct ynl_policy_attr devlink_dl_dpipe_match_value_policy[DEVLINK_ATTR_MAX + 1] = { 298 [DEVLINK_ATTR_DPIPE_MATCH] = { .name = "dpipe-match", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_match_nest, }, 299 [DEVLINK_ATTR_DPIPE_VALUE] = { .name = "dpipe-value", .type = YNL_PT_BINARY,}, 300 [DEVLINK_ATTR_DPIPE_VALUE_MASK] = { .name = "dpipe-value-mask", .type = YNL_PT_BINARY,}, 301 [DEVLINK_ATTR_DPIPE_VALUE_MAPPING] = { .name = "dpipe-value-mapping", .type = YNL_PT_U32, }, 302}; 303 304struct ynl_policy_nest devlink_dl_dpipe_match_value_nest = { 305 .max_attr = DEVLINK_ATTR_MAX, 306 .table = devlink_dl_dpipe_match_value_policy, 307}; 308 309struct ynl_policy_attr devlink_dl_dpipe_action_policy[DEVLINK_ATTR_MAX + 1] = { 310 [DEVLINK_ATTR_DPIPE_ACTION_TYPE] = { .name = "dpipe-action-type", .type = YNL_PT_U32, }, 311 [DEVLINK_ATTR_DPIPE_HEADER_ID] = { .name = "dpipe-header-id", .type = YNL_PT_U32, }, 312 [DEVLINK_ATTR_DPIPE_HEADER_GLOBAL] = { .name = "dpipe-header-global", .type = YNL_PT_U8, }, 313 [DEVLINK_ATTR_DPIPE_HEADER_INDEX] = { .name = "dpipe-header-index", .type = YNL_PT_U32, }, 314 [DEVLINK_ATTR_DPIPE_FIELD_ID] = { .name = "dpipe-field-id", .type = YNL_PT_U32, }, 315}; 316 317struct ynl_policy_nest devlink_dl_dpipe_action_nest = { 318 .max_attr = DEVLINK_ATTR_MAX, 319 .table = devlink_dl_dpipe_action_policy, 320}; 321 322struct ynl_policy_attr devlink_dl_dpipe_action_value_policy[DEVLINK_ATTR_MAX + 1] = { 323 [DEVLINK_ATTR_DPIPE_ACTION] = { .name = "dpipe-action", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_action_nest, }, 324 [DEVLINK_ATTR_DPIPE_VALUE] = { .name = "dpipe-value", .type = YNL_PT_BINARY,}, 325 [DEVLINK_ATTR_DPIPE_VALUE_MASK] = { .name = "dpipe-value-mask", .type = YNL_PT_BINARY,}, 326 [DEVLINK_ATTR_DPIPE_VALUE_MAPPING] = { .name = "dpipe-value-mapping", .type = YNL_PT_U32, }, 327}; 328 329struct ynl_policy_nest devlink_dl_dpipe_action_value_nest = { 330 .max_attr = DEVLINK_ATTR_MAX, 331 .table = devlink_dl_dpipe_action_value_policy, 332}; 333 334struct ynl_policy_attr devlink_dl_dpipe_field_policy[DEVLINK_ATTR_MAX + 1] = { 335 [DEVLINK_ATTR_DPIPE_FIELD_NAME] = { .name = "dpipe-field-name", .type = YNL_PT_NUL_STR, }, 336 [DEVLINK_ATTR_DPIPE_FIELD_ID] = { .name = "dpipe-field-id", .type = YNL_PT_U32, }, 337 [DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH] = { .name = "dpipe-field-bitwidth", .type = YNL_PT_U32, }, 338 [DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE] = { .name = "dpipe-field-mapping-type", .type = YNL_PT_U32, }, 339}; 340 341struct ynl_policy_nest devlink_dl_dpipe_field_nest = { 342 .max_attr = DEVLINK_ATTR_MAX, 343 .table = devlink_dl_dpipe_field_policy, 344}; 345 346struct ynl_policy_attr devlink_dl_resource_policy[DEVLINK_ATTR_MAX + 1] = { 347 [DEVLINK_ATTR_RESOURCE_NAME] = { .name = "resource-name", .type = YNL_PT_NUL_STR, }, 348 [DEVLINK_ATTR_RESOURCE_ID] = { .name = "resource-id", .type = YNL_PT_U64, }, 349 [DEVLINK_ATTR_RESOURCE_SIZE] = { .name = "resource-size", .type = YNL_PT_U64, }, 350 [DEVLINK_ATTR_RESOURCE_SIZE_NEW] = { .name = "resource-size-new", .type = YNL_PT_U64, }, 351 [DEVLINK_ATTR_RESOURCE_SIZE_VALID] = { .name = "resource-size-valid", .type = YNL_PT_U8, }, 352 [DEVLINK_ATTR_RESOURCE_SIZE_MIN] = { .name = "resource-size-min", .type = YNL_PT_U64, }, 353 [DEVLINK_ATTR_RESOURCE_SIZE_MAX] = { .name = "resource-size-max", .type = YNL_PT_U64, }, 354 [DEVLINK_ATTR_RESOURCE_SIZE_GRAN] = { .name = "resource-size-gran", .type = YNL_PT_U64, }, 355 [DEVLINK_ATTR_RESOURCE_UNIT] = { .name = "resource-unit", .type = YNL_PT_U8, }, 356 [DEVLINK_ATTR_RESOURCE_OCC] = { .name = "resource-occ", .type = YNL_PT_U64, }, 357}; 358 359struct ynl_policy_nest devlink_dl_resource_nest = { 360 .max_attr = DEVLINK_ATTR_MAX, 361 .table = devlink_dl_resource_policy, 362}; 363 364struct ynl_policy_attr devlink_dl_info_version_policy[DEVLINK_ATTR_MAX + 1] = { 365 [DEVLINK_ATTR_INFO_VERSION_NAME] = { .name = "info-version-name", .type = YNL_PT_NUL_STR, }, 366 [DEVLINK_ATTR_INFO_VERSION_VALUE] = { .name = "info-version-value", .type = YNL_PT_NUL_STR, }, 367}; 368 369struct ynl_policy_nest devlink_dl_info_version_nest = { 370 .max_attr = DEVLINK_ATTR_MAX, 371 .table = devlink_dl_info_version_policy, 372}; 373 374struct ynl_policy_attr devlink_dl_fmsg_policy[DEVLINK_ATTR_MAX + 1] = { 375 [DEVLINK_ATTR_FMSG_OBJ_NEST_START] = { .name = "fmsg-obj-nest-start", .type = YNL_PT_FLAG, }, 376 [DEVLINK_ATTR_FMSG_PAIR_NEST_START] = { .name = "fmsg-pair-nest-start", .type = YNL_PT_FLAG, }, 377 [DEVLINK_ATTR_FMSG_ARR_NEST_START] = { .name = "fmsg-arr-nest-start", .type = YNL_PT_FLAG, }, 378 [DEVLINK_ATTR_FMSG_NEST_END] = { .name = "fmsg-nest-end", .type = YNL_PT_FLAG, }, 379 [DEVLINK_ATTR_FMSG_OBJ_NAME] = { .name = "fmsg-obj-name", .type = YNL_PT_NUL_STR, }, 380}; 381 382struct ynl_policy_nest devlink_dl_fmsg_nest = { 383 .max_attr = DEVLINK_ATTR_MAX, 384 .table = devlink_dl_fmsg_policy, 385}; 386 387struct ynl_policy_attr devlink_dl_port_function_policy[DEVLINK_PORT_FUNCTION_ATTR_MAX + 1] = { 388 [DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] = { .name = "hw-addr", .type = YNL_PT_BINARY,}, 389 [DEVLINK_PORT_FN_ATTR_STATE] = { .name = "state", .type = YNL_PT_U8, }, 390 [DEVLINK_PORT_FN_ATTR_OPSTATE] = { .name = "opstate", .type = YNL_PT_U8, }, 391 [DEVLINK_PORT_FN_ATTR_CAPS] = { .name = "caps", .type = YNL_PT_BITFIELD32, }, 392}; 393 394struct ynl_policy_nest devlink_dl_port_function_nest = { 395 .max_attr = DEVLINK_PORT_FUNCTION_ATTR_MAX, 396 .table = devlink_dl_port_function_policy, 397}; 398 399struct ynl_policy_attr devlink_dl_reload_stats_entry_policy[DEVLINK_ATTR_MAX + 1] = { 400 [DEVLINK_ATTR_RELOAD_STATS_LIMIT] = { .name = "reload-stats-limit", .type = YNL_PT_U8, }, 401 [DEVLINK_ATTR_RELOAD_STATS_VALUE] = { .name = "reload-stats-value", .type = YNL_PT_U32, }, 402}; 403 404struct ynl_policy_nest devlink_dl_reload_stats_entry_nest = { 405 .max_attr = DEVLINK_ATTR_MAX, 406 .table = devlink_dl_reload_stats_entry_policy, 407}; 408 409struct ynl_policy_attr devlink_dl_reload_act_stats_policy[DEVLINK_ATTR_MAX + 1] = { 410 [DEVLINK_ATTR_RELOAD_STATS_ENTRY] = { .name = "reload-stats-entry", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_entry_nest, }, 411}; 412 413struct ynl_policy_nest devlink_dl_reload_act_stats_nest = { 414 .max_attr = DEVLINK_ATTR_MAX, 415 .table = devlink_dl_reload_act_stats_policy, 416}; 417 418struct ynl_policy_attr devlink_dl_selftest_id_policy[DEVLINK_ATTR_SELFTEST_ID_MAX + 1] = { 419 [DEVLINK_ATTR_SELFTEST_ID_FLASH] = { .name = "flash", .type = YNL_PT_FLAG, }, 420}; 421 422struct ynl_policy_nest devlink_dl_selftest_id_nest = { 423 .max_attr = DEVLINK_ATTR_SELFTEST_ID_MAX, 424 .table = devlink_dl_selftest_id_policy, 425}; 426 427struct ynl_policy_attr devlink_dl_dpipe_table_matches_policy[DEVLINK_ATTR_MAX + 1] = { 428 [DEVLINK_ATTR_DPIPE_MATCH] = { .name = "dpipe-match", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_match_nest, }, 429}; 430 431struct ynl_policy_nest devlink_dl_dpipe_table_matches_nest = { 432 .max_attr = DEVLINK_ATTR_MAX, 433 .table = devlink_dl_dpipe_table_matches_policy, 434}; 435 436struct ynl_policy_attr devlink_dl_dpipe_table_actions_policy[DEVLINK_ATTR_MAX + 1] = { 437 [DEVLINK_ATTR_DPIPE_ACTION] = { .name = "dpipe-action", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_action_nest, }, 438}; 439 440struct ynl_policy_nest devlink_dl_dpipe_table_actions_nest = { 441 .max_attr = DEVLINK_ATTR_MAX, 442 .table = devlink_dl_dpipe_table_actions_policy, 443}; 444 445struct ynl_policy_attr devlink_dl_dpipe_entry_match_values_policy[DEVLINK_ATTR_MAX + 1] = { 446 [DEVLINK_ATTR_DPIPE_MATCH_VALUE] = { .name = "dpipe-match-value", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_match_value_nest, }, 447}; 448 449struct ynl_policy_nest devlink_dl_dpipe_entry_match_values_nest = { 450 .max_attr = DEVLINK_ATTR_MAX, 451 .table = devlink_dl_dpipe_entry_match_values_policy, 452}; 453 454struct ynl_policy_attr devlink_dl_dpipe_entry_action_values_policy[DEVLINK_ATTR_MAX + 1] = { 455 [DEVLINK_ATTR_DPIPE_ACTION_VALUE] = { .name = "dpipe-action-value", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_action_value_nest, }, 456}; 457 458struct ynl_policy_nest devlink_dl_dpipe_entry_action_values_nest = { 459 .max_attr = DEVLINK_ATTR_MAX, 460 .table = devlink_dl_dpipe_entry_action_values_policy, 461}; 462 463struct ynl_policy_attr devlink_dl_dpipe_header_fields_policy[DEVLINK_ATTR_MAX + 1] = { 464 [DEVLINK_ATTR_DPIPE_FIELD] = { .name = "dpipe-field", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_field_nest, }, 465}; 466 467struct ynl_policy_nest devlink_dl_dpipe_header_fields_nest = { 468 .max_attr = DEVLINK_ATTR_MAX, 469 .table = devlink_dl_dpipe_header_fields_policy, 470}; 471 472struct ynl_policy_attr devlink_dl_resource_list_policy[DEVLINK_ATTR_MAX + 1] = { 473 [DEVLINK_ATTR_RESOURCE] = { .name = "resource", .type = YNL_PT_NEST, .nest = &devlink_dl_resource_nest, }, 474}; 475 476struct ynl_policy_nest devlink_dl_resource_list_nest = { 477 .max_attr = DEVLINK_ATTR_MAX, 478 .table = devlink_dl_resource_list_policy, 479}; 480 481struct ynl_policy_attr devlink_dl_reload_act_info_policy[DEVLINK_ATTR_MAX + 1] = { 482 [DEVLINK_ATTR_RELOAD_ACTION] = { .name = "reload-action", .type = YNL_PT_U8, }, 483 [DEVLINK_ATTR_RELOAD_ACTION_STATS] = { .name = "reload-action-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_stats_nest, }, 484}; 485 486struct ynl_policy_nest devlink_dl_reload_act_info_nest = { 487 .max_attr = DEVLINK_ATTR_MAX, 488 .table = devlink_dl_reload_act_info_policy, 489}; 490 491struct ynl_policy_attr devlink_dl_dpipe_table_policy[DEVLINK_ATTR_MAX + 1] = { 492 [DEVLINK_ATTR_DPIPE_TABLE_NAME] = { .name = "dpipe-table-name", .type = YNL_PT_NUL_STR, }, 493 [DEVLINK_ATTR_DPIPE_TABLE_SIZE] = { .name = "dpipe-table-size", .type = YNL_PT_U64, }, 494 [DEVLINK_ATTR_DPIPE_TABLE_MATCHES] = { .name = "dpipe-table-matches", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_matches_nest, }, 495 [DEVLINK_ATTR_DPIPE_TABLE_ACTIONS] = { .name = "dpipe-table-actions", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_actions_nest, }, 496 [DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED] = { .name = "dpipe-table-counters-enabled", .type = YNL_PT_U8, }, 497 [DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID] = { .name = "dpipe-table-resource-id", .type = YNL_PT_U64, }, 498 [DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS] = { .name = "dpipe-table-resource-units", .type = YNL_PT_U64, }, 499}; 500 501struct ynl_policy_nest devlink_dl_dpipe_table_nest = { 502 .max_attr = DEVLINK_ATTR_MAX, 503 .table = devlink_dl_dpipe_table_policy, 504}; 505 506struct ynl_policy_attr devlink_dl_dpipe_entry_policy[DEVLINK_ATTR_MAX + 1] = { 507 [DEVLINK_ATTR_DPIPE_ENTRY_INDEX] = { .name = "dpipe-entry-index", .type = YNL_PT_U64, }, 508 [DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES] = { .name = "dpipe-entry-match-values", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_match_values_nest, }, 509 [DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES] = { .name = "dpipe-entry-action-values", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_action_values_nest, }, 510 [DEVLINK_ATTR_DPIPE_ENTRY_COUNTER] = { .name = "dpipe-entry-counter", .type = YNL_PT_U64, }, 511}; 512 513struct ynl_policy_nest devlink_dl_dpipe_entry_nest = { 514 .max_attr = DEVLINK_ATTR_MAX, 515 .table = devlink_dl_dpipe_entry_policy, 516}; 517 518struct ynl_policy_attr devlink_dl_dpipe_header_policy[DEVLINK_ATTR_MAX + 1] = { 519 [DEVLINK_ATTR_DPIPE_HEADER_NAME] = { .name = "dpipe-header-name", .type = YNL_PT_NUL_STR, }, 520 [DEVLINK_ATTR_DPIPE_HEADER_ID] = { .name = "dpipe-header-id", .type = YNL_PT_U32, }, 521 [DEVLINK_ATTR_DPIPE_HEADER_GLOBAL] = { .name = "dpipe-header-global", .type = YNL_PT_U8, }, 522 [DEVLINK_ATTR_DPIPE_HEADER_FIELDS] = { .name = "dpipe-header-fields", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_header_fields_nest, }, 523}; 524 525struct ynl_policy_nest devlink_dl_dpipe_header_nest = { 526 .max_attr = DEVLINK_ATTR_MAX, 527 .table = devlink_dl_dpipe_header_policy, 528}; 529 530struct ynl_policy_attr devlink_dl_reload_stats_policy[DEVLINK_ATTR_MAX + 1] = { 531 [DEVLINK_ATTR_RELOAD_ACTION_INFO] = { .name = "reload-action-info", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_info_nest, }, 532}; 533 534struct ynl_policy_nest devlink_dl_reload_stats_nest = { 535 .max_attr = DEVLINK_ATTR_MAX, 536 .table = devlink_dl_reload_stats_policy, 537}; 538 539struct ynl_policy_attr devlink_dl_dpipe_tables_policy[DEVLINK_ATTR_MAX + 1] = { 540 [DEVLINK_ATTR_DPIPE_TABLE] = { .name = "dpipe-table", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_nest, }, 541}; 542 543struct ynl_policy_nest devlink_dl_dpipe_tables_nest = { 544 .max_attr = DEVLINK_ATTR_MAX, 545 .table = devlink_dl_dpipe_tables_policy, 546}; 547 548struct ynl_policy_attr devlink_dl_dpipe_entries_policy[DEVLINK_ATTR_MAX + 1] = { 549 [DEVLINK_ATTR_DPIPE_ENTRY] = { .name = "dpipe-entry", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_nest, }, 550}; 551 552struct ynl_policy_nest devlink_dl_dpipe_entries_nest = { 553 .max_attr = DEVLINK_ATTR_MAX, 554 .table = devlink_dl_dpipe_entries_policy, 555}; 556 557struct ynl_policy_attr devlink_dl_dpipe_headers_policy[DEVLINK_ATTR_MAX + 1] = { 558 [DEVLINK_ATTR_DPIPE_HEADER] = { .name = "dpipe-header", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_header_nest, }, 559}; 560 561struct ynl_policy_nest devlink_dl_dpipe_headers_nest = { 562 .max_attr = DEVLINK_ATTR_MAX, 563 .table = devlink_dl_dpipe_headers_policy, 564}; 565 566struct ynl_policy_attr devlink_dl_dev_stats_policy[DEVLINK_ATTR_MAX + 1] = { 567 [DEVLINK_ATTR_RELOAD_STATS] = { .name = "reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, }, 568 [DEVLINK_ATTR_REMOTE_RELOAD_STATS] = { .name = "remote-reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, }, 569}; 570 571struct ynl_policy_nest devlink_dl_dev_stats_nest = { 572 .max_attr = DEVLINK_ATTR_MAX, 573 .table = devlink_dl_dev_stats_policy, 574}; 575 576struct ynl_policy_attr devlink_policy[DEVLINK_ATTR_MAX + 1] = { 577 [DEVLINK_ATTR_BUS_NAME] = { .name = "bus-name", .type = YNL_PT_NUL_STR, }, 578 [DEVLINK_ATTR_DEV_NAME] = { .name = "dev-name", .type = YNL_PT_NUL_STR, }, 579 [DEVLINK_ATTR_PORT_INDEX] = { .name = "port-index", .type = YNL_PT_U32, }, 580 [DEVLINK_ATTR_PORT_TYPE] = { .name = "port-type", .type = YNL_PT_U16, }, 581 [DEVLINK_ATTR_PORT_SPLIT_COUNT] = { .name = "port-split-count", .type = YNL_PT_U32, }, 582 [DEVLINK_ATTR_SB_INDEX] = { .name = "sb-index", .type = YNL_PT_U32, }, 583 [DEVLINK_ATTR_SB_POOL_INDEX] = { .name = "sb-pool-index", .type = YNL_PT_U16, }, 584 [DEVLINK_ATTR_SB_POOL_TYPE] = { .name = "sb-pool-type", .type = YNL_PT_U8, }, 585 [DEVLINK_ATTR_SB_POOL_SIZE] = { .name = "sb-pool-size", .type = YNL_PT_U32, }, 586 [DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE] = { .name = "sb-pool-threshold-type", .type = YNL_PT_U8, }, 587 [DEVLINK_ATTR_SB_THRESHOLD] = { .name = "sb-threshold", .type = YNL_PT_U32, }, 588 [DEVLINK_ATTR_SB_TC_INDEX] = { .name = "sb-tc-index", .type = YNL_PT_U16, }, 589 [DEVLINK_ATTR_ESWITCH_MODE] = { .name = "eswitch-mode", .type = YNL_PT_U16, }, 590 [DEVLINK_ATTR_ESWITCH_INLINE_MODE] = { .name = "eswitch-inline-mode", .type = YNL_PT_U16, }, 591 [DEVLINK_ATTR_DPIPE_TABLES] = { .name = "dpipe-tables", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_tables_nest, }, 592 [DEVLINK_ATTR_DPIPE_TABLE] = { .name = "dpipe-table", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_nest, }, 593 [DEVLINK_ATTR_DPIPE_TABLE_NAME] = { .name = "dpipe-table-name", .type = YNL_PT_NUL_STR, }, 594 [DEVLINK_ATTR_DPIPE_TABLE_SIZE] = { .name = "dpipe-table-size", .type = YNL_PT_U64, }, 595 [DEVLINK_ATTR_DPIPE_TABLE_MATCHES] = { .name = "dpipe-table-matches", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_matches_nest, }, 596 [DEVLINK_ATTR_DPIPE_TABLE_ACTIONS] = { .name = "dpipe-table-actions", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_actions_nest, }, 597 [DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED] = { .name = "dpipe-table-counters-enabled", .type = YNL_PT_U8, }, 598 [DEVLINK_ATTR_DPIPE_ENTRIES] = { .name = "dpipe-entries", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entries_nest, }, 599 [DEVLINK_ATTR_DPIPE_ENTRY] = { .name = "dpipe-entry", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_nest, }, 600 [DEVLINK_ATTR_DPIPE_ENTRY_INDEX] = { .name = "dpipe-entry-index", .type = YNL_PT_U64, }, 601 [DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES] = { .name = "dpipe-entry-match-values", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_match_values_nest, }, 602 [DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES] = { .name = "dpipe-entry-action-values", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_action_values_nest, }, 603 [DEVLINK_ATTR_DPIPE_ENTRY_COUNTER] = { .name = "dpipe-entry-counter", .type = YNL_PT_U64, }, 604 [DEVLINK_ATTR_DPIPE_MATCH] = { .name = "dpipe-match", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_match_nest, }, 605 [DEVLINK_ATTR_DPIPE_MATCH_VALUE] = { .name = "dpipe-match-value", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_match_value_nest, }, 606 [DEVLINK_ATTR_DPIPE_MATCH_TYPE] = { .name = "dpipe-match-type", .type = YNL_PT_U32, }, 607 [DEVLINK_ATTR_DPIPE_ACTION] = { .name = "dpipe-action", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_action_nest, }, 608 [DEVLINK_ATTR_DPIPE_ACTION_VALUE] = { .name = "dpipe-action-value", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_action_value_nest, }, 609 [DEVLINK_ATTR_DPIPE_ACTION_TYPE] = { .name = "dpipe-action-type", .type = YNL_PT_U32, }, 610 [DEVLINK_ATTR_DPIPE_VALUE] = { .name = "dpipe-value", .type = YNL_PT_BINARY,}, 611 [DEVLINK_ATTR_DPIPE_VALUE_MASK] = { .name = "dpipe-value-mask", .type = YNL_PT_BINARY,}, 612 [DEVLINK_ATTR_DPIPE_VALUE_MAPPING] = { .name = "dpipe-value-mapping", .type = YNL_PT_U32, }, 613 [DEVLINK_ATTR_DPIPE_HEADERS] = { .name = "dpipe-headers", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_headers_nest, }, 614 [DEVLINK_ATTR_DPIPE_HEADER] = { .name = "dpipe-header", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_header_nest, }, 615 [DEVLINK_ATTR_DPIPE_HEADER_NAME] = { .name = "dpipe-header-name", .type = YNL_PT_NUL_STR, }, 616 [DEVLINK_ATTR_DPIPE_HEADER_ID] = { .name = "dpipe-header-id", .type = YNL_PT_U32, }, 617 [DEVLINK_ATTR_DPIPE_HEADER_FIELDS] = { .name = "dpipe-header-fields", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_header_fields_nest, }, 618 [DEVLINK_ATTR_DPIPE_HEADER_GLOBAL] = { .name = "dpipe-header-global", .type = YNL_PT_U8, }, 619 [DEVLINK_ATTR_DPIPE_HEADER_INDEX] = { .name = "dpipe-header-index", .type = YNL_PT_U32, }, 620 [DEVLINK_ATTR_DPIPE_FIELD] = { .name = "dpipe-field", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_field_nest, }, 621 [DEVLINK_ATTR_DPIPE_FIELD_NAME] = { .name = "dpipe-field-name", .type = YNL_PT_NUL_STR, }, 622 [DEVLINK_ATTR_DPIPE_FIELD_ID] = { .name = "dpipe-field-id", .type = YNL_PT_U32, }, 623 [DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH] = { .name = "dpipe-field-bitwidth", .type = YNL_PT_U32, }, 624 [DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE] = { .name = "dpipe-field-mapping-type", .type = YNL_PT_U32, }, 625 [DEVLINK_ATTR_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, }, 626 [DEVLINK_ATTR_ESWITCH_ENCAP_MODE] = { .name = "eswitch-encap-mode", .type = YNL_PT_U8, }, 627 [DEVLINK_ATTR_RESOURCE_LIST] = { .name = "resource-list", .type = YNL_PT_NEST, .nest = &devlink_dl_resource_list_nest, }, 628 [DEVLINK_ATTR_RESOURCE] = { .name = "resource", .type = YNL_PT_NEST, .nest = &devlink_dl_resource_nest, }, 629 [DEVLINK_ATTR_RESOURCE_NAME] = { .name = "resource-name", .type = YNL_PT_NUL_STR, }, 630 [DEVLINK_ATTR_RESOURCE_ID] = { .name = "resource-id", .type = YNL_PT_U64, }, 631 [DEVLINK_ATTR_RESOURCE_SIZE] = { .name = "resource-size", .type = YNL_PT_U64, }, 632 [DEVLINK_ATTR_RESOURCE_SIZE_NEW] = { .name = "resource-size-new", .type = YNL_PT_U64, }, 633 [DEVLINK_ATTR_RESOURCE_SIZE_VALID] = { .name = "resource-size-valid", .type = YNL_PT_U8, }, 634 [DEVLINK_ATTR_RESOURCE_SIZE_MIN] = { .name = "resource-size-min", .type = YNL_PT_U64, }, 635 [DEVLINK_ATTR_RESOURCE_SIZE_MAX] = { .name = "resource-size-max", .type = YNL_PT_U64, }, 636 [DEVLINK_ATTR_RESOURCE_SIZE_GRAN] = { .name = "resource-size-gran", .type = YNL_PT_U64, }, 637 [DEVLINK_ATTR_RESOURCE_UNIT] = { .name = "resource-unit", .type = YNL_PT_U8, }, 638 [DEVLINK_ATTR_RESOURCE_OCC] = { .name = "resource-occ", .type = YNL_PT_U64, }, 639 [DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID] = { .name = "dpipe-table-resource-id", .type = YNL_PT_U64, }, 640 [DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS] = { .name = "dpipe-table-resource-units", .type = YNL_PT_U64, }, 641 [DEVLINK_ATTR_PORT_FLAVOUR] = { .name = "port-flavour", .type = YNL_PT_U16, }, 642 [DEVLINK_ATTR_PARAM_NAME] = { .name = "param-name", .type = YNL_PT_NUL_STR, }, 643 [DEVLINK_ATTR_PARAM_TYPE] = { .name = "param-type", .type = YNL_PT_U8, }, 644 [DEVLINK_ATTR_PARAM_VALUE_CMODE] = { .name = "param-value-cmode", .type = YNL_PT_U8, }, 645 [DEVLINK_ATTR_REGION_NAME] = { .name = "region-name", .type = YNL_PT_NUL_STR, }, 646 [DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .name = "region-snapshot-id", .type = YNL_PT_U32, }, 647 [DEVLINK_ATTR_REGION_CHUNK_ADDR] = { .name = "region-chunk-addr", .type = YNL_PT_U64, }, 648 [DEVLINK_ATTR_REGION_CHUNK_LEN] = { .name = "region-chunk-len", .type = YNL_PT_U64, }, 649 [DEVLINK_ATTR_INFO_DRIVER_NAME] = { .name = "info-driver-name", .type = YNL_PT_NUL_STR, }, 650 [DEVLINK_ATTR_INFO_SERIAL_NUMBER] = { .name = "info-serial-number", .type = YNL_PT_NUL_STR, }, 651 [DEVLINK_ATTR_INFO_VERSION_FIXED] = { .name = "info-version-fixed", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, }, 652 [DEVLINK_ATTR_INFO_VERSION_RUNNING] = { .name = "info-version-running", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, }, 653 [DEVLINK_ATTR_INFO_VERSION_STORED] = { .name = "info-version-stored", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, }, 654 [DEVLINK_ATTR_INFO_VERSION_NAME] = { .name = "info-version-name", .type = YNL_PT_NUL_STR, }, 655 [DEVLINK_ATTR_INFO_VERSION_VALUE] = { .name = "info-version-value", .type = YNL_PT_NUL_STR, }, 656 [DEVLINK_ATTR_FMSG] = { .name = "fmsg", .type = YNL_PT_NEST, .nest = &devlink_dl_fmsg_nest, }, 657 [DEVLINK_ATTR_FMSG_OBJ_NEST_START] = { .name = "fmsg-obj-nest-start", .type = YNL_PT_FLAG, }, 658 [DEVLINK_ATTR_FMSG_PAIR_NEST_START] = { .name = "fmsg-pair-nest-start", .type = YNL_PT_FLAG, }, 659 [DEVLINK_ATTR_FMSG_ARR_NEST_START] = { .name = "fmsg-arr-nest-start", .type = YNL_PT_FLAG, }, 660 [DEVLINK_ATTR_FMSG_NEST_END] = { .name = "fmsg-nest-end", .type = YNL_PT_FLAG, }, 661 [DEVLINK_ATTR_FMSG_OBJ_NAME] = { .name = "fmsg-obj-name", .type = YNL_PT_NUL_STR, }, 662 [DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .name = "health-reporter-name", .type = YNL_PT_NUL_STR, }, 663 [DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD] = { .name = "health-reporter-graceful-period", .type = YNL_PT_U64, }, 664 [DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER] = { .name = "health-reporter-auto-recover", .type = YNL_PT_U8, }, 665 [DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME] = { .name = "flash-update-file-name", .type = YNL_PT_NUL_STR, }, 666 [DEVLINK_ATTR_FLASH_UPDATE_COMPONENT] = { .name = "flash-update-component", .type = YNL_PT_NUL_STR, }, 667 [DEVLINK_ATTR_PORT_PCI_PF_NUMBER] = { .name = "port-pci-pf-number", .type = YNL_PT_U16, }, 668 [DEVLINK_ATTR_TRAP_NAME] = { .name = "trap-name", .type = YNL_PT_NUL_STR, }, 669 [DEVLINK_ATTR_TRAP_ACTION] = { .name = "trap-action", .type = YNL_PT_U8, }, 670 [DEVLINK_ATTR_TRAP_GROUP_NAME] = { .name = "trap-group-name", .type = YNL_PT_NUL_STR, }, 671 [DEVLINK_ATTR_RELOAD_FAILED] = { .name = "reload-failed", .type = YNL_PT_U8, }, 672 [DEVLINK_ATTR_NETNS_FD] = { .name = "netns-fd", .type = YNL_PT_U32, }, 673 [DEVLINK_ATTR_NETNS_PID] = { .name = "netns-pid", .type = YNL_PT_U32, }, 674 [DEVLINK_ATTR_NETNS_ID] = { .name = "netns-id", .type = YNL_PT_U32, }, 675 [DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP] = { .name = "health-reporter-auto-dump", .type = YNL_PT_U8, }, 676 [DEVLINK_ATTR_TRAP_POLICER_ID] = { .name = "trap-policer-id", .type = YNL_PT_U32, }, 677 [DEVLINK_ATTR_TRAP_POLICER_RATE] = { .name = "trap-policer-rate", .type = YNL_PT_U64, }, 678 [DEVLINK_ATTR_TRAP_POLICER_BURST] = { .name = "trap-policer-burst", .type = YNL_PT_U64, }, 679 [DEVLINK_ATTR_PORT_FUNCTION] = { .name = "port-function", .type = YNL_PT_NEST, .nest = &devlink_dl_port_function_nest, }, 680 [DEVLINK_ATTR_PORT_CONTROLLER_NUMBER] = { .name = "port-controller-number", .type = YNL_PT_U32, }, 681 [DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK] = { .name = "flash-update-overwrite-mask", .type = YNL_PT_BITFIELD32, }, 682 [DEVLINK_ATTR_RELOAD_ACTION] = { .name = "reload-action", .type = YNL_PT_U8, }, 683 [DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED] = { .name = "reload-actions-performed", .type = YNL_PT_BITFIELD32, }, 684 [DEVLINK_ATTR_RELOAD_LIMITS] = { .name = "reload-limits", .type = YNL_PT_BITFIELD32, }, 685 [DEVLINK_ATTR_DEV_STATS] = { .name = "dev-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_dev_stats_nest, }, 686 [DEVLINK_ATTR_RELOAD_STATS] = { .name = "reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, }, 687 [DEVLINK_ATTR_RELOAD_STATS_ENTRY] = { .name = "reload-stats-entry", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_entry_nest, }, 688 [DEVLINK_ATTR_RELOAD_STATS_LIMIT] = { .name = "reload-stats-limit", .type = YNL_PT_U8, }, 689 [DEVLINK_ATTR_RELOAD_STATS_VALUE] = { .name = "reload-stats-value", .type = YNL_PT_U32, }, 690 [DEVLINK_ATTR_REMOTE_RELOAD_STATS] = { .name = "remote-reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, }, 691 [DEVLINK_ATTR_RELOAD_ACTION_INFO] = { .name = "reload-action-info", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_info_nest, }, 692 [DEVLINK_ATTR_RELOAD_ACTION_STATS] = { .name = "reload-action-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_stats_nest, }, 693 [DEVLINK_ATTR_PORT_PCI_SF_NUMBER] = { .name = "port-pci-sf-number", .type = YNL_PT_U32, }, 694 [DEVLINK_ATTR_RATE_TX_SHARE] = { .name = "rate-tx-share", .type = YNL_PT_U64, }, 695 [DEVLINK_ATTR_RATE_TX_MAX] = { .name = "rate-tx-max", .type = YNL_PT_U64, }, 696 [DEVLINK_ATTR_RATE_NODE_NAME] = { .name = "rate-node-name", .type = YNL_PT_NUL_STR, }, 697 [DEVLINK_ATTR_RATE_PARENT_NODE_NAME] = { .name = "rate-parent-node-name", .type = YNL_PT_NUL_STR, }, 698 [DEVLINK_ATTR_LINECARD_INDEX] = { .name = "linecard-index", .type = YNL_PT_U32, }, 699 [DEVLINK_ATTR_LINECARD_TYPE] = { .name = "linecard-type", .type = YNL_PT_NUL_STR, }, 700 [DEVLINK_ATTR_SELFTESTS] = { .name = "selftests", .type = YNL_PT_NEST, .nest = &devlink_dl_selftest_id_nest, }, 701 [DEVLINK_ATTR_RATE_TX_PRIORITY] = { .name = "rate-tx-priority", .type = YNL_PT_U32, }, 702 [DEVLINK_ATTR_RATE_TX_WEIGHT] = { .name = "rate-tx-weight", .type = YNL_PT_U32, }, 703 [DEVLINK_ATTR_REGION_DIRECT] = { .name = "region-direct", .type = YNL_PT_FLAG, }, 704}; 705 706struct ynl_policy_nest devlink_nest = { 707 .max_attr = DEVLINK_ATTR_MAX, 708 .table = devlink_policy, 709}; 710 711/* Common nested types */ 712void devlink_dl_dpipe_match_free(struct devlink_dl_dpipe_match *obj) 713{ 714} 715 716int devlink_dl_dpipe_match_parse(struct ynl_parse_arg *yarg, 717 const struct nlattr *nested) 718{ 719 struct devlink_dl_dpipe_match *dst = yarg->data; 720 const struct nlattr *attr; 721 722 mnl_attr_for_each_nested(attr, nested) { 723 unsigned int type = mnl_attr_get_type(attr); 724 725 if (type == DEVLINK_ATTR_DPIPE_MATCH_TYPE) { 726 if (ynl_attr_validate(yarg, attr)) 727 return MNL_CB_ERROR; 728 dst->_present.dpipe_match_type = 1; 729 dst->dpipe_match_type = mnl_attr_get_u32(attr); 730 } else if (type == DEVLINK_ATTR_DPIPE_HEADER_ID) { 731 if (ynl_attr_validate(yarg, attr)) 732 return MNL_CB_ERROR; 733 dst->_present.dpipe_header_id = 1; 734 dst->dpipe_header_id = mnl_attr_get_u32(attr); 735 } else if (type == DEVLINK_ATTR_DPIPE_HEADER_GLOBAL) { 736 if (ynl_attr_validate(yarg, attr)) 737 return MNL_CB_ERROR; 738 dst->_present.dpipe_header_global = 1; 739 dst->dpipe_header_global = mnl_attr_get_u8(attr); 740 } else if (type == DEVLINK_ATTR_DPIPE_HEADER_INDEX) { 741 if (ynl_attr_validate(yarg, attr)) 742 return MNL_CB_ERROR; 743 dst->_present.dpipe_header_index = 1; 744 dst->dpipe_header_index = mnl_attr_get_u32(attr); 745 } else if (type == DEVLINK_ATTR_DPIPE_FIELD_ID) { 746 if (ynl_attr_validate(yarg, attr)) 747 return MNL_CB_ERROR; 748 dst->_present.dpipe_field_id = 1; 749 dst->dpipe_field_id = mnl_attr_get_u32(attr); 750 } 751 } 752 753 return 0; 754} 755 756void 757devlink_dl_dpipe_match_value_free(struct devlink_dl_dpipe_match_value *obj) 758{ 759 unsigned int i; 760 761 for (i = 0; i < obj->n_dpipe_match; i++) 762 devlink_dl_dpipe_match_free(&obj->dpipe_match[i]); 763 free(obj->dpipe_match); 764 free(obj->dpipe_value); 765 free(obj->dpipe_value_mask); 766} 767 768int devlink_dl_dpipe_match_value_parse(struct ynl_parse_arg *yarg, 769 const struct nlattr *nested) 770{ 771 struct devlink_dl_dpipe_match_value *dst = yarg->data; 772 unsigned int n_dpipe_match = 0; 773 const struct nlattr *attr; 774 struct ynl_parse_arg parg; 775 int i; 776 777 parg.ys = yarg->ys; 778 779 if (dst->dpipe_match) 780 return ynl_error_parse(yarg, "attribute already present (dl-dpipe-match-value.dpipe-match)"); 781 782 mnl_attr_for_each_nested(attr, nested) { 783 unsigned int type = mnl_attr_get_type(attr); 784 785 if (type == DEVLINK_ATTR_DPIPE_MATCH) { 786 n_dpipe_match++; 787 } else if (type == DEVLINK_ATTR_DPIPE_VALUE) { 788 unsigned int len; 789 790 if (ynl_attr_validate(yarg, attr)) 791 return MNL_CB_ERROR; 792 793 len = mnl_attr_get_payload_len(attr); 794 dst->_present.dpipe_value_len = len; 795 dst->dpipe_value = malloc(len); 796 memcpy(dst->dpipe_value, mnl_attr_get_payload(attr), len); 797 } else if (type == DEVLINK_ATTR_DPIPE_VALUE_MASK) { 798 unsigned int len; 799 800 if (ynl_attr_validate(yarg, attr)) 801 return MNL_CB_ERROR; 802 803 len = mnl_attr_get_payload_len(attr); 804 dst->_present.dpipe_value_mask_len = len; 805 dst->dpipe_value_mask = malloc(len); 806 memcpy(dst->dpipe_value_mask, mnl_attr_get_payload(attr), len); 807 } else if (type == DEVLINK_ATTR_DPIPE_VALUE_MAPPING) { 808 if (ynl_attr_validate(yarg, attr)) 809 return MNL_CB_ERROR; 810 dst->_present.dpipe_value_mapping = 1; 811 dst->dpipe_value_mapping = mnl_attr_get_u32(attr); 812 } 813 } 814 815 if (n_dpipe_match) { 816 dst->dpipe_match = calloc(n_dpipe_match, sizeof(*dst->dpipe_match)); 817 dst->n_dpipe_match = n_dpipe_match; 818 i = 0; 819 parg.rsp_policy = &devlink_dl_dpipe_match_nest; 820 mnl_attr_for_each_nested(attr, nested) { 821 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_DPIPE_MATCH) { 822 parg.data = &dst->dpipe_match[i]; 823 if (devlink_dl_dpipe_match_parse(&parg, attr)) 824 return MNL_CB_ERROR; 825 i++; 826 } 827 } 828 } 829 830 return 0; 831} 832 833void devlink_dl_dpipe_action_free(struct devlink_dl_dpipe_action *obj) 834{ 835} 836 837int devlink_dl_dpipe_action_parse(struct ynl_parse_arg *yarg, 838 const struct nlattr *nested) 839{ 840 struct devlink_dl_dpipe_action *dst = yarg->data; 841 const struct nlattr *attr; 842 843 mnl_attr_for_each_nested(attr, nested) { 844 unsigned int type = mnl_attr_get_type(attr); 845 846 if (type == DEVLINK_ATTR_DPIPE_ACTION_TYPE) { 847 if (ynl_attr_validate(yarg, attr)) 848 return MNL_CB_ERROR; 849 dst->_present.dpipe_action_type = 1; 850 dst->dpipe_action_type = mnl_attr_get_u32(attr); 851 } else if (type == DEVLINK_ATTR_DPIPE_HEADER_ID) { 852 if (ynl_attr_validate(yarg, attr)) 853 return MNL_CB_ERROR; 854 dst->_present.dpipe_header_id = 1; 855 dst->dpipe_header_id = mnl_attr_get_u32(attr); 856 } else if (type == DEVLINK_ATTR_DPIPE_HEADER_GLOBAL) { 857 if (ynl_attr_validate(yarg, attr)) 858 return MNL_CB_ERROR; 859 dst->_present.dpipe_header_global = 1; 860 dst->dpipe_header_global = mnl_attr_get_u8(attr); 861 } else if (type == DEVLINK_ATTR_DPIPE_HEADER_INDEX) { 862 if (ynl_attr_validate(yarg, attr)) 863 return MNL_CB_ERROR; 864 dst->_present.dpipe_header_index = 1; 865 dst->dpipe_header_index = mnl_attr_get_u32(attr); 866 } else if (type == DEVLINK_ATTR_DPIPE_FIELD_ID) { 867 if (ynl_attr_validate(yarg, attr)) 868 return MNL_CB_ERROR; 869 dst->_present.dpipe_field_id = 1; 870 dst->dpipe_field_id = mnl_attr_get_u32(attr); 871 } 872 } 873 874 return 0; 875} 876 877void 878devlink_dl_dpipe_action_value_free(struct devlink_dl_dpipe_action_value *obj) 879{ 880 unsigned int i; 881 882 for (i = 0; i < obj->n_dpipe_action; i++) 883 devlink_dl_dpipe_action_free(&obj->dpipe_action[i]); 884 free(obj->dpipe_action); 885 free(obj->dpipe_value); 886 free(obj->dpipe_value_mask); 887} 888 889int devlink_dl_dpipe_action_value_parse(struct ynl_parse_arg *yarg, 890 const struct nlattr *nested) 891{ 892 struct devlink_dl_dpipe_action_value *dst = yarg->data; 893 unsigned int n_dpipe_action = 0; 894 const struct nlattr *attr; 895 struct ynl_parse_arg parg; 896 int i; 897 898 parg.ys = yarg->ys; 899 900 if (dst->dpipe_action) 901 return ynl_error_parse(yarg, "attribute already present (dl-dpipe-action-value.dpipe-action)"); 902 903 mnl_attr_for_each_nested(attr, nested) { 904 unsigned int type = mnl_attr_get_type(attr); 905 906 if (type == DEVLINK_ATTR_DPIPE_ACTION) { 907 n_dpipe_action++; 908 } else if (type == DEVLINK_ATTR_DPIPE_VALUE) { 909 unsigned int len; 910 911 if (ynl_attr_validate(yarg, attr)) 912 return MNL_CB_ERROR; 913 914 len = mnl_attr_get_payload_len(attr); 915 dst->_present.dpipe_value_len = len; 916 dst->dpipe_value = malloc(len); 917 memcpy(dst->dpipe_value, mnl_attr_get_payload(attr), len); 918 } else if (type == DEVLINK_ATTR_DPIPE_VALUE_MASK) { 919 unsigned int len; 920 921 if (ynl_attr_validate(yarg, attr)) 922 return MNL_CB_ERROR; 923 924 len = mnl_attr_get_payload_len(attr); 925 dst->_present.dpipe_value_mask_len = len; 926 dst->dpipe_value_mask = malloc(len); 927 memcpy(dst->dpipe_value_mask, mnl_attr_get_payload(attr), len); 928 } else if (type == DEVLINK_ATTR_DPIPE_VALUE_MAPPING) { 929 if (ynl_attr_validate(yarg, attr)) 930 return MNL_CB_ERROR; 931 dst->_present.dpipe_value_mapping = 1; 932 dst->dpipe_value_mapping = mnl_attr_get_u32(attr); 933 } 934 } 935 936 if (n_dpipe_action) { 937 dst->dpipe_action = calloc(n_dpipe_action, sizeof(*dst->dpipe_action)); 938 dst->n_dpipe_action = n_dpipe_action; 939 i = 0; 940 parg.rsp_policy = &devlink_dl_dpipe_action_nest; 941 mnl_attr_for_each_nested(attr, nested) { 942 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_DPIPE_ACTION) { 943 parg.data = &dst->dpipe_action[i]; 944 if (devlink_dl_dpipe_action_parse(&parg, attr)) 945 return MNL_CB_ERROR; 946 i++; 947 } 948 } 949 } 950 951 return 0; 952} 953 954void devlink_dl_dpipe_field_free(struct devlink_dl_dpipe_field *obj) 955{ 956 free(obj->dpipe_field_name); 957} 958 959int devlink_dl_dpipe_field_parse(struct ynl_parse_arg *yarg, 960 const struct nlattr *nested) 961{ 962 struct devlink_dl_dpipe_field *dst = yarg->data; 963 const struct nlattr *attr; 964 965 mnl_attr_for_each_nested(attr, nested) { 966 unsigned int type = mnl_attr_get_type(attr); 967 968 if (type == DEVLINK_ATTR_DPIPE_FIELD_NAME) { 969 unsigned int len; 970 971 if (ynl_attr_validate(yarg, attr)) 972 return MNL_CB_ERROR; 973 974 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 975 dst->_present.dpipe_field_name_len = len; 976 dst->dpipe_field_name = malloc(len + 1); 977 memcpy(dst->dpipe_field_name, mnl_attr_get_str(attr), len); 978 dst->dpipe_field_name[len] = 0; 979 } else if (type == DEVLINK_ATTR_DPIPE_FIELD_ID) { 980 if (ynl_attr_validate(yarg, attr)) 981 return MNL_CB_ERROR; 982 dst->_present.dpipe_field_id = 1; 983 dst->dpipe_field_id = mnl_attr_get_u32(attr); 984 } else if (type == DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH) { 985 if (ynl_attr_validate(yarg, attr)) 986 return MNL_CB_ERROR; 987 dst->_present.dpipe_field_bitwidth = 1; 988 dst->dpipe_field_bitwidth = mnl_attr_get_u32(attr); 989 } else if (type == DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE) { 990 if (ynl_attr_validate(yarg, attr)) 991 return MNL_CB_ERROR; 992 dst->_present.dpipe_field_mapping_type = 1; 993 dst->dpipe_field_mapping_type = mnl_attr_get_u32(attr); 994 } 995 } 996 997 return 0; 998} 999 1000void devlink_dl_resource_free(struct devlink_dl_resource *obj) 1001{ 1002 free(obj->resource_name); 1003} 1004 1005int devlink_dl_resource_parse(struct ynl_parse_arg *yarg, 1006 const struct nlattr *nested) 1007{ 1008 struct devlink_dl_resource *dst = yarg->data; 1009 const struct nlattr *attr; 1010 1011 mnl_attr_for_each_nested(attr, nested) { 1012 unsigned int type = mnl_attr_get_type(attr); 1013 1014 if (type == DEVLINK_ATTR_RESOURCE_NAME) { 1015 unsigned int len; 1016 1017 if (ynl_attr_validate(yarg, attr)) 1018 return MNL_CB_ERROR; 1019 1020 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 1021 dst->_present.resource_name_len = len; 1022 dst->resource_name = malloc(len + 1); 1023 memcpy(dst->resource_name, mnl_attr_get_str(attr), len); 1024 dst->resource_name[len] = 0; 1025 } else if (type == DEVLINK_ATTR_RESOURCE_ID) { 1026 if (ynl_attr_validate(yarg, attr)) 1027 return MNL_CB_ERROR; 1028 dst->_present.resource_id = 1; 1029 dst->resource_id = mnl_attr_get_u64(attr); 1030 } else if (type == DEVLINK_ATTR_RESOURCE_SIZE) { 1031 if (ynl_attr_validate(yarg, attr)) 1032 return MNL_CB_ERROR; 1033 dst->_present.resource_size = 1; 1034 dst->resource_size = mnl_attr_get_u64(attr); 1035 } else if (type == DEVLINK_ATTR_RESOURCE_SIZE_NEW) { 1036 if (ynl_attr_validate(yarg, attr)) 1037 return MNL_CB_ERROR; 1038 dst->_present.resource_size_new = 1; 1039 dst->resource_size_new = mnl_attr_get_u64(attr); 1040 } else if (type == DEVLINK_ATTR_RESOURCE_SIZE_VALID) { 1041 if (ynl_attr_validate(yarg, attr)) 1042 return MNL_CB_ERROR; 1043 dst->_present.resource_size_valid = 1; 1044 dst->resource_size_valid = mnl_attr_get_u8(attr); 1045 } else if (type == DEVLINK_ATTR_RESOURCE_SIZE_MIN) { 1046 if (ynl_attr_validate(yarg, attr)) 1047 return MNL_CB_ERROR; 1048 dst->_present.resource_size_min = 1; 1049 dst->resource_size_min = mnl_attr_get_u64(attr); 1050 } else if (type == DEVLINK_ATTR_RESOURCE_SIZE_MAX) { 1051 if (ynl_attr_validate(yarg, attr)) 1052 return MNL_CB_ERROR; 1053 dst->_present.resource_size_max = 1; 1054 dst->resource_size_max = mnl_attr_get_u64(attr); 1055 } else if (type == DEVLINK_ATTR_RESOURCE_SIZE_GRAN) { 1056 if (ynl_attr_validate(yarg, attr)) 1057 return MNL_CB_ERROR; 1058 dst->_present.resource_size_gran = 1; 1059 dst->resource_size_gran = mnl_attr_get_u64(attr); 1060 } else if (type == DEVLINK_ATTR_RESOURCE_UNIT) { 1061 if (ynl_attr_validate(yarg, attr)) 1062 return MNL_CB_ERROR; 1063 dst->_present.resource_unit = 1; 1064 dst->resource_unit = mnl_attr_get_u8(attr); 1065 } else if (type == DEVLINK_ATTR_RESOURCE_OCC) { 1066 if (ynl_attr_validate(yarg, attr)) 1067 return MNL_CB_ERROR; 1068 dst->_present.resource_occ = 1; 1069 dst->resource_occ = mnl_attr_get_u64(attr); 1070 } 1071 } 1072 1073 return 0; 1074} 1075 1076void devlink_dl_info_version_free(struct devlink_dl_info_version *obj) 1077{ 1078 free(obj->info_version_name); 1079 free(obj->info_version_value); 1080} 1081 1082int devlink_dl_info_version_parse(struct ynl_parse_arg *yarg, 1083 const struct nlattr *nested) 1084{ 1085 struct devlink_dl_info_version *dst = yarg->data; 1086 const struct nlattr *attr; 1087 1088 mnl_attr_for_each_nested(attr, nested) { 1089 unsigned int type = mnl_attr_get_type(attr); 1090 1091 if (type == DEVLINK_ATTR_INFO_VERSION_NAME) { 1092 unsigned int len; 1093 1094 if (ynl_attr_validate(yarg, attr)) 1095 return MNL_CB_ERROR; 1096 1097 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 1098 dst->_present.info_version_name_len = len; 1099 dst->info_version_name = malloc(len + 1); 1100 memcpy(dst->info_version_name, mnl_attr_get_str(attr), len); 1101 dst->info_version_name[len] = 0; 1102 } else if (type == DEVLINK_ATTR_INFO_VERSION_VALUE) { 1103 unsigned int len; 1104 1105 if (ynl_attr_validate(yarg, attr)) 1106 return MNL_CB_ERROR; 1107 1108 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 1109 dst->_present.info_version_value_len = len; 1110 dst->info_version_value = malloc(len + 1); 1111 memcpy(dst->info_version_value, mnl_attr_get_str(attr), len); 1112 dst->info_version_value[len] = 0; 1113 } 1114 } 1115 1116 return 0; 1117} 1118 1119void devlink_dl_fmsg_free(struct devlink_dl_fmsg *obj) 1120{ 1121 free(obj->fmsg_obj_name); 1122} 1123 1124int devlink_dl_fmsg_parse(struct ynl_parse_arg *yarg, 1125 const struct nlattr *nested) 1126{ 1127 struct devlink_dl_fmsg *dst = yarg->data; 1128 const struct nlattr *attr; 1129 1130 mnl_attr_for_each_nested(attr, nested) { 1131 unsigned int type = mnl_attr_get_type(attr); 1132 1133 if (type == DEVLINK_ATTR_FMSG_OBJ_NEST_START) { 1134 if (ynl_attr_validate(yarg, attr)) 1135 return MNL_CB_ERROR; 1136 dst->_present.fmsg_obj_nest_start = 1; 1137 } else if (type == DEVLINK_ATTR_FMSG_PAIR_NEST_START) { 1138 if (ynl_attr_validate(yarg, attr)) 1139 return MNL_CB_ERROR; 1140 dst->_present.fmsg_pair_nest_start = 1; 1141 } else if (type == DEVLINK_ATTR_FMSG_ARR_NEST_START) { 1142 if (ynl_attr_validate(yarg, attr)) 1143 return MNL_CB_ERROR; 1144 dst->_present.fmsg_arr_nest_start = 1; 1145 } else if (type == DEVLINK_ATTR_FMSG_NEST_END) { 1146 if (ynl_attr_validate(yarg, attr)) 1147 return MNL_CB_ERROR; 1148 dst->_present.fmsg_nest_end = 1; 1149 } else if (type == DEVLINK_ATTR_FMSG_OBJ_NAME) { 1150 unsigned int len; 1151 1152 if (ynl_attr_validate(yarg, attr)) 1153 return MNL_CB_ERROR; 1154 1155 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 1156 dst->_present.fmsg_obj_name_len = len; 1157 dst->fmsg_obj_name = malloc(len + 1); 1158 memcpy(dst->fmsg_obj_name, mnl_attr_get_str(attr), len); 1159 dst->fmsg_obj_name[len] = 0; 1160 } 1161 } 1162 1163 return 0; 1164} 1165 1166void devlink_dl_port_function_free(struct devlink_dl_port_function *obj) 1167{ 1168 free(obj->hw_addr); 1169} 1170 1171int devlink_dl_port_function_put(struct nlmsghdr *nlh, unsigned int attr_type, 1172 struct devlink_dl_port_function *obj) 1173{ 1174 struct nlattr *nest; 1175 1176 nest = mnl_attr_nest_start(nlh, attr_type); 1177 if (obj->_present.hw_addr_len) 1178 mnl_attr_put(nlh, DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR, obj->_present.hw_addr_len, obj->hw_addr); 1179 if (obj->_present.state) 1180 mnl_attr_put_u8(nlh, DEVLINK_PORT_FN_ATTR_STATE, obj->state); 1181 if (obj->_present.opstate) 1182 mnl_attr_put_u8(nlh, DEVLINK_PORT_FN_ATTR_OPSTATE, obj->opstate); 1183 if (obj->_present.caps) 1184 mnl_attr_put(nlh, DEVLINK_PORT_FN_ATTR_CAPS, sizeof(struct nla_bitfield32), &obj->caps); 1185 mnl_attr_nest_end(nlh, nest); 1186 1187 return 0; 1188} 1189 1190void 1191devlink_dl_reload_stats_entry_free(struct devlink_dl_reload_stats_entry *obj) 1192{ 1193} 1194 1195int devlink_dl_reload_stats_entry_parse(struct ynl_parse_arg *yarg, 1196 const struct nlattr *nested) 1197{ 1198 struct devlink_dl_reload_stats_entry *dst = yarg->data; 1199 const struct nlattr *attr; 1200 1201 mnl_attr_for_each_nested(attr, nested) { 1202 unsigned int type = mnl_attr_get_type(attr); 1203 1204 if (type == DEVLINK_ATTR_RELOAD_STATS_LIMIT) { 1205 if (ynl_attr_validate(yarg, attr)) 1206 return MNL_CB_ERROR; 1207 dst->_present.reload_stats_limit = 1; 1208 dst->reload_stats_limit = mnl_attr_get_u8(attr); 1209 } else if (type == DEVLINK_ATTR_RELOAD_STATS_VALUE) { 1210 if (ynl_attr_validate(yarg, attr)) 1211 return MNL_CB_ERROR; 1212 dst->_present.reload_stats_value = 1; 1213 dst->reload_stats_value = mnl_attr_get_u32(attr); 1214 } 1215 } 1216 1217 return 0; 1218} 1219 1220void devlink_dl_reload_act_stats_free(struct devlink_dl_reload_act_stats *obj) 1221{ 1222 unsigned int i; 1223 1224 for (i = 0; i < obj->n_reload_stats_entry; i++) 1225 devlink_dl_reload_stats_entry_free(&obj->reload_stats_entry[i]); 1226 free(obj->reload_stats_entry); 1227} 1228 1229int devlink_dl_reload_act_stats_parse(struct ynl_parse_arg *yarg, 1230 const struct nlattr *nested) 1231{ 1232 struct devlink_dl_reload_act_stats *dst = yarg->data; 1233 unsigned int n_reload_stats_entry = 0; 1234 const struct nlattr *attr; 1235 struct ynl_parse_arg parg; 1236 int i; 1237 1238 parg.ys = yarg->ys; 1239 1240 if (dst->reload_stats_entry) 1241 return ynl_error_parse(yarg, "attribute already present (dl-reload-act-stats.reload-stats-entry)"); 1242 1243 mnl_attr_for_each_nested(attr, nested) { 1244 unsigned int type = mnl_attr_get_type(attr); 1245 1246 if (type == DEVLINK_ATTR_RELOAD_STATS_ENTRY) { 1247 n_reload_stats_entry++; 1248 } 1249 } 1250 1251 if (n_reload_stats_entry) { 1252 dst->reload_stats_entry = calloc(n_reload_stats_entry, sizeof(*dst->reload_stats_entry)); 1253 dst->n_reload_stats_entry = n_reload_stats_entry; 1254 i = 0; 1255 parg.rsp_policy = &devlink_dl_reload_stats_entry_nest; 1256 mnl_attr_for_each_nested(attr, nested) { 1257 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_RELOAD_STATS_ENTRY) { 1258 parg.data = &dst->reload_stats_entry[i]; 1259 if (devlink_dl_reload_stats_entry_parse(&parg, attr)) 1260 return MNL_CB_ERROR; 1261 i++; 1262 } 1263 } 1264 } 1265 1266 return 0; 1267} 1268 1269void devlink_dl_selftest_id_free(struct devlink_dl_selftest_id *obj) 1270{ 1271} 1272 1273int devlink_dl_selftest_id_put(struct nlmsghdr *nlh, unsigned int attr_type, 1274 struct devlink_dl_selftest_id *obj) 1275{ 1276 struct nlattr *nest; 1277 1278 nest = mnl_attr_nest_start(nlh, attr_type); 1279 if (obj->_present.flash) 1280 mnl_attr_put(nlh, DEVLINK_ATTR_SELFTEST_ID_FLASH, 0, NULL); 1281 mnl_attr_nest_end(nlh, nest); 1282 1283 return 0; 1284} 1285 1286void 1287devlink_dl_dpipe_table_matches_free(struct devlink_dl_dpipe_table_matches *obj) 1288{ 1289 unsigned int i; 1290 1291 for (i = 0; i < obj->n_dpipe_match; i++) 1292 devlink_dl_dpipe_match_free(&obj->dpipe_match[i]); 1293 free(obj->dpipe_match); 1294} 1295 1296int devlink_dl_dpipe_table_matches_parse(struct ynl_parse_arg *yarg, 1297 const struct nlattr *nested) 1298{ 1299 struct devlink_dl_dpipe_table_matches *dst = yarg->data; 1300 unsigned int n_dpipe_match = 0; 1301 const struct nlattr *attr; 1302 struct ynl_parse_arg parg; 1303 int i; 1304 1305 parg.ys = yarg->ys; 1306 1307 if (dst->dpipe_match) 1308 return ynl_error_parse(yarg, "attribute already present (dl-dpipe-table-matches.dpipe-match)"); 1309 1310 mnl_attr_for_each_nested(attr, nested) { 1311 unsigned int type = mnl_attr_get_type(attr); 1312 1313 if (type == DEVLINK_ATTR_DPIPE_MATCH) { 1314 n_dpipe_match++; 1315 } 1316 } 1317 1318 if (n_dpipe_match) { 1319 dst->dpipe_match = calloc(n_dpipe_match, sizeof(*dst->dpipe_match)); 1320 dst->n_dpipe_match = n_dpipe_match; 1321 i = 0; 1322 parg.rsp_policy = &devlink_dl_dpipe_match_nest; 1323 mnl_attr_for_each_nested(attr, nested) { 1324 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_DPIPE_MATCH) { 1325 parg.data = &dst->dpipe_match[i]; 1326 if (devlink_dl_dpipe_match_parse(&parg, attr)) 1327 return MNL_CB_ERROR; 1328 i++; 1329 } 1330 } 1331 } 1332 1333 return 0; 1334} 1335 1336void 1337devlink_dl_dpipe_table_actions_free(struct devlink_dl_dpipe_table_actions *obj) 1338{ 1339 unsigned int i; 1340 1341 for (i = 0; i < obj->n_dpipe_action; i++) 1342 devlink_dl_dpipe_action_free(&obj->dpipe_action[i]); 1343 free(obj->dpipe_action); 1344} 1345 1346int devlink_dl_dpipe_table_actions_parse(struct ynl_parse_arg *yarg, 1347 const struct nlattr *nested) 1348{ 1349 struct devlink_dl_dpipe_table_actions *dst = yarg->data; 1350 unsigned int n_dpipe_action = 0; 1351 const struct nlattr *attr; 1352 struct ynl_parse_arg parg; 1353 int i; 1354 1355 parg.ys = yarg->ys; 1356 1357 if (dst->dpipe_action) 1358 return ynl_error_parse(yarg, "attribute already present (dl-dpipe-table-actions.dpipe-action)"); 1359 1360 mnl_attr_for_each_nested(attr, nested) { 1361 unsigned int type = mnl_attr_get_type(attr); 1362 1363 if (type == DEVLINK_ATTR_DPIPE_ACTION) { 1364 n_dpipe_action++; 1365 } 1366 } 1367 1368 if (n_dpipe_action) { 1369 dst->dpipe_action = calloc(n_dpipe_action, sizeof(*dst->dpipe_action)); 1370 dst->n_dpipe_action = n_dpipe_action; 1371 i = 0; 1372 parg.rsp_policy = &devlink_dl_dpipe_action_nest; 1373 mnl_attr_for_each_nested(attr, nested) { 1374 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_DPIPE_ACTION) { 1375 parg.data = &dst->dpipe_action[i]; 1376 if (devlink_dl_dpipe_action_parse(&parg, attr)) 1377 return MNL_CB_ERROR; 1378 i++; 1379 } 1380 } 1381 } 1382 1383 return 0; 1384} 1385 1386void 1387devlink_dl_dpipe_entry_match_values_free(struct devlink_dl_dpipe_entry_match_values *obj) 1388{ 1389 unsigned int i; 1390 1391 for (i = 0; i < obj->n_dpipe_match_value; i++) 1392 devlink_dl_dpipe_match_value_free(&obj->dpipe_match_value[i]); 1393 free(obj->dpipe_match_value); 1394} 1395 1396int devlink_dl_dpipe_entry_match_values_parse(struct ynl_parse_arg *yarg, 1397 const struct nlattr *nested) 1398{ 1399 struct devlink_dl_dpipe_entry_match_values *dst = yarg->data; 1400 unsigned int n_dpipe_match_value = 0; 1401 const struct nlattr *attr; 1402 struct ynl_parse_arg parg; 1403 int i; 1404 1405 parg.ys = yarg->ys; 1406 1407 if (dst->dpipe_match_value) 1408 return ynl_error_parse(yarg, "attribute already present (dl-dpipe-entry-match-values.dpipe-match-value)"); 1409 1410 mnl_attr_for_each_nested(attr, nested) { 1411 unsigned int type = mnl_attr_get_type(attr); 1412 1413 if (type == DEVLINK_ATTR_DPIPE_MATCH_VALUE) { 1414 n_dpipe_match_value++; 1415 } 1416 } 1417 1418 if (n_dpipe_match_value) { 1419 dst->dpipe_match_value = calloc(n_dpipe_match_value, sizeof(*dst->dpipe_match_value)); 1420 dst->n_dpipe_match_value = n_dpipe_match_value; 1421 i = 0; 1422 parg.rsp_policy = &devlink_dl_dpipe_match_value_nest; 1423 mnl_attr_for_each_nested(attr, nested) { 1424 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_DPIPE_MATCH_VALUE) { 1425 parg.data = &dst->dpipe_match_value[i]; 1426 if (devlink_dl_dpipe_match_value_parse(&parg, attr)) 1427 return MNL_CB_ERROR; 1428 i++; 1429 } 1430 } 1431 } 1432 1433 return 0; 1434} 1435 1436void 1437devlink_dl_dpipe_entry_action_values_free(struct devlink_dl_dpipe_entry_action_values *obj) 1438{ 1439 unsigned int i; 1440 1441 for (i = 0; i < obj->n_dpipe_action_value; i++) 1442 devlink_dl_dpipe_action_value_free(&obj->dpipe_action_value[i]); 1443 free(obj->dpipe_action_value); 1444} 1445 1446int devlink_dl_dpipe_entry_action_values_parse(struct ynl_parse_arg *yarg, 1447 const struct nlattr *nested) 1448{ 1449 struct devlink_dl_dpipe_entry_action_values *dst = yarg->data; 1450 unsigned int n_dpipe_action_value = 0; 1451 const struct nlattr *attr; 1452 struct ynl_parse_arg parg; 1453 int i; 1454 1455 parg.ys = yarg->ys; 1456 1457 if (dst->dpipe_action_value) 1458 return ynl_error_parse(yarg, "attribute already present (dl-dpipe-entry-action-values.dpipe-action-value)"); 1459 1460 mnl_attr_for_each_nested(attr, nested) { 1461 unsigned int type = mnl_attr_get_type(attr); 1462 1463 if (type == DEVLINK_ATTR_DPIPE_ACTION_VALUE) { 1464 n_dpipe_action_value++; 1465 } 1466 } 1467 1468 if (n_dpipe_action_value) { 1469 dst->dpipe_action_value = calloc(n_dpipe_action_value, sizeof(*dst->dpipe_action_value)); 1470 dst->n_dpipe_action_value = n_dpipe_action_value; 1471 i = 0; 1472 parg.rsp_policy = &devlink_dl_dpipe_action_value_nest; 1473 mnl_attr_for_each_nested(attr, nested) { 1474 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_DPIPE_ACTION_VALUE) { 1475 parg.data = &dst->dpipe_action_value[i]; 1476 if (devlink_dl_dpipe_action_value_parse(&parg, attr)) 1477 return MNL_CB_ERROR; 1478 i++; 1479 } 1480 } 1481 } 1482 1483 return 0; 1484} 1485 1486void 1487devlink_dl_dpipe_header_fields_free(struct devlink_dl_dpipe_header_fields *obj) 1488{ 1489 unsigned int i; 1490 1491 for (i = 0; i < obj->n_dpipe_field; i++) 1492 devlink_dl_dpipe_field_free(&obj->dpipe_field[i]); 1493 free(obj->dpipe_field); 1494} 1495 1496int devlink_dl_dpipe_header_fields_parse(struct ynl_parse_arg *yarg, 1497 const struct nlattr *nested) 1498{ 1499 struct devlink_dl_dpipe_header_fields *dst = yarg->data; 1500 unsigned int n_dpipe_field = 0; 1501 const struct nlattr *attr; 1502 struct ynl_parse_arg parg; 1503 int i; 1504 1505 parg.ys = yarg->ys; 1506 1507 if (dst->dpipe_field) 1508 return ynl_error_parse(yarg, "attribute already present (dl-dpipe-header-fields.dpipe-field)"); 1509 1510 mnl_attr_for_each_nested(attr, nested) { 1511 unsigned int type = mnl_attr_get_type(attr); 1512 1513 if (type == DEVLINK_ATTR_DPIPE_FIELD) { 1514 n_dpipe_field++; 1515 } 1516 } 1517 1518 if (n_dpipe_field) { 1519 dst->dpipe_field = calloc(n_dpipe_field, sizeof(*dst->dpipe_field)); 1520 dst->n_dpipe_field = n_dpipe_field; 1521 i = 0; 1522 parg.rsp_policy = &devlink_dl_dpipe_field_nest; 1523 mnl_attr_for_each_nested(attr, nested) { 1524 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_DPIPE_FIELD) { 1525 parg.data = &dst->dpipe_field[i]; 1526 if (devlink_dl_dpipe_field_parse(&parg, attr)) 1527 return MNL_CB_ERROR; 1528 i++; 1529 } 1530 } 1531 } 1532 1533 return 0; 1534} 1535 1536void devlink_dl_resource_list_free(struct devlink_dl_resource_list *obj) 1537{ 1538 unsigned int i; 1539 1540 for (i = 0; i < obj->n_resource; i++) 1541 devlink_dl_resource_free(&obj->resource[i]); 1542 free(obj->resource); 1543} 1544 1545int devlink_dl_resource_list_parse(struct ynl_parse_arg *yarg, 1546 const struct nlattr *nested) 1547{ 1548 struct devlink_dl_resource_list *dst = yarg->data; 1549 unsigned int n_resource = 0; 1550 const struct nlattr *attr; 1551 struct ynl_parse_arg parg; 1552 int i; 1553 1554 parg.ys = yarg->ys; 1555 1556 if (dst->resource) 1557 return ynl_error_parse(yarg, "attribute already present (dl-resource-list.resource)"); 1558 1559 mnl_attr_for_each_nested(attr, nested) { 1560 unsigned int type = mnl_attr_get_type(attr); 1561 1562 if (type == DEVLINK_ATTR_RESOURCE) { 1563 n_resource++; 1564 } 1565 } 1566 1567 if (n_resource) { 1568 dst->resource = calloc(n_resource, sizeof(*dst->resource)); 1569 dst->n_resource = n_resource; 1570 i = 0; 1571 parg.rsp_policy = &devlink_dl_resource_nest; 1572 mnl_attr_for_each_nested(attr, nested) { 1573 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_RESOURCE) { 1574 parg.data = &dst->resource[i]; 1575 if (devlink_dl_resource_parse(&parg, attr)) 1576 return MNL_CB_ERROR; 1577 i++; 1578 } 1579 } 1580 } 1581 1582 return 0; 1583} 1584 1585void devlink_dl_reload_act_info_free(struct devlink_dl_reload_act_info *obj) 1586{ 1587 unsigned int i; 1588 1589 for (i = 0; i < obj->n_reload_action_stats; i++) 1590 devlink_dl_reload_act_stats_free(&obj->reload_action_stats[i]); 1591 free(obj->reload_action_stats); 1592} 1593 1594int devlink_dl_reload_act_info_parse(struct ynl_parse_arg *yarg, 1595 const struct nlattr *nested) 1596{ 1597 struct devlink_dl_reload_act_info *dst = yarg->data; 1598 unsigned int n_reload_action_stats = 0; 1599 const struct nlattr *attr; 1600 struct ynl_parse_arg parg; 1601 int i; 1602 1603 parg.ys = yarg->ys; 1604 1605 if (dst->reload_action_stats) 1606 return ynl_error_parse(yarg, "attribute already present (dl-reload-act-info.reload-action-stats)"); 1607 1608 mnl_attr_for_each_nested(attr, nested) { 1609 unsigned int type = mnl_attr_get_type(attr); 1610 1611 if (type == DEVLINK_ATTR_RELOAD_ACTION) { 1612 if (ynl_attr_validate(yarg, attr)) 1613 return MNL_CB_ERROR; 1614 dst->_present.reload_action = 1; 1615 dst->reload_action = mnl_attr_get_u8(attr); 1616 } else if (type == DEVLINK_ATTR_RELOAD_ACTION_STATS) { 1617 n_reload_action_stats++; 1618 } 1619 } 1620 1621 if (n_reload_action_stats) { 1622 dst->reload_action_stats = calloc(n_reload_action_stats, sizeof(*dst->reload_action_stats)); 1623 dst->n_reload_action_stats = n_reload_action_stats; 1624 i = 0; 1625 parg.rsp_policy = &devlink_dl_reload_act_stats_nest; 1626 mnl_attr_for_each_nested(attr, nested) { 1627 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_RELOAD_ACTION_STATS) { 1628 parg.data = &dst->reload_action_stats[i]; 1629 if (devlink_dl_reload_act_stats_parse(&parg, attr)) 1630 return MNL_CB_ERROR; 1631 i++; 1632 } 1633 } 1634 } 1635 1636 return 0; 1637} 1638 1639void devlink_dl_dpipe_table_free(struct devlink_dl_dpipe_table *obj) 1640{ 1641 free(obj->dpipe_table_name); 1642 devlink_dl_dpipe_table_matches_free(&obj->dpipe_table_matches); 1643 devlink_dl_dpipe_table_actions_free(&obj->dpipe_table_actions); 1644} 1645 1646int devlink_dl_dpipe_table_parse(struct ynl_parse_arg *yarg, 1647 const struct nlattr *nested) 1648{ 1649 struct devlink_dl_dpipe_table *dst = yarg->data; 1650 const struct nlattr *attr; 1651 struct ynl_parse_arg parg; 1652 1653 parg.ys = yarg->ys; 1654 1655 mnl_attr_for_each_nested(attr, nested) { 1656 unsigned int type = mnl_attr_get_type(attr); 1657 1658 if (type == DEVLINK_ATTR_DPIPE_TABLE_NAME) { 1659 unsigned int len; 1660 1661 if (ynl_attr_validate(yarg, attr)) 1662 return MNL_CB_ERROR; 1663 1664 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 1665 dst->_present.dpipe_table_name_len = len; 1666 dst->dpipe_table_name = malloc(len + 1); 1667 memcpy(dst->dpipe_table_name, mnl_attr_get_str(attr), len); 1668 dst->dpipe_table_name[len] = 0; 1669 } else if (type == DEVLINK_ATTR_DPIPE_TABLE_SIZE) { 1670 if (ynl_attr_validate(yarg, attr)) 1671 return MNL_CB_ERROR; 1672 dst->_present.dpipe_table_size = 1; 1673 dst->dpipe_table_size = mnl_attr_get_u64(attr); 1674 } else if (type == DEVLINK_ATTR_DPIPE_TABLE_MATCHES) { 1675 if (ynl_attr_validate(yarg, attr)) 1676 return MNL_CB_ERROR; 1677 dst->_present.dpipe_table_matches = 1; 1678 1679 parg.rsp_policy = &devlink_dl_dpipe_table_matches_nest; 1680 parg.data = &dst->dpipe_table_matches; 1681 if (devlink_dl_dpipe_table_matches_parse(&parg, attr)) 1682 return MNL_CB_ERROR; 1683 } else if (type == DEVLINK_ATTR_DPIPE_TABLE_ACTIONS) { 1684 if (ynl_attr_validate(yarg, attr)) 1685 return MNL_CB_ERROR; 1686 dst->_present.dpipe_table_actions = 1; 1687 1688 parg.rsp_policy = &devlink_dl_dpipe_table_actions_nest; 1689 parg.data = &dst->dpipe_table_actions; 1690 if (devlink_dl_dpipe_table_actions_parse(&parg, attr)) 1691 return MNL_CB_ERROR; 1692 } else if (type == DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED) { 1693 if (ynl_attr_validate(yarg, attr)) 1694 return MNL_CB_ERROR; 1695 dst->_present.dpipe_table_counters_enabled = 1; 1696 dst->dpipe_table_counters_enabled = mnl_attr_get_u8(attr); 1697 } else if (type == DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID) { 1698 if (ynl_attr_validate(yarg, attr)) 1699 return MNL_CB_ERROR; 1700 dst->_present.dpipe_table_resource_id = 1; 1701 dst->dpipe_table_resource_id = mnl_attr_get_u64(attr); 1702 } else if (type == DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS) { 1703 if (ynl_attr_validate(yarg, attr)) 1704 return MNL_CB_ERROR; 1705 dst->_present.dpipe_table_resource_units = 1; 1706 dst->dpipe_table_resource_units = mnl_attr_get_u64(attr); 1707 } 1708 } 1709 1710 return 0; 1711} 1712 1713void devlink_dl_dpipe_entry_free(struct devlink_dl_dpipe_entry *obj) 1714{ 1715 devlink_dl_dpipe_entry_match_values_free(&obj->dpipe_entry_match_values); 1716 devlink_dl_dpipe_entry_action_values_free(&obj->dpipe_entry_action_values); 1717} 1718 1719int devlink_dl_dpipe_entry_parse(struct ynl_parse_arg *yarg, 1720 const struct nlattr *nested) 1721{ 1722 struct devlink_dl_dpipe_entry *dst = yarg->data; 1723 const struct nlattr *attr; 1724 struct ynl_parse_arg parg; 1725 1726 parg.ys = yarg->ys; 1727 1728 mnl_attr_for_each_nested(attr, nested) { 1729 unsigned int type = mnl_attr_get_type(attr); 1730 1731 if (type == DEVLINK_ATTR_DPIPE_ENTRY_INDEX) { 1732 if (ynl_attr_validate(yarg, attr)) 1733 return MNL_CB_ERROR; 1734 dst->_present.dpipe_entry_index = 1; 1735 dst->dpipe_entry_index = mnl_attr_get_u64(attr); 1736 } else if (type == DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES) { 1737 if (ynl_attr_validate(yarg, attr)) 1738 return MNL_CB_ERROR; 1739 dst->_present.dpipe_entry_match_values = 1; 1740 1741 parg.rsp_policy = &devlink_dl_dpipe_entry_match_values_nest; 1742 parg.data = &dst->dpipe_entry_match_values; 1743 if (devlink_dl_dpipe_entry_match_values_parse(&parg, attr)) 1744 return MNL_CB_ERROR; 1745 } else if (type == DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES) { 1746 if (ynl_attr_validate(yarg, attr)) 1747 return MNL_CB_ERROR; 1748 dst->_present.dpipe_entry_action_values = 1; 1749 1750 parg.rsp_policy = &devlink_dl_dpipe_entry_action_values_nest; 1751 parg.data = &dst->dpipe_entry_action_values; 1752 if (devlink_dl_dpipe_entry_action_values_parse(&parg, attr)) 1753 return MNL_CB_ERROR; 1754 } else if (type == DEVLINK_ATTR_DPIPE_ENTRY_COUNTER) { 1755 if (ynl_attr_validate(yarg, attr)) 1756 return MNL_CB_ERROR; 1757 dst->_present.dpipe_entry_counter = 1; 1758 dst->dpipe_entry_counter = mnl_attr_get_u64(attr); 1759 } 1760 } 1761 1762 return 0; 1763} 1764 1765void devlink_dl_dpipe_header_free(struct devlink_dl_dpipe_header *obj) 1766{ 1767 free(obj->dpipe_header_name); 1768 devlink_dl_dpipe_header_fields_free(&obj->dpipe_header_fields); 1769} 1770 1771int devlink_dl_dpipe_header_parse(struct ynl_parse_arg *yarg, 1772 const struct nlattr *nested) 1773{ 1774 struct devlink_dl_dpipe_header *dst = yarg->data; 1775 const struct nlattr *attr; 1776 struct ynl_parse_arg parg; 1777 1778 parg.ys = yarg->ys; 1779 1780 mnl_attr_for_each_nested(attr, nested) { 1781 unsigned int type = mnl_attr_get_type(attr); 1782 1783 if (type == DEVLINK_ATTR_DPIPE_HEADER_NAME) { 1784 unsigned int len; 1785 1786 if (ynl_attr_validate(yarg, attr)) 1787 return MNL_CB_ERROR; 1788 1789 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 1790 dst->_present.dpipe_header_name_len = len; 1791 dst->dpipe_header_name = malloc(len + 1); 1792 memcpy(dst->dpipe_header_name, mnl_attr_get_str(attr), len); 1793 dst->dpipe_header_name[len] = 0; 1794 } else if (type == DEVLINK_ATTR_DPIPE_HEADER_ID) { 1795 if (ynl_attr_validate(yarg, attr)) 1796 return MNL_CB_ERROR; 1797 dst->_present.dpipe_header_id = 1; 1798 dst->dpipe_header_id = mnl_attr_get_u32(attr); 1799 } else if (type == DEVLINK_ATTR_DPIPE_HEADER_GLOBAL) { 1800 if (ynl_attr_validate(yarg, attr)) 1801 return MNL_CB_ERROR; 1802 dst->_present.dpipe_header_global = 1; 1803 dst->dpipe_header_global = mnl_attr_get_u8(attr); 1804 } else if (type == DEVLINK_ATTR_DPIPE_HEADER_FIELDS) { 1805 if (ynl_attr_validate(yarg, attr)) 1806 return MNL_CB_ERROR; 1807 dst->_present.dpipe_header_fields = 1; 1808 1809 parg.rsp_policy = &devlink_dl_dpipe_header_fields_nest; 1810 parg.data = &dst->dpipe_header_fields; 1811 if (devlink_dl_dpipe_header_fields_parse(&parg, attr)) 1812 return MNL_CB_ERROR; 1813 } 1814 } 1815 1816 return 0; 1817} 1818 1819void devlink_dl_reload_stats_free(struct devlink_dl_reload_stats *obj) 1820{ 1821 unsigned int i; 1822 1823 for (i = 0; i < obj->n_reload_action_info; i++) 1824 devlink_dl_reload_act_info_free(&obj->reload_action_info[i]); 1825 free(obj->reload_action_info); 1826} 1827 1828int devlink_dl_reload_stats_parse(struct ynl_parse_arg *yarg, 1829 const struct nlattr *nested) 1830{ 1831 struct devlink_dl_reload_stats *dst = yarg->data; 1832 unsigned int n_reload_action_info = 0; 1833 const struct nlattr *attr; 1834 struct ynl_parse_arg parg; 1835 int i; 1836 1837 parg.ys = yarg->ys; 1838 1839 if (dst->reload_action_info) 1840 return ynl_error_parse(yarg, "attribute already present (dl-reload-stats.reload-action-info)"); 1841 1842 mnl_attr_for_each_nested(attr, nested) { 1843 unsigned int type = mnl_attr_get_type(attr); 1844 1845 if (type == DEVLINK_ATTR_RELOAD_ACTION_INFO) { 1846 n_reload_action_info++; 1847 } 1848 } 1849 1850 if (n_reload_action_info) { 1851 dst->reload_action_info = calloc(n_reload_action_info, sizeof(*dst->reload_action_info)); 1852 dst->n_reload_action_info = n_reload_action_info; 1853 i = 0; 1854 parg.rsp_policy = &devlink_dl_reload_act_info_nest; 1855 mnl_attr_for_each_nested(attr, nested) { 1856 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_RELOAD_ACTION_INFO) { 1857 parg.data = &dst->reload_action_info[i]; 1858 if (devlink_dl_reload_act_info_parse(&parg, attr)) 1859 return MNL_CB_ERROR; 1860 i++; 1861 } 1862 } 1863 } 1864 1865 return 0; 1866} 1867 1868void devlink_dl_dpipe_tables_free(struct devlink_dl_dpipe_tables *obj) 1869{ 1870 unsigned int i; 1871 1872 for (i = 0; i < obj->n_dpipe_table; i++) 1873 devlink_dl_dpipe_table_free(&obj->dpipe_table[i]); 1874 free(obj->dpipe_table); 1875} 1876 1877int devlink_dl_dpipe_tables_parse(struct ynl_parse_arg *yarg, 1878 const struct nlattr *nested) 1879{ 1880 struct devlink_dl_dpipe_tables *dst = yarg->data; 1881 unsigned int n_dpipe_table = 0; 1882 const struct nlattr *attr; 1883 struct ynl_parse_arg parg; 1884 int i; 1885 1886 parg.ys = yarg->ys; 1887 1888 if (dst->dpipe_table) 1889 return ynl_error_parse(yarg, "attribute already present (dl-dpipe-tables.dpipe-table)"); 1890 1891 mnl_attr_for_each_nested(attr, nested) { 1892 unsigned int type = mnl_attr_get_type(attr); 1893 1894 if (type == DEVLINK_ATTR_DPIPE_TABLE) { 1895 n_dpipe_table++; 1896 } 1897 } 1898 1899 if (n_dpipe_table) { 1900 dst->dpipe_table = calloc(n_dpipe_table, sizeof(*dst->dpipe_table)); 1901 dst->n_dpipe_table = n_dpipe_table; 1902 i = 0; 1903 parg.rsp_policy = &devlink_dl_dpipe_table_nest; 1904 mnl_attr_for_each_nested(attr, nested) { 1905 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_DPIPE_TABLE) { 1906 parg.data = &dst->dpipe_table[i]; 1907 if (devlink_dl_dpipe_table_parse(&parg, attr)) 1908 return MNL_CB_ERROR; 1909 i++; 1910 } 1911 } 1912 } 1913 1914 return 0; 1915} 1916 1917void devlink_dl_dpipe_entries_free(struct devlink_dl_dpipe_entries *obj) 1918{ 1919 unsigned int i; 1920 1921 for (i = 0; i < obj->n_dpipe_entry; i++) 1922 devlink_dl_dpipe_entry_free(&obj->dpipe_entry[i]); 1923 free(obj->dpipe_entry); 1924} 1925 1926int devlink_dl_dpipe_entries_parse(struct ynl_parse_arg *yarg, 1927 const struct nlattr *nested) 1928{ 1929 struct devlink_dl_dpipe_entries *dst = yarg->data; 1930 unsigned int n_dpipe_entry = 0; 1931 const struct nlattr *attr; 1932 struct ynl_parse_arg parg; 1933 int i; 1934 1935 parg.ys = yarg->ys; 1936 1937 if (dst->dpipe_entry) 1938 return ynl_error_parse(yarg, "attribute already present (dl-dpipe-entries.dpipe-entry)"); 1939 1940 mnl_attr_for_each_nested(attr, nested) { 1941 unsigned int type = mnl_attr_get_type(attr); 1942 1943 if (type == DEVLINK_ATTR_DPIPE_ENTRY) { 1944 n_dpipe_entry++; 1945 } 1946 } 1947 1948 if (n_dpipe_entry) { 1949 dst->dpipe_entry = calloc(n_dpipe_entry, sizeof(*dst->dpipe_entry)); 1950 dst->n_dpipe_entry = n_dpipe_entry; 1951 i = 0; 1952 parg.rsp_policy = &devlink_dl_dpipe_entry_nest; 1953 mnl_attr_for_each_nested(attr, nested) { 1954 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_DPIPE_ENTRY) { 1955 parg.data = &dst->dpipe_entry[i]; 1956 if (devlink_dl_dpipe_entry_parse(&parg, attr)) 1957 return MNL_CB_ERROR; 1958 i++; 1959 } 1960 } 1961 } 1962 1963 return 0; 1964} 1965 1966void devlink_dl_dpipe_headers_free(struct devlink_dl_dpipe_headers *obj) 1967{ 1968 unsigned int i; 1969 1970 for (i = 0; i < obj->n_dpipe_header; i++) 1971 devlink_dl_dpipe_header_free(&obj->dpipe_header[i]); 1972 free(obj->dpipe_header); 1973} 1974 1975int devlink_dl_dpipe_headers_parse(struct ynl_parse_arg *yarg, 1976 const struct nlattr *nested) 1977{ 1978 struct devlink_dl_dpipe_headers *dst = yarg->data; 1979 unsigned int n_dpipe_header = 0; 1980 const struct nlattr *attr; 1981 struct ynl_parse_arg parg; 1982 int i; 1983 1984 parg.ys = yarg->ys; 1985 1986 if (dst->dpipe_header) 1987 return ynl_error_parse(yarg, "attribute already present (dl-dpipe-headers.dpipe-header)"); 1988 1989 mnl_attr_for_each_nested(attr, nested) { 1990 unsigned int type = mnl_attr_get_type(attr); 1991 1992 if (type == DEVLINK_ATTR_DPIPE_HEADER) { 1993 n_dpipe_header++; 1994 } 1995 } 1996 1997 if (n_dpipe_header) { 1998 dst->dpipe_header = calloc(n_dpipe_header, sizeof(*dst->dpipe_header)); 1999 dst->n_dpipe_header = n_dpipe_header; 2000 i = 0; 2001 parg.rsp_policy = &devlink_dl_dpipe_header_nest; 2002 mnl_attr_for_each_nested(attr, nested) { 2003 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_DPIPE_HEADER) { 2004 parg.data = &dst->dpipe_header[i]; 2005 if (devlink_dl_dpipe_header_parse(&parg, attr)) 2006 return MNL_CB_ERROR; 2007 i++; 2008 } 2009 } 2010 } 2011 2012 return 0; 2013} 2014 2015void devlink_dl_dev_stats_free(struct devlink_dl_dev_stats *obj) 2016{ 2017 devlink_dl_reload_stats_free(&obj->reload_stats); 2018 devlink_dl_reload_stats_free(&obj->remote_reload_stats); 2019} 2020 2021int devlink_dl_dev_stats_parse(struct ynl_parse_arg *yarg, 2022 const struct nlattr *nested) 2023{ 2024 struct devlink_dl_dev_stats *dst = yarg->data; 2025 const struct nlattr *attr; 2026 struct ynl_parse_arg parg; 2027 2028 parg.ys = yarg->ys; 2029 2030 mnl_attr_for_each_nested(attr, nested) { 2031 unsigned int type = mnl_attr_get_type(attr); 2032 2033 if (type == DEVLINK_ATTR_RELOAD_STATS) { 2034 if (ynl_attr_validate(yarg, attr)) 2035 return MNL_CB_ERROR; 2036 dst->_present.reload_stats = 1; 2037 2038 parg.rsp_policy = &devlink_dl_reload_stats_nest; 2039 parg.data = &dst->reload_stats; 2040 if (devlink_dl_reload_stats_parse(&parg, attr)) 2041 return MNL_CB_ERROR; 2042 } else if (type == DEVLINK_ATTR_REMOTE_RELOAD_STATS) { 2043 if (ynl_attr_validate(yarg, attr)) 2044 return MNL_CB_ERROR; 2045 dst->_present.remote_reload_stats = 1; 2046 2047 parg.rsp_policy = &devlink_dl_reload_stats_nest; 2048 parg.data = &dst->remote_reload_stats; 2049 if (devlink_dl_reload_stats_parse(&parg, attr)) 2050 return MNL_CB_ERROR; 2051 } 2052 } 2053 2054 return 0; 2055} 2056 2057/* ============== DEVLINK_CMD_GET ============== */ 2058/* DEVLINK_CMD_GET - do */ 2059void devlink_get_req_free(struct devlink_get_req *req) 2060{ 2061 free(req->bus_name); 2062 free(req->dev_name); 2063 free(req); 2064} 2065 2066void devlink_get_rsp_free(struct devlink_get_rsp *rsp) 2067{ 2068 free(rsp->bus_name); 2069 free(rsp->dev_name); 2070 devlink_dl_dev_stats_free(&rsp->dev_stats); 2071 free(rsp); 2072} 2073 2074int devlink_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 2075{ 2076 struct ynl_parse_arg *yarg = data; 2077 struct devlink_get_rsp *dst; 2078 const struct nlattr *attr; 2079 struct ynl_parse_arg parg; 2080 2081 dst = yarg->data; 2082 parg.ys = yarg->ys; 2083 2084 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 2085 unsigned int type = mnl_attr_get_type(attr); 2086 2087 if (type == DEVLINK_ATTR_BUS_NAME) { 2088 unsigned int len; 2089 2090 if (ynl_attr_validate(yarg, attr)) 2091 return MNL_CB_ERROR; 2092 2093 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2094 dst->_present.bus_name_len = len; 2095 dst->bus_name = malloc(len + 1); 2096 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 2097 dst->bus_name[len] = 0; 2098 } else if (type == DEVLINK_ATTR_DEV_NAME) { 2099 unsigned int len; 2100 2101 if (ynl_attr_validate(yarg, attr)) 2102 return MNL_CB_ERROR; 2103 2104 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2105 dst->_present.dev_name_len = len; 2106 dst->dev_name = malloc(len + 1); 2107 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 2108 dst->dev_name[len] = 0; 2109 } else if (type == DEVLINK_ATTR_RELOAD_FAILED) { 2110 if (ynl_attr_validate(yarg, attr)) 2111 return MNL_CB_ERROR; 2112 dst->_present.reload_failed = 1; 2113 dst->reload_failed = mnl_attr_get_u8(attr); 2114 } else if (type == DEVLINK_ATTR_DEV_STATS) { 2115 if (ynl_attr_validate(yarg, attr)) 2116 return MNL_CB_ERROR; 2117 dst->_present.dev_stats = 1; 2118 2119 parg.rsp_policy = &devlink_dl_dev_stats_nest; 2120 parg.data = &dst->dev_stats; 2121 if (devlink_dl_dev_stats_parse(&parg, attr)) 2122 return MNL_CB_ERROR; 2123 } 2124 } 2125 2126 return MNL_CB_OK; 2127} 2128 2129struct devlink_get_rsp * 2130devlink_get(struct ynl_sock *ys, struct devlink_get_req *req) 2131{ 2132 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 2133 struct devlink_get_rsp *rsp; 2134 struct nlmsghdr *nlh; 2135 int err; 2136 2137 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_GET, 1); 2138 ys->req_policy = &devlink_nest; 2139 yrs.yarg.rsp_policy = &devlink_nest; 2140 2141 if (req->_present.bus_name_len) 2142 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2143 if (req->_present.dev_name_len) 2144 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2145 2146 rsp = calloc(1, sizeof(*rsp)); 2147 yrs.yarg.data = rsp; 2148 yrs.cb = devlink_get_rsp_parse; 2149 yrs.rsp_cmd = 3; 2150 2151 err = ynl_exec(ys, nlh, &yrs); 2152 if (err < 0) 2153 goto err_free; 2154 2155 return rsp; 2156 2157err_free: 2158 devlink_get_rsp_free(rsp); 2159 return NULL; 2160} 2161 2162/* DEVLINK_CMD_GET - dump */ 2163void devlink_get_list_free(struct devlink_get_list *rsp) 2164{ 2165 struct devlink_get_list *next = rsp; 2166 2167 while ((void *)next != YNL_LIST_END) { 2168 rsp = next; 2169 next = rsp->next; 2170 2171 free(rsp->obj.bus_name); 2172 free(rsp->obj.dev_name); 2173 devlink_dl_dev_stats_free(&rsp->obj.dev_stats); 2174 free(rsp); 2175 } 2176} 2177 2178struct devlink_get_list *devlink_get_dump(struct ynl_sock *ys) 2179{ 2180 struct ynl_dump_state yds = {}; 2181 struct nlmsghdr *nlh; 2182 int err; 2183 2184 yds.ys = ys; 2185 yds.alloc_sz = sizeof(struct devlink_get_list); 2186 yds.cb = devlink_get_rsp_parse; 2187 yds.rsp_cmd = 3; 2188 yds.rsp_policy = &devlink_nest; 2189 2190 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_GET, 1); 2191 2192 err = ynl_exec_dump(ys, nlh, &yds); 2193 if (err < 0) 2194 goto free_list; 2195 2196 return yds.first; 2197 2198free_list: 2199 devlink_get_list_free(yds.first); 2200 return NULL; 2201} 2202 2203/* ============== DEVLINK_CMD_PORT_GET ============== */ 2204/* DEVLINK_CMD_PORT_GET - do */ 2205void devlink_port_get_req_free(struct devlink_port_get_req *req) 2206{ 2207 free(req->bus_name); 2208 free(req->dev_name); 2209 free(req); 2210} 2211 2212void devlink_port_get_rsp_free(struct devlink_port_get_rsp *rsp) 2213{ 2214 free(rsp->bus_name); 2215 free(rsp->dev_name); 2216 free(rsp); 2217} 2218 2219int devlink_port_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 2220{ 2221 struct ynl_parse_arg *yarg = data; 2222 struct devlink_port_get_rsp *dst; 2223 const struct nlattr *attr; 2224 2225 dst = yarg->data; 2226 2227 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 2228 unsigned int type = mnl_attr_get_type(attr); 2229 2230 if (type == DEVLINK_ATTR_BUS_NAME) { 2231 unsigned int len; 2232 2233 if (ynl_attr_validate(yarg, attr)) 2234 return MNL_CB_ERROR; 2235 2236 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2237 dst->_present.bus_name_len = len; 2238 dst->bus_name = malloc(len + 1); 2239 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 2240 dst->bus_name[len] = 0; 2241 } else if (type == DEVLINK_ATTR_DEV_NAME) { 2242 unsigned int len; 2243 2244 if (ynl_attr_validate(yarg, attr)) 2245 return MNL_CB_ERROR; 2246 2247 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2248 dst->_present.dev_name_len = len; 2249 dst->dev_name = malloc(len + 1); 2250 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 2251 dst->dev_name[len] = 0; 2252 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 2253 if (ynl_attr_validate(yarg, attr)) 2254 return MNL_CB_ERROR; 2255 dst->_present.port_index = 1; 2256 dst->port_index = mnl_attr_get_u32(attr); 2257 } 2258 } 2259 2260 return MNL_CB_OK; 2261} 2262 2263struct devlink_port_get_rsp * 2264devlink_port_get(struct ynl_sock *ys, struct devlink_port_get_req *req) 2265{ 2266 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 2267 struct devlink_port_get_rsp *rsp; 2268 struct nlmsghdr *nlh; 2269 int err; 2270 2271 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_GET, 1); 2272 ys->req_policy = &devlink_nest; 2273 yrs.yarg.rsp_policy = &devlink_nest; 2274 2275 if (req->_present.bus_name_len) 2276 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2277 if (req->_present.dev_name_len) 2278 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2279 if (req->_present.port_index) 2280 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 2281 2282 rsp = calloc(1, sizeof(*rsp)); 2283 yrs.yarg.data = rsp; 2284 yrs.cb = devlink_port_get_rsp_parse; 2285 yrs.rsp_cmd = 7; 2286 2287 err = ynl_exec(ys, nlh, &yrs); 2288 if (err < 0) 2289 goto err_free; 2290 2291 return rsp; 2292 2293err_free: 2294 devlink_port_get_rsp_free(rsp); 2295 return NULL; 2296} 2297 2298/* DEVLINK_CMD_PORT_GET - dump */ 2299int devlink_port_get_rsp_dump_parse(const struct nlmsghdr *nlh, void *data) 2300{ 2301 struct devlink_port_get_rsp_dump *dst; 2302 struct ynl_parse_arg *yarg = data; 2303 const struct nlattr *attr; 2304 2305 dst = yarg->data; 2306 2307 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 2308 unsigned int type = mnl_attr_get_type(attr); 2309 2310 if (type == DEVLINK_ATTR_BUS_NAME) { 2311 unsigned int len; 2312 2313 if (ynl_attr_validate(yarg, attr)) 2314 return MNL_CB_ERROR; 2315 2316 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2317 dst->_present.bus_name_len = len; 2318 dst->bus_name = malloc(len + 1); 2319 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 2320 dst->bus_name[len] = 0; 2321 } else if (type == DEVLINK_ATTR_DEV_NAME) { 2322 unsigned int len; 2323 2324 if (ynl_attr_validate(yarg, attr)) 2325 return MNL_CB_ERROR; 2326 2327 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2328 dst->_present.dev_name_len = len; 2329 dst->dev_name = malloc(len + 1); 2330 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 2331 dst->dev_name[len] = 0; 2332 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 2333 if (ynl_attr_validate(yarg, attr)) 2334 return MNL_CB_ERROR; 2335 dst->_present.port_index = 1; 2336 dst->port_index = mnl_attr_get_u32(attr); 2337 } 2338 } 2339 2340 return MNL_CB_OK; 2341} 2342 2343void devlink_port_get_rsp_list_free(struct devlink_port_get_rsp_list *rsp) 2344{ 2345 struct devlink_port_get_rsp_list *next = rsp; 2346 2347 while ((void *)next != YNL_LIST_END) { 2348 rsp = next; 2349 next = rsp->next; 2350 2351 free(rsp->obj.bus_name); 2352 free(rsp->obj.dev_name); 2353 free(rsp); 2354 } 2355} 2356 2357struct devlink_port_get_rsp_list * 2358devlink_port_get_dump(struct ynl_sock *ys, 2359 struct devlink_port_get_req_dump *req) 2360{ 2361 struct ynl_dump_state yds = {}; 2362 struct nlmsghdr *nlh; 2363 int err; 2364 2365 yds.ys = ys; 2366 yds.alloc_sz = sizeof(struct devlink_port_get_rsp_list); 2367 yds.cb = devlink_port_get_rsp_dump_parse; 2368 yds.rsp_cmd = 7; 2369 yds.rsp_policy = &devlink_nest; 2370 2371 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_PORT_GET, 1); 2372 ys->req_policy = &devlink_nest; 2373 2374 if (req->_present.bus_name_len) 2375 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2376 if (req->_present.dev_name_len) 2377 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2378 2379 err = ynl_exec_dump(ys, nlh, &yds); 2380 if (err < 0) 2381 goto free_list; 2382 2383 return yds.first; 2384 2385free_list: 2386 devlink_port_get_rsp_list_free(yds.first); 2387 return NULL; 2388} 2389 2390/* ============== DEVLINK_CMD_PORT_SET ============== */ 2391/* DEVLINK_CMD_PORT_SET - do */ 2392void devlink_port_set_req_free(struct devlink_port_set_req *req) 2393{ 2394 free(req->bus_name); 2395 free(req->dev_name); 2396 devlink_dl_port_function_free(&req->port_function); 2397 free(req); 2398} 2399 2400int devlink_port_set(struct ynl_sock *ys, struct devlink_port_set_req *req) 2401{ 2402 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 2403 struct nlmsghdr *nlh; 2404 int err; 2405 2406 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_SET, 1); 2407 ys->req_policy = &devlink_nest; 2408 2409 if (req->_present.bus_name_len) 2410 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2411 if (req->_present.dev_name_len) 2412 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2413 if (req->_present.port_index) 2414 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 2415 if (req->_present.port_type) 2416 mnl_attr_put_u16(nlh, DEVLINK_ATTR_PORT_TYPE, req->port_type); 2417 if (req->_present.port_function) 2418 devlink_dl_port_function_put(nlh, DEVLINK_ATTR_PORT_FUNCTION, &req->port_function); 2419 2420 err = ynl_exec(ys, nlh, &yrs); 2421 if (err < 0) 2422 return -1; 2423 2424 return 0; 2425} 2426 2427/* ============== DEVLINK_CMD_PORT_NEW ============== */ 2428/* DEVLINK_CMD_PORT_NEW - do */ 2429void devlink_port_new_req_free(struct devlink_port_new_req *req) 2430{ 2431 free(req->bus_name); 2432 free(req->dev_name); 2433 free(req); 2434} 2435 2436void devlink_port_new_rsp_free(struct devlink_port_new_rsp *rsp) 2437{ 2438 free(rsp->bus_name); 2439 free(rsp->dev_name); 2440 free(rsp); 2441} 2442 2443int devlink_port_new_rsp_parse(const struct nlmsghdr *nlh, void *data) 2444{ 2445 struct ynl_parse_arg *yarg = data; 2446 struct devlink_port_new_rsp *dst; 2447 const struct nlattr *attr; 2448 2449 dst = yarg->data; 2450 2451 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 2452 unsigned int type = mnl_attr_get_type(attr); 2453 2454 if (type == DEVLINK_ATTR_BUS_NAME) { 2455 unsigned int len; 2456 2457 if (ynl_attr_validate(yarg, attr)) 2458 return MNL_CB_ERROR; 2459 2460 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2461 dst->_present.bus_name_len = len; 2462 dst->bus_name = malloc(len + 1); 2463 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 2464 dst->bus_name[len] = 0; 2465 } else if (type == DEVLINK_ATTR_DEV_NAME) { 2466 unsigned int len; 2467 2468 if (ynl_attr_validate(yarg, attr)) 2469 return MNL_CB_ERROR; 2470 2471 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2472 dst->_present.dev_name_len = len; 2473 dst->dev_name = malloc(len + 1); 2474 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 2475 dst->dev_name[len] = 0; 2476 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 2477 if (ynl_attr_validate(yarg, attr)) 2478 return MNL_CB_ERROR; 2479 dst->_present.port_index = 1; 2480 dst->port_index = mnl_attr_get_u32(attr); 2481 } 2482 } 2483 2484 return MNL_CB_OK; 2485} 2486 2487struct devlink_port_new_rsp * 2488devlink_port_new(struct ynl_sock *ys, struct devlink_port_new_req *req) 2489{ 2490 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 2491 struct devlink_port_new_rsp *rsp; 2492 struct nlmsghdr *nlh; 2493 int err; 2494 2495 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_NEW, 1); 2496 ys->req_policy = &devlink_nest; 2497 yrs.yarg.rsp_policy = &devlink_nest; 2498 2499 if (req->_present.bus_name_len) 2500 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2501 if (req->_present.dev_name_len) 2502 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2503 if (req->_present.port_index) 2504 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 2505 if (req->_present.port_flavour) 2506 mnl_attr_put_u16(nlh, DEVLINK_ATTR_PORT_FLAVOUR, req->port_flavour); 2507 if (req->_present.port_pci_pf_number) 2508 mnl_attr_put_u16(nlh, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, req->port_pci_pf_number); 2509 if (req->_present.port_pci_sf_number) 2510 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_PCI_SF_NUMBER, req->port_pci_sf_number); 2511 if (req->_present.port_controller_number) 2512 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_CONTROLLER_NUMBER, req->port_controller_number); 2513 2514 rsp = calloc(1, sizeof(*rsp)); 2515 yrs.yarg.data = rsp; 2516 yrs.cb = devlink_port_new_rsp_parse; 2517 yrs.rsp_cmd = DEVLINK_CMD_PORT_NEW; 2518 2519 err = ynl_exec(ys, nlh, &yrs); 2520 if (err < 0) 2521 goto err_free; 2522 2523 return rsp; 2524 2525err_free: 2526 devlink_port_new_rsp_free(rsp); 2527 return NULL; 2528} 2529 2530/* ============== DEVLINK_CMD_PORT_DEL ============== */ 2531/* DEVLINK_CMD_PORT_DEL - do */ 2532void devlink_port_del_req_free(struct devlink_port_del_req *req) 2533{ 2534 free(req->bus_name); 2535 free(req->dev_name); 2536 free(req); 2537} 2538 2539int devlink_port_del(struct ynl_sock *ys, struct devlink_port_del_req *req) 2540{ 2541 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 2542 struct nlmsghdr *nlh; 2543 int err; 2544 2545 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_DEL, 1); 2546 ys->req_policy = &devlink_nest; 2547 2548 if (req->_present.bus_name_len) 2549 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2550 if (req->_present.dev_name_len) 2551 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2552 if (req->_present.port_index) 2553 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 2554 2555 err = ynl_exec(ys, nlh, &yrs); 2556 if (err < 0) 2557 return -1; 2558 2559 return 0; 2560} 2561 2562/* ============== DEVLINK_CMD_PORT_SPLIT ============== */ 2563/* DEVLINK_CMD_PORT_SPLIT - do */ 2564void devlink_port_split_req_free(struct devlink_port_split_req *req) 2565{ 2566 free(req->bus_name); 2567 free(req->dev_name); 2568 free(req); 2569} 2570 2571int devlink_port_split(struct ynl_sock *ys, struct devlink_port_split_req *req) 2572{ 2573 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 2574 struct nlmsghdr *nlh; 2575 int err; 2576 2577 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_SPLIT, 1); 2578 ys->req_policy = &devlink_nest; 2579 2580 if (req->_present.bus_name_len) 2581 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2582 if (req->_present.dev_name_len) 2583 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2584 if (req->_present.port_index) 2585 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 2586 if (req->_present.port_split_count) 2587 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_SPLIT_COUNT, req->port_split_count); 2588 2589 err = ynl_exec(ys, nlh, &yrs); 2590 if (err < 0) 2591 return -1; 2592 2593 return 0; 2594} 2595 2596/* ============== DEVLINK_CMD_PORT_UNSPLIT ============== */ 2597/* DEVLINK_CMD_PORT_UNSPLIT - do */ 2598void devlink_port_unsplit_req_free(struct devlink_port_unsplit_req *req) 2599{ 2600 free(req->bus_name); 2601 free(req->dev_name); 2602 free(req); 2603} 2604 2605int devlink_port_unsplit(struct ynl_sock *ys, 2606 struct devlink_port_unsplit_req *req) 2607{ 2608 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 2609 struct nlmsghdr *nlh; 2610 int err; 2611 2612 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_UNSPLIT, 1); 2613 ys->req_policy = &devlink_nest; 2614 2615 if (req->_present.bus_name_len) 2616 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2617 if (req->_present.dev_name_len) 2618 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2619 if (req->_present.port_index) 2620 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 2621 2622 err = ynl_exec(ys, nlh, &yrs); 2623 if (err < 0) 2624 return -1; 2625 2626 return 0; 2627} 2628 2629/* ============== DEVLINK_CMD_SB_GET ============== */ 2630/* DEVLINK_CMD_SB_GET - do */ 2631void devlink_sb_get_req_free(struct devlink_sb_get_req *req) 2632{ 2633 free(req->bus_name); 2634 free(req->dev_name); 2635 free(req); 2636} 2637 2638void devlink_sb_get_rsp_free(struct devlink_sb_get_rsp *rsp) 2639{ 2640 free(rsp->bus_name); 2641 free(rsp->dev_name); 2642 free(rsp); 2643} 2644 2645int devlink_sb_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 2646{ 2647 struct ynl_parse_arg *yarg = data; 2648 struct devlink_sb_get_rsp *dst; 2649 const struct nlattr *attr; 2650 2651 dst = yarg->data; 2652 2653 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 2654 unsigned int type = mnl_attr_get_type(attr); 2655 2656 if (type == DEVLINK_ATTR_BUS_NAME) { 2657 unsigned int len; 2658 2659 if (ynl_attr_validate(yarg, attr)) 2660 return MNL_CB_ERROR; 2661 2662 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2663 dst->_present.bus_name_len = len; 2664 dst->bus_name = malloc(len + 1); 2665 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 2666 dst->bus_name[len] = 0; 2667 } else if (type == DEVLINK_ATTR_DEV_NAME) { 2668 unsigned int len; 2669 2670 if (ynl_attr_validate(yarg, attr)) 2671 return MNL_CB_ERROR; 2672 2673 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2674 dst->_present.dev_name_len = len; 2675 dst->dev_name = malloc(len + 1); 2676 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 2677 dst->dev_name[len] = 0; 2678 } else if (type == DEVLINK_ATTR_SB_INDEX) { 2679 if (ynl_attr_validate(yarg, attr)) 2680 return MNL_CB_ERROR; 2681 dst->_present.sb_index = 1; 2682 dst->sb_index = mnl_attr_get_u32(attr); 2683 } 2684 } 2685 2686 return MNL_CB_OK; 2687} 2688 2689struct devlink_sb_get_rsp * 2690devlink_sb_get(struct ynl_sock *ys, struct devlink_sb_get_req *req) 2691{ 2692 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 2693 struct devlink_sb_get_rsp *rsp; 2694 struct nlmsghdr *nlh; 2695 int err; 2696 2697 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_GET, 1); 2698 ys->req_policy = &devlink_nest; 2699 yrs.yarg.rsp_policy = &devlink_nest; 2700 2701 if (req->_present.bus_name_len) 2702 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2703 if (req->_present.dev_name_len) 2704 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2705 if (req->_present.sb_index) 2706 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); 2707 2708 rsp = calloc(1, sizeof(*rsp)); 2709 yrs.yarg.data = rsp; 2710 yrs.cb = devlink_sb_get_rsp_parse; 2711 yrs.rsp_cmd = 13; 2712 2713 err = ynl_exec(ys, nlh, &yrs); 2714 if (err < 0) 2715 goto err_free; 2716 2717 return rsp; 2718 2719err_free: 2720 devlink_sb_get_rsp_free(rsp); 2721 return NULL; 2722} 2723 2724/* DEVLINK_CMD_SB_GET - dump */ 2725void devlink_sb_get_list_free(struct devlink_sb_get_list *rsp) 2726{ 2727 struct devlink_sb_get_list *next = rsp; 2728 2729 while ((void *)next != YNL_LIST_END) { 2730 rsp = next; 2731 next = rsp->next; 2732 2733 free(rsp->obj.bus_name); 2734 free(rsp->obj.dev_name); 2735 free(rsp); 2736 } 2737} 2738 2739struct devlink_sb_get_list * 2740devlink_sb_get_dump(struct ynl_sock *ys, struct devlink_sb_get_req_dump *req) 2741{ 2742 struct ynl_dump_state yds = {}; 2743 struct nlmsghdr *nlh; 2744 int err; 2745 2746 yds.ys = ys; 2747 yds.alloc_sz = sizeof(struct devlink_sb_get_list); 2748 yds.cb = devlink_sb_get_rsp_parse; 2749 yds.rsp_cmd = 13; 2750 yds.rsp_policy = &devlink_nest; 2751 2752 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_GET, 1); 2753 ys->req_policy = &devlink_nest; 2754 2755 if (req->_present.bus_name_len) 2756 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2757 if (req->_present.dev_name_len) 2758 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2759 2760 err = ynl_exec_dump(ys, nlh, &yds); 2761 if (err < 0) 2762 goto free_list; 2763 2764 return yds.first; 2765 2766free_list: 2767 devlink_sb_get_list_free(yds.first); 2768 return NULL; 2769} 2770 2771/* ============== DEVLINK_CMD_SB_POOL_GET ============== */ 2772/* DEVLINK_CMD_SB_POOL_GET - do */ 2773void devlink_sb_pool_get_req_free(struct devlink_sb_pool_get_req *req) 2774{ 2775 free(req->bus_name); 2776 free(req->dev_name); 2777 free(req); 2778} 2779 2780void devlink_sb_pool_get_rsp_free(struct devlink_sb_pool_get_rsp *rsp) 2781{ 2782 free(rsp->bus_name); 2783 free(rsp->dev_name); 2784 free(rsp); 2785} 2786 2787int devlink_sb_pool_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 2788{ 2789 struct devlink_sb_pool_get_rsp *dst; 2790 struct ynl_parse_arg *yarg = data; 2791 const struct nlattr *attr; 2792 2793 dst = yarg->data; 2794 2795 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 2796 unsigned int type = mnl_attr_get_type(attr); 2797 2798 if (type == DEVLINK_ATTR_BUS_NAME) { 2799 unsigned int len; 2800 2801 if (ynl_attr_validate(yarg, attr)) 2802 return MNL_CB_ERROR; 2803 2804 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2805 dst->_present.bus_name_len = len; 2806 dst->bus_name = malloc(len + 1); 2807 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 2808 dst->bus_name[len] = 0; 2809 } else if (type == DEVLINK_ATTR_DEV_NAME) { 2810 unsigned int len; 2811 2812 if (ynl_attr_validate(yarg, attr)) 2813 return MNL_CB_ERROR; 2814 2815 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2816 dst->_present.dev_name_len = len; 2817 dst->dev_name = malloc(len + 1); 2818 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 2819 dst->dev_name[len] = 0; 2820 } else if (type == DEVLINK_ATTR_SB_INDEX) { 2821 if (ynl_attr_validate(yarg, attr)) 2822 return MNL_CB_ERROR; 2823 dst->_present.sb_index = 1; 2824 dst->sb_index = mnl_attr_get_u32(attr); 2825 } else if (type == DEVLINK_ATTR_SB_POOL_INDEX) { 2826 if (ynl_attr_validate(yarg, attr)) 2827 return MNL_CB_ERROR; 2828 dst->_present.sb_pool_index = 1; 2829 dst->sb_pool_index = mnl_attr_get_u16(attr); 2830 } 2831 } 2832 2833 return MNL_CB_OK; 2834} 2835 2836struct devlink_sb_pool_get_rsp * 2837devlink_sb_pool_get(struct ynl_sock *ys, struct devlink_sb_pool_get_req *req) 2838{ 2839 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 2840 struct devlink_sb_pool_get_rsp *rsp; 2841 struct nlmsghdr *nlh; 2842 int err; 2843 2844 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_POOL_GET, 1); 2845 ys->req_policy = &devlink_nest; 2846 yrs.yarg.rsp_policy = &devlink_nest; 2847 2848 if (req->_present.bus_name_len) 2849 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2850 if (req->_present.dev_name_len) 2851 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2852 if (req->_present.sb_index) 2853 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); 2854 if (req->_present.sb_pool_index) 2855 mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req->sb_pool_index); 2856 2857 rsp = calloc(1, sizeof(*rsp)); 2858 yrs.yarg.data = rsp; 2859 yrs.cb = devlink_sb_pool_get_rsp_parse; 2860 yrs.rsp_cmd = 17; 2861 2862 err = ynl_exec(ys, nlh, &yrs); 2863 if (err < 0) 2864 goto err_free; 2865 2866 return rsp; 2867 2868err_free: 2869 devlink_sb_pool_get_rsp_free(rsp); 2870 return NULL; 2871} 2872 2873/* DEVLINK_CMD_SB_POOL_GET - dump */ 2874void devlink_sb_pool_get_list_free(struct devlink_sb_pool_get_list *rsp) 2875{ 2876 struct devlink_sb_pool_get_list *next = rsp; 2877 2878 while ((void *)next != YNL_LIST_END) { 2879 rsp = next; 2880 next = rsp->next; 2881 2882 free(rsp->obj.bus_name); 2883 free(rsp->obj.dev_name); 2884 free(rsp); 2885 } 2886} 2887 2888struct devlink_sb_pool_get_list * 2889devlink_sb_pool_get_dump(struct ynl_sock *ys, 2890 struct devlink_sb_pool_get_req_dump *req) 2891{ 2892 struct ynl_dump_state yds = {}; 2893 struct nlmsghdr *nlh; 2894 int err; 2895 2896 yds.ys = ys; 2897 yds.alloc_sz = sizeof(struct devlink_sb_pool_get_list); 2898 yds.cb = devlink_sb_pool_get_rsp_parse; 2899 yds.rsp_cmd = 17; 2900 yds.rsp_policy = &devlink_nest; 2901 2902 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_POOL_GET, 1); 2903 ys->req_policy = &devlink_nest; 2904 2905 if (req->_present.bus_name_len) 2906 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2907 if (req->_present.dev_name_len) 2908 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2909 2910 err = ynl_exec_dump(ys, nlh, &yds); 2911 if (err < 0) 2912 goto free_list; 2913 2914 return yds.first; 2915 2916free_list: 2917 devlink_sb_pool_get_list_free(yds.first); 2918 return NULL; 2919} 2920 2921/* ============== DEVLINK_CMD_SB_POOL_SET ============== */ 2922/* DEVLINK_CMD_SB_POOL_SET - do */ 2923void devlink_sb_pool_set_req_free(struct devlink_sb_pool_set_req *req) 2924{ 2925 free(req->bus_name); 2926 free(req->dev_name); 2927 free(req); 2928} 2929 2930int devlink_sb_pool_set(struct ynl_sock *ys, 2931 struct devlink_sb_pool_set_req *req) 2932{ 2933 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 2934 struct nlmsghdr *nlh; 2935 int err; 2936 2937 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_POOL_SET, 1); 2938 ys->req_policy = &devlink_nest; 2939 2940 if (req->_present.bus_name_len) 2941 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 2942 if (req->_present.dev_name_len) 2943 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 2944 if (req->_present.sb_index) 2945 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); 2946 if (req->_present.sb_pool_index) 2947 mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req->sb_pool_index); 2948 if (req->_present.sb_pool_threshold_type) 2949 mnl_attr_put_u8(nlh, DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE, req->sb_pool_threshold_type); 2950 if (req->_present.sb_pool_size) 2951 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_POOL_SIZE, req->sb_pool_size); 2952 2953 err = ynl_exec(ys, nlh, &yrs); 2954 if (err < 0) 2955 return -1; 2956 2957 return 0; 2958} 2959 2960/* ============== DEVLINK_CMD_SB_PORT_POOL_GET ============== */ 2961/* DEVLINK_CMD_SB_PORT_POOL_GET - do */ 2962void 2963devlink_sb_port_pool_get_req_free(struct devlink_sb_port_pool_get_req *req) 2964{ 2965 free(req->bus_name); 2966 free(req->dev_name); 2967 free(req); 2968} 2969 2970void 2971devlink_sb_port_pool_get_rsp_free(struct devlink_sb_port_pool_get_rsp *rsp) 2972{ 2973 free(rsp->bus_name); 2974 free(rsp->dev_name); 2975 free(rsp); 2976} 2977 2978int devlink_sb_port_pool_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 2979{ 2980 struct devlink_sb_port_pool_get_rsp *dst; 2981 struct ynl_parse_arg *yarg = data; 2982 const struct nlattr *attr; 2983 2984 dst = yarg->data; 2985 2986 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 2987 unsigned int type = mnl_attr_get_type(attr); 2988 2989 if (type == DEVLINK_ATTR_BUS_NAME) { 2990 unsigned int len; 2991 2992 if (ynl_attr_validate(yarg, attr)) 2993 return MNL_CB_ERROR; 2994 2995 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 2996 dst->_present.bus_name_len = len; 2997 dst->bus_name = malloc(len + 1); 2998 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 2999 dst->bus_name[len] = 0; 3000 } else if (type == DEVLINK_ATTR_DEV_NAME) { 3001 unsigned int len; 3002 3003 if (ynl_attr_validate(yarg, attr)) 3004 return MNL_CB_ERROR; 3005 3006 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3007 dst->_present.dev_name_len = len; 3008 dst->dev_name = malloc(len + 1); 3009 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 3010 dst->dev_name[len] = 0; 3011 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 3012 if (ynl_attr_validate(yarg, attr)) 3013 return MNL_CB_ERROR; 3014 dst->_present.port_index = 1; 3015 dst->port_index = mnl_attr_get_u32(attr); 3016 } else if (type == DEVLINK_ATTR_SB_INDEX) { 3017 if (ynl_attr_validate(yarg, attr)) 3018 return MNL_CB_ERROR; 3019 dst->_present.sb_index = 1; 3020 dst->sb_index = mnl_attr_get_u32(attr); 3021 } else if (type == DEVLINK_ATTR_SB_POOL_INDEX) { 3022 if (ynl_attr_validate(yarg, attr)) 3023 return MNL_CB_ERROR; 3024 dst->_present.sb_pool_index = 1; 3025 dst->sb_pool_index = mnl_attr_get_u16(attr); 3026 } 3027 } 3028 3029 return MNL_CB_OK; 3030} 3031 3032struct devlink_sb_port_pool_get_rsp * 3033devlink_sb_port_pool_get(struct ynl_sock *ys, 3034 struct devlink_sb_port_pool_get_req *req) 3035{ 3036 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3037 struct devlink_sb_port_pool_get_rsp *rsp; 3038 struct nlmsghdr *nlh; 3039 int err; 3040 3041 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_PORT_POOL_GET, 1); 3042 ys->req_policy = &devlink_nest; 3043 yrs.yarg.rsp_policy = &devlink_nest; 3044 3045 if (req->_present.bus_name_len) 3046 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3047 if (req->_present.dev_name_len) 3048 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3049 if (req->_present.port_index) 3050 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 3051 if (req->_present.sb_index) 3052 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); 3053 if (req->_present.sb_pool_index) 3054 mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req->sb_pool_index); 3055 3056 rsp = calloc(1, sizeof(*rsp)); 3057 yrs.yarg.data = rsp; 3058 yrs.cb = devlink_sb_port_pool_get_rsp_parse; 3059 yrs.rsp_cmd = 21; 3060 3061 err = ynl_exec(ys, nlh, &yrs); 3062 if (err < 0) 3063 goto err_free; 3064 3065 return rsp; 3066 3067err_free: 3068 devlink_sb_port_pool_get_rsp_free(rsp); 3069 return NULL; 3070} 3071 3072/* DEVLINK_CMD_SB_PORT_POOL_GET - dump */ 3073void 3074devlink_sb_port_pool_get_list_free(struct devlink_sb_port_pool_get_list *rsp) 3075{ 3076 struct devlink_sb_port_pool_get_list *next = rsp; 3077 3078 while ((void *)next != YNL_LIST_END) { 3079 rsp = next; 3080 next = rsp->next; 3081 3082 free(rsp->obj.bus_name); 3083 free(rsp->obj.dev_name); 3084 free(rsp); 3085 } 3086} 3087 3088struct devlink_sb_port_pool_get_list * 3089devlink_sb_port_pool_get_dump(struct ynl_sock *ys, 3090 struct devlink_sb_port_pool_get_req_dump *req) 3091{ 3092 struct ynl_dump_state yds = {}; 3093 struct nlmsghdr *nlh; 3094 int err; 3095 3096 yds.ys = ys; 3097 yds.alloc_sz = sizeof(struct devlink_sb_port_pool_get_list); 3098 yds.cb = devlink_sb_port_pool_get_rsp_parse; 3099 yds.rsp_cmd = 21; 3100 yds.rsp_policy = &devlink_nest; 3101 3102 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_PORT_POOL_GET, 1); 3103 ys->req_policy = &devlink_nest; 3104 3105 if (req->_present.bus_name_len) 3106 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3107 if (req->_present.dev_name_len) 3108 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3109 3110 err = ynl_exec_dump(ys, nlh, &yds); 3111 if (err < 0) 3112 goto free_list; 3113 3114 return yds.first; 3115 3116free_list: 3117 devlink_sb_port_pool_get_list_free(yds.first); 3118 return NULL; 3119} 3120 3121/* ============== DEVLINK_CMD_SB_PORT_POOL_SET ============== */ 3122/* DEVLINK_CMD_SB_PORT_POOL_SET - do */ 3123void 3124devlink_sb_port_pool_set_req_free(struct devlink_sb_port_pool_set_req *req) 3125{ 3126 free(req->bus_name); 3127 free(req->dev_name); 3128 free(req); 3129} 3130 3131int devlink_sb_port_pool_set(struct ynl_sock *ys, 3132 struct devlink_sb_port_pool_set_req *req) 3133{ 3134 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3135 struct nlmsghdr *nlh; 3136 int err; 3137 3138 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_PORT_POOL_SET, 1); 3139 ys->req_policy = &devlink_nest; 3140 3141 if (req->_present.bus_name_len) 3142 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3143 if (req->_present.dev_name_len) 3144 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3145 if (req->_present.port_index) 3146 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 3147 if (req->_present.sb_index) 3148 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); 3149 if (req->_present.sb_pool_index) 3150 mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req->sb_pool_index); 3151 if (req->_present.sb_threshold) 3152 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_THRESHOLD, req->sb_threshold); 3153 3154 err = ynl_exec(ys, nlh, &yrs); 3155 if (err < 0) 3156 return -1; 3157 3158 return 0; 3159} 3160 3161/* ============== DEVLINK_CMD_SB_TC_POOL_BIND_GET ============== */ 3162/* DEVLINK_CMD_SB_TC_POOL_BIND_GET - do */ 3163void 3164devlink_sb_tc_pool_bind_get_req_free(struct devlink_sb_tc_pool_bind_get_req *req) 3165{ 3166 free(req->bus_name); 3167 free(req->dev_name); 3168 free(req); 3169} 3170 3171void 3172devlink_sb_tc_pool_bind_get_rsp_free(struct devlink_sb_tc_pool_bind_get_rsp *rsp) 3173{ 3174 free(rsp->bus_name); 3175 free(rsp->dev_name); 3176 free(rsp); 3177} 3178 3179int devlink_sb_tc_pool_bind_get_rsp_parse(const struct nlmsghdr *nlh, 3180 void *data) 3181{ 3182 struct devlink_sb_tc_pool_bind_get_rsp *dst; 3183 struct ynl_parse_arg *yarg = data; 3184 const struct nlattr *attr; 3185 3186 dst = yarg->data; 3187 3188 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 3189 unsigned int type = mnl_attr_get_type(attr); 3190 3191 if (type == DEVLINK_ATTR_BUS_NAME) { 3192 unsigned int len; 3193 3194 if (ynl_attr_validate(yarg, attr)) 3195 return MNL_CB_ERROR; 3196 3197 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3198 dst->_present.bus_name_len = len; 3199 dst->bus_name = malloc(len + 1); 3200 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 3201 dst->bus_name[len] = 0; 3202 } else if (type == DEVLINK_ATTR_DEV_NAME) { 3203 unsigned int len; 3204 3205 if (ynl_attr_validate(yarg, attr)) 3206 return MNL_CB_ERROR; 3207 3208 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3209 dst->_present.dev_name_len = len; 3210 dst->dev_name = malloc(len + 1); 3211 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 3212 dst->dev_name[len] = 0; 3213 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 3214 if (ynl_attr_validate(yarg, attr)) 3215 return MNL_CB_ERROR; 3216 dst->_present.port_index = 1; 3217 dst->port_index = mnl_attr_get_u32(attr); 3218 } else if (type == DEVLINK_ATTR_SB_INDEX) { 3219 if (ynl_attr_validate(yarg, attr)) 3220 return MNL_CB_ERROR; 3221 dst->_present.sb_index = 1; 3222 dst->sb_index = mnl_attr_get_u32(attr); 3223 } else if (type == DEVLINK_ATTR_SB_POOL_TYPE) { 3224 if (ynl_attr_validate(yarg, attr)) 3225 return MNL_CB_ERROR; 3226 dst->_present.sb_pool_type = 1; 3227 dst->sb_pool_type = mnl_attr_get_u8(attr); 3228 } else if (type == DEVLINK_ATTR_SB_TC_INDEX) { 3229 if (ynl_attr_validate(yarg, attr)) 3230 return MNL_CB_ERROR; 3231 dst->_present.sb_tc_index = 1; 3232 dst->sb_tc_index = mnl_attr_get_u16(attr); 3233 } 3234 } 3235 3236 return MNL_CB_OK; 3237} 3238 3239struct devlink_sb_tc_pool_bind_get_rsp * 3240devlink_sb_tc_pool_bind_get(struct ynl_sock *ys, 3241 struct devlink_sb_tc_pool_bind_get_req *req) 3242{ 3243 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3244 struct devlink_sb_tc_pool_bind_get_rsp *rsp; 3245 struct nlmsghdr *nlh; 3246 int err; 3247 3248 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_TC_POOL_BIND_GET, 1); 3249 ys->req_policy = &devlink_nest; 3250 yrs.yarg.rsp_policy = &devlink_nest; 3251 3252 if (req->_present.bus_name_len) 3253 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3254 if (req->_present.dev_name_len) 3255 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3256 if (req->_present.port_index) 3257 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 3258 if (req->_present.sb_index) 3259 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); 3260 if (req->_present.sb_pool_type) 3261 mnl_attr_put_u8(nlh, DEVLINK_ATTR_SB_POOL_TYPE, req->sb_pool_type); 3262 if (req->_present.sb_tc_index) 3263 mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_TC_INDEX, req->sb_tc_index); 3264 3265 rsp = calloc(1, sizeof(*rsp)); 3266 yrs.yarg.data = rsp; 3267 yrs.cb = devlink_sb_tc_pool_bind_get_rsp_parse; 3268 yrs.rsp_cmd = 25; 3269 3270 err = ynl_exec(ys, nlh, &yrs); 3271 if (err < 0) 3272 goto err_free; 3273 3274 return rsp; 3275 3276err_free: 3277 devlink_sb_tc_pool_bind_get_rsp_free(rsp); 3278 return NULL; 3279} 3280 3281/* DEVLINK_CMD_SB_TC_POOL_BIND_GET - dump */ 3282void 3283devlink_sb_tc_pool_bind_get_list_free(struct devlink_sb_tc_pool_bind_get_list *rsp) 3284{ 3285 struct devlink_sb_tc_pool_bind_get_list *next = rsp; 3286 3287 while ((void *)next != YNL_LIST_END) { 3288 rsp = next; 3289 next = rsp->next; 3290 3291 free(rsp->obj.bus_name); 3292 free(rsp->obj.dev_name); 3293 free(rsp); 3294 } 3295} 3296 3297struct devlink_sb_tc_pool_bind_get_list * 3298devlink_sb_tc_pool_bind_get_dump(struct ynl_sock *ys, 3299 struct devlink_sb_tc_pool_bind_get_req_dump *req) 3300{ 3301 struct ynl_dump_state yds = {}; 3302 struct nlmsghdr *nlh; 3303 int err; 3304 3305 yds.ys = ys; 3306 yds.alloc_sz = sizeof(struct devlink_sb_tc_pool_bind_get_list); 3307 yds.cb = devlink_sb_tc_pool_bind_get_rsp_parse; 3308 yds.rsp_cmd = 25; 3309 yds.rsp_policy = &devlink_nest; 3310 3311 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SB_TC_POOL_BIND_GET, 1); 3312 ys->req_policy = &devlink_nest; 3313 3314 if (req->_present.bus_name_len) 3315 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3316 if (req->_present.dev_name_len) 3317 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3318 3319 err = ynl_exec_dump(ys, nlh, &yds); 3320 if (err < 0) 3321 goto free_list; 3322 3323 return yds.first; 3324 3325free_list: 3326 devlink_sb_tc_pool_bind_get_list_free(yds.first); 3327 return NULL; 3328} 3329 3330/* ============== DEVLINK_CMD_SB_TC_POOL_BIND_SET ============== */ 3331/* DEVLINK_CMD_SB_TC_POOL_BIND_SET - do */ 3332void 3333devlink_sb_tc_pool_bind_set_req_free(struct devlink_sb_tc_pool_bind_set_req *req) 3334{ 3335 free(req->bus_name); 3336 free(req->dev_name); 3337 free(req); 3338} 3339 3340int devlink_sb_tc_pool_bind_set(struct ynl_sock *ys, 3341 struct devlink_sb_tc_pool_bind_set_req *req) 3342{ 3343 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3344 struct nlmsghdr *nlh; 3345 int err; 3346 3347 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_TC_POOL_BIND_SET, 1); 3348 ys->req_policy = &devlink_nest; 3349 3350 if (req->_present.bus_name_len) 3351 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3352 if (req->_present.dev_name_len) 3353 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3354 if (req->_present.port_index) 3355 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 3356 if (req->_present.sb_index) 3357 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); 3358 if (req->_present.sb_pool_index) 3359 mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req->sb_pool_index); 3360 if (req->_present.sb_pool_type) 3361 mnl_attr_put_u8(nlh, DEVLINK_ATTR_SB_POOL_TYPE, req->sb_pool_type); 3362 if (req->_present.sb_tc_index) 3363 mnl_attr_put_u16(nlh, DEVLINK_ATTR_SB_TC_INDEX, req->sb_tc_index); 3364 if (req->_present.sb_threshold) 3365 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_THRESHOLD, req->sb_threshold); 3366 3367 err = ynl_exec(ys, nlh, &yrs); 3368 if (err < 0) 3369 return -1; 3370 3371 return 0; 3372} 3373 3374/* ============== DEVLINK_CMD_SB_OCC_SNAPSHOT ============== */ 3375/* DEVLINK_CMD_SB_OCC_SNAPSHOT - do */ 3376void devlink_sb_occ_snapshot_req_free(struct devlink_sb_occ_snapshot_req *req) 3377{ 3378 free(req->bus_name); 3379 free(req->dev_name); 3380 free(req); 3381} 3382 3383int devlink_sb_occ_snapshot(struct ynl_sock *ys, 3384 struct devlink_sb_occ_snapshot_req *req) 3385{ 3386 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3387 struct nlmsghdr *nlh; 3388 int err; 3389 3390 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_OCC_SNAPSHOT, 1); 3391 ys->req_policy = &devlink_nest; 3392 3393 if (req->_present.bus_name_len) 3394 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3395 if (req->_present.dev_name_len) 3396 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3397 if (req->_present.sb_index) 3398 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); 3399 3400 err = ynl_exec(ys, nlh, &yrs); 3401 if (err < 0) 3402 return -1; 3403 3404 return 0; 3405} 3406 3407/* ============== DEVLINK_CMD_SB_OCC_MAX_CLEAR ============== */ 3408/* DEVLINK_CMD_SB_OCC_MAX_CLEAR - do */ 3409void 3410devlink_sb_occ_max_clear_req_free(struct devlink_sb_occ_max_clear_req *req) 3411{ 3412 free(req->bus_name); 3413 free(req->dev_name); 3414 free(req); 3415} 3416 3417int devlink_sb_occ_max_clear(struct ynl_sock *ys, 3418 struct devlink_sb_occ_max_clear_req *req) 3419{ 3420 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3421 struct nlmsghdr *nlh; 3422 int err; 3423 3424 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SB_OCC_MAX_CLEAR, 1); 3425 ys->req_policy = &devlink_nest; 3426 3427 if (req->_present.bus_name_len) 3428 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3429 if (req->_present.dev_name_len) 3430 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3431 if (req->_present.sb_index) 3432 mnl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req->sb_index); 3433 3434 err = ynl_exec(ys, nlh, &yrs); 3435 if (err < 0) 3436 return -1; 3437 3438 return 0; 3439} 3440 3441/* ============== DEVLINK_CMD_ESWITCH_GET ============== */ 3442/* DEVLINK_CMD_ESWITCH_GET - do */ 3443void devlink_eswitch_get_req_free(struct devlink_eswitch_get_req *req) 3444{ 3445 free(req->bus_name); 3446 free(req->dev_name); 3447 free(req); 3448} 3449 3450void devlink_eswitch_get_rsp_free(struct devlink_eswitch_get_rsp *rsp) 3451{ 3452 free(rsp->bus_name); 3453 free(rsp->dev_name); 3454 free(rsp); 3455} 3456 3457int devlink_eswitch_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 3458{ 3459 struct devlink_eswitch_get_rsp *dst; 3460 struct ynl_parse_arg *yarg = data; 3461 const struct nlattr *attr; 3462 3463 dst = yarg->data; 3464 3465 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 3466 unsigned int type = mnl_attr_get_type(attr); 3467 3468 if (type == DEVLINK_ATTR_BUS_NAME) { 3469 unsigned int len; 3470 3471 if (ynl_attr_validate(yarg, attr)) 3472 return MNL_CB_ERROR; 3473 3474 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3475 dst->_present.bus_name_len = len; 3476 dst->bus_name = malloc(len + 1); 3477 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 3478 dst->bus_name[len] = 0; 3479 } else if (type == DEVLINK_ATTR_DEV_NAME) { 3480 unsigned int len; 3481 3482 if (ynl_attr_validate(yarg, attr)) 3483 return MNL_CB_ERROR; 3484 3485 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3486 dst->_present.dev_name_len = len; 3487 dst->dev_name = malloc(len + 1); 3488 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 3489 dst->dev_name[len] = 0; 3490 } else if (type == DEVLINK_ATTR_ESWITCH_MODE) { 3491 if (ynl_attr_validate(yarg, attr)) 3492 return MNL_CB_ERROR; 3493 dst->_present.eswitch_mode = 1; 3494 dst->eswitch_mode = mnl_attr_get_u16(attr); 3495 } else if (type == DEVLINK_ATTR_ESWITCH_INLINE_MODE) { 3496 if (ynl_attr_validate(yarg, attr)) 3497 return MNL_CB_ERROR; 3498 dst->_present.eswitch_inline_mode = 1; 3499 dst->eswitch_inline_mode = mnl_attr_get_u16(attr); 3500 } else if (type == DEVLINK_ATTR_ESWITCH_ENCAP_MODE) { 3501 if (ynl_attr_validate(yarg, attr)) 3502 return MNL_CB_ERROR; 3503 dst->_present.eswitch_encap_mode = 1; 3504 dst->eswitch_encap_mode = mnl_attr_get_u8(attr); 3505 } 3506 } 3507 3508 return MNL_CB_OK; 3509} 3510 3511struct devlink_eswitch_get_rsp * 3512devlink_eswitch_get(struct ynl_sock *ys, struct devlink_eswitch_get_req *req) 3513{ 3514 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3515 struct devlink_eswitch_get_rsp *rsp; 3516 struct nlmsghdr *nlh; 3517 int err; 3518 3519 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_ESWITCH_GET, 1); 3520 ys->req_policy = &devlink_nest; 3521 yrs.yarg.rsp_policy = &devlink_nest; 3522 3523 if (req->_present.bus_name_len) 3524 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3525 if (req->_present.dev_name_len) 3526 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3527 3528 rsp = calloc(1, sizeof(*rsp)); 3529 yrs.yarg.data = rsp; 3530 yrs.cb = devlink_eswitch_get_rsp_parse; 3531 yrs.rsp_cmd = DEVLINK_CMD_ESWITCH_GET; 3532 3533 err = ynl_exec(ys, nlh, &yrs); 3534 if (err < 0) 3535 goto err_free; 3536 3537 return rsp; 3538 3539err_free: 3540 devlink_eswitch_get_rsp_free(rsp); 3541 return NULL; 3542} 3543 3544/* ============== DEVLINK_CMD_ESWITCH_SET ============== */ 3545/* DEVLINK_CMD_ESWITCH_SET - do */ 3546void devlink_eswitch_set_req_free(struct devlink_eswitch_set_req *req) 3547{ 3548 free(req->bus_name); 3549 free(req->dev_name); 3550 free(req); 3551} 3552 3553int devlink_eswitch_set(struct ynl_sock *ys, 3554 struct devlink_eswitch_set_req *req) 3555{ 3556 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3557 struct nlmsghdr *nlh; 3558 int err; 3559 3560 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_ESWITCH_SET, 1); 3561 ys->req_policy = &devlink_nest; 3562 3563 if (req->_present.bus_name_len) 3564 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3565 if (req->_present.dev_name_len) 3566 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3567 if (req->_present.eswitch_mode) 3568 mnl_attr_put_u16(nlh, DEVLINK_ATTR_ESWITCH_MODE, req->eswitch_mode); 3569 if (req->_present.eswitch_inline_mode) 3570 mnl_attr_put_u16(nlh, DEVLINK_ATTR_ESWITCH_INLINE_MODE, req->eswitch_inline_mode); 3571 if (req->_present.eswitch_encap_mode) 3572 mnl_attr_put_u8(nlh, DEVLINK_ATTR_ESWITCH_ENCAP_MODE, req->eswitch_encap_mode); 3573 3574 err = ynl_exec(ys, nlh, &yrs); 3575 if (err < 0) 3576 return -1; 3577 3578 return 0; 3579} 3580 3581/* ============== DEVLINK_CMD_DPIPE_TABLE_GET ============== */ 3582/* DEVLINK_CMD_DPIPE_TABLE_GET - do */ 3583void devlink_dpipe_table_get_req_free(struct devlink_dpipe_table_get_req *req) 3584{ 3585 free(req->bus_name); 3586 free(req->dev_name); 3587 free(req->dpipe_table_name); 3588 free(req); 3589} 3590 3591void devlink_dpipe_table_get_rsp_free(struct devlink_dpipe_table_get_rsp *rsp) 3592{ 3593 free(rsp->bus_name); 3594 free(rsp->dev_name); 3595 devlink_dl_dpipe_tables_free(&rsp->dpipe_tables); 3596 free(rsp); 3597} 3598 3599int devlink_dpipe_table_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 3600{ 3601 struct devlink_dpipe_table_get_rsp *dst; 3602 struct ynl_parse_arg *yarg = data; 3603 const struct nlattr *attr; 3604 struct ynl_parse_arg parg; 3605 3606 dst = yarg->data; 3607 parg.ys = yarg->ys; 3608 3609 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 3610 unsigned int type = mnl_attr_get_type(attr); 3611 3612 if (type == DEVLINK_ATTR_BUS_NAME) { 3613 unsigned int len; 3614 3615 if (ynl_attr_validate(yarg, attr)) 3616 return MNL_CB_ERROR; 3617 3618 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3619 dst->_present.bus_name_len = len; 3620 dst->bus_name = malloc(len + 1); 3621 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 3622 dst->bus_name[len] = 0; 3623 } else if (type == DEVLINK_ATTR_DEV_NAME) { 3624 unsigned int len; 3625 3626 if (ynl_attr_validate(yarg, attr)) 3627 return MNL_CB_ERROR; 3628 3629 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3630 dst->_present.dev_name_len = len; 3631 dst->dev_name = malloc(len + 1); 3632 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 3633 dst->dev_name[len] = 0; 3634 } else if (type == DEVLINK_ATTR_DPIPE_TABLES) { 3635 if (ynl_attr_validate(yarg, attr)) 3636 return MNL_CB_ERROR; 3637 dst->_present.dpipe_tables = 1; 3638 3639 parg.rsp_policy = &devlink_dl_dpipe_tables_nest; 3640 parg.data = &dst->dpipe_tables; 3641 if (devlink_dl_dpipe_tables_parse(&parg, attr)) 3642 return MNL_CB_ERROR; 3643 } 3644 } 3645 3646 return MNL_CB_OK; 3647} 3648 3649struct devlink_dpipe_table_get_rsp * 3650devlink_dpipe_table_get(struct ynl_sock *ys, 3651 struct devlink_dpipe_table_get_req *req) 3652{ 3653 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3654 struct devlink_dpipe_table_get_rsp *rsp; 3655 struct nlmsghdr *nlh; 3656 int err; 3657 3658 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_DPIPE_TABLE_GET, 1); 3659 ys->req_policy = &devlink_nest; 3660 yrs.yarg.rsp_policy = &devlink_nest; 3661 3662 if (req->_present.bus_name_len) 3663 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3664 if (req->_present.dev_name_len) 3665 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3666 if (req->_present.dpipe_table_name_len) 3667 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME, req->dpipe_table_name); 3668 3669 rsp = calloc(1, sizeof(*rsp)); 3670 yrs.yarg.data = rsp; 3671 yrs.cb = devlink_dpipe_table_get_rsp_parse; 3672 yrs.rsp_cmd = DEVLINK_CMD_DPIPE_TABLE_GET; 3673 3674 err = ynl_exec(ys, nlh, &yrs); 3675 if (err < 0) 3676 goto err_free; 3677 3678 return rsp; 3679 3680err_free: 3681 devlink_dpipe_table_get_rsp_free(rsp); 3682 return NULL; 3683} 3684 3685/* ============== DEVLINK_CMD_DPIPE_ENTRIES_GET ============== */ 3686/* DEVLINK_CMD_DPIPE_ENTRIES_GET - do */ 3687void 3688devlink_dpipe_entries_get_req_free(struct devlink_dpipe_entries_get_req *req) 3689{ 3690 free(req->bus_name); 3691 free(req->dev_name); 3692 free(req->dpipe_table_name); 3693 free(req); 3694} 3695 3696void 3697devlink_dpipe_entries_get_rsp_free(struct devlink_dpipe_entries_get_rsp *rsp) 3698{ 3699 free(rsp->bus_name); 3700 free(rsp->dev_name); 3701 devlink_dl_dpipe_entries_free(&rsp->dpipe_entries); 3702 free(rsp); 3703} 3704 3705int devlink_dpipe_entries_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 3706{ 3707 struct devlink_dpipe_entries_get_rsp *dst; 3708 struct ynl_parse_arg *yarg = data; 3709 const struct nlattr *attr; 3710 struct ynl_parse_arg parg; 3711 3712 dst = yarg->data; 3713 parg.ys = yarg->ys; 3714 3715 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 3716 unsigned int type = mnl_attr_get_type(attr); 3717 3718 if (type == DEVLINK_ATTR_BUS_NAME) { 3719 unsigned int len; 3720 3721 if (ynl_attr_validate(yarg, attr)) 3722 return MNL_CB_ERROR; 3723 3724 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3725 dst->_present.bus_name_len = len; 3726 dst->bus_name = malloc(len + 1); 3727 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 3728 dst->bus_name[len] = 0; 3729 } else if (type == DEVLINK_ATTR_DEV_NAME) { 3730 unsigned int len; 3731 3732 if (ynl_attr_validate(yarg, attr)) 3733 return MNL_CB_ERROR; 3734 3735 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3736 dst->_present.dev_name_len = len; 3737 dst->dev_name = malloc(len + 1); 3738 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 3739 dst->dev_name[len] = 0; 3740 } else if (type == DEVLINK_ATTR_DPIPE_ENTRIES) { 3741 if (ynl_attr_validate(yarg, attr)) 3742 return MNL_CB_ERROR; 3743 dst->_present.dpipe_entries = 1; 3744 3745 parg.rsp_policy = &devlink_dl_dpipe_entries_nest; 3746 parg.data = &dst->dpipe_entries; 3747 if (devlink_dl_dpipe_entries_parse(&parg, attr)) 3748 return MNL_CB_ERROR; 3749 } 3750 } 3751 3752 return MNL_CB_OK; 3753} 3754 3755struct devlink_dpipe_entries_get_rsp * 3756devlink_dpipe_entries_get(struct ynl_sock *ys, 3757 struct devlink_dpipe_entries_get_req *req) 3758{ 3759 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3760 struct devlink_dpipe_entries_get_rsp *rsp; 3761 struct nlmsghdr *nlh; 3762 int err; 3763 3764 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_DPIPE_ENTRIES_GET, 1); 3765 ys->req_policy = &devlink_nest; 3766 yrs.yarg.rsp_policy = &devlink_nest; 3767 3768 if (req->_present.bus_name_len) 3769 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3770 if (req->_present.dev_name_len) 3771 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3772 if (req->_present.dpipe_table_name_len) 3773 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME, req->dpipe_table_name); 3774 3775 rsp = calloc(1, sizeof(*rsp)); 3776 yrs.yarg.data = rsp; 3777 yrs.cb = devlink_dpipe_entries_get_rsp_parse; 3778 yrs.rsp_cmd = DEVLINK_CMD_DPIPE_ENTRIES_GET; 3779 3780 err = ynl_exec(ys, nlh, &yrs); 3781 if (err < 0) 3782 goto err_free; 3783 3784 return rsp; 3785 3786err_free: 3787 devlink_dpipe_entries_get_rsp_free(rsp); 3788 return NULL; 3789} 3790 3791/* ============== DEVLINK_CMD_DPIPE_HEADERS_GET ============== */ 3792/* DEVLINK_CMD_DPIPE_HEADERS_GET - do */ 3793void 3794devlink_dpipe_headers_get_req_free(struct devlink_dpipe_headers_get_req *req) 3795{ 3796 free(req->bus_name); 3797 free(req->dev_name); 3798 free(req); 3799} 3800 3801void 3802devlink_dpipe_headers_get_rsp_free(struct devlink_dpipe_headers_get_rsp *rsp) 3803{ 3804 free(rsp->bus_name); 3805 free(rsp->dev_name); 3806 devlink_dl_dpipe_headers_free(&rsp->dpipe_headers); 3807 free(rsp); 3808} 3809 3810int devlink_dpipe_headers_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 3811{ 3812 struct devlink_dpipe_headers_get_rsp *dst; 3813 struct ynl_parse_arg *yarg = data; 3814 const struct nlattr *attr; 3815 struct ynl_parse_arg parg; 3816 3817 dst = yarg->data; 3818 parg.ys = yarg->ys; 3819 3820 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 3821 unsigned int type = mnl_attr_get_type(attr); 3822 3823 if (type == DEVLINK_ATTR_BUS_NAME) { 3824 unsigned int len; 3825 3826 if (ynl_attr_validate(yarg, attr)) 3827 return MNL_CB_ERROR; 3828 3829 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3830 dst->_present.bus_name_len = len; 3831 dst->bus_name = malloc(len + 1); 3832 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 3833 dst->bus_name[len] = 0; 3834 } else if (type == DEVLINK_ATTR_DEV_NAME) { 3835 unsigned int len; 3836 3837 if (ynl_attr_validate(yarg, attr)) 3838 return MNL_CB_ERROR; 3839 3840 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 3841 dst->_present.dev_name_len = len; 3842 dst->dev_name = malloc(len + 1); 3843 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 3844 dst->dev_name[len] = 0; 3845 } else if (type == DEVLINK_ATTR_DPIPE_HEADERS) { 3846 if (ynl_attr_validate(yarg, attr)) 3847 return MNL_CB_ERROR; 3848 dst->_present.dpipe_headers = 1; 3849 3850 parg.rsp_policy = &devlink_dl_dpipe_headers_nest; 3851 parg.data = &dst->dpipe_headers; 3852 if (devlink_dl_dpipe_headers_parse(&parg, attr)) 3853 return MNL_CB_ERROR; 3854 } 3855 } 3856 3857 return MNL_CB_OK; 3858} 3859 3860struct devlink_dpipe_headers_get_rsp * 3861devlink_dpipe_headers_get(struct ynl_sock *ys, 3862 struct devlink_dpipe_headers_get_req *req) 3863{ 3864 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3865 struct devlink_dpipe_headers_get_rsp *rsp; 3866 struct nlmsghdr *nlh; 3867 int err; 3868 3869 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_DPIPE_HEADERS_GET, 1); 3870 ys->req_policy = &devlink_nest; 3871 yrs.yarg.rsp_policy = &devlink_nest; 3872 3873 if (req->_present.bus_name_len) 3874 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3875 if (req->_present.dev_name_len) 3876 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3877 3878 rsp = calloc(1, sizeof(*rsp)); 3879 yrs.yarg.data = rsp; 3880 yrs.cb = devlink_dpipe_headers_get_rsp_parse; 3881 yrs.rsp_cmd = DEVLINK_CMD_DPIPE_HEADERS_GET; 3882 3883 err = ynl_exec(ys, nlh, &yrs); 3884 if (err < 0) 3885 goto err_free; 3886 3887 return rsp; 3888 3889err_free: 3890 devlink_dpipe_headers_get_rsp_free(rsp); 3891 return NULL; 3892} 3893 3894/* ============== DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET ============== */ 3895/* DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET - do */ 3896void 3897devlink_dpipe_table_counters_set_req_free(struct devlink_dpipe_table_counters_set_req *req) 3898{ 3899 free(req->bus_name); 3900 free(req->dev_name); 3901 free(req->dpipe_table_name); 3902 free(req); 3903} 3904 3905int devlink_dpipe_table_counters_set(struct ynl_sock *ys, 3906 struct devlink_dpipe_table_counters_set_req *req) 3907{ 3908 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3909 struct nlmsghdr *nlh; 3910 int err; 3911 3912 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET, 1); 3913 ys->req_policy = &devlink_nest; 3914 3915 if (req->_present.bus_name_len) 3916 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3917 if (req->_present.dev_name_len) 3918 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3919 if (req->_present.dpipe_table_name_len) 3920 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME, req->dpipe_table_name); 3921 if (req->_present.dpipe_table_counters_enabled) 3922 mnl_attr_put_u8(nlh, DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED, req->dpipe_table_counters_enabled); 3923 3924 err = ynl_exec(ys, nlh, &yrs); 3925 if (err < 0) 3926 return -1; 3927 3928 return 0; 3929} 3930 3931/* ============== DEVLINK_CMD_RESOURCE_SET ============== */ 3932/* DEVLINK_CMD_RESOURCE_SET - do */ 3933void devlink_resource_set_req_free(struct devlink_resource_set_req *req) 3934{ 3935 free(req->bus_name); 3936 free(req->dev_name); 3937 free(req); 3938} 3939 3940int devlink_resource_set(struct ynl_sock *ys, 3941 struct devlink_resource_set_req *req) 3942{ 3943 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 3944 struct nlmsghdr *nlh; 3945 int err; 3946 3947 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_RESOURCE_SET, 1); 3948 ys->req_policy = &devlink_nest; 3949 3950 if (req->_present.bus_name_len) 3951 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 3952 if (req->_present.dev_name_len) 3953 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 3954 if (req->_present.resource_id) 3955 mnl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_ID, req->resource_id); 3956 if (req->_present.resource_size) 3957 mnl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_SIZE, req->resource_size); 3958 3959 err = ynl_exec(ys, nlh, &yrs); 3960 if (err < 0) 3961 return -1; 3962 3963 return 0; 3964} 3965 3966/* ============== DEVLINK_CMD_RESOURCE_DUMP ============== */ 3967/* DEVLINK_CMD_RESOURCE_DUMP - do */ 3968void devlink_resource_dump_req_free(struct devlink_resource_dump_req *req) 3969{ 3970 free(req->bus_name); 3971 free(req->dev_name); 3972 free(req); 3973} 3974 3975void devlink_resource_dump_rsp_free(struct devlink_resource_dump_rsp *rsp) 3976{ 3977 free(rsp->bus_name); 3978 free(rsp->dev_name); 3979 devlink_dl_resource_list_free(&rsp->resource_list); 3980 free(rsp); 3981} 3982 3983int devlink_resource_dump_rsp_parse(const struct nlmsghdr *nlh, void *data) 3984{ 3985 struct devlink_resource_dump_rsp *dst; 3986 struct ynl_parse_arg *yarg = data; 3987 const struct nlattr *attr; 3988 struct ynl_parse_arg parg; 3989 3990 dst = yarg->data; 3991 parg.ys = yarg->ys; 3992 3993 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 3994 unsigned int type = mnl_attr_get_type(attr); 3995 3996 if (type == DEVLINK_ATTR_BUS_NAME) { 3997 unsigned int len; 3998 3999 if (ynl_attr_validate(yarg, attr)) 4000 return MNL_CB_ERROR; 4001 4002 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4003 dst->_present.bus_name_len = len; 4004 dst->bus_name = malloc(len + 1); 4005 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 4006 dst->bus_name[len] = 0; 4007 } else if (type == DEVLINK_ATTR_DEV_NAME) { 4008 unsigned int len; 4009 4010 if (ynl_attr_validate(yarg, attr)) 4011 return MNL_CB_ERROR; 4012 4013 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4014 dst->_present.dev_name_len = len; 4015 dst->dev_name = malloc(len + 1); 4016 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 4017 dst->dev_name[len] = 0; 4018 } else if (type == DEVLINK_ATTR_RESOURCE_LIST) { 4019 if (ynl_attr_validate(yarg, attr)) 4020 return MNL_CB_ERROR; 4021 dst->_present.resource_list = 1; 4022 4023 parg.rsp_policy = &devlink_dl_resource_list_nest; 4024 parg.data = &dst->resource_list; 4025 if (devlink_dl_resource_list_parse(&parg, attr)) 4026 return MNL_CB_ERROR; 4027 } 4028 } 4029 4030 return MNL_CB_OK; 4031} 4032 4033struct devlink_resource_dump_rsp * 4034devlink_resource_dump(struct ynl_sock *ys, 4035 struct devlink_resource_dump_req *req) 4036{ 4037 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 4038 struct devlink_resource_dump_rsp *rsp; 4039 struct nlmsghdr *nlh; 4040 int err; 4041 4042 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_RESOURCE_DUMP, 1); 4043 ys->req_policy = &devlink_nest; 4044 yrs.yarg.rsp_policy = &devlink_nest; 4045 4046 if (req->_present.bus_name_len) 4047 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4048 if (req->_present.dev_name_len) 4049 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4050 4051 rsp = calloc(1, sizeof(*rsp)); 4052 yrs.yarg.data = rsp; 4053 yrs.cb = devlink_resource_dump_rsp_parse; 4054 yrs.rsp_cmd = DEVLINK_CMD_RESOURCE_DUMP; 4055 4056 err = ynl_exec(ys, nlh, &yrs); 4057 if (err < 0) 4058 goto err_free; 4059 4060 return rsp; 4061 4062err_free: 4063 devlink_resource_dump_rsp_free(rsp); 4064 return NULL; 4065} 4066 4067/* ============== DEVLINK_CMD_RELOAD ============== */ 4068/* DEVLINK_CMD_RELOAD - do */ 4069void devlink_reload_req_free(struct devlink_reload_req *req) 4070{ 4071 free(req->bus_name); 4072 free(req->dev_name); 4073 free(req); 4074} 4075 4076void devlink_reload_rsp_free(struct devlink_reload_rsp *rsp) 4077{ 4078 free(rsp->bus_name); 4079 free(rsp->dev_name); 4080 free(rsp); 4081} 4082 4083int devlink_reload_rsp_parse(const struct nlmsghdr *nlh, void *data) 4084{ 4085 struct ynl_parse_arg *yarg = data; 4086 struct devlink_reload_rsp *dst; 4087 const struct nlattr *attr; 4088 4089 dst = yarg->data; 4090 4091 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 4092 unsigned int type = mnl_attr_get_type(attr); 4093 4094 if (type == DEVLINK_ATTR_BUS_NAME) { 4095 unsigned int len; 4096 4097 if (ynl_attr_validate(yarg, attr)) 4098 return MNL_CB_ERROR; 4099 4100 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4101 dst->_present.bus_name_len = len; 4102 dst->bus_name = malloc(len + 1); 4103 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 4104 dst->bus_name[len] = 0; 4105 } else if (type == DEVLINK_ATTR_DEV_NAME) { 4106 unsigned int len; 4107 4108 if (ynl_attr_validate(yarg, attr)) 4109 return MNL_CB_ERROR; 4110 4111 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4112 dst->_present.dev_name_len = len; 4113 dst->dev_name = malloc(len + 1); 4114 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 4115 dst->dev_name[len] = 0; 4116 } else if (type == DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED) { 4117 if (ynl_attr_validate(yarg, attr)) 4118 return MNL_CB_ERROR; 4119 dst->_present.reload_actions_performed = 1; 4120 memcpy(&dst->reload_actions_performed, mnl_attr_get_payload(attr), sizeof(struct nla_bitfield32)); 4121 } 4122 } 4123 4124 return MNL_CB_OK; 4125} 4126 4127struct devlink_reload_rsp * 4128devlink_reload(struct ynl_sock *ys, struct devlink_reload_req *req) 4129{ 4130 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 4131 struct devlink_reload_rsp *rsp; 4132 struct nlmsghdr *nlh; 4133 int err; 4134 4135 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_RELOAD, 1); 4136 ys->req_policy = &devlink_nest; 4137 yrs.yarg.rsp_policy = &devlink_nest; 4138 4139 if (req->_present.bus_name_len) 4140 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4141 if (req->_present.dev_name_len) 4142 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4143 if (req->_present.reload_action) 4144 mnl_attr_put_u8(nlh, DEVLINK_ATTR_RELOAD_ACTION, req->reload_action); 4145 if (req->_present.reload_limits) 4146 mnl_attr_put(nlh, DEVLINK_ATTR_RELOAD_LIMITS, sizeof(struct nla_bitfield32), &req->reload_limits); 4147 if (req->_present.netns_pid) 4148 mnl_attr_put_u32(nlh, DEVLINK_ATTR_NETNS_PID, req->netns_pid); 4149 if (req->_present.netns_fd) 4150 mnl_attr_put_u32(nlh, DEVLINK_ATTR_NETNS_FD, req->netns_fd); 4151 if (req->_present.netns_id) 4152 mnl_attr_put_u32(nlh, DEVLINK_ATTR_NETNS_ID, req->netns_id); 4153 4154 rsp = calloc(1, sizeof(*rsp)); 4155 yrs.yarg.data = rsp; 4156 yrs.cb = devlink_reload_rsp_parse; 4157 yrs.rsp_cmd = DEVLINK_CMD_RELOAD; 4158 4159 err = ynl_exec(ys, nlh, &yrs); 4160 if (err < 0) 4161 goto err_free; 4162 4163 return rsp; 4164 4165err_free: 4166 devlink_reload_rsp_free(rsp); 4167 return NULL; 4168} 4169 4170/* ============== DEVLINK_CMD_PARAM_GET ============== */ 4171/* DEVLINK_CMD_PARAM_GET - do */ 4172void devlink_param_get_req_free(struct devlink_param_get_req *req) 4173{ 4174 free(req->bus_name); 4175 free(req->dev_name); 4176 free(req->param_name); 4177 free(req); 4178} 4179 4180void devlink_param_get_rsp_free(struct devlink_param_get_rsp *rsp) 4181{ 4182 free(rsp->bus_name); 4183 free(rsp->dev_name); 4184 free(rsp->param_name); 4185 free(rsp); 4186} 4187 4188int devlink_param_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 4189{ 4190 struct devlink_param_get_rsp *dst; 4191 struct ynl_parse_arg *yarg = data; 4192 const struct nlattr *attr; 4193 4194 dst = yarg->data; 4195 4196 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 4197 unsigned int type = mnl_attr_get_type(attr); 4198 4199 if (type == DEVLINK_ATTR_BUS_NAME) { 4200 unsigned int len; 4201 4202 if (ynl_attr_validate(yarg, attr)) 4203 return MNL_CB_ERROR; 4204 4205 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4206 dst->_present.bus_name_len = len; 4207 dst->bus_name = malloc(len + 1); 4208 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 4209 dst->bus_name[len] = 0; 4210 } else if (type == DEVLINK_ATTR_DEV_NAME) { 4211 unsigned int len; 4212 4213 if (ynl_attr_validate(yarg, attr)) 4214 return MNL_CB_ERROR; 4215 4216 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4217 dst->_present.dev_name_len = len; 4218 dst->dev_name = malloc(len + 1); 4219 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 4220 dst->dev_name[len] = 0; 4221 } else if (type == DEVLINK_ATTR_PARAM_NAME) { 4222 unsigned int len; 4223 4224 if (ynl_attr_validate(yarg, attr)) 4225 return MNL_CB_ERROR; 4226 4227 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4228 dst->_present.param_name_len = len; 4229 dst->param_name = malloc(len + 1); 4230 memcpy(dst->param_name, mnl_attr_get_str(attr), len); 4231 dst->param_name[len] = 0; 4232 } 4233 } 4234 4235 return MNL_CB_OK; 4236} 4237 4238struct devlink_param_get_rsp * 4239devlink_param_get(struct ynl_sock *ys, struct devlink_param_get_req *req) 4240{ 4241 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 4242 struct devlink_param_get_rsp *rsp; 4243 struct nlmsghdr *nlh; 4244 int err; 4245 4246 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PARAM_GET, 1); 4247 ys->req_policy = &devlink_nest; 4248 yrs.yarg.rsp_policy = &devlink_nest; 4249 4250 if (req->_present.bus_name_len) 4251 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4252 if (req->_present.dev_name_len) 4253 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4254 if (req->_present.param_name_len) 4255 mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_NAME, req->param_name); 4256 4257 rsp = calloc(1, sizeof(*rsp)); 4258 yrs.yarg.data = rsp; 4259 yrs.cb = devlink_param_get_rsp_parse; 4260 yrs.rsp_cmd = DEVLINK_CMD_PARAM_GET; 4261 4262 err = ynl_exec(ys, nlh, &yrs); 4263 if (err < 0) 4264 goto err_free; 4265 4266 return rsp; 4267 4268err_free: 4269 devlink_param_get_rsp_free(rsp); 4270 return NULL; 4271} 4272 4273/* DEVLINK_CMD_PARAM_GET - dump */ 4274void devlink_param_get_list_free(struct devlink_param_get_list *rsp) 4275{ 4276 struct devlink_param_get_list *next = rsp; 4277 4278 while ((void *)next != YNL_LIST_END) { 4279 rsp = next; 4280 next = rsp->next; 4281 4282 free(rsp->obj.bus_name); 4283 free(rsp->obj.dev_name); 4284 free(rsp->obj.param_name); 4285 free(rsp); 4286 } 4287} 4288 4289struct devlink_param_get_list * 4290devlink_param_get_dump(struct ynl_sock *ys, 4291 struct devlink_param_get_req_dump *req) 4292{ 4293 struct ynl_dump_state yds = {}; 4294 struct nlmsghdr *nlh; 4295 int err; 4296 4297 yds.ys = ys; 4298 yds.alloc_sz = sizeof(struct devlink_param_get_list); 4299 yds.cb = devlink_param_get_rsp_parse; 4300 yds.rsp_cmd = DEVLINK_CMD_PARAM_GET; 4301 yds.rsp_policy = &devlink_nest; 4302 4303 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_PARAM_GET, 1); 4304 ys->req_policy = &devlink_nest; 4305 4306 if (req->_present.bus_name_len) 4307 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4308 if (req->_present.dev_name_len) 4309 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4310 4311 err = ynl_exec_dump(ys, nlh, &yds); 4312 if (err < 0) 4313 goto free_list; 4314 4315 return yds.first; 4316 4317free_list: 4318 devlink_param_get_list_free(yds.first); 4319 return NULL; 4320} 4321 4322/* ============== DEVLINK_CMD_PARAM_SET ============== */ 4323/* DEVLINK_CMD_PARAM_SET - do */ 4324void devlink_param_set_req_free(struct devlink_param_set_req *req) 4325{ 4326 free(req->bus_name); 4327 free(req->dev_name); 4328 free(req->param_name); 4329 free(req); 4330} 4331 4332int devlink_param_set(struct ynl_sock *ys, struct devlink_param_set_req *req) 4333{ 4334 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 4335 struct nlmsghdr *nlh; 4336 int err; 4337 4338 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PARAM_SET, 1); 4339 ys->req_policy = &devlink_nest; 4340 4341 if (req->_present.bus_name_len) 4342 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4343 if (req->_present.dev_name_len) 4344 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4345 if (req->_present.param_name_len) 4346 mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_NAME, req->param_name); 4347 if (req->_present.param_type) 4348 mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_TYPE, req->param_type); 4349 if (req->_present.param_value_cmode) 4350 mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_CMODE, req->param_value_cmode); 4351 4352 err = ynl_exec(ys, nlh, &yrs); 4353 if (err < 0) 4354 return -1; 4355 4356 return 0; 4357} 4358 4359/* ============== DEVLINK_CMD_REGION_GET ============== */ 4360/* DEVLINK_CMD_REGION_GET - do */ 4361void devlink_region_get_req_free(struct devlink_region_get_req *req) 4362{ 4363 free(req->bus_name); 4364 free(req->dev_name); 4365 free(req->region_name); 4366 free(req); 4367} 4368 4369void devlink_region_get_rsp_free(struct devlink_region_get_rsp *rsp) 4370{ 4371 free(rsp->bus_name); 4372 free(rsp->dev_name); 4373 free(rsp->region_name); 4374 free(rsp); 4375} 4376 4377int devlink_region_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 4378{ 4379 struct devlink_region_get_rsp *dst; 4380 struct ynl_parse_arg *yarg = data; 4381 const struct nlattr *attr; 4382 4383 dst = yarg->data; 4384 4385 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 4386 unsigned int type = mnl_attr_get_type(attr); 4387 4388 if (type == DEVLINK_ATTR_BUS_NAME) { 4389 unsigned int len; 4390 4391 if (ynl_attr_validate(yarg, attr)) 4392 return MNL_CB_ERROR; 4393 4394 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4395 dst->_present.bus_name_len = len; 4396 dst->bus_name = malloc(len + 1); 4397 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 4398 dst->bus_name[len] = 0; 4399 } else if (type == DEVLINK_ATTR_DEV_NAME) { 4400 unsigned int len; 4401 4402 if (ynl_attr_validate(yarg, attr)) 4403 return MNL_CB_ERROR; 4404 4405 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4406 dst->_present.dev_name_len = len; 4407 dst->dev_name = malloc(len + 1); 4408 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 4409 dst->dev_name[len] = 0; 4410 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 4411 if (ynl_attr_validate(yarg, attr)) 4412 return MNL_CB_ERROR; 4413 dst->_present.port_index = 1; 4414 dst->port_index = mnl_attr_get_u32(attr); 4415 } else if (type == DEVLINK_ATTR_REGION_NAME) { 4416 unsigned int len; 4417 4418 if (ynl_attr_validate(yarg, attr)) 4419 return MNL_CB_ERROR; 4420 4421 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4422 dst->_present.region_name_len = len; 4423 dst->region_name = malloc(len + 1); 4424 memcpy(dst->region_name, mnl_attr_get_str(attr), len); 4425 dst->region_name[len] = 0; 4426 } 4427 } 4428 4429 return MNL_CB_OK; 4430} 4431 4432struct devlink_region_get_rsp * 4433devlink_region_get(struct ynl_sock *ys, struct devlink_region_get_req *req) 4434{ 4435 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 4436 struct devlink_region_get_rsp *rsp; 4437 struct nlmsghdr *nlh; 4438 int err; 4439 4440 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_REGION_GET, 1); 4441 ys->req_policy = &devlink_nest; 4442 yrs.yarg.rsp_policy = &devlink_nest; 4443 4444 if (req->_present.bus_name_len) 4445 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4446 if (req->_present.dev_name_len) 4447 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4448 if (req->_present.port_index) 4449 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 4450 if (req->_present.region_name_len) 4451 mnl_attr_put_strz(nlh, DEVLINK_ATTR_REGION_NAME, req->region_name); 4452 4453 rsp = calloc(1, sizeof(*rsp)); 4454 yrs.yarg.data = rsp; 4455 yrs.cb = devlink_region_get_rsp_parse; 4456 yrs.rsp_cmd = DEVLINK_CMD_REGION_GET; 4457 4458 err = ynl_exec(ys, nlh, &yrs); 4459 if (err < 0) 4460 goto err_free; 4461 4462 return rsp; 4463 4464err_free: 4465 devlink_region_get_rsp_free(rsp); 4466 return NULL; 4467} 4468 4469/* DEVLINK_CMD_REGION_GET - dump */ 4470void devlink_region_get_list_free(struct devlink_region_get_list *rsp) 4471{ 4472 struct devlink_region_get_list *next = rsp; 4473 4474 while ((void *)next != YNL_LIST_END) { 4475 rsp = next; 4476 next = rsp->next; 4477 4478 free(rsp->obj.bus_name); 4479 free(rsp->obj.dev_name); 4480 free(rsp->obj.region_name); 4481 free(rsp); 4482 } 4483} 4484 4485struct devlink_region_get_list * 4486devlink_region_get_dump(struct ynl_sock *ys, 4487 struct devlink_region_get_req_dump *req) 4488{ 4489 struct ynl_dump_state yds = {}; 4490 struct nlmsghdr *nlh; 4491 int err; 4492 4493 yds.ys = ys; 4494 yds.alloc_sz = sizeof(struct devlink_region_get_list); 4495 yds.cb = devlink_region_get_rsp_parse; 4496 yds.rsp_cmd = DEVLINK_CMD_REGION_GET; 4497 yds.rsp_policy = &devlink_nest; 4498 4499 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_REGION_GET, 1); 4500 ys->req_policy = &devlink_nest; 4501 4502 if (req->_present.bus_name_len) 4503 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4504 if (req->_present.dev_name_len) 4505 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4506 4507 err = ynl_exec_dump(ys, nlh, &yds); 4508 if (err < 0) 4509 goto free_list; 4510 4511 return yds.first; 4512 4513free_list: 4514 devlink_region_get_list_free(yds.first); 4515 return NULL; 4516} 4517 4518/* ============== DEVLINK_CMD_REGION_NEW ============== */ 4519/* DEVLINK_CMD_REGION_NEW - do */ 4520void devlink_region_new_req_free(struct devlink_region_new_req *req) 4521{ 4522 free(req->bus_name); 4523 free(req->dev_name); 4524 free(req->region_name); 4525 free(req); 4526} 4527 4528void devlink_region_new_rsp_free(struct devlink_region_new_rsp *rsp) 4529{ 4530 free(rsp->bus_name); 4531 free(rsp->dev_name); 4532 free(rsp->region_name); 4533 free(rsp); 4534} 4535 4536int devlink_region_new_rsp_parse(const struct nlmsghdr *nlh, void *data) 4537{ 4538 struct devlink_region_new_rsp *dst; 4539 struct ynl_parse_arg *yarg = data; 4540 const struct nlattr *attr; 4541 4542 dst = yarg->data; 4543 4544 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 4545 unsigned int type = mnl_attr_get_type(attr); 4546 4547 if (type == DEVLINK_ATTR_BUS_NAME) { 4548 unsigned int len; 4549 4550 if (ynl_attr_validate(yarg, attr)) 4551 return MNL_CB_ERROR; 4552 4553 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4554 dst->_present.bus_name_len = len; 4555 dst->bus_name = malloc(len + 1); 4556 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 4557 dst->bus_name[len] = 0; 4558 } else if (type == DEVLINK_ATTR_DEV_NAME) { 4559 unsigned int len; 4560 4561 if (ynl_attr_validate(yarg, attr)) 4562 return MNL_CB_ERROR; 4563 4564 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4565 dst->_present.dev_name_len = len; 4566 dst->dev_name = malloc(len + 1); 4567 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 4568 dst->dev_name[len] = 0; 4569 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 4570 if (ynl_attr_validate(yarg, attr)) 4571 return MNL_CB_ERROR; 4572 dst->_present.port_index = 1; 4573 dst->port_index = mnl_attr_get_u32(attr); 4574 } else if (type == DEVLINK_ATTR_REGION_NAME) { 4575 unsigned int len; 4576 4577 if (ynl_attr_validate(yarg, attr)) 4578 return MNL_CB_ERROR; 4579 4580 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4581 dst->_present.region_name_len = len; 4582 dst->region_name = malloc(len + 1); 4583 memcpy(dst->region_name, mnl_attr_get_str(attr), len); 4584 dst->region_name[len] = 0; 4585 } else if (type == DEVLINK_ATTR_REGION_SNAPSHOT_ID) { 4586 if (ynl_attr_validate(yarg, attr)) 4587 return MNL_CB_ERROR; 4588 dst->_present.region_snapshot_id = 1; 4589 dst->region_snapshot_id = mnl_attr_get_u32(attr); 4590 } 4591 } 4592 4593 return MNL_CB_OK; 4594} 4595 4596struct devlink_region_new_rsp * 4597devlink_region_new(struct ynl_sock *ys, struct devlink_region_new_req *req) 4598{ 4599 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 4600 struct devlink_region_new_rsp *rsp; 4601 struct nlmsghdr *nlh; 4602 int err; 4603 4604 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_REGION_NEW, 1); 4605 ys->req_policy = &devlink_nest; 4606 yrs.yarg.rsp_policy = &devlink_nest; 4607 4608 if (req->_present.bus_name_len) 4609 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4610 if (req->_present.dev_name_len) 4611 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4612 if (req->_present.port_index) 4613 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 4614 if (req->_present.region_name_len) 4615 mnl_attr_put_strz(nlh, DEVLINK_ATTR_REGION_NAME, req->region_name); 4616 if (req->_present.region_snapshot_id) 4617 mnl_attr_put_u32(nlh, DEVLINK_ATTR_REGION_SNAPSHOT_ID, req->region_snapshot_id); 4618 4619 rsp = calloc(1, sizeof(*rsp)); 4620 yrs.yarg.data = rsp; 4621 yrs.cb = devlink_region_new_rsp_parse; 4622 yrs.rsp_cmd = DEVLINK_CMD_REGION_NEW; 4623 4624 err = ynl_exec(ys, nlh, &yrs); 4625 if (err < 0) 4626 goto err_free; 4627 4628 return rsp; 4629 4630err_free: 4631 devlink_region_new_rsp_free(rsp); 4632 return NULL; 4633} 4634 4635/* ============== DEVLINK_CMD_REGION_DEL ============== */ 4636/* DEVLINK_CMD_REGION_DEL - do */ 4637void devlink_region_del_req_free(struct devlink_region_del_req *req) 4638{ 4639 free(req->bus_name); 4640 free(req->dev_name); 4641 free(req->region_name); 4642 free(req); 4643} 4644 4645int devlink_region_del(struct ynl_sock *ys, struct devlink_region_del_req *req) 4646{ 4647 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 4648 struct nlmsghdr *nlh; 4649 int err; 4650 4651 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_REGION_DEL, 1); 4652 ys->req_policy = &devlink_nest; 4653 4654 if (req->_present.bus_name_len) 4655 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4656 if (req->_present.dev_name_len) 4657 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4658 if (req->_present.port_index) 4659 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 4660 if (req->_present.region_name_len) 4661 mnl_attr_put_strz(nlh, DEVLINK_ATTR_REGION_NAME, req->region_name); 4662 if (req->_present.region_snapshot_id) 4663 mnl_attr_put_u32(nlh, DEVLINK_ATTR_REGION_SNAPSHOT_ID, req->region_snapshot_id); 4664 4665 err = ynl_exec(ys, nlh, &yrs); 4666 if (err < 0) 4667 return -1; 4668 4669 return 0; 4670} 4671 4672/* ============== DEVLINK_CMD_REGION_READ ============== */ 4673/* DEVLINK_CMD_REGION_READ - dump */ 4674int devlink_region_read_rsp_dump_parse(const struct nlmsghdr *nlh, void *data) 4675{ 4676 struct devlink_region_read_rsp_dump *dst; 4677 struct ynl_parse_arg *yarg = data; 4678 const struct nlattr *attr; 4679 4680 dst = yarg->data; 4681 4682 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 4683 unsigned int type = mnl_attr_get_type(attr); 4684 4685 if (type == DEVLINK_ATTR_BUS_NAME) { 4686 unsigned int len; 4687 4688 if (ynl_attr_validate(yarg, attr)) 4689 return MNL_CB_ERROR; 4690 4691 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4692 dst->_present.bus_name_len = len; 4693 dst->bus_name = malloc(len + 1); 4694 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 4695 dst->bus_name[len] = 0; 4696 } else if (type == DEVLINK_ATTR_DEV_NAME) { 4697 unsigned int len; 4698 4699 if (ynl_attr_validate(yarg, attr)) 4700 return MNL_CB_ERROR; 4701 4702 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4703 dst->_present.dev_name_len = len; 4704 dst->dev_name = malloc(len + 1); 4705 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 4706 dst->dev_name[len] = 0; 4707 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 4708 if (ynl_attr_validate(yarg, attr)) 4709 return MNL_CB_ERROR; 4710 dst->_present.port_index = 1; 4711 dst->port_index = mnl_attr_get_u32(attr); 4712 } else if (type == DEVLINK_ATTR_REGION_NAME) { 4713 unsigned int len; 4714 4715 if (ynl_attr_validate(yarg, attr)) 4716 return MNL_CB_ERROR; 4717 4718 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4719 dst->_present.region_name_len = len; 4720 dst->region_name = malloc(len + 1); 4721 memcpy(dst->region_name, mnl_attr_get_str(attr), len); 4722 dst->region_name[len] = 0; 4723 } 4724 } 4725 4726 return MNL_CB_OK; 4727} 4728 4729void 4730devlink_region_read_rsp_list_free(struct devlink_region_read_rsp_list *rsp) 4731{ 4732 struct devlink_region_read_rsp_list *next = rsp; 4733 4734 while ((void *)next != YNL_LIST_END) { 4735 rsp = next; 4736 next = rsp->next; 4737 4738 free(rsp->obj.bus_name); 4739 free(rsp->obj.dev_name); 4740 free(rsp->obj.region_name); 4741 free(rsp); 4742 } 4743} 4744 4745struct devlink_region_read_rsp_list * 4746devlink_region_read_dump(struct ynl_sock *ys, 4747 struct devlink_region_read_req_dump *req) 4748{ 4749 struct ynl_dump_state yds = {}; 4750 struct nlmsghdr *nlh; 4751 int err; 4752 4753 yds.ys = ys; 4754 yds.alloc_sz = sizeof(struct devlink_region_read_rsp_list); 4755 yds.cb = devlink_region_read_rsp_dump_parse; 4756 yds.rsp_cmd = DEVLINK_CMD_REGION_READ; 4757 yds.rsp_policy = &devlink_nest; 4758 4759 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_REGION_READ, 1); 4760 ys->req_policy = &devlink_nest; 4761 4762 if (req->_present.bus_name_len) 4763 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4764 if (req->_present.dev_name_len) 4765 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4766 if (req->_present.port_index) 4767 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 4768 if (req->_present.region_name_len) 4769 mnl_attr_put_strz(nlh, DEVLINK_ATTR_REGION_NAME, req->region_name); 4770 if (req->_present.region_snapshot_id) 4771 mnl_attr_put_u32(nlh, DEVLINK_ATTR_REGION_SNAPSHOT_ID, req->region_snapshot_id); 4772 if (req->_present.region_direct) 4773 mnl_attr_put(nlh, DEVLINK_ATTR_REGION_DIRECT, 0, NULL); 4774 if (req->_present.region_chunk_addr) 4775 mnl_attr_put_u64(nlh, DEVLINK_ATTR_REGION_CHUNK_ADDR, req->region_chunk_addr); 4776 if (req->_present.region_chunk_len) 4777 mnl_attr_put_u64(nlh, DEVLINK_ATTR_REGION_CHUNK_LEN, req->region_chunk_len); 4778 4779 err = ynl_exec_dump(ys, nlh, &yds); 4780 if (err < 0) 4781 goto free_list; 4782 4783 return yds.first; 4784 4785free_list: 4786 devlink_region_read_rsp_list_free(yds.first); 4787 return NULL; 4788} 4789 4790/* ============== DEVLINK_CMD_PORT_PARAM_GET ============== */ 4791/* DEVLINK_CMD_PORT_PARAM_GET - do */ 4792void devlink_port_param_get_req_free(struct devlink_port_param_get_req *req) 4793{ 4794 free(req->bus_name); 4795 free(req->dev_name); 4796 free(req); 4797} 4798 4799void devlink_port_param_get_rsp_free(struct devlink_port_param_get_rsp *rsp) 4800{ 4801 free(rsp->bus_name); 4802 free(rsp->dev_name); 4803 free(rsp); 4804} 4805 4806int devlink_port_param_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 4807{ 4808 struct devlink_port_param_get_rsp *dst; 4809 struct ynl_parse_arg *yarg = data; 4810 const struct nlattr *attr; 4811 4812 dst = yarg->data; 4813 4814 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 4815 unsigned int type = mnl_attr_get_type(attr); 4816 4817 if (type == DEVLINK_ATTR_BUS_NAME) { 4818 unsigned int len; 4819 4820 if (ynl_attr_validate(yarg, attr)) 4821 return MNL_CB_ERROR; 4822 4823 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4824 dst->_present.bus_name_len = len; 4825 dst->bus_name = malloc(len + 1); 4826 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 4827 dst->bus_name[len] = 0; 4828 } else if (type == DEVLINK_ATTR_DEV_NAME) { 4829 unsigned int len; 4830 4831 if (ynl_attr_validate(yarg, attr)) 4832 return MNL_CB_ERROR; 4833 4834 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 4835 dst->_present.dev_name_len = len; 4836 dst->dev_name = malloc(len + 1); 4837 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 4838 dst->dev_name[len] = 0; 4839 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 4840 if (ynl_attr_validate(yarg, attr)) 4841 return MNL_CB_ERROR; 4842 dst->_present.port_index = 1; 4843 dst->port_index = mnl_attr_get_u32(attr); 4844 } 4845 } 4846 4847 return MNL_CB_OK; 4848} 4849 4850struct devlink_port_param_get_rsp * 4851devlink_port_param_get(struct ynl_sock *ys, 4852 struct devlink_port_param_get_req *req) 4853{ 4854 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 4855 struct devlink_port_param_get_rsp *rsp; 4856 struct nlmsghdr *nlh; 4857 int err; 4858 4859 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_PARAM_GET, 1); 4860 ys->req_policy = &devlink_nest; 4861 yrs.yarg.rsp_policy = &devlink_nest; 4862 4863 if (req->_present.bus_name_len) 4864 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4865 if (req->_present.dev_name_len) 4866 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4867 if (req->_present.port_index) 4868 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 4869 4870 rsp = calloc(1, sizeof(*rsp)); 4871 yrs.yarg.data = rsp; 4872 yrs.cb = devlink_port_param_get_rsp_parse; 4873 yrs.rsp_cmd = DEVLINK_CMD_PORT_PARAM_GET; 4874 4875 err = ynl_exec(ys, nlh, &yrs); 4876 if (err < 0) 4877 goto err_free; 4878 4879 return rsp; 4880 4881err_free: 4882 devlink_port_param_get_rsp_free(rsp); 4883 return NULL; 4884} 4885 4886/* DEVLINK_CMD_PORT_PARAM_GET - dump */ 4887void devlink_port_param_get_list_free(struct devlink_port_param_get_list *rsp) 4888{ 4889 struct devlink_port_param_get_list *next = rsp; 4890 4891 while ((void *)next != YNL_LIST_END) { 4892 rsp = next; 4893 next = rsp->next; 4894 4895 free(rsp->obj.bus_name); 4896 free(rsp->obj.dev_name); 4897 free(rsp); 4898 } 4899} 4900 4901struct devlink_port_param_get_list * 4902devlink_port_param_get_dump(struct ynl_sock *ys) 4903{ 4904 struct ynl_dump_state yds = {}; 4905 struct nlmsghdr *nlh; 4906 int err; 4907 4908 yds.ys = ys; 4909 yds.alloc_sz = sizeof(struct devlink_port_param_get_list); 4910 yds.cb = devlink_port_param_get_rsp_parse; 4911 yds.rsp_cmd = DEVLINK_CMD_PORT_PARAM_GET; 4912 yds.rsp_policy = &devlink_nest; 4913 4914 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_PORT_PARAM_GET, 1); 4915 4916 err = ynl_exec_dump(ys, nlh, &yds); 4917 if (err < 0) 4918 goto free_list; 4919 4920 return yds.first; 4921 4922free_list: 4923 devlink_port_param_get_list_free(yds.first); 4924 return NULL; 4925} 4926 4927/* ============== DEVLINK_CMD_PORT_PARAM_SET ============== */ 4928/* DEVLINK_CMD_PORT_PARAM_SET - do */ 4929void devlink_port_param_set_req_free(struct devlink_port_param_set_req *req) 4930{ 4931 free(req->bus_name); 4932 free(req->dev_name); 4933 free(req); 4934} 4935 4936int devlink_port_param_set(struct ynl_sock *ys, 4937 struct devlink_port_param_set_req *req) 4938{ 4939 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 4940 struct nlmsghdr *nlh; 4941 int err; 4942 4943 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_PORT_PARAM_SET, 1); 4944 ys->req_policy = &devlink_nest; 4945 4946 if (req->_present.bus_name_len) 4947 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 4948 if (req->_present.dev_name_len) 4949 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 4950 if (req->_present.port_index) 4951 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 4952 4953 err = ynl_exec(ys, nlh, &yrs); 4954 if (err < 0) 4955 return -1; 4956 4957 return 0; 4958} 4959 4960/* ============== DEVLINK_CMD_INFO_GET ============== */ 4961/* DEVLINK_CMD_INFO_GET - do */ 4962void devlink_info_get_req_free(struct devlink_info_get_req *req) 4963{ 4964 free(req->bus_name); 4965 free(req->dev_name); 4966 free(req); 4967} 4968 4969void devlink_info_get_rsp_free(struct devlink_info_get_rsp *rsp) 4970{ 4971 unsigned int i; 4972 4973 free(rsp->bus_name); 4974 free(rsp->dev_name); 4975 free(rsp->info_driver_name); 4976 free(rsp->info_serial_number); 4977 for (i = 0; i < rsp->n_info_version_fixed; i++) 4978 devlink_dl_info_version_free(&rsp->info_version_fixed[i]); 4979 free(rsp->info_version_fixed); 4980 for (i = 0; i < rsp->n_info_version_running; i++) 4981 devlink_dl_info_version_free(&rsp->info_version_running[i]); 4982 free(rsp->info_version_running); 4983 for (i = 0; i < rsp->n_info_version_stored; i++) 4984 devlink_dl_info_version_free(&rsp->info_version_stored[i]); 4985 free(rsp->info_version_stored); 4986 free(rsp); 4987} 4988 4989int devlink_info_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 4990{ 4991 unsigned int n_info_version_running = 0; 4992 unsigned int n_info_version_stored = 0; 4993 unsigned int n_info_version_fixed = 0; 4994 struct ynl_parse_arg *yarg = data; 4995 struct devlink_info_get_rsp *dst; 4996 const struct nlattr *attr; 4997 struct ynl_parse_arg parg; 4998 int i; 4999 5000 dst = yarg->data; 5001 parg.ys = yarg->ys; 5002 5003 if (dst->info_version_fixed) 5004 return ynl_error_parse(yarg, "attribute already present (devlink.info-version-fixed)"); 5005 if (dst->info_version_running) 5006 return ynl_error_parse(yarg, "attribute already present (devlink.info-version-running)"); 5007 if (dst->info_version_stored) 5008 return ynl_error_parse(yarg, "attribute already present (devlink.info-version-stored)"); 5009 5010 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 5011 unsigned int type = mnl_attr_get_type(attr); 5012 5013 if (type == DEVLINK_ATTR_BUS_NAME) { 5014 unsigned int len; 5015 5016 if (ynl_attr_validate(yarg, attr)) 5017 return MNL_CB_ERROR; 5018 5019 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5020 dst->_present.bus_name_len = len; 5021 dst->bus_name = malloc(len + 1); 5022 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 5023 dst->bus_name[len] = 0; 5024 } else if (type == DEVLINK_ATTR_DEV_NAME) { 5025 unsigned int len; 5026 5027 if (ynl_attr_validate(yarg, attr)) 5028 return MNL_CB_ERROR; 5029 5030 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5031 dst->_present.dev_name_len = len; 5032 dst->dev_name = malloc(len + 1); 5033 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 5034 dst->dev_name[len] = 0; 5035 } else if (type == DEVLINK_ATTR_INFO_DRIVER_NAME) { 5036 unsigned int len; 5037 5038 if (ynl_attr_validate(yarg, attr)) 5039 return MNL_CB_ERROR; 5040 5041 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5042 dst->_present.info_driver_name_len = len; 5043 dst->info_driver_name = malloc(len + 1); 5044 memcpy(dst->info_driver_name, mnl_attr_get_str(attr), len); 5045 dst->info_driver_name[len] = 0; 5046 } else if (type == DEVLINK_ATTR_INFO_SERIAL_NUMBER) { 5047 unsigned int len; 5048 5049 if (ynl_attr_validate(yarg, attr)) 5050 return MNL_CB_ERROR; 5051 5052 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5053 dst->_present.info_serial_number_len = len; 5054 dst->info_serial_number = malloc(len + 1); 5055 memcpy(dst->info_serial_number, mnl_attr_get_str(attr), len); 5056 dst->info_serial_number[len] = 0; 5057 } else if (type == DEVLINK_ATTR_INFO_VERSION_FIXED) { 5058 n_info_version_fixed++; 5059 } else if (type == DEVLINK_ATTR_INFO_VERSION_RUNNING) { 5060 n_info_version_running++; 5061 } else if (type == DEVLINK_ATTR_INFO_VERSION_STORED) { 5062 n_info_version_stored++; 5063 } 5064 } 5065 5066 if (n_info_version_fixed) { 5067 dst->info_version_fixed = calloc(n_info_version_fixed, sizeof(*dst->info_version_fixed)); 5068 dst->n_info_version_fixed = n_info_version_fixed; 5069 i = 0; 5070 parg.rsp_policy = &devlink_dl_info_version_nest; 5071 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 5072 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_INFO_VERSION_FIXED) { 5073 parg.data = &dst->info_version_fixed[i]; 5074 if (devlink_dl_info_version_parse(&parg, attr)) 5075 return MNL_CB_ERROR; 5076 i++; 5077 } 5078 } 5079 } 5080 if (n_info_version_running) { 5081 dst->info_version_running = calloc(n_info_version_running, sizeof(*dst->info_version_running)); 5082 dst->n_info_version_running = n_info_version_running; 5083 i = 0; 5084 parg.rsp_policy = &devlink_dl_info_version_nest; 5085 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 5086 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_INFO_VERSION_RUNNING) { 5087 parg.data = &dst->info_version_running[i]; 5088 if (devlink_dl_info_version_parse(&parg, attr)) 5089 return MNL_CB_ERROR; 5090 i++; 5091 } 5092 } 5093 } 5094 if (n_info_version_stored) { 5095 dst->info_version_stored = calloc(n_info_version_stored, sizeof(*dst->info_version_stored)); 5096 dst->n_info_version_stored = n_info_version_stored; 5097 i = 0; 5098 parg.rsp_policy = &devlink_dl_info_version_nest; 5099 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 5100 if (mnl_attr_get_type(attr) == DEVLINK_ATTR_INFO_VERSION_STORED) { 5101 parg.data = &dst->info_version_stored[i]; 5102 if (devlink_dl_info_version_parse(&parg, attr)) 5103 return MNL_CB_ERROR; 5104 i++; 5105 } 5106 } 5107 } 5108 5109 return MNL_CB_OK; 5110} 5111 5112struct devlink_info_get_rsp * 5113devlink_info_get(struct ynl_sock *ys, struct devlink_info_get_req *req) 5114{ 5115 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5116 struct devlink_info_get_rsp *rsp; 5117 struct nlmsghdr *nlh; 5118 int err; 5119 5120 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_INFO_GET, 1); 5121 ys->req_policy = &devlink_nest; 5122 yrs.yarg.rsp_policy = &devlink_nest; 5123 5124 if (req->_present.bus_name_len) 5125 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5126 if (req->_present.dev_name_len) 5127 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5128 5129 rsp = calloc(1, sizeof(*rsp)); 5130 yrs.yarg.data = rsp; 5131 yrs.cb = devlink_info_get_rsp_parse; 5132 yrs.rsp_cmd = DEVLINK_CMD_INFO_GET; 5133 5134 err = ynl_exec(ys, nlh, &yrs); 5135 if (err < 0) 5136 goto err_free; 5137 5138 return rsp; 5139 5140err_free: 5141 devlink_info_get_rsp_free(rsp); 5142 return NULL; 5143} 5144 5145/* DEVLINK_CMD_INFO_GET - dump */ 5146void devlink_info_get_list_free(struct devlink_info_get_list *rsp) 5147{ 5148 struct devlink_info_get_list *next = rsp; 5149 5150 while ((void *)next != YNL_LIST_END) { 5151 unsigned int i; 5152 5153 rsp = next; 5154 next = rsp->next; 5155 5156 free(rsp->obj.bus_name); 5157 free(rsp->obj.dev_name); 5158 free(rsp->obj.info_driver_name); 5159 free(rsp->obj.info_serial_number); 5160 for (i = 0; i < rsp->obj.n_info_version_fixed; i++) 5161 devlink_dl_info_version_free(&rsp->obj.info_version_fixed[i]); 5162 free(rsp->obj.info_version_fixed); 5163 for (i = 0; i < rsp->obj.n_info_version_running; i++) 5164 devlink_dl_info_version_free(&rsp->obj.info_version_running[i]); 5165 free(rsp->obj.info_version_running); 5166 for (i = 0; i < rsp->obj.n_info_version_stored; i++) 5167 devlink_dl_info_version_free(&rsp->obj.info_version_stored[i]); 5168 free(rsp->obj.info_version_stored); 5169 free(rsp); 5170 } 5171} 5172 5173struct devlink_info_get_list *devlink_info_get_dump(struct ynl_sock *ys) 5174{ 5175 struct ynl_dump_state yds = {}; 5176 struct nlmsghdr *nlh; 5177 int err; 5178 5179 yds.ys = ys; 5180 yds.alloc_sz = sizeof(struct devlink_info_get_list); 5181 yds.cb = devlink_info_get_rsp_parse; 5182 yds.rsp_cmd = DEVLINK_CMD_INFO_GET; 5183 yds.rsp_policy = &devlink_nest; 5184 5185 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_INFO_GET, 1); 5186 5187 err = ynl_exec_dump(ys, nlh, &yds); 5188 if (err < 0) 5189 goto free_list; 5190 5191 return yds.first; 5192 5193free_list: 5194 devlink_info_get_list_free(yds.first); 5195 return NULL; 5196} 5197 5198/* ============== DEVLINK_CMD_HEALTH_REPORTER_GET ============== */ 5199/* DEVLINK_CMD_HEALTH_REPORTER_GET - do */ 5200void 5201devlink_health_reporter_get_req_free(struct devlink_health_reporter_get_req *req) 5202{ 5203 free(req->bus_name); 5204 free(req->dev_name); 5205 free(req->health_reporter_name); 5206 free(req); 5207} 5208 5209void 5210devlink_health_reporter_get_rsp_free(struct devlink_health_reporter_get_rsp *rsp) 5211{ 5212 free(rsp->bus_name); 5213 free(rsp->dev_name); 5214 free(rsp->health_reporter_name); 5215 free(rsp); 5216} 5217 5218int devlink_health_reporter_get_rsp_parse(const struct nlmsghdr *nlh, 5219 void *data) 5220{ 5221 struct devlink_health_reporter_get_rsp *dst; 5222 struct ynl_parse_arg *yarg = data; 5223 const struct nlattr *attr; 5224 5225 dst = yarg->data; 5226 5227 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 5228 unsigned int type = mnl_attr_get_type(attr); 5229 5230 if (type == DEVLINK_ATTR_BUS_NAME) { 5231 unsigned int len; 5232 5233 if (ynl_attr_validate(yarg, attr)) 5234 return MNL_CB_ERROR; 5235 5236 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5237 dst->_present.bus_name_len = len; 5238 dst->bus_name = malloc(len + 1); 5239 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 5240 dst->bus_name[len] = 0; 5241 } else if (type == DEVLINK_ATTR_DEV_NAME) { 5242 unsigned int len; 5243 5244 if (ynl_attr_validate(yarg, attr)) 5245 return MNL_CB_ERROR; 5246 5247 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5248 dst->_present.dev_name_len = len; 5249 dst->dev_name = malloc(len + 1); 5250 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 5251 dst->dev_name[len] = 0; 5252 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 5253 if (ynl_attr_validate(yarg, attr)) 5254 return MNL_CB_ERROR; 5255 dst->_present.port_index = 1; 5256 dst->port_index = mnl_attr_get_u32(attr); 5257 } else if (type == DEVLINK_ATTR_HEALTH_REPORTER_NAME) { 5258 unsigned int len; 5259 5260 if (ynl_attr_validate(yarg, attr)) 5261 return MNL_CB_ERROR; 5262 5263 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5264 dst->_present.health_reporter_name_len = len; 5265 dst->health_reporter_name = malloc(len + 1); 5266 memcpy(dst->health_reporter_name, mnl_attr_get_str(attr), len); 5267 dst->health_reporter_name[len] = 0; 5268 } 5269 } 5270 5271 return MNL_CB_OK; 5272} 5273 5274struct devlink_health_reporter_get_rsp * 5275devlink_health_reporter_get(struct ynl_sock *ys, 5276 struct devlink_health_reporter_get_req *req) 5277{ 5278 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5279 struct devlink_health_reporter_get_rsp *rsp; 5280 struct nlmsghdr *nlh; 5281 int err; 5282 5283 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_GET, 1); 5284 ys->req_policy = &devlink_nest; 5285 yrs.yarg.rsp_policy = &devlink_nest; 5286 5287 if (req->_present.bus_name_len) 5288 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5289 if (req->_present.dev_name_len) 5290 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5291 if (req->_present.port_index) 5292 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 5293 if (req->_present.health_reporter_name_len) 5294 mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name); 5295 5296 rsp = calloc(1, sizeof(*rsp)); 5297 yrs.yarg.data = rsp; 5298 yrs.cb = devlink_health_reporter_get_rsp_parse; 5299 yrs.rsp_cmd = DEVLINK_CMD_HEALTH_REPORTER_GET; 5300 5301 err = ynl_exec(ys, nlh, &yrs); 5302 if (err < 0) 5303 goto err_free; 5304 5305 return rsp; 5306 5307err_free: 5308 devlink_health_reporter_get_rsp_free(rsp); 5309 return NULL; 5310} 5311 5312/* DEVLINK_CMD_HEALTH_REPORTER_GET - dump */ 5313void 5314devlink_health_reporter_get_list_free(struct devlink_health_reporter_get_list *rsp) 5315{ 5316 struct devlink_health_reporter_get_list *next = rsp; 5317 5318 while ((void *)next != YNL_LIST_END) { 5319 rsp = next; 5320 next = rsp->next; 5321 5322 free(rsp->obj.bus_name); 5323 free(rsp->obj.dev_name); 5324 free(rsp->obj.health_reporter_name); 5325 free(rsp); 5326 } 5327} 5328 5329struct devlink_health_reporter_get_list * 5330devlink_health_reporter_get_dump(struct ynl_sock *ys, 5331 struct devlink_health_reporter_get_req_dump *req) 5332{ 5333 struct ynl_dump_state yds = {}; 5334 struct nlmsghdr *nlh; 5335 int err; 5336 5337 yds.ys = ys; 5338 yds.alloc_sz = sizeof(struct devlink_health_reporter_get_list); 5339 yds.cb = devlink_health_reporter_get_rsp_parse; 5340 yds.rsp_cmd = DEVLINK_CMD_HEALTH_REPORTER_GET; 5341 yds.rsp_policy = &devlink_nest; 5342 5343 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_GET, 1); 5344 ys->req_policy = &devlink_nest; 5345 5346 if (req->_present.bus_name_len) 5347 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5348 if (req->_present.dev_name_len) 5349 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5350 if (req->_present.port_index) 5351 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 5352 5353 err = ynl_exec_dump(ys, nlh, &yds); 5354 if (err < 0) 5355 goto free_list; 5356 5357 return yds.first; 5358 5359free_list: 5360 devlink_health_reporter_get_list_free(yds.first); 5361 return NULL; 5362} 5363 5364/* ============== DEVLINK_CMD_HEALTH_REPORTER_SET ============== */ 5365/* DEVLINK_CMD_HEALTH_REPORTER_SET - do */ 5366void 5367devlink_health_reporter_set_req_free(struct devlink_health_reporter_set_req *req) 5368{ 5369 free(req->bus_name); 5370 free(req->dev_name); 5371 free(req->health_reporter_name); 5372 free(req); 5373} 5374 5375int devlink_health_reporter_set(struct ynl_sock *ys, 5376 struct devlink_health_reporter_set_req *req) 5377{ 5378 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5379 struct nlmsghdr *nlh; 5380 int err; 5381 5382 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_SET, 1); 5383 ys->req_policy = &devlink_nest; 5384 5385 if (req->_present.bus_name_len) 5386 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5387 if (req->_present.dev_name_len) 5388 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5389 if (req->_present.port_index) 5390 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 5391 if (req->_present.health_reporter_name_len) 5392 mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name); 5393 if (req->_present.health_reporter_graceful_period) 5394 mnl_attr_put_u64(nlh, DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD, req->health_reporter_graceful_period); 5395 if (req->_present.health_reporter_auto_recover) 5396 mnl_attr_put_u8(nlh, DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER, req->health_reporter_auto_recover); 5397 if (req->_present.health_reporter_auto_dump) 5398 mnl_attr_put_u8(nlh, DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP, req->health_reporter_auto_dump); 5399 5400 err = ynl_exec(ys, nlh, &yrs); 5401 if (err < 0) 5402 return -1; 5403 5404 return 0; 5405} 5406 5407/* ============== DEVLINK_CMD_HEALTH_REPORTER_RECOVER ============== */ 5408/* DEVLINK_CMD_HEALTH_REPORTER_RECOVER - do */ 5409void 5410devlink_health_reporter_recover_req_free(struct devlink_health_reporter_recover_req *req) 5411{ 5412 free(req->bus_name); 5413 free(req->dev_name); 5414 free(req->health_reporter_name); 5415 free(req); 5416} 5417 5418int devlink_health_reporter_recover(struct ynl_sock *ys, 5419 struct devlink_health_reporter_recover_req *req) 5420{ 5421 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5422 struct nlmsghdr *nlh; 5423 int err; 5424 5425 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_RECOVER, 1); 5426 ys->req_policy = &devlink_nest; 5427 5428 if (req->_present.bus_name_len) 5429 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5430 if (req->_present.dev_name_len) 5431 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5432 if (req->_present.port_index) 5433 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 5434 if (req->_present.health_reporter_name_len) 5435 mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name); 5436 5437 err = ynl_exec(ys, nlh, &yrs); 5438 if (err < 0) 5439 return -1; 5440 5441 return 0; 5442} 5443 5444/* ============== DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE ============== */ 5445/* DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE - do */ 5446void 5447devlink_health_reporter_diagnose_req_free(struct devlink_health_reporter_diagnose_req *req) 5448{ 5449 free(req->bus_name); 5450 free(req->dev_name); 5451 free(req->health_reporter_name); 5452 free(req); 5453} 5454 5455int devlink_health_reporter_diagnose(struct ynl_sock *ys, 5456 struct devlink_health_reporter_diagnose_req *req) 5457{ 5458 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5459 struct nlmsghdr *nlh; 5460 int err; 5461 5462 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE, 1); 5463 ys->req_policy = &devlink_nest; 5464 5465 if (req->_present.bus_name_len) 5466 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5467 if (req->_present.dev_name_len) 5468 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5469 if (req->_present.port_index) 5470 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 5471 if (req->_present.health_reporter_name_len) 5472 mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name); 5473 5474 err = ynl_exec(ys, nlh, &yrs); 5475 if (err < 0) 5476 return -1; 5477 5478 return 0; 5479} 5480 5481/* ============== DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET ============== */ 5482/* DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET - dump */ 5483int devlink_health_reporter_dump_get_rsp_dump_parse(const struct nlmsghdr *nlh, 5484 void *data) 5485{ 5486 struct devlink_health_reporter_dump_get_rsp_dump *dst; 5487 struct ynl_parse_arg *yarg = data; 5488 const struct nlattr *attr; 5489 struct ynl_parse_arg parg; 5490 5491 dst = yarg->data; 5492 parg.ys = yarg->ys; 5493 5494 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 5495 unsigned int type = mnl_attr_get_type(attr); 5496 5497 if (type == DEVLINK_ATTR_FMSG) { 5498 if (ynl_attr_validate(yarg, attr)) 5499 return MNL_CB_ERROR; 5500 dst->_present.fmsg = 1; 5501 5502 parg.rsp_policy = &devlink_dl_fmsg_nest; 5503 parg.data = &dst->fmsg; 5504 if (devlink_dl_fmsg_parse(&parg, attr)) 5505 return MNL_CB_ERROR; 5506 } 5507 } 5508 5509 return MNL_CB_OK; 5510} 5511 5512void 5513devlink_health_reporter_dump_get_rsp_list_free(struct devlink_health_reporter_dump_get_rsp_list *rsp) 5514{ 5515 struct devlink_health_reporter_dump_get_rsp_list *next = rsp; 5516 5517 while ((void *)next != YNL_LIST_END) { 5518 rsp = next; 5519 next = rsp->next; 5520 5521 devlink_dl_fmsg_free(&rsp->obj.fmsg); 5522 free(rsp); 5523 } 5524} 5525 5526struct devlink_health_reporter_dump_get_rsp_list * 5527devlink_health_reporter_dump_get_dump(struct ynl_sock *ys, 5528 struct devlink_health_reporter_dump_get_req_dump *req) 5529{ 5530 struct ynl_dump_state yds = {}; 5531 struct nlmsghdr *nlh; 5532 int err; 5533 5534 yds.ys = ys; 5535 yds.alloc_sz = sizeof(struct devlink_health_reporter_dump_get_rsp_list); 5536 yds.cb = devlink_health_reporter_dump_get_rsp_dump_parse; 5537 yds.rsp_cmd = DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET; 5538 yds.rsp_policy = &devlink_nest; 5539 5540 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET, 1); 5541 ys->req_policy = &devlink_nest; 5542 5543 if (req->_present.bus_name_len) 5544 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5545 if (req->_present.dev_name_len) 5546 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5547 if (req->_present.port_index) 5548 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 5549 if (req->_present.health_reporter_name_len) 5550 mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name); 5551 5552 err = ynl_exec_dump(ys, nlh, &yds); 5553 if (err < 0) 5554 goto free_list; 5555 5556 return yds.first; 5557 5558free_list: 5559 devlink_health_reporter_dump_get_rsp_list_free(yds.first); 5560 return NULL; 5561} 5562 5563/* ============== DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR ============== */ 5564/* DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR - do */ 5565void 5566devlink_health_reporter_dump_clear_req_free(struct devlink_health_reporter_dump_clear_req *req) 5567{ 5568 free(req->bus_name); 5569 free(req->dev_name); 5570 free(req->health_reporter_name); 5571 free(req); 5572} 5573 5574int devlink_health_reporter_dump_clear(struct ynl_sock *ys, 5575 struct devlink_health_reporter_dump_clear_req *req) 5576{ 5577 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5578 struct nlmsghdr *nlh; 5579 int err; 5580 5581 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR, 1); 5582 ys->req_policy = &devlink_nest; 5583 5584 if (req->_present.bus_name_len) 5585 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5586 if (req->_present.dev_name_len) 5587 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5588 if (req->_present.port_index) 5589 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 5590 if (req->_present.health_reporter_name_len) 5591 mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name); 5592 5593 err = ynl_exec(ys, nlh, &yrs); 5594 if (err < 0) 5595 return -1; 5596 5597 return 0; 5598} 5599 5600/* ============== DEVLINK_CMD_FLASH_UPDATE ============== */ 5601/* DEVLINK_CMD_FLASH_UPDATE - do */ 5602void devlink_flash_update_req_free(struct devlink_flash_update_req *req) 5603{ 5604 free(req->bus_name); 5605 free(req->dev_name); 5606 free(req->flash_update_file_name); 5607 free(req->flash_update_component); 5608 free(req); 5609} 5610 5611int devlink_flash_update(struct ynl_sock *ys, 5612 struct devlink_flash_update_req *req) 5613{ 5614 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5615 struct nlmsghdr *nlh; 5616 int err; 5617 5618 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_FLASH_UPDATE, 1); 5619 ys->req_policy = &devlink_nest; 5620 5621 if (req->_present.bus_name_len) 5622 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5623 if (req->_present.dev_name_len) 5624 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5625 if (req->_present.flash_update_file_name_len) 5626 mnl_attr_put_strz(nlh, DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME, req->flash_update_file_name); 5627 if (req->_present.flash_update_component_len) 5628 mnl_attr_put_strz(nlh, DEVLINK_ATTR_FLASH_UPDATE_COMPONENT, req->flash_update_component); 5629 if (req->_present.flash_update_overwrite_mask) 5630 mnl_attr_put(nlh, DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK, sizeof(struct nla_bitfield32), &req->flash_update_overwrite_mask); 5631 5632 err = ynl_exec(ys, nlh, &yrs); 5633 if (err < 0) 5634 return -1; 5635 5636 return 0; 5637} 5638 5639/* ============== DEVLINK_CMD_TRAP_GET ============== */ 5640/* DEVLINK_CMD_TRAP_GET - do */ 5641void devlink_trap_get_req_free(struct devlink_trap_get_req *req) 5642{ 5643 free(req->bus_name); 5644 free(req->dev_name); 5645 free(req->trap_name); 5646 free(req); 5647} 5648 5649void devlink_trap_get_rsp_free(struct devlink_trap_get_rsp *rsp) 5650{ 5651 free(rsp->bus_name); 5652 free(rsp->dev_name); 5653 free(rsp->trap_name); 5654 free(rsp); 5655} 5656 5657int devlink_trap_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 5658{ 5659 struct ynl_parse_arg *yarg = data; 5660 struct devlink_trap_get_rsp *dst; 5661 const struct nlattr *attr; 5662 5663 dst = yarg->data; 5664 5665 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 5666 unsigned int type = mnl_attr_get_type(attr); 5667 5668 if (type == DEVLINK_ATTR_BUS_NAME) { 5669 unsigned int len; 5670 5671 if (ynl_attr_validate(yarg, attr)) 5672 return MNL_CB_ERROR; 5673 5674 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5675 dst->_present.bus_name_len = len; 5676 dst->bus_name = malloc(len + 1); 5677 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 5678 dst->bus_name[len] = 0; 5679 } else if (type == DEVLINK_ATTR_DEV_NAME) { 5680 unsigned int len; 5681 5682 if (ynl_attr_validate(yarg, attr)) 5683 return MNL_CB_ERROR; 5684 5685 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5686 dst->_present.dev_name_len = len; 5687 dst->dev_name = malloc(len + 1); 5688 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 5689 dst->dev_name[len] = 0; 5690 } else if (type == DEVLINK_ATTR_TRAP_NAME) { 5691 unsigned int len; 5692 5693 if (ynl_attr_validate(yarg, attr)) 5694 return MNL_CB_ERROR; 5695 5696 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5697 dst->_present.trap_name_len = len; 5698 dst->trap_name = malloc(len + 1); 5699 memcpy(dst->trap_name, mnl_attr_get_str(attr), len); 5700 dst->trap_name[len] = 0; 5701 } 5702 } 5703 5704 return MNL_CB_OK; 5705} 5706 5707struct devlink_trap_get_rsp * 5708devlink_trap_get(struct ynl_sock *ys, struct devlink_trap_get_req *req) 5709{ 5710 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5711 struct devlink_trap_get_rsp *rsp; 5712 struct nlmsghdr *nlh; 5713 int err; 5714 5715 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_GET, 1); 5716 ys->req_policy = &devlink_nest; 5717 yrs.yarg.rsp_policy = &devlink_nest; 5718 5719 if (req->_present.bus_name_len) 5720 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5721 if (req->_present.dev_name_len) 5722 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5723 if (req->_present.trap_name_len) 5724 mnl_attr_put_strz(nlh, DEVLINK_ATTR_TRAP_NAME, req->trap_name); 5725 5726 rsp = calloc(1, sizeof(*rsp)); 5727 yrs.yarg.data = rsp; 5728 yrs.cb = devlink_trap_get_rsp_parse; 5729 yrs.rsp_cmd = 63; 5730 5731 err = ynl_exec(ys, nlh, &yrs); 5732 if (err < 0) 5733 goto err_free; 5734 5735 return rsp; 5736 5737err_free: 5738 devlink_trap_get_rsp_free(rsp); 5739 return NULL; 5740} 5741 5742/* DEVLINK_CMD_TRAP_GET - dump */ 5743void devlink_trap_get_list_free(struct devlink_trap_get_list *rsp) 5744{ 5745 struct devlink_trap_get_list *next = rsp; 5746 5747 while ((void *)next != YNL_LIST_END) { 5748 rsp = next; 5749 next = rsp->next; 5750 5751 free(rsp->obj.bus_name); 5752 free(rsp->obj.dev_name); 5753 free(rsp->obj.trap_name); 5754 free(rsp); 5755 } 5756} 5757 5758struct devlink_trap_get_list * 5759devlink_trap_get_dump(struct ynl_sock *ys, 5760 struct devlink_trap_get_req_dump *req) 5761{ 5762 struct ynl_dump_state yds = {}; 5763 struct nlmsghdr *nlh; 5764 int err; 5765 5766 yds.ys = ys; 5767 yds.alloc_sz = sizeof(struct devlink_trap_get_list); 5768 yds.cb = devlink_trap_get_rsp_parse; 5769 yds.rsp_cmd = 63; 5770 yds.rsp_policy = &devlink_nest; 5771 5772 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_TRAP_GET, 1); 5773 ys->req_policy = &devlink_nest; 5774 5775 if (req->_present.bus_name_len) 5776 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5777 if (req->_present.dev_name_len) 5778 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5779 5780 err = ynl_exec_dump(ys, nlh, &yds); 5781 if (err < 0) 5782 goto free_list; 5783 5784 return yds.first; 5785 5786free_list: 5787 devlink_trap_get_list_free(yds.first); 5788 return NULL; 5789} 5790 5791/* ============== DEVLINK_CMD_TRAP_SET ============== */ 5792/* DEVLINK_CMD_TRAP_SET - do */ 5793void devlink_trap_set_req_free(struct devlink_trap_set_req *req) 5794{ 5795 free(req->bus_name); 5796 free(req->dev_name); 5797 free(req->trap_name); 5798 free(req); 5799} 5800 5801int devlink_trap_set(struct ynl_sock *ys, struct devlink_trap_set_req *req) 5802{ 5803 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5804 struct nlmsghdr *nlh; 5805 int err; 5806 5807 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_SET, 1); 5808 ys->req_policy = &devlink_nest; 5809 5810 if (req->_present.bus_name_len) 5811 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5812 if (req->_present.dev_name_len) 5813 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5814 if (req->_present.trap_name_len) 5815 mnl_attr_put_strz(nlh, DEVLINK_ATTR_TRAP_NAME, req->trap_name); 5816 if (req->_present.trap_action) 5817 mnl_attr_put_u8(nlh, DEVLINK_ATTR_TRAP_ACTION, req->trap_action); 5818 5819 err = ynl_exec(ys, nlh, &yrs); 5820 if (err < 0) 5821 return -1; 5822 5823 return 0; 5824} 5825 5826/* ============== DEVLINK_CMD_TRAP_GROUP_GET ============== */ 5827/* DEVLINK_CMD_TRAP_GROUP_GET - do */ 5828void devlink_trap_group_get_req_free(struct devlink_trap_group_get_req *req) 5829{ 5830 free(req->bus_name); 5831 free(req->dev_name); 5832 free(req->trap_group_name); 5833 free(req); 5834} 5835 5836void devlink_trap_group_get_rsp_free(struct devlink_trap_group_get_rsp *rsp) 5837{ 5838 free(rsp->bus_name); 5839 free(rsp->dev_name); 5840 free(rsp->trap_group_name); 5841 free(rsp); 5842} 5843 5844int devlink_trap_group_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 5845{ 5846 struct devlink_trap_group_get_rsp *dst; 5847 struct ynl_parse_arg *yarg = data; 5848 const struct nlattr *attr; 5849 5850 dst = yarg->data; 5851 5852 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 5853 unsigned int type = mnl_attr_get_type(attr); 5854 5855 if (type == DEVLINK_ATTR_BUS_NAME) { 5856 unsigned int len; 5857 5858 if (ynl_attr_validate(yarg, attr)) 5859 return MNL_CB_ERROR; 5860 5861 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5862 dst->_present.bus_name_len = len; 5863 dst->bus_name = malloc(len + 1); 5864 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 5865 dst->bus_name[len] = 0; 5866 } else if (type == DEVLINK_ATTR_DEV_NAME) { 5867 unsigned int len; 5868 5869 if (ynl_attr_validate(yarg, attr)) 5870 return MNL_CB_ERROR; 5871 5872 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5873 dst->_present.dev_name_len = len; 5874 dst->dev_name = malloc(len + 1); 5875 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 5876 dst->dev_name[len] = 0; 5877 } else if (type == DEVLINK_ATTR_TRAP_GROUP_NAME) { 5878 unsigned int len; 5879 5880 if (ynl_attr_validate(yarg, attr)) 5881 return MNL_CB_ERROR; 5882 5883 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 5884 dst->_present.trap_group_name_len = len; 5885 dst->trap_group_name = malloc(len + 1); 5886 memcpy(dst->trap_group_name, mnl_attr_get_str(attr), len); 5887 dst->trap_group_name[len] = 0; 5888 } 5889 } 5890 5891 return MNL_CB_OK; 5892} 5893 5894struct devlink_trap_group_get_rsp * 5895devlink_trap_group_get(struct ynl_sock *ys, 5896 struct devlink_trap_group_get_req *req) 5897{ 5898 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5899 struct devlink_trap_group_get_rsp *rsp; 5900 struct nlmsghdr *nlh; 5901 int err; 5902 5903 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_GROUP_GET, 1); 5904 ys->req_policy = &devlink_nest; 5905 yrs.yarg.rsp_policy = &devlink_nest; 5906 5907 if (req->_present.bus_name_len) 5908 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5909 if (req->_present.dev_name_len) 5910 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5911 if (req->_present.trap_group_name_len) 5912 mnl_attr_put_strz(nlh, DEVLINK_ATTR_TRAP_GROUP_NAME, req->trap_group_name); 5913 5914 rsp = calloc(1, sizeof(*rsp)); 5915 yrs.yarg.data = rsp; 5916 yrs.cb = devlink_trap_group_get_rsp_parse; 5917 yrs.rsp_cmd = 67; 5918 5919 err = ynl_exec(ys, nlh, &yrs); 5920 if (err < 0) 5921 goto err_free; 5922 5923 return rsp; 5924 5925err_free: 5926 devlink_trap_group_get_rsp_free(rsp); 5927 return NULL; 5928} 5929 5930/* DEVLINK_CMD_TRAP_GROUP_GET - dump */ 5931void devlink_trap_group_get_list_free(struct devlink_trap_group_get_list *rsp) 5932{ 5933 struct devlink_trap_group_get_list *next = rsp; 5934 5935 while ((void *)next != YNL_LIST_END) { 5936 rsp = next; 5937 next = rsp->next; 5938 5939 free(rsp->obj.bus_name); 5940 free(rsp->obj.dev_name); 5941 free(rsp->obj.trap_group_name); 5942 free(rsp); 5943 } 5944} 5945 5946struct devlink_trap_group_get_list * 5947devlink_trap_group_get_dump(struct ynl_sock *ys, 5948 struct devlink_trap_group_get_req_dump *req) 5949{ 5950 struct ynl_dump_state yds = {}; 5951 struct nlmsghdr *nlh; 5952 int err; 5953 5954 yds.ys = ys; 5955 yds.alloc_sz = sizeof(struct devlink_trap_group_get_list); 5956 yds.cb = devlink_trap_group_get_rsp_parse; 5957 yds.rsp_cmd = 67; 5958 yds.rsp_policy = &devlink_nest; 5959 5960 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_TRAP_GROUP_GET, 1); 5961 ys->req_policy = &devlink_nest; 5962 5963 if (req->_present.bus_name_len) 5964 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 5965 if (req->_present.dev_name_len) 5966 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 5967 5968 err = ynl_exec_dump(ys, nlh, &yds); 5969 if (err < 0) 5970 goto free_list; 5971 5972 return yds.first; 5973 5974free_list: 5975 devlink_trap_group_get_list_free(yds.first); 5976 return NULL; 5977} 5978 5979/* ============== DEVLINK_CMD_TRAP_GROUP_SET ============== */ 5980/* DEVLINK_CMD_TRAP_GROUP_SET - do */ 5981void devlink_trap_group_set_req_free(struct devlink_trap_group_set_req *req) 5982{ 5983 free(req->bus_name); 5984 free(req->dev_name); 5985 free(req->trap_group_name); 5986 free(req); 5987} 5988 5989int devlink_trap_group_set(struct ynl_sock *ys, 5990 struct devlink_trap_group_set_req *req) 5991{ 5992 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 5993 struct nlmsghdr *nlh; 5994 int err; 5995 5996 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_GROUP_SET, 1); 5997 ys->req_policy = &devlink_nest; 5998 5999 if (req->_present.bus_name_len) 6000 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6001 if (req->_present.dev_name_len) 6002 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6003 if (req->_present.trap_group_name_len) 6004 mnl_attr_put_strz(nlh, DEVLINK_ATTR_TRAP_GROUP_NAME, req->trap_group_name); 6005 if (req->_present.trap_action) 6006 mnl_attr_put_u8(nlh, DEVLINK_ATTR_TRAP_ACTION, req->trap_action); 6007 if (req->_present.trap_policer_id) 6008 mnl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req->trap_policer_id); 6009 6010 err = ynl_exec(ys, nlh, &yrs); 6011 if (err < 0) 6012 return -1; 6013 6014 return 0; 6015} 6016 6017/* ============== DEVLINK_CMD_TRAP_POLICER_GET ============== */ 6018/* DEVLINK_CMD_TRAP_POLICER_GET - do */ 6019void 6020devlink_trap_policer_get_req_free(struct devlink_trap_policer_get_req *req) 6021{ 6022 free(req->bus_name); 6023 free(req->dev_name); 6024 free(req); 6025} 6026 6027void 6028devlink_trap_policer_get_rsp_free(struct devlink_trap_policer_get_rsp *rsp) 6029{ 6030 free(rsp->bus_name); 6031 free(rsp->dev_name); 6032 free(rsp); 6033} 6034 6035int devlink_trap_policer_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 6036{ 6037 struct devlink_trap_policer_get_rsp *dst; 6038 struct ynl_parse_arg *yarg = data; 6039 const struct nlattr *attr; 6040 6041 dst = yarg->data; 6042 6043 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 6044 unsigned int type = mnl_attr_get_type(attr); 6045 6046 if (type == DEVLINK_ATTR_BUS_NAME) { 6047 unsigned int len; 6048 6049 if (ynl_attr_validate(yarg, attr)) 6050 return MNL_CB_ERROR; 6051 6052 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 6053 dst->_present.bus_name_len = len; 6054 dst->bus_name = malloc(len + 1); 6055 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 6056 dst->bus_name[len] = 0; 6057 } else if (type == DEVLINK_ATTR_DEV_NAME) { 6058 unsigned int len; 6059 6060 if (ynl_attr_validate(yarg, attr)) 6061 return MNL_CB_ERROR; 6062 6063 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 6064 dst->_present.dev_name_len = len; 6065 dst->dev_name = malloc(len + 1); 6066 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 6067 dst->dev_name[len] = 0; 6068 } else if (type == DEVLINK_ATTR_TRAP_POLICER_ID) { 6069 if (ynl_attr_validate(yarg, attr)) 6070 return MNL_CB_ERROR; 6071 dst->_present.trap_policer_id = 1; 6072 dst->trap_policer_id = mnl_attr_get_u32(attr); 6073 } 6074 } 6075 6076 return MNL_CB_OK; 6077} 6078 6079struct devlink_trap_policer_get_rsp * 6080devlink_trap_policer_get(struct ynl_sock *ys, 6081 struct devlink_trap_policer_get_req *req) 6082{ 6083 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6084 struct devlink_trap_policer_get_rsp *rsp; 6085 struct nlmsghdr *nlh; 6086 int err; 6087 6088 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_POLICER_GET, 1); 6089 ys->req_policy = &devlink_nest; 6090 yrs.yarg.rsp_policy = &devlink_nest; 6091 6092 if (req->_present.bus_name_len) 6093 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6094 if (req->_present.dev_name_len) 6095 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6096 if (req->_present.trap_policer_id) 6097 mnl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req->trap_policer_id); 6098 6099 rsp = calloc(1, sizeof(*rsp)); 6100 yrs.yarg.data = rsp; 6101 yrs.cb = devlink_trap_policer_get_rsp_parse; 6102 yrs.rsp_cmd = 71; 6103 6104 err = ynl_exec(ys, nlh, &yrs); 6105 if (err < 0) 6106 goto err_free; 6107 6108 return rsp; 6109 6110err_free: 6111 devlink_trap_policer_get_rsp_free(rsp); 6112 return NULL; 6113} 6114 6115/* DEVLINK_CMD_TRAP_POLICER_GET - dump */ 6116void 6117devlink_trap_policer_get_list_free(struct devlink_trap_policer_get_list *rsp) 6118{ 6119 struct devlink_trap_policer_get_list *next = rsp; 6120 6121 while ((void *)next != YNL_LIST_END) { 6122 rsp = next; 6123 next = rsp->next; 6124 6125 free(rsp->obj.bus_name); 6126 free(rsp->obj.dev_name); 6127 free(rsp); 6128 } 6129} 6130 6131struct devlink_trap_policer_get_list * 6132devlink_trap_policer_get_dump(struct ynl_sock *ys, 6133 struct devlink_trap_policer_get_req_dump *req) 6134{ 6135 struct ynl_dump_state yds = {}; 6136 struct nlmsghdr *nlh; 6137 int err; 6138 6139 yds.ys = ys; 6140 yds.alloc_sz = sizeof(struct devlink_trap_policer_get_list); 6141 yds.cb = devlink_trap_policer_get_rsp_parse; 6142 yds.rsp_cmd = 71; 6143 yds.rsp_policy = &devlink_nest; 6144 6145 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_TRAP_POLICER_GET, 1); 6146 ys->req_policy = &devlink_nest; 6147 6148 if (req->_present.bus_name_len) 6149 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6150 if (req->_present.dev_name_len) 6151 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6152 6153 err = ynl_exec_dump(ys, nlh, &yds); 6154 if (err < 0) 6155 goto free_list; 6156 6157 return yds.first; 6158 6159free_list: 6160 devlink_trap_policer_get_list_free(yds.first); 6161 return NULL; 6162} 6163 6164/* ============== DEVLINK_CMD_TRAP_POLICER_SET ============== */ 6165/* DEVLINK_CMD_TRAP_POLICER_SET - do */ 6166void 6167devlink_trap_policer_set_req_free(struct devlink_trap_policer_set_req *req) 6168{ 6169 free(req->bus_name); 6170 free(req->dev_name); 6171 free(req); 6172} 6173 6174int devlink_trap_policer_set(struct ynl_sock *ys, 6175 struct devlink_trap_policer_set_req *req) 6176{ 6177 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6178 struct nlmsghdr *nlh; 6179 int err; 6180 6181 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_TRAP_POLICER_SET, 1); 6182 ys->req_policy = &devlink_nest; 6183 6184 if (req->_present.bus_name_len) 6185 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6186 if (req->_present.dev_name_len) 6187 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6188 if (req->_present.trap_policer_id) 6189 mnl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req->trap_policer_id); 6190 if (req->_present.trap_policer_rate) 6191 mnl_attr_put_u64(nlh, DEVLINK_ATTR_TRAP_POLICER_RATE, req->trap_policer_rate); 6192 if (req->_present.trap_policer_burst) 6193 mnl_attr_put_u64(nlh, DEVLINK_ATTR_TRAP_POLICER_BURST, req->trap_policer_burst); 6194 6195 err = ynl_exec(ys, nlh, &yrs); 6196 if (err < 0) 6197 return -1; 6198 6199 return 0; 6200} 6201 6202/* ============== DEVLINK_CMD_HEALTH_REPORTER_TEST ============== */ 6203/* DEVLINK_CMD_HEALTH_REPORTER_TEST - do */ 6204void 6205devlink_health_reporter_test_req_free(struct devlink_health_reporter_test_req *req) 6206{ 6207 free(req->bus_name); 6208 free(req->dev_name); 6209 free(req->health_reporter_name); 6210 free(req); 6211} 6212 6213int devlink_health_reporter_test(struct ynl_sock *ys, 6214 struct devlink_health_reporter_test_req *req) 6215{ 6216 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6217 struct nlmsghdr *nlh; 6218 int err; 6219 6220 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_HEALTH_REPORTER_TEST, 1); 6221 ys->req_policy = &devlink_nest; 6222 6223 if (req->_present.bus_name_len) 6224 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6225 if (req->_present.dev_name_len) 6226 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6227 if (req->_present.port_index) 6228 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 6229 if (req->_present.health_reporter_name_len) 6230 mnl_attr_put_strz(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req->health_reporter_name); 6231 6232 err = ynl_exec(ys, nlh, &yrs); 6233 if (err < 0) 6234 return -1; 6235 6236 return 0; 6237} 6238 6239/* ============== DEVLINK_CMD_RATE_GET ============== */ 6240/* DEVLINK_CMD_RATE_GET - do */ 6241void devlink_rate_get_req_free(struct devlink_rate_get_req *req) 6242{ 6243 free(req->bus_name); 6244 free(req->dev_name); 6245 free(req->rate_node_name); 6246 free(req); 6247} 6248 6249void devlink_rate_get_rsp_free(struct devlink_rate_get_rsp *rsp) 6250{ 6251 free(rsp->bus_name); 6252 free(rsp->dev_name); 6253 free(rsp->rate_node_name); 6254 free(rsp); 6255} 6256 6257int devlink_rate_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 6258{ 6259 struct ynl_parse_arg *yarg = data; 6260 struct devlink_rate_get_rsp *dst; 6261 const struct nlattr *attr; 6262 6263 dst = yarg->data; 6264 6265 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 6266 unsigned int type = mnl_attr_get_type(attr); 6267 6268 if (type == DEVLINK_ATTR_BUS_NAME) { 6269 unsigned int len; 6270 6271 if (ynl_attr_validate(yarg, attr)) 6272 return MNL_CB_ERROR; 6273 6274 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 6275 dst->_present.bus_name_len = len; 6276 dst->bus_name = malloc(len + 1); 6277 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 6278 dst->bus_name[len] = 0; 6279 } else if (type == DEVLINK_ATTR_DEV_NAME) { 6280 unsigned int len; 6281 6282 if (ynl_attr_validate(yarg, attr)) 6283 return MNL_CB_ERROR; 6284 6285 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 6286 dst->_present.dev_name_len = len; 6287 dst->dev_name = malloc(len + 1); 6288 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 6289 dst->dev_name[len] = 0; 6290 } else if (type == DEVLINK_ATTR_PORT_INDEX) { 6291 if (ynl_attr_validate(yarg, attr)) 6292 return MNL_CB_ERROR; 6293 dst->_present.port_index = 1; 6294 dst->port_index = mnl_attr_get_u32(attr); 6295 } else if (type == DEVLINK_ATTR_RATE_NODE_NAME) { 6296 unsigned int len; 6297 6298 if (ynl_attr_validate(yarg, attr)) 6299 return MNL_CB_ERROR; 6300 6301 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 6302 dst->_present.rate_node_name_len = len; 6303 dst->rate_node_name = malloc(len + 1); 6304 memcpy(dst->rate_node_name, mnl_attr_get_str(attr), len); 6305 dst->rate_node_name[len] = 0; 6306 } 6307 } 6308 6309 return MNL_CB_OK; 6310} 6311 6312struct devlink_rate_get_rsp * 6313devlink_rate_get(struct ynl_sock *ys, struct devlink_rate_get_req *req) 6314{ 6315 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6316 struct devlink_rate_get_rsp *rsp; 6317 struct nlmsghdr *nlh; 6318 int err; 6319 6320 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_RATE_GET, 1); 6321 ys->req_policy = &devlink_nest; 6322 yrs.yarg.rsp_policy = &devlink_nest; 6323 6324 if (req->_present.bus_name_len) 6325 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6326 if (req->_present.dev_name_len) 6327 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6328 if (req->_present.port_index) 6329 mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req->port_index); 6330 if (req->_present.rate_node_name_len) 6331 mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req->rate_node_name); 6332 6333 rsp = calloc(1, sizeof(*rsp)); 6334 yrs.yarg.data = rsp; 6335 yrs.cb = devlink_rate_get_rsp_parse; 6336 yrs.rsp_cmd = 76; 6337 6338 err = ynl_exec(ys, nlh, &yrs); 6339 if (err < 0) 6340 goto err_free; 6341 6342 return rsp; 6343 6344err_free: 6345 devlink_rate_get_rsp_free(rsp); 6346 return NULL; 6347} 6348 6349/* DEVLINK_CMD_RATE_GET - dump */ 6350void devlink_rate_get_list_free(struct devlink_rate_get_list *rsp) 6351{ 6352 struct devlink_rate_get_list *next = rsp; 6353 6354 while ((void *)next != YNL_LIST_END) { 6355 rsp = next; 6356 next = rsp->next; 6357 6358 free(rsp->obj.bus_name); 6359 free(rsp->obj.dev_name); 6360 free(rsp->obj.rate_node_name); 6361 free(rsp); 6362 } 6363} 6364 6365struct devlink_rate_get_list * 6366devlink_rate_get_dump(struct ynl_sock *ys, 6367 struct devlink_rate_get_req_dump *req) 6368{ 6369 struct ynl_dump_state yds = {}; 6370 struct nlmsghdr *nlh; 6371 int err; 6372 6373 yds.ys = ys; 6374 yds.alloc_sz = sizeof(struct devlink_rate_get_list); 6375 yds.cb = devlink_rate_get_rsp_parse; 6376 yds.rsp_cmd = 76; 6377 yds.rsp_policy = &devlink_nest; 6378 6379 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_RATE_GET, 1); 6380 ys->req_policy = &devlink_nest; 6381 6382 if (req->_present.bus_name_len) 6383 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6384 if (req->_present.dev_name_len) 6385 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6386 6387 err = ynl_exec_dump(ys, nlh, &yds); 6388 if (err < 0) 6389 goto free_list; 6390 6391 return yds.first; 6392 6393free_list: 6394 devlink_rate_get_list_free(yds.first); 6395 return NULL; 6396} 6397 6398/* ============== DEVLINK_CMD_RATE_SET ============== */ 6399/* DEVLINK_CMD_RATE_SET - do */ 6400void devlink_rate_set_req_free(struct devlink_rate_set_req *req) 6401{ 6402 free(req->bus_name); 6403 free(req->dev_name); 6404 free(req->rate_node_name); 6405 free(req->rate_parent_node_name); 6406 free(req); 6407} 6408 6409int devlink_rate_set(struct ynl_sock *ys, struct devlink_rate_set_req *req) 6410{ 6411 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6412 struct nlmsghdr *nlh; 6413 int err; 6414 6415 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_RATE_SET, 1); 6416 ys->req_policy = &devlink_nest; 6417 6418 if (req->_present.bus_name_len) 6419 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6420 if (req->_present.dev_name_len) 6421 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6422 if (req->_present.rate_node_name_len) 6423 mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req->rate_node_name); 6424 if (req->_present.rate_tx_share) 6425 mnl_attr_put_u64(nlh, DEVLINK_ATTR_RATE_TX_SHARE, req->rate_tx_share); 6426 if (req->_present.rate_tx_max) 6427 mnl_attr_put_u64(nlh, DEVLINK_ATTR_RATE_TX_MAX, req->rate_tx_max); 6428 if (req->_present.rate_tx_priority) 6429 mnl_attr_put_u32(nlh, DEVLINK_ATTR_RATE_TX_PRIORITY, req->rate_tx_priority); 6430 if (req->_present.rate_tx_weight) 6431 mnl_attr_put_u32(nlh, DEVLINK_ATTR_RATE_TX_WEIGHT, req->rate_tx_weight); 6432 if (req->_present.rate_parent_node_name_len) 6433 mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_PARENT_NODE_NAME, req->rate_parent_node_name); 6434 6435 err = ynl_exec(ys, nlh, &yrs); 6436 if (err < 0) 6437 return -1; 6438 6439 return 0; 6440} 6441 6442/* ============== DEVLINK_CMD_RATE_NEW ============== */ 6443/* DEVLINK_CMD_RATE_NEW - do */ 6444void devlink_rate_new_req_free(struct devlink_rate_new_req *req) 6445{ 6446 free(req->bus_name); 6447 free(req->dev_name); 6448 free(req->rate_node_name); 6449 free(req->rate_parent_node_name); 6450 free(req); 6451} 6452 6453int devlink_rate_new(struct ynl_sock *ys, struct devlink_rate_new_req *req) 6454{ 6455 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6456 struct nlmsghdr *nlh; 6457 int err; 6458 6459 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_RATE_NEW, 1); 6460 ys->req_policy = &devlink_nest; 6461 6462 if (req->_present.bus_name_len) 6463 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6464 if (req->_present.dev_name_len) 6465 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6466 if (req->_present.rate_node_name_len) 6467 mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req->rate_node_name); 6468 if (req->_present.rate_tx_share) 6469 mnl_attr_put_u64(nlh, DEVLINK_ATTR_RATE_TX_SHARE, req->rate_tx_share); 6470 if (req->_present.rate_tx_max) 6471 mnl_attr_put_u64(nlh, DEVLINK_ATTR_RATE_TX_MAX, req->rate_tx_max); 6472 if (req->_present.rate_tx_priority) 6473 mnl_attr_put_u32(nlh, DEVLINK_ATTR_RATE_TX_PRIORITY, req->rate_tx_priority); 6474 if (req->_present.rate_tx_weight) 6475 mnl_attr_put_u32(nlh, DEVLINK_ATTR_RATE_TX_WEIGHT, req->rate_tx_weight); 6476 if (req->_present.rate_parent_node_name_len) 6477 mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_PARENT_NODE_NAME, req->rate_parent_node_name); 6478 6479 err = ynl_exec(ys, nlh, &yrs); 6480 if (err < 0) 6481 return -1; 6482 6483 return 0; 6484} 6485 6486/* ============== DEVLINK_CMD_RATE_DEL ============== */ 6487/* DEVLINK_CMD_RATE_DEL - do */ 6488void devlink_rate_del_req_free(struct devlink_rate_del_req *req) 6489{ 6490 free(req->bus_name); 6491 free(req->dev_name); 6492 free(req->rate_node_name); 6493 free(req); 6494} 6495 6496int devlink_rate_del(struct ynl_sock *ys, struct devlink_rate_del_req *req) 6497{ 6498 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6499 struct nlmsghdr *nlh; 6500 int err; 6501 6502 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_RATE_DEL, 1); 6503 ys->req_policy = &devlink_nest; 6504 6505 if (req->_present.bus_name_len) 6506 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6507 if (req->_present.dev_name_len) 6508 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6509 if (req->_present.rate_node_name_len) 6510 mnl_attr_put_strz(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req->rate_node_name); 6511 6512 err = ynl_exec(ys, nlh, &yrs); 6513 if (err < 0) 6514 return -1; 6515 6516 return 0; 6517} 6518 6519/* ============== DEVLINK_CMD_LINECARD_GET ============== */ 6520/* DEVLINK_CMD_LINECARD_GET - do */ 6521void devlink_linecard_get_req_free(struct devlink_linecard_get_req *req) 6522{ 6523 free(req->bus_name); 6524 free(req->dev_name); 6525 free(req); 6526} 6527 6528void devlink_linecard_get_rsp_free(struct devlink_linecard_get_rsp *rsp) 6529{ 6530 free(rsp->bus_name); 6531 free(rsp->dev_name); 6532 free(rsp); 6533} 6534 6535int devlink_linecard_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 6536{ 6537 struct devlink_linecard_get_rsp *dst; 6538 struct ynl_parse_arg *yarg = data; 6539 const struct nlattr *attr; 6540 6541 dst = yarg->data; 6542 6543 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 6544 unsigned int type = mnl_attr_get_type(attr); 6545 6546 if (type == DEVLINK_ATTR_BUS_NAME) { 6547 unsigned int len; 6548 6549 if (ynl_attr_validate(yarg, attr)) 6550 return MNL_CB_ERROR; 6551 6552 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 6553 dst->_present.bus_name_len = len; 6554 dst->bus_name = malloc(len + 1); 6555 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 6556 dst->bus_name[len] = 0; 6557 } else if (type == DEVLINK_ATTR_DEV_NAME) { 6558 unsigned int len; 6559 6560 if (ynl_attr_validate(yarg, attr)) 6561 return MNL_CB_ERROR; 6562 6563 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 6564 dst->_present.dev_name_len = len; 6565 dst->dev_name = malloc(len + 1); 6566 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 6567 dst->dev_name[len] = 0; 6568 } else if (type == DEVLINK_ATTR_LINECARD_INDEX) { 6569 if (ynl_attr_validate(yarg, attr)) 6570 return MNL_CB_ERROR; 6571 dst->_present.linecard_index = 1; 6572 dst->linecard_index = mnl_attr_get_u32(attr); 6573 } 6574 } 6575 6576 return MNL_CB_OK; 6577} 6578 6579struct devlink_linecard_get_rsp * 6580devlink_linecard_get(struct ynl_sock *ys, struct devlink_linecard_get_req *req) 6581{ 6582 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6583 struct devlink_linecard_get_rsp *rsp; 6584 struct nlmsghdr *nlh; 6585 int err; 6586 6587 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_LINECARD_GET, 1); 6588 ys->req_policy = &devlink_nest; 6589 yrs.yarg.rsp_policy = &devlink_nest; 6590 6591 if (req->_present.bus_name_len) 6592 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6593 if (req->_present.dev_name_len) 6594 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6595 if (req->_present.linecard_index) 6596 mnl_attr_put_u32(nlh, DEVLINK_ATTR_LINECARD_INDEX, req->linecard_index); 6597 6598 rsp = calloc(1, sizeof(*rsp)); 6599 yrs.yarg.data = rsp; 6600 yrs.cb = devlink_linecard_get_rsp_parse; 6601 yrs.rsp_cmd = 80; 6602 6603 err = ynl_exec(ys, nlh, &yrs); 6604 if (err < 0) 6605 goto err_free; 6606 6607 return rsp; 6608 6609err_free: 6610 devlink_linecard_get_rsp_free(rsp); 6611 return NULL; 6612} 6613 6614/* DEVLINK_CMD_LINECARD_GET - dump */ 6615void devlink_linecard_get_list_free(struct devlink_linecard_get_list *rsp) 6616{ 6617 struct devlink_linecard_get_list *next = rsp; 6618 6619 while ((void *)next != YNL_LIST_END) { 6620 rsp = next; 6621 next = rsp->next; 6622 6623 free(rsp->obj.bus_name); 6624 free(rsp->obj.dev_name); 6625 free(rsp); 6626 } 6627} 6628 6629struct devlink_linecard_get_list * 6630devlink_linecard_get_dump(struct ynl_sock *ys, 6631 struct devlink_linecard_get_req_dump *req) 6632{ 6633 struct ynl_dump_state yds = {}; 6634 struct nlmsghdr *nlh; 6635 int err; 6636 6637 yds.ys = ys; 6638 yds.alloc_sz = sizeof(struct devlink_linecard_get_list); 6639 yds.cb = devlink_linecard_get_rsp_parse; 6640 yds.rsp_cmd = 80; 6641 yds.rsp_policy = &devlink_nest; 6642 6643 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_LINECARD_GET, 1); 6644 ys->req_policy = &devlink_nest; 6645 6646 if (req->_present.bus_name_len) 6647 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6648 if (req->_present.dev_name_len) 6649 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6650 6651 err = ynl_exec_dump(ys, nlh, &yds); 6652 if (err < 0) 6653 goto free_list; 6654 6655 return yds.first; 6656 6657free_list: 6658 devlink_linecard_get_list_free(yds.first); 6659 return NULL; 6660} 6661 6662/* ============== DEVLINK_CMD_LINECARD_SET ============== */ 6663/* DEVLINK_CMD_LINECARD_SET - do */ 6664void devlink_linecard_set_req_free(struct devlink_linecard_set_req *req) 6665{ 6666 free(req->bus_name); 6667 free(req->dev_name); 6668 free(req->linecard_type); 6669 free(req); 6670} 6671 6672int devlink_linecard_set(struct ynl_sock *ys, 6673 struct devlink_linecard_set_req *req) 6674{ 6675 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6676 struct nlmsghdr *nlh; 6677 int err; 6678 6679 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_LINECARD_SET, 1); 6680 ys->req_policy = &devlink_nest; 6681 6682 if (req->_present.bus_name_len) 6683 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6684 if (req->_present.dev_name_len) 6685 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6686 if (req->_present.linecard_index) 6687 mnl_attr_put_u32(nlh, DEVLINK_ATTR_LINECARD_INDEX, req->linecard_index); 6688 if (req->_present.linecard_type_len) 6689 mnl_attr_put_strz(nlh, DEVLINK_ATTR_LINECARD_TYPE, req->linecard_type); 6690 6691 err = ynl_exec(ys, nlh, &yrs); 6692 if (err < 0) 6693 return -1; 6694 6695 return 0; 6696} 6697 6698/* ============== DEVLINK_CMD_SELFTESTS_GET ============== */ 6699/* DEVLINK_CMD_SELFTESTS_GET - do */ 6700void devlink_selftests_get_req_free(struct devlink_selftests_get_req *req) 6701{ 6702 free(req->bus_name); 6703 free(req->dev_name); 6704 free(req); 6705} 6706 6707void devlink_selftests_get_rsp_free(struct devlink_selftests_get_rsp *rsp) 6708{ 6709 free(rsp->bus_name); 6710 free(rsp->dev_name); 6711 free(rsp); 6712} 6713 6714int devlink_selftests_get_rsp_parse(const struct nlmsghdr *nlh, void *data) 6715{ 6716 struct devlink_selftests_get_rsp *dst; 6717 struct ynl_parse_arg *yarg = data; 6718 const struct nlattr *attr; 6719 6720 dst = yarg->data; 6721 6722 mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { 6723 unsigned int type = mnl_attr_get_type(attr); 6724 6725 if (type == DEVLINK_ATTR_BUS_NAME) { 6726 unsigned int len; 6727 6728 if (ynl_attr_validate(yarg, attr)) 6729 return MNL_CB_ERROR; 6730 6731 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 6732 dst->_present.bus_name_len = len; 6733 dst->bus_name = malloc(len + 1); 6734 memcpy(dst->bus_name, mnl_attr_get_str(attr), len); 6735 dst->bus_name[len] = 0; 6736 } else if (type == DEVLINK_ATTR_DEV_NAME) { 6737 unsigned int len; 6738 6739 if (ynl_attr_validate(yarg, attr)) 6740 return MNL_CB_ERROR; 6741 6742 len = strnlen(mnl_attr_get_str(attr), mnl_attr_get_payload_len(attr)); 6743 dst->_present.dev_name_len = len; 6744 dst->dev_name = malloc(len + 1); 6745 memcpy(dst->dev_name, mnl_attr_get_str(attr), len); 6746 dst->dev_name[len] = 0; 6747 } 6748 } 6749 6750 return MNL_CB_OK; 6751} 6752 6753struct devlink_selftests_get_rsp * 6754devlink_selftests_get(struct ynl_sock *ys, 6755 struct devlink_selftests_get_req *req) 6756{ 6757 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6758 struct devlink_selftests_get_rsp *rsp; 6759 struct nlmsghdr *nlh; 6760 int err; 6761 6762 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SELFTESTS_GET, 1); 6763 ys->req_policy = &devlink_nest; 6764 yrs.yarg.rsp_policy = &devlink_nest; 6765 6766 if (req->_present.bus_name_len) 6767 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6768 if (req->_present.dev_name_len) 6769 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6770 6771 rsp = calloc(1, sizeof(*rsp)); 6772 yrs.yarg.data = rsp; 6773 yrs.cb = devlink_selftests_get_rsp_parse; 6774 yrs.rsp_cmd = DEVLINK_CMD_SELFTESTS_GET; 6775 6776 err = ynl_exec(ys, nlh, &yrs); 6777 if (err < 0) 6778 goto err_free; 6779 6780 return rsp; 6781 6782err_free: 6783 devlink_selftests_get_rsp_free(rsp); 6784 return NULL; 6785} 6786 6787/* DEVLINK_CMD_SELFTESTS_GET - dump */ 6788void devlink_selftests_get_list_free(struct devlink_selftests_get_list *rsp) 6789{ 6790 struct devlink_selftests_get_list *next = rsp; 6791 6792 while ((void *)next != YNL_LIST_END) { 6793 rsp = next; 6794 next = rsp->next; 6795 6796 free(rsp->obj.bus_name); 6797 free(rsp->obj.dev_name); 6798 free(rsp); 6799 } 6800} 6801 6802struct devlink_selftests_get_list * 6803devlink_selftests_get_dump(struct ynl_sock *ys) 6804{ 6805 struct ynl_dump_state yds = {}; 6806 struct nlmsghdr *nlh; 6807 int err; 6808 6809 yds.ys = ys; 6810 yds.alloc_sz = sizeof(struct devlink_selftests_get_list); 6811 yds.cb = devlink_selftests_get_rsp_parse; 6812 yds.rsp_cmd = DEVLINK_CMD_SELFTESTS_GET; 6813 yds.rsp_policy = &devlink_nest; 6814 6815 nlh = ynl_gemsg_start_dump(ys, ys->family_id, DEVLINK_CMD_SELFTESTS_GET, 1); 6816 6817 err = ynl_exec_dump(ys, nlh, &yds); 6818 if (err < 0) 6819 goto free_list; 6820 6821 return yds.first; 6822 6823free_list: 6824 devlink_selftests_get_list_free(yds.first); 6825 return NULL; 6826} 6827 6828/* ============== DEVLINK_CMD_SELFTESTS_RUN ============== */ 6829/* DEVLINK_CMD_SELFTESTS_RUN - do */ 6830void devlink_selftests_run_req_free(struct devlink_selftests_run_req *req) 6831{ 6832 free(req->bus_name); 6833 free(req->dev_name); 6834 devlink_dl_selftest_id_free(&req->selftests); 6835 free(req); 6836} 6837 6838int devlink_selftests_run(struct ynl_sock *ys, 6839 struct devlink_selftests_run_req *req) 6840{ 6841 struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; 6842 struct nlmsghdr *nlh; 6843 int err; 6844 6845 nlh = ynl_gemsg_start_req(ys, ys->family_id, DEVLINK_CMD_SELFTESTS_RUN, 1); 6846 ys->req_policy = &devlink_nest; 6847 6848 if (req->_present.bus_name_len) 6849 mnl_attr_put_strz(nlh, DEVLINK_ATTR_BUS_NAME, req->bus_name); 6850 if (req->_present.dev_name_len) 6851 mnl_attr_put_strz(nlh, DEVLINK_ATTR_DEV_NAME, req->dev_name); 6852 if (req->_present.selftests) 6853 devlink_dl_selftest_id_put(nlh, DEVLINK_ATTR_SELFTESTS, &req->selftests); 6854 6855 err = ynl_exec(ys, nlh, &yrs); 6856 if (err < 0) 6857 return -1; 6858 6859 return 0; 6860} 6861 6862const struct ynl_family ynl_devlink_family = { 6863 .name = "devlink", 6864};