Blame SOURCES/1012-bond-let-reapply-reapply-rh1847814.patch

78ede0
From ff509fd95afb6f5d183eeafcc1ef467d8102181f Mon Sep 17 00:00:00 2001
78ede0
From: Antonio Cardace <acardace@redhat.com>
78ede0
Date: Tue, 4 Aug 2020 17:49:04 +0200
78ede0
Subject: [PATCH] bond: let 'reapply()' reapply all supported options
78ede0
78ede0
Reapply now handles all the options supported by kernel and NM, meaning
78ede0
that some options are simply not allowed to be set while keeping the
78ede0
bond up, one of those options is the mode for instance.
78ede0
78ede0
https://bugzilla.redhat.com/show_bug.cgi?id=1847814
78ede0
(cherry picked from commit 746dc119a6bceb6a08b4dc9f3798d0b59a4b8575)
78ede0
(cherry picked from commit 88a399637a5279f43fd8fc7c511547fa1d179295)
78ede0
---
78ede0
 src/devices/nm-device-bond.c | 141 +++++++++++++++++++++++++----------
78ede0
 1 file changed, 101 insertions(+), 40 deletions(-)
78ede0
78ede0
diff --git a/src/devices/nm-device-bond.c b/src/devices/nm-device-bond.c
78ede0
index 164f6aaa7..71332ba39 100644
78ede0
--- a/src/devices/nm-device-bond.c
78ede0
+++ b/src/devices/nm-device-bond.c
78ede0
@@ -183,7 +183,6 @@ master_update_slave_connection (NMDevice *self,
78ede0
 
78ede0
 static void
78ede0
 set_arp_targets (NMDevice *device,
78ede0
-                 NMBondMode mode,
78ede0
                  const char *cur_arp_ip_target,
78ede0
                  const char *new_arp_ip_target)
78ede0
 {
78ede0
@@ -296,15 +295,39 @@ set_bond_attr_active_slave (NMDevice *device, NMSettingBond *s_bond)
78ede0
 	_set_bond_attr (device, NM_SETTING_BOND_OPTION_ACTIVE_SLAVE, value);
78ede0
 }
78ede0
 
78ede0
+static void
78ede0
+set_bond_attrs_or_default (NMDevice *device, NMSettingBond *s_bond, const char *const *attr_v)
78ede0
+{
78ede0
+	nm_assert (NM_IS_DEVICE (device));
78ede0
+	nm_assert (s_bond);
78ede0
+	nm_assert (attr_v);
78ede0
+
78ede0
+	for ( ; *attr_v ; ++attr_v)
78ede0
+		set_bond_attr_or_default (device, s_bond, *attr_v);
78ede0
+}
78ede0
+
78ede0
+static void
78ede0
+set_bond_arp_ip_targets (NMDevice *device, NMSettingBond *s_bond)
78ede0
+{
78ede0
+	int           ifindex           = nm_device_get_ifindex (device);
78ede0
+	gs_free char *cur_arp_ip_target = NULL;
78ede0
+
78ede0
+	/* ARP targets: clear and initialize the list */
78ede0
+	cur_arp_ip_target = nm_platform_sysctl_master_get_option (nm_device_get_platform (device),
78ede0
+	                                                          ifindex,
78ede0
+	                                                          NM_SETTING_BOND_OPTION_ARP_IP_TARGET);
78ede0
+	set_arp_targets (device,
78ede0
+	                 cur_arp_ip_target,
78ede0
+	                 nm_setting_bond_get_option_or_default (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET));
78ede0
+}
78ede0
+
78ede0
 static gboolean
78ede0
 apply_bonding_config (NMDeviceBond *self)
78ede0
 {
78ede0
 	NMDevice *device = NM_DEVICE (self);
78ede0
-	int ifindex = nm_device_get_ifindex (device);
78ede0
 	NMSettingBond *s_bond;
78ede0
 	NMBondMode mode;
78ede0
 	const char *mode_str;
78ede0
-	gs_free char *cur_arp_ip_target = NULL;
78ede0
 
78ede0
 	s_bond = nm_device_get_applied_setting (device, NM_TYPE_SETTING_BOND);
78ede0
 	g_return_val_if_fail (s_bond, FALSE);
78ede0
@@ -318,40 +341,34 @@ apply_bonding_config (NMDeviceBond *self)
78ede0
 	 */
78ede0
 	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_MODE);
78ede0
 
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_MIIMON);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_UPDELAY);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_DOWNDELAY);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_ARP_VALIDATE);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_PRIMARY);
78ede0
-
78ede0
-	/* ARP targets: clear and initialize the list */
78ede0
-	cur_arp_ip_target = nm_platform_sysctl_master_get_option (nm_device_get_platform (device),
78ede0
-	                                                          ifindex,
78ede0
-	                                                          NM_SETTING_BOND_OPTION_ARP_IP_TARGET);
78ede0
-	set_arp_targets (device,
78ede0
-	                 mode,
78ede0
-	                 cur_arp_ip_target,
78ede0
-	                 nm_setting_bond_get_option_or_default (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET));
78ede0
-
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM);
78ede0
+	set_bond_arp_ip_targets (device, s_bond);
78ede0
 	set_bond_attr_active_slave (device, s_bond);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_AD_SELECT);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_AD_USER_PORT_KEY);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_FAIL_OVER_MAC);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_LACP_RATE);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_LP_INTERVAL);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_MIN_LINKS);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_PRIMARY_RESELECT);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_RESEND_IGMP);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_TLB_DYNAMIC_LB);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_USE_CARRIER);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY);
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_NUM_GRAT_ARP);
78ede0
+
78ede0
+	set_bond_attrs_or_default (device,
78ede0
+	                           s_bond,
78ede0
+	                           NM_MAKE_STRV (NM_SETTING_BOND_OPTION_MIIMON,
78ede0
+	                                         NM_SETTING_BOND_OPTION_UPDELAY,
78ede0
+	                                         NM_SETTING_BOND_OPTION_DOWNDELAY,
78ede0
+	                                         NM_SETTING_BOND_OPTION_ARP_INTERVAL,
78ede0
+	                                         NM_SETTING_BOND_OPTION_ARP_VALIDATE,
78ede0
+	                                         NM_SETTING_BOND_OPTION_PRIMARY,
78ede0
+	                                         NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM,
78ede0
+	                                         NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO,
78ede0
+	                                         NM_SETTING_BOND_OPTION_AD_SELECT,
78ede0
+	                                         NM_SETTING_BOND_OPTION_AD_USER_PORT_KEY,
78ede0
+	                                         NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE,
78ede0
+	                                         NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS,
78ede0
+	                                         NM_SETTING_BOND_OPTION_FAIL_OVER_MAC,
78ede0
+	                                         NM_SETTING_BOND_OPTION_LACP_RATE,
78ede0
+	                                         NM_SETTING_BOND_OPTION_LP_INTERVAL,
78ede0
+	                                         NM_SETTING_BOND_OPTION_MIN_LINKS,
78ede0
+	                                         NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE,
78ede0
+	                                         NM_SETTING_BOND_OPTION_PRIMARY_RESELECT,
78ede0
+	                                         NM_SETTING_BOND_OPTION_RESEND_IGMP,
78ede0
+	                                         NM_SETTING_BOND_OPTION_TLB_DYNAMIC_LB,
78ede0
+	                                         NM_SETTING_BOND_OPTION_USE_CARRIER,
78ede0
+	                                         NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY,
78ede0
+	                                         NM_SETTING_BOND_OPTION_NUM_GRAT_ARP));
78ede0
 	return TRUE;
