From 3ef7bca6fad88fb95851b4bdaa28efbe564e2d49 Mon Sep 17 00:00:00 2001 From: Thomas Graf Date: Wed, 9 Nov 2011 11:22:40 +0100 Subject: [PATCH] bonding: apply bonding settings when setting up bonding device Adds a new function nm_system_apply_bonding_config() which applies the parameters specified in the NMSettingBond object via sysfs. Calls that function after creating/updating the bonding master device. If a parameter is not specified in the ifcfg the parameter will be re-initialized to the default value. This may overwrite changes which have been done manually via sysfs but it is the only reliable way of setting up the bond. Supported parameters for now: - mode (default: balance-rr) - miimon (default: 100) - updelay (default: 0) - downdelay (default: 0) - arp_interval (default: 0) - arp_ip_target (default: none) Thomas Graf --- src/nm-system.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ src/nm-system.h | 1 + 2 files changed, 71 insertions(+) diff --git a/src/nm-system.c b/src/nm-system.c index 3317eb49bc..75d2c9fc9c 100644 --- a/src/nm-system.c +++ b/src/nm-system.c @@ -1216,6 +1216,74 @@ nm_system_device_set_priority (int ifindex, } } +static gboolean +set_bond_attr (const char *iface, const char *attr, const char *value) +{ + char file[FILENAME_MAX]; + gboolean ret; + + snprintf (file, sizeof(file), "/sys/class/net/%s/bonding/%s", + iface, attr); + + ret = nm_utils_do_sysctl (file, value); + if (!ret) + nm_log_warn (LOGD_HW, "(%s): failed to set bonding attribute " + "'%s' to '%s'", iface, attr, value); + + return ret; +} + +static gboolean +set_bond_attr_int (const char *iface, const char *attr, + guint32 value) +{ + char buf[128]; + + snprintf (buf, sizeof(buf), "%u", value); + + return set_bond_attr (iface, attr, buf); +} + +gboolean +nm_system_apply_bonding_config (NMSettingBond *s_bond) +{ + const char *name, *val; + + name = nm_setting_bond_get_interface_name (s_bond); + g_assert (name); + + if ((val = nm_setting_bond_get_mode (s_bond))) + set_bond_attr (name, "mode", val); + + /* + * FIXME: + * + * ifup-eth contains code to append targets if the value is prefixed + * with '+': + * + * if [ "${key}" = "arp_ip_target" -a "${value:0:1}" != "+" ]; then + * OLDIFS=$IFS; + * IFS=','; + * for arp_ip in $value; do + * if ! grep -q $arp_ip /sys/class/net/${DEVICE}/bonding/$key; then + * echo +$arp_ip > /sys/class/net/${DEVICE}/bonding/$key + * fi + * done + * + * Not sure if this is actually being used and it seems dangerous as + * the result is pretty much unforeseeable. + */ + if ((val = nm_setting_bond_get_arp_ip_target (s_bond))) + set_bond_attr (name, "arp_ip_target", val); + + set_bond_attr_int (name, "miimon", nm_setting_bond_get_miimon (s_bond)); + set_bond_attr_int (name, "downdelay", nm_setting_bond_get_downdelay (s_bond)); + set_bond_attr_int (name, "updelay", nm_setting_bond_get_updelay (s_bond)); + set_bond_attr_int (name, "arp_interval", nm_setting_bond_get_arp_interval (s_bond)); + + return TRUE; +} + /** * nm_system_add_bonding_master: * @setting: bonding setting @@ -1244,6 +1312,8 @@ nm_system_add_bonding_master (NMSettingBond *setting) return FALSE; } + nm_system_apply_bonding_config (setting); + return TRUE; } diff --git a/src/nm-system.h b/src/nm-system.h index f151e90511..aa175a66c4 100644 --- a/src/nm-system.h +++ b/src/nm-system.h @@ -91,6 +91,7 @@ gboolean nm_system_iface_set_mtu (int ifindex, guint32 mtu); gboolean nm_system_iface_set_mac (int ifindex, const struct ether_addr *mac); +gboolean nm_system_apply_bonding_config (NMSettingBond *s_bond); gboolean nm_system_add_bonding_master (NMSettingBond *setting); gboolean nm_system_iface_enslave (NMDevice *slave, NMDevice *master); gboolean nm_system_iface_release (NMDevice *slave, NMDevice *master);