From 32870d82337997ffce79e779718c96db55723bf3 Mon Sep 17 00:00:00 2001 From: Fernando Fernandez Mancera Date: Tue, 26 Jul 2022 12:11:56 +0200 Subject: [PATCH] libnm-utils: convert string bond opts to int NMPlatform code for bond netlink support will use the numeric values, therefore we need functions to convert all the string values to int. --- .../nm-libnm-core-utils.c | 115 ++++++++++++++++++ .../nm-libnm-core-utils.h | 96 +++++++++++++++ src/libnm-core-impl/nm-setting-bond.c | 33 +++++ src/libnm-core-intern/nm-core-internal.h | 4 + 4 files changed, 248 insertions(+) diff --git a/src/libnm-core-aux-intern/nm-libnm-core-utils.c b/src/libnm-core-aux-intern/nm-libnm-core-utils.c index 3751881570..1f2d687590 100644 --- a/src/libnm-core-aux-intern/nm-libnm-core-utils.c +++ b/src/libnm-core-aux-intern/nm-libnm-core-utils.c @@ -40,6 +40,121 @@ _nm_setting_bond_remove_options_arp_interval(NMSettingBond *s_bond) /*****************************************************************************/ +NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( + _nm_setting_bond_ad_select_from_string, + NMBondAdSelect, + { + G_STATIC_ASSERT_EXPR(_NM_BOND_AD_SELECT_NUM <= 3); + + if (name && name[0] < '0' + _NM_BOND_AD_SELECT_NUM && name[0] >= '0' && name[1] == '\0') { + return name[0] - '0'; + } + }, + { return NM_BOND_AD_SELECT_STABLE; }, + {"bandwith", NM_BOND_AD_SELECT_BANDWIDTH}, + {"count", NM_BOND_AD_SELECT_COUNT}, + {"stable", NM_BOND_AD_SELECT_STABLE}, ); + +NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( + _nm_setting_bond_arp_all_targets_from_string, + NMBondArpAllTargets, + { + G_STATIC_ASSERT_EXPR(_NM_BOND_ARP_ALL_TARGETS_NUM <= 2); + + if (name && name[0] < '0' + _NM_BOND_ARP_ALL_TARGETS_NUM && name[0] >= '0' + && name[1] == '\0') { + return name[0] - '0'; + } + }, + { return NM_BOND_ARP_ALL_TARGETS_ANY; }, + {"all", NM_BOND_ARP_ALL_TARGETS_ALL}, + {"any", NM_BOND_ARP_ALL_TARGETS_ANY}, ); + +NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( + _nm_setting_bond_fail_over_mac_from_string, + NMBondFailOverMac, + { + G_STATIC_ASSERT_EXPR(_NM_BOND_FAIL_OVER_MAC_NUM <= 3); + + if (name && name[0] < '0' + _NM_BOND_FAIL_OVER_MAC_NUM && name[0] >= '0' + && name[1] == '\0') { + return name[0] - '0'; + } + }, + { return NM_BOND_FAIL_OVER_MAC_NONE; }, + {"active", NM_BOND_FAIL_OVER_MAC_ACTIVE}, + {"follow", NM_BOND_FAIL_OVER_MAC_FOLLOW}, + {"none", NM_BOND_FAIL_OVER_MAC_NONE}, ); + +NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( + _nm_setting_bond_lacp_rate_from_string, + NMBondLacpRate, + { + G_STATIC_ASSERT_EXPR(_NM_BOND_LACP_RATE_NUM <= 2); + + if (name && name[0] < '0' + _NM_BOND_LACP_RATE_NUM && name[0] >= '0' && name[1] == '\0') { + return name[0] - '0'; + } + }, + { return NM_BOND_LACP_RATE_SLOW; }, + {"fast", NM_BOND_LACP_RATE_FAST}, + {"slow", NM_BOND_LACP_RATE_SLOW}, ); + +NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( + _nm_setting_bond_arp_validate_from_string, + NMBondArpValidate, + { + G_STATIC_ASSERT_EXPR(_NM_BOND_ARP_VALIDATE_NUM <= 7); + + if (name && name[0] < '0' + _NM_BOND_ARP_VALIDATE_NUM && name[0] >= '0' + && name[1] == '\0') { + return name[0] - '0'; + } + }, + { return NM_BOND_ARP_VALIDATE_NONE; }, + {"active", NM_BOND_ARP_VALIDATE_ACTIVE}, + {"all", NM_BOND_ARP_VALIDATE_ALL}, + {"backup", NM_BOND_ARP_VALIDATE_BACKUP}, + {"filter", NM_BOND_ARP_VALIDATE_FILTER}, + {"filter_active", NM_BOND_ARP_VALIDATE_FILTER_ACTIVE}, + {"filter_backup", NM_BOND_ARP_VALIDATE_FILTER_BACKUP}, + {"none", NM_BOND_ARP_VALIDATE_NONE}, ); + +NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( + _nm_setting_bond_primary_reselect_from_string, + NMBondPrimaryReselect, + { + G_STATIC_ASSERT_EXPR(_NM_BOND_PRIMARY_RESELECT_NUM <= 3); + + if (name && name[0] < '0' + _NM_BOND_PRIMARY_RESELECT_NUM && name[0] >= '0' + && name[1] == '\0') { + return name[0] - '0'; + } + }, + { return NM_BOND_PRIMARY_RESELECT_ALWAYS; }, + {"always", NM_BOND_PRIMARY_RESELECT_ALWAYS}, + {"better", NM_BOND_PRIMARY_RESELECT_BETTER}, + {"failure", NM_BOND_PRIMARY_RESELECT_FAILURE}, ); + +NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( + _nm_setting_bond_xmit_hash_policy_from_string, + NMBondXmitHashPolicy, + { + G_STATIC_ASSERT_EXPR(_NM_BOND_XMIT_HASH_POLICY_NUM <= 6); + + if (name && name[0] < '0' + _NM_BOND_XMIT_HASH_POLICY_NUM && name[0] >= '0' + && name[1] == '\0') { + return name[0] - '0'; + } + }, + { return NM_BOND_XMIT_HASH_POLICY_LAYER2; }, + {"encap2+3", NM_BOND_XMIT_HASH_POLICY_ENCAP2_3}, + {"encap3+4", NM_BOND_XMIT_HASH_POLICY_ENCAP3_4}, + {"layer2", NM_BOND_XMIT_HASH_POLICY_LAYER2}, + {"layer2+3", NM_BOND_XMIT_HASH_POLICY_LAYER2_3}, + {"layer3+4", NM_BOND_XMIT_HASH_POLICY_LAYER3_4}, + {"vlan+srcmac", NM_BOND_XMIT_HASH_POLICY_VLAN_SRCMAC}, ); + NM_UTILS_STRING_TABLE_LOOKUP_DEFINE( _nm_setting_bond_mode_from_string, NMBondMode, diff --git a/src/libnm-core-aux-intern/nm-libnm-core-utils.h b/src/libnm-core-aux-intern/nm-libnm-core-utils.h index eb30c931fa..2c3ee78d2a 100644 --- a/src/libnm-core-aux-intern/nm-libnm-core-utils.h +++ b/src/libnm-core-aux-intern/nm-libnm-core-utils.h @@ -57,6 +57,102 @@ const char **nm_utils_bond_option_arp_ip_targets_split(const char *arp_ip_target void _nm_setting_bond_remove_options_miimon(NMSettingBond *s_bond); void _nm_setting_bond_remove_options_arp_interval(NMSettingBond *s_bond); +typedef enum { + NM_BOND_AD_SELECT_UNKNOWN = -1, + + /* The numeric values correspond to kernel's numbering. */ + NM_BOND_AD_SELECT_STABLE = 0, + NM_BOND_AD_SELECT_BANDWIDTH = 1, + NM_BOND_AD_SELECT_COUNT = 2, + + _NM_BOND_AD_SELECT_NUM, +} NMBondAdSelect; + +NMBondAdSelect _nm_setting_bond_ad_select_from_string(const char *str); + +typedef enum { + NM_BOND_ARP_ALL_TARGETS_UNKNOWN = -1, + + /* The numeric values correspond to kernel's numbering. */ + NM_BOND_ARP_ALL_TARGETS_ANY = 0, + NM_BOND_ARP_ALL_TARGETS_ALL = 1, + + _NM_BOND_ARP_ALL_TARGETS_NUM, +} NMBondArpAllTargets; + +NMBondArpAllTargets _nm_setting_bond_arp_all_targets_from_string(const char *str); + +typedef enum { + NM_BOND_FAIL_OVER_MAC_UNKNOWN = -1, + + /* The numeric values correspond to kernel's numbering. */ + NM_BOND_FAIL_OVER_MAC_NONE = 0, + NM_BOND_FAIL_OVER_MAC_ACTIVE = 1, + NM_BOND_FAIL_OVER_MAC_FOLLOW = 2, + + _NM_BOND_FAIL_OVER_MAC_NUM, +} NMBondFailOverMac; + +NMBondFailOverMac _nm_setting_bond_fail_over_mac_from_string(const char *str); + +typedef enum { + NM_BOND_LACP_RATE_UNKNOWN = -1, + + /* The numeric values correspond to kernel's numbering. */ + NM_BOND_LACP_RATE_SLOW = 0, + NM_BOND_LACP_RATE_FAST = 1, + + _NM_BOND_LACP_RATE_NUM, +} NMBondLacpRate; + +NMBondLacpRate _nm_setting_bond_lacp_rate_from_string(const char *str); + +typedef enum { + NM_BOND_ARP_VALIDATE_UNKNOWN = -1, + + /* The numeric values correspond to kernel's numbering. */ + NM_BOND_ARP_VALIDATE_NONE = 0, + NM_BOND_ARP_VALIDATE_ACTIVE = 1, + NM_BOND_ARP_VALIDATE_BACKUP = 2, + NM_BOND_ARP_VALIDATE_ALL = 3, + NM_BOND_ARP_VALIDATE_FILTER = 4, + NM_BOND_ARP_VALIDATE_FILTER_ACTIVE = 5, + NM_BOND_ARP_VALIDATE_FILTER_BACKUP = 6, + + _NM_BOND_ARP_VALIDATE_NUM, +} NMBondArpValidate; + +NMBondArpValidate _nm_setting_bond_arp_validate_from_string(const char *str); + +typedef enum { + NM_BOND_PRIMARY_RESELECT_UNKNOWN = -1, + + /* The numeric values correspond to kernel's numbering. */ + NM_BOND_PRIMARY_RESELECT_ALWAYS = 0, + NM_BOND_PRIMARY_RESELECT_BETTER = 1, + NM_BOND_PRIMARY_RESELECT_FAILURE = 2, + + _NM_BOND_PRIMARY_RESELECT_NUM, +} NMBondPrimaryReselect; + +NMBondPrimaryReselect _nm_setting_bond_primary_reselect_from_string(const char *str); + +typedef enum { + NM_BOND_XMIT_HASH_POLICY_UNKNOWN = -1, + + /* The numeric values correspond to kernel's numbering. */ + NM_BOND_XMIT_HASH_POLICY_LAYER2 = 0, + NM_BOND_XMIT_HASH_POLICY_LAYER3_4 = 1, + NM_BOND_XMIT_HASH_POLICY_LAYER2_3 = 2, + NM_BOND_XMIT_HASH_POLICY_ENCAP2_3 = 3, + NM_BOND_XMIT_HASH_POLICY_ENCAP3_4 = 4, + NM_BOND_XMIT_HASH_POLICY_VLAN_SRCMAC = 5, + + _NM_BOND_XMIT_HASH_POLICY_NUM, +} NMBondXmitHashPolicy; + +NMBondXmitHashPolicy _nm_setting_bond_xmit_hash_policy_from_string(const char *str); + typedef enum { NM_BOND_MODE_UNKNOWN = -1, diff --git a/src/libnm-core-impl/nm-setting-bond.c b/src/libnm-core-impl/nm-setting-bond.c index 2984e6fc22..cdfc764187 100644 --- a/src/libnm-core-impl/nm-setting-bond.c +++ b/src/libnm-core-impl/nm-setting-bond.c @@ -764,6 +764,39 @@ _nm_setting_bond_get_option_type(NMSettingBond *setting, const char *name) return option_meta->opt_type; } +guint32 +_nm_setting_bond_opt_value_as_u32(NMSettingBond *s_bond, const char *opt) +{ + nm_assert(_get_option_meta(opt)->opt_type == NM_BOND_OPTION_TYPE_INT); + return _nm_utils_ascii_str_to_uint64(nm_setting_bond_get_option_normalized(s_bond, opt), + 10, + 0, + G_MAXUINT32, + 0); +} + +guint16 +_nm_setting_bond_opt_value_as_u16(NMSettingBond *s_bond, const char *opt) +{ + nm_assert(_get_option_meta(opt)->opt_type == NM_BOND_OPTION_TYPE_INT); + return _nm_utils_ascii_str_to_uint64(nm_setting_bond_get_option_normalized(s_bond, opt), + 10, + 0, + G_MAXUINT16, + 0); +} + +guint8 +_nm_setting_bond_opt_value_as_u8(NMSettingBond *s_bond, const char *opt) +{ + nm_assert(_get_option_meta(opt)->opt_type == NM_BOND_OPTION_TYPE_INT); + return _nm_utils_ascii_str_to_uint64(nm_setting_bond_get_option_normalized(s_bond, opt), + 10, + 0, + G_MAXUINT8, + 0); +} + /*****************************************************************************/ static gboolean diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index f669bf8d80..ee4cc25b42 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -517,6 +517,10 @@ NMConnectionMultiConnect _nm_connection_get_multi_connect(NMConnection *connecti gboolean _nm_setting_bond_option_supported(const char *option, NMBondMode mode); +guint32 _nm_setting_bond_opt_value_as_u32(NMSettingBond *s_bond, const char *opt); +guint16 _nm_setting_bond_opt_value_as_u16(NMSettingBond *s_bond, const char *opt); +guint8 _nm_setting_bond_opt_value_as_u8(NMSettingBond *s_bond, const char *opt); + /*****************************************************************************/ GPtrArray *_nm_setting_bridge_get_vlans(NMSettingBridge *setting);