bond: merge branch 'ac/bond_reapply'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/598
This commit is contained in:
@@ -337,6 +337,10 @@ nm_streq0 (const char *s1, const char *s2)
|
|||||||
#define _NM_IN_SET_EVAL_14(op, _x, y, ...) (_x == (y)) op _NM_IN_SET_EVAL_13 (op, _x, __VA_ARGS__)
|
#define _NM_IN_SET_EVAL_14(op, _x, y, ...) (_x == (y)) op _NM_IN_SET_EVAL_13 (op, _x, __VA_ARGS__)
|
||||||
#define _NM_IN_SET_EVAL_15(op, _x, y, ...) (_x == (y)) op _NM_IN_SET_EVAL_14 (op, _x, __VA_ARGS__)
|
#define _NM_IN_SET_EVAL_15(op, _x, y, ...) (_x == (y)) op _NM_IN_SET_EVAL_14 (op, _x, __VA_ARGS__)
|
||||||
#define _NM_IN_SET_EVAL_16(op, _x, y, ...) (_x == (y)) op _NM_IN_SET_EVAL_15 (op, _x, __VA_ARGS__)
|
#define _NM_IN_SET_EVAL_16(op, _x, y, ...) (_x == (y)) op _NM_IN_SET_EVAL_15 (op, _x, __VA_ARGS__)
|
||||||
|
#define _NM_IN_SET_EVAL_17(op, _x, y, ...) (_x == (y)) op _NM_IN_SET_EVAL_16 (op, _x, __VA_ARGS__)
|
||||||
|
#define _NM_IN_SET_EVAL_18(op, _x, y, ...) (_x == (y)) op _NM_IN_SET_EVAL_17 (op, _x, __VA_ARGS__)
|
||||||
|
#define _NM_IN_SET_EVAL_19(op, _x, y, ...) (_x == (y)) op _NM_IN_SET_EVAL_18 (op, _x, __VA_ARGS__)
|
||||||
|
#define _NM_IN_SET_EVAL_20(op, _x, y, ...) (_x == (y)) op _NM_IN_SET_EVAL_19 (op, _x, __VA_ARGS__)
|
||||||
|
|
||||||
#define _NM_IN_SET_EVAL_N2(op, _x, n, ...) (_NM_IN_SET_EVAL_##n(op, _x, __VA_ARGS__))
|
#define _NM_IN_SET_EVAL_N2(op, _x, n, ...) (_NM_IN_SET_EVAL_##n(op, _x, __VA_ARGS__))
|
||||||
#define _NM_IN_SET_EVAL_N(op, type, x, n, ...) \
|
#define _NM_IN_SET_EVAL_N(op, type, x, n, ...) \
|
||||||
@@ -386,6 +390,10 @@ nm_streq0 (const char *s1, const char *s2)
|
|||||||
#define _NM_IN_SETOP_EVAL_14(op, op_eq, _x, y, ...) (op_eq (_x, y)) op _NM_IN_SETOP_EVAL_13 (op, op_eq, _x, __VA_ARGS__)
|
#define _NM_IN_SETOP_EVAL_14(op, op_eq, _x, y, ...) (op_eq (_x, y)) op _NM_IN_SETOP_EVAL_13 (op, op_eq, _x, __VA_ARGS__)
|
||||||
#define _NM_IN_SETOP_EVAL_15(op, op_eq, _x, y, ...) (op_eq (_x, y)) op _NM_IN_SETOP_EVAL_14 (op, op_eq, _x, __VA_ARGS__)
|
#define _NM_IN_SETOP_EVAL_15(op, op_eq, _x, y, ...) (op_eq (_x, y)) op _NM_IN_SETOP_EVAL_14 (op, op_eq, _x, __VA_ARGS__)
|
||||||
#define _NM_IN_SETOP_EVAL_16(op, op_eq, _x, y, ...) (op_eq (_x, y)) op _NM_IN_SETOP_EVAL_15 (op, op_eq, _x, __VA_ARGS__)
|
#define _NM_IN_SETOP_EVAL_16(op, op_eq, _x, y, ...) (op_eq (_x, y)) op _NM_IN_SETOP_EVAL_15 (op, op_eq, _x, __VA_ARGS__)
|
||||||
|
#define _NM_IN_SETOP_EVAL_17(op, op_eq, _x, y, ...) (op_eq (_x, y)) op _NM_IN_SETOP_EVAL_16 (op, op_eq, _x, __VA_ARGS__)
|
||||||
|
#define _NM_IN_SETOP_EVAL_18(op, op_eq, _x, y, ...) (op_eq (_x, y)) op _NM_IN_SETOP_EVAL_17 (op, op_eq, _x, __VA_ARGS__)
|
||||||
|
#define _NM_IN_SETOP_EVAL_19(op, op_eq, _x, y, ...) (op_eq (_x, y)) op _NM_IN_SETOP_EVAL_18 (op, op_eq, _x, __VA_ARGS__)
|
||||||
|
#define _NM_IN_SETOP_EVAL_20(op, op_eq, _x, y, ...) (op_eq (_x, y)) op _NM_IN_SETOP_EVAL_19 (op, op_eq, _x, __VA_ARGS__)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
@@ -183,7 +183,6 @@ master_update_slave_connection (NMDevice *self,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
set_arp_targets (NMDevice *device,
|
set_arp_targets (NMDevice *device,
|
||||||
NMBondMode mode,
|
|
||||||
const char *cur_arp_ip_target,
|
const char *cur_arp_ip_target,
|
||||||
const char *new_arp_ip_target)
|
const char *new_arp_ip_target)
|
||||||
{
|
{
|
||||||
@@ -296,15 +295,39 @@ set_bond_attr_active_slave (NMDevice *device, NMSettingBond *s_bond)
|
|||||||
_set_bond_attr (device, NM_SETTING_BOND_OPTION_ACTIVE_SLAVE, value);
|
_set_bond_attr (device, NM_SETTING_BOND_OPTION_ACTIVE_SLAVE, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_bond_attrs_or_default (NMDevice *device, NMSettingBond *s_bond, const char *const *attr_v)
|
||||||
|
{
|
||||||
|
nm_assert (NM_IS_DEVICE (device));
|
||||||
|
nm_assert (s_bond);
|
||||||
|
nm_assert (attr_v);
|
||||||
|
|
||||||
|
for ( ; *attr_v ; ++attr_v)
|
||||||
|
set_bond_attr_or_default (device, s_bond, *attr_v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_bond_arp_ip_targets (NMDevice *device, NMSettingBond *s_bond)
|
||||||
|
{
|
||||||
|
int ifindex = nm_device_get_ifindex (device);
|
||||||
|
gs_free char *cur_arp_ip_target = NULL;
|
||||||
|
|
||||||
|
/* ARP targets: clear and initialize the list */
|
||||||
|
cur_arp_ip_target = nm_platform_sysctl_master_get_option (nm_device_get_platform (device),
|
||||||
|
ifindex,
|
||||||
|
NM_SETTING_BOND_OPTION_ARP_IP_TARGET);
|
||||||
|
set_arp_targets (device,
|
||||||
|
cur_arp_ip_target,
|
||||||
|
nm_setting_bond_get_option_or_default (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET));
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
apply_bonding_config (NMDeviceBond *self)
|
apply_bonding_config (NMDeviceBond *self)
|
||||||
{
|
{
|
||||||
NMDevice *device = NM_DEVICE (self);
|
NMDevice *device = NM_DEVICE (self);
|
||||||
int ifindex = nm_device_get_ifindex (device);
|
|
||||||
NMSettingBond *s_bond;
|
NMSettingBond *s_bond;
|
||||||
NMBondMode mode;
|
NMBondMode mode;
|
||||||
const char *mode_str;
|
const char *mode_str;
|
||||||
gs_free char *cur_arp_ip_target = NULL;
|
|
||||||
|
|
||||||
s_bond = nm_device_get_applied_setting (device, NM_TYPE_SETTING_BOND);
|
s_bond = nm_device_get_applied_setting (device, NM_TYPE_SETTING_BOND);
|
||||||
g_return_val_if_fail (s_bond, FALSE);
|
g_return_val_if_fail (s_bond, FALSE);
|
||||||
@@ -318,40 +341,34 @@ apply_bonding_config (NMDeviceBond *self)
|
|||||||
*/
|
*/
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_MODE);
|
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_MODE);
|
||||||
|
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_MIIMON);
|
set_bond_arp_ip_targets (device, s_bond);
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_UPDELAY);
|
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_DOWNDELAY);
|
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_ARP_INTERVAL);
|
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_ARP_VALIDATE);
|
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_PRIMARY);
|
|
||||||
|
|
||||||
/* ARP targets: clear and initialize the list */
|
|
||||||
cur_arp_ip_target = nm_platform_sysctl_master_get_option (nm_device_get_platform (device),
|
|
||||||
ifindex,
|
|
||||||
NM_SETTING_BOND_OPTION_ARP_IP_TARGET);
|
|
||||||
set_arp_targets (device,
|
|
||||||
mode,
|
|
||||||
cur_arp_ip_target,
|
|
||||||
nm_setting_bond_get_option_or_default (s_bond, NM_SETTING_BOND_OPTION_ARP_IP_TARGET));
|
|
||||||
|
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM);
|
|
||||||
set_bond_attr_active_slave (device, s_bond);
|
set_bond_attr_active_slave (device, s_bond);
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO);
|
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_AD_SELECT);
|
set_bond_attrs_or_default (device,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_AD_USER_PORT_KEY);
|
s_bond,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE);
|
NM_MAKE_STRV (NM_SETTING_BOND_OPTION_MIIMON,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS);
|
NM_SETTING_BOND_OPTION_UPDELAY,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_FAIL_OVER_MAC);
|
NM_SETTING_BOND_OPTION_DOWNDELAY,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_LACP_RATE);
|
NM_SETTING_BOND_OPTION_ARP_INTERVAL,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_LP_INTERVAL);
|
NM_SETTING_BOND_OPTION_ARP_VALIDATE,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_MIN_LINKS);
|
NM_SETTING_BOND_OPTION_PRIMARY,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE);
|
NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_PRIMARY_RESELECT);
|
NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_RESEND_IGMP);
|
NM_SETTING_BOND_OPTION_AD_SELECT,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_TLB_DYNAMIC_LB);
|
NM_SETTING_BOND_OPTION_AD_USER_PORT_KEY,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_USE_CARRIER);
|
NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY);
|
NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS,
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_NUM_GRAT_ARP);
|
NM_SETTING_BOND_OPTION_FAIL_OVER_MAC,
|
||||||
|
NM_SETTING_BOND_OPTION_LACP_RATE,
|
||||||
|
NM_SETTING_BOND_OPTION_LP_INTERVAL,
|
||||||
|
NM_SETTING_BOND_OPTION_MIN_LINKS,
|
||||||
|
NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE,
|
||||||
|
NM_SETTING_BOND_OPTION_PRIMARY_RESELECT,
|
||||||
|
NM_SETTING_BOND_OPTION_RESEND_IGMP,
|
||||||
|
NM_SETTING_BOND_OPTION_TLB_DYNAMIC_LB,
|
||||||
|
NM_SETTING_BOND_OPTION_USE_CARRIER,
|
||||||
|
NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY,
|
||||||
|
NM_SETTING_BOND_OPTION_NUM_GRAT_ARP));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -516,31 +533,41 @@ create_and_realize (NMDevice *device,
|
|||||||
static gboolean
|
static gboolean
|
||||||
check_changed_options (NMSettingBond *s_a, NMSettingBond *s_b, GError **error)
|
check_changed_options (NMSettingBond *s_a, NMSettingBond *s_b, GError **error)
|
||||||
{
|
{
|
||||||
guint i, num;
|
const char **option_list;
|
||||||
const char *name = NULL, *value_a = NULL, *value_b = NULL;
|
|
||||||
|
|
||||||
/* Check that options in @s_a have compatible changes in @s_b */
|
option_list = nm_setting_bond_get_valid_options (NULL);
|
||||||
|
|
||||||
num = nm_setting_bond_get_num_options (s_a);
|
for (; *option_list; ++option_list) {
|
||||||
for (i = 0; i < num; i++) {
|
const char *name = *option_list;
|
||||||
nm_setting_bond_get_option (s_a, i, &name, &value_a);
|
|
||||||
|
|
||||||
/* We support changes to these */
|
/* We support changes to these */
|
||||||
if (NM_IN_STRSET (name,
|
if (NM_IN_STRSET (name,
|
||||||
NM_SETTING_BOND_OPTION_ACTIVE_SLAVE,
|
NM_SETTING_BOND_OPTION_PRIMARY,
|
||||||
NM_SETTING_BOND_OPTION_PRIMARY)) {
|
NM_SETTING_BOND_OPTION_MIIMON,
|
||||||
continue;
|
NM_SETTING_BOND_OPTION_UPDELAY,
|
||||||
}
|
NM_SETTING_BOND_OPTION_DOWNDELAY,
|
||||||
|
NM_SETTING_BOND_OPTION_ARP_INTERVAL,
|
||||||
/* Missing in @s_b, but has a default value in @s_a */
|
NM_SETTING_BOND_OPTION_ARP_VALIDATE,
|
||||||
value_b = nm_setting_bond_get_option_by_name (s_b, name);
|
NM_SETTING_BOND_OPTION_PRIMARY,
|
||||||
if ( !value_b
|
NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM,
|
||||||
&& nm_streq0 (value_a, nm_setting_bond_get_option_default (s_a, name))) {
|
NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO,
|
||||||
|
NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE,
|
||||||
|
NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS,
|
||||||
|
NM_SETTING_BOND_OPTION_FAIL_OVER_MAC,
|
||||||
|
NM_SETTING_BOND_OPTION_LP_INTERVAL,
|
||||||
|
NM_SETTING_BOND_OPTION_MIN_LINKS,
|
||||||
|
NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE,
|
||||||
|
NM_SETTING_BOND_OPTION_PRIMARY_RESELECT,
|
||||||
|
NM_SETTING_BOND_OPTION_RESEND_IGMP,
|
||||||
|
NM_SETTING_BOND_OPTION_USE_CARRIER,
|
||||||
|
NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY,
|
||||||
|
NM_SETTING_BOND_OPTION_NUM_GRAT_ARP)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reject any other changes */
|
/* Reject any other changes */
|
||||||
if (!nm_streq0 (value_a, value_b)) {
|
if (!nm_streq0 (nm_setting_bond_get_option_normalized (s_a, name),
|
||||||
|
nm_setting_bond_get_option_normalized (s_b, name))) {
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
NM_DEVICE_ERROR,
|
NM_DEVICE_ERROR,
|
||||||
NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
|
NM_DEVICE_ERROR_INCOMPATIBLE_CONNECTION,
|
||||||
@@ -562,7 +589,6 @@ can_reapply_change (NMDevice *device,
|
|||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
NMDeviceClass *device_class;
|
NMDeviceClass *device_class;
|
||||||
NMSettingBond *s_bond_old, *s_bond_new;
|
|
||||||
|
|
||||||
/* Only handle bond setting here, delegate other settings to parent class */
|
/* Only handle bond setting here, delegate other settings to parent class */
|
||||||
if (nm_streq (setting_name, NM_SETTING_BOND_SETTING_NAME)) {
|
if (nm_streq (setting_name, NM_SETTING_BOND_SETTING_NAME)) {
|
||||||
@@ -572,15 +598,7 @@ can_reapply_change (NMDevice *device,
|
|||||||
NM_SETTING_BOND_OPTIONS))
|
NM_SETTING_BOND_OPTIONS))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
s_bond_old = NM_SETTING_BOND (s_old);
|
return check_changed_options (NM_SETTING_BOND (s_old), NM_SETTING_BOND (s_new), error);
|
||||||
s_bond_new = NM_SETTING_BOND (s_new);
|
|
||||||
|
|
||||||
if ( !check_changed_options (s_bond_old, s_bond_new, error)
|
|
||||||
|| !check_changed_options (s_bond_new, s_bond_old, error)) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
device_class = NM_DEVICE_CLASS (nm_device_bond_parent_class);
|
device_class = NM_DEVICE_CLASS (nm_device_bond_parent_class);
|
||||||
@@ -596,8 +614,8 @@ static void
|
|||||||
reapply_connection (NMDevice *device, NMConnection *con_old, NMConnection *con_new)
|
reapply_connection (NMDevice *device, NMConnection *con_old, NMConnection *con_new)
|
||||||
{
|
{
|
||||||
NMDeviceBond *self = NM_DEVICE_BOND (device);
|
NMDeviceBond *self = NM_DEVICE_BOND (device);
|
||||||
const char *value;
|
|
||||||
NMSettingBond *s_bond;
|
NMSettingBond *s_bond;
|
||||||
|
const char *value;
|
||||||
NMBondMode mode;
|
NMBondMode mode;
|
||||||
|
|
||||||
NM_DEVICE_CLASS (nm_device_bond_parent_class)->reapply_connection (device,
|
NM_DEVICE_CLASS (nm_device_bond_parent_class)->reapply_connection (device,
|
||||||
@@ -612,8 +630,34 @@ reapply_connection (NMDevice *device, NMConnection *con_old, NMConnection *con_n
|
|||||||
mode = _nm_setting_bond_mode_from_string (value);
|
mode = _nm_setting_bond_mode_from_string (value);
|
||||||
g_return_if_fail (mode != NM_BOND_MODE_UNKNOWN);
|
g_return_if_fail (mode != NM_BOND_MODE_UNKNOWN);
|
||||||
|
|
||||||
set_bond_attr_or_default (device, s_bond, NM_SETTING_BOND_OPTION_PRIMARY);
|
/* Below we set only the bond options that kernel allows to modify
|
||||||
|
* while keeping the bond interface up */
|
||||||
|
|
||||||
set_bond_attr_active_slave (device, s_bond);
|
set_bond_attr_active_slave (device, s_bond);
|
||||||
|
set_bond_arp_ip_targets (device, s_bond);
|
||||||
|
|
||||||
|
set_bond_attrs_or_default (device,
|
||||||
|
s_bond,
|
||||||
|
NM_MAKE_STRV (NM_SETTING_BOND_OPTION_PRIMARY,
|
||||||
|
NM_SETTING_BOND_OPTION_MIIMON,
|
||||||
|
NM_SETTING_BOND_OPTION_UPDELAY,
|
||||||
|
NM_SETTING_BOND_OPTION_DOWNDELAY,
|
||||||
|
NM_SETTING_BOND_OPTION_ARP_INTERVAL,
|
||||||
|
NM_SETTING_BOND_OPTION_ARP_VALIDATE,
|
||||||
|
NM_SETTING_BOND_OPTION_PRIMARY,
|
||||||
|
NM_SETTING_BOND_OPTION_AD_ACTOR_SYSTEM,
|
||||||
|
NM_SETTING_BOND_OPTION_AD_ACTOR_SYS_PRIO,
|
||||||
|
NM_SETTING_BOND_OPTION_ALL_SLAVES_ACTIVE,
|
||||||
|
NM_SETTING_BOND_OPTION_ARP_ALL_TARGETS,
|
||||||
|
NM_SETTING_BOND_OPTION_FAIL_OVER_MAC,
|
||||||
|
NM_SETTING_BOND_OPTION_LP_INTERVAL,
|
||||||
|
NM_SETTING_BOND_OPTION_MIN_LINKS,
|
||||||
|
NM_SETTING_BOND_OPTION_PACKETS_PER_SLAVE,
|
||||||
|
NM_SETTING_BOND_OPTION_PRIMARY_RESELECT,
|
||||||
|
NM_SETTING_BOND_OPTION_RESEND_IGMP,
|
||||||
|
NM_SETTING_BOND_OPTION_USE_CARRIER,
|
||||||
|
NM_SETTING_BOND_OPTION_XMIT_HASH_POLICY,
|
||||||
|
NM_SETTING_BOND_OPTION_NUM_GRAT_ARP));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
Reference in New Issue
Block a user