Skip to content

Commit

Permalink
ifconfig: handle link up of externally enslaved devices
Browse files Browse the repository at this point in the history
In the case of standard openvswitch bridge ports, they are enslaved
by openvswitch itself to the ovs-master interface (kernel datapath
interface).
In such scenarios, we previously skipped the linkUp process, as Wicked
assumed that if a device was already enslaved, it was done via
ni_system_interface_enslave(), which generates a netlink message to
enslave and perform a link-up in bridge case, and a bonding master
manages the link state itself.

To get around this, if a device has a master, we should first check to
see if it's in link-up state. If yes, then it was enslaved by Wicked
and no furhter processing is needed. If not, then it was enslaved
externally and we need to perform the basic link-up.
  • Loading branch information
kmroz authored and mtomaschewski committed Jul 31, 2015
1 parent 5f5b266 commit 056602c
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions src/ifconfig.c
Expand Up @@ -158,13 +158,18 @@ ni_system_interface_enslave(ni_netdev_t *master, ni_netdev_t *dev)
ni_netdev_ref_set(&dev->link.masterdev,
master->name, master->link.ifindex);
}
break;
case NI_IFTYPE_BRIDGE:
ret = __ni_rtnl_link_add_port_up(dev, master->name,
master->link.ifindex);
if (ret == 0) {
ni_netdev_ref_set(&dev->link.masterdev,
master->name, master->link.ifindex);

if (dev->link.type == NI_IFTYPE_WIRELESS)
ni_wireless_connect(dev);
}
break;
default:
break;
}
Expand Down Expand Up @@ -194,12 +199,19 @@ ni_system_interface_link_change(ni_netdev_t *dev, const ni_netdev_req_t *ifp_req
if (dev->link.masterdev.index) {
if (!dev->link.masterdev.name)
ni_netdev_ref_bind_ifname(&dev->link.masterdev, nc);
ni_debug_ifconfig("%s: already enslaved in master %s[#%u] -- skipping linkUp",

ni_debug_ifconfig("%s: already enslaved in master %s[#%u]",
dev->name, dev->link.masterdev.name ?
dev->link.masterdev.name : "",
dev->link.masterdev.index);
return 0;
}

if (ni_netdev_device_is_up(dev))
return 0;

master = ni_netdev_by_index(nc, dev->link.masterdev.index);
if (master && master->link.type == NI_IFTYPE_BOND)
return 0;
} else
/* config lookup for master and redirect to master's enslave */
if (ifp_req && !ni_string_empty(ifp_req->master.name)) {
master = ni_netdev_by_name(nc, ifp_req->master.name);
Expand Down

0 comments on commit 056602c

Please sign in to comment.