diff --git a/include/wicked/bonding.h b/include/wicked/bonding.h
index ae03b90d1..70ca77267 100644
--- a/include/wicked/bonding.h
+++ b/include/wicked/bonding.h
@@ -114,7 +114,7 @@ extern ni_bool_t ni_bonding_set_option(ni_bonding_t *, const char *, const char
extern int ni_bonding_parse_sysfs_attrs(const char *, ni_bonding_t *);
extern int ni_bonding_write_sysfs_attrs(const char *ifname,
const ni_bonding_t *cfg_bond,
- const ni_bonding_t *cur_bond,
+ ni_bonding_t *cur_bond,
ni_bool_t is_up, ni_bool_t has_slaves);
extern ni_bool_t ni_bonding_is_valid_arp_ip_target(const char *);
diff --git a/schema/bonding.xml b/schema/bonding.xml
index ff3f28788..90fb9715b 100644
--- a/schema/bonding.xml
+++ b/schema/bonding.xml
@@ -40,7 +40,7 @@
-
+
diff --git a/src/bonding.c b/src/bonding.c
index c73e6d4bb..63842c3cc 100644
--- a/src/bonding.c
+++ b/src/bonding.c
@@ -241,9 +241,14 @@ ni_bonding_validate(const ni_bonding_t *bonding)
if (bonding->miimon.frequency > 0)
return "invalid arp and mii monitoring option mix";
- if (bonding->mode == NI_BOND_MODE_BALANCE_TLB ||
- bonding->mode == NI_BOND_MODE_BALANCE_ALB)
- return "invalid arp monitoring in balance-tlb/-alb mode";
+ switch(bonding->mode) {
+ case NI_BOND_MODE_802_3AD:
+ case NI_BOND_MODE_BALANCE_TLB:
+ case NI_BOND_MODE_BALANCE_ALB:
+ return "invalid arp monitoring in balance-tlb/-alb or 802.3ad mode";
+ default:
+ break;
+ }
if (bonding->arpmon.interval == 0 ||
bonding->arpmon.interval > INT_MAX)
@@ -251,6 +256,7 @@ ni_bonding_validate(const ni_bonding_t *bonding)
switch (bonding->arpmon.validate) {
case NI_BOND_ARP_VALIDATE_NONE:
+ break;
case NI_BOND_ARP_VALIDATE_ACTIVE:
case NI_BOND_ARP_VALIDATE_BACKUP:
case NI_BOND_ARP_VALIDATE_ALL:
@@ -820,7 +826,7 @@ ni_bonding_parse_sysfs_attribute(ni_bonding_t *bonding, const char *attr, char *
bonding->monitoring = NI_BOND_MONITOR_ARP;
} else if (!strcmp(attr, "arp_ip_target")) {
char *s, *p = NULL;
- for (s = strtok_r(value, ",", &p); s; s = strtok_r(NULL, ",", &p)) {
+ for (s = strtok_r(value, " \t\n", &p); s; s = strtok_r(NULL, " \t\n", &p)) {
if (ni_bonding_is_valid_arp_ip_target(s))
ni_string_array_append(&bonding->arpmon.targets, s);
}
@@ -1063,7 +1069,7 @@ ni_bonding_write_one_sysfs_attr(const char *ifname, const ni_bonding_t *bonding,
* as well as in dependency of the bonding up/down state and slave count.
*/
int
-ni_bonding_write_sysfs_attrs(const char *ifname, const ni_bonding_t *bonding, const ni_bonding_t *current, ni_bool_t is_up, ni_bool_t has_slaves)
+ni_bonding_write_sysfs_attrs(const char *ifname, const ni_bonding_t *bonding, ni_bonding_t *current, ni_bool_t is_up, ni_bool_t has_slaves)
{
/*
* option up/down slaves modes
@@ -1125,6 +1131,7 @@ ni_bonding_write_sysfs_attrs(const char *ifname, const ni_bonding_t *bonding, co
};
const struct attr_matrix *attrs;
unsigned int i;
+ char *attrval = NULL;
attrs = attr_matrix;
for (i = 0; attrs[i].name; ++i) {
@@ -1148,6 +1155,10 @@ ni_bonding_write_sysfs_attrs(const char *ifname, const ni_bonding_t *bonding, co
!attrs[i].nofail)
return -1;
}
+
+ if (!ni_sysfs_bonding_get_attr(ifname, attrs[i].name, &attrval) && attrval)
+ ni_bonding_parse_sysfs_attribute(current, attrs[i].name, attrval);
+ ni_string_free(&attrval);
}
return 0;
diff --git a/src/ifconfig.c b/src/ifconfig.c
index 680917e73..dd4dc6ab8 100644
--- a/src/ifconfig.c
+++ b/src/ifconfig.c
@@ -1369,6 +1369,7 @@ ni_system_bond_setup(ni_netconfig_t *nc, ni_netdev_t *dev, const ni_bonding_t *b
*/
ni_debug_ifconfig("%s: configuring bonding device (stage 0.%u.%u)",
dev->name, is_up, has_slaves);
+ ni_bonding_parse_sysfs_attrs(dev->name, bond);
if (ni_bonding_write_sysfs_attrs(dev->name, bond_cfg, bond,
is_up, has_slaves) < 0) {
ni_error("%s: cannot configure bonding device (stage 0.%u.%u)",
@@ -1442,6 +1443,7 @@ ni_system_bond_setup(ni_netconfig_t *nc, ni_netdev_t *dev, const ni_bonding_t *b
*/
ni_debug_ifconfig("%s: configuring bonding device (stage 2.%u.%u)",
dev->name, is_up, has_slaves);
+ ni_bonding_parse_sysfs_attrs(dev->name, bond);
if (ni_bonding_write_sysfs_attrs(dev->name, bond_cfg, bond,
is_up, has_slaves) < 0) {
ni_error("%s: cannot configure bonding device (stage 2.%u.%u)",
@@ -1453,6 +1455,7 @@ ni_system_bond_setup(ni_netconfig_t *nc, ni_netdev_t *dev, const ni_bonding_t *b
dev->name);
return -1;
}
+ ni_bonding_parse_sysfs_attrs(dev->name, bond);
return 0;
}