From 67c8486ed7c7e08b14175579169e1a208228cc5b Mon Sep 17 00:00:00 2001 From: Sheldon Wu Date: Wed, 7 Jan 2026 21:13:01 -0800 Subject: [PATCH 1/3] ynl-gen-cpp: add support for generating devlink ovs_datapath ovs_vport Summary: Enable code gen netlink for devlink ovs_datapath ovs_vport devlink need support limits using definitions. backport logic from net-next net-next: 1. tools: ynl-gen: use names of constants in generated limits(commit bcbbfaa2612d7d0e9c3eafade5f6e93c3672f34f) 2.tools: ynl-gen: support limits using definitions(commit fa796178e5eb0078a9a6c36f60fd6494cfc3f81d) Test Plan: make sure code could be generated and compiled Signed-off-by: Sheldon Wu --- generated/Makefile | 2 +- generated/devlink-user.cpp | 3150 ++++++++++++++++++++++------------ generated/devlink-user.hpp | 243 +-- generated/ovs_vport-user.cpp | 388 +++++ generated/ovs_vport-user.hpp | 117 ++ ynl-gen-cpp.py | 35 +- 6 files changed, 2720 insertions(+), 1215 deletions(-) create mode 100644 generated/ovs_vport-user.cpp create mode 100644 generated/ovs_vport-user.hpp diff --git a/generated/Makefile b/generated/Makefile index baf24e6..49f658b 100644 --- a/generated/Makefile +++ b/generated/Makefile @@ -17,7 +17,7 @@ GENS_PATHS=$(shell grep -nrI --files-without-match \ 'protocol: netlink' ../Documentation/netlink/specs/) GENS_PATHS+=$(wildcard ../Documentation/netlink/specs/rt-*.yaml) GENS_ALL=$(patsubst ../Documentation/netlink/specs/%.yaml,%,${GENS_PATHS}) -GENS=$(filter-out devlink ovs_datapath ovs_flow ovs_vport nlctrl,${GENS_ALL}) +GENS=$(filter-out ovs_flow nlctrl,${GENS_ALL}) SRCS=$(patsubst %,%-user.cpp,${GENS}) HDRS=$(patsubst %,%-user.hpp,${GENS}) OBJS=$(patsubst %,%-user.cpp.o,${GENS}) diff --git a/generated/devlink-user.cpp b/generated/devlink-user.cpp index 618a23f..7bb260a 100644 --- a/generated/devlink-user.cpp +++ b/generated/devlink-user.cpp @@ -47,8 +47,9 @@ static constexpr std::array dev std::string_view devlink_op_str(int op) { - if (op < 0 || op >= (int)(devlink_op_strmap.size())) + if (op < 0 || op >= (int)(devlink_op_strmap.size())) { return ""; + } return devlink_op_strmap[op]; } @@ -61,8 +62,9 @@ static constexpr std::array devlink_sb_pool_type_strmap std::string_view devlink_sb_pool_type_str(devlink_sb_pool_type value) { - if (value < 0 || value >= (int)(devlink_sb_pool_type_strmap.size())) + if (value < 0 || value >= (int)(devlink_sb_pool_type_strmap.size())) { return ""; + } return devlink_sb_pool_type_strmap[value]; } @@ -77,8 +79,9 @@ static constexpr std::array devlink_port_type_strmap = std::string_view devlink_port_type_str(devlink_port_type value) { - if (value < 0 || value >= (int)(devlink_port_type_strmap.size())) + if (value < 0 || value >= (int)(devlink_port_type_strmap.size())) { return ""; + } return devlink_port_type_strmap[value]; } @@ -87,18 +90,19 @@ static constexpr std::array devlink_port_flavour_strmap arr[0] = "physical"; arr[1] = "cpu"; arr[2] = "dsa"; - arr[3] = "pci_pf"; - arr[4] = "pci_vf"; + arr[3] = "pci-pf"; + arr[4] = "pci-vf"; arr[5] = "virtual"; arr[6] = "unused"; - arr[7] = "pci_sf"; + arr[7] = "pci-sf"; return arr; } (); std::string_view devlink_port_flavour_str(devlink_port_flavour value) { - if (value < 0 || value >= (int)(devlink_port_flavour_strmap.size())) + if (value < 0 || value >= (int)(devlink_port_flavour_strmap.size())) { return ""; + } return devlink_port_flavour_strmap[value]; } @@ -111,8 +115,9 @@ static constexpr std::array devlink_port_fn_state_strma std::string_view devlink_port_fn_state_str(devlink_port_fn_state value) { - if (value < 0 || value >= (int)(devlink_port_fn_state_strmap.size())) + if (value < 0 || value >= (int)(devlink_port_fn_state_strmap.size())) { return ""; + } return devlink_port_fn_state_strmap[value]; } @@ -125,8 +130,9 @@ static constexpr std::array devlink_port_fn_opstate_str std::string_view devlink_port_fn_opstate_str(devlink_port_fn_opstate value) { - if (value < 0 || value >= (int)(devlink_port_fn_opstate_strmap.size())) + if (value < 0 || value >= (int)(devlink_port_fn_opstate_strmap.size())) { return ""; + } return devlink_port_fn_opstate_strmap[value]; } @@ -141,8 +147,9 @@ static constexpr std::array devlink_port_fn_attr_cap_st std::string_view devlink_port_fn_attr_cap_str(devlink_port_fn_attr_cap value) { - if (value < 0 || value >= (int)(devlink_port_fn_attr_cap_strmap.size())) + if (value < 0 || value >= (int)(devlink_port_fn_attr_cap_strmap.size())) { return ""; + } return devlink_port_fn_attr_cap_strmap[value]; } @@ -155,8 +162,9 @@ static constexpr std::array devlink_rate_type_strmap = std::string_view devlink_rate_type_str(devlink_rate_type value) { - if (value < 0 || value >= (int)(devlink_rate_type_strmap.size())) + if (value < 0 || value >= (int)(devlink_rate_type_strmap.size())) { return ""; + } return devlink_rate_type_strmap[value]; } @@ -169,8 +177,9 @@ static constexpr std::array devlink_sb_threshold_type_s std::string_view devlink_sb_threshold_type_str(devlink_sb_threshold_type value) { - if (value < 0 || value >= (int)(devlink_sb_threshold_type_strmap.size())) + if (value < 0 || value >= (int)(devlink_sb_threshold_type_strmap.size())) { return ""; + } return devlink_sb_threshold_type_strmap[value]; } @@ -183,8 +192,9 @@ static constexpr std::array devlink_eswitch_mode_strmap std::string_view devlink_eswitch_mode_str(devlink_eswitch_mode value) { - if (value < 0 || value >= (int)(devlink_eswitch_mode_strmap.size())) + if (value < 0 || value >= (int)(devlink_eswitch_mode_strmap.size())) { return ""; + } return devlink_eswitch_mode_strmap[value]; } @@ -200,8 +210,9 @@ static constexpr std::array devlink_eswitch_inline_mode std::string_view devlink_eswitch_inline_mode_str(devlink_eswitch_inline_mode value) { - if (value < 0 || value >= (int)(devlink_eswitch_inline_mode_strmap.size())) + if (value < 0 || value >= (int)(devlink_eswitch_inline_mode_strmap.size())) { return ""; + } return devlink_eswitch_inline_mode_strmap[value]; } @@ -215,8 +226,9 @@ static constexpr std::array devlink_eswitch_encap_mode_ std::string_view devlink_eswitch_encap_mode_str(devlink_eswitch_encap_mode value) { - if (value < 0 || value >= (int)(devlink_eswitch_encap_mode_strmap.size())) + if (value < 0 || value >= (int)(devlink_eswitch_encap_mode_strmap.size())) { return ""; + } return devlink_eswitch_encap_mode_strmap[value]; } @@ -230,8 +242,9 @@ static constexpr std::array devlink_dpipe_header_id_str std::string_view devlink_dpipe_header_id_str(devlink_dpipe_header_id value) { - if (value < 0 || value >= (int)(devlink_dpipe_header_id_strmap.size())) + if (value < 0 || value >= (int)(devlink_dpipe_header_id_strmap.size())) { return ""; + } return devlink_dpipe_header_id_strmap[value]; } @@ -243,8 +256,9 @@ static constexpr std::array devlink_dpipe_match_type_st std::string_view devlink_dpipe_match_type_str(devlink_dpipe_match_type value) { - if (value < 0 || value >= (int)(devlink_dpipe_match_type_strmap.size())) + if (value < 0 || value >= (int)(devlink_dpipe_match_type_strmap.size())) { return ""; + } return devlink_dpipe_match_type_strmap[value]; } @@ -256,8 +270,9 @@ static constexpr std::array devlink_dpipe_action_type_s std::string_view devlink_dpipe_action_type_str(devlink_dpipe_action_type value) { - if (value < 0 || value >= (int)(devlink_dpipe_action_type_strmap.size())) + if (value < 0 || value >= (int)(devlink_dpipe_action_type_strmap.size())) { return ""; + } return devlink_dpipe_action_type_strmap[value]; } @@ -271,8 +286,9 @@ static constexpr std::array devlink_dpipe_field_mapping std::string_view devlink_dpipe_field_mapping_type_str(devlink_dpipe_field_mapping_type value) { - if (value < 0 || value >= (int)(devlink_dpipe_field_mapping_type_strmap.size())) + if (value < 0 || value >= (int)(devlink_dpipe_field_mapping_type_strmap.size())) { return ""; + } return devlink_dpipe_field_mapping_type_strmap[value]; } @@ -284,8 +300,9 @@ static constexpr std::array devlink_resource_unit_strma std::string_view devlink_resource_unit_str(devlink_resource_unit value) { - if (value < 0 || value >= (int)(devlink_resource_unit_strmap.size())) + if (value < 0 || value >= (int)(devlink_resource_unit_strmap.size())) { return ""; + } return devlink_resource_unit_strmap[value]; } @@ -298,8 +315,9 @@ static constexpr std::array devlink_reload_action_strma std::string_view devlink_reload_action_str(devlink_reload_action value) { - if (value < 0 || value >= (int)(devlink_reload_action_strmap.size())) + if (value < 0 || value >= (int)(devlink_reload_action_strmap.size())) { return ""; + } return devlink_reload_action_strmap[value]; } @@ -313,8 +331,9 @@ static constexpr std::array devlink_param_cmode_strmap std::string_view devlink_param_cmode_str(devlink_param_cmode value) { - if (value < 0 || value >= (int)(devlink_param_cmode_strmap.size())) + if (value < 0 || value >= (int)(devlink_param_cmode_strmap.size())) { return ""; + } return devlink_param_cmode_strmap[value]; } @@ -327,8 +346,9 @@ static constexpr std::array devlink_flash_overwrite_str std::string_view devlink_flash_overwrite_str(devlink_flash_overwrite value) { - if (value < 0 || value >= (int)(devlink_flash_overwrite_strmap.size())) + if (value < 0 || value >= (int)(devlink_flash_overwrite_strmap.size())) { return ""; + } return devlink_flash_overwrite_strmap[value]; } @@ -342,8 +362,9 @@ static constexpr std::array devlink_trap_action_strmap std::string_view devlink_trap_action_str(devlink_trap_action value) { - if (value < 0 || value >= (int)(devlink_trap_action_strmap.size())) + if (value < 0 || value >= (int)(devlink_trap_action_strmap.size())) { return ""; + } return devlink_trap_action_strmap[value]; } @@ -357,652 +378,1030 @@ static constexpr std::array devlink_trap_type_strmap = std::string_view devlink_trap_type_str(devlink_trap_type value) { - if (value < 0 || value >= (int)(devlink_trap_type_strmap.size())) + if (value < 0 || value >= (int)(devlink_trap_type_strmap.size())) { return ""; + } return devlink_trap_type_strmap[value]; } +static constexpr std::array devlink_var_attr_type_strmap = []() { + std::array arr{}; + arr[1] = "u8"; + arr[2] = "u16"; + arr[3] = "u32"; + arr[4] = "u64"; + arr[5] = "string"; + arr[6] = "flag"; + arr[10] = "nul-string"; + arr[11] = "binary"; + return arr; +} (); + +std::string_view devlink_var_attr_type_str(devlink_var_attr_type value) +{ + if (value < 0 || value >= (int)(devlink_var_attr_type_strmap.size())) { + return ""; + } + return devlink_var_attr_type_strmap[value]; +} + /* Policies */ static std::array devlink_dl_dpipe_match_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_MATCH_TYPE] = { .name = "dpipe-match-type", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_ID] = { .name = "dpipe-header-id", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL] = { .name = "dpipe-header-global", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_INDEX] = { .name = "dpipe-header-index", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_FIELD_ID] = { .name = "dpipe-field-id", .type = YNL_PT_U32, }; + arr[DEVLINK_ATTR_DPIPE_MATCH_TYPE].name = "dpipe-match-type"; + arr[DEVLINK_ATTR_DPIPE_MATCH_TYPE].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_HEADER_ID].name = "dpipe-header-id"; + arr[DEVLINK_ATTR_DPIPE_HEADER_ID].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL].name = "dpipe-header-global"; + arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL].type = YNL_PT_U8; + arr[DEVLINK_ATTR_DPIPE_HEADER_INDEX].name = "dpipe-header-index"; + arr[DEVLINK_ATTR_DPIPE_HEADER_INDEX].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_FIELD_ID].name = "dpipe-field-id"; + arr[DEVLINK_ATTR_DPIPE_FIELD_ID].type = YNL_PT_U32; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_match_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_match_policy.data(), }; static std::array devlink_dl_dpipe_match_value_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_MATCH] = { .name = "dpipe-match", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_match_nest, }; - arr[DEVLINK_ATTR_DPIPE_VALUE] = { .name = "dpipe-value", .type = YNL_PT_BINARY,}; - arr[DEVLINK_ATTR_DPIPE_VALUE_MASK] = { .name = "dpipe-value-mask", .type = YNL_PT_BINARY,}; - arr[DEVLINK_ATTR_DPIPE_VALUE_MAPPING] = { .name = "dpipe-value-mapping", .type = YNL_PT_U32, }; + arr[DEVLINK_ATTR_DPIPE_MATCH].name = "dpipe-match"; + arr[DEVLINK_ATTR_DPIPE_MATCH].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_MATCH].nest = &devlink_dl_dpipe_match_nest; + arr[DEVLINK_ATTR_DPIPE_VALUE].name = "dpipe-value"; + arr[DEVLINK_ATTR_DPIPE_VALUE].type = YNL_PT_BINARY; + arr[DEVLINK_ATTR_DPIPE_VALUE_MASK].name = "dpipe-value-mask"; + arr[DEVLINK_ATTR_DPIPE_VALUE_MASK].type = YNL_PT_BINARY; + arr[DEVLINK_ATTR_DPIPE_VALUE_MAPPING].name = "dpipe-value-mapping"; + arr[DEVLINK_ATTR_DPIPE_VALUE_MAPPING].type = YNL_PT_U32; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_match_value_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_match_value_policy.data(), }; static std::array devlink_dl_dpipe_action_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_ACTION_TYPE] = { .name = "dpipe-action-type", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_ID] = { .name = "dpipe-header-id", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL] = { .name = "dpipe-header-global", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_INDEX] = { .name = "dpipe-header-index", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_FIELD_ID] = { .name = "dpipe-field-id", .type = YNL_PT_U32, }; + arr[DEVLINK_ATTR_DPIPE_ACTION_TYPE].name = "dpipe-action-type"; + arr[DEVLINK_ATTR_DPIPE_ACTION_TYPE].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_HEADER_ID].name = "dpipe-header-id"; + arr[DEVLINK_ATTR_DPIPE_HEADER_ID].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL].name = "dpipe-header-global"; + arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL].type = YNL_PT_U8; + arr[DEVLINK_ATTR_DPIPE_HEADER_INDEX].name = "dpipe-header-index"; + arr[DEVLINK_ATTR_DPIPE_HEADER_INDEX].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_FIELD_ID].name = "dpipe-field-id"; + arr[DEVLINK_ATTR_DPIPE_FIELD_ID].type = YNL_PT_U32; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_action_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_action_policy.data(), }; static std::array devlink_dl_dpipe_action_value_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_ACTION] = { .name = "dpipe-action", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_action_nest, }; - arr[DEVLINK_ATTR_DPIPE_VALUE] = { .name = "dpipe-value", .type = YNL_PT_BINARY,}; - arr[DEVLINK_ATTR_DPIPE_VALUE_MASK] = { .name = "dpipe-value-mask", .type = YNL_PT_BINARY,}; - arr[DEVLINK_ATTR_DPIPE_VALUE_MAPPING] = { .name = "dpipe-value-mapping", .type = YNL_PT_U32, }; + arr[DEVLINK_ATTR_DPIPE_ACTION].name = "dpipe-action"; + arr[DEVLINK_ATTR_DPIPE_ACTION].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ACTION].nest = &devlink_dl_dpipe_action_nest; + arr[DEVLINK_ATTR_DPIPE_VALUE].name = "dpipe-value"; + arr[DEVLINK_ATTR_DPIPE_VALUE].type = YNL_PT_BINARY; + arr[DEVLINK_ATTR_DPIPE_VALUE_MASK].name = "dpipe-value-mask"; + arr[DEVLINK_ATTR_DPIPE_VALUE_MASK].type = YNL_PT_BINARY; + arr[DEVLINK_ATTR_DPIPE_VALUE_MAPPING].name = "dpipe-value-mapping"; + arr[DEVLINK_ATTR_DPIPE_VALUE_MAPPING].type = YNL_PT_U32; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_action_value_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_action_value_policy.data(), }; static std::array devlink_dl_dpipe_field_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_FIELD_NAME] = { .name = "dpipe-field-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_DPIPE_FIELD_ID] = { .name = "dpipe-field-id", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH] = { .name = "dpipe-field-bitwidth", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE] = { .name = "dpipe-field-mapping-type", .type = YNL_PT_U32, }; + arr[DEVLINK_ATTR_DPIPE_FIELD_NAME].name = "dpipe-field-name"; + arr[DEVLINK_ATTR_DPIPE_FIELD_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_DPIPE_FIELD_ID].name = "dpipe-field-id"; + arr[DEVLINK_ATTR_DPIPE_FIELD_ID].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH].name = "dpipe-field-bitwidth"; + arr[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE].name = "dpipe-field-mapping-type"; + arr[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE].type = YNL_PT_U32; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_field_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_field_policy.data(), }; static std::array devlink_dl_resource_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_RESOURCE_NAME] = { .name = "resource-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_RESOURCE_ID] = { .name = "resource-id", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE] = { .name = "resource-size", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE_NEW] = { .name = "resource-size-new", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE_VALID] = { .name = "resource-size-valid", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE_MIN] = { .name = "resource-size-min", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE_MAX] = { .name = "resource-size-max", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE_GRAN] = { .name = "resource-size-gran", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_UNIT] = { .name = "resource-unit", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_RESOURCE_OCC] = { .name = "resource-occ", .type = YNL_PT_U64, }; + arr[DEVLINK_ATTR_RESOURCE_NAME].name = "resource-name"; + arr[DEVLINK_ATTR_RESOURCE_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_RESOURCE_ID].name = "resource-id"; + arr[DEVLINK_ATTR_RESOURCE_ID].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_SIZE].name = "resource-size"; + arr[DEVLINK_ATTR_RESOURCE_SIZE].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_SIZE_NEW].name = "resource-size-new"; + arr[DEVLINK_ATTR_RESOURCE_SIZE_NEW].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_SIZE_VALID].name = "resource-size-valid"; + arr[DEVLINK_ATTR_RESOURCE_SIZE_VALID].type = YNL_PT_U8; + arr[DEVLINK_ATTR_RESOURCE_SIZE_MIN].name = "resource-size-min"; + arr[DEVLINK_ATTR_RESOURCE_SIZE_MIN].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_SIZE_MAX].name = "resource-size-max"; + arr[DEVLINK_ATTR_RESOURCE_SIZE_MAX].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_SIZE_GRAN].name = "resource-size-gran"; + arr[DEVLINK_ATTR_RESOURCE_SIZE_GRAN].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_UNIT].name = "resource-unit"; + arr[DEVLINK_ATTR_RESOURCE_UNIT].type = YNL_PT_U8; + arr[DEVLINK_ATTR_RESOURCE_OCC].name = "resource-occ"; + arr[DEVLINK_ATTR_RESOURCE_OCC].type = YNL_PT_U64; return arr; } (); struct ynl_policy_nest devlink_dl_resource_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_resource_policy.data(), }; static std::array devlink_dl_param_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_PARAM_NAME] = { .name = "param-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_PARAM_GENERIC] = { .name = "param-generic", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_PARAM_TYPE] = { .name = "param-type", .type = YNL_PT_U8, }; + arr[DEVLINK_ATTR_PARAM_NAME].name = "param-name"; + arr[DEVLINK_ATTR_PARAM_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_PARAM_GENERIC].name = "param-generic"; + arr[DEVLINK_ATTR_PARAM_GENERIC].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_PARAM_TYPE].name = "param-type"; + arr[DEVLINK_ATTR_PARAM_TYPE].type = YNL_PT_U8; return arr; } (); struct ynl_policy_nest devlink_dl_param_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_param_policy.data(), }; static std::array devlink_dl_region_snapshot_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .name = "region-snapshot-id", .type = YNL_PT_U32, }; + arr[DEVLINK_ATTR_REGION_SNAPSHOT_ID].name = "region-snapshot-id"; + arr[DEVLINK_ATTR_REGION_SNAPSHOT_ID].type = YNL_PT_U32; return arr; } (); struct ynl_policy_nest devlink_dl_region_snapshot_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_region_snapshot_policy.data(), }; static std::array devlink_dl_region_chunk_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_REGION_CHUNK_DATA] = { .name = "region-chunk-data", .type = YNL_PT_BINARY,}; - arr[DEVLINK_ATTR_REGION_CHUNK_ADDR] = { .name = "region-chunk-addr", .type = YNL_PT_U64, }; + arr[DEVLINK_ATTR_REGION_CHUNK_DATA].name = "region-chunk-data"; + arr[DEVLINK_ATTR_REGION_CHUNK_DATA].type = YNL_PT_BINARY; + arr[DEVLINK_ATTR_REGION_CHUNK_ADDR].name = "region-chunk-addr"; + arr[DEVLINK_ATTR_REGION_CHUNK_ADDR].type = YNL_PT_U64; return arr; } (); struct ynl_policy_nest devlink_dl_region_chunk_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_region_chunk_policy.data(), }; static std::array devlink_dl_info_version_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_INFO_VERSION_NAME] = { .name = "info-version-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_INFO_VERSION_VALUE] = { .name = "info-version-value", .type = YNL_PT_NUL_STR, }; + arr[DEVLINK_ATTR_INFO_VERSION_NAME].name = "info-version-name"; + arr[DEVLINK_ATTR_INFO_VERSION_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_INFO_VERSION_VALUE].name = "info-version-value"; + arr[DEVLINK_ATTR_INFO_VERSION_VALUE].type = YNL_PT_NUL_STR; return arr; } (); struct ynl_policy_nest devlink_dl_info_version_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_info_version_policy.data(), }; static std::array devlink_dl_fmsg_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_FMSG_OBJ_NEST_START] = { .name = "fmsg-obj-nest-start", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_FMSG_PAIR_NEST_START] = { .name = "fmsg-pair-nest-start", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_FMSG_ARR_NEST_START] = { .name = "fmsg-arr-nest-start", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_FMSG_NEST_END] = { .name = "fmsg-nest-end", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_FMSG_OBJ_NAME] = { .name = "fmsg-obj-name", .type = YNL_PT_NUL_STR, }; + arr[DEVLINK_ATTR_FMSG_OBJ_NEST_START].name = "fmsg-obj-nest-start"; + arr[DEVLINK_ATTR_FMSG_OBJ_NEST_START].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_FMSG_PAIR_NEST_START].name = "fmsg-pair-nest-start"; + arr[DEVLINK_ATTR_FMSG_PAIR_NEST_START].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_FMSG_ARR_NEST_START].name = "fmsg-arr-nest-start"; + arr[DEVLINK_ATTR_FMSG_ARR_NEST_START].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_FMSG_NEST_END].name = "fmsg-nest-end"; + arr[DEVLINK_ATTR_FMSG_NEST_END].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_FMSG_OBJ_NAME].name = "fmsg-obj-name"; + arr[DEVLINK_ATTR_FMSG_OBJ_NAME].type = YNL_PT_NUL_STR; return arr; } (); struct ynl_policy_nest devlink_dl_fmsg_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_fmsg_policy.data(), }; static std::array devlink_dl_health_reporter_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .name = "health-reporter-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_STATE] = { .name = "health-reporter-state", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT] = { .name = "health-reporter-err-count", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT] = { .name = "health-reporter-recover-count", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD] = { .name = "health-reporter-graceful-period", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER] = { .name = "health-reporter-auto-recover", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS] = { .name = "health-reporter-dump-ts", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS] = { .name = "health-reporter-dump-ts-ns", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP] = { .name = "health-reporter-auto-dump", .type = YNL_PT_U8, }; + arr[DEVLINK_ATTR_HEALTH_REPORTER_NAME].name = "health-reporter-name"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_HEALTH_REPORTER_STATE].name = "health-reporter-state"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_STATE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT].name = "health-reporter-err-count"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT].type = YNL_PT_U64; + arr[DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT].name = "health-reporter-recover-count"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT].type = YNL_PT_U64; + arr[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD].name = "health-reporter-graceful-period"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD].type = YNL_PT_U64; + arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER].name = "health-reporter-auto-recover"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER].type = YNL_PT_U8; + arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS].name = "health-reporter-dump-ts"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS].type = YNL_PT_U64; + arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS].name = "health-reporter-dump-ts-ns"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS].type = YNL_PT_U64; + arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP].name = "health-reporter-auto-dump"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP].type = YNL_PT_U8; + arr[DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD].name = "health-reporter-burst-period"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD].type = YNL_PT_U64; return arr; } (); struct ynl_policy_nest devlink_dl_health_reporter_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_health_reporter_policy.data(), }; static std::array devlink_dl_attr_stats_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_STATS_RX_PACKETS] = { .name = "stats-rx-packets", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_STATS_RX_BYTES] = { .name = "stats-rx-bytes", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_STATS_RX_DROPPED] = { .name = "stats-rx-dropped", .type = YNL_PT_U64, }; + arr[DEVLINK_ATTR_STATS_RX_PACKETS].name = "stats-rx-packets"; + arr[DEVLINK_ATTR_STATS_RX_PACKETS].type = YNL_PT_U64; + arr[DEVLINK_ATTR_STATS_RX_BYTES].name = "stats-rx-bytes"; + arr[DEVLINK_ATTR_STATS_RX_BYTES].type = YNL_PT_U64; + arr[DEVLINK_ATTR_STATS_RX_DROPPED].name = "stats-rx-dropped"; + arr[DEVLINK_ATTR_STATS_RX_DROPPED].type = YNL_PT_U64; return arr; } (); struct ynl_policy_nest devlink_dl_attr_stats_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_attr_stats_policy.data(), }; static std::array devlink_dl_trap_metadata_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT] = { .name = "trap-metadata-type-in-port", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE] = { .name = "trap-metadata-type-fa-cookie", .type = YNL_PT_FLAG, }; + arr[DEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT].name = "trap-metadata-type-in-port"; + arr[DEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE].name = "trap-metadata-type-fa-cookie"; + arr[DEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE].type = YNL_PT_FLAG; return arr; } (); struct ynl_policy_nest devlink_dl_trap_metadata_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_trap_metadata_policy.data(), }; static std::array devlink_dl_port_function_policy = []() { std::array arr{}; - arr[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] = { .name = "hw-addr", .type = YNL_PT_BINARY,}; - arr[DEVLINK_PORT_FN_ATTR_STATE] = { .name = "state", .type = YNL_PT_U8, }; - arr[DEVLINK_PORT_FN_ATTR_OPSTATE] = { .name = "opstate", .type = YNL_PT_U8, }; - arr[DEVLINK_PORT_FN_ATTR_CAPS] = { .name = "caps", .type = YNL_PT_BITFIELD32, }; + arr[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR].name = "hw-addr"; + arr[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR].type = YNL_PT_BINARY; + arr[DEVLINK_PORT_FN_ATTR_STATE].name = "state"; + arr[DEVLINK_PORT_FN_ATTR_STATE].type = YNL_PT_U8; + arr[DEVLINK_PORT_FN_ATTR_OPSTATE].name = "opstate"; + arr[DEVLINK_PORT_FN_ATTR_OPSTATE].type = YNL_PT_U8; + arr[DEVLINK_PORT_FN_ATTR_CAPS].name = "caps"; + arr[DEVLINK_PORT_FN_ATTR_CAPS].type = YNL_PT_BITFIELD32; return arr; } (); struct ynl_policy_nest devlink_dl_port_function_nest = { - .max_attr = DEVLINK_PORT_FUNCTION_ATTR_MAX, + .max_attr = static_cast(DEVLINK_PORT_FUNCTION_ATTR_MAX), .table = devlink_dl_port_function_policy.data(), }; static std::array devlink_dl_reload_stats_entry_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_RELOAD_STATS_LIMIT] = { .name = "reload-stats-limit", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_RELOAD_STATS_VALUE] = { .name = "reload-stats-value", .type = YNL_PT_U32, }; + arr[DEVLINK_ATTR_RELOAD_STATS_LIMIT].name = "reload-stats-limit"; + arr[DEVLINK_ATTR_RELOAD_STATS_LIMIT].type = YNL_PT_U8; + arr[DEVLINK_ATTR_RELOAD_STATS_VALUE].name = "reload-stats-value"; + arr[DEVLINK_ATTR_RELOAD_STATS_VALUE].type = YNL_PT_U32; return arr; } (); struct ynl_policy_nest devlink_dl_reload_stats_entry_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_reload_stats_entry_policy.data(), }; static std::array devlink_dl_reload_act_stats_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_RELOAD_STATS_ENTRY] = { .name = "reload-stats-entry", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_entry_nest, }; + arr[DEVLINK_ATTR_RELOAD_STATS_ENTRY].name = "reload-stats-entry"; + arr[DEVLINK_ATTR_RELOAD_STATS_ENTRY].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RELOAD_STATS_ENTRY].nest = &devlink_dl_reload_stats_entry_nest; return arr; } (); struct ynl_policy_nest devlink_dl_reload_act_stats_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_reload_act_stats_policy.data(), }; static std::array devlink_dl_linecard_supported_types_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_LINECARD_TYPE] = { .name = "linecard-type", .type = YNL_PT_NUL_STR, }; + arr[DEVLINK_ATTR_LINECARD_TYPE].name = "linecard-type"; + arr[DEVLINK_ATTR_LINECARD_TYPE].type = YNL_PT_NUL_STR; return arr; } (); struct ynl_policy_nest devlink_dl_linecard_supported_types_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_linecard_supported_types_policy.data(), }; static std::array devlink_dl_selftest_id_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_SELFTEST_ID_FLASH] = { .name = "flash", .type = YNL_PT_FLAG, }; + arr[DEVLINK_ATTR_SELFTEST_ID_FLASH].name = "flash"; + arr[DEVLINK_ATTR_SELFTEST_ID_FLASH].type = YNL_PT_FLAG; return arr; } (); struct ynl_policy_nest devlink_dl_selftest_id_nest = { - .max_attr = DEVLINK_ATTR_SELFTEST_ID_MAX, + .max_attr = static_cast(DEVLINK_ATTR_SELFTEST_ID_MAX), .table = devlink_dl_selftest_id_policy.data(), }; +static std::array devlink_dl_rate_tc_bws_policy = []() { + std::array arr{}; + arr[DEVLINK_RATE_TC_ATTR_INDEX].name = "index"; + arr[DEVLINK_RATE_TC_ATTR_INDEX].type = YNL_PT_U8; + arr[DEVLINK_RATE_TC_ATTR_BW].name = "bw"; + arr[DEVLINK_RATE_TC_ATTR_BW].type = YNL_PT_U32; + return arr; +} (); + +struct ynl_policy_nest devlink_dl_rate_tc_bws_nest = { + .max_attr = static_cast(DEVLINK_RATE_TC_ATTR_MAX), + .table = devlink_dl_rate_tc_bws_policy.data(), +}; + static std::array devlink_dl_dpipe_table_matches_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_MATCH] = { .name = "dpipe-match", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_match_nest, }; + arr[DEVLINK_ATTR_DPIPE_MATCH].name = "dpipe-match"; + arr[DEVLINK_ATTR_DPIPE_MATCH].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_MATCH].nest = &devlink_dl_dpipe_match_nest; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_table_matches_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_table_matches_policy.data(), }; static std::array devlink_dl_dpipe_table_actions_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_ACTION] = { .name = "dpipe-action", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_action_nest, }; + arr[DEVLINK_ATTR_DPIPE_ACTION].name = "dpipe-action"; + arr[DEVLINK_ATTR_DPIPE_ACTION].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ACTION].nest = &devlink_dl_dpipe_action_nest; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_table_actions_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_table_actions_policy.data(), }; static std::array devlink_dl_dpipe_entry_match_values_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_MATCH_VALUE] = { .name = "dpipe-match-value", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_match_value_nest, }; + arr[DEVLINK_ATTR_DPIPE_MATCH_VALUE].name = "dpipe-match-value"; + arr[DEVLINK_ATTR_DPIPE_MATCH_VALUE].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_MATCH_VALUE].nest = &devlink_dl_dpipe_match_value_nest; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_entry_match_values_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_entry_match_values_policy.data(), }; static std::array devlink_dl_dpipe_entry_action_values_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_ACTION_VALUE] = { .name = "dpipe-action-value", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_action_value_nest, }; + arr[DEVLINK_ATTR_DPIPE_ACTION_VALUE].name = "dpipe-action-value"; + arr[DEVLINK_ATTR_DPIPE_ACTION_VALUE].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ACTION_VALUE].nest = &devlink_dl_dpipe_action_value_nest; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_entry_action_values_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_entry_action_values_policy.data(), }; static std::array devlink_dl_dpipe_header_fields_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_FIELD] = { .name = "dpipe-field", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_field_nest, }; + arr[DEVLINK_ATTR_DPIPE_FIELD].name = "dpipe-field"; + arr[DEVLINK_ATTR_DPIPE_FIELD].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_FIELD].nest = &devlink_dl_dpipe_field_nest; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_header_fields_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_header_fields_policy.data(), }; static std::array devlink_dl_resource_list_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_RESOURCE] = { .name = "resource", .type = YNL_PT_NEST, .nest = &devlink_dl_resource_nest, }; + arr[DEVLINK_ATTR_RESOURCE].name = "resource"; + arr[DEVLINK_ATTR_RESOURCE].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RESOURCE].nest = &devlink_dl_resource_nest; return arr; } (); struct ynl_policy_nest devlink_dl_resource_list_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_resource_list_policy.data(), }; static std::array devlink_dl_region_snapshots_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_REGION_SNAPSHOT] = { .name = "region-snapshot", .type = YNL_PT_NEST, .nest = &devlink_dl_region_snapshot_nest, }; + arr[DEVLINK_ATTR_REGION_SNAPSHOT].name = "region-snapshot"; + arr[DEVLINK_ATTR_REGION_SNAPSHOT].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_REGION_SNAPSHOT].nest = &devlink_dl_region_snapshot_nest; return arr; } (); struct ynl_policy_nest devlink_dl_region_snapshots_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_region_snapshots_policy.data(), }; static std::array devlink_dl_region_chunks_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_REGION_CHUNK] = { .name = "region-chunk", .type = YNL_PT_NEST, .nest = &devlink_dl_region_chunk_nest, }; + arr[DEVLINK_ATTR_REGION_CHUNK].name = "region-chunk"; + arr[DEVLINK_ATTR_REGION_CHUNK].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_REGION_CHUNK].nest = &devlink_dl_region_chunk_nest; return arr; } (); struct ynl_policy_nest devlink_dl_region_chunks_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_region_chunks_policy.data(), }; static std::array devlink_dl_reload_act_info_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_RELOAD_ACTION] = { .name = "reload-action", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_RELOAD_ACTION_STATS] = { .name = "reload-action-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_stats_nest, }; + arr[DEVLINK_ATTR_RELOAD_ACTION].name = "reload-action"; + arr[DEVLINK_ATTR_RELOAD_ACTION].type = YNL_PT_U8; + arr[DEVLINK_ATTR_RELOAD_ACTION_STATS].name = "reload-action-stats"; + arr[DEVLINK_ATTR_RELOAD_ACTION_STATS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RELOAD_ACTION_STATS].nest = &devlink_dl_reload_act_stats_nest; return arr; } (); struct ynl_policy_nest devlink_dl_reload_act_info_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_reload_act_info_policy.data(), }; static std::array devlink_dl_dpipe_table_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_TABLE_NAME] = { .name = "dpipe-table-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_SIZE] = { .name = "dpipe-table-size", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_MATCHES] = { .name = "dpipe-table-matches", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_matches_nest, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS] = { .name = "dpipe-table-actions", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_actions_nest, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED] = { .name = "dpipe-table-counters-enabled", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID] = { .name = "dpipe-table-resource-id", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS] = { .name = "dpipe-table-resource-units", .type = YNL_PT_U64, }; + arr[DEVLINK_ATTR_DPIPE_TABLE_NAME].name = "dpipe-table-name"; + arr[DEVLINK_ATTR_DPIPE_TABLE_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_DPIPE_TABLE_SIZE].name = "dpipe-table-size"; + arr[DEVLINK_ATTR_DPIPE_TABLE_SIZE].type = YNL_PT_U64; + arr[DEVLINK_ATTR_DPIPE_TABLE_MATCHES].name = "dpipe-table-matches"; + arr[DEVLINK_ATTR_DPIPE_TABLE_MATCHES].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_TABLE_MATCHES].nest = &devlink_dl_dpipe_table_matches_nest; + arr[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS].name = "dpipe-table-actions"; + arr[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS].nest = &devlink_dl_dpipe_table_actions_nest; + arr[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED].name = "dpipe-table-counters-enabled"; + arr[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED].type = YNL_PT_U8; + arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID].name = "dpipe-table-resource-id"; + arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID].type = YNL_PT_U64; + arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS].name = "dpipe-table-resource-units"; + arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS].type = YNL_PT_U64; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_table_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_table_policy.data(), }; static std::array devlink_dl_dpipe_entry_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_ENTRY_INDEX] = { .name = "dpipe-entry-index", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES] = { .name = "dpipe-entry-match-values", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_match_values_nest, }; - arr[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES] = { .name = "dpipe-entry-action-values", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_action_values_nest, }; - arr[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER] = { .name = "dpipe-entry-counter", .type = YNL_PT_U64, }; + arr[DEVLINK_ATTR_DPIPE_ENTRY_INDEX].name = "dpipe-entry-index"; + arr[DEVLINK_ATTR_DPIPE_ENTRY_INDEX].type = YNL_PT_U64; + arr[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES].name = "dpipe-entry-match-values"; + arr[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES].nest = &devlink_dl_dpipe_entry_match_values_nest; + arr[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES].name = "dpipe-entry-action-values"; + arr[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES].nest = &devlink_dl_dpipe_entry_action_values_nest; + arr[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER].name = "dpipe-entry-counter"; + arr[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER].type = YNL_PT_U64; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_entry_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_entry_policy.data(), }; static std::array devlink_dl_dpipe_header_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_HEADER_NAME] = { .name = "dpipe-header-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_ID] = { .name = "dpipe-header-id", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL] = { .name = "dpipe-header-global", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_FIELDS] = { .name = "dpipe-header-fields", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_header_fields_nest, }; + arr[DEVLINK_ATTR_DPIPE_HEADER_NAME].name = "dpipe-header-name"; + arr[DEVLINK_ATTR_DPIPE_HEADER_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_DPIPE_HEADER_ID].name = "dpipe-header-id"; + arr[DEVLINK_ATTR_DPIPE_HEADER_ID].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL].name = "dpipe-header-global"; + arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL].type = YNL_PT_U8; + arr[DEVLINK_ATTR_DPIPE_HEADER_FIELDS].name = "dpipe-header-fields"; + arr[DEVLINK_ATTR_DPIPE_HEADER_FIELDS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_HEADER_FIELDS].nest = &devlink_dl_dpipe_header_fields_nest; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_header_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_header_policy.data(), }; static std::array devlink_dl_reload_stats_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_RELOAD_ACTION_INFO] = { .name = "reload-action-info", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_info_nest, }; + arr[DEVLINK_ATTR_RELOAD_ACTION_INFO].name = "reload-action-info"; + arr[DEVLINK_ATTR_RELOAD_ACTION_INFO].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RELOAD_ACTION_INFO].nest = &devlink_dl_reload_act_info_nest; return arr; } (); struct ynl_policy_nest devlink_dl_reload_stats_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_reload_stats_policy.data(), }; static std::array devlink_dl_dpipe_tables_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_TABLE] = { .name = "dpipe-table", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_nest, }; + arr[DEVLINK_ATTR_DPIPE_TABLE].name = "dpipe-table"; + arr[DEVLINK_ATTR_DPIPE_TABLE].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_TABLE].nest = &devlink_dl_dpipe_table_nest; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_tables_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_tables_policy.data(), }; static std::array devlink_dl_dpipe_entries_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_ENTRY] = { .name = "dpipe-entry", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_nest, }; + arr[DEVLINK_ATTR_DPIPE_ENTRY].name = "dpipe-entry"; + arr[DEVLINK_ATTR_DPIPE_ENTRY].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ENTRY].nest = &devlink_dl_dpipe_entry_nest; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_entries_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_entries_policy.data(), }; static std::array devlink_dl_dpipe_headers_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_DPIPE_HEADER] = { .name = "dpipe-header", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_header_nest, }; + arr[DEVLINK_ATTR_DPIPE_HEADER].name = "dpipe-header"; + arr[DEVLINK_ATTR_DPIPE_HEADER].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_HEADER].nest = &devlink_dl_dpipe_header_nest; return arr; } (); struct ynl_policy_nest devlink_dl_dpipe_headers_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dpipe_headers_policy.data(), }; static std::array devlink_dl_dev_stats_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_RELOAD_STATS] = { .name = "reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, }; - arr[DEVLINK_ATTR_REMOTE_RELOAD_STATS] = { .name = "remote-reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, }; + arr[DEVLINK_ATTR_RELOAD_STATS].name = "reload-stats"; + arr[DEVLINK_ATTR_RELOAD_STATS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RELOAD_STATS].nest = &devlink_dl_reload_stats_nest; + arr[DEVLINK_ATTR_REMOTE_RELOAD_STATS].name = "remote-reload-stats"; + arr[DEVLINK_ATTR_REMOTE_RELOAD_STATS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_REMOTE_RELOAD_STATS].nest = &devlink_dl_reload_stats_nest; return arr; } (); struct ynl_policy_nest devlink_dl_dev_stats_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_dl_dev_stats_policy.data(), }; static std::array devlink_policy = []() { std::array arr{}; - arr[DEVLINK_ATTR_BUS_NAME] = { .name = "bus-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_DEV_NAME] = { .name = "dev-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_PORT_INDEX] = { .name = "port-index", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_PORT_TYPE] = { .name = "port-type", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_PORT_DESIRED_TYPE] = { .name = "port-desired-type", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_PORT_NETDEV_IFINDEX] = { .name = "port-netdev-ifindex", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_PORT_NETDEV_NAME] = { .name = "port-netdev-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_PORT_IBDEV_NAME] = { .name = "port-ibdev-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_PORT_SPLIT_COUNT] = { .name = "port-split-count", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_PORT_SPLIT_GROUP] = { .name = "port-split-group", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_SB_INDEX] = { .name = "sb-index", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_SB_SIZE] = { .name = "sb-size", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_SB_INGRESS_POOL_COUNT] = { .name = "sb-ingress-pool-count", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_SB_EGRESS_POOL_COUNT] = { .name = "sb-egress-pool-count", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_SB_INGRESS_TC_COUNT] = { .name = "sb-ingress-tc-count", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_SB_EGRESS_TC_COUNT] = { .name = "sb-egress-tc-count", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_SB_POOL_INDEX] = { .name = "sb-pool-index", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_SB_POOL_TYPE] = { .name = "sb-pool-type", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_SB_POOL_SIZE] = { .name = "sb-pool-size", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE] = { .name = "sb-pool-threshold-type", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_SB_THRESHOLD] = { .name = "sb-threshold", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_SB_TC_INDEX] = { .name = "sb-tc-index", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_SB_OCC_CUR] = { .name = "sb-occ-cur", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_SB_OCC_MAX] = { .name = "sb-occ-max", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_ESWITCH_MODE] = { .name = "eswitch-mode", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_ESWITCH_INLINE_MODE] = { .name = "eswitch-inline-mode", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_DPIPE_TABLES] = { .name = "dpipe-tables", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_tables_nest, }; - arr[DEVLINK_ATTR_DPIPE_TABLE] = { .name = "dpipe-table", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_nest, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_NAME] = { .name = "dpipe-table-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_SIZE] = { .name = "dpipe-table-size", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_MATCHES] = { .name = "dpipe-table-matches", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_matches_nest, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS] = { .name = "dpipe-table-actions", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_table_actions_nest, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED] = { .name = "dpipe-table-counters-enabled", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_DPIPE_ENTRIES] = { .name = "dpipe-entries", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entries_nest, }; - arr[DEVLINK_ATTR_DPIPE_ENTRY] = { .name = "dpipe-entry", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_nest, }; - arr[DEVLINK_ATTR_DPIPE_ENTRY_INDEX] = { .name = "dpipe-entry-index", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES] = { .name = "dpipe-entry-match-values", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_match_values_nest, }; - arr[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES] = { .name = "dpipe-entry-action-values", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_entry_action_values_nest, }; - arr[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER] = { .name = "dpipe-entry-counter", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_DPIPE_MATCH] = { .name = "dpipe-match", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_match_nest, }; - arr[DEVLINK_ATTR_DPIPE_MATCH_VALUE] = { .name = "dpipe-match-value", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_match_value_nest, }; - arr[DEVLINK_ATTR_DPIPE_MATCH_TYPE] = { .name = "dpipe-match-type", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_ACTION] = { .name = "dpipe-action", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_action_nest, }; - arr[DEVLINK_ATTR_DPIPE_ACTION_VALUE] = { .name = "dpipe-action-value", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_action_value_nest, }; - arr[DEVLINK_ATTR_DPIPE_ACTION_TYPE] = { .name = "dpipe-action-type", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_VALUE] = { .name = "dpipe-value", .type = YNL_PT_BINARY,}; - arr[DEVLINK_ATTR_DPIPE_VALUE_MASK] = { .name = "dpipe-value-mask", .type = YNL_PT_BINARY,}; - arr[DEVLINK_ATTR_DPIPE_VALUE_MAPPING] = { .name = "dpipe-value-mapping", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_HEADERS] = { .name = "dpipe-headers", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_headers_nest, }; - arr[DEVLINK_ATTR_DPIPE_HEADER] = { .name = "dpipe-header", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_header_nest, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_NAME] = { .name = "dpipe-header-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_ID] = { .name = "dpipe-header-id", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_FIELDS] = { .name = "dpipe-header-fields", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_header_fields_nest, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL] = { .name = "dpipe-header-global", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_DPIPE_HEADER_INDEX] = { .name = "dpipe-header-index", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_FIELD] = { .name = "dpipe-field", .type = YNL_PT_NEST, .nest = &devlink_dl_dpipe_field_nest, }; - arr[DEVLINK_ATTR_DPIPE_FIELD_NAME] = { .name = "dpipe-field-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_DPIPE_FIELD_ID] = { .name = "dpipe-field-id", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH] = { .name = "dpipe-field-bitwidth", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE] = { .name = "dpipe-field-mapping-type", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, }; - arr[DEVLINK_ATTR_ESWITCH_ENCAP_MODE] = { .name = "eswitch-encap-mode", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_RESOURCE_LIST] = { .name = "resource-list", .type = YNL_PT_NEST, .nest = &devlink_dl_resource_list_nest, }; - arr[DEVLINK_ATTR_RESOURCE] = { .name = "resource", .type = YNL_PT_NEST, .nest = &devlink_dl_resource_nest, }; - arr[DEVLINK_ATTR_RESOURCE_NAME] = { .name = "resource-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_RESOURCE_ID] = { .name = "resource-id", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE] = { .name = "resource-size", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE_NEW] = { .name = "resource-size-new", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE_VALID] = { .name = "resource-size-valid", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE_MIN] = { .name = "resource-size-min", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE_MAX] = { .name = "resource-size-max", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_SIZE_GRAN] = { .name = "resource-size-gran", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RESOURCE_UNIT] = { .name = "resource-unit", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_RESOURCE_OCC] = { .name = "resource-occ", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID] = { .name = "dpipe-table-resource-id", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS] = { .name = "dpipe-table-resource-units", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_PORT_FLAVOUR] = { .name = "port-flavour", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_PORT_NUMBER] = { .name = "port-number", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER] = { .name = "port-split-subport-number", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_PARAM] = { .name = "param", .type = YNL_PT_NEST, .nest = &devlink_dl_param_nest, }; - arr[DEVLINK_ATTR_PARAM_NAME] = { .name = "param-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_PARAM_GENERIC] = { .name = "param-generic", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_PARAM_TYPE] = { .name = "param-type", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_PARAM_VALUE_CMODE] = { .name = "param-value-cmode", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_REGION_NAME] = { .name = "region-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_REGION_SIZE] = { .name = "region-size", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_REGION_SNAPSHOTS] = { .name = "region-snapshots", .type = YNL_PT_NEST, .nest = &devlink_dl_region_snapshots_nest, }; - arr[DEVLINK_ATTR_REGION_SNAPSHOT] = { .name = "region-snapshot", .type = YNL_PT_NEST, .nest = &devlink_dl_region_snapshot_nest, }; - arr[DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .name = "region-snapshot-id", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_REGION_CHUNKS] = { .name = "region-chunks", .type = YNL_PT_NEST, .nest = &devlink_dl_region_chunks_nest, }; - arr[DEVLINK_ATTR_REGION_CHUNK] = { .name = "region-chunk", .type = YNL_PT_NEST, .nest = &devlink_dl_region_chunk_nest, }; - arr[DEVLINK_ATTR_REGION_CHUNK_DATA] = { .name = "region-chunk-data", .type = YNL_PT_BINARY,}; - arr[DEVLINK_ATTR_REGION_CHUNK_ADDR] = { .name = "region-chunk-addr", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_REGION_CHUNK_LEN] = { .name = "region-chunk-len", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_INFO_DRIVER_NAME] = { .name = "info-driver-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_INFO_SERIAL_NUMBER] = { .name = "info-serial-number", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_INFO_VERSION_FIXED] = { .name = "info-version-fixed", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, }; - arr[DEVLINK_ATTR_INFO_VERSION_RUNNING] = { .name = "info-version-running", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, }; - arr[DEVLINK_ATTR_INFO_VERSION_STORED] = { .name = "info-version-stored", .type = YNL_PT_NEST, .nest = &devlink_dl_info_version_nest, }; - arr[DEVLINK_ATTR_INFO_VERSION_NAME] = { .name = "info-version-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_INFO_VERSION_VALUE] = { .name = "info-version-value", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_SB_POOL_CELL_SIZE] = { .name = "sb-pool-cell-size", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_FMSG] = { .name = "fmsg", .type = YNL_PT_NEST, .nest = &devlink_dl_fmsg_nest, }; - arr[DEVLINK_ATTR_FMSG_OBJ_NEST_START] = { .name = "fmsg-obj-nest-start", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_FMSG_PAIR_NEST_START] = { .name = "fmsg-pair-nest-start", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_FMSG_ARR_NEST_START] = { .name = "fmsg-arr-nest-start", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_FMSG_NEST_END] = { .name = "fmsg-nest-end", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_FMSG_OBJ_NAME] = { .name = "fmsg-obj-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE] = { .name = "fmsg-obj-value-type", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER] = { .name = "health-reporter", .type = YNL_PT_NEST, .nest = &devlink_dl_health_reporter_nest, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_NAME] = { .name = "health-reporter-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_STATE] = { .name = "health-reporter-state", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT] = { .name = "health-reporter-err-count", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT] = { .name = "health-reporter-recover-count", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS] = { .name = "health-reporter-dump-ts", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD] = { .name = "health-reporter-graceful-period", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER] = { .name = "health-reporter-auto-recover", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME] = { .name = "flash-update-file-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT] = { .name = "flash-update-component", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG] = { .name = "flash-update-status-msg", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE] = { .name = "flash-update-status-done", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL] = { .name = "flash-update-status-total", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_PORT_PCI_PF_NUMBER] = { .name = "port-pci-pf-number", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_PORT_PCI_VF_NUMBER] = { .name = "port-pci-vf-number", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_STATS] = { .name = "stats", .type = YNL_PT_NEST, .nest = &devlink_dl_attr_stats_nest, }; - arr[DEVLINK_ATTR_TRAP_NAME] = { .name = "trap-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_TRAP_ACTION] = { .name = "trap-action", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_TRAP_TYPE] = { .name = "trap-type", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_TRAP_GENERIC] = { .name = "trap-generic", .type = YNL_PT_FLAG, }; - arr[DEVLINK_ATTR_TRAP_METADATA] = { .name = "trap-metadata", .type = YNL_PT_NEST, .nest = &devlink_dl_trap_metadata_nest, }; - arr[DEVLINK_ATTR_TRAP_GROUP_NAME] = { .name = "trap-group-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_RELOAD_FAILED] = { .name = "reload-failed", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS] = { .name = "health-reporter-dump-ts-ns", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_NETNS_FD] = { .name = "netns-fd", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_NETNS_PID] = { .name = "netns-pid", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_NETNS_ID] = { .name = "netns-id", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP] = { .name = "health-reporter-auto-dump", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_TRAP_POLICER_ID] = { .name = "trap-policer-id", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_TRAP_POLICER_RATE] = { .name = "trap-policer-rate", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_TRAP_POLICER_BURST] = { .name = "trap-policer-burst", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_PORT_FUNCTION] = { .name = "port-function", .type = YNL_PT_NEST, .nest = &devlink_dl_port_function_nest, }; - arr[DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER] = { .name = "info-board-serial-number", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_PORT_LANES] = { .name = "port-lanes", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_PORT_SPLITTABLE] = { .name = "port-splittable", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_PORT_EXTERNAL] = { .name = "port-external", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER] = { .name = "port-controller-number", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT] = { .name = "flash-update-status-timeout", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK] = { .name = "flash-update-overwrite-mask", .type = YNL_PT_BITFIELD32, }; - arr[DEVLINK_ATTR_RELOAD_ACTION] = { .name = "reload-action", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED] = { .name = "reload-actions-performed", .type = YNL_PT_BITFIELD32, }; - arr[DEVLINK_ATTR_RELOAD_LIMITS] = { .name = "reload-limits", .type = YNL_PT_BITFIELD32, }; - arr[DEVLINK_ATTR_DEV_STATS] = { .name = "dev-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_dev_stats_nest, }; - arr[DEVLINK_ATTR_RELOAD_STATS] = { .name = "reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, }; - arr[DEVLINK_ATTR_RELOAD_STATS_ENTRY] = { .name = "reload-stats-entry", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_entry_nest, }; - arr[DEVLINK_ATTR_RELOAD_STATS_LIMIT] = { .name = "reload-stats-limit", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_RELOAD_STATS_VALUE] = { .name = "reload-stats-value", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_REMOTE_RELOAD_STATS] = { .name = "remote-reload-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_stats_nest, }; - arr[DEVLINK_ATTR_RELOAD_ACTION_INFO] = { .name = "reload-action-info", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_info_nest, }; - arr[DEVLINK_ATTR_RELOAD_ACTION_STATS] = { .name = "reload-action-stats", .type = YNL_PT_NEST, .nest = &devlink_dl_reload_act_stats_nest, }; - arr[DEVLINK_ATTR_PORT_PCI_SF_NUMBER] = { .name = "port-pci-sf-number", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_RATE_TYPE] = { .name = "rate-type", .type = YNL_PT_U16, }; - arr[DEVLINK_ATTR_RATE_TX_SHARE] = { .name = "rate-tx-share", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RATE_TX_MAX] = { .name = "rate-tx-max", .type = YNL_PT_U64, }; - arr[DEVLINK_ATTR_RATE_NODE_NAME] = { .name = "rate-node-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_RATE_PARENT_NODE_NAME] = { .name = "rate-parent-node-name", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_REGION_MAX_SNAPSHOTS] = { .name = "region-max-snapshots", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_LINECARD_INDEX] = { .name = "linecard-index", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_LINECARD_STATE] = { .name = "linecard-state", .type = YNL_PT_U8, }; - arr[DEVLINK_ATTR_LINECARD_TYPE] = { .name = "linecard-type", .type = YNL_PT_NUL_STR, }; - arr[DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES] = { .name = "linecard-supported-types", .type = YNL_PT_NEST, .nest = &devlink_dl_linecard_supported_types_nest, }; - arr[DEVLINK_ATTR_SELFTESTS] = { .name = "selftests", .type = YNL_PT_NEST, .nest = &devlink_dl_selftest_id_nest, }; - arr[DEVLINK_ATTR_RATE_TX_PRIORITY] = { .name = "rate-tx-priority", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_RATE_TX_WEIGHT] = { .name = "rate-tx-weight", .type = YNL_PT_U32, }; - arr[DEVLINK_ATTR_REGION_DIRECT] = { .name = "region-direct", .type = YNL_PT_FLAG, }; + arr[DEVLINK_ATTR_BUS_NAME].name = "bus-name"; + arr[DEVLINK_ATTR_BUS_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_DEV_NAME].name = "dev-name"; + arr[DEVLINK_ATTR_DEV_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_PORT_INDEX].name = "port-index"; + arr[DEVLINK_ATTR_PORT_INDEX].type = YNL_PT_U32; + arr[DEVLINK_ATTR_PORT_TYPE].name = "port-type"; + arr[DEVLINK_ATTR_PORT_TYPE].type = YNL_PT_U16; + arr[DEVLINK_ATTR_PORT_DESIRED_TYPE].name = "port-desired-type"; + arr[DEVLINK_ATTR_PORT_DESIRED_TYPE].type = YNL_PT_U16; + arr[DEVLINK_ATTR_PORT_NETDEV_IFINDEX].name = "port-netdev-ifindex"; + arr[DEVLINK_ATTR_PORT_NETDEV_IFINDEX].type = YNL_PT_U32; + arr[DEVLINK_ATTR_PORT_NETDEV_NAME].name = "port-netdev-name"; + arr[DEVLINK_ATTR_PORT_NETDEV_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_PORT_IBDEV_NAME].name = "port-ibdev-name"; + arr[DEVLINK_ATTR_PORT_IBDEV_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_PORT_SPLIT_COUNT].name = "port-split-count"; + arr[DEVLINK_ATTR_PORT_SPLIT_COUNT].type = YNL_PT_U32; + arr[DEVLINK_ATTR_PORT_SPLIT_GROUP].name = "port-split-group"; + arr[DEVLINK_ATTR_PORT_SPLIT_GROUP].type = YNL_PT_U32; + arr[DEVLINK_ATTR_SB_INDEX].name = "sb-index"; + arr[DEVLINK_ATTR_SB_INDEX].type = YNL_PT_U32; + arr[DEVLINK_ATTR_SB_SIZE].name = "sb-size"; + arr[DEVLINK_ATTR_SB_SIZE].type = YNL_PT_U32; + arr[DEVLINK_ATTR_SB_INGRESS_POOL_COUNT].name = "sb-ingress-pool-count"; + arr[DEVLINK_ATTR_SB_INGRESS_POOL_COUNT].type = YNL_PT_U16; + arr[DEVLINK_ATTR_SB_EGRESS_POOL_COUNT].name = "sb-egress-pool-count"; + arr[DEVLINK_ATTR_SB_EGRESS_POOL_COUNT].type = YNL_PT_U16; + arr[DEVLINK_ATTR_SB_INGRESS_TC_COUNT].name = "sb-ingress-tc-count"; + arr[DEVLINK_ATTR_SB_INGRESS_TC_COUNT].type = YNL_PT_U16; + arr[DEVLINK_ATTR_SB_EGRESS_TC_COUNT].name = "sb-egress-tc-count"; + arr[DEVLINK_ATTR_SB_EGRESS_TC_COUNT].type = YNL_PT_U16; + arr[DEVLINK_ATTR_SB_POOL_INDEX].name = "sb-pool-index"; + arr[DEVLINK_ATTR_SB_POOL_INDEX].type = YNL_PT_U16; + arr[DEVLINK_ATTR_SB_POOL_TYPE].name = "sb-pool-type"; + arr[DEVLINK_ATTR_SB_POOL_TYPE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_SB_POOL_SIZE].name = "sb-pool-size"; + arr[DEVLINK_ATTR_SB_POOL_SIZE].type = YNL_PT_U32; + arr[DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE].name = "sb-pool-threshold-type"; + arr[DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_SB_THRESHOLD].name = "sb-threshold"; + arr[DEVLINK_ATTR_SB_THRESHOLD].type = YNL_PT_U32; + arr[DEVLINK_ATTR_SB_TC_INDEX].name = "sb-tc-index"; + arr[DEVLINK_ATTR_SB_TC_INDEX].type = YNL_PT_U16; + arr[DEVLINK_ATTR_SB_OCC_CUR].name = "sb-occ-cur"; + arr[DEVLINK_ATTR_SB_OCC_CUR].type = YNL_PT_U32; + arr[DEVLINK_ATTR_SB_OCC_MAX].name = "sb-occ-max"; + arr[DEVLINK_ATTR_SB_OCC_MAX].type = YNL_PT_U32; + arr[DEVLINK_ATTR_ESWITCH_MODE].name = "eswitch-mode"; + arr[DEVLINK_ATTR_ESWITCH_MODE].type = YNL_PT_U16; + arr[DEVLINK_ATTR_ESWITCH_INLINE_MODE].name = "eswitch-inline-mode"; + arr[DEVLINK_ATTR_ESWITCH_INLINE_MODE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_DPIPE_TABLES].name = "dpipe-tables"; + arr[DEVLINK_ATTR_DPIPE_TABLES].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_TABLES].nest = &devlink_dl_dpipe_tables_nest; + arr[DEVLINK_ATTR_DPIPE_TABLE].name = "dpipe-table"; + arr[DEVLINK_ATTR_DPIPE_TABLE].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_TABLE].nest = &devlink_dl_dpipe_table_nest; + arr[DEVLINK_ATTR_DPIPE_TABLE_NAME].name = "dpipe-table-name"; + arr[DEVLINK_ATTR_DPIPE_TABLE_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_DPIPE_TABLE_SIZE].name = "dpipe-table-size"; + arr[DEVLINK_ATTR_DPIPE_TABLE_SIZE].type = YNL_PT_U64; + arr[DEVLINK_ATTR_DPIPE_TABLE_MATCHES].name = "dpipe-table-matches"; + arr[DEVLINK_ATTR_DPIPE_TABLE_MATCHES].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_TABLE_MATCHES].nest = &devlink_dl_dpipe_table_matches_nest; + arr[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS].name = "dpipe-table-actions"; + arr[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_TABLE_ACTIONS].nest = &devlink_dl_dpipe_table_actions_nest; + arr[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED].name = "dpipe-table-counters-enabled"; + arr[DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED].type = YNL_PT_U8; + arr[DEVLINK_ATTR_DPIPE_ENTRIES].name = "dpipe-entries"; + arr[DEVLINK_ATTR_DPIPE_ENTRIES].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ENTRIES].nest = &devlink_dl_dpipe_entries_nest; + arr[DEVLINK_ATTR_DPIPE_ENTRY].name = "dpipe-entry"; + arr[DEVLINK_ATTR_DPIPE_ENTRY].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ENTRY].nest = &devlink_dl_dpipe_entry_nest; + arr[DEVLINK_ATTR_DPIPE_ENTRY_INDEX].name = "dpipe-entry-index"; + arr[DEVLINK_ATTR_DPIPE_ENTRY_INDEX].type = YNL_PT_U64; + arr[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES].name = "dpipe-entry-match-values"; + arr[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES].nest = &devlink_dl_dpipe_entry_match_values_nest; + arr[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES].name = "dpipe-entry-action-values"; + arr[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES].nest = &devlink_dl_dpipe_entry_action_values_nest; + arr[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER].name = "dpipe-entry-counter"; + arr[DEVLINK_ATTR_DPIPE_ENTRY_COUNTER].type = YNL_PT_U64; + arr[DEVLINK_ATTR_DPIPE_MATCH].name = "dpipe-match"; + arr[DEVLINK_ATTR_DPIPE_MATCH].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_MATCH].nest = &devlink_dl_dpipe_match_nest; + arr[DEVLINK_ATTR_DPIPE_MATCH_VALUE].name = "dpipe-match-value"; + arr[DEVLINK_ATTR_DPIPE_MATCH_VALUE].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_MATCH_VALUE].nest = &devlink_dl_dpipe_match_value_nest; + arr[DEVLINK_ATTR_DPIPE_MATCH_TYPE].name = "dpipe-match-type"; + arr[DEVLINK_ATTR_DPIPE_MATCH_TYPE].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_ACTION].name = "dpipe-action"; + arr[DEVLINK_ATTR_DPIPE_ACTION].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ACTION].nest = &devlink_dl_dpipe_action_nest; + arr[DEVLINK_ATTR_DPIPE_ACTION_VALUE].name = "dpipe-action-value"; + arr[DEVLINK_ATTR_DPIPE_ACTION_VALUE].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_ACTION_VALUE].nest = &devlink_dl_dpipe_action_value_nest; + arr[DEVLINK_ATTR_DPIPE_ACTION_TYPE].name = "dpipe-action-type"; + arr[DEVLINK_ATTR_DPIPE_ACTION_TYPE].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_VALUE].name = "dpipe-value"; + arr[DEVLINK_ATTR_DPIPE_VALUE].type = YNL_PT_BINARY; + arr[DEVLINK_ATTR_DPIPE_VALUE_MASK].name = "dpipe-value-mask"; + arr[DEVLINK_ATTR_DPIPE_VALUE_MASK].type = YNL_PT_BINARY; + arr[DEVLINK_ATTR_DPIPE_VALUE_MAPPING].name = "dpipe-value-mapping"; + arr[DEVLINK_ATTR_DPIPE_VALUE_MAPPING].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_HEADERS].name = "dpipe-headers"; + arr[DEVLINK_ATTR_DPIPE_HEADERS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_HEADERS].nest = &devlink_dl_dpipe_headers_nest; + arr[DEVLINK_ATTR_DPIPE_HEADER].name = "dpipe-header"; + arr[DEVLINK_ATTR_DPIPE_HEADER].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_HEADER].nest = &devlink_dl_dpipe_header_nest; + arr[DEVLINK_ATTR_DPIPE_HEADER_NAME].name = "dpipe-header-name"; + arr[DEVLINK_ATTR_DPIPE_HEADER_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_DPIPE_HEADER_ID].name = "dpipe-header-id"; + arr[DEVLINK_ATTR_DPIPE_HEADER_ID].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_HEADER_FIELDS].name = "dpipe-header-fields"; + arr[DEVLINK_ATTR_DPIPE_HEADER_FIELDS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_HEADER_FIELDS].nest = &devlink_dl_dpipe_header_fields_nest; + arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL].name = "dpipe-header-global"; + arr[DEVLINK_ATTR_DPIPE_HEADER_GLOBAL].type = YNL_PT_U8; + arr[DEVLINK_ATTR_DPIPE_HEADER_INDEX].name = "dpipe-header-index"; + arr[DEVLINK_ATTR_DPIPE_HEADER_INDEX].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_FIELD].name = "dpipe-field"; + arr[DEVLINK_ATTR_DPIPE_FIELD].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DPIPE_FIELD].nest = &devlink_dl_dpipe_field_nest; + arr[DEVLINK_ATTR_DPIPE_FIELD_NAME].name = "dpipe-field-name"; + arr[DEVLINK_ATTR_DPIPE_FIELD_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_DPIPE_FIELD_ID].name = "dpipe-field-id"; + arr[DEVLINK_ATTR_DPIPE_FIELD_ID].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH].name = "dpipe-field-bitwidth"; + arr[DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH].type = YNL_PT_U32; + arr[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE].name = "dpipe-field-mapping-type"; + arr[DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE].type = YNL_PT_U32; + arr[DEVLINK_ATTR_PAD].name = "pad"; + arr[DEVLINK_ATTR_PAD].type = YNL_PT_IGNORE; + arr[DEVLINK_ATTR_ESWITCH_ENCAP_MODE].name = "eswitch-encap-mode"; + arr[DEVLINK_ATTR_ESWITCH_ENCAP_MODE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_RESOURCE_LIST].name = "resource-list"; + arr[DEVLINK_ATTR_RESOURCE_LIST].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RESOURCE_LIST].nest = &devlink_dl_resource_list_nest; + arr[DEVLINK_ATTR_RESOURCE].name = "resource"; + arr[DEVLINK_ATTR_RESOURCE].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RESOURCE].nest = &devlink_dl_resource_nest; + arr[DEVLINK_ATTR_RESOURCE_NAME].name = "resource-name"; + arr[DEVLINK_ATTR_RESOURCE_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_RESOURCE_ID].name = "resource-id"; + arr[DEVLINK_ATTR_RESOURCE_ID].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_SIZE].name = "resource-size"; + arr[DEVLINK_ATTR_RESOURCE_SIZE].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_SIZE_NEW].name = "resource-size-new"; + arr[DEVLINK_ATTR_RESOURCE_SIZE_NEW].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_SIZE_VALID].name = "resource-size-valid"; + arr[DEVLINK_ATTR_RESOURCE_SIZE_VALID].type = YNL_PT_U8; + arr[DEVLINK_ATTR_RESOURCE_SIZE_MIN].name = "resource-size-min"; + arr[DEVLINK_ATTR_RESOURCE_SIZE_MIN].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_SIZE_MAX].name = "resource-size-max"; + arr[DEVLINK_ATTR_RESOURCE_SIZE_MAX].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_SIZE_GRAN].name = "resource-size-gran"; + arr[DEVLINK_ATTR_RESOURCE_SIZE_GRAN].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RESOURCE_UNIT].name = "resource-unit"; + arr[DEVLINK_ATTR_RESOURCE_UNIT].type = YNL_PT_U8; + arr[DEVLINK_ATTR_RESOURCE_OCC].name = "resource-occ"; + arr[DEVLINK_ATTR_RESOURCE_OCC].type = YNL_PT_U64; + arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID].name = "dpipe-table-resource-id"; + arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID].type = YNL_PT_U64; + arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS].name = "dpipe-table-resource-units"; + arr[DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS].type = YNL_PT_U64; + arr[DEVLINK_ATTR_PORT_FLAVOUR].name = "port-flavour"; + arr[DEVLINK_ATTR_PORT_FLAVOUR].type = YNL_PT_U16; + arr[DEVLINK_ATTR_PORT_NUMBER].name = "port-number"; + arr[DEVLINK_ATTR_PORT_NUMBER].type = YNL_PT_U32; + arr[DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER].name = "port-split-subport-number"; + arr[DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER].type = YNL_PT_U32; + arr[DEVLINK_ATTR_PARAM].name = "param"; + arr[DEVLINK_ATTR_PARAM].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_PARAM].nest = &devlink_dl_param_nest; + arr[DEVLINK_ATTR_PARAM_NAME].name = "param-name"; + arr[DEVLINK_ATTR_PARAM_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_PARAM_GENERIC].name = "param-generic"; + arr[DEVLINK_ATTR_PARAM_GENERIC].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_PARAM_TYPE].name = "param-type"; + arr[DEVLINK_ATTR_PARAM_TYPE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_PARAM_VALUE_CMODE].name = "param-value-cmode"; + arr[DEVLINK_ATTR_PARAM_VALUE_CMODE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_REGION_NAME].name = "region-name"; + arr[DEVLINK_ATTR_REGION_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_REGION_SIZE].name = "region-size"; + arr[DEVLINK_ATTR_REGION_SIZE].type = YNL_PT_U64; + arr[DEVLINK_ATTR_REGION_SNAPSHOTS].name = "region-snapshots"; + arr[DEVLINK_ATTR_REGION_SNAPSHOTS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_REGION_SNAPSHOTS].nest = &devlink_dl_region_snapshots_nest; + arr[DEVLINK_ATTR_REGION_SNAPSHOT].name = "region-snapshot"; + arr[DEVLINK_ATTR_REGION_SNAPSHOT].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_REGION_SNAPSHOT].nest = &devlink_dl_region_snapshot_nest; + arr[DEVLINK_ATTR_REGION_SNAPSHOT_ID].name = "region-snapshot-id"; + arr[DEVLINK_ATTR_REGION_SNAPSHOT_ID].type = YNL_PT_U32; + arr[DEVLINK_ATTR_REGION_CHUNKS].name = "region-chunks"; + arr[DEVLINK_ATTR_REGION_CHUNKS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_REGION_CHUNKS].nest = &devlink_dl_region_chunks_nest; + arr[DEVLINK_ATTR_REGION_CHUNK].name = "region-chunk"; + arr[DEVLINK_ATTR_REGION_CHUNK].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_REGION_CHUNK].nest = &devlink_dl_region_chunk_nest; + arr[DEVLINK_ATTR_REGION_CHUNK_DATA].name = "region-chunk-data"; + arr[DEVLINK_ATTR_REGION_CHUNK_DATA].type = YNL_PT_BINARY; + arr[DEVLINK_ATTR_REGION_CHUNK_ADDR].name = "region-chunk-addr"; + arr[DEVLINK_ATTR_REGION_CHUNK_ADDR].type = YNL_PT_U64; + arr[DEVLINK_ATTR_REGION_CHUNK_LEN].name = "region-chunk-len"; + arr[DEVLINK_ATTR_REGION_CHUNK_LEN].type = YNL_PT_U64; + arr[DEVLINK_ATTR_INFO_DRIVER_NAME].name = "info-driver-name"; + arr[DEVLINK_ATTR_INFO_DRIVER_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_INFO_SERIAL_NUMBER].name = "info-serial-number"; + arr[DEVLINK_ATTR_INFO_SERIAL_NUMBER].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_INFO_VERSION_FIXED].name = "info-version-fixed"; + arr[DEVLINK_ATTR_INFO_VERSION_FIXED].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_INFO_VERSION_FIXED].nest = &devlink_dl_info_version_nest; + arr[DEVLINK_ATTR_INFO_VERSION_RUNNING].name = "info-version-running"; + arr[DEVLINK_ATTR_INFO_VERSION_RUNNING].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_INFO_VERSION_RUNNING].nest = &devlink_dl_info_version_nest; + arr[DEVLINK_ATTR_INFO_VERSION_STORED].name = "info-version-stored"; + arr[DEVLINK_ATTR_INFO_VERSION_STORED].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_INFO_VERSION_STORED].nest = &devlink_dl_info_version_nest; + arr[DEVLINK_ATTR_INFO_VERSION_NAME].name = "info-version-name"; + arr[DEVLINK_ATTR_INFO_VERSION_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_INFO_VERSION_VALUE].name = "info-version-value"; + arr[DEVLINK_ATTR_INFO_VERSION_VALUE].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_SB_POOL_CELL_SIZE].name = "sb-pool-cell-size"; + arr[DEVLINK_ATTR_SB_POOL_CELL_SIZE].type = YNL_PT_U32; + arr[DEVLINK_ATTR_FMSG].name = "fmsg"; + arr[DEVLINK_ATTR_FMSG].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_FMSG].nest = &devlink_dl_fmsg_nest; + arr[DEVLINK_ATTR_FMSG_OBJ_NEST_START].name = "fmsg-obj-nest-start"; + arr[DEVLINK_ATTR_FMSG_OBJ_NEST_START].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_FMSG_PAIR_NEST_START].name = "fmsg-pair-nest-start"; + arr[DEVLINK_ATTR_FMSG_PAIR_NEST_START].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_FMSG_ARR_NEST_START].name = "fmsg-arr-nest-start"; + arr[DEVLINK_ATTR_FMSG_ARR_NEST_START].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_FMSG_NEST_END].name = "fmsg-nest-end"; + arr[DEVLINK_ATTR_FMSG_NEST_END].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_FMSG_OBJ_NAME].name = "fmsg-obj-name"; + arr[DEVLINK_ATTR_FMSG_OBJ_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE].name = "fmsg-obj-value-type"; + arr[DEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_HEALTH_REPORTER].name = "health-reporter"; + arr[DEVLINK_ATTR_HEALTH_REPORTER].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_HEALTH_REPORTER].nest = &devlink_dl_health_reporter_nest; + arr[DEVLINK_ATTR_HEALTH_REPORTER_NAME].name = "health-reporter-name"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_HEALTH_REPORTER_STATE].name = "health-reporter-state"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_STATE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT].name = "health-reporter-err-count"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT].type = YNL_PT_U64; + arr[DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT].name = "health-reporter-recover-count"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT].type = YNL_PT_U64; + arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS].name = "health-reporter-dump-ts"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS].type = YNL_PT_U64; + arr[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD].name = "health-reporter-graceful-period"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD].type = YNL_PT_U64; + arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER].name = "health-reporter-auto-recover"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER].type = YNL_PT_U8; + arr[DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME].name = "flash-update-file-name"; + arr[DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT].name = "flash-update-component"; + arr[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG].name = "flash-update-status-msg"; + arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE].name = "flash-update-status-done"; + arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE].type = YNL_PT_U64; + arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL].name = "flash-update-status-total"; + arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL].type = YNL_PT_U64; + arr[DEVLINK_ATTR_PORT_PCI_PF_NUMBER].name = "port-pci-pf-number"; + arr[DEVLINK_ATTR_PORT_PCI_PF_NUMBER].type = YNL_PT_U16; + arr[DEVLINK_ATTR_PORT_PCI_VF_NUMBER].name = "port-pci-vf-number"; + arr[DEVLINK_ATTR_PORT_PCI_VF_NUMBER].type = YNL_PT_U16; + arr[DEVLINK_ATTR_STATS].name = "stats"; + arr[DEVLINK_ATTR_STATS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_STATS].nest = &devlink_dl_attr_stats_nest; + arr[DEVLINK_ATTR_TRAP_NAME].name = "trap-name"; + arr[DEVLINK_ATTR_TRAP_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_TRAP_ACTION].name = "trap-action"; + arr[DEVLINK_ATTR_TRAP_ACTION].type = YNL_PT_U8; + arr[DEVLINK_ATTR_TRAP_TYPE].name = "trap-type"; + arr[DEVLINK_ATTR_TRAP_TYPE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_TRAP_GENERIC].name = "trap-generic"; + arr[DEVLINK_ATTR_TRAP_GENERIC].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_TRAP_METADATA].name = "trap-metadata"; + arr[DEVLINK_ATTR_TRAP_METADATA].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_TRAP_METADATA].nest = &devlink_dl_trap_metadata_nest; + arr[DEVLINK_ATTR_TRAP_GROUP_NAME].name = "trap-group-name"; + arr[DEVLINK_ATTR_TRAP_GROUP_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_RELOAD_FAILED].name = "reload-failed"; + arr[DEVLINK_ATTR_RELOAD_FAILED].type = YNL_PT_U8; + arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS].name = "health-reporter-dump-ts-ns"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS].type = YNL_PT_U64; + arr[DEVLINK_ATTR_NETNS_FD].name = "netns-fd"; + arr[DEVLINK_ATTR_NETNS_FD].type = YNL_PT_U32; + arr[DEVLINK_ATTR_NETNS_PID].name = "netns-pid"; + arr[DEVLINK_ATTR_NETNS_PID].type = YNL_PT_U32; + arr[DEVLINK_ATTR_NETNS_ID].name = "netns-id"; + arr[DEVLINK_ATTR_NETNS_ID].type = YNL_PT_U32; + arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP].name = "health-reporter-auto-dump"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP].type = YNL_PT_U8; + arr[DEVLINK_ATTR_TRAP_POLICER_ID].name = "trap-policer-id"; + arr[DEVLINK_ATTR_TRAP_POLICER_ID].type = YNL_PT_U32; + arr[DEVLINK_ATTR_TRAP_POLICER_RATE].name = "trap-policer-rate"; + arr[DEVLINK_ATTR_TRAP_POLICER_RATE].type = YNL_PT_U64; + arr[DEVLINK_ATTR_TRAP_POLICER_BURST].name = "trap-policer-burst"; + arr[DEVLINK_ATTR_TRAP_POLICER_BURST].type = YNL_PT_U64; + arr[DEVLINK_ATTR_PORT_FUNCTION].name = "port-function"; + arr[DEVLINK_ATTR_PORT_FUNCTION].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_PORT_FUNCTION].nest = &devlink_dl_port_function_nest; + arr[DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER].name = "info-board-serial-number"; + arr[DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_PORT_LANES].name = "port-lanes"; + arr[DEVLINK_ATTR_PORT_LANES].type = YNL_PT_U32; + arr[DEVLINK_ATTR_PORT_SPLITTABLE].name = "port-splittable"; + arr[DEVLINK_ATTR_PORT_SPLITTABLE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_PORT_EXTERNAL].name = "port-external"; + arr[DEVLINK_ATTR_PORT_EXTERNAL].type = YNL_PT_U8; + arr[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER].name = "port-controller-number"; + arr[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER].type = YNL_PT_U32; + arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT].name = "flash-update-status-timeout"; + arr[DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT].type = YNL_PT_U64; + arr[DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK].name = "flash-update-overwrite-mask"; + arr[DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK].type = YNL_PT_BITFIELD32; + arr[DEVLINK_ATTR_RELOAD_ACTION].name = "reload-action"; + arr[DEVLINK_ATTR_RELOAD_ACTION].type = YNL_PT_U8; + arr[DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED].name = "reload-actions-performed"; + arr[DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED].type = YNL_PT_BITFIELD32; + arr[DEVLINK_ATTR_RELOAD_LIMITS].name = "reload-limits"; + arr[DEVLINK_ATTR_RELOAD_LIMITS].type = YNL_PT_BITFIELD32; + arr[DEVLINK_ATTR_DEV_STATS].name = "dev-stats"; + arr[DEVLINK_ATTR_DEV_STATS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_DEV_STATS].nest = &devlink_dl_dev_stats_nest; + arr[DEVLINK_ATTR_RELOAD_STATS].name = "reload-stats"; + arr[DEVLINK_ATTR_RELOAD_STATS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RELOAD_STATS].nest = &devlink_dl_reload_stats_nest; + arr[DEVLINK_ATTR_RELOAD_STATS_ENTRY].name = "reload-stats-entry"; + arr[DEVLINK_ATTR_RELOAD_STATS_ENTRY].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RELOAD_STATS_ENTRY].nest = &devlink_dl_reload_stats_entry_nest; + arr[DEVLINK_ATTR_RELOAD_STATS_LIMIT].name = "reload-stats-limit"; + arr[DEVLINK_ATTR_RELOAD_STATS_LIMIT].type = YNL_PT_U8; + arr[DEVLINK_ATTR_RELOAD_STATS_VALUE].name = "reload-stats-value"; + arr[DEVLINK_ATTR_RELOAD_STATS_VALUE].type = YNL_PT_U32; + arr[DEVLINK_ATTR_REMOTE_RELOAD_STATS].name = "remote-reload-stats"; + arr[DEVLINK_ATTR_REMOTE_RELOAD_STATS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_REMOTE_RELOAD_STATS].nest = &devlink_dl_reload_stats_nest; + arr[DEVLINK_ATTR_RELOAD_ACTION_INFO].name = "reload-action-info"; + arr[DEVLINK_ATTR_RELOAD_ACTION_INFO].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RELOAD_ACTION_INFO].nest = &devlink_dl_reload_act_info_nest; + arr[DEVLINK_ATTR_RELOAD_ACTION_STATS].name = "reload-action-stats"; + arr[DEVLINK_ATTR_RELOAD_ACTION_STATS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RELOAD_ACTION_STATS].nest = &devlink_dl_reload_act_stats_nest; + arr[DEVLINK_ATTR_PORT_PCI_SF_NUMBER].name = "port-pci-sf-number"; + arr[DEVLINK_ATTR_PORT_PCI_SF_NUMBER].type = YNL_PT_U32; + arr[DEVLINK_ATTR_RATE_TYPE].name = "rate-type"; + arr[DEVLINK_ATTR_RATE_TYPE].type = YNL_PT_U16; + arr[DEVLINK_ATTR_RATE_TX_SHARE].name = "rate-tx-share"; + arr[DEVLINK_ATTR_RATE_TX_SHARE].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RATE_TX_MAX].name = "rate-tx-max"; + arr[DEVLINK_ATTR_RATE_TX_MAX].type = YNL_PT_U64; + arr[DEVLINK_ATTR_RATE_NODE_NAME].name = "rate-node-name"; + arr[DEVLINK_ATTR_RATE_NODE_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_RATE_PARENT_NODE_NAME].name = "rate-parent-node-name"; + arr[DEVLINK_ATTR_RATE_PARENT_NODE_NAME].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_REGION_MAX_SNAPSHOTS].name = "region-max-snapshots"; + arr[DEVLINK_ATTR_REGION_MAX_SNAPSHOTS].type = YNL_PT_U32; + arr[DEVLINK_ATTR_LINECARD_INDEX].name = "linecard-index"; + arr[DEVLINK_ATTR_LINECARD_INDEX].type = YNL_PT_U32; + arr[DEVLINK_ATTR_LINECARD_STATE].name = "linecard-state"; + arr[DEVLINK_ATTR_LINECARD_STATE].type = YNL_PT_U8; + arr[DEVLINK_ATTR_LINECARD_TYPE].name = "linecard-type"; + arr[DEVLINK_ATTR_LINECARD_TYPE].type = YNL_PT_NUL_STR; + arr[DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES].name = "linecard-supported-types"; + arr[DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES].nest = &devlink_dl_linecard_supported_types_nest; + arr[DEVLINK_ATTR_SELFTESTS].name = "selftests"; + arr[DEVLINK_ATTR_SELFTESTS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_SELFTESTS].nest = &devlink_dl_selftest_id_nest; + arr[DEVLINK_ATTR_RATE_TX_PRIORITY].name = "rate-tx-priority"; + arr[DEVLINK_ATTR_RATE_TX_PRIORITY].type = YNL_PT_U32; + arr[DEVLINK_ATTR_RATE_TX_WEIGHT].name = "rate-tx-weight"; + arr[DEVLINK_ATTR_RATE_TX_WEIGHT].type = YNL_PT_U32; + arr[DEVLINK_ATTR_REGION_DIRECT].name = "region-direct"; + arr[DEVLINK_ATTR_REGION_DIRECT].type = YNL_PT_FLAG; + arr[DEVLINK_ATTR_RATE_TC_BWS].name = "rate-tc-bws"; + arr[DEVLINK_ATTR_RATE_TC_BWS].type = YNL_PT_NEST; + arr[DEVLINK_ATTR_RATE_TC_BWS].nest = &devlink_dl_rate_tc_bws_nest; + arr[DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD].name = "health-reporter-burst-period"; + arr[DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD].type = YNL_PT_U64; return arr; } (); struct ynl_policy_nest devlink_nest = { - .max_attr = DEVLINK_ATTR_MAX, + .max_attr = static_cast(DEVLINK_ATTR_MAX), .table = devlink_policy.data(), }; @@ -1017,24 +1416,29 @@ int devlink_dl_dpipe_match_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_DPIPE_MATCH_TYPE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dpipe_match_type = (devlink_dpipe_match_type)ynl_attr_get_u32(attr); + } + dst->dpipe_match_type = (enum devlink_dpipe_match_type)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_DPIPE_HEADER_ID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dpipe_header_id = (devlink_dpipe_header_id)ynl_attr_get_u32(attr); + } + dst->dpipe_header_id = (enum devlink_dpipe_header_id)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_DPIPE_HEADER_GLOBAL) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_header_global = (__u8)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_DPIPE_HEADER_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_header_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_DPIPE_FIELD_ID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_field_id = (__u32)ynl_attr_get_u32(attr); } } @@ -1053,8 +1457,9 @@ int devlink_dl_dpipe_match_value_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->dpipe_match.size() > 0) + if (dst->dpipe_match.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-dpipe-match-value.dpipe-match)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1062,20 +1467,23 @@ int devlink_dl_dpipe_match_value_parse(struct ynl_parse_arg *yarg, if (type == DEVLINK_ATTR_DPIPE_MATCH) { n_dpipe_match++; } else if (type == DEVLINK_ATTR_DPIPE_VALUE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } unsigned int len = ynl_attr_data_len(attr); __u8 *data = (__u8*)ynl_attr_data(attr); dst->dpipe_value.assign(data, data + len); } else if (type == DEVLINK_ATTR_DPIPE_VALUE_MASK) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } unsigned int len = ynl_attr_data_len(attr); __u8 *data = (__u8*)ynl_attr_data(attr); dst->dpipe_value_mask.assign(data, data + len); } else if (type == DEVLINK_ATTR_DPIPE_VALUE_MAPPING) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_value_mapping = (__u32)ynl_attr_get_u32(attr); } } @@ -1087,8 +1495,9 @@ int devlink_dl_dpipe_match_value_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_DPIPE_MATCH) { parg.data = &dst->dpipe_match[i]; - if (devlink_dl_dpipe_match_parse(&parg, attr)) + if (devlink_dl_dpipe_match_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1107,24 +1516,29 @@ int devlink_dl_dpipe_action_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_DPIPE_ACTION_TYPE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dpipe_action_type = (devlink_dpipe_action_type)ynl_attr_get_u32(attr); + } + dst->dpipe_action_type = (enum devlink_dpipe_action_type)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_DPIPE_HEADER_ID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dpipe_header_id = (devlink_dpipe_header_id)ynl_attr_get_u32(attr); + } + dst->dpipe_header_id = (enum devlink_dpipe_header_id)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_DPIPE_HEADER_GLOBAL) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_header_global = (__u8)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_DPIPE_HEADER_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_header_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_DPIPE_FIELD_ID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_field_id = (__u32)ynl_attr_get_u32(attr); } } @@ -1143,8 +1557,9 @@ int devlink_dl_dpipe_action_value_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->dpipe_action.size() > 0) + if (dst->dpipe_action.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-dpipe-action-value.dpipe-action)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1152,20 +1567,23 @@ int devlink_dl_dpipe_action_value_parse(struct ynl_parse_arg *yarg, if (type == DEVLINK_ATTR_DPIPE_ACTION) { n_dpipe_action++; } else if (type == DEVLINK_ATTR_DPIPE_VALUE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } unsigned int len = ynl_attr_data_len(attr); __u8 *data = (__u8*)ynl_attr_data(attr); dst->dpipe_value.assign(data, data + len); } else if (type == DEVLINK_ATTR_DPIPE_VALUE_MASK) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } unsigned int len = ynl_attr_data_len(attr); __u8 *data = (__u8*)ynl_attr_data(attr); dst->dpipe_value_mask.assign(data, data + len); } else if (type == DEVLINK_ATTR_DPIPE_VALUE_MAPPING) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_value_mapping = (__u32)ynl_attr_get_u32(attr); } } @@ -1177,8 +1595,9 @@ int devlink_dl_dpipe_action_value_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_DPIPE_ACTION) { parg.data = &dst->dpipe_action[i]; - if (devlink_dl_dpipe_action_parse(&parg, attr)) + if (devlink_dl_dpipe_action_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1197,21 +1616,25 @@ int devlink_dl_dpipe_field_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_DPIPE_FIELD_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dpipe_field_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dpipe_field_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DPIPE_FIELD_ID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_field_id = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_field_bitwidth = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dpipe_field_mapping_type = (devlink_dpipe_field_mapping_type)ynl_attr_get_u32(attr); + } + dst->dpipe_field_mapping_type = (enum devlink_dpipe_field_mapping_type)ynl_attr_get_u32(attr); } } @@ -1228,44 +1651,54 @@ int devlink_dl_resource_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_RESOURCE_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->resource_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->resource_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_RESOURCE_ID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->resource_id = (__u64)ynl_attr_get_u64(attr); } else if (type == DEVLINK_ATTR_RESOURCE_SIZE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->resource_size = (__u64)ynl_attr_get_u64(attr); } else if (type == DEVLINK_ATTR_RESOURCE_SIZE_NEW) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->resource_size_new = (__u64)ynl_attr_get_u64(attr); } else if (type == DEVLINK_ATTR_RESOURCE_SIZE_VALID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->resource_size_valid = (__u8)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_RESOURCE_SIZE_MIN) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->resource_size_min = (__u64)ynl_attr_get_u64(attr); } else if (type == DEVLINK_ATTR_RESOURCE_SIZE_MAX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->resource_size_max = (__u64)ynl_attr_get_u64(attr); } else if (type == DEVLINK_ATTR_RESOURCE_SIZE_GRAN) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->resource_size_gran = (__u64)ynl_attr_get_u64(attr); } else if (type == DEVLINK_ATTR_RESOURCE_UNIT) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->resource_unit = (devlink_resource_unit)ynl_attr_get_u8(attr); + } + dst->resource_unit = (enum devlink_resource_unit)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_RESOURCE_OCC) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->resource_occ = (__u64)ynl_attr_get_u64(attr); } } @@ -1283,13 +1716,15 @@ int devlink_dl_info_version_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_INFO_VERSION_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->info_version_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->info_version_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_INFO_VERSION_VALUE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->info_version_value.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->info_version_value.assign(ynl_attr_get_str(attr)); } } @@ -1306,21 +1741,26 @@ int devlink_dl_fmsg_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_FMSG_OBJ_NEST_START) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } } else if (type == DEVLINK_ATTR_FMSG_PAIR_NEST_START) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } } else if (type == DEVLINK_ATTR_FMSG_ARR_NEST_START) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } } else if (type == DEVLINK_ATTR_FMSG_NEST_END) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } } else if (type == DEVLINK_ATTR_FMSG_OBJ_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->fmsg_obj_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->fmsg_obj_name.assign(ynl_attr_get_str(attr)); } } @@ -1333,14 +1773,18 @@ int devlink_dl_port_function_put(struct nlmsghdr *nlh, unsigned int attr_type, struct nlattr *nest; nest = ynl_attr_nest_start(nlh, attr_type); - if (obj.hw_addr.size() > 0) + if (obj.hw_addr.size() > 0) { ynl_attr_put(nlh, DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR, obj.hw_addr.data(), obj.hw_addr.size()); - if (obj.state.has_value()) + } + if (obj.state.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_PORT_FN_ATTR_STATE, obj.state.value()); - if (obj.opstate.has_value()) + } + if (obj.opstate.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_PORT_FN_ATTR_OPSTATE, obj.opstate.value()); - if (obj.caps.has_value()) - ynl_attr_put(nlh, DEVLINK_PORT_FN_ATTR_CAPS, &obj->caps, sizeof(struct nla_bitfield32)); + } + if (obj.caps.has_value()) { + ynl_attr_put(nlh, DEVLINK_PORT_FN_ATTR_CAPS, &(*obj.caps), sizeof(struct nla_bitfield32)); + } ynl_attr_nest_end(nlh, nest); return 0; @@ -1356,12 +1800,14 @@ int devlink_dl_reload_stats_entry_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_RELOAD_STATS_LIMIT) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->reload_stats_limit = (__u8)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_RELOAD_STATS_VALUE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->reload_stats_value = (__u32)ynl_attr_get_u32(attr); } } @@ -1380,8 +1826,9 @@ int devlink_dl_reload_act_stats_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->reload_stats_entry.size() > 0) + if (dst->reload_stats_entry.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-reload-act-stats.reload-stats-entry)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1398,8 +1845,9 @@ int devlink_dl_reload_act_stats_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_RELOAD_STATS_ENTRY) { parg.data = &dst->reload_stats_entry[i]; - if (devlink_dl_reload_stats_entry_parse(&parg, attr)) + if (devlink_dl_reload_stats_entry_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1414,8 +1862,26 @@ int devlink_dl_selftest_id_put(struct nlmsghdr *nlh, unsigned int attr_type, struct nlattr *nest; nest = ynl_attr_nest_start(nlh, attr_type); - if (obj.flash) + if (obj.flash) { ynl_attr_put(nlh, DEVLINK_ATTR_SELFTEST_ID_FLASH, NULL, 0); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int devlink_dl_rate_tc_bws_put(struct nlmsghdr *nlh, unsigned int attr_type, + const devlink_dl_rate_tc_bws& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.index.has_value()) { + ynl_attr_put_u8(nlh, DEVLINK_RATE_TC_ATTR_INDEX, obj.index.value()); + } + if (obj.bw.has_value()) { + ynl_attr_put_u32(nlh, DEVLINK_RATE_TC_ATTR_BW, obj.bw.value()); + } ynl_attr_nest_end(nlh, nest); return 0; @@ -1432,8 +1898,9 @@ int devlink_dl_dpipe_table_matches_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->dpipe_match.size() > 0) + if (dst->dpipe_match.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-dpipe-table-matches.dpipe-match)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1450,8 +1917,9 @@ int devlink_dl_dpipe_table_matches_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_DPIPE_MATCH) { parg.data = &dst->dpipe_match[i]; - if (devlink_dl_dpipe_match_parse(&parg, attr)) + if (devlink_dl_dpipe_match_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1471,8 +1939,9 @@ int devlink_dl_dpipe_table_actions_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->dpipe_action.size() > 0) + if (dst->dpipe_action.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-dpipe-table-actions.dpipe-action)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1489,8 +1958,9 @@ int devlink_dl_dpipe_table_actions_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_DPIPE_ACTION) { parg.data = &dst->dpipe_action[i]; - if (devlink_dl_dpipe_action_parse(&parg, attr)) + if (devlink_dl_dpipe_action_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1510,8 +1980,9 @@ int devlink_dl_dpipe_entry_match_values_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->dpipe_match_value.size() > 0) + if (dst->dpipe_match_value.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-dpipe-entry-match-values.dpipe-match-value)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1528,8 +1999,9 @@ int devlink_dl_dpipe_entry_match_values_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_DPIPE_MATCH_VALUE) { parg.data = &dst->dpipe_match_value[i]; - if (devlink_dl_dpipe_match_value_parse(&parg, attr)) + if (devlink_dl_dpipe_match_value_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1549,8 +2021,9 @@ int devlink_dl_dpipe_entry_action_values_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->dpipe_action_value.size() > 0) + if (dst->dpipe_action_value.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-dpipe-entry-action-values.dpipe-action-value)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1567,8 +2040,9 @@ int devlink_dl_dpipe_entry_action_values_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_DPIPE_ACTION_VALUE) { parg.data = &dst->dpipe_action_value[i]; - if (devlink_dl_dpipe_action_value_parse(&parg, attr)) + if (devlink_dl_dpipe_action_value_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1588,8 +2062,9 @@ int devlink_dl_dpipe_header_fields_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->dpipe_field.size() > 0) + if (dst->dpipe_field.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-dpipe-header-fields.dpipe-field)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1606,8 +2081,9 @@ int devlink_dl_dpipe_header_fields_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_DPIPE_FIELD) { parg.data = &dst->dpipe_field[i]; - if (devlink_dl_dpipe_field_parse(&parg, attr)) + if (devlink_dl_dpipe_field_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1627,8 +2103,9 @@ int devlink_dl_resource_list_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->resource.size() > 0) + if (dst->resource.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-resource-list.resource)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1645,8 +2122,9 @@ int devlink_dl_resource_list_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_RESOURCE) { parg.data = &dst->resource[i]; - if (devlink_dl_resource_parse(&parg, attr)) + if (devlink_dl_resource_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1666,16 +2144,18 @@ int devlink_dl_reload_act_info_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->reload_action_stats.size() > 0) + if (dst->reload_action_stats.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-reload-act-info.reload-action-stats)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_RELOAD_ACTION) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->reload_action = (devlink_reload_action)ynl_attr_get_u8(attr); + } + dst->reload_action = (enum devlink_reload_action)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_RELOAD_ACTION_STATS) { n_reload_action_stats++; } @@ -1688,8 +2168,9 @@ int devlink_dl_reload_act_info_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_RELOAD_ACTION_STATS) { parg.data = &dst->reload_action_stats[i]; - if (devlink_dl_reload_act_stats_parse(&parg, attr)) + if (devlink_dl_reload_act_stats_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1711,40 +2192,49 @@ int devlink_dl_dpipe_table_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_DPIPE_TABLE_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dpipe_table_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dpipe_table_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DPIPE_TABLE_SIZE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_table_size = (__u64)ynl_attr_get_u64(attr); } else if (type == DEVLINK_ATTR_DPIPE_TABLE_MATCHES) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_dpipe_table_matches_nest; - parg.data = &dst->dpipe_table_matches; - if (devlink_dl_dpipe_table_matches_parse(&parg, attr)) + parg.data = &dst->dpipe_table_matches.emplace(); + if (devlink_dl_dpipe_table_matches_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } else if (type == DEVLINK_ATTR_DPIPE_TABLE_ACTIONS) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_dpipe_table_actions_nest; - parg.data = &dst->dpipe_table_actions; - if (devlink_dl_dpipe_table_actions_parse(&parg, attr)) + parg.data = &dst->dpipe_table_actions.emplace(); + if (devlink_dl_dpipe_table_actions_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } else if (type == DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_table_counters_enabled = (__u8)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_table_resource_id = (__u64)ynl_attr_get_u64(attr); } else if (type == DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_table_resource_units = (__u64)ynl_attr_get_u64(attr); } } @@ -1765,28 +2255,34 @@ int devlink_dl_dpipe_entry_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_DPIPE_ENTRY_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_entry_index = (__u64)ynl_attr_get_u64(attr); } else if (type == DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_dpipe_entry_match_values_nest; - parg.data = &dst->dpipe_entry_match_values; - if (devlink_dl_dpipe_entry_match_values_parse(&parg, attr)) + parg.data = &dst->dpipe_entry_match_values.emplace(); + if (devlink_dl_dpipe_entry_match_values_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } else if (type == DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_dpipe_entry_action_values_nest; - parg.data = &dst->dpipe_entry_action_values; - if (devlink_dl_dpipe_entry_action_values_parse(&parg, attr)) + parg.data = &dst->dpipe_entry_action_values.emplace(); + if (devlink_dl_dpipe_entry_action_values_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } else if (type == DEVLINK_ATTR_DPIPE_ENTRY_COUNTER) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_entry_counter = (__u64)ynl_attr_get_u64(attr); } } @@ -1807,25 +2303,30 @@ int devlink_dl_dpipe_header_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_DPIPE_HEADER_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dpipe_header_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dpipe_header_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DPIPE_HEADER_ID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dpipe_header_id = (devlink_dpipe_header_id)ynl_attr_get_u32(attr); + } + dst->dpipe_header_id = (enum devlink_dpipe_header_id)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_DPIPE_HEADER_GLOBAL) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->dpipe_header_global = (__u8)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_DPIPE_HEADER_FIELDS) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_dpipe_header_fields_nest; - parg.data = &dst->dpipe_header_fields; - if (devlink_dl_dpipe_header_fields_parse(&parg, attr)) + parg.data = &dst->dpipe_header_fields.emplace(); + if (devlink_dl_dpipe_header_fields_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } } @@ -1843,8 +2344,9 @@ int devlink_dl_reload_stats_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->reload_action_info.size() > 0) + if (dst->reload_action_info.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-reload-stats.reload-action-info)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1861,8 +2363,9 @@ int devlink_dl_reload_stats_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_RELOAD_ACTION_INFO) { parg.data = &dst->reload_action_info[i]; - if (devlink_dl_reload_act_info_parse(&parg, attr)) + if (devlink_dl_reload_act_info_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1882,8 +2385,9 @@ int devlink_dl_dpipe_tables_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->dpipe_table.size() > 0) + if (dst->dpipe_table.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-dpipe-tables.dpipe-table)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1900,8 +2404,9 @@ int devlink_dl_dpipe_tables_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_DPIPE_TABLE) { parg.data = &dst->dpipe_table[i]; - if (devlink_dl_dpipe_table_parse(&parg, attr)) + if (devlink_dl_dpipe_table_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1921,8 +2426,9 @@ int devlink_dl_dpipe_entries_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->dpipe_entry.size() > 0) + if (dst->dpipe_entry.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-dpipe-entries.dpipe-entry)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1939,8 +2445,9 @@ int devlink_dl_dpipe_entries_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_DPIPE_ENTRY) { parg.data = &dst->dpipe_entry[i]; - if (devlink_dl_dpipe_entry_parse(&parg, attr)) + if (devlink_dl_dpipe_entry_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -1960,8 +2467,9 @@ int devlink_dl_dpipe_headers_parse(struct ynl_parse_arg *yarg, parg.ys = yarg->ys; - if (dst->dpipe_header.size() > 0) + if (dst->dpipe_header.size() > 0) { return ynl_error_parse(yarg, "attribute already present (dl-dpipe-headers.dpipe-header)"); + } ynl_attr_for_each_nested(attr, nested) { unsigned int type = ynl_attr_type(attr); @@ -1978,8 +2486,9 @@ int devlink_dl_dpipe_headers_parse(struct ynl_parse_arg *yarg, ynl_attr_for_each_nested(attr, nested) { if (ynl_attr_type(attr) == DEVLINK_ATTR_DPIPE_HEADER) { parg.data = &dst->dpipe_header[i]; - if (devlink_dl_dpipe_header_parse(&parg, attr)) + if (devlink_dl_dpipe_header_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -2001,21 +2510,25 @@ int devlink_dl_dev_stats_parse(struct ynl_parse_arg *yarg, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_RELOAD_STATS) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_reload_stats_nest; - parg.data = &dst->reload_stats; - if (devlink_dl_reload_stats_parse(&parg, attr)) + parg.data = &dst->reload_stats.emplace(); + if (devlink_dl_reload_stats_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } else if (type == DEVLINK_ATTR_REMOTE_RELOAD_STATS) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_reload_stats_nest; - parg.data = &dst->remote_reload_stats; - if (devlink_dl_reload_stats_parse(&parg, attr)) + parg.data = &dst->remote_reload_stats.emplace(); + if (devlink_dl_reload_stats_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } } @@ -2038,25 +2551,30 @@ int devlink_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_RELOAD_FAILED) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->reload_failed = (__u8)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_DEV_STATS) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_dev_stats_nest; - parg.data = &dst->dev_stats; - if (devlink_dl_dev_stats_parse(&parg, attr)) + parg.data = &dst->dev_stats.emplace(); + if (devlink_dl_dev_stats_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } } @@ -2064,7 +2582,7 @@ int devlink_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_get(ynl_cpp::ynl_socket& ys, devlink_get_req& req) +devlink_get(ynl_cpp::ynl_socket& ys, devlink_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -2075,10 +2593,12 @@ devlink_get(ynl_cpp::ynl_socket& ys, devlink_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } rsp.reset(new devlink_get_rsp()); yrs.yarg.data = rsp.get(); @@ -2086,14 +2606,15 @@ devlink_get(ynl_cpp::ynl_socket& ys, devlink_get_req& req) yrs.rsp_cmd = 3; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_GET - dump */ -std::unique_ptr devlink_get_dump(ynl_cpp::ynl_socket& ys) +std::unique_ptr devlink_get_dump(ynl_cpp::ynl_socket& ys) { struct ynl_dump_no_alloc_state yds = {}; struct nlmsghdr *nlh; @@ -2103,15 +2624,16 @@ std::unique_ptr devlink_get_dump(ynl_cpp::ynl_socket& ys) yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_get_rsp_parse; yds.rsp_cmd = 3; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_GET, 1); err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } @@ -2130,16 +2652,19 @@ int devlink_port_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } } @@ -2148,7 +2673,7 @@ int devlink_port_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_port_get(ynl_cpp::ynl_socket& ys, devlink_port_get_req& req) +devlink_port_get(ynl_cpp::ynl_socket& ys, devlink_port_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -2159,12 +2684,15 @@ devlink_port_get(ynl_cpp::ynl_socket& ys, devlink_port_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); + } rsp.reset(new devlink_port_get_rsp()); yrs.yarg.data = rsp.get(); @@ -2172,8 +2700,9 @@ devlink_port_get(ynl_cpp::ynl_socket& ys, devlink_port_get_req& req) yrs.rsp_cmd = 7; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } @@ -2191,16 +2720,19 @@ int devlink_port_get_rsp_dump_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } } @@ -2209,7 +2741,7 @@ int devlink_port_get_rsp_dump_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_port_get_dump(ynl_cpp::ynl_socket& ys, devlink_port_get_req_dump& req) +devlink_port_get_dump(ynl_cpp::ynl_socket& ys, devlink_port_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; struct nlmsghdr *nlh; @@ -2219,28 +2751,31 @@ devlink_port_get_dump(ynl_cpp::ynl_socket& ys, devlink_port_get_req_dump& req) yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_port_get_rsp_dump_parse; yds.rsp_cmd = 7; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_PORT_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_PORT_SET ============== */ /* DEVLINK_CMD_PORT_SET - do */ -int devlink_port_set(ynl_cpp::ynl_socket& ys, devlink_port_set_req& req) +int devlink_port_set(ynl_cpp::ynl_socket& ys, devlink_port_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -2249,20 +2784,26 @@ int devlink_port_set(ynl_cpp::ynl_socket& ys, devlink_port_set_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_PORT_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.port_type.has_value()) + } + if (req.port_type.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_PORT_TYPE, req.port_type.value()); - if (req.port_function.has_value()) + } + if (req.port_function.has_value()) { devlink_dl_port_function_put(nlh, DEVLINK_ATTR_PORT_FUNCTION, req.port_function.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -2281,16 +2822,19 @@ int devlink_port_new_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } } @@ -2299,7 +2843,7 @@ int devlink_port_new_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_port_new(ynl_cpp::ynl_socket& ys, devlink_port_new_req& req) +devlink_port_new(ynl_cpp::ynl_socket& ys, devlink_port_new_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -2310,20 +2854,27 @@ devlink_port_new(ynl_cpp::ynl_socket& ys, devlink_port_new_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.port_flavour.has_value()) + } + if (req.port_flavour.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_PORT_FLAVOUR, req.port_flavour.value()); - if (req.port_pci_pf_number.has_value()) + } + if (req.port_pci_pf_number.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, req.port_pci_pf_number.value()); - if (req.port_pci_sf_number.has_value()) + } + if (req.port_pci_sf_number.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_PCI_SF_NUMBER, req.port_pci_sf_number.value()); - if (req.port_controller_number.has_value()) + } + if (req.port_controller_number.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_CONTROLLER_NUMBER, req.port_controller_number.value()); + } rsp.reset(new devlink_port_new_rsp()); yrs.yarg.data = rsp.get(); @@ -2331,15 +2882,16 @@ devlink_port_new(ynl_cpp::ynl_socket& ys, devlink_port_new_req& req) yrs.rsp_cmd = DEVLINK_CMD_PORT_NEW; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* ============== DEVLINK_CMD_PORT_DEL ============== */ /* DEVLINK_CMD_PORT_DEL - do */ -int devlink_port_del(ynl_cpp::ynl_socket& ys, devlink_port_del_req& req) +int devlink_port_del(ynl_cpp::ynl_socket& ys, devlink_port_del_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -2348,23 +2900,27 @@ int devlink_port_del(ynl_cpp::ynl_socket& ys, devlink_port_del_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_PORT_DEL, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_PORT_SPLIT ============== */ /* DEVLINK_CMD_PORT_SPLIT - do */ -int devlink_port_split(ynl_cpp::ynl_socket& ys, devlink_port_split_req& req) +int devlink_port_split(ynl_cpp::ynl_socket& ys, devlink_port_split_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -2373,25 +2929,30 @@ int devlink_port_split(ynl_cpp::ynl_socket& ys, devlink_port_split_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_PORT_SPLIT, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.port_split_count.has_value()) + } + if (req.port_split_count.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_SPLIT_COUNT, req.port_split_count.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_PORT_UNSPLIT ============== */ /* DEVLINK_CMD_PORT_UNSPLIT - do */ -int devlink_port_unsplit(ynl_cpp::ynl_socket& ys, +int devlink_port_unsplit(ynl_cpp::ynl_socket& ys, devlink_port_unsplit_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -2401,16 +2962,20 @@ int devlink_port_unsplit(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_PORT_UNSPLIT, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -2429,16 +2994,19 @@ int devlink_sb_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_SB_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->sb_index = (__u32)ynl_attr_get_u32(attr); } } @@ -2447,7 +3015,7 @@ int devlink_sb_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_sb_get(ynl_cpp::ynl_socket& ys, devlink_sb_get_req& req) +devlink_sb_get(ynl_cpp::ynl_socket& ys, devlink_sb_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -2458,12 +3026,15 @@ devlink_sb_get(ynl_cpp::ynl_socket& ys, devlink_sb_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.sb_index.has_value()) + } + if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); + } rsp.reset(new devlink_sb_get_rsp()); yrs.yarg.data = rsp.get(); @@ -2471,15 +3042,16 @@ devlink_sb_get(ynl_cpp::ynl_socket& ys, devlink_sb_get_req& req) yrs.rsp_cmd = 13; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_SB_GET - dump */ std::unique_ptr -devlink_sb_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_get_req_dump& req) +devlink_sb_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; struct nlmsghdr *nlh; @@ -2489,21 +3061,24 @@ devlink_sb_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_get_req_dump& req) yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_sb_get_rsp_parse; yds.rsp_cmd = 13; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SB_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } @@ -2522,20 +3097,24 @@ int devlink_sb_pool_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_SB_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->sb_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_SB_POOL_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->sb_pool_index = (__u16)ynl_attr_get_u16(attr); } } @@ -2544,7 +3123,7 @@ int devlink_sb_pool_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_sb_pool_get(ynl_cpp::ynl_socket& ys, devlink_sb_pool_get_req& req) +devlink_sb_pool_get(ynl_cpp::ynl_socket& ys, devlink_sb_pool_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -2555,14 +3134,18 @@ devlink_sb_pool_get(ynl_cpp::ynl_socket& ys, devlink_sb_pool_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.sb_index.has_value()) + } + if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); - if (req.sb_pool_index.has_value()) + } + if (req.sb_pool_index.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req.sb_pool_index.value()); + } rsp.reset(new devlink_sb_pool_get_rsp()); yrs.yarg.data = rsp.get(); @@ -2570,15 +3153,16 @@ devlink_sb_pool_get(ynl_cpp::ynl_socket& ys, devlink_sb_pool_get_req& req) yrs.rsp_cmd = 17; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_SB_POOL_GET - dump */ std::unique_ptr -devlink_sb_pool_get_dump(ynl_cpp::ynl_socket& ys, +devlink_sb_pool_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_pool_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; @@ -2589,28 +3173,31 @@ devlink_sb_pool_get_dump(ynl_cpp::ynl_socket& ys, yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_sb_pool_get_rsp_parse; yds.rsp_cmd = 17; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SB_POOL_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_SB_POOL_SET ============== */ /* DEVLINK_CMD_SB_POOL_SET - do */ -int devlink_sb_pool_set(ynl_cpp::ynl_socket& ys, devlink_sb_pool_set_req& req) +int devlink_sb_pool_set(ynl_cpp::ynl_socket& ys, devlink_sb_pool_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -2619,22 +3206,29 @@ int devlink_sb_pool_set(ynl_cpp::ynl_socket& ys, devlink_sb_pool_set_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SB_POOL_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.sb_index.has_value()) + } + if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); - if (req.sb_pool_index.has_value()) + } + if (req.sb_pool_index.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req.sb_pool_index.value()); - if (req.sb_pool_threshold_type.has_value()) + } + if (req.sb_pool_threshold_type.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE, req.sb_pool_threshold_type.value()); - if (req.sb_pool_size.has_value()) + } + if (req.sb_pool_size.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_POOL_SIZE, req.sb_pool_size.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -2653,24 +3247,29 @@ int devlink_sb_port_pool_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_SB_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->sb_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_SB_POOL_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->sb_pool_index = (__u16)ynl_attr_get_u16(attr); } } @@ -2679,7 +3278,7 @@ int devlink_sb_port_pool_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_sb_port_pool_get(ynl_cpp::ynl_socket& ys, +devlink_sb_port_pool_get(ynl_cpp::ynl_socket& ys, devlink_sb_port_pool_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -2691,16 +3290,21 @@ devlink_sb_port_pool_get(ynl_cpp::ynl_socket& ys, ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.sb_index.has_value()) + } + if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); - if (req.sb_pool_index.has_value()) + } + if (req.sb_pool_index.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req.sb_pool_index.value()); + } rsp.reset(new devlink_sb_port_pool_get_rsp()); yrs.yarg.data = rsp.get(); @@ -2708,15 +3312,16 @@ devlink_sb_port_pool_get(ynl_cpp::ynl_socket& ys, yrs.rsp_cmd = 21; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_SB_PORT_POOL_GET - dump */ std::unique_ptr -devlink_sb_port_pool_get_dump(ynl_cpp::ynl_socket& ys, +devlink_sb_port_pool_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_port_pool_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; @@ -2727,28 +3332,31 @@ devlink_sb_port_pool_get_dump(ynl_cpp::ynl_socket& ys, yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_sb_port_pool_get_rsp_parse; yds.rsp_cmd = 21; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SB_PORT_POOL_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_SB_PORT_POOL_SET ============== */ /* DEVLINK_CMD_SB_PORT_POOL_SET - do */ -int devlink_sb_port_pool_set(ynl_cpp::ynl_socket& ys, +int devlink_sb_port_pool_set(ynl_cpp::ynl_socket& ys, devlink_sb_port_pool_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -2758,22 +3366,29 @@ int devlink_sb_port_pool_set(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SB_PORT_POOL_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.sb_index.has_value()) + } + if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); - if (req.sb_pool_index.has_value()) + } + if (req.sb_pool_index.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req.sb_pool_index.value()); - if (req.sb_threshold.has_value()) + } + if (req.sb_threshold.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_THRESHOLD, req.sb_threshold.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -2792,28 +3407,34 @@ int devlink_sb_tc_pool_bind_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_SB_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->sb_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_SB_POOL_TYPE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->sb_pool_type = (devlink_sb_pool_type)ynl_attr_get_u8(attr); + } + dst->sb_pool_type = (enum devlink_sb_pool_type)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_SB_TC_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->sb_tc_index = (__u16)ynl_attr_get_u16(attr); } } @@ -2822,7 +3443,7 @@ int devlink_sb_tc_pool_bind_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_sb_tc_pool_bind_get(ynl_cpp::ynl_socket& ys, +devlink_sb_tc_pool_bind_get(ynl_cpp::ynl_socket& ys, devlink_sb_tc_pool_bind_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -2834,18 +3455,24 @@ devlink_sb_tc_pool_bind_get(ynl_cpp::ynl_socket& ys, ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.sb_index.has_value()) + } + if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); - if (req.sb_pool_type.has_value()) + } + if (req.sb_pool_type.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_SB_POOL_TYPE, req.sb_pool_type.value()); - if (req.sb_tc_index.has_value()) + } + if (req.sb_tc_index.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_SB_TC_INDEX, req.sb_tc_index.value()); + } rsp.reset(new devlink_sb_tc_pool_bind_get_rsp()); yrs.yarg.data = rsp.get(); @@ -2853,15 +3480,16 @@ devlink_sb_tc_pool_bind_get(ynl_cpp::ynl_socket& ys, yrs.rsp_cmd = 25; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_SB_TC_POOL_BIND_GET - dump */ std::unique_ptr -devlink_sb_tc_pool_bind_get_dump(ynl_cpp::ynl_socket& ys, +devlink_sb_tc_pool_bind_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_tc_pool_bind_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; @@ -2872,28 +3500,31 @@ devlink_sb_tc_pool_bind_get_dump(ynl_cpp::ynl_socket& ys, yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_sb_tc_pool_bind_get_rsp_parse; yds.rsp_cmd = 25; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SB_TC_POOL_BIND_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_SB_TC_POOL_BIND_SET ============== */ /* DEVLINK_CMD_SB_TC_POOL_BIND_SET - do */ -int devlink_sb_tc_pool_bind_set(ynl_cpp::ynl_socket& ys, +int devlink_sb_tc_pool_bind_set(ynl_cpp::ynl_socket& ys, devlink_sb_tc_pool_bind_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -2903,33 +3534,42 @@ int devlink_sb_tc_pool_bind_set(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SB_TC_POOL_BIND_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.sb_index.has_value()) + } + if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); - if (req.sb_pool_index.has_value()) + } + if (req.sb_pool_index.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_SB_POOL_INDEX, req.sb_pool_index.value()); - if (req.sb_pool_type.has_value()) + } + if (req.sb_pool_type.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_SB_POOL_TYPE, req.sb_pool_type.value()); - if (req.sb_tc_index.has_value()) + } + if (req.sb_tc_index.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_SB_TC_INDEX, req.sb_tc_index.value()); - if (req.sb_threshold.has_value()) + } + if (req.sb_threshold.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_THRESHOLD, req.sb_threshold.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_SB_OCC_SNAPSHOT ============== */ /* DEVLINK_CMD_SB_OCC_SNAPSHOT - do */ -int devlink_sb_occ_snapshot(ynl_cpp::ynl_socket& ys, +int devlink_sb_occ_snapshot(ynl_cpp::ynl_socket& ys, devlink_sb_occ_snapshot_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -2939,23 +3579,27 @@ int devlink_sb_occ_snapshot(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SB_OCC_SNAPSHOT, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.sb_index.has_value()) + } + if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_SB_OCC_MAX_CLEAR ============== */ /* DEVLINK_CMD_SB_OCC_MAX_CLEAR - do */ -int devlink_sb_occ_max_clear(ynl_cpp::ynl_socket& ys, +int devlink_sb_occ_max_clear(ynl_cpp::ynl_socket& ys, devlink_sb_occ_max_clear_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -2965,16 +3609,20 @@ int devlink_sb_occ_max_clear(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SB_OCC_MAX_CLEAR, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.sb_index.has_value()) + } + if (req.sb_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_SB_INDEX, req.sb_index.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -2993,25 +3641,30 @@ int devlink_eswitch_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_ESWITCH_MODE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->eswitch_mode = (devlink_eswitch_mode)ynl_attr_get_u16(attr); + } + dst->eswitch_mode = (enum devlink_eswitch_mode)ynl_attr_get_u16(attr); } else if (type == DEVLINK_ATTR_ESWITCH_INLINE_MODE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->eswitch_inline_mode = (devlink_eswitch_inline_mode)ynl_attr_get_u8(attr); + } + dst->eswitch_inline_mode = (enum devlink_eswitch_inline_mode)ynl_attr_get_u8(attr); } else if (type == DEVLINK_ATTR_ESWITCH_ENCAP_MODE) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->eswitch_encap_mode = (devlink_eswitch_encap_mode)ynl_attr_get_u8(attr); + } + dst->eswitch_encap_mode = (enum devlink_eswitch_encap_mode)ynl_attr_get_u8(attr); } } @@ -3019,7 +3672,7 @@ int devlink_eswitch_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_eswitch_get(ynl_cpp::ynl_socket& ys, devlink_eswitch_get_req& req) +devlink_eswitch_get(ynl_cpp::ynl_socket& ys, devlink_eswitch_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -3030,10 +3683,12 @@ devlink_eswitch_get(ynl_cpp::ynl_socket& ys, devlink_eswitch_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } rsp.reset(new devlink_eswitch_get_rsp()); yrs.yarg.data = rsp.get(); @@ -3041,15 +3696,16 @@ devlink_eswitch_get(ynl_cpp::ynl_socket& ys, devlink_eswitch_get_req& req) yrs.rsp_cmd = DEVLINK_CMD_ESWITCH_GET; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* ============== DEVLINK_CMD_ESWITCH_SET ============== */ /* DEVLINK_CMD_ESWITCH_SET - do */ -int devlink_eswitch_set(ynl_cpp::ynl_socket& ys, devlink_eswitch_set_req& req) +int devlink_eswitch_set(ynl_cpp::ynl_socket& ys, devlink_eswitch_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -3058,20 +3714,26 @@ int devlink_eswitch_set(ynl_cpp::ynl_socket& ys, devlink_eswitch_set_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_ESWITCH_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.eswitch_mode.has_value()) + } + if (req.eswitch_mode.has_value()) { ynl_attr_put_u16(nlh, DEVLINK_ATTR_ESWITCH_MODE, req.eswitch_mode.value()); - if (req.eswitch_inline_mode.has_value()) + } + if (req.eswitch_inline_mode.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_ESWITCH_INLINE_MODE, req.eswitch_inline_mode.value()); - if (req.eswitch_encap_mode.has_value()) + } + if (req.eswitch_encap_mode.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_ESWITCH_ENCAP_MODE, req.eswitch_encap_mode.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -3092,21 +3754,25 @@ int devlink_dpipe_table_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DPIPE_TABLES) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_dpipe_tables_nest; - parg.data = &dst->dpipe_tables; - if (devlink_dl_dpipe_tables_parse(&parg, attr)) + parg.data = &dst->dpipe_tables.emplace(); + if (devlink_dl_dpipe_tables_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } } @@ -3114,7 +3780,7 @@ int devlink_dpipe_table_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_dpipe_table_get(ynl_cpp::ynl_socket& ys, +devlink_dpipe_table_get(ynl_cpp::ynl_socket& ys, devlink_dpipe_table_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -3126,12 +3792,15 @@ devlink_dpipe_table_get(ynl_cpp::ynl_socket& ys, ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.dpipe_table_name.size() > 0) + } + if (req.dpipe_table_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME, req.dpipe_table_name.data()); + } rsp.reset(new devlink_dpipe_table_get_rsp()); yrs.yarg.data = rsp.get(); @@ -3139,8 +3808,9 @@ devlink_dpipe_table_get(ynl_cpp::ynl_socket& ys, yrs.rsp_cmd = DEVLINK_CMD_DPIPE_TABLE_GET; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } @@ -3161,21 +3831,25 @@ int devlink_dpipe_entries_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DPIPE_ENTRIES) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_dpipe_entries_nest; - parg.data = &dst->dpipe_entries; - if (devlink_dl_dpipe_entries_parse(&parg, attr)) + parg.data = &dst->dpipe_entries.emplace(); + if (devlink_dl_dpipe_entries_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } } @@ -3183,7 +3857,7 @@ int devlink_dpipe_entries_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_dpipe_entries_get(ynl_cpp::ynl_socket& ys, +devlink_dpipe_entries_get(ynl_cpp::ynl_socket& ys, devlink_dpipe_entries_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -3195,12 +3869,15 @@ devlink_dpipe_entries_get(ynl_cpp::ynl_socket& ys, ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.dpipe_table_name.size() > 0) + } + if (req.dpipe_table_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME, req.dpipe_table_name.data()); + } rsp.reset(new devlink_dpipe_entries_get_rsp()); yrs.yarg.data = rsp.get(); @@ -3208,8 +3885,9 @@ devlink_dpipe_entries_get(ynl_cpp::ynl_socket& ys, yrs.rsp_cmd = DEVLINK_CMD_DPIPE_ENTRIES_GET; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } @@ -3230,21 +3908,25 @@ int devlink_dpipe_headers_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DPIPE_HEADERS) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_dpipe_headers_nest; - parg.data = &dst->dpipe_headers; - if (devlink_dl_dpipe_headers_parse(&parg, attr)) + parg.data = &dst->dpipe_headers.emplace(); + if (devlink_dl_dpipe_headers_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } } @@ -3252,7 +3934,7 @@ int devlink_dpipe_headers_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_dpipe_headers_get(ynl_cpp::ynl_socket& ys, +devlink_dpipe_headers_get(ynl_cpp::ynl_socket& ys, devlink_dpipe_headers_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -3264,10 +3946,12 @@ devlink_dpipe_headers_get(ynl_cpp::ynl_socket& ys, ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } rsp.reset(new devlink_dpipe_headers_get_rsp()); yrs.yarg.data = rsp.get(); @@ -3275,15 +3959,16 @@ devlink_dpipe_headers_get(ynl_cpp::ynl_socket& ys, yrs.rsp_cmd = DEVLINK_CMD_DPIPE_HEADERS_GET; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* ============== DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET ============== */ /* DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET - do */ -int devlink_dpipe_table_counters_set(ynl_cpp::ynl_socket& ys, +int devlink_dpipe_table_counters_set(ynl_cpp::ynl_socket& ys, devlink_dpipe_table_counters_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -3293,25 +3978,30 @@ int devlink_dpipe_table_counters_set(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.dpipe_table_name.size() > 0) + } + if (req.dpipe_table_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DPIPE_TABLE_NAME, req.dpipe_table_name.data()); - if (req.dpipe_table_counters_enabled.has_value()) + } + if (req.dpipe_table_counters_enabled.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED, req.dpipe_table_counters_enabled.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_RESOURCE_SET ============== */ /* DEVLINK_CMD_RESOURCE_SET - do */ -int devlink_resource_set(ynl_cpp::ynl_socket& ys, +int devlink_resource_set(ynl_cpp::ynl_socket& ys, devlink_resource_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -3321,18 +4011,23 @@ int devlink_resource_set(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_RESOURCE_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.resource_id.has_value()) + } + if (req.resource_id.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_ID, req.resource_id.value()); - if (req.resource_size.has_value()) + } + if (req.resource_size.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_RESOURCE_SIZE, req.resource_size.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -3353,21 +4048,25 @@ int devlink_resource_dump_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_RESOURCE_LIST) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_resource_list_nest; - parg.data = &dst->resource_list; - if (devlink_dl_resource_list_parse(&parg, attr)) + parg.data = &dst->resource_list.emplace(); + if (devlink_dl_resource_list_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } } @@ -3375,7 +4074,7 @@ int devlink_resource_dump_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_resource_dump(ynl_cpp::ynl_socket& ys, devlink_resource_dump_req& req) +devlink_resource_dump(ynl_cpp::ynl_socket& ys, devlink_resource_dump_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -3386,10 +4085,12 @@ devlink_resource_dump(ynl_cpp::ynl_socket& ys, devlink_resource_dump_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } rsp.reset(new devlink_resource_dump_rsp()); yrs.yarg.data = rsp.get(); @@ -3397,8 +4098,9 @@ devlink_resource_dump(ynl_cpp::ynl_socket& ys, devlink_resource_dump_req& req) yrs.rsp_cmd = DEVLINK_CMD_RESOURCE_DUMP; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } @@ -3417,16 +4119,19 @@ int devlink_reload_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } memcpy(&dst->reload_actions_performed, ynl_attr_data(attr), sizeof(struct nla_bitfield32)); } } @@ -3435,7 +4140,7 @@ int devlink_reload_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_reload(ynl_cpp::ynl_socket& ys, devlink_reload_req& req) +devlink_reload(ynl_cpp::ynl_socket& ys, devlink_reload_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -3446,20 +4151,27 @@ devlink_reload(ynl_cpp::ynl_socket& ys, devlink_reload_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.reload_action.has_value()) + } + if (req.reload_action.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_RELOAD_ACTION, req.reload_action.value()); - if (req.reload_limits.has_value()) - ynl_attr_put(nlh, DEVLINK_ATTR_RELOAD_LIMITS, &req->reload_limits, sizeof(struct nla_bitfield32)); - if (req.netns_pid.has_value()) + } + if (req.reload_limits.has_value()) { + ynl_attr_put(nlh, DEVLINK_ATTR_RELOAD_LIMITS, &(*req.reload_limits), sizeof(struct nla_bitfield32)); + } + if (req.netns_pid.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_NETNS_PID, req.netns_pid.value()); - if (req.netns_fd.has_value()) + } + if (req.netns_fd.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_NETNS_FD, req.netns_fd.value()); - if (req.netns_id.has_value()) + } + if (req.netns_id.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_NETNS_ID, req.netns_id.value()); + } rsp.reset(new devlink_reload_rsp()); yrs.yarg.data = rsp.get(); @@ -3467,8 +4179,9 @@ devlink_reload(ynl_cpp::ynl_socket& ys, devlink_reload_req& req) yrs.rsp_cmd = DEVLINK_CMD_RELOAD; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } @@ -3487,17 +4200,20 @@ int devlink_param_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PARAM_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->param_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->param_name.assign(ynl_attr_get_str(attr)); } } @@ -3505,7 +4221,7 @@ int devlink_param_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_param_get(ynl_cpp::ynl_socket& ys, devlink_param_get_req& req) +devlink_param_get(ynl_cpp::ynl_socket& ys, devlink_param_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -3516,12 +4232,15 @@ devlink_param_get(ynl_cpp::ynl_socket& ys, devlink_param_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.param_name.size() > 0) + } + if (req.param_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_PARAM_NAME, req.param_name.data()); + } rsp.reset(new devlink_param_get_rsp()); yrs.yarg.data = rsp.get(); @@ -3529,15 +4248,16 @@ devlink_param_get(ynl_cpp::ynl_socket& ys, devlink_param_get_req& req) yrs.rsp_cmd = DEVLINK_CMD_PARAM_GET; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_PARAM_GET - dump */ std::unique_ptr -devlink_param_get_dump(ynl_cpp::ynl_socket& ys, +devlink_param_get_dump(ynl_cpp::ynl_socket& ys, devlink_param_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; @@ -3548,28 +4268,31 @@ devlink_param_get_dump(ynl_cpp::ynl_socket& ys, yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_param_get_rsp_parse; yds.rsp_cmd = DEVLINK_CMD_PARAM_GET; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_PARAM_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_PARAM_SET ============== */ /* DEVLINK_CMD_PARAM_SET - do */ -int devlink_param_set(ynl_cpp::ynl_socket& ys, devlink_param_set_req& req) +int devlink_param_set(ynl_cpp::ynl_socket& ys, devlink_param_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -3578,20 +4301,26 @@ int devlink_param_set(ynl_cpp::ynl_socket& ys, devlink_param_set_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_PARAM_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.param_name.size() > 0) + } + if (req.param_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_PARAM_NAME, req.param_name.data()); - if (req.param_type.has_value()) + } + if (req.param_type.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_TYPE, req.param_type.value()); - if (req.param_value_cmode.has_value()) + } + if (req.param_value_cmode.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_CMODE, req.param_value_cmode.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -3610,21 +4339,25 @@ int devlink_region_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_REGION_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->region_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->region_name.assign(ynl_attr_get_str(attr)); } } @@ -3632,7 +4365,7 @@ int devlink_region_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_region_get(ynl_cpp::ynl_socket& ys, devlink_region_get_req& req) +devlink_region_get(ynl_cpp::ynl_socket& ys, devlink_region_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -3643,14 +4376,18 @@ devlink_region_get(ynl_cpp::ynl_socket& ys, devlink_region_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.region_name.size() > 0) + } + if (req.region_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_REGION_NAME, req.region_name.data()); + } rsp.reset(new devlink_region_get_rsp()); yrs.yarg.data = rsp.get(); @@ -3658,15 +4395,16 @@ devlink_region_get(ynl_cpp::ynl_socket& ys, devlink_region_get_req& req) yrs.rsp_cmd = DEVLINK_CMD_REGION_GET; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_REGION_GET - dump */ std::unique_ptr -devlink_region_get_dump(ynl_cpp::ynl_socket& ys, +devlink_region_get_dump(ynl_cpp::ynl_socket& ys, devlink_region_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; @@ -3677,21 +4415,24 @@ devlink_region_get_dump(ynl_cpp::ynl_socket& ys, yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_region_get_rsp_parse; yds.rsp_cmd = DEVLINK_CMD_REGION_GET; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_REGION_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } @@ -3710,24 +4451,29 @@ int devlink_region_new_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_REGION_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->region_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->region_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_REGION_SNAPSHOT_ID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->region_snapshot_id = (__u32)ynl_attr_get_u32(attr); } } @@ -3736,7 +4482,7 @@ int devlink_region_new_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_region_new(ynl_cpp::ynl_socket& ys, devlink_region_new_req& req) +devlink_region_new(ynl_cpp::ynl_socket& ys, devlink_region_new_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -3747,16 +4493,21 @@ devlink_region_new(ynl_cpp::ynl_socket& ys, devlink_region_new_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.region_name.size() > 0) + } + if (req.region_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_REGION_NAME, req.region_name.data()); - if (req.region_snapshot_id.has_value()) + } + if (req.region_snapshot_id.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_REGION_SNAPSHOT_ID, req.region_snapshot_id.value()); + } rsp.reset(new devlink_region_new_rsp()); yrs.yarg.data = rsp.get(); @@ -3764,15 +4515,16 @@ devlink_region_new(ynl_cpp::ynl_socket& ys, devlink_region_new_req& req) yrs.rsp_cmd = DEVLINK_CMD_REGION_NEW; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* ============== DEVLINK_CMD_REGION_DEL ============== */ /* DEVLINK_CMD_REGION_DEL - do */ -int devlink_region_del(ynl_cpp::ynl_socket& ys, devlink_region_del_req& req) +int devlink_region_del(ynl_cpp::ynl_socket& ys, devlink_region_del_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -3781,98 +4533,116 @@ int devlink_region_del(ynl_cpp::ynl_socket& ys, devlink_region_del_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_REGION_DEL, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.region_name.size() > 0) + } + if (req.region_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_REGION_NAME, req.region_name.data()); - if (req.region_snapshot_id.has_value()) + } + if (req.region_snapshot_id.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_REGION_SNAPSHOT_ID, req.region_snapshot_id.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_REGION_READ ============== */ /* DEVLINK_CMD_REGION_READ - dump */ -int devlink_region_read_rsp_dump_parse(const struct nlmsghdr *nlh, - struct ynl_parse_arg *yarg) +int devlink_region_read_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) { - devlink_region_read_rsp_dump *dst; + devlink_region_read_rsp *dst; const struct nlattr *attr; - dst = (devlink_region_read_rsp_dump*)yarg->data; + dst = (devlink_region_read_rsp*)yarg->data; ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_REGION_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->region_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->region_name.assign(ynl_attr_get_str(attr)); } } return YNL_PARSE_CB_OK; } -std::unique_ptr -devlink_region_read_dump(ynl_cpp::ynl_socket& ys, - devlink_region_read_req_dump& req) +std::unique_ptr +devlink_region_read_dump(ynl_cpp::ynl_socket& ys, devlink_region_read_req& req) { struct ynl_dump_no_alloc_state yds = {}; struct nlmsghdr *nlh; int err; - auto ret = std::make_unique(); + auto ret = std::make_unique(); yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; - yds.cb = devlink_region_read_rsp_dump_parse; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; + yds.cb = devlink_region_read_rsp_parse; yds.rsp_cmd = DEVLINK_CMD_REGION_READ; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_REGION_READ, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.region_name.size() > 0) + } + if (req.region_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_REGION_NAME, req.region_name.data()); - if (req.region_snapshot_id.has_value()) + } + if (req.region_snapshot_id.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_REGION_SNAPSHOT_ID, req.region_snapshot_id.value()); - if (req.region_direct) + } + if (req.region_direct) { ynl_attr_put(nlh, DEVLINK_ATTR_REGION_DIRECT, NULL, 0); - if (req.region_chunk_addr.has_value()) + } + if (req.region_chunk_addr.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_REGION_CHUNK_ADDR, req.region_chunk_addr.value()); - if (req.region_chunk_len.has_value()) + } + if (req.region_chunk_len.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_REGION_CHUNK_LEN, req.region_chunk_len.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } @@ -3891,16 +4661,19 @@ int devlink_port_param_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } } @@ -3909,7 +4682,7 @@ int devlink_port_param_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_port_param_get(ynl_cpp::ynl_socket& ys, +devlink_port_param_get(ynl_cpp::ynl_socket& ys, devlink_port_param_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -3921,12 +4694,15 @@ devlink_port_param_get(ynl_cpp::ynl_socket& ys, ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); + } rsp.reset(new devlink_port_param_get_rsp()); yrs.yarg.data = rsp.get(); @@ -3934,15 +4710,16 @@ devlink_port_param_get(ynl_cpp::ynl_socket& ys, yrs.rsp_cmd = DEVLINK_CMD_PORT_PARAM_GET; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_PORT_PARAM_GET - dump */ std::unique_ptr -devlink_port_param_get_dump(ynl_cpp::ynl_socket& ys) +devlink_port_param_get_dump(ynl_cpp::ynl_socket& ys) { struct ynl_dump_no_alloc_state yds = {}; struct nlmsghdr *nlh; @@ -3952,22 +4729,23 @@ devlink_port_param_get_dump(ynl_cpp::ynl_socket& ys) yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_port_param_get_rsp_parse; yds.rsp_cmd = DEVLINK_CMD_PORT_PARAM_GET; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_PORT_PARAM_GET, 1); err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_PORT_PARAM_SET ============== */ /* DEVLINK_CMD_PORT_PARAM_SET - do */ -int devlink_port_param_set(ynl_cpp::ynl_socket& ys, +int devlink_port_param_set(ynl_cpp::ynl_socket& ys, devlink_port_param_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -3977,16 +4755,20 @@ int devlink_port_param_set(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_PORT_PARAM_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -4007,38 +4789,50 @@ int devlink_info_get_rsp_parse(const struct nlmsghdr *nlh, dst = (devlink_info_get_rsp*)yarg->data; parg.ys = yarg->ys; - if (dst->info_version_fixed.size() > 0) + if (dst->info_version_fixed.size() > 0) { return ynl_error_parse(yarg, "attribute already present (devlink.info-version-fixed)"); - if (dst->info_version_running.size() > 0) + } + if (dst->info_version_running.size() > 0) { return ynl_error_parse(yarg, "attribute already present (devlink.info-version-running)"); - if (dst->info_version_stored.size() > 0) + } + if (dst->info_version_stored.size() > 0) { return ynl_error_parse(yarg, "attribute already present (devlink.info-version-stored)"); + } ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_INFO_DRIVER_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->info_driver_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->info_driver_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_INFO_SERIAL_NUMBER) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->info_serial_number.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->info_serial_number.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_INFO_VERSION_FIXED) { n_info_version_fixed++; } else if (type == DEVLINK_ATTR_INFO_VERSION_RUNNING) { n_info_version_running++; } else if (type == DEVLINK_ATTR_INFO_VERSION_STORED) { n_info_version_stored++; + } else if (type == DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->info_board_serial_number.assign(ynl_attr_get_str(attr)); } } @@ -4049,8 +4843,9 @@ int devlink_info_get_rsp_parse(const struct nlmsghdr *nlh, ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { if (ynl_attr_type(attr) == DEVLINK_ATTR_INFO_VERSION_FIXED) { parg.data = &dst->info_version_fixed[i]; - if (devlink_dl_info_version_parse(&parg, attr)) + if (devlink_dl_info_version_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -4062,8 +4857,9 @@ int devlink_info_get_rsp_parse(const struct nlmsghdr *nlh, ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { if (ynl_attr_type(attr) == DEVLINK_ATTR_INFO_VERSION_RUNNING) { parg.data = &dst->info_version_running[i]; - if (devlink_dl_info_version_parse(&parg, attr)) + if (devlink_dl_info_version_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -4075,8 +4871,9 @@ int devlink_info_get_rsp_parse(const struct nlmsghdr *nlh, ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { if (ynl_attr_type(attr) == DEVLINK_ATTR_INFO_VERSION_STORED) { parg.data = &dst->info_version_stored[i]; - if (devlink_dl_info_version_parse(&parg, attr)) + if (devlink_dl_info_version_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } i++; } } @@ -4086,7 +4883,7 @@ int devlink_info_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_info_get(ynl_cpp::ynl_socket& ys, devlink_info_get_req& req) +devlink_info_get(ynl_cpp::ynl_socket& ys, devlink_info_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -4097,10 +4894,12 @@ devlink_info_get(ynl_cpp::ynl_socket& ys, devlink_info_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } rsp.reset(new devlink_info_get_rsp()); yrs.yarg.data = rsp.get(); @@ -4108,15 +4907,16 @@ devlink_info_get(ynl_cpp::ynl_socket& ys, devlink_info_get_req& req) yrs.rsp_cmd = DEVLINK_CMD_INFO_GET; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_INFO_GET - dump */ std::unique_ptr -devlink_info_get_dump(ynl_cpp::ynl_socket& ys) +devlink_info_get_dump(ynl_cpp::ynl_socket& ys) { struct ynl_dump_no_alloc_state yds = {}; struct nlmsghdr *nlh; @@ -4126,15 +4926,16 @@ devlink_info_get_dump(ynl_cpp::ynl_socket& ys) yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_info_get_rsp_parse; yds.rsp_cmd = DEVLINK_CMD_INFO_GET; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_INFO_GET, 1); err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } @@ -4153,21 +4954,25 @@ int devlink_health_reporter_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_HEALTH_REPORTER_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->health_reporter_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->health_reporter_name.assign(ynl_attr_get_str(attr)); } } @@ -4175,7 +4980,7 @@ int devlink_health_reporter_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_health_reporter_get(ynl_cpp::ynl_socket& ys, +devlink_health_reporter_get(ynl_cpp::ynl_socket& ys, devlink_health_reporter_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4187,14 +4992,18 @@ devlink_health_reporter_get(ynl_cpp::ynl_socket& ys, ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.health_reporter_name.size() > 0) + } + if (req.health_reporter_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req.health_reporter_name.data()); + } rsp.reset(new devlink_health_reporter_get_rsp()); yrs.yarg.data = rsp.get(); @@ -4202,15 +5011,16 @@ devlink_health_reporter_get(ynl_cpp::ynl_socket& ys, yrs.rsp_cmd = DEVLINK_CMD_HEALTH_REPORTER_GET; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_HEALTH_REPORTER_GET - dump */ std::unique_ptr -devlink_health_reporter_get_dump(ynl_cpp::ynl_socket& ys, +devlink_health_reporter_get_dump(ynl_cpp::ynl_socket& ys, devlink_health_reporter_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; @@ -4221,30 +5031,34 @@ devlink_health_reporter_get_dump(ynl_cpp::ynl_socket& ys, yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_health_reporter_get_rsp_parse; yds.rsp_cmd = DEVLINK_CMD_HEALTH_REPORTER_GET; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_HEALTH_REPORTER_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_HEALTH_REPORTER_SET ============== */ /* DEVLINK_CMD_HEALTH_REPORTER_SET - do */ -int devlink_health_reporter_set(ynl_cpp::ynl_socket& ys, +int devlink_health_reporter_set(ynl_cpp::ynl_socket& ys, devlink_health_reporter_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4254,31 +5068,42 @@ int devlink_health_reporter_set(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_HEALTH_REPORTER_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.health_reporter_name.size() > 0) + } + if (req.health_reporter_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req.health_reporter_name.data()); - if (req.health_reporter_graceful_period.has_value()) + } + if (req.health_reporter_graceful_period.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD, req.health_reporter_graceful_period.value()); - if (req.health_reporter_auto_recover.has_value()) + } + if (req.health_reporter_auto_recover.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER, req.health_reporter_auto_recover.value()); - if (req.health_reporter_auto_dump.has_value()) + } + if (req.health_reporter_auto_dump.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP, req.health_reporter_auto_dump.value()); + } + if (req.health_reporter_burst_period.has_value()) { + ynl_attr_put_u64(nlh, DEVLINK_ATTR_HEALTH_REPORTER_BURST_PERIOD, req.health_reporter_burst_period.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_HEALTH_REPORTER_RECOVER ============== */ /* DEVLINK_CMD_HEALTH_REPORTER_RECOVER - do */ -int devlink_health_reporter_recover(ynl_cpp::ynl_socket& ys, +int devlink_health_reporter_recover(ynl_cpp::ynl_socket& ys, devlink_health_reporter_recover_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4288,25 +5113,30 @@ int devlink_health_reporter_recover(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_HEALTH_REPORTER_RECOVER, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.health_reporter_name.size() > 0) + } + if (req.health_reporter_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req.health_reporter_name.data()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE ============== */ /* DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE - do */ -int devlink_health_reporter_diagnose(ynl_cpp::ynl_socket& ys, +int devlink_health_reporter_diagnose(ynl_cpp::ynl_socket& ys, devlink_health_reporter_diagnose_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4316,89 +5146,101 @@ int devlink_health_reporter_diagnose(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.health_reporter_name.size() > 0) + } + if (req.health_reporter_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req.health_reporter_name.data()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET ============== */ /* DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET - dump */ -int devlink_health_reporter_dump_get_rsp_dump_parse(const struct nlmsghdr *nlh, - struct ynl_parse_arg *yarg) +int devlink_health_reporter_dump_get_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) { - devlink_health_reporter_dump_get_rsp_dump *dst; + devlink_health_reporter_dump_get_rsp *dst; const struct nlattr *attr; struct ynl_parse_arg parg; - dst = (devlink_health_reporter_dump_get_rsp_dump*)yarg->data; + dst = (devlink_health_reporter_dump_get_rsp*)yarg->data; parg.ys = yarg->ys; ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_FMSG) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } parg.rsp_policy = &devlink_dl_fmsg_nest; - parg.data = &dst->fmsg; - if (devlink_dl_fmsg_parse(&parg, attr)) + parg.data = &dst->fmsg.emplace(); + if (devlink_dl_fmsg_parse(&parg, attr)) { return YNL_PARSE_CB_ERROR; + } } } return YNL_PARSE_CB_OK; } -std::unique_ptr -devlink_health_reporter_dump_get_dump(ynl_cpp::ynl_socket& ys, - devlink_health_reporter_dump_get_req_dump& req) +std::unique_ptr +devlink_health_reporter_dump_get_dump(ynl_cpp::ynl_socket& ys, + devlink_health_reporter_dump_get_req& req) { struct ynl_dump_no_alloc_state yds = {}; struct nlmsghdr *nlh; int err; - auto ret = std::make_unique(); + auto ret = std::make_unique(); yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; - yds.cb = devlink_health_reporter_dump_get_rsp_dump_parse; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; + yds.cb = devlink_health_reporter_dump_get_rsp_parse; yds.rsp_cmd = DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.health_reporter_name.size() > 0) + } + if (req.health_reporter_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req.health_reporter_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR ============== */ /* DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR - do */ -int devlink_health_reporter_dump_clear(ynl_cpp::ynl_socket& ys, +int devlink_health_reporter_dump_clear(ynl_cpp::ynl_socket& ys, devlink_health_reporter_dump_clear_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4408,25 +5250,30 @@ int devlink_health_reporter_dump_clear(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.health_reporter_name.size() > 0) + } + if (req.health_reporter_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req.health_reporter_name.data()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_FLASH_UPDATE ============== */ /* DEVLINK_CMD_FLASH_UPDATE - do */ -int devlink_flash_update(ynl_cpp::ynl_socket& ys, +int devlink_flash_update(ynl_cpp::ynl_socket& ys, devlink_flash_update_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4436,20 +5283,26 @@ int devlink_flash_update(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_FLASH_UPDATE, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.flash_update_file_name.size() > 0) + } + if (req.flash_update_file_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME, req.flash_update_file_name.data()); - if (req.flash_update_component.size() > 0) + } + if (req.flash_update_component.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_FLASH_UPDATE_COMPONENT, req.flash_update_component.data()); - if (req.flash_update_overwrite_mask.has_value()) - ynl_attr_put(nlh, DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK, &req->flash_update_overwrite_mask, sizeof(struct nla_bitfield32)); + } + if (req.flash_update_overwrite_mask.has_value()) { + ynl_attr_put(nlh, DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK, &(*req.flash_update_overwrite_mask), sizeof(struct nla_bitfield32)); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -4468,17 +5321,20 @@ int devlink_trap_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_TRAP_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->trap_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->trap_name.assign(ynl_attr_get_str(attr)); } } @@ -4486,7 +5342,7 @@ int devlink_trap_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_trap_get(ynl_cpp::ynl_socket& ys, devlink_trap_get_req& req) +devlink_trap_get(ynl_cpp::ynl_socket& ys, devlink_trap_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -4497,12 +5353,15 @@ devlink_trap_get(ynl_cpp::ynl_socket& ys, devlink_trap_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.trap_name.size() > 0) + } + if (req.trap_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_TRAP_NAME, req.trap_name.data()); + } rsp.reset(new devlink_trap_get_rsp()); yrs.yarg.data = rsp.get(); @@ -4510,15 +5369,16 @@ devlink_trap_get(ynl_cpp::ynl_socket& ys, devlink_trap_get_req& req) yrs.rsp_cmd = 63; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_TRAP_GET - dump */ std::unique_ptr -devlink_trap_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_get_req_dump& req) +devlink_trap_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; struct nlmsghdr *nlh; @@ -4528,28 +5388,31 @@ devlink_trap_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_get_req_dump& req) yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_trap_get_rsp_parse; yds.rsp_cmd = 63; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_TRAP_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_TRAP_SET ============== */ /* DEVLINK_CMD_TRAP_SET - do */ -int devlink_trap_set(ynl_cpp::ynl_socket& ys, devlink_trap_set_req& req) +int devlink_trap_set(ynl_cpp::ynl_socket& ys, devlink_trap_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -4558,18 +5421,23 @@ int devlink_trap_set(ynl_cpp::ynl_socket& ys, devlink_trap_set_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_TRAP_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.trap_name.size() > 0) + } + if (req.trap_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_TRAP_NAME, req.trap_name.data()); - if (req.trap_action.has_value()) + } + if (req.trap_action.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_TRAP_ACTION, req.trap_action.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -4588,17 +5456,20 @@ int devlink_trap_group_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_TRAP_GROUP_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->trap_group_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->trap_group_name.assign(ynl_attr_get_str(attr)); } } @@ -4606,7 +5477,7 @@ int devlink_trap_group_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_trap_group_get(ynl_cpp::ynl_socket& ys, +devlink_trap_group_get(ynl_cpp::ynl_socket& ys, devlink_trap_group_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4618,12 +5489,15 @@ devlink_trap_group_get(ynl_cpp::ynl_socket& ys, ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.trap_group_name.size() > 0) + } + if (req.trap_group_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_TRAP_GROUP_NAME, req.trap_group_name.data()); + } rsp.reset(new devlink_trap_group_get_rsp()); yrs.yarg.data = rsp.get(); @@ -4631,15 +5505,16 @@ devlink_trap_group_get(ynl_cpp::ynl_socket& ys, yrs.rsp_cmd = 67; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_TRAP_GROUP_GET - dump */ std::unique_ptr -devlink_trap_group_get_dump(ynl_cpp::ynl_socket& ys, +devlink_trap_group_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_group_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; @@ -4650,28 +5525,31 @@ devlink_trap_group_get_dump(ynl_cpp::ynl_socket& ys, yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_trap_group_get_rsp_parse; yds.rsp_cmd = 67; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_TRAP_GROUP_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_TRAP_GROUP_SET ============== */ /* DEVLINK_CMD_TRAP_GROUP_SET - do */ -int devlink_trap_group_set(ynl_cpp::ynl_socket& ys, +int devlink_trap_group_set(ynl_cpp::ynl_socket& ys, devlink_trap_group_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4681,20 +5559,26 @@ int devlink_trap_group_set(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_TRAP_GROUP_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.trap_group_name.size() > 0) + } + if (req.trap_group_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_TRAP_GROUP_NAME, req.trap_group_name.data()); - if (req.trap_action.has_value()) + } + if (req.trap_action.has_value()) { ynl_attr_put_u8(nlh, DEVLINK_ATTR_TRAP_ACTION, req.trap_action.value()); - if (req.trap_policer_id.has_value()) + } + if (req.trap_policer_id.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req.trap_policer_id.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -4713,16 +5597,19 @@ int devlink_trap_policer_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_TRAP_POLICER_ID) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->trap_policer_id = (__u32)ynl_attr_get_u32(attr); } } @@ -4731,7 +5618,7 @@ int devlink_trap_policer_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_trap_policer_get(ynl_cpp::ynl_socket& ys, +devlink_trap_policer_get(ynl_cpp::ynl_socket& ys, devlink_trap_policer_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4743,12 +5630,15 @@ devlink_trap_policer_get(ynl_cpp::ynl_socket& ys, ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.trap_policer_id.has_value()) + } + if (req.trap_policer_id.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req.trap_policer_id.value()); + } rsp.reset(new devlink_trap_policer_get_rsp()); yrs.yarg.data = rsp.get(); @@ -4756,15 +5646,16 @@ devlink_trap_policer_get(ynl_cpp::ynl_socket& ys, yrs.rsp_cmd = 71; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_TRAP_POLICER_GET - dump */ std::unique_ptr -devlink_trap_policer_get_dump(ynl_cpp::ynl_socket& ys, +devlink_trap_policer_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_policer_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; @@ -4775,28 +5666,31 @@ devlink_trap_policer_get_dump(ynl_cpp::ynl_socket& ys, yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_trap_policer_get_rsp_parse; yds.rsp_cmd = 71; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_TRAP_POLICER_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_TRAP_POLICER_SET ============== */ /* DEVLINK_CMD_TRAP_POLICER_SET - do */ -int devlink_trap_policer_set(ynl_cpp::ynl_socket& ys, +int devlink_trap_policer_set(ynl_cpp::ynl_socket& ys, devlink_trap_policer_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4806,27 +5700,33 @@ int devlink_trap_policer_set(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_TRAP_POLICER_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.trap_policer_id.has_value()) + } + if (req.trap_policer_id.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_TRAP_POLICER_ID, req.trap_policer_id.value()); - if (req.trap_policer_rate.has_value()) + } + if (req.trap_policer_rate.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_TRAP_POLICER_RATE, req.trap_policer_rate.value()); - if (req.trap_policer_burst.has_value()) + } + if (req.trap_policer_burst.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_TRAP_POLICER_BURST, req.trap_policer_burst.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_HEALTH_REPORTER_TEST ============== */ /* DEVLINK_CMD_HEALTH_REPORTER_TEST - do */ -int devlink_health_reporter_test(ynl_cpp::ynl_socket& ys, +int devlink_health_reporter_test(ynl_cpp::ynl_socket& ys, devlink_health_reporter_test_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -4836,18 +5736,23 @@ int devlink_health_reporter_test(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_HEALTH_REPORTER_TEST, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.health_reporter_name.size() > 0) + } + if (req.health_reporter_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_HEALTH_REPORTER_NAME, req.health_reporter_name.data()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -4866,21 +5771,25 @@ int devlink_rate_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_PORT_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->port_index = (__u32)ynl_attr_get_u32(attr); } else if (type == DEVLINK_ATTR_RATE_NODE_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->rate_node_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->rate_node_name.assign(ynl_attr_get_str(attr)); } } @@ -4888,7 +5797,7 @@ int devlink_rate_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_rate_get(ynl_cpp::ynl_socket& ys, devlink_rate_get_req& req) +devlink_rate_get(ynl_cpp::ynl_socket& ys, devlink_rate_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -4899,14 +5808,18 @@ devlink_rate_get(ynl_cpp::ynl_socket& ys, devlink_rate_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); - if (req.rate_node_name.size() > 0) + } + if (req.rate_node_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req.rate_node_name.data()); + } rsp.reset(new devlink_rate_get_rsp()); yrs.yarg.data = rsp.get(); @@ -4914,15 +5827,16 @@ devlink_rate_get(ynl_cpp::ynl_socket& ys, devlink_rate_get_req& req) yrs.rsp_cmd = 76; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_RATE_GET - dump */ std::unique_ptr -devlink_rate_get_dump(ynl_cpp::ynl_socket& ys, devlink_rate_get_req_dump& req) +devlink_rate_get_dump(ynl_cpp::ynl_socket& ys, devlink_rate_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; struct nlmsghdr *nlh; @@ -4932,28 +5846,31 @@ devlink_rate_get_dump(ynl_cpp::ynl_socket& ys, devlink_rate_get_req_dump& req) yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_rate_get_rsp_parse; yds.rsp_cmd = 76; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_RATE_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_RATE_SET ============== */ /* DEVLINK_CMD_RATE_SET - do */ -int devlink_rate_set(ynl_cpp::ynl_socket& ys, devlink_rate_set_req& req) +int devlink_rate_set(ynl_cpp::ynl_socket& ys, devlink_rate_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -4962,33 +5879,45 @@ int devlink_rate_set(ynl_cpp::ynl_socket& ys, devlink_rate_set_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_RATE_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.rate_node_name.size() > 0) + } + if (req.rate_node_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req.rate_node_name.data()); - if (req.rate_tx_share.has_value()) + } + if (req.rate_tx_share.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_RATE_TX_SHARE, req.rate_tx_share.value()); - if (req.rate_tx_max.has_value()) + } + if (req.rate_tx_max.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_RATE_TX_MAX, req.rate_tx_max.value()); - if (req.rate_tx_priority.has_value()) + } + if (req.rate_tx_priority.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_RATE_TX_PRIORITY, req.rate_tx_priority.value()); - if (req.rate_tx_weight.has_value()) + } + if (req.rate_tx_weight.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_RATE_TX_WEIGHT, req.rate_tx_weight.value()); - if (req.rate_parent_node_name.size() > 0) + } + if (req.rate_parent_node_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_RATE_PARENT_NODE_NAME, req.rate_parent_node_name.data()); + } + for (unsigned int i = 0; i < req.rate_tc_bws.size(); i++) { + devlink_dl_rate_tc_bws_put(nlh, DEVLINK_ATTR_RATE_TC_BWS, req.rate_tc_bws[i]); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_RATE_NEW ============== */ /* DEVLINK_CMD_RATE_NEW - do */ -int devlink_rate_new(ynl_cpp::ynl_socket& ys, devlink_rate_new_req& req) +int devlink_rate_new(ynl_cpp::ynl_socket& ys, devlink_rate_new_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -4997,33 +5926,45 @@ int devlink_rate_new(ynl_cpp::ynl_socket& ys, devlink_rate_new_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_RATE_NEW, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.rate_node_name.size() > 0) + } + if (req.rate_node_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req.rate_node_name.data()); - if (req.rate_tx_share.has_value()) + } + if (req.rate_tx_share.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_RATE_TX_SHARE, req.rate_tx_share.value()); - if (req.rate_tx_max.has_value()) + } + if (req.rate_tx_max.has_value()) { ynl_attr_put_u64(nlh, DEVLINK_ATTR_RATE_TX_MAX, req.rate_tx_max.value()); - if (req.rate_tx_priority.has_value()) + } + if (req.rate_tx_priority.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_RATE_TX_PRIORITY, req.rate_tx_priority.value()); - if (req.rate_tx_weight.has_value()) + } + if (req.rate_tx_weight.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_RATE_TX_WEIGHT, req.rate_tx_weight.value()); - if (req.rate_parent_node_name.size() > 0) + } + if (req.rate_parent_node_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_RATE_PARENT_NODE_NAME, req.rate_parent_node_name.data()); + } + for (unsigned int i = 0; i < req.rate_tc_bws.size(); i++) { + devlink_dl_rate_tc_bws_put(nlh, DEVLINK_ATTR_RATE_TC_BWS, req.rate_tc_bws[i]); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_RATE_DEL ============== */ /* DEVLINK_CMD_RATE_DEL - do */ -int devlink_rate_del(ynl_cpp::ynl_socket& ys, devlink_rate_del_req& req) +int devlink_rate_del(ynl_cpp::ynl_socket& ys, devlink_rate_del_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; struct nlmsghdr *nlh; @@ -5032,16 +5973,20 @@ int devlink_rate_del(ynl_cpp::ynl_socket& ys, devlink_rate_del_req& req) nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_RATE_DEL, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.rate_node_name.size() > 0) + } + if (req.rate_node_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_RATE_NODE_NAME, req.rate_node_name.data()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -5060,16 +6005,19 @@ int devlink_linecard_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_LINECARD_INDEX) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; + } dst->linecard_index = (__u32)ynl_attr_get_u32(attr); } } @@ -5078,7 +6026,7 @@ int devlink_linecard_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_linecard_get(ynl_cpp::ynl_socket& ys, devlink_linecard_get_req& req) +devlink_linecard_get(ynl_cpp::ynl_socket& ys, devlink_linecard_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -5089,12 +6037,15 @@ devlink_linecard_get(ynl_cpp::ynl_socket& ys, devlink_linecard_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.linecard_index.has_value()) + } + if (req.linecard_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_LINECARD_INDEX, req.linecard_index.value()); + } rsp.reset(new devlink_linecard_get_rsp()); yrs.yarg.data = rsp.get(); @@ -5102,15 +6053,16 @@ devlink_linecard_get(ynl_cpp::ynl_socket& ys, devlink_linecard_get_req& req) yrs.rsp_cmd = 80; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_LINECARD_GET - dump */ std::unique_ptr -devlink_linecard_get_dump(ynl_cpp::ynl_socket& ys, +devlink_linecard_get_dump(ynl_cpp::ynl_socket& ys, devlink_linecard_get_req_dump& req) { struct ynl_dump_no_alloc_state yds = {}; @@ -5121,28 +6073,31 @@ devlink_linecard_get_dump(ynl_cpp::ynl_socket& ys, yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_linecard_get_rsp_parse; yds.rsp_cmd = 80; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_LINECARD_GET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_LINECARD_SET ============== */ /* DEVLINK_CMD_LINECARD_SET - do */ -int devlink_linecard_set(ynl_cpp::ynl_socket& ys, +int devlink_linecard_set(ynl_cpp::ynl_socket& ys, devlink_linecard_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -5152,18 +6107,23 @@ int devlink_linecard_set(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_LINECARD_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.linecard_index.has_value()) + } + if (req.linecard_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_LINECARD_INDEX, req.linecard_index.value()); - if (req.linecard_type.size() > 0) + } + if (req.linecard_type.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_LINECARD_TYPE, req.linecard_type.data()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } @@ -5182,13 +6142,15 @@ int devlink_selftests_get_rsp_parse(const struct nlmsghdr *nlh, unsigned int type = ynl_attr_type(attr); if (type == DEVLINK_ATTR_BUS_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->bus_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->bus_name.assign(ynl_attr_get_str(attr)); } else if (type == DEVLINK_ATTR_DEV_NAME) { - if (ynl_attr_validate(yarg, attr)) + if (ynl_attr_validate(yarg, attr)) { return YNL_PARSE_CB_ERROR; - dst->dev_name.assign(ynl_attr_get_str(attr), ynl_attr_data_len(attr)); + } + dst->dev_name.assign(ynl_attr_get_str(attr)); } } @@ -5196,7 +6158,7 @@ int devlink_selftests_get_rsp_parse(const struct nlmsghdr *nlh, } std::unique_ptr -devlink_selftests_get(ynl_cpp::ynl_socket& ys, devlink_selftests_get_req& req) +devlink_selftests_get(ynl_cpp::ynl_socket& ys, devlink_selftests_get_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; std::unique_ptr rsp; @@ -5207,10 +6169,12 @@ devlink_selftests_get(ynl_cpp::ynl_socket& ys, devlink_selftests_get_req& req) ((struct ynl_sock*)ys)->req_policy = &devlink_nest; yrs.yarg.rsp_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); + } rsp.reset(new devlink_selftests_get_rsp()); yrs.yarg.data = rsp.get(); @@ -5218,15 +6182,16 @@ devlink_selftests_get(ynl_cpp::ynl_socket& ys, devlink_selftests_get_req& req) yrs.rsp_cmd = DEVLINK_CMD_SELFTESTS_GET; err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return nullptr; + } return rsp; } /* DEVLINK_CMD_SELFTESTS_GET - dump */ std::unique_ptr -devlink_selftests_get_dump(ynl_cpp::ynl_socket& ys) +devlink_selftests_get_dump(ynl_cpp::ynl_socket& ys) { struct ynl_dump_no_alloc_state yds = {}; struct nlmsghdr *nlh; @@ -5236,22 +6201,23 @@ devlink_selftests_get_dump(ynl_cpp::ynl_socket& ys) yds.yarg.ys = ys; yds.yarg.rsp_policy = &devlink_nest; yds.yarg.data = ret.get(); - yds.alloc_cb = [](void* arg)->void*{return &(static_cast(arg)->objs.emplace_back());}; + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; yds.cb = devlink_selftests_get_rsp_parse; yds.rsp_cmd = DEVLINK_CMD_SELFTESTS_GET; nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SELFTESTS_GET, 1); err = ynl_exec_dump_no_alloc(ys, nlh, &yds); - if (err < 0) + if (err < 0) { return nullptr; + } return ret; } /* ============== DEVLINK_CMD_SELFTESTS_RUN ============== */ /* DEVLINK_CMD_SELFTESTS_RUN - do */ -int devlink_selftests_run(ynl_cpp::ynl_socket& ys, +int devlink_selftests_run(ynl_cpp::ynl_socket& ys, devlink_selftests_run_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -5261,23 +6227,27 @@ int devlink_selftests_run(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_SELFTESTS_RUN, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.selftests.has_value()) + } + if (req.selftests.has_value()) { devlink_dl_selftest_id_put(nlh, DEVLINK_ATTR_SELFTESTS, req.selftests.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } /* ============== DEVLINK_CMD_NOTIFY_FILTER_SET ============== */ /* DEVLINK_CMD_NOTIFY_FILTER_SET - do */ -int devlink_notify_filter_set(ynl_cpp::ynl_socket& ys, +int devlink_notify_filter_set(ynl_cpp::ynl_socket& ys, devlink_notify_filter_set_req& req) { struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; @@ -5287,16 +6257,20 @@ int devlink_notify_filter_set(ynl_cpp::ynl_socket& ys, nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, DEVLINK_CMD_NOTIFY_FILTER_SET, 1); ((struct ynl_sock*)ys)->req_policy = &devlink_nest; - if (req.bus_name.size() > 0) + if (req.bus_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_BUS_NAME, req.bus_name.data()); - if (req.dev_name.size() > 0) + } + if (req.dev_name.size() > 0) { ynl_attr_put_str(nlh, DEVLINK_ATTR_DEV_NAME, req.dev_name.data()); - if (req.port_index.has_value()) + } + if (req.port_index.has_value()) { ynl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_INDEX, req.port_index.value()); + } err = ynl_exec(ys, nlh, &yrs); - if (err < 0) + if (err < 0) { return -1; + } return 0; } diff --git a/generated/devlink-user.hpp b/generated/devlink-user.hpp index 6fb42eb..51b275e 100644 --- a/generated/devlink-user.hpp +++ b/generated/devlink-user.hpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "ynl.hpp" @@ -53,11 +54,12 @@ std::string_view devlink_param_cmode_str(devlink_param_cmode value); std::string_view devlink_flash_overwrite_str(devlink_flash_overwrite value); std::string_view devlink_trap_action_str(devlink_trap_action value); std::string_view devlink_trap_type_str(devlink_trap_type value); +std::string_view devlink_var_attr_type_str(devlink_var_attr_type value); /* Common nested types */ struct devlink_dl_dpipe_match { - std::optional dpipe_match_type; - std::optional dpipe_header_id; + std::optional dpipe_match_type; + std::optional dpipe_header_id; std::optional<__u8> dpipe_header_global; std::optional<__u32> dpipe_header_index; std::optional<__u32> dpipe_field_id; @@ -71,8 +73,8 @@ struct devlink_dl_dpipe_match_value { }; struct devlink_dl_dpipe_action { - std::optional dpipe_action_type; - std::optional dpipe_header_id; + std::optional dpipe_action_type; + std::optional dpipe_header_id; std::optional<__u8> dpipe_header_global; std::optional<__u32> dpipe_header_index; std::optional<__u32> dpipe_field_id; @@ -89,7 +91,7 @@ struct devlink_dl_dpipe_field { std::string dpipe_field_name; std::optional<__u32> dpipe_field_id; std::optional<__u32> dpipe_field_bitwidth; - std::optional dpipe_field_mapping_type; + std::optional dpipe_field_mapping_type; }; struct devlink_dl_resource { @@ -101,14 +103,14 @@ struct devlink_dl_resource { std::optional<__u64> resource_size_min; std::optional<__u64> resource_size_max; std::optional<__u64> resource_size_gran; - std::optional resource_unit; + std::optional resource_unit; std::optional<__u64> resource_occ; }; struct devlink_dl_param { std::string param_name; bool param_generic{}; - std::optional<__u8> param_type; + std::optional param_type; }; struct devlink_dl_region_snapshot { @@ -143,6 +145,7 @@ struct devlink_dl_health_reporter { std::optional<__u64> health_reporter_dump_ts; std::optional<__u64> health_reporter_dump_ts_ns; std::optional<__u8> health_reporter_auto_dump; + std::optional<__u64> health_reporter_burst_period; }; struct devlink_dl_attr_stats { @@ -158,8 +161,8 @@ struct devlink_dl_trap_metadata { struct devlink_dl_port_function { std::vector<__u8> hw_addr; - std::optional state; - std::optional opstate; + std::optional state; + std::optional opstate; std::optional caps; }; @@ -180,6 +183,11 @@ struct devlink_dl_selftest_id { bool flash{}; }; +struct devlink_dl_rate_tc_bws { + std::optional<__u8> index; + std::optional<__u32> bw; +}; + struct devlink_dl_dpipe_table_matches { std::vector dpipe_match; }; @@ -213,7 +221,7 @@ struct devlink_dl_region_chunks { }; struct devlink_dl_reload_act_info { - std::optional reload_action; + std::optional reload_action; std::vector reload_action_stats; }; @@ -236,7 +244,7 @@ struct devlink_dl_dpipe_entry { struct devlink_dl_dpipe_header { std::string dpipe_header_name; - std::optional dpipe_header_id; + std::optional dpipe_header_id; std::optional<__u8> dpipe_header_global; std::optional dpipe_header_fields; }; @@ -280,14 +288,14 @@ struct devlink_get_rsp { * Get devlink instances. */ std::unique_ptr -devlink_get(ynl_cpp::ynl_socket& ys, devlink_get_req& req); +devlink_get(ynl_cpp::ynl_socket& ys, devlink_get_req& req); /* DEVLINK_CMD_GET - dump */ struct devlink_get_list { std::list objs; }; -std::unique_ptr devlink_get_dump(ynl_cpp::ynl_socket& ys); +std::unique_ptr devlink_get_dump(ynl_cpp::ynl_socket& ys); /* ============== DEVLINK_CMD_PORT_GET ============== */ /* DEVLINK_CMD_PORT_GET - do */ @@ -307,7 +315,7 @@ struct devlink_port_get_rsp { * Get devlink port instances. */ std::unique_ptr -devlink_port_get(ynl_cpp::ynl_socket& ys, devlink_port_get_req& req); +devlink_port_get(ynl_cpp::ynl_socket& ys, devlink_port_get_req& req); /* DEVLINK_CMD_PORT_GET - dump */ struct devlink_port_get_req_dump { @@ -326,7 +334,7 @@ struct devlink_port_get_rsp_list { }; std::unique_ptr -devlink_port_get_dump(ynl_cpp::ynl_socket& ys, devlink_port_get_req_dump& req); +devlink_port_get_dump(ynl_cpp::ynl_socket& ys, devlink_port_get_req_dump& req); /* ============== DEVLINK_CMD_PORT_SET ============== */ /* DEVLINK_CMD_PORT_SET - do */ @@ -334,14 +342,14 @@ struct devlink_port_set_req { std::string bus_name; std::string dev_name; std::optional<__u32> port_index; - std::optional port_type; + std::optional port_type; std::optional port_function; }; /* * Set devlink port instances. */ -int devlink_port_set(ynl_cpp::ynl_socket& ys, devlink_port_set_req& req); +int devlink_port_set(ynl_cpp::ynl_socket& ys, devlink_port_set_req& req); /* ============== DEVLINK_CMD_PORT_NEW ============== */ /* DEVLINK_CMD_PORT_NEW - do */ @@ -349,7 +357,7 @@ struct devlink_port_new_req { std::string bus_name; std::string dev_name; std::optional<__u32> port_index; - std::optional port_flavour; + std::optional port_flavour; std::optional<__u16> port_pci_pf_number; std::optional<__u32> port_pci_sf_number; std::optional<__u32> port_controller_number; @@ -365,7 +373,7 @@ struct devlink_port_new_rsp { * Create devlink port instances. */ std::unique_ptr -devlink_port_new(ynl_cpp::ynl_socket& ys, devlink_port_new_req& req); +devlink_port_new(ynl_cpp::ynl_socket& ys, devlink_port_new_req& req); /* ============== DEVLINK_CMD_PORT_DEL ============== */ /* DEVLINK_CMD_PORT_DEL - do */ @@ -378,7 +386,7 @@ struct devlink_port_del_req { /* * Delete devlink port instances. */ -int devlink_port_del(ynl_cpp::ynl_socket& ys, devlink_port_del_req& req); +int devlink_port_del(ynl_cpp::ynl_socket& ys, devlink_port_del_req& req); /* ============== DEVLINK_CMD_PORT_SPLIT ============== */ /* DEVLINK_CMD_PORT_SPLIT - do */ @@ -392,7 +400,7 @@ struct devlink_port_split_req { /* * Split devlink port instances. */ -int devlink_port_split(ynl_cpp::ynl_socket& ys, devlink_port_split_req& req); +int devlink_port_split(ynl_cpp::ynl_socket& ys, devlink_port_split_req& req); /* ============== DEVLINK_CMD_PORT_UNSPLIT ============== */ /* DEVLINK_CMD_PORT_UNSPLIT - do */ @@ -405,7 +413,7 @@ struct devlink_port_unsplit_req { /* * Unplit devlink port instances. */ -int devlink_port_unsplit(ynl_cpp::ynl_socket& ys, +int devlink_port_unsplit(ynl_cpp::ynl_socket& ys, devlink_port_unsplit_req& req); /* ============== DEVLINK_CMD_SB_GET ============== */ @@ -426,7 +434,7 @@ struct devlink_sb_get_rsp { * Get shared buffer instances. */ std::unique_ptr -devlink_sb_get(ynl_cpp::ynl_socket& ys, devlink_sb_get_req& req); +devlink_sb_get(ynl_cpp::ynl_socket& ys, devlink_sb_get_req& req); /* DEVLINK_CMD_SB_GET - dump */ struct devlink_sb_get_req_dump { @@ -439,7 +447,7 @@ struct devlink_sb_get_list { }; std::unique_ptr -devlink_sb_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_get_req_dump& req); +devlink_sb_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_get_req_dump& req); /* ============== DEVLINK_CMD_SB_POOL_GET ============== */ /* DEVLINK_CMD_SB_POOL_GET - do */ @@ -461,7 +469,7 @@ struct devlink_sb_pool_get_rsp { * Get shared buffer pool instances. */ std::unique_ptr -devlink_sb_pool_get(ynl_cpp::ynl_socket& ys, devlink_sb_pool_get_req& req); +devlink_sb_pool_get(ynl_cpp::ynl_socket& ys, devlink_sb_pool_get_req& req); /* DEVLINK_CMD_SB_POOL_GET - dump */ struct devlink_sb_pool_get_req_dump { @@ -474,7 +482,7 @@ struct devlink_sb_pool_get_list { }; std::unique_ptr -devlink_sb_pool_get_dump(ynl_cpp::ynl_socket& ys, +devlink_sb_pool_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_pool_get_req_dump& req); /* ============== DEVLINK_CMD_SB_POOL_SET ============== */ @@ -484,14 +492,14 @@ struct devlink_sb_pool_set_req { std::string dev_name; std::optional<__u32> sb_index; std::optional<__u16> sb_pool_index; - std::optional sb_pool_threshold_type; + std::optional sb_pool_threshold_type; std::optional<__u32> sb_pool_size; }; /* * Set shared buffer pool instances. */ -int devlink_sb_pool_set(ynl_cpp::ynl_socket& ys, devlink_sb_pool_set_req& req); +int devlink_sb_pool_set(ynl_cpp::ynl_socket& ys, devlink_sb_pool_set_req& req); /* ============== DEVLINK_CMD_SB_PORT_POOL_GET ============== */ /* DEVLINK_CMD_SB_PORT_POOL_GET - do */ @@ -515,7 +523,7 @@ struct devlink_sb_port_pool_get_rsp { * Get shared buffer port-pool combinations and threshold. */ std::unique_ptr -devlink_sb_port_pool_get(ynl_cpp::ynl_socket& ys, +devlink_sb_port_pool_get(ynl_cpp::ynl_socket& ys, devlink_sb_port_pool_get_req& req); /* DEVLINK_CMD_SB_PORT_POOL_GET - dump */ @@ -529,7 +537,7 @@ struct devlink_sb_port_pool_get_list { }; std::unique_ptr -devlink_sb_port_pool_get_dump(ynl_cpp::ynl_socket& ys, +devlink_sb_port_pool_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_port_pool_get_req_dump& req); /* ============== DEVLINK_CMD_SB_PORT_POOL_SET ============== */ @@ -546,7 +554,7 @@ struct devlink_sb_port_pool_set_req { /* * Set shared buffer port-pool combinations and threshold. */ -int devlink_sb_port_pool_set(ynl_cpp::ynl_socket& ys, +int devlink_sb_port_pool_set(ynl_cpp::ynl_socket& ys, devlink_sb_port_pool_set_req& req); /* ============== DEVLINK_CMD_SB_TC_POOL_BIND_GET ============== */ @@ -556,7 +564,7 @@ struct devlink_sb_tc_pool_bind_get_req { std::string dev_name; std::optional<__u32> port_index; std::optional<__u32> sb_index; - std::optional sb_pool_type; + std::optional sb_pool_type; std::optional<__u16> sb_tc_index; }; @@ -565,7 +573,7 @@ struct devlink_sb_tc_pool_bind_get_rsp { std::string dev_name; std::optional<__u32> port_index; std::optional<__u32> sb_index; - std::optional sb_pool_type; + std::optional sb_pool_type; std::optional<__u16> sb_tc_index; }; @@ -573,7 +581,7 @@ struct devlink_sb_tc_pool_bind_get_rsp { * Get shared buffer port-TC to pool bindings and threshold. */ std::unique_ptr -devlink_sb_tc_pool_bind_get(ynl_cpp::ynl_socket& ys, +devlink_sb_tc_pool_bind_get(ynl_cpp::ynl_socket& ys, devlink_sb_tc_pool_bind_get_req& req); /* DEVLINK_CMD_SB_TC_POOL_BIND_GET - dump */ @@ -587,7 +595,7 @@ struct devlink_sb_tc_pool_bind_get_list { }; std::unique_ptr -devlink_sb_tc_pool_bind_get_dump(ynl_cpp::ynl_socket& ys, +devlink_sb_tc_pool_bind_get_dump(ynl_cpp::ynl_socket& ys, devlink_sb_tc_pool_bind_get_req_dump& req); /* ============== DEVLINK_CMD_SB_TC_POOL_BIND_SET ============== */ @@ -598,7 +606,7 @@ struct devlink_sb_tc_pool_bind_set_req { std::optional<__u32> port_index; std::optional<__u32> sb_index; std::optional<__u16> sb_pool_index; - std::optional sb_pool_type; + std::optional sb_pool_type; std::optional<__u16> sb_tc_index; std::optional<__u32> sb_threshold; }; @@ -606,7 +614,7 @@ struct devlink_sb_tc_pool_bind_set_req { /* * Set shared buffer port-TC to pool bindings and threshold. */ -int devlink_sb_tc_pool_bind_set(ynl_cpp::ynl_socket& ys, +int devlink_sb_tc_pool_bind_set(ynl_cpp::ynl_socket& ys, devlink_sb_tc_pool_bind_set_req& req); /* ============== DEVLINK_CMD_SB_OCC_SNAPSHOT ============== */ @@ -620,7 +628,7 @@ struct devlink_sb_occ_snapshot_req { /* * Take occupancy snapshot of shared buffer. */ -int devlink_sb_occ_snapshot(ynl_cpp::ynl_socket& ys, +int devlink_sb_occ_snapshot(ynl_cpp::ynl_socket& ys, devlink_sb_occ_snapshot_req& req); /* ============== DEVLINK_CMD_SB_OCC_MAX_CLEAR ============== */ @@ -634,7 +642,7 @@ struct devlink_sb_occ_max_clear_req { /* * Clear occupancy watermarks of shared buffer. */ -int devlink_sb_occ_max_clear(ynl_cpp::ynl_socket& ys, +int devlink_sb_occ_max_clear(ynl_cpp::ynl_socket& ys, devlink_sb_occ_max_clear_req& req); /* ============== DEVLINK_CMD_ESWITCH_GET ============== */ @@ -647,31 +655,31 @@ struct devlink_eswitch_get_req { struct devlink_eswitch_get_rsp { std::string bus_name; std::string dev_name; - std::optional eswitch_mode; - std::optional eswitch_inline_mode; - std::optional eswitch_encap_mode; + std::optional eswitch_mode; + std::optional eswitch_inline_mode; + std::optional eswitch_encap_mode; }; /* * Get eswitch attributes. */ std::unique_ptr -devlink_eswitch_get(ynl_cpp::ynl_socket& ys, devlink_eswitch_get_req& req); +devlink_eswitch_get(ynl_cpp::ynl_socket& ys, devlink_eswitch_get_req& req); /* ============== DEVLINK_CMD_ESWITCH_SET ============== */ /* DEVLINK_CMD_ESWITCH_SET - do */ struct devlink_eswitch_set_req { std::string bus_name; std::string dev_name; - std::optional eswitch_mode; - std::optional eswitch_inline_mode; - std::optional eswitch_encap_mode; + std::optional eswitch_mode; + std::optional eswitch_inline_mode; + std::optional eswitch_encap_mode; }; /* * Set eswitch attributes. */ -int devlink_eswitch_set(ynl_cpp::ynl_socket& ys, devlink_eswitch_set_req& req); +int devlink_eswitch_set(ynl_cpp::ynl_socket& ys, devlink_eswitch_set_req& req); /* ============== DEVLINK_CMD_DPIPE_TABLE_GET ============== */ /* DEVLINK_CMD_DPIPE_TABLE_GET - do */ @@ -691,7 +699,7 @@ struct devlink_dpipe_table_get_rsp { * Get dpipe table attributes. */ std::unique_ptr -devlink_dpipe_table_get(ynl_cpp::ynl_socket& ys, +devlink_dpipe_table_get(ynl_cpp::ynl_socket& ys, devlink_dpipe_table_get_req& req); /* ============== DEVLINK_CMD_DPIPE_ENTRIES_GET ============== */ @@ -712,7 +720,7 @@ struct devlink_dpipe_entries_get_rsp { * Get dpipe entries attributes. */ std::unique_ptr -devlink_dpipe_entries_get(ynl_cpp::ynl_socket& ys, +devlink_dpipe_entries_get(ynl_cpp::ynl_socket& ys, devlink_dpipe_entries_get_req& req); /* ============== DEVLINK_CMD_DPIPE_HEADERS_GET ============== */ @@ -732,7 +740,7 @@ struct devlink_dpipe_headers_get_rsp { * Get dpipe headers attributes. */ std::unique_ptr -devlink_dpipe_headers_get(ynl_cpp::ynl_socket& ys, +devlink_dpipe_headers_get(ynl_cpp::ynl_socket& ys, devlink_dpipe_headers_get_req& req); /* ============== DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET ============== */ @@ -747,7 +755,7 @@ struct devlink_dpipe_table_counters_set_req { /* * Set dpipe counter attributes. */ -int devlink_dpipe_table_counters_set(ynl_cpp::ynl_socket& ys, +int devlink_dpipe_table_counters_set(ynl_cpp::ynl_socket& ys, devlink_dpipe_table_counters_set_req& req); /* ============== DEVLINK_CMD_RESOURCE_SET ============== */ @@ -762,7 +770,7 @@ struct devlink_resource_set_req { /* * Set resource attributes. */ -int devlink_resource_set(ynl_cpp::ynl_socket& ys, +int devlink_resource_set(ynl_cpp::ynl_socket& ys, devlink_resource_set_req& req); /* ============== DEVLINK_CMD_RESOURCE_DUMP ============== */ @@ -782,14 +790,14 @@ struct devlink_resource_dump_rsp { * Get resource attributes. */ std::unique_ptr -devlink_resource_dump(ynl_cpp::ynl_socket& ys, devlink_resource_dump_req& req); +devlink_resource_dump(ynl_cpp::ynl_socket& ys, devlink_resource_dump_req& req); /* ============== DEVLINK_CMD_RELOAD ============== */ /* DEVLINK_CMD_RELOAD - do */ struct devlink_reload_req { std::string bus_name; std::string dev_name; - std::optional reload_action; + std::optional reload_action; std::optional reload_limits; std::optional<__u32> netns_pid; std::optional<__u32> netns_fd; @@ -806,7 +814,7 @@ struct devlink_reload_rsp { * Reload devlink. */ std::unique_ptr -devlink_reload(ynl_cpp::ynl_socket& ys, devlink_reload_req& req); +devlink_reload(ynl_cpp::ynl_socket& ys, devlink_reload_req& req); /* ============== DEVLINK_CMD_PARAM_GET ============== */ /* DEVLINK_CMD_PARAM_GET - do */ @@ -826,7 +834,7 @@ struct devlink_param_get_rsp { * Get param instances. */ std::unique_ptr -devlink_param_get(ynl_cpp::ynl_socket& ys, devlink_param_get_req& req); +devlink_param_get(ynl_cpp::ynl_socket& ys, devlink_param_get_req& req); /* DEVLINK_CMD_PARAM_GET - dump */ struct devlink_param_get_req_dump { @@ -839,7 +847,7 @@ struct devlink_param_get_list { }; std::unique_ptr -devlink_param_get_dump(ynl_cpp::ynl_socket& ys, +devlink_param_get_dump(ynl_cpp::ynl_socket& ys, devlink_param_get_req_dump& req); /* ============== DEVLINK_CMD_PARAM_SET ============== */ @@ -848,14 +856,14 @@ struct devlink_param_set_req { std::string bus_name; std::string dev_name; std::string param_name; - std::optional<__u8> param_type; - std::optional param_value_cmode; + std::optional param_type; + std::optional param_value_cmode; }; /* * Set param instances. */ -int devlink_param_set(ynl_cpp::ynl_socket& ys, devlink_param_set_req& req); +int devlink_param_set(ynl_cpp::ynl_socket& ys, devlink_param_set_req& req); /* ============== DEVLINK_CMD_REGION_GET ============== */ /* DEVLINK_CMD_REGION_GET - do */ @@ -877,7 +885,7 @@ struct devlink_region_get_rsp { * Get region instances. */ std::unique_ptr -devlink_region_get(ynl_cpp::ynl_socket& ys, devlink_region_get_req& req); +devlink_region_get(ynl_cpp::ynl_socket& ys, devlink_region_get_req& req); /* DEVLINK_CMD_REGION_GET - dump */ struct devlink_region_get_req_dump { @@ -890,7 +898,7 @@ struct devlink_region_get_list { }; std::unique_ptr -devlink_region_get_dump(ynl_cpp::ynl_socket& ys, +devlink_region_get_dump(ynl_cpp::ynl_socket& ys, devlink_region_get_req_dump& req); /* ============== DEVLINK_CMD_REGION_NEW ============== */ @@ -915,7 +923,7 @@ struct devlink_region_new_rsp { * Create region snapshot. */ std::unique_ptr -devlink_region_new(ynl_cpp::ynl_socket& ys, devlink_region_new_req& req); +devlink_region_new(ynl_cpp::ynl_socket& ys, devlink_region_new_req& req); /* ============== DEVLINK_CMD_REGION_DEL ============== */ /* DEVLINK_CMD_REGION_DEL - do */ @@ -930,11 +938,11 @@ struct devlink_region_del_req { /* * Delete region snapshot. */ -int devlink_region_del(ynl_cpp::ynl_socket& ys, devlink_region_del_req& req); +int devlink_region_del(ynl_cpp::ynl_socket& ys, devlink_region_del_req& req); /* ============== DEVLINK_CMD_REGION_READ ============== */ /* DEVLINK_CMD_REGION_READ - dump */ -struct devlink_region_read_req_dump { +struct devlink_region_read_req { std::string bus_name; std::string dev_name; std::optional<__u32> port_index; @@ -945,20 +953,19 @@ struct devlink_region_read_req_dump { std::optional<__u64> region_chunk_len; }; -struct devlink_region_read_rsp_dump { +struct devlink_region_read_rsp { std::string bus_name; std::string dev_name; std::optional<__u32> port_index; std::string region_name; }; -struct devlink_region_read_rsp_list { - std::list objs; +struct devlink_region_read_list { + std::list objs; }; -std::unique_ptr -devlink_region_read_dump(ynl_cpp::ynl_socket& ys, - devlink_region_read_req_dump& req); +std::unique_ptr +devlink_region_read_dump(ynl_cpp::ynl_socket& ys, devlink_region_read_req& req); /* ============== DEVLINK_CMD_PORT_PARAM_GET ============== */ /* DEVLINK_CMD_PORT_PARAM_GET - do */ @@ -978,7 +985,7 @@ struct devlink_port_param_get_rsp { * Get port param instances. */ std::unique_ptr -devlink_port_param_get(ynl_cpp::ynl_socket& ys, +devlink_port_param_get(ynl_cpp::ynl_socket& ys, devlink_port_param_get_req& req); /* DEVLINK_CMD_PORT_PARAM_GET - dump */ @@ -987,7 +994,7 @@ struct devlink_port_param_get_list { }; std::unique_ptr -devlink_port_param_get_dump(ynl_cpp::ynl_socket& ys); +devlink_port_param_get_dump(ynl_cpp::ynl_socket& ys); /* ============== DEVLINK_CMD_PORT_PARAM_SET ============== */ /* DEVLINK_CMD_PORT_PARAM_SET - do */ @@ -1000,7 +1007,7 @@ struct devlink_port_param_set_req { /* * Set port param instances. */ -int devlink_port_param_set(ynl_cpp::ynl_socket& ys, +int devlink_port_param_set(ynl_cpp::ynl_socket& ys, devlink_port_param_set_req& req); /* ============== DEVLINK_CMD_INFO_GET ============== */ @@ -1018,13 +1025,16 @@ struct devlink_info_get_rsp { std::vector info_version_fixed; std::vector info_version_running; std::vector info_version_stored; + std::string info_board_serial_number; }; /* - * Get device information, like driver name, hardware and firmware versions etc. + * Get device information, like driver name, hardware and firmware versions +etc. + */ std::unique_ptr -devlink_info_get(ynl_cpp::ynl_socket& ys, devlink_info_get_req& req); +devlink_info_get(ynl_cpp::ynl_socket& ys, devlink_info_get_req& req); /* DEVLINK_CMD_INFO_GET - dump */ struct devlink_info_get_list { @@ -1032,7 +1042,7 @@ struct devlink_info_get_list { }; std::unique_ptr -devlink_info_get_dump(ynl_cpp::ynl_socket& ys); +devlink_info_get_dump(ynl_cpp::ynl_socket& ys); /* ============== DEVLINK_CMD_HEALTH_REPORTER_GET ============== */ /* DEVLINK_CMD_HEALTH_REPORTER_GET - do */ @@ -1054,7 +1064,7 @@ struct devlink_health_reporter_get_rsp { * Get health reporter instances. */ std::unique_ptr -devlink_health_reporter_get(ynl_cpp::ynl_socket& ys, +devlink_health_reporter_get(ynl_cpp::ynl_socket& ys, devlink_health_reporter_get_req& req); /* DEVLINK_CMD_HEALTH_REPORTER_GET - dump */ @@ -1069,7 +1079,7 @@ struct devlink_health_reporter_get_list { }; std::unique_ptr -devlink_health_reporter_get_dump(ynl_cpp::ynl_socket& ys, +devlink_health_reporter_get_dump(ynl_cpp::ynl_socket& ys, devlink_health_reporter_get_req_dump& req); /* ============== DEVLINK_CMD_HEALTH_REPORTER_SET ============== */ @@ -1082,12 +1092,13 @@ struct devlink_health_reporter_set_req { std::optional<__u64> health_reporter_graceful_period; std::optional<__u8> health_reporter_auto_recover; std::optional<__u8> health_reporter_auto_dump; + std::optional<__u64> health_reporter_burst_period; }; /* * Set health reporter instances. */ -int devlink_health_reporter_set(ynl_cpp::ynl_socket& ys, +int devlink_health_reporter_set(ynl_cpp::ynl_socket& ys, devlink_health_reporter_set_req& req); /* ============== DEVLINK_CMD_HEALTH_REPORTER_RECOVER ============== */ @@ -1102,7 +1113,7 @@ struct devlink_health_reporter_recover_req { /* * Recover health reporter instances. */ -int devlink_health_reporter_recover(ynl_cpp::ynl_socket& ys, +int devlink_health_reporter_recover(ynl_cpp::ynl_socket& ys, devlink_health_reporter_recover_req& req); /* ============== DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE ============== */ @@ -1117,29 +1128,29 @@ struct devlink_health_reporter_diagnose_req { /* * Diagnose health reporter instances. */ -int devlink_health_reporter_diagnose(ynl_cpp::ynl_socket& ys, +int devlink_health_reporter_diagnose(ynl_cpp::ynl_socket& ys, devlink_health_reporter_diagnose_req& req); /* ============== DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET ============== */ /* DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET - dump */ -struct devlink_health_reporter_dump_get_req_dump { +struct devlink_health_reporter_dump_get_req { std::string bus_name; std::string dev_name; std::optional<__u32> port_index; std::string health_reporter_name; }; -struct devlink_health_reporter_dump_get_rsp_dump { +struct devlink_health_reporter_dump_get_rsp { std::optional fmsg; }; -struct devlink_health_reporter_dump_get_rsp_list { - std::list objs; +struct devlink_health_reporter_dump_get_list { + std::list objs; }; -std::unique_ptr -devlink_health_reporter_dump_get_dump(ynl_cpp::ynl_socket& ys, - devlink_health_reporter_dump_get_req_dump& req); +std::unique_ptr +devlink_health_reporter_dump_get_dump(ynl_cpp::ynl_socket& ys, + devlink_health_reporter_dump_get_req& req); /* ============== DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR ============== */ /* DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR - do */ @@ -1153,7 +1164,7 @@ struct devlink_health_reporter_dump_clear_req { /* * Clear dump of health reporter instances. */ -int devlink_health_reporter_dump_clear(ynl_cpp::ynl_socket& ys, +int devlink_health_reporter_dump_clear(ynl_cpp::ynl_socket& ys, devlink_health_reporter_dump_clear_req& req); /* ============== DEVLINK_CMD_FLASH_UPDATE ============== */ @@ -1169,7 +1180,7 @@ struct devlink_flash_update_req { /* * Flash update devlink instances. */ -int devlink_flash_update(ynl_cpp::ynl_socket& ys, +int devlink_flash_update(ynl_cpp::ynl_socket& ys, devlink_flash_update_req& req); /* ============== DEVLINK_CMD_TRAP_GET ============== */ @@ -1190,7 +1201,7 @@ struct devlink_trap_get_rsp { * Get trap instances. */ std::unique_ptr -devlink_trap_get(ynl_cpp::ynl_socket& ys, devlink_trap_get_req& req); +devlink_trap_get(ynl_cpp::ynl_socket& ys, devlink_trap_get_req& req); /* DEVLINK_CMD_TRAP_GET - dump */ struct devlink_trap_get_req_dump { @@ -1203,7 +1214,7 @@ struct devlink_trap_get_list { }; std::unique_ptr -devlink_trap_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_get_req_dump& req); +devlink_trap_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_get_req_dump& req); /* ============== DEVLINK_CMD_TRAP_SET ============== */ /* DEVLINK_CMD_TRAP_SET - do */ @@ -1211,13 +1222,13 @@ struct devlink_trap_set_req { std::string bus_name; std::string dev_name; std::string trap_name; - std::optional trap_action; + std::optional trap_action; }; /* * Set trap instances. */ -int devlink_trap_set(ynl_cpp::ynl_socket& ys, devlink_trap_set_req& req); +int devlink_trap_set(ynl_cpp::ynl_socket& ys, devlink_trap_set_req& req); /* ============== DEVLINK_CMD_TRAP_GROUP_GET ============== */ /* DEVLINK_CMD_TRAP_GROUP_GET - do */ @@ -1237,7 +1248,7 @@ struct devlink_trap_group_get_rsp { * Get trap group instances. */ std::unique_ptr -devlink_trap_group_get(ynl_cpp::ynl_socket& ys, +devlink_trap_group_get(ynl_cpp::ynl_socket& ys, devlink_trap_group_get_req& req); /* DEVLINK_CMD_TRAP_GROUP_GET - dump */ @@ -1251,7 +1262,7 @@ struct devlink_trap_group_get_list { }; std::unique_ptr -devlink_trap_group_get_dump(ynl_cpp::ynl_socket& ys, +devlink_trap_group_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_group_get_req_dump& req); /* ============== DEVLINK_CMD_TRAP_GROUP_SET ============== */ @@ -1260,14 +1271,14 @@ struct devlink_trap_group_set_req { std::string bus_name; std::string dev_name; std::string trap_group_name; - std::optional trap_action; + std::optional trap_action; std::optional<__u32> trap_policer_id; }; /* * Set trap group instances. */ -int devlink_trap_group_set(ynl_cpp::ynl_socket& ys, +int devlink_trap_group_set(ynl_cpp::ynl_socket& ys, devlink_trap_group_set_req& req); /* ============== DEVLINK_CMD_TRAP_POLICER_GET ============== */ @@ -1288,7 +1299,7 @@ struct devlink_trap_policer_get_rsp { * Get trap policer instances. */ std::unique_ptr -devlink_trap_policer_get(ynl_cpp::ynl_socket& ys, +devlink_trap_policer_get(ynl_cpp::ynl_socket& ys, devlink_trap_policer_get_req& req); /* DEVLINK_CMD_TRAP_POLICER_GET - dump */ @@ -1302,7 +1313,7 @@ struct devlink_trap_policer_get_list { }; std::unique_ptr -devlink_trap_policer_get_dump(ynl_cpp::ynl_socket& ys, +devlink_trap_policer_get_dump(ynl_cpp::ynl_socket& ys, devlink_trap_policer_get_req_dump& req); /* ============== DEVLINK_CMD_TRAP_POLICER_SET ============== */ @@ -1318,7 +1329,7 @@ struct devlink_trap_policer_set_req { /* * Get trap policer instances. */ -int devlink_trap_policer_set(ynl_cpp::ynl_socket& ys, +int devlink_trap_policer_set(ynl_cpp::ynl_socket& ys, devlink_trap_policer_set_req& req); /* ============== DEVLINK_CMD_HEALTH_REPORTER_TEST ============== */ @@ -1333,7 +1344,7 @@ struct devlink_health_reporter_test_req { /* * Test health reporter instances. */ -int devlink_health_reporter_test(ynl_cpp::ynl_socket& ys, +int devlink_health_reporter_test(ynl_cpp::ynl_socket& ys, devlink_health_reporter_test_req& req); /* ============== DEVLINK_CMD_RATE_GET ============== */ @@ -1356,7 +1367,7 @@ struct devlink_rate_get_rsp { * Get rate instances. */ std::unique_ptr -devlink_rate_get(ynl_cpp::ynl_socket& ys, devlink_rate_get_req& req); +devlink_rate_get(ynl_cpp::ynl_socket& ys, devlink_rate_get_req& req); /* DEVLINK_CMD_RATE_GET - dump */ struct devlink_rate_get_req_dump { @@ -1369,7 +1380,7 @@ struct devlink_rate_get_list { }; std::unique_ptr -devlink_rate_get_dump(ynl_cpp::ynl_socket& ys, devlink_rate_get_req_dump& req); +devlink_rate_get_dump(ynl_cpp::ynl_socket& ys, devlink_rate_get_req_dump& req); /* ============== DEVLINK_CMD_RATE_SET ============== */ /* DEVLINK_CMD_RATE_SET - do */ @@ -1382,12 +1393,13 @@ struct devlink_rate_set_req { std::optional<__u32> rate_tx_priority; std::optional<__u32> rate_tx_weight; std::string rate_parent_node_name; + std::vector rate_tc_bws; }; /* * Set rate instances. */ -int devlink_rate_set(ynl_cpp::ynl_socket& ys, devlink_rate_set_req& req); +int devlink_rate_set(ynl_cpp::ynl_socket& ys, devlink_rate_set_req& req); /* ============== DEVLINK_CMD_RATE_NEW ============== */ /* DEVLINK_CMD_RATE_NEW - do */ @@ -1400,12 +1412,13 @@ struct devlink_rate_new_req { std::optional<__u32> rate_tx_priority; std::optional<__u32> rate_tx_weight; std::string rate_parent_node_name; + std::vector rate_tc_bws; }; /* * Create rate instances. */ -int devlink_rate_new(ynl_cpp::ynl_socket& ys, devlink_rate_new_req& req); +int devlink_rate_new(ynl_cpp::ynl_socket& ys, devlink_rate_new_req& req); /* ============== DEVLINK_CMD_RATE_DEL ============== */ /* DEVLINK_CMD_RATE_DEL - do */ @@ -1418,7 +1431,7 @@ struct devlink_rate_del_req { /* * Delete rate instances. */ -int devlink_rate_del(ynl_cpp::ynl_socket& ys, devlink_rate_del_req& req); +int devlink_rate_del(ynl_cpp::ynl_socket& ys, devlink_rate_del_req& req); /* ============== DEVLINK_CMD_LINECARD_GET ============== */ /* DEVLINK_CMD_LINECARD_GET - do */ @@ -1438,7 +1451,7 @@ struct devlink_linecard_get_rsp { * Get line card instances. */ std::unique_ptr -devlink_linecard_get(ynl_cpp::ynl_socket& ys, devlink_linecard_get_req& req); +devlink_linecard_get(ynl_cpp::ynl_socket& ys, devlink_linecard_get_req& req); /* DEVLINK_CMD_LINECARD_GET - dump */ struct devlink_linecard_get_req_dump { @@ -1451,7 +1464,7 @@ struct devlink_linecard_get_list { }; std::unique_ptr -devlink_linecard_get_dump(ynl_cpp::ynl_socket& ys, +devlink_linecard_get_dump(ynl_cpp::ynl_socket& ys, devlink_linecard_get_req_dump& req); /* ============== DEVLINK_CMD_LINECARD_SET ============== */ @@ -1466,7 +1479,7 @@ struct devlink_linecard_set_req { /* * Set line card instances. */ -int devlink_linecard_set(ynl_cpp::ynl_socket& ys, +int devlink_linecard_set(ynl_cpp::ynl_socket& ys, devlink_linecard_set_req& req); /* ============== DEVLINK_CMD_SELFTESTS_GET ============== */ @@ -1485,7 +1498,7 @@ struct devlink_selftests_get_rsp { * Get device selftest instances. */ std::unique_ptr -devlink_selftests_get(ynl_cpp::ynl_socket& ys, devlink_selftests_get_req& req); +devlink_selftests_get(ynl_cpp::ynl_socket& ys, devlink_selftests_get_req& req); /* DEVLINK_CMD_SELFTESTS_GET - dump */ struct devlink_selftests_get_list { @@ -1493,7 +1506,7 @@ struct devlink_selftests_get_list { }; std::unique_ptr -devlink_selftests_get_dump(ynl_cpp::ynl_socket& ys); +devlink_selftests_get_dump(ynl_cpp::ynl_socket& ys); /* ============== DEVLINK_CMD_SELFTESTS_RUN ============== */ /* DEVLINK_CMD_SELFTESTS_RUN - do */ @@ -1506,7 +1519,7 @@ struct devlink_selftests_run_req { /* * Run device selftest instances. */ -int devlink_selftests_run(ynl_cpp::ynl_socket& ys, +int devlink_selftests_run(ynl_cpp::ynl_socket& ys, devlink_selftests_run_req& req); /* ============== DEVLINK_CMD_NOTIFY_FILTER_SET ============== */ @@ -1520,7 +1533,7 @@ struct devlink_notify_filter_set_req { /* * Set notification messages socket filter. */ -int devlink_notify_filter_set(ynl_cpp::ynl_socket& ys, +int devlink_notify_filter_set(ynl_cpp::ynl_socket& ys, devlink_notify_filter_set_req& req); } //namespace ynl_cpp diff --git a/generated/ovs_vport-user.cpp b/generated/ovs_vport-user.cpp new file mode 100644 index 0000000..3effaa0 --- /dev/null +++ b/generated/ovs_vport-user.cpp @@ -0,0 +1,388 @@ +// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) +/* Do not edit directly, auto-generated from: */ +/* */ +/* YNL-GEN user source */ + +#include "ovs_vport-user.hpp" + +#include + +#include + +#include + +namespace ynl_cpp { + +/* Enums */ +static constexpr std::array ovs_vport_op_strmap = []() { + std::array arr{}; + arr[OVS_VPORT_CMD_NEW] = "new"; + arr[OVS_VPORT_CMD_DEL] = "del"; + arr[OVS_VPORT_CMD_GET] = "get"; + return arr; +} (); + +std::string_view ovs_vport_op_str(int op) +{ + if (op < 0 || op >= (int)(ovs_vport_op_strmap.size())) { + return ""; + } + return ovs_vport_op_strmap[op]; +} + +static constexpr std::array ovs_vport_vport_type_strmap = []() { + std::array arr{}; + arr[0] = "unspec"; + arr[1] = "netdev"; + arr[2] = "internal"; + arr[3] = "gre"; + arr[4] = "vxlan"; + arr[5] = "geneve"; + return arr; +} (); + +std::string_view ovs_vport_vport_type_str(ovs_vport_type value) +{ + if (value < 0 || value >= (int)(ovs_vport_vport_type_strmap.size())) { + return ""; + } + return ovs_vport_vport_type_strmap[value]; +} + +/* Policies */ +static std::array ovs_vport_vport_options_policy = []() { + std::array arr{}; + arr[OVS_TUNNEL_ATTR_DST_PORT].name = "dst-port"; + arr[OVS_TUNNEL_ATTR_DST_PORT].type = YNL_PT_U32; + arr[OVS_TUNNEL_ATTR_EXTENSION].name = "extension"; + arr[OVS_TUNNEL_ATTR_EXTENSION].type = YNL_PT_U32; + return arr; +} (); + +struct ynl_policy_nest ovs_vport_vport_options_nest = { + .max_attr = static_cast(OVS_TUNNEL_ATTR_MAX), + .table = ovs_vport_vport_options_policy.data(), +}; + +static std::array ovs_vport_upcall_stats_policy = []() { + std::array arr{}; + arr[OVS_VPORT_UPCALL_ATTR_SUCCESS].name = "success"; + arr[OVS_VPORT_UPCALL_ATTR_SUCCESS].type = YNL_PT_U64; + arr[OVS_VPORT_UPCALL_ATTR_FAIL].name = "fail"; + arr[OVS_VPORT_UPCALL_ATTR_FAIL].type = YNL_PT_U64; + return arr; +} (); + +struct ynl_policy_nest ovs_vport_upcall_stats_nest = { + .max_attr = static_cast(OVS_VPORT_UPCALL_ATTR_MAX), + .table = ovs_vport_upcall_stats_policy.data(), +}; + +static std::array ovs_vport_vport_policy = []() { + std::array arr{}; + arr[OVS_VPORT_ATTR_UNSPEC].name = "unspec"; + arr[OVS_VPORT_ATTR_UNSPEC].type = YNL_PT_REJECT; + arr[OVS_VPORT_ATTR_PORT_NO].name = "port-no"; + arr[OVS_VPORT_ATTR_PORT_NO].type = YNL_PT_U32; + arr[OVS_VPORT_ATTR_TYPE].name = "type"; + arr[OVS_VPORT_ATTR_TYPE].type = YNL_PT_U32; + arr[OVS_VPORT_ATTR_NAME].name = "name"; + arr[OVS_VPORT_ATTR_NAME].type = YNL_PT_NUL_STR; + arr[OVS_VPORT_ATTR_OPTIONS].name = "options"; + arr[OVS_VPORT_ATTR_OPTIONS].type = YNL_PT_NEST; + arr[OVS_VPORT_ATTR_OPTIONS].nest = &ovs_vport_vport_options_nest; + arr[OVS_VPORT_ATTR_UPCALL_PID].name = "upcall-pid"; + arr[OVS_VPORT_ATTR_UPCALL_PID].type = YNL_PT_BINARY; + arr[OVS_VPORT_ATTR_STATS].name = "stats"; + arr[OVS_VPORT_ATTR_STATS].type = YNL_PT_BINARY; + arr[OVS_VPORT_ATTR_PAD].name = "pad"; + arr[OVS_VPORT_ATTR_PAD].type = YNL_PT_REJECT; + arr[OVS_VPORT_ATTR_IFINDEX].name = "ifindex"; + arr[OVS_VPORT_ATTR_IFINDEX].type = YNL_PT_U32; + arr[OVS_VPORT_ATTR_NETNSID].name = "netnsid"; + arr[OVS_VPORT_ATTR_NETNSID].type = YNL_PT_U32; + arr[OVS_VPORT_ATTR_UPCALL_STATS].name = "upcall-stats"; + arr[OVS_VPORT_ATTR_UPCALL_STATS].type = YNL_PT_NEST; + arr[OVS_VPORT_ATTR_UPCALL_STATS].nest = &ovs_vport_upcall_stats_nest; + return arr; +} (); + +struct ynl_policy_nest ovs_vport_vport_nest = { + .max_attr = static_cast(OVS_VPORT_ATTR_MAX), + .table = ovs_vport_vport_policy.data(), +}; + +/* Common nested types */ +int ovs_vport_vport_options_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_vport_vport_options& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.dst_port.has_value()) { + ynl_attr_put_u32(nlh, OVS_TUNNEL_ATTR_DST_PORT, obj.dst_port.value()); + } + if (obj.extension.has_value()) { + ynl_attr_put_u32(nlh, OVS_TUNNEL_ATTR_EXTENSION, obj.extension.value()); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_vport_upcall_stats_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_vport_upcall_stats *dst = (ovs_vport_upcall_stats *)yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_VPORT_UPCALL_ATTR_SUCCESS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->success = (__u64)ynl_attr_get_u64(attr); + } else if (type == OVS_VPORT_UPCALL_ATTR_FAIL) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->fail = (__u64)ynl_attr_get_u64(attr); + } + } + + return 0; +} + +/* ============== OVS_VPORT_CMD_NEW ============== */ +/* OVS_VPORT_CMD_NEW - do */ +int ovs_vport_new(ynl_cpp::ynl_socket& ys, ovs_vport_new_req& req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, OVS_VPORT_CMD_NEW, 1); + ((struct ynl_sock*)ys)->req_policy = &ovs_vport_vport_nest; + + hdr_len = sizeof(req._hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req._hdr, hdr_len); + + if (req.name.size() > 0) { + ynl_attr_put_str(nlh, OVS_VPORT_ATTR_NAME, req.name.data()); + } + if (req.type.has_value()) { + ynl_attr_put_u32(nlh, OVS_VPORT_ATTR_TYPE, req.type.value()); + } + if (req.upcall_pid.size() > 0) { + ynl_attr_put(nlh, OVS_VPORT_ATTR_UPCALL_PID, req.upcall_pid.data(), req.upcall_pid.size()); + } + if (req.ifindex.has_value()) { + ynl_attr_put_u32(nlh, OVS_VPORT_ATTR_IFINDEX, req.ifindex.value()); + } + if (req.options.has_value()) { + ovs_vport_vport_options_put(nlh, OVS_VPORT_ATTR_OPTIONS, req.options.value()); + } + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) { + return -1; + } + + return 0; +} + +/* ============== OVS_VPORT_CMD_DEL ============== */ +/* OVS_VPORT_CMD_DEL - do */ +int ovs_vport_del(ynl_cpp::ynl_socket& ys, ovs_vport_del_req& req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, OVS_VPORT_CMD_DEL, 1); + ((struct ynl_sock*)ys)->req_policy = &ovs_vport_vport_nest; + + hdr_len = sizeof(req._hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req._hdr, hdr_len); + + if (req.port_no.has_value()) { + ynl_attr_put_u32(nlh, OVS_VPORT_ATTR_PORT_NO, req.port_no.value()); + } + if (req.type.has_value()) { + ynl_attr_put_u32(nlh, OVS_VPORT_ATTR_TYPE, req.type.value()); + } + if (req.name.size() > 0) { + ynl_attr_put_str(nlh, OVS_VPORT_ATTR_NAME, req.name.data()); + } + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) { + return -1; + } + + return 0; +} + +/* ============== OVS_VPORT_CMD_GET ============== */ +/* OVS_VPORT_CMD_GET - do */ +int ovs_vport_get_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + const struct nlattr *attr; + struct ynl_parse_arg parg; + ovs_vport_get_rsp *dst; + void *hdr; + + dst = (ovs_vport_get_rsp*)yarg->data; + parg.ys = yarg->ys; + + hdr = ynl_nlmsg_data_offset(nlh, sizeof(struct genlmsghdr)); + memcpy(&dst->_hdr, hdr, sizeof(struct ovs_header)); + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_VPORT_ATTR_PORT_NO) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->port_no = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_VPORT_ATTR_TYPE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->type = (enum ovs_vport_type)ynl_attr_get_u32(attr); + } else if (type == OVS_VPORT_ATTR_NAME) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->name.assign(ynl_attr_get_str(attr)); + } else if (type == OVS_VPORT_ATTR_UPCALL_PID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->upcall_pid.assign(data, data + len); + } else if (type == OVS_VPORT_ATTR_STATS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_vport_stats); + dst->stats.emplace(); + memcpy(&*dst->stats, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_VPORT_ATTR_IFINDEX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->ifindex = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_VPORT_ATTR_NETNSID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->netnsid = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_VPORT_ATTR_UPCALL_STATS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_vport_upcall_stats_nest; + parg.data = &dst->upcall_stats.emplace(); + if (ovs_vport_upcall_stats_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } + } + + return YNL_PARSE_CB_OK; +} + +std::unique_ptr +ovs_vport_get(ynl_cpp::ynl_socket& ys, ovs_vport_get_req& req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + std::unique_ptr rsp; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, OVS_VPORT_CMD_GET, 1); + ((struct ynl_sock*)ys)->req_policy = &ovs_vport_vport_nest; + yrs.yarg.rsp_policy = &ovs_vport_vport_nest; + + hdr_len = sizeof(req._hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req._hdr, hdr_len); + + if (req.name.size() > 0) { + ynl_attr_put_str(nlh, OVS_VPORT_ATTR_NAME, req.name.data()); + } + + rsp.reset(new ovs_vport_get_rsp()); + yrs.yarg.data = rsp.get(); + yrs.cb = ovs_vport_get_rsp_parse; + yrs.rsp_cmd = OVS_VPORT_CMD_GET; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) { + return nullptr; + } + + return rsp; +} + +/* OVS_VPORT_CMD_GET - dump */ +std::unique_ptr +ovs_vport_get_dump(ynl_cpp::ynl_socket& ys, ovs_vport_get_req_dump& req) +{ + struct ynl_dump_no_alloc_state yds = {}; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + auto ret = std::make_unique(); + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &ovs_vport_vport_nest; + yds.yarg.data = ret.get(); + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; + yds.cb = ovs_vport_get_rsp_parse; + yds.rsp_cmd = OVS_VPORT_CMD_GET; + + nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, OVS_VPORT_CMD_GET, 1); + hdr_len = sizeof(req._hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req._hdr, hdr_len); + + ((struct ynl_sock*)ys)->req_policy = &ovs_vport_vport_nest; + + if (req.name.size() > 0) { + ynl_attr_put_str(nlh, OVS_VPORT_ATTR_NAME, req.name.data()); + } + + err = ynl_exec_dump_no_alloc(ys, nlh, &yds); + if (err < 0) { + return nullptr; + } + + return ret; +} + +const struct ynl_family ynl_ovs_vport_family = { + .name = "ovs_vport", + .hdr_len = sizeof(struct genlmsghdr) + sizeof(struct ovs_header), +}; +const struct ynl_family& get_ynl_ovs_vport_family() { + return ynl_ovs_vport_family; +}; +} //namespace ynl_cpp diff --git a/generated/ovs_vport-user.hpp b/generated/ovs_vport-user.hpp new file mode 100644 index 0000000..c9d5c02 --- /dev/null +++ b/generated/ovs_vport-user.hpp @@ -0,0 +1,117 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* Do not edit directly, auto-generated from: */ +/* */ +/* YNL-GEN user header */ + +#ifndef _LINUX_OVS_VPORT_GEN_H +#define _LINUX_OVS_VPORT_GEN_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ynl.hpp" + +#include + +namespace ynl_cpp { +const struct ynl_family& get_ynl_ovs_vport_family(); + +/* Enums */ +std::string_view ovs_vport_op_str(int op); +std::string_view ovs_vport_vport_type_str(ovs_vport_type value); + +/* Common nested types */ +struct ovs_vport_vport_options { + std::optional<__u32> dst_port; + std::optional<__u32> extension; +}; + +struct ovs_vport_upcall_stats { + std::optional<__u64> success; + std::optional<__u64> fail; +}; + +/* ============== OVS_VPORT_CMD_NEW ============== */ +/* OVS_VPORT_CMD_NEW - do */ +struct ovs_vport_new_req { + struct ovs_header _hdr; + + std::string name; + std::optional type; + std::vector<__u8> upcall_pid; + std::optional<__u32> ifindex; + std::optional options; +}; + +/* + * Create a new OVS vport + */ +int ovs_vport_new(ynl_cpp::ynl_socket& ys, ovs_vport_new_req& req); + +/* ============== OVS_VPORT_CMD_DEL ============== */ +/* OVS_VPORT_CMD_DEL - do */ +struct ovs_vport_del_req { + struct ovs_header _hdr; + + std::optional<__u32> port_no; + std::optional type; + std::string name; +}; + +/* + * Delete existing OVS vport from a data path + */ +int ovs_vport_del(ynl_cpp::ynl_socket& ys, ovs_vport_del_req& req); + +/* ============== OVS_VPORT_CMD_GET ============== */ +/* OVS_VPORT_CMD_GET - do */ +struct ovs_vport_get_req { + struct ovs_header _hdr; + + std::string name; +}; + +struct ovs_vport_get_rsp { + struct ovs_header _hdr; + + std::optional<__u32> port_no; + std::optional type; + std::string name; + std::vector<__u8> upcall_pid; + std::optional stats; + std::optional<__u32> ifindex; + std::optional<__u32> netnsid; + std::optional upcall_stats; +}; + +/* + * Get / dump OVS vport configuration and state + */ +std::unique_ptr +ovs_vport_get(ynl_cpp::ynl_socket& ys, ovs_vport_get_req& req); + +/* OVS_VPORT_CMD_GET - dump */ +struct ovs_vport_get_req_dump { + struct ovs_header _hdr; + + std::string name; +}; + +struct ovs_vport_get_list { + std::list objs; +}; + +std::unique_ptr +ovs_vport_get_dump(ynl_cpp::ynl_socket& ys, ovs_vport_get_req_dump& req); + +} //namespace ynl_cpp +#endif /* _LINUX_OVS_VPORT_GEN_H */ diff --git a/ynl-gen-cpp.py b/ynl-gen-cpp.py index 7764e4b..c811e9c 100755 --- a/ynl-gen-cpp.py +++ b/ynl-gen-cpp.py @@ -97,11 +97,24 @@ def get_limit(self, limit, default=None): value = self.checks.get(limit, default) if value is None: return value - elif value in self.family.consts: + if isinstance(value, int): + return value + if value in self.family.consts: + return self.family.consts[value]["value"] + return limit_to_number(value) + + def get_limit_str(self, limit, default=None, suffix=''): + value = self.checks.get(limit, default) + if value is None: + return '' + if isinstance(value, int): + return str(value) + suffix + if value in self.family.consts: + const = self.family.consts[value] + if const.get('header'): + return c_upper(value) return c_upper(f"{self.family['name']}-{value}") - if not isinstance(value, int): - value = limit_to_number(value) - return value + return c_upper(value) def resolve(self): if "parent-sub-message" in self.attr: @@ -365,11 +378,11 @@ def _attr_policy(self, policy): elif "full-range" in self.checks: return f"NLA_POLICY_FULL_RANGE({policy}, &{c_lower(self.enum_name)}_range)" elif "range" in self.checks: - return f"NLA_POLICY_RANGE({policy}, {self.get_limit('min')}, {self.get_limit('max')})" + return f"NLA_POLICY_RANGE({policy}, {self.get_limit_str('min')}, {self.get_limit_str('max')})" elif "min" in self.checks: - return f"NLA_POLICY_MIN({policy}, {self.get_limit('min')})" + return f"NLA_POLICY_MIN({policy}, {self.get_limit_str('min')})" elif "max" in self.checks: - return f"NLA_POLICY_MAX({policy}, {self.get_limit('max')})" + return f"NLA_POLICY_MAX({policy}, {self.get_limit_str('max')})" return super()._attr_policy(policy) def _attr_typol(self): @@ -432,11 +445,11 @@ def _attr_typol(self): def _attr_policy(self, policy): if "exact-len" in self.checks: - mem = "NLA_POLICY_EXACT_LEN(" + str(self.get_limit("exact-len")) + ")" + mem = "NLA_POLICY_EXACT_LEN(" + str(self.get_limit_str("exact-len")) + ")" else: mem = "{ .type = " + policy if "max-len" in self.checks: - mem += ", .len = " + str(self.get_limit("max-len")) + mem += ", .len = " + str(self.get_limit_str("max-len")) mem += ", }" return mem @@ -482,11 +495,11 @@ def _attr_typol(self): def _attr_policy(self, policy): if "exact-len" in self.checks: - mem = "NLA_POLICY_EXACT_LEN(" + str(self.get_limit("exact-len")) + ")" + mem = "NLA_POLICY_EXACT_LEN(" + str(self.get_limit_str("exact-len")) + ")" else: mem = "{ " if len(self.checks) == 1 and "min-len" in self.checks: - mem += ".len = " + str(self.get_limit("min-len")) + mem += ".len = " + str(self.get_limit_str("min-len")) elif len(self.checks) == 0: mem += ".type = NLA_BINARY" else: From 08ae3bda9284ed50c420229e2f123984cc0ae722 Mon Sep 17 00:00:00 2001 From: Sheldon Wu Date: Thu, 8 Jan 2026 10:43:58 -0800 Subject: [PATCH 2/3] ynl-gen-cpp: add support for generating ovs_flow Summary: Enable ovs_flow code generation and fix compile failure Backport from net-next record information about recursive struct. Forward declarations if child struct in nested struct is define after it. Recursive types are stored as vector not option, update attr_put and _attr_get to handle it correctly net-next: tools: ynl-gen: record information about recursive nests(commit 38329fcfb757b8215c07a77b6657721cc7e9530e) Test Plan: make sure code could be generated and compiled Signed-off-by: Sheldon Wu --- generated/Makefile | 2 +- generated/ovs_flow-user.cpp | 2112 +++++++++++++++++++++++++++++++++++ generated/ovs_flow-user.hpp | 241 ++++ ynl-gen-cpp.py | 78 +- 4 files changed, 2413 insertions(+), 20 deletions(-) create mode 100644 generated/ovs_flow-user.cpp create mode 100644 generated/ovs_flow-user.hpp diff --git a/generated/Makefile b/generated/Makefile index 49f658b..91cc0af 100644 --- a/generated/Makefile +++ b/generated/Makefile @@ -17,7 +17,7 @@ GENS_PATHS=$(shell grep -nrI --files-without-match \ 'protocol: netlink' ../Documentation/netlink/specs/) GENS_PATHS+=$(wildcard ../Documentation/netlink/specs/rt-*.yaml) GENS_ALL=$(patsubst ../Documentation/netlink/specs/%.yaml,%,${GENS_PATHS}) -GENS=$(filter-out ovs_flow nlctrl,${GENS_ALL}) +GENS=$(filter-out nlctrl,${GENS_ALL}) SRCS=$(patsubst %,%-user.cpp,${GENS}) HDRS=$(patsubst %,%-user.hpp,${GENS}) OBJS=$(patsubst %,%-user.cpp.o,${GENS}) diff --git a/generated/ovs_flow-user.cpp b/generated/ovs_flow-user.cpp new file mode 100644 index 0000000..85341d9 --- /dev/null +++ b/generated/ovs_flow-user.cpp @@ -0,0 +1,2112 @@ +// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) +/* Do not edit directly, auto-generated from: */ +/* */ +/* YNL-GEN user source */ + +#include "ovs_flow-user.hpp" + +#include + +#include + +#include + +namespace ynl_cpp { + +/* Enums */ +static constexpr std::array ovs_flow_op_strmap = []() { + std::array arr{}; + arr[OVS_FLOW_CMD_GET] = "get"; + arr[OVS_FLOW_CMD_NEW] = "new"; + return arr; +} (); + +std::string_view ovs_flow_op_str(int op) +{ + if (op < 0 || op >= (int)(ovs_flow_op_strmap.size())) { + return ""; + } + return ovs_flow_op_strmap[op]; +} + +static constexpr std::array ovs_flow_ovs_frag_type_strmap = []() { + std::array arr{}; + arr[0] = "none"; + arr[1] = "first"; + arr[2] = "later"; + arr[255] = "any"; + return arr; +} (); + +std::string_view ovs_flow_ovs_frag_type_str(ovs_frag_type value) +{ + if (value < 0 || value >= (int)(ovs_flow_ovs_frag_type_strmap.size())) { + return ""; + } + return ovs_flow_ovs_frag_type_strmap[value]; +} + +static constexpr std::array ovs_flow_ovs_ufid_flags_strmap = []() { + std::array arr{}; + arr[0] = "omit-key"; + arr[1] = "omit-mask"; + arr[2] = "omit-actions"; + return arr; +} (); + +std::string_view ovs_flow_ovs_ufid_flags_str(int value) +{ + value = (int)(ffs(value) - 1); + if (value < 0 || value >= (int)(ovs_flow_ovs_ufid_flags_strmap.size())) { + return ""; + } + return ovs_flow_ovs_ufid_flags_strmap[value]; +} + +static constexpr std::array ovs_flow_ovs_hash_alg_strmap = []() { + std::array arr{}; + arr[0] = "ovs-hash-alg-l4"; + return arr; +} (); + +std::string_view ovs_flow_ovs_hash_alg_str(ovs_hash_alg value) +{ + if (value < 0 || value >= (int)(ovs_flow_ovs_hash_alg_strmap.size())) { + return ""; + } + return ovs_flow_ovs_hash_alg_strmap[value]; +} + +static constexpr std::array ovs_flow_ct_state_flags_strmap = []() { + std::array arr{}; + arr[0] = "new"; + arr[1] = "established"; + arr[2] = "related"; + arr[3] = "reply-dir"; + arr[4] = "invalid"; + arr[5] = "tracked"; + arr[6] = "src-nat"; + arr[7] = "dst-nat"; + return arr; +} (); + +std::string_view ovs_flow_ct_state_flags_str(int value) +{ + value = (int)(ffs(value) - 1); + if (value < 0 || value >= (int)(ovs_flow_ct_state_flags_strmap.size())) { + return ""; + } + return ovs_flow_ct_state_flags_strmap[value]; +} + +/* Policies */ +extern struct ynl_policy_nest ovs_flow_key_attrs_nest; +extern struct ynl_policy_nest ovs_flow_action_attrs_nest; + +static std::array ovs_flow_ovs_nsh_key_attrs_policy = []() { + std::array arr{}; + arr[OVS_NSH_KEY_ATTR_BASE].name = "base"; + arr[OVS_NSH_KEY_ATTR_BASE].type = YNL_PT_BINARY; + arr[OVS_NSH_KEY_ATTR_MD1].name = "md1"; + arr[OVS_NSH_KEY_ATTR_MD1].type = YNL_PT_BINARY; + arr[OVS_NSH_KEY_ATTR_MD2].name = "md2"; + arr[OVS_NSH_KEY_ATTR_MD2].type = YNL_PT_BINARY; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_ovs_nsh_key_attrs_nest = { + .max_attr = static_cast(OVS_NSH_KEY_ATTR_MAX), + .table = ovs_flow_ovs_nsh_key_attrs_policy.data(), +}; + +static std::array ovs_flow_userspace_attrs_policy = []() { + std::array arr{}; + arr[OVS_USERSPACE_ATTR_PID].name = "pid"; + arr[OVS_USERSPACE_ATTR_PID].type = YNL_PT_U32; + arr[OVS_USERSPACE_ATTR_USERDATA].name = "userdata"; + arr[OVS_USERSPACE_ATTR_USERDATA].type = YNL_PT_BINARY; + arr[OVS_USERSPACE_ATTR_EGRESS_TUN_PORT].name = "egress-tun-port"; + arr[OVS_USERSPACE_ATTR_EGRESS_TUN_PORT].type = YNL_PT_U32; + arr[OVS_USERSPACE_ATTR_ACTIONS].name = "actions"; + arr[OVS_USERSPACE_ATTR_ACTIONS].type = YNL_PT_FLAG; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_userspace_attrs_nest = { + .max_attr = static_cast(OVS_USERSPACE_ATTR_MAX), + .table = ovs_flow_userspace_attrs_policy.data(), +}; + +static std::array ovs_flow_psample_attrs_policy = []() { + std::array arr{}; + arr[OVS_PSAMPLE_ATTR_GROUP].name = "group"; + arr[OVS_PSAMPLE_ATTR_GROUP].type = YNL_PT_U32; + arr[OVS_PSAMPLE_ATTR_COOKIE].name = "cookie"; + arr[OVS_PSAMPLE_ATTR_COOKIE].type = YNL_PT_BINARY; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_psample_attrs_nest = { + .max_attr = static_cast(OVS_PSAMPLE_ATTR_MAX), + .table = ovs_flow_psample_attrs_policy.data(), +}; + +static std::array ovs_flow_vxlan_ext_attrs_policy = []() { + std::array arr{}; + arr[OVS_VXLAN_EXT_GBP].name = "gbp"; + arr[OVS_VXLAN_EXT_GBP].type = YNL_PT_U32; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_vxlan_ext_attrs_nest = { + .max_attr = static_cast(OVS_VXLAN_EXT_MAX), + .table = ovs_flow_vxlan_ext_attrs_policy.data(), +}; + +static std::array ovs_flow_nat_attrs_policy = []() { + std::array arr{}; + arr[OVS_NAT_ATTR_SRC].name = "src"; + arr[OVS_NAT_ATTR_SRC].type = YNL_PT_FLAG; + arr[OVS_NAT_ATTR_DST].name = "dst"; + arr[OVS_NAT_ATTR_DST].type = YNL_PT_FLAG; + arr[OVS_NAT_ATTR_IP_MIN].name = "ip-min"; + arr[OVS_NAT_ATTR_IP_MIN].type = YNL_PT_BINARY; + arr[OVS_NAT_ATTR_IP_MAX].name = "ip-max"; + arr[OVS_NAT_ATTR_IP_MAX].type = YNL_PT_BINARY; + arr[OVS_NAT_ATTR_PROTO_MIN].name = "proto-min"; + arr[OVS_NAT_ATTR_PROTO_MIN].type = YNL_PT_U16; + arr[OVS_NAT_ATTR_PROTO_MAX].name = "proto-max"; + arr[OVS_NAT_ATTR_PROTO_MAX].type = YNL_PT_U16; + arr[OVS_NAT_ATTR_PERSISTENT].name = "persistent"; + arr[OVS_NAT_ATTR_PERSISTENT].type = YNL_PT_FLAG; + arr[OVS_NAT_ATTR_PROTO_HASH].name = "proto-hash"; + arr[OVS_NAT_ATTR_PROTO_HASH].type = YNL_PT_FLAG; + arr[OVS_NAT_ATTR_PROTO_RANDOM].name = "proto-random"; + arr[OVS_NAT_ATTR_PROTO_RANDOM].type = YNL_PT_FLAG; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_nat_attrs_nest = { + .max_attr = static_cast(OVS_NAT_ATTR_MAX), + .table = ovs_flow_nat_attrs_policy.data(), +}; + +static std::array ovs_flow_tunnel_key_attrs_policy = []() { + std::array arr{}; + arr[OVS_TUNNEL_KEY_ATTR_ID].name = "id"; + arr[OVS_TUNNEL_KEY_ATTR_ID].type = YNL_PT_U64; + arr[OVS_TUNNEL_KEY_ATTR_IPV4_SRC].name = "ipv4-src"; + arr[OVS_TUNNEL_KEY_ATTR_IPV4_SRC].type = YNL_PT_U32; + arr[OVS_TUNNEL_KEY_ATTR_IPV4_DST].name = "ipv4-dst"; + arr[OVS_TUNNEL_KEY_ATTR_IPV4_DST].type = YNL_PT_U32; + arr[OVS_TUNNEL_KEY_ATTR_TOS].name = "tos"; + arr[OVS_TUNNEL_KEY_ATTR_TOS].type = YNL_PT_U8; + arr[OVS_TUNNEL_KEY_ATTR_TTL].name = "ttl"; + arr[OVS_TUNNEL_KEY_ATTR_TTL].type = YNL_PT_U8; + arr[OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT].name = "dont-fragment"; + arr[OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT].type = YNL_PT_FLAG; + arr[OVS_TUNNEL_KEY_ATTR_CSUM].name = "csum"; + arr[OVS_TUNNEL_KEY_ATTR_CSUM].type = YNL_PT_FLAG; + arr[OVS_TUNNEL_KEY_ATTR_OAM].name = "oam"; + arr[OVS_TUNNEL_KEY_ATTR_OAM].type = YNL_PT_FLAG; + arr[OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS].name = "geneve-opts"; + arr[OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS].type = YNL_PT_BINARY; + arr[OVS_TUNNEL_KEY_ATTR_TP_SRC].name = "tp-src"; + arr[OVS_TUNNEL_KEY_ATTR_TP_SRC].type = YNL_PT_U16; + arr[OVS_TUNNEL_KEY_ATTR_TP_DST].name = "tp-dst"; + arr[OVS_TUNNEL_KEY_ATTR_TP_DST].type = YNL_PT_U16; + arr[OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS].name = "vxlan-opts"; + arr[OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS].type = YNL_PT_NEST; + arr[OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS].nest = &ovs_flow_vxlan_ext_attrs_nest; + arr[OVS_TUNNEL_KEY_ATTR_IPV6_SRC].name = "ipv6-src"; + arr[OVS_TUNNEL_KEY_ATTR_IPV6_SRC].type = YNL_PT_BINARY; + arr[OVS_TUNNEL_KEY_ATTR_IPV6_DST].name = "ipv6-dst"; + arr[OVS_TUNNEL_KEY_ATTR_IPV6_DST].type = YNL_PT_BINARY; + arr[OVS_TUNNEL_KEY_ATTR_PAD].name = "pad"; + arr[OVS_TUNNEL_KEY_ATTR_PAD].type = YNL_PT_BINARY; + arr[OVS_TUNNEL_KEY_ATTR_ERSPAN_OPTS].name = "erspan-opts"; + arr[OVS_TUNNEL_KEY_ATTR_ERSPAN_OPTS].type = YNL_PT_BINARY; + arr[OVS_TUNNEL_KEY_ATTR_IPV4_INFO_BRIDGE].name = "ipv4-info-bridge"; + arr[OVS_TUNNEL_KEY_ATTR_IPV4_INFO_BRIDGE].type = YNL_PT_FLAG; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_tunnel_key_attrs_nest = { + .max_attr = static_cast(OVS_TUNNEL_KEY_ATTR_MAX), + .table = ovs_flow_tunnel_key_attrs_policy.data(), +}; + +static std::array ovs_flow_ct_attrs_policy = []() { + std::array arr{}; + arr[OVS_CT_ATTR_COMMIT].name = "commit"; + arr[OVS_CT_ATTR_COMMIT].type = YNL_PT_FLAG; + arr[OVS_CT_ATTR_ZONE].name = "zone"; + arr[OVS_CT_ATTR_ZONE].type = YNL_PT_U16; + arr[OVS_CT_ATTR_MARK].name = "mark"; + arr[OVS_CT_ATTR_MARK].type = YNL_PT_BINARY; + arr[OVS_CT_ATTR_LABELS].name = "labels"; + arr[OVS_CT_ATTR_LABELS].type = YNL_PT_BINARY; + arr[OVS_CT_ATTR_HELPER].name = "helper"; + arr[OVS_CT_ATTR_HELPER].type = YNL_PT_NUL_STR; + arr[OVS_CT_ATTR_NAT].name = "nat"; + arr[OVS_CT_ATTR_NAT].type = YNL_PT_NEST; + arr[OVS_CT_ATTR_NAT].nest = &ovs_flow_nat_attrs_nest; + arr[OVS_CT_ATTR_FORCE_COMMIT].name = "force-commit"; + arr[OVS_CT_ATTR_FORCE_COMMIT].type = YNL_PT_FLAG; + arr[OVS_CT_ATTR_EVENTMASK].name = "eventmask"; + arr[OVS_CT_ATTR_EVENTMASK].type = YNL_PT_U32; + arr[OVS_CT_ATTR_TIMEOUT].name = "timeout"; + arr[OVS_CT_ATTR_TIMEOUT].type = YNL_PT_NUL_STR; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_ct_attrs_nest = { + .max_attr = static_cast(OVS_CT_ATTR_MAX), + .table = ovs_flow_ct_attrs_policy.data(), +}; + +static std::array ovs_flow_key_attrs_policy = []() { + std::array arr{}; + arr[OVS_KEY_ATTR_ENCAP].name = "encap"; + arr[OVS_KEY_ATTR_ENCAP].type = YNL_PT_NEST; + arr[OVS_KEY_ATTR_ENCAP].nest = &ovs_flow_key_attrs_nest; + arr[OVS_KEY_ATTR_PRIORITY].name = "priority"; + arr[OVS_KEY_ATTR_PRIORITY].type = YNL_PT_U32; + arr[OVS_KEY_ATTR_IN_PORT].name = "in-port"; + arr[OVS_KEY_ATTR_IN_PORT].type = YNL_PT_U32; + arr[OVS_KEY_ATTR_ETHERNET].name = "ethernet"; + arr[OVS_KEY_ATTR_ETHERNET].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_VLAN].name = "vlan"; + arr[OVS_KEY_ATTR_VLAN].type = YNL_PT_U16; + arr[OVS_KEY_ATTR_ETHERTYPE].name = "ethertype"; + arr[OVS_KEY_ATTR_ETHERTYPE].type = YNL_PT_U16; + arr[OVS_KEY_ATTR_IPV4].name = "ipv4"; + arr[OVS_KEY_ATTR_IPV4].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_IPV6].name = "ipv6"; + arr[OVS_KEY_ATTR_IPV6].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_TCP].name = "tcp"; + arr[OVS_KEY_ATTR_TCP].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_UDP].name = "udp"; + arr[OVS_KEY_ATTR_UDP].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_ICMP].name = "icmp"; + arr[OVS_KEY_ATTR_ICMP].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_ICMPV6].name = "icmpv6"; + arr[OVS_KEY_ATTR_ICMPV6].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_ARP].name = "arp"; + arr[OVS_KEY_ATTR_ARP].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_ND].name = "nd"; + arr[OVS_KEY_ATTR_ND].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_SKB_MARK].name = "skb-mark"; + arr[OVS_KEY_ATTR_SKB_MARK].type = YNL_PT_U32; + arr[OVS_KEY_ATTR_TUNNEL].name = "tunnel"; + arr[OVS_KEY_ATTR_TUNNEL].type = YNL_PT_NEST; + arr[OVS_KEY_ATTR_TUNNEL].nest = &ovs_flow_tunnel_key_attrs_nest; + arr[OVS_KEY_ATTR_SCTP].name = "sctp"; + arr[OVS_KEY_ATTR_SCTP].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_TCP_FLAGS].name = "tcp-flags"; + arr[OVS_KEY_ATTR_TCP_FLAGS].type = YNL_PT_U16; + arr[OVS_KEY_ATTR_DP_HASH].name = "dp-hash"; + arr[OVS_KEY_ATTR_DP_HASH].type = YNL_PT_U32; + arr[OVS_KEY_ATTR_RECIRC_ID].name = "recirc-id"; + arr[OVS_KEY_ATTR_RECIRC_ID].type = YNL_PT_U32; + arr[OVS_KEY_ATTR_MPLS].name = "mpls"; + arr[OVS_KEY_ATTR_MPLS].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_CT_STATE].name = "ct-state"; + arr[OVS_KEY_ATTR_CT_STATE].type = YNL_PT_U32; + arr[OVS_KEY_ATTR_CT_ZONE].name = "ct-zone"; + arr[OVS_KEY_ATTR_CT_ZONE].type = YNL_PT_U16; + arr[OVS_KEY_ATTR_CT_MARK].name = "ct-mark"; + arr[OVS_KEY_ATTR_CT_MARK].type = YNL_PT_U32; + arr[OVS_KEY_ATTR_CT_LABELS].name = "ct-labels"; + arr[OVS_KEY_ATTR_CT_LABELS].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4].name = "ct-orig-tuple-ipv4"; + arr[OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6].name = "ct-orig-tuple-ipv6"; + arr[OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_NSH].name = "nsh"; + arr[OVS_KEY_ATTR_NSH].type = YNL_PT_NEST; + arr[OVS_KEY_ATTR_NSH].nest = &ovs_flow_ovs_nsh_key_attrs_nest; + arr[OVS_KEY_ATTR_PACKET_TYPE].name = "packet-type"; + arr[OVS_KEY_ATTR_PACKET_TYPE].type = YNL_PT_U32; + arr[OVS_KEY_ATTR_ND_EXTENSIONS].name = "nd-extensions"; + arr[OVS_KEY_ATTR_ND_EXTENSIONS].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_TUNNEL_INFO].name = "tunnel-info"; + arr[OVS_KEY_ATTR_TUNNEL_INFO].type = YNL_PT_BINARY; + arr[OVS_KEY_ATTR_IPV6_EXTHDRS].name = "ipv6-exthdrs"; + arr[OVS_KEY_ATTR_IPV6_EXTHDRS].type = YNL_PT_BINARY; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_key_attrs_nest = { + .max_attr = static_cast(OVS_KEY_ATTR_MAX), + .table = ovs_flow_key_attrs_policy.data(), +}; + +static std::array ovs_flow_sample_attrs_policy = []() { + std::array arr{}; + arr[OVS_SAMPLE_ATTR_PROBABILITY].name = "probability"; + arr[OVS_SAMPLE_ATTR_PROBABILITY].type = YNL_PT_U32; + arr[OVS_SAMPLE_ATTR_ACTIONS].name = "actions"; + arr[OVS_SAMPLE_ATTR_ACTIONS].type = YNL_PT_NEST; + arr[OVS_SAMPLE_ATTR_ACTIONS].nest = &ovs_flow_action_attrs_nest; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_sample_attrs_nest = { + .max_attr = static_cast(OVS_SAMPLE_ATTR_MAX), + .table = ovs_flow_sample_attrs_policy.data(), +}; + +static std::array ovs_flow_check_pkt_len_attrs_policy = []() { + std::array arr{}; + arr[OVS_CHECK_PKT_LEN_ATTR_PKT_LEN].name = "pkt-len"; + arr[OVS_CHECK_PKT_LEN_ATTR_PKT_LEN].type = YNL_PT_U16; + arr[OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER].name = "actions-if-greater"; + arr[OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER].type = YNL_PT_NEST; + arr[OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER].nest = &ovs_flow_action_attrs_nest; + arr[OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL].name = "actions-if-less-equal"; + arr[OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL].type = YNL_PT_NEST; + arr[OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL].nest = &ovs_flow_action_attrs_nest; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_check_pkt_len_attrs_nest = { + .max_attr = static_cast(OVS_CHECK_PKT_LEN_ATTR_MAX), + .table = ovs_flow_check_pkt_len_attrs_policy.data(), +}; + +static std::array ovs_flow_dec_ttl_attrs_policy = []() { + std::array arr{}; + arr[OVS_DEC_TTL_ATTR_ACTION].name = "action"; + arr[OVS_DEC_TTL_ATTR_ACTION].type = YNL_PT_NEST; + arr[OVS_DEC_TTL_ATTR_ACTION].nest = &ovs_flow_action_attrs_nest; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_dec_ttl_attrs_nest = { + .max_attr = static_cast(OVS_DEC_TTL_ATTR_MAX), + .table = ovs_flow_dec_ttl_attrs_policy.data(), +}; + +static std::array ovs_flow_action_attrs_policy = []() { + std::array arr{}; + arr[OVS_ACTION_ATTR_OUTPUT].name = "output"; + arr[OVS_ACTION_ATTR_OUTPUT].type = YNL_PT_U32; + arr[OVS_ACTION_ATTR_USERSPACE].name = "userspace"; + arr[OVS_ACTION_ATTR_USERSPACE].type = YNL_PT_NEST; + arr[OVS_ACTION_ATTR_USERSPACE].nest = &ovs_flow_userspace_attrs_nest; + arr[OVS_ACTION_ATTR_SET].name = "set"; + arr[OVS_ACTION_ATTR_SET].type = YNL_PT_NEST; + arr[OVS_ACTION_ATTR_SET].nest = &ovs_flow_key_attrs_nest; + arr[OVS_ACTION_ATTR_PUSH_VLAN].name = "push-vlan"; + arr[OVS_ACTION_ATTR_PUSH_VLAN].type = YNL_PT_BINARY; + arr[OVS_ACTION_ATTR_POP_VLAN].name = "pop-vlan"; + arr[OVS_ACTION_ATTR_POP_VLAN].type = YNL_PT_FLAG; + arr[OVS_ACTION_ATTR_SAMPLE].name = "sample"; + arr[OVS_ACTION_ATTR_SAMPLE].type = YNL_PT_NEST; + arr[OVS_ACTION_ATTR_SAMPLE].nest = &ovs_flow_sample_attrs_nest; + arr[OVS_ACTION_ATTR_RECIRC].name = "recirc"; + arr[OVS_ACTION_ATTR_RECIRC].type = YNL_PT_U32; + arr[OVS_ACTION_ATTR_HASH].name = "hash"; + arr[OVS_ACTION_ATTR_HASH].type = YNL_PT_BINARY; + arr[OVS_ACTION_ATTR_PUSH_MPLS].name = "push-mpls"; + arr[OVS_ACTION_ATTR_PUSH_MPLS].type = YNL_PT_BINARY; + arr[OVS_ACTION_ATTR_POP_MPLS].name = "pop-mpls"; + arr[OVS_ACTION_ATTR_POP_MPLS].type = YNL_PT_U16; + arr[OVS_ACTION_ATTR_SET_MASKED].name = "set-masked"; + arr[OVS_ACTION_ATTR_SET_MASKED].type = YNL_PT_NEST; + arr[OVS_ACTION_ATTR_SET_MASKED].nest = &ovs_flow_key_attrs_nest; + arr[OVS_ACTION_ATTR_CT].name = "ct"; + arr[OVS_ACTION_ATTR_CT].type = YNL_PT_NEST; + arr[OVS_ACTION_ATTR_CT].nest = &ovs_flow_ct_attrs_nest; + arr[OVS_ACTION_ATTR_TRUNC].name = "trunc"; + arr[OVS_ACTION_ATTR_TRUNC].type = YNL_PT_U32; + arr[OVS_ACTION_ATTR_PUSH_ETH].name = "push-eth"; + arr[OVS_ACTION_ATTR_PUSH_ETH].type = YNL_PT_BINARY; + arr[OVS_ACTION_ATTR_POP_ETH].name = "pop-eth"; + arr[OVS_ACTION_ATTR_POP_ETH].type = YNL_PT_FLAG; + arr[OVS_ACTION_ATTR_CT_CLEAR].name = "ct-clear"; + arr[OVS_ACTION_ATTR_CT_CLEAR].type = YNL_PT_FLAG; + arr[OVS_ACTION_ATTR_PUSH_NSH].name = "push-nsh"; + arr[OVS_ACTION_ATTR_PUSH_NSH].type = YNL_PT_NEST; + arr[OVS_ACTION_ATTR_PUSH_NSH].nest = &ovs_flow_ovs_nsh_key_attrs_nest; + arr[OVS_ACTION_ATTR_POP_NSH].name = "pop-nsh"; + arr[OVS_ACTION_ATTR_POP_NSH].type = YNL_PT_FLAG; + arr[OVS_ACTION_ATTR_METER].name = "meter"; + arr[OVS_ACTION_ATTR_METER].type = YNL_PT_U32; + arr[OVS_ACTION_ATTR_CLONE].name = "clone"; + arr[OVS_ACTION_ATTR_CLONE].type = YNL_PT_NEST; + arr[OVS_ACTION_ATTR_CLONE].nest = &ovs_flow_action_attrs_nest; + arr[OVS_ACTION_ATTR_CHECK_PKT_LEN].name = "check-pkt-len"; + arr[OVS_ACTION_ATTR_CHECK_PKT_LEN].type = YNL_PT_NEST; + arr[OVS_ACTION_ATTR_CHECK_PKT_LEN].nest = &ovs_flow_check_pkt_len_attrs_nest; + arr[OVS_ACTION_ATTR_ADD_MPLS].name = "add-mpls"; + arr[OVS_ACTION_ATTR_ADD_MPLS].type = YNL_PT_BINARY; + arr[OVS_ACTION_ATTR_DEC_TTL].name = "dec-ttl"; + arr[OVS_ACTION_ATTR_DEC_TTL].type = YNL_PT_NEST; + arr[OVS_ACTION_ATTR_DEC_TTL].nest = &ovs_flow_dec_ttl_attrs_nest; + arr[OVS_ACTION_ATTR_PSAMPLE].name = "psample"; + arr[OVS_ACTION_ATTR_PSAMPLE].type = YNL_PT_NEST; + arr[OVS_ACTION_ATTR_PSAMPLE].nest = &ovs_flow_psample_attrs_nest; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_action_attrs_nest = { + .max_attr = static_cast(OVS_ACTION_ATTR_MAX), + .table = ovs_flow_action_attrs_policy.data(), +}; + +static std::array ovs_flow_flow_attrs_policy = []() { + std::array arr{}; + arr[OVS_FLOW_ATTR_KEY].name = "key"; + arr[OVS_FLOW_ATTR_KEY].type = YNL_PT_NEST; + arr[OVS_FLOW_ATTR_KEY].nest = &ovs_flow_key_attrs_nest; + arr[OVS_FLOW_ATTR_ACTIONS].name = "actions"; + arr[OVS_FLOW_ATTR_ACTIONS].type = YNL_PT_NEST; + arr[OVS_FLOW_ATTR_ACTIONS].nest = &ovs_flow_action_attrs_nest; + arr[OVS_FLOW_ATTR_STATS].name = "stats"; + arr[OVS_FLOW_ATTR_STATS].type = YNL_PT_BINARY; + arr[OVS_FLOW_ATTR_TCP_FLAGS].name = "tcp-flags"; + arr[OVS_FLOW_ATTR_TCP_FLAGS].type = YNL_PT_U8; + arr[OVS_FLOW_ATTR_USED].name = "used"; + arr[OVS_FLOW_ATTR_USED].type = YNL_PT_U64; + arr[OVS_FLOW_ATTR_CLEAR].name = "clear"; + arr[OVS_FLOW_ATTR_CLEAR].type = YNL_PT_FLAG; + arr[OVS_FLOW_ATTR_MASK].name = "mask"; + arr[OVS_FLOW_ATTR_MASK].type = YNL_PT_NEST; + arr[OVS_FLOW_ATTR_MASK].nest = &ovs_flow_key_attrs_nest; + arr[OVS_FLOW_ATTR_PROBE].name = "probe"; + arr[OVS_FLOW_ATTR_PROBE].type = YNL_PT_BINARY; + arr[OVS_FLOW_ATTR_UFID].name = "ufid"; + arr[OVS_FLOW_ATTR_UFID].type = YNL_PT_BINARY; + arr[OVS_FLOW_ATTR_UFID_FLAGS].name = "ufid-flags"; + arr[OVS_FLOW_ATTR_UFID_FLAGS].type = YNL_PT_U32; + arr[OVS_FLOW_ATTR_PAD].name = "pad"; + arr[OVS_FLOW_ATTR_PAD].type = YNL_PT_BINARY; + return arr; +} (); + +struct ynl_policy_nest ovs_flow_flow_attrs_nest = { + .max_attr = static_cast(OVS_FLOW_ATTR_MAX), + .table = ovs_flow_flow_attrs_policy.data(), +}; + +/* Common nested types */ +int ovs_flow_ovs_nsh_key_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + const ovs_flow_ovs_nsh_key_attrs& obj); +int ovs_flow_ovs_nsh_key_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_userspace_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_userspace_attrs& obj); +int ovs_flow_userspace_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_psample_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_psample_attrs& obj); +int ovs_flow_psample_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_vxlan_ext_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_vxlan_ext_attrs& obj); +int ovs_flow_vxlan_ext_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_nat_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_nat_attrs& obj); +int ovs_flow_nat_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_tunnel_key_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_tunnel_key_attrs& obj); +int ovs_flow_tunnel_key_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_ct_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_ct_attrs& obj); +int ovs_flow_ct_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_key_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_key_attrs& obj); +int ovs_flow_key_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_sample_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_sample_attrs& obj); +int ovs_flow_sample_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_check_pkt_len_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + const ovs_flow_check_pkt_len_attrs& obj); +int ovs_flow_check_pkt_len_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_dec_ttl_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_dec_ttl_attrs& obj); +int ovs_flow_dec_ttl_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); +int ovs_flow_action_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_action_attrs& obj); +int ovs_flow_action_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested); + +int ovs_flow_ovs_nsh_key_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + const ovs_flow_ovs_nsh_key_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.base.size() > 0) { + ynl_attr_put(nlh, OVS_NSH_KEY_ATTR_BASE, obj.base.data(), obj.base.size()); + } + if (obj.md1.size() > 0) { + ynl_attr_put(nlh, OVS_NSH_KEY_ATTR_MD1, obj.md1.data(), obj.md1.size()); + } + if (obj.md2.size() > 0) { + ynl_attr_put(nlh, OVS_NSH_KEY_ATTR_MD2, obj.md2.data(), obj.md2.size()); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_ovs_nsh_key_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_ovs_nsh_key_attrs *dst = (ovs_flow_ovs_nsh_key_attrs *)yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_NSH_KEY_ATTR_BASE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->base.assign(data, data + len); + } else if (type == OVS_NSH_KEY_ATTR_MD1) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->md1.assign(data, data + len); + } else if (type == OVS_NSH_KEY_ATTR_MD2) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->md2.assign(data, data + len); + } + } + + return 0; +} + +int ovs_flow_userspace_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_userspace_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.pid.has_value()) { + ynl_attr_put_u32(nlh, OVS_USERSPACE_ATTR_PID, obj.pid.value()); + } + if (obj.userdata.size() > 0) { + ynl_attr_put(nlh, OVS_USERSPACE_ATTR_USERDATA, obj.userdata.data(), obj.userdata.size()); + } + if (obj.egress_tun_port.has_value()) { + ynl_attr_put_u32(nlh, OVS_USERSPACE_ATTR_EGRESS_TUN_PORT, obj.egress_tun_port.value()); + } + if (obj.actions) { + ynl_attr_put(nlh, OVS_USERSPACE_ATTR_ACTIONS, NULL, 0); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_userspace_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_userspace_attrs *dst = (ovs_flow_userspace_attrs *)yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_USERSPACE_ATTR_PID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->pid = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_USERSPACE_ATTR_USERDATA) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->userdata.assign(data, data + len); + } else if (type == OVS_USERSPACE_ATTR_EGRESS_TUN_PORT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->egress_tun_port = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_USERSPACE_ATTR_ACTIONS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } + } + + return 0; +} + +int ovs_flow_psample_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_psample_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.group.has_value()) { + ynl_attr_put_u32(nlh, OVS_PSAMPLE_ATTR_GROUP, obj.group.value()); + } + if (obj.cookie.size() > 0) { + ynl_attr_put(nlh, OVS_PSAMPLE_ATTR_COOKIE, obj.cookie.data(), obj.cookie.size()); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_psample_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_psample_attrs *dst = (ovs_flow_psample_attrs *)yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_PSAMPLE_ATTR_GROUP) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->group = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_PSAMPLE_ATTR_COOKIE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->cookie.assign(data, data + len); + } + } + + return 0; +} + +int ovs_flow_vxlan_ext_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_vxlan_ext_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.gbp.has_value()) { + ynl_attr_put_u32(nlh, OVS_VXLAN_EXT_GBP, obj.gbp.value()); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_vxlan_ext_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_vxlan_ext_attrs *dst = (ovs_flow_vxlan_ext_attrs *)yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_VXLAN_EXT_GBP) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->gbp = (__u32)ynl_attr_get_u32(attr); + } + } + + return 0; +} + +int ovs_flow_nat_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_nat_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.src) { + ynl_attr_put(nlh, OVS_NAT_ATTR_SRC, NULL, 0); + } + if (obj.dst) { + ynl_attr_put(nlh, OVS_NAT_ATTR_DST, NULL, 0); + } + if (obj.ip_min.size() > 0) { + ynl_attr_put(nlh, OVS_NAT_ATTR_IP_MIN, obj.ip_min.data(), obj.ip_min.size()); + } + if (obj.ip_max.size() > 0) { + ynl_attr_put(nlh, OVS_NAT_ATTR_IP_MAX, obj.ip_max.data(), obj.ip_max.size()); + } + if (obj.proto_min.has_value()) { + ynl_attr_put_u16(nlh, OVS_NAT_ATTR_PROTO_MIN, obj.proto_min.value()); + } + if (obj.proto_max.has_value()) { + ynl_attr_put_u16(nlh, OVS_NAT_ATTR_PROTO_MAX, obj.proto_max.value()); + } + if (obj.persistent) { + ynl_attr_put(nlh, OVS_NAT_ATTR_PERSISTENT, NULL, 0); + } + if (obj.proto_hash) { + ynl_attr_put(nlh, OVS_NAT_ATTR_PROTO_HASH, NULL, 0); + } + if (obj.proto_random) { + ynl_attr_put(nlh, OVS_NAT_ATTR_PROTO_RANDOM, NULL, 0); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_nat_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_nat_attrs *dst = (ovs_flow_nat_attrs *)yarg->data; + const struct nlattr *attr; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_NAT_ATTR_SRC) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_NAT_ATTR_DST) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_NAT_ATTR_IP_MIN) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->ip_min.assign(data, data + len); + } else if (type == OVS_NAT_ATTR_IP_MAX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->ip_max.assign(data, data + len); + } else if (type == OVS_NAT_ATTR_PROTO_MIN) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->proto_min = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_NAT_ATTR_PROTO_MAX) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->proto_max = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_NAT_ATTR_PERSISTENT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_NAT_ATTR_PROTO_HASH) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_NAT_ATTR_PROTO_RANDOM) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } + } + + return 0; +} + +int ovs_flow_tunnel_key_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_tunnel_key_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.id.has_value()) { + ynl_attr_put_u64(nlh, OVS_TUNNEL_KEY_ATTR_ID, obj.id.value()); + } + if (obj.ipv4_src.has_value()) { + ynl_attr_put_u32(nlh, OVS_TUNNEL_KEY_ATTR_IPV4_SRC, obj.ipv4_src.value()); + } + if (obj.ipv4_dst.has_value()) { + ynl_attr_put_u32(nlh, OVS_TUNNEL_KEY_ATTR_IPV4_DST, obj.ipv4_dst.value()); + } + if (obj.tos.has_value()) { + ynl_attr_put_u8(nlh, OVS_TUNNEL_KEY_ATTR_TOS, obj.tos.value()); + } + if (obj.ttl.has_value()) { + ynl_attr_put_u8(nlh, OVS_TUNNEL_KEY_ATTR_TTL, obj.ttl.value()); + } + if (obj.dont_fragment) { + ynl_attr_put(nlh, OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT, NULL, 0); + } + if (obj.csum) { + ynl_attr_put(nlh, OVS_TUNNEL_KEY_ATTR_CSUM, NULL, 0); + } + if (obj.oam) { + ynl_attr_put(nlh, OVS_TUNNEL_KEY_ATTR_OAM, NULL, 0); + } + if (obj.geneve_opts.size() > 0) { + ynl_attr_put(nlh, OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS, obj.geneve_opts.data(), obj.geneve_opts.size()); + } + if (obj.tp_src.has_value()) { + ynl_attr_put_u16(nlh, OVS_TUNNEL_KEY_ATTR_TP_SRC, obj.tp_src.value()); + } + if (obj.tp_dst.has_value()) { + ynl_attr_put_u16(nlh, OVS_TUNNEL_KEY_ATTR_TP_DST, obj.tp_dst.value()); + } + if (obj.vxlan_opts.has_value()) { + ovs_flow_vxlan_ext_attrs_put(nlh, OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS, obj.vxlan_opts.value()); + } + if (obj.ipv6_src.size() > 0) { + ynl_attr_put(nlh, OVS_TUNNEL_KEY_ATTR_IPV6_SRC, obj.ipv6_src.data(), obj.ipv6_src.size()); + } + if (obj.ipv6_dst.size() > 0) { + ynl_attr_put(nlh, OVS_TUNNEL_KEY_ATTR_IPV6_DST, obj.ipv6_dst.data(), obj.ipv6_dst.size()); + } + if (obj.pad.size() > 0) { + ynl_attr_put(nlh, OVS_TUNNEL_KEY_ATTR_PAD, obj.pad.data(), obj.pad.size()); + } + if (obj.erspan_opts.size() > 0) { + ynl_attr_put(nlh, OVS_TUNNEL_KEY_ATTR_ERSPAN_OPTS, obj.erspan_opts.data(), obj.erspan_opts.size()); + } + if (obj.ipv4_info_bridge) { + ynl_attr_put(nlh, OVS_TUNNEL_KEY_ATTR_IPV4_INFO_BRIDGE, NULL, 0); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_tunnel_key_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_tunnel_key_attrs *dst = (ovs_flow_tunnel_key_attrs *)yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_TUNNEL_KEY_ATTR_ID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->id = (__u64)ynl_attr_get_u64(attr); + } else if (type == OVS_TUNNEL_KEY_ATTR_IPV4_SRC) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->ipv4_src = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_TUNNEL_KEY_ATTR_IPV4_DST) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->ipv4_dst = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_TUNNEL_KEY_ATTR_TOS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tos = (__u8)ynl_attr_get_u8(attr); + } else if (type == OVS_TUNNEL_KEY_ATTR_TTL) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->ttl = (__u8)ynl_attr_get_u8(attr); + } else if (type == OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_TUNNEL_KEY_ATTR_CSUM) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_TUNNEL_KEY_ATTR_OAM) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->geneve_opts.assign(data, data + len); + } else if (type == OVS_TUNNEL_KEY_ATTR_TP_SRC) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tp_src = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_TUNNEL_KEY_ATTR_TP_DST) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tp_dst = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_vxlan_ext_attrs_nest; + parg.data = &dst->vxlan_opts.emplace(); + if (ovs_flow_vxlan_ext_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_TUNNEL_KEY_ATTR_IPV6_SRC) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->ipv6_src.assign(data, data + len); + } else if (type == OVS_TUNNEL_KEY_ATTR_IPV6_DST) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->ipv6_dst.assign(data, data + len); + } else if (type == OVS_TUNNEL_KEY_ATTR_PAD) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->pad.assign(data, data + len); + } else if (type == OVS_TUNNEL_KEY_ATTR_ERSPAN_OPTS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->erspan_opts.assign(data, data + len); + } else if (type == OVS_TUNNEL_KEY_ATTR_IPV4_INFO_BRIDGE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } + } + + return 0; +} + +int ovs_flow_ct_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_ct_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.commit) { + ynl_attr_put(nlh, OVS_CT_ATTR_COMMIT, NULL, 0); + } + if (obj.zone.has_value()) { + ynl_attr_put_u16(nlh, OVS_CT_ATTR_ZONE, obj.zone.value()); + } + if (obj.mark.size() > 0) { + ynl_attr_put(nlh, OVS_CT_ATTR_MARK, obj.mark.data(), obj.mark.size()); + } + if (obj.labels.size() > 0) { + ynl_attr_put(nlh, OVS_CT_ATTR_LABELS, obj.labels.data(), obj.labels.size()); + } + if (obj.helper.size() > 0) { + ynl_attr_put_str(nlh, OVS_CT_ATTR_HELPER, obj.helper.data()); + } + if (obj.nat.has_value()) { + ovs_flow_nat_attrs_put(nlh, OVS_CT_ATTR_NAT, obj.nat.value()); + } + if (obj.force_commit) { + ynl_attr_put(nlh, OVS_CT_ATTR_FORCE_COMMIT, NULL, 0); + } + if (obj.eventmask.has_value()) { + ynl_attr_put_u32(nlh, OVS_CT_ATTR_EVENTMASK, obj.eventmask.value()); + } + if (obj.timeout.size() > 0) { + ynl_attr_put_str(nlh, OVS_CT_ATTR_TIMEOUT, obj.timeout.data()); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_ct_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_ct_attrs *dst = (ovs_flow_ct_attrs *)yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_CT_ATTR_COMMIT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_CT_ATTR_ZONE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->zone = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_CT_ATTR_MARK) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->mark.assign(data, data + len); + } else if (type == OVS_CT_ATTR_LABELS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->labels.assign(data, data + len); + } else if (type == OVS_CT_ATTR_HELPER) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->helper.assign(ynl_attr_get_str(attr)); + } else if (type == OVS_CT_ATTR_NAT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_nat_attrs_nest; + parg.data = &dst->nat.emplace(); + if (ovs_flow_nat_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_CT_ATTR_FORCE_COMMIT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_CT_ATTR_EVENTMASK) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->eventmask = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_CT_ATTR_TIMEOUT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->timeout.assign(ynl_attr_get_str(attr)); + } + } + + return 0; +} + +int ovs_flow_key_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_key_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + for (unsigned int i = 0; i < obj.encap.size(); i++) { + ovs_flow_key_attrs_put(nlh, OVS_KEY_ATTR_ENCAP, obj.encap[i]); + } + if (obj.priority.has_value()) { + ynl_attr_put_u32(nlh, OVS_KEY_ATTR_PRIORITY, obj.priority.value()); + } + if (obj.in_port.has_value()) { + ynl_attr_put_u32(nlh, OVS_KEY_ATTR_IN_PORT, obj.in_port.value()); + } + if (obj.ethernet) { + ynl_attr_put(nlh, OVS_KEY_ATTR_ETHERNET, &*obj.ethernet, sizeof(struct ovs_key_ethernet)); + } + if (obj.vlan.has_value()) { + ynl_attr_put_u16(nlh, OVS_KEY_ATTR_VLAN, obj.vlan.value()); + } + if (obj.ethertype.has_value()) { + ynl_attr_put_u16(nlh, OVS_KEY_ATTR_ETHERTYPE, obj.ethertype.value()); + } + if (obj.ipv4) { + ynl_attr_put(nlh, OVS_KEY_ATTR_IPV4, &*obj.ipv4, sizeof(struct ovs_key_ipv4)); + } + if (obj.ipv6) { + ynl_attr_put(nlh, OVS_KEY_ATTR_IPV6, &*obj.ipv6, sizeof(struct ovs_key_ipv6)); + } + if (obj.tcp) { + ynl_attr_put(nlh, OVS_KEY_ATTR_TCP, &*obj.tcp, sizeof(struct ovs_key_tcp)); + } + if (obj.udp) { + ynl_attr_put(nlh, OVS_KEY_ATTR_UDP, &*obj.udp, sizeof(struct ovs_key_udp)); + } + if (obj.icmp) { + ynl_attr_put(nlh, OVS_KEY_ATTR_ICMP, &*obj.icmp, sizeof(struct ovs_key_icmp)); + } + if (obj.icmpv6) { + ynl_attr_put(nlh, OVS_KEY_ATTR_ICMPV6, &*obj.icmpv6, sizeof(struct ovs_key_icmp)); + } + if (obj.arp) { + ynl_attr_put(nlh, OVS_KEY_ATTR_ARP, &*obj.arp, sizeof(struct ovs_key_arp)); + } + if (obj.nd) { + ynl_attr_put(nlh, OVS_KEY_ATTR_ND, &*obj.nd, sizeof(struct ovs_key_nd)); + } + if (obj.skb_mark.has_value()) { + ynl_attr_put_u32(nlh, OVS_KEY_ATTR_SKB_MARK, obj.skb_mark.value()); + } + if (obj.tunnel.has_value()) { + ovs_flow_tunnel_key_attrs_put(nlh, OVS_KEY_ATTR_TUNNEL, obj.tunnel.value()); + } + if (obj.sctp) { + ynl_attr_put(nlh, OVS_KEY_ATTR_SCTP, &*obj.sctp, sizeof(struct ovs_key_sctp)); + } + if (obj.tcp_flags.has_value()) { + ynl_attr_put_u16(nlh, OVS_KEY_ATTR_TCP_FLAGS, obj.tcp_flags.value()); + } + if (obj.dp_hash.has_value()) { + ynl_attr_put_u32(nlh, OVS_KEY_ATTR_DP_HASH, obj.dp_hash.value()); + } + if (obj.recirc_id.has_value()) { + ynl_attr_put_u32(nlh, OVS_KEY_ATTR_RECIRC_ID, obj.recirc_id.value()); + } + if (obj.mpls) { + ynl_attr_put(nlh, OVS_KEY_ATTR_MPLS, &*obj.mpls, sizeof(struct ovs_key_mpls)); + } + if (obj.ct_state.has_value()) { + ynl_attr_put_u32(nlh, OVS_KEY_ATTR_CT_STATE, obj.ct_state.value()); + } + if (obj.ct_zone.has_value()) { + ynl_attr_put_u16(nlh, OVS_KEY_ATTR_CT_ZONE, obj.ct_zone.value()); + } + if (obj.ct_mark.has_value()) { + ynl_attr_put_u32(nlh, OVS_KEY_ATTR_CT_MARK, obj.ct_mark.value()); + } + if (obj.ct_labels.size() > 0) { + ynl_attr_put(nlh, OVS_KEY_ATTR_CT_LABELS, obj.ct_labels.data(), obj.ct_labels.size()); + } + if (obj.ct_orig_tuple_ipv4) { + ynl_attr_put(nlh, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4, &*obj.ct_orig_tuple_ipv4, sizeof(struct ovs_key_ct_tuple_ipv4)); + } + if (obj.ct_orig_tuple_ipv6.size() > 0) { + ynl_attr_put(nlh, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6, obj.ct_orig_tuple_ipv6.data(), obj.ct_orig_tuple_ipv6.size()); + } + if (obj.nsh.has_value()) { + ovs_flow_ovs_nsh_key_attrs_put(nlh, OVS_KEY_ATTR_NSH, obj.nsh.value()); + } + if (obj.packet_type.has_value()) { + ynl_attr_put_u32(nlh, OVS_KEY_ATTR_PACKET_TYPE, obj.packet_type.value()); + } + if (obj.nd_extensions.size() > 0) { + ynl_attr_put(nlh, OVS_KEY_ATTR_ND_EXTENSIONS, obj.nd_extensions.data(), obj.nd_extensions.size()); + } + if (obj.tunnel_info.size() > 0) { + ynl_attr_put(nlh, OVS_KEY_ATTR_TUNNEL_INFO, obj.tunnel_info.data(), obj.tunnel_info.size()); + } + if (obj.ipv6_exthdrs) { + ynl_attr_put(nlh, OVS_KEY_ATTR_IPV6_EXTHDRS, &*obj.ipv6_exthdrs, sizeof(struct ovs_key_ipv6_exthdrs)); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_key_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_key_attrs *dst = (ovs_flow_key_attrs *)yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_KEY_ATTR_ENCAP) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_key_attrs_nest; + dst->encap.emplace_back(); + parg.data = &dst->encap.back(); + if (ovs_flow_key_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_KEY_ATTR_PRIORITY) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->priority = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_KEY_ATTR_IN_PORT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->in_port = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_KEY_ATTR_ETHERNET) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_ethernet); + dst->ethernet.emplace(); + memcpy(&*dst->ethernet, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_VLAN) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->vlan = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_KEY_ATTR_ETHERTYPE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->ethertype = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_KEY_ATTR_IPV4) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_ipv4); + dst->ipv4.emplace(); + memcpy(&*dst->ipv4, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_IPV6) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_ipv6); + dst->ipv6.emplace(); + memcpy(&*dst->ipv6, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_TCP) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_tcp); + dst->tcp.emplace(); + memcpy(&*dst->tcp, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_UDP) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_udp); + dst->udp.emplace(); + memcpy(&*dst->udp, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_ICMP) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_icmp); + dst->icmp.emplace(); + memcpy(&*dst->icmp, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_ICMPV6) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_icmp); + dst->icmpv6.emplace(); + memcpy(&*dst->icmpv6, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_ARP) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_arp); + dst->arp.emplace(); + memcpy(&*dst->arp, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_ND) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_nd); + dst->nd.emplace(); + memcpy(&*dst->nd, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_SKB_MARK) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->skb_mark = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_KEY_ATTR_TUNNEL) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_tunnel_key_attrs_nest; + parg.data = &dst->tunnel.emplace(); + if (ovs_flow_tunnel_key_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_KEY_ATTR_SCTP) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_sctp); + dst->sctp.emplace(); + memcpy(&*dst->sctp, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_TCP_FLAGS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->tcp_flags = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_KEY_ATTR_DP_HASH) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->dp_hash = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_KEY_ATTR_RECIRC_ID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->recirc_id = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_KEY_ATTR_MPLS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_mpls); + dst->mpls.emplace(); + memcpy(&*dst->mpls, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_CT_STATE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->ct_state = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_KEY_ATTR_CT_ZONE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->ct_zone = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_KEY_ATTR_CT_MARK) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->ct_mark = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_KEY_ATTR_CT_LABELS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->ct_labels.assign(data, data + len); + } else if (type == OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_ct_tuple_ipv4); + dst->ct_orig_tuple_ipv4.emplace(); + memcpy(&*dst->ct_orig_tuple_ipv4, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->ct_orig_tuple_ipv6.assign(data, data + len); + } else if (type == OVS_KEY_ATTR_NSH) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_ovs_nsh_key_attrs_nest; + parg.data = &dst->nsh.emplace(); + if (ovs_flow_ovs_nsh_key_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_KEY_ATTR_PACKET_TYPE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->packet_type = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_KEY_ATTR_ND_EXTENSIONS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->nd_extensions.assign(data, data + len); + } else if (type == OVS_KEY_ATTR_TUNNEL_INFO) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->tunnel_info.assign(data, data + len); + } else if (type == OVS_KEY_ATTR_IPV6_EXTHDRS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_key_ipv6_exthdrs); + dst->ipv6_exthdrs.emplace(); + memcpy(&*dst->ipv6_exthdrs, ynl_attr_data(attr), std::min(struct_sz, len)); + } + } + + return 0; +} + +int ovs_flow_sample_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_sample_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.probability.has_value()) { + ynl_attr_put_u32(nlh, OVS_SAMPLE_ATTR_PROBABILITY, obj.probability.value()); + } + for (unsigned int i = 0; i < obj.actions.size(); i++) { + ovs_flow_action_attrs_put(nlh, OVS_SAMPLE_ATTR_ACTIONS, obj.actions[i]); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_sample_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_sample_attrs *dst = (ovs_flow_sample_attrs *)yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_SAMPLE_ATTR_PROBABILITY) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->probability = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_SAMPLE_ATTR_ACTIONS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_action_attrs_nest; + dst->actions.emplace_back(); + parg.data = &dst->actions.back(); + if (ovs_flow_action_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } + } + + return 0; +} + +int ovs_flow_check_pkt_len_attrs_put(struct nlmsghdr *nlh, + unsigned int attr_type, + const ovs_flow_check_pkt_len_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.pkt_len.has_value()) { + ynl_attr_put_u16(nlh, OVS_CHECK_PKT_LEN_ATTR_PKT_LEN, obj.pkt_len.value()); + } + for (unsigned int i = 0; i < obj.actions_if_greater.size(); i++) { + ovs_flow_action_attrs_put(nlh, OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER, obj.actions_if_greater[i]); + } + for (unsigned int i = 0; i < obj.actions_if_less_equal.size(); i++) { + ovs_flow_action_attrs_put(nlh, OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL, obj.actions_if_less_equal[i]); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_check_pkt_len_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_check_pkt_len_attrs *dst = (ovs_flow_check_pkt_len_attrs *)yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_CHECK_PKT_LEN_ATTR_PKT_LEN) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->pkt_len = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_GREATER) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_action_attrs_nest; + dst->actions_if_greater.emplace_back(); + parg.data = &dst->actions_if_greater.back(); + if (ovs_flow_action_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_CHECK_PKT_LEN_ATTR_ACTIONS_IF_LESS_EQUAL) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_action_attrs_nest; + dst->actions_if_less_equal.emplace_back(); + parg.data = &dst->actions_if_less_equal.back(); + if (ovs_flow_action_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } + } + + return 0; +} + +int ovs_flow_dec_ttl_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_dec_ttl_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + for (unsigned int i = 0; i < obj.action.size(); i++) { + ovs_flow_action_attrs_put(nlh, OVS_DEC_TTL_ATTR_ACTION, obj.action[i]); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_dec_ttl_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_dec_ttl_attrs *dst = (ovs_flow_dec_ttl_attrs *)yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_DEC_TTL_ATTR_ACTION) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_action_attrs_nest; + dst->action.emplace_back(); + parg.data = &dst->action.back(); + if (ovs_flow_action_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } + } + + return 0; +} + +int ovs_flow_action_attrs_put(struct nlmsghdr *nlh, unsigned int attr_type, + const ovs_flow_action_attrs& obj) +{ + struct nlattr *nest; + + nest = ynl_attr_nest_start(nlh, attr_type); + if (obj.output.has_value()) { + ynl_attr_put_u32(nlh, OVS_ACTION_ATTR_OUTPUT, obj.output.value()); + } + if (obj.userspace.has_value()) { + ovs_flow_userspace_attrs_put(nlh, OVS_ACTION_ATTR_USERSPACE, obj.userspace.value()); + } + for (unsigned int i = 0; i < obj.set.size(); i++) { + ovs_flow_key_attrs_put(nlh, OVS_ACTION_ATTR_SET, obj.set[i]); + } + if (obj.push_vlan) { + ynl_attr_put(nlh, OVS_ACTION_ATTR_PUSH_VLAN, &*obj.push_vlan, sizeof(struct ovs_action_push_vlan)); + } + if (obj.pop_vlan) { + ynl_attr_put(nlh, OVS_ACTION_ATTR_POP_VLAN, NULL, 0); + } + if (obj.sample.has_value()) { + ovs_flow_sample_attrs_put(nlh, OVS_ACTION_ATTR_SAMPLE, obj.sample.value()); + } + if (obj.recirc.has_value()) { + ynl_attr_put_u32(nlh, OVS_ACTION_ATTR_RECIRC, obj.recirc.value()); + } + if (obj.hash) { + ynl_attr_put(nlh, OVS_ACTION_ATTR_HASH, &*obj.hash, sizeof(struct ovs_action_hash)); + } + if (obj.push_mpls) { + ynl_attr_put(nlh, OVS_ACTION_ATTR_PUSH_MPLS, &*obj.push_mpls, sizeof(struct ovs_action_push_mpls)); + } + if (obj.pop_mpls.has_value()) { + ynl_attr_put_u16(nlh, OVS_ACTION_ATTR_POP_MPLS, obj.pop_mpls.value()); + } + for (unsigned int i = 0; i < obj.set_masked.size(); i++) { + ovs_flow_key_attrs_put(nlh, OVS_ACTION_ATTR_SET_MASKED, obj.set_masked[i]); + } + if (obj.ct.has_value()) { + ovs_flow_ct_attrs_put(nlh, OVS_ACTION_ATTR_CT, obj.ct.value()); + } + if (obj.trunc.has_value()) { + ynl_attr_put_u32(nlh, OVS_ACTION_ATTR_TRUNC, obj.trunc.value()); + } + if (obj.push_eth.size() > 0) { + ynl_attr_put(nlh, OVS_ACTION_ATTR_PUSH_ETH, obj.push_eth.data(), obj.push_eth.size()); + } + if (obj.pop_eth) { + ynl_attr_put(nlh, OVS_ACTION_ATTR_POP_ETH, NULL, 0); + } + if (obj.ct_clear) { + ynl_attr_put(nlh, OVS_ACTION_ATTR_CT_CLEAR, NULL, 0); + } + if (obj.push_nsh.has_value()) { + ovs_flow_ovs_nsh_key_attrs_put(nlh, OVS_ACTION_ATTR_PUSH_NSH, obj.push_nsh.value()); + } + if (obj.pop_nsh) { + ynl_attr_put(nlh, OVS_ACTION_ATTR_POP_NSH, NULL, 0); + } + if (obj.meter.has_value()) { + ynl_attr_put_u32(nlh, OVS_ACTION_ATTR_METER, obj.meter.value()); + } + for (unsigned int i = 0; i < obj.clone.size(); i++) { + ovs_flow_action_attrs_put(nlh, OVS_ACTION_ATTR_CLONE, obj.clone[i]); + } + if (obj.check_pkt_len.has_value()) { + ovs_flow_check_pkt_len_attrs_put(nlh, OVS_ACTION_ATTR_CHECK_PKT_LEN, obj.check_pkt_len.value()); + } + if (obj.add_mpls) { + ynl_attr_put(nlh, OVS_ACTION_ATTR_ADD_MPLS, &*obj.add_mpls, sizeof(struct ovs_action_add_mpls)); + } + if (obj.dec_ttl.has_value()) { + ovs_flow_dec_ttl_attrs_put(nlh, OVS_ACTION_ATTR_DEC_TTL, obj.dec_ttl.value()); + } + if (obj.psample.has_value()) { + ovs_flow_psample_attrs_put(nlh, OVS_ACTION_ATTR_PSAMPLE, obj.psample.value()); + } + ynl_attr_nest_end(nlh, nest); + + return 0; +} + +int ovs_flow_action_attrs_parse(struct ynl_parse_arg *yarg, + const struct nlattr *nested) +{ + ovs_flow_action_attrs *dst = (ovs_flow_action_attrs *)yarg->data; + const struct nlattr *attr; + struct ynl_parse_arg parg; + + parg.ys = yarg->ys; + + ynl_attr_for_each_nested(attr, nested) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_ACTION_ATTR_OUTPUT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->output = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_ACTION_ATTR_USERSPACE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_userspace_attrs_nest; + parg.data = &dst->userspace.emplace(); + if (ovs_flow_userspace_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_SET) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_key_attrs_nest; + dst->set.emplace_back(); + parg.data = &dst->set.back(); + if (ovs_flow_key_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_PUSH_VLAN) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_action_push_vlan); + dst->push_vlan.emplace(); + memcpy(&*dst->push_vlan, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_ACTION_ATTR_POP_VLAN) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_SAMPLE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_sample_attrs_nest; + parg.data = &dst->sample.emplace(); + if (ovs_flow_sample_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_RECIRC) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->recirc = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_ACTION_ATTR_HASH) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_action_hash); + dst->hash.emplace(); + memcpy(&*dst->hash, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_ACTION_ATTR_PUSH_MPLS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_action_push_mpls); + dst->push_mpls.emplace(); + memcpy(&*dst->push_mpls, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_ACTION_ATTR_POP_MPLS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->pop_mpls = (__u16)ynl_attr_get_u16(attr); + } else if (type == OVS_ACTION_ATTR_SET_MASKED) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_key_attrs_nest; + dst->set_masked.emplace_back(); + parg.data = &dst->set_masked.back(); + if (ovs_flow_key_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_CT) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_ct_attrs_nest; + parg.data = &dst->ct.emplace(); + if (ovs_flow_ct_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_TRUNC) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->trunc = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_ACTION_ATTR_PUSH_ETH) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->push_eth.assign(data, data + len); + } else if (type == OVS_ACTION_ATTR_POP_ETH) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_CT_CLEAR) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_PUSH_NSH) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_ovs_nsh_key_attrs_nest; + parg.data = &dst->push_nsh.emplace(); + if (ovs_flow_ovs_nsh_key_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_POP_NSH) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_METER) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + dst->meter = (__u32)ynl_attr_get_u32(attr); + } else if (type == OVS_ACTION_ATTR_CLONE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_action_attrs_nest; + dst->clone.emplace_back(); + parg.data = &dst->clone.back(); + if (ovs_flow_action_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_CHECK_PKT_LEN) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_check_pkt_len_attrs_nest; + parg.data = &dst->check_pkt_len.emplace(); + if (ovs_flow_check_pkt_len_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_ADD_MPLS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_action_add_mpls); + dst->add_mpls.emplace(); + memcpy(&*dst->add_mpls, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_ACTION_ATTR_DEC_TTL) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_dec_ttl_attrs_nest; + parg.data = &dst->dec_ttl.emplace(); + if (ovs_flow_dec_ttl_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_ACTION_ATTR_PSAMPLE) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_psample_attrs_nest; + parg.data = &dst->psample.emplace(); + if (ovs_flow_psample_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } + } + + return 0; +} + +/* ============== OVS_FLOW_CMD_GET ============== */ +/* OVS_FLOW_CMD_GET - do */ +int ovs_flow_get_rsp_parse(const struct nlmsghdr *nlh, + struct ynl_parse_arg *yarg) +{ + const struct nlattr *attr; + struct ynl_parse_arg parg; + ovs_flow_get_rsp *dst; + void *hdr; + + dst = (ovs_flow_get_rsp*)yarg->data; + parg.ys = yarg->ys; + + hdr = ynl_nlmsg_data_offset(nlh, sizeof(struct genlmsghdr)); + memcpy(&dst->_hdr, hdr, sizeof(struct ovs_header)); + + ynl_attr_for_each(attr, nlh, yarg->ys->family->hdr_len) { + unsigned int type = ynl_attr_type(attr); + + if (type == OVS_FLOW_ATTR_KEY) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_key_attrs_nest; + parg.data = &dst->key.emplace(); + if (ovs_flow_key_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_FLOW_ATTR_UFID) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + __u8 *data = (__u8*)ynl_attr_data(attr); + dst->ufid.assign(data, data + len); + } else if (type == OVS_FLOW_ATTR_MASK) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_key_attrs_nest; + parg.data = &dst->mask.emplace(); + if (ovs_flow_key_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } else if (type == OVS_FLOW_ATTR_STATS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + unsigned int len = ynl_attr_data_len(attr); + unsigned int struct_sz = sizeof(struct ovs_flow_stats); + dst->stats.emplace(); + memcpy(&*dst->stats, ynl_attr_data(attr), std::min(struct_sz, len)); + } else if (type == OVS_FLOW_ATTR_ACTIONS) { + if (ynl_attr_validate(yarg, attr)) { + return YNL_PARSE_CB_ERROR; + } + + parg.rsp_policy = &ovs_flow_action_attrs_nest; + parg.data = &dst->actions.emplace(); + if (ovs_flow_action_attrs_parse(&parg, attr)) { + return YNL_PARSE_CB_ERROR; + } + } + } + + return YNL_PARSE_CB_OK; +} + +std::unique_ptr +ovs_flow_get(ynl_cpp::ynl_socket& ys, ovs_flow_get_req& req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + std::unique_ptr rsp; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, OVS_FLOW_CMD_GET, 1); + ((struct ynl_sock*)ys)->req_policy = &ovs_flow_flow_attrs_nest; + yrs.yarg.rsp_policy = &ovs_flow_flow_attrs_nest; + + hdr_len = sizeof(req._hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req._hdr, hdr_len); + + if (req.key.has_value()) { + ovs_flow_key_attrs_put(nlh, OVS_FLOW_ATTR_KEY, req.key.value()); + } + if (req.ufid.size() > 0) { + ynl_attr_put(nlh, OVS_FLOW_ATTR_UFID, req.ufid.data(), req.ufid.size()); + } + if (req.ufid_flags.has_value()) { + ynl_attr_put_u32(nlh, OVS_FLOW_ATTR_UFID_FLAGS, req.ufid_flags.value()); + } + + rsp.reset(new ovs_flow_get_rsp()); + yrs.yarg.data = rsp.get(); + yrs.cb = ovs_flow_get_rsp_parse; + yrs.rsp_cmd = OVS_FLOW_CMD_GET; + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) { + return nullptr; + } + + return rsp; +} + +/* OVS_FLOW_CMD_GET - dump */ +std::unique_ptr +ovs_flow_get_dump(ynl_cpp::ynl_socket& ys, ovs_flow_get_req_dump& req) +{ + struct ynl_dump_no_alloc_state yds = {}; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + auto ret = std::make_unique(); + yds.yarg.ys = ys; + yds.yarg.rsp_policy = &ovs_flow_flow_attrs_nest; + yds.yarg.data = ret.get(); + yds.alloc_cb = [](void* arg)->void* {return &(static_cast(arg)->objs.emplace_back());}; + yds.cb = ovs_flow_get_rsp_parse; + yds.rsp_cmd = OVS_FLOW_CMD_GET; + + nlh = ynl_gemsg_start_dump(ys, ((struct ynl_sock*)ys)->family_id, OVS_FLOW_CMD_GET, 1); + hdr_len = sizeof(req._hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req._hdr, hdr_len); + + ((struct ynl_sock*)ys)->req_policy = &ovs_flow_flow_attrs_nest; + + if (req.key.has_value()) { + ovs_flow_key_attrs_put(nlh, OVS_FLOW_ATTR_KEY, req.key.value()); + } + if (req.ufid.size() > 0) { + ynl_attr_put(nlh, OVS_FLOW_ATTR_UFID, req.ufid.data(), req.ufid.size()); + } + if (req.ufid_flags.has_value()) { + ynl_attr_put_u32(nlh, OVS_FLOW_ATTR_UFID_FLAGS, req.ufid_flags.value()); + } + + err = ynl_exec_dump_no_alloc(ys, nlh, &yds); + if (err < 0) { + return nullptr; + } + + return ret; +} + +/* ============== OVS_FLOW_CMD_NEW ============== */ +/* OVS_FLOW_CMD_NEW - do */ +int ovs_flow_new(ynl_cpp::ynl_socket& ys, ovs_flow_new_req& req) +{ + struct ynl_req_state yrs = { .yarg = { .ys = ys, }, }; + struct nlmsghdr *nlh; + size_t hdr_len; + void *hdr; + int err; + + nlh = ynl_gemsg_start_req(ys, ((struct ynl_sock*)ys)->family_id, OVS_FLOW_CMD_NEW, 1); + ((struct ynl_sock*)ys)->req_policy = &ovs_flow_flow_attrs_nest; + + hdr_len = sizeof(req._hdr); + hdr = ynl_nlmsg_put_extra_header(nlh, hdr_len); + memcpy(hdr, &req._hdr, hdr_len); + + if (req.key.has_value()) { + ovs_flow_key_attrs_put(nlh, OVS_FLOW_ATTR_KEY, req.key.value()); + } + if (req.ufid.size() > 0) { + ynl_attr_put(nlh, OVS_FLOW_ATTR_UFID, req.ufid.data(), req.ufid.size()); + } + if (req.mask.has_value()) { + ovs_flow_key_attrs_put(nlh, OVS_FLOW_ATTR_MASK, req.mask.value()); + } + if (req.actions.has_value()) { + ovs_flow_action_attrs_put(nlh, OVS_FLOW_ATTR_ACTIONS, req.actions.value()); + } + + err = ynl_exec(ys, nlh, &yrs); + if (err < 0) { + return -1; + } + + return 0; +} + +const struct ynl_family ynl_ovs_flow_family = { + .name = "ovs_flow", + .hdr_len = sizeof(struct genlmsghdr) + sizeof(struct ovs_header), +}; +const struct ynl_family& get_ynl_ovs_flow_family() { + return ynl_ovs_flow_family; +}; +} //namespace ynl_cpp diff --git a/generated/ovs_flow-user.hpp b/generated/ovs_flow-user.hpp new file mode 100644 index 0000000..25c5413 --- /dev/null +++ b/generated/ovs_flow-user.hpp @@ -0,0 +1,241 @@ +/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ +/* Do not edit directly, auto-generated from: */ +/* */ +/* YNL-GEN user header */ + +#ifndef _LINUX_OVS_FLOW_GEN_H +#define _LINUX_OVS_FLOW_GEN_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ynl.hpp" + +#include + +namespace ynl_cpp { +const struct ynl_family& get_ynl_ovs_flow_family(); + +/* Enums */ +std::string_view ovs_flow_op_str(int op); +std::string_view ovs_flow_ovs_frag_type_str(ovs_frag_type value); +std::string_view ovs_flow_ovs_ufid_flags_str(int value); +std::string_view ovs_flow_ovs_hash_alg_str(ovs_hash_alg value); +std::string_view ovs_flow_ct_state_flags_str(int value); + +/* Common nested types */ +struct ovs_flow_key_attrs; +struct ovs_flow_action_attrs; + +struct ovs_flow_ovs_nsh_key_attrs { + std::vector<__u8> base; + std::vector<__u8> md1; + std::vector<__u8> md2; +}; + +struct ovs_flow_userspace_attrs { + std::optional<__u32> pid; + std::vector<__u8> userdata; + std::optional<__u32> egress_tun_port; + bool actions{}; +}; + +struct ovs_flow_psample_attrs { + std::optional<__u32> group; + std::vector<__u8> cookie; +}; + +struct ovs_flow_vxlan_ext_attrs { + std::optional<__u32> gbp; +}; + +struct ovs_flow_nat_attrs { + bool src{}; + bool dst{}; + std::vector<__u8> ip_min; + std::vector<__u8> ip_max; + std::optional<__u16> proto_min; + std::optional<__u16> proto_max; + bool persistent{}; + bool proto_hash{}; + bool proto_random{}; +}; + +struct ovs_flow_tunnel_key_attrs { + std::optional<__u64> id /* big-endian */; + std::optional<__u32> ipv4_src /* big-endian */; + std::optional<__u32> ipv4_dst /* big-endian */; + std::optional<__u8> tos; + std::optional<__u8> ttl; + bool dont_fragment{}; + bool csum{}; + bool oam{}; + std::vector<__u8> geneve_opts; + std::optional<__u16> tp_src /* big-endian */; + std::optional<__u16> tp_dst /* big-endian */; + std::optional vxlan_opts; + std::vector<__u8> ipv6_src; + std::vector<__u8> ipv6_dst; + std::vector<__u8> pad; + std::vector<__u8> erspan_opts; + bool ipv4_info_bridge{}; +}; + +struct ovs_flow_ct_attrs { + bool commit{}; + std::optional<__u16> zone; + std::vector<__u8> mark; + std::vector<__u8> labels; + std::string helper; + std::optional nat; + bool force_commit{}; + std::optional<__u32> eventmask; + std::string timeout; +}; + +struct ovs_flow_key_attrs { + std::vector encap; + std::optional<__u32> priority; + std::optional<__u32> in_port; + std::optional ethernet; + std::optional<__u16> vlan /* big-endian */; + std::optional<__u16> ethertype /* big-endian */; + std::optional ipv4; + std::optional ipv6; + std::optional tcp; + std::optional udp; + std::optional icmp; + std::optional icmpv6; + std::optional arp; + std::optional nd; + std::optional<__u32> skb_mark; + std::optional tunnel; + std::optional sctp; + std::optional<__u16> tcp_flags /* big-endian */; + std::optional<__u32> dp_hash; + std::optional<__u32> recirc_id; + std::optional mpls; + std::optional<__u32> ct_state; + std::optional<__u16> ct_zone; + std::optional<__u32> ct_mark; + std::vector<__u8> ct_labels; + std::optional ct_orig_tuple_ipv4; + std::vector<__u8> ct_orig_tuple_ipv6; + std::optional nsh; + std::optional<__u32> packet_type /* big-endian */; + std::vector<__u8> nd_extensions; + std::vector<__u8> tunnel_info; + std::optional ipv6_exthdrs; +}; + +struct ovs_flow_sample_attrs { + std::optional<__u32> probability; + std::vector actions; +}; + +struct ovs_flow_check_pkt_len_attrs { + std::optional<__u16> pkt_len; + std::vector actions_if_greater; + std::vector actions_if_less_equal; +}; + +struct ovs_flow_dec_ttl_attrs { + std::vector action; +}; + +struct ovs_flow_action_attrs { + std::optional<__u32> output; + std::optional userspace; + std::vector set; + std::optional push_vlan; + bool pop_vlan{}; + std::optional sample; + std::optional<__u32> recirc; + std::optional hash; + std::optional push_mpls; + std::optional<__u16> pop_mpls /* big-endian */; + std::vector set_masked; + std::optional ct; + std::optional<__u32> trunc; + std::vector<__u8> push_eth; + bool pop_eth{}; + bool ct_clear{}; + std::optional push_nsh; + bool pop_nsh{}; + std::optional<__u32> meter; + std::vector clone; + std::optional check_pkt_len; + std::optional add_mpls; + std::optional dec_ttl; + std::optional psample; +}; + +/* ============== OVS_FLOW_CMD_GET ============== */ +/* OVS_FLOW_CMD_GET - do */ +struct ovs_flow_get_req { + struct ovs_header _hdr; + + std::optional key; + std::vector<__u8> ufid; + std::optional<__u32> ufid_flags; +}; + +struct ovs_flow_get_rsp { + struct ovs_header _hdr; + + std::optional key; + std::vector<__u8> ufid; + std::optional mask; + std::optional stats; + std::optional actions; +}; + +/* + * Get / dump OVS flow configuration and state + */ +std::unique_ptr +ovs_flow_get(ynl_cpp::ynl_socket& ys, ovs_flow_get_req& req); + +/* OVS_FLOW_CMD_GET - dump */ +struct ovs_flow_get_req_dump { + struct ovs_header _hdr; + + std::optional key; + std::vector<__u8> ufid; + std::optional<__u32> ufid_flags; +}; + +struct ovs_flow_get_list { + std::list objs; +}; + +std::unique_ptr +ovs_flow_get_dump(ynl_cpp::ynl_socket& ys, ovs_flow_get_req_dump& req); + +/* ============== OVS_FLOW_CMD_NEW ============== */ +/* OVS_FLOW_CMD_NEW - do */ +struct ovs_flow_new_req { + struct ovs_header _hdr; + + std::optional key; + std::vector<__u8> ufid; + std::optional mask; + std::optional actions; +}; + +/* + * Create OVS flow configuration in a data path + */ +int ovs_flow_new(ynl_cpp::ynl_socket& ys, ovs_flow_new_req& req); + +} //namespace ynl_cpp +#endif /* _LINUX_OVS_FLOW_GEN_H */ diff --git a/ynl-gen-cpp.py b/ynl-gen-cpp.py index c811e9c..2a249fe 100755 --- a/ynl-gen-cpp.py +++ b/ynl-gen-cpp.py @@ -610,24 +610,44 @@ def _attr_policy(self, policy): return "NLA_POLICY_NESTED(" + self.nested_render_name + "_nl_policy)" def attr_put(self, ri, var): - # at = "" if self.is_recursive_for_op(ri) else "&" - at = "" - self._attr_put_line( - ri, - var, - f"{self.nested_render_name}_put(nlh, " - + f"{self.enum_name}, {at}{var}.{self.c_name}.value())", - ) + if self.is_recursive_for_op(ri): + # Recursive types are stored as std::vector + ri.cw.p(f"for (unsigned int i = 0; i < {var}.{self.c_name}.size(); i++)") + ri.cw.p( + f"{self.nested_render_name}_put(nlh, " + + f"{self.enum_name}, {var}.{self.c_name}[i]);" + ) + else: + # Non-recursive types are stored as std::optional + self._attr_put_line( + ri, + var, + f"{self.nested_render_name}_put(nlh, " + + f"{self.enum_name}, {var}.{self.c_name}.value())", + ) def _attr_get(self, ri, var): - get_lines = [ - f"if ({self.nested_render_name}_parse(&parg, attr))", - "return YNL_PARSE_CB_ERROR;", - ] - init_lines = [ - f"parg.rsp_policy = &{self.nested_render_name}_nest;", - f"parg.data = &{var}->{self.c_name}.emplace();", - ] + if self.is_recursive_for_op(ri): + # Recursive types are stored as std::vector + get_lines = [ + f"if ({self.nested_render_name}_parse(&parg, attr))", + "return YNL_PARSE_CB_ERROR;", + ] + init_lines = [ + f"parg.rsp_policy = &{self.nested_render_name}_nest;", + f"{var}->{self.c_name}.emplace_back();", + f"parg.data = &{var}->{self.c_name}.back();", + ] + else: + # Non-recursive types are stored as std::optional + get_lines = [ + f"if ({self.nested_render_name}_parse(&parg, attr))", + "return YNL_PARSE_CB_ERROR;", + ] + init_lines = [ + f"parg.rsp_policy = &{self.nested_render_name}_nest;", + f"parg.data = &{var}->{self.c_name}.emplace();", + ] return get_lines, init_lines, None @@ -1353,11 +1373,16 @@ def _load_nested_sets(self): # Propagate the request / reply / recursive for attr_set, struct in reversed(self.pure_nested_structs.items()): for _, spec in self.attr_sets[attr_set].items(): - child_name = None + if attr_set in struct.child_nests: + struct.recursive = True + if "nested-attributes" in spec: child_name = spec["nested-attributes"] elif "sub-message" in spec: child_name = spec["sub-message"] + else: + continue + struct.child_nests.add(child_name) child = self.pure_nested_structs.get(child_name) if child: @@ -1365,8 +1390,6 @@ def _load_nested_sets(self): struct.child_nests.update(child.child_nests) child.request |= struct.request child.reply |= struct.reply - if attr_set in struct.child_nests: - struct.recursive = True self._sort_pure_types() @@ -2698,6 +2721,23 @@ def main(): cw.nl() cw.p("/* Common nested types */") + # Forward declarations if it's referenced before being defined + defined_structs = set() + needs_forward_decl = set() + for attr_set, struct in parsed.pure_nested_structs.items(): + # Check if any nested attributes reference structs not yet defined + for _, attr in struct.member_list(): + if hasattr(attr, 'nested_attrs'): + if attr.nested_attrs not in defined_structs: + needs_forward_decl.add(attr.nested_attrs) + defined_structs.add(attr_set) + if needs_forward_decl: + for attr_set, struct in parsed.pure_nested_structs.items(): + if attr_set in needs_forward_decl: + cw.p(f"struct {struct.struct_name};") + cw.nl() + + # Actual struct definitions for attr_set, struct in parsed.pure_nested_structs.items(): ri = RenderInfo(cw, parsed, args.mode, "", "", attr_set) print_type_full(ri, struct) From 807c1258ea556d9888c49c15d6a40e06bb2ea5f5 Mon Sep 17 00:00:00 2001 From: Sheldon Wu Date: Thu, 8 Jan 2026 11:16:17 -0800 Subject: [PATCH 3/3] ynl-gen-cpp: add support for generating nlctrl Summary: Enable nlctrl code generation. and fix compile error ynl_attr_data() return void* type which could not be implicitly cast to const struct nlattr* in C++. add explicit cast in code generation Test Plan: make sure code could be generated and compiled Signed-off-by: Sheldon Wu --- generated/Makefile | 2 +- generated/nlctrl-user.cpp | 6 +++--- ynl-gen-cpp.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/generated/Makefile b/generated/Makefile index 91cc0af..c6bd18a 100644 --- a/generated/Makefile +++ b/generated/Makefile @@ -17,7 +17,7 @@ GENS_PATHS=$(shell grep -nrI --files-without-match \ 'protocol: netlink' ../Documentation/netlink/specs/) GENS_PATHS+=$(wildcard ../Documentation/netlink/specs/rt-*.yaml) GENS_ALL=$(patsubst ../Documentation/netlink/specs/%.yaml,%,${GENS_PATHS}) -GENS=$(filter-out nlctrl,${GENS_ALL}) +GENS=$(filter-out ,${GENS_ALL}) SRCS=$(patsubst %,%-user.cpp,${GENS}) HDRS=$(patsubst %,%-user.hpp,${GENS}) OBJS=$(patsubst %,%-user.cpp.o,${GENS}) diff --git a/generated/nlctrl-user.cpp b/generated/nlctrl-user.cpp index 6a42a57..4cab726 100644 --- a/generated/nlctrl-user.cpp +++ b/generated/nlctrl-user.cpp @@ -522,7 +522,7 @@ int nlctrl_getpolicy_rsp_parse(const struct nlmsghdr *nlh, parg.rsp_policy = &nlctrl_op_policy_attrs_nest; parg.data = &dst->op_policy.emplace(); - attr_op_id = ynl_attr_data(attr); + attr_op_id = (const struct nlattr*)ynl_attr_data(attr); op_id = ynl_attr_type(attr_op_id); nlctrl_op_policy_attrs_parse(&parg, attr_op_id, op_id); } else if (type == CTRL_ATTR_POLICY) { @@ -535,9 +535,9 @@ int nlctrl_getpolicy_rsp_parse(const struct nlmsghdr *nlh, parg.rsp_policy = &nlctrl_policy_attrs_nest; parg.data = &dst->policy.emplace(); - attr_policy_id = ynl_attr_data(attr); + attr_policy_id = (const struct nlattr*)ynl_attr_data(attr); policy_id = ynl_attr_type(attr_policy_id); - attr_attr_id = ynl_attr_data(attr_policy_id); + attr_attr_id = (const struct nlattr*)ynl_attr_data(attr_policy_id); attr_id = ynl_attr_type(attr_attr_id); nlctrl_policy_attrs_parse(&parg, attr_attr_id, policy_id, attr_id); } diff --git a/ynl-gen-cpp.py b/ynl-gen-cpp.py index 2a249fe..8b31d61 100755 --- a/ynl-gen-cpp.py +++ b/ynl-gen-cpp.py @@ -813,7 +813,7 @@ def _attr_get(self, ri, var): local_vars += [f'__u32 {", ".join(tv_names)};'] for level in self.attr["type-value"]: level = c_lower(level) - get_lines += [f"attr_{level} = ynl_attr_data({prev});"] + get_lines += [f"attr_{level} = (const struct nlattr*)ynl_attr_data({prev});"] get_lines += [f"{level} = ynl_attr_type(attr_{level});"] prev = "attr_" + level