78ede0
 }
78ede0
 
78ede0
@@ -525,8 +542,26 @@ check_changed_options (NMSettingBond *s_a, NMSettingBond *s_b, GError **error)
78ede0
 
78ede0
 		/* We support changes to these */
78ede0
 		if (NM_IN_STRSET (name,
78ede0
-		                  NM_SETTING_BOND_OPTION_ACTIVE_SLAVE,
78ede0
-		                  NM_SETTING_BOND_OPTION_PRIMARY)) {
78ede0
+		                  NM_SETTING_BOND_OPTION_PRIMARY,
78ede0
+		                  NM_SETTING_BOND_OPTION_MIIMON,
78ede0
+		                  NM_SETTING_BOND_OPTION_UPDELAY,
78ede0
+		                  NM_SETTING_BOND_OPTION_DOWNDELAY,
78ede0
+		                  NM_SETTING_BOND_OPTION_ARP_INTERVAL,
78ede0
+		                  NM_SETTING_BOND_OPTION_ARP_VALIDATE,
78ede0
+		                  NM_SETTING_BOND_OPTION_PRIMARY,
78ede0
+		                  NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM,
78ede0
+		                  NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO,
78ede0
+		                  NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE,
78ede0
+		                  NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS,
78ede0
+		                  NM_SETTING_BOND_OPTION_FAIL_OVER_MAC,
78ede0
+		                  NM_SETTING_BOND_OPTION_LP_INTERVAL,
78ede0
+		                  NM_SETTING_BOND_OPTION_MIN_LINKS,
78ede0
+		                  NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE,
78ede0
+		                  NM_SETTING_BOND_OPTION_PRIMARY_RESELECT,
78ede0
+		                  NM_SETTING_BOND_OPTION_RESEND_IGMP,
78ede0
+		                  NM_SETTING_BOND_OPTION_USE_CARRIER,
78ede0
+		                  NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY,
78ede0
+		                  NM_SETTING_BOND_OPTION_NUM_GRAT_ARP)) {
78ede0
 			continue;
78ede0
 		}
78ede0
 
78ede0
@@ -579,8 +614,8 @@ static void
78ede0
 reapply_connection (NMDevice *device, NMConnection *con_old, NMConnection *con_new)
78ede0
 {
78ede0
 	NMDeviceBond *self = NM_DEVICE_BOND (device);
78ede0
-	const char *value;
78ede0
 	NMSettingBond *s_bond;
78ede0
+	const char *value;
78ede0
 	NMBondMode mode;
78ede0
 
78ede0
 	NM_DEVICE_CLASS (nm_device_bond_parent_class)->reapply_connection (device,
78ede0
@@ -595,8 +630,34 @@ reapply_connection (NMDevice *device, NMConnection *con_old, NMConnection *con_n
78ede0
 	mode = _nm_setting_bond_mode_from_string (value);
78ede0
 	g_return_if_fail (mode != NM_BOND_MODE_UNKNOWN);
78ede0
 
78ede0
-	set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_PRIMARY);
78ede0
+	/* Below we set only the bond options that kernel allows to modify
78ede0
+	 * while keeping the bond interface up */
78ede0
+
78ede0
 	set_bond_attr_active_slave (device, s_bond);
78ede0
+	set_bond_arp_ip_targets (device, s_bond);
78ede0
+
78ede0
+	set_bond_attrs_or_default (device,
78ede0
+	                           s_bond,
78ede0
+	                           NM_MAKE_STRV (NM_SETTING_BOND_OPTION_PRIMARY,
78ede0
+	                                         NM_SETTING_BOND_OPTION_MIIMON,
78ede0
+	                                         NM_SETTING_BOND_OPTION_UPDELAY,
78ede0
+	                                         NM_SETTING_BOND_OPTION_DOWNDELAY,
78ede0
+	                                         NM_SETTING_BOND_OPTION_ARP_INTERVAL,
78ede0
+	                                         NM_SETTING_BOND_OPTION_ARP_VALIDATE,
78ede0
+	                                         NM_SETTING_BOND_OPTION_PRIMARY,
78ede0
+	                                         NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM,
78ede0
+	                                         NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO,
78ede0
+	                                         NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE,
78ede0
+	                                         NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS,
78ede0
+	                                         NM_SETTING_BOND_OPTION_FAIL_OVER_MAC,
78ede0
+	                                         NM_SETTING_BOND_OPTION_LP_INTERVAL,
78ede0
+	                                         NM_SETTING_BOND_OPTION_MIN_LINKS,
78ede0
+	                                         NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE,
78ede0
+	                                         NM_SETTING_BOND_OPTION_PRIMARY_RESELECT,
78ede0
+	                                         NM_SETTING_BOND_OPTION_RESEND_IGMP,
78ede0
+	                                         NM_SETTING_BOND_OPTION_USE_CARRIER,
78ede0
+	                                         NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY,
78ede0
+	                                         NM_SETTING_BOND_OPTION_NUM_GRAT_ARP));
78ede0
 }
78ede0
 
78ede0
 /*****************************************************************************/
78ede0
-- 
78ede0
2.26.2
78ede0