diff -Nur NetworkManager-1.20.10.org/libnm-core/nm-core-internal.h NetworkManager-1.20.10/libnm-core/nm-core-internal.h --- NetworkManager-1.20.10.org/libnm-core/nm-core-internal.h 2020-06-12 11:29:24.997178184 +0800 +++ NetworkManager-1.20.10/libnm-core/nm-core-internal.h 2020-06-12 14:14:02.965298351 +0800 @@ -495,6 +495,7 @@ NM_BOND_OPTION_TYPE_IP, NM_BOND_OPTION_TYPE_MAC, NM_BOND_OPTION_TYPE_IFNAME, + NM_BOND_OPTION_TYPE_PRIMARY_SLAVE, } NMBondOptionType; NMBondOptionType diff -Nur NetworkManager-1.20.10.org/libnm-core/nm-setting-bond.c NetworkManager-1.20.10/libnm-core/nm-setting-bond.c --- NetworkManager-1.20.10.org/libnm-core/nm-setting-bond.c 2020-06-12 11:29:24.997178184 +0800 +++ NetworkManager-1.20.10/libnm-core/nm-setting-bond.c 2020-06-12 14:19:44.310508536 +0800 @@ -77,7 +77,7 @@ { NM_SETTING_BOND_OPTION_ARP_IP_TARGET, "", NM_BOND_OPTION_TYPE_IP }, { NM_SETTING_BOND_OPTION_ARP_VALIDATE, "none", NM_BOND_OPTION_TYPE_BOTH, 0, 6, { "none", "active", "backup", "all", "filter", "filter_active", "filter_backup", NULL } }, - { NM_SETTING_BOND_OPTION_PRIMARY, "", NM_BOND_OPTION_TYPE_IFNAME }, + { NM_SETTING_BOND_OPTION_PRIMARY, "", NM_BOND_OPTION_TYPE_PRIMARY_SLAVE }, { NM_SETTING_BOND_OPTION_PRIMARY_RESELECT, "always", NM_BOND_OPTION_TYPE_BOTH, 0, 2, { "always", "better", "failure", NULL } }, { NM_SETTING_BOND_OPTION_FAIL_OVER_MAC, "none", NM_BOND_OPTION_TYPE_BOTH, 0, 2, @@ -232,7 +232,16 @@ } return TRUE; } +static gboolean +nm_check_primary_slave (const char *value) +{ + if (!value || !value[0]){ + return TRUE; + } + + return nm_utils_is_valid_iface_name (value, NULL); +} static gboolean validate_ifname (const char *name, const char *value) { @@ -280,6 +289,8 @@ return nm_utils_hwaddr_valid (value, ETH_ALEN); case NM_BOND_OPTION_TYPE_IFNAME: return validate_ifname (name, value); + case NM_BOND_OPTION_TYPE_PRIMARY_SLAVE: + return nm_check_primary_slave (value); } return FALSE; } @@ -333,6 +344,9 @@ const char *value) { NMSettingBondPrivate *priv; + const char *init_updelay = "0"; + const char *init_downdelay = "0"; + const char *tmp = NULL; g_return_val_if_fail (NM_IS_SETTING_BOND (setting), FALSE); @@ -348,11 +362,22 @@ && strcmp (value, "0") != 0) { g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_ARP_INTERVAL); g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_ARP_IP_TARGET); + + tmp = g_hash_table_lookup (NM_SETTING_BOND_GET_PRIVATE (setting)->options, NM_SETTING_BOND_OPTION_DOWNDELAY); + if(!tmp){ + g_hash_table_insert (priv->options, g_strdup (NM_SETTING_BOND_OPTION_DOWNDELAY), g_strdup (init_downdelay)); + } + tmp = g_hash_table_lookup (NM_SETTING_BOND_GET_PRIVATE (setting)->options,NM_SETTING_BOND_OPTION_UPDELAY); + if(!tmp){ + g_hash_table_insert (priv->options, g_strdup (NM_SETTING_BOND_OPTION_UPDELAY),g_strdup (init_updelay)); + } } else if ( !strcmp (name, NM_SETTING_BOND_OPTION_ARP_INTERVAL) && strcmp (value, "0") != 0) { g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_MIIMON); g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_DOWNDELAY); g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_UPDELAY); + }else if( !strcmp (name, NM_SETTING_BOND_OPTION_PRIMARY) && !strcmp (value, "") ){ + g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_PRIMARY); } _notify (setting, PROP_OPTIONS); diff -Nur NetworkManager-1.20.10.org/libnm-core/tests/test-setting.c NetworkManager-1.20.10/libnm-core/tests/test-setting.c --- NetworkManager-1.20.10.org/libnm-core/tests/test-setting.c 2020-06-12 11:29:24.993178124 +0800 +++ NetworkManager-1.20.10/libnm-core/tests/test-setting.c 2020-06-12 14:08:36.560383748 +0800 @@ -688,7 +688,7 @@ ((const char *[]){ "mode", "802.3ad", "ad_actor_system", "00:02:03:04:05:06", NULL })); test_bond_normalize_options ( ((const char *[]){ "mode", "1", "miimon", "1", NULL }), - ((const char *[]){ "mode", "active-backup", "miimon", "1", NULL })); + ((const char *[]){ "mode", "active-backup", "miimon", "1", NM_SETTING_BOND_OPTION_DOWNDELAY, "0", NM_SETTING_BOND_OPTION_UPDELAY, "0", NULL })); test_bond_normalize_options ( ((const char *[]){ "mode", "balance-alb", "tlb_dynamic_lb", "1", NULL }), ((const char *[]){ "mode", "balance-alb", NULL }));