On Wed, 2011-11-09 at 11:22 +0100, Thomas Graf wrote: > 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)
Hmm, is there no way to do this via netlink yet? Dan > Thomas Graf <[email protected]> > --- > src/nm-system.c | 70 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > src/nm-system.h | 1 + > 2 files changed, 71 insertions(+), 0 deletions(-) > > diff --git a/src/nm-system.c b/src/nm-system.c > index 3317eb4..cdfd4da 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 f151e90..aa175a6 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); _______________________________________________ networkmanager-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/networkmanager-list
