diff options
author | Hans Dedecker <dedeckeh@gmail.com> | 2014-02-11 08:30:51 +0000 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2014-02-27 12:15:32 +0100 |
commit | f35b76c61baf68dc5dd8440fc06d860f8dfacc44 (patch) | |
tree | c04889155d11b42469756d1744f716b7f0dfab25 /alias.c | |
parent | 3d26347d0042313be3c9347f8d82c4ccea67fe68 (diff) |
netifd: Link layer state awareness support on interface level
The link layer state is monitored for a given interface; an interface will be setup
when both enabled and link layer active. Likewise an interface will be teared down
when either disabled or link layer down.
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
Diffstat (limited to 'alias.c')
-rw-r--r-- | alias.c | 16 |
1 files changed, 12 insertions, 4 deletions
@@ -51,7 +51,7 @@ static void alias_set_device(struct alias_device *alias, struct device *dev) device_remove_user(&alias->dep); alias->dev.hidden = !dev; if (dev) { - alias->dev.ifindex = dev->ifindex; + device_set_ifindex(&alias->dev, dev->ifindex); strcpy(alias->dev.ifname, dev->ifname); device_broadcast_event(&alias->dev, DEV_EVENT_UPDATE_IFNAME); device_add_user(&alias->dep, dev); @@ -83,14 +83,22 @@ alias_device_set_state(struct device *dev, bool state) static void alias_device_cb(struct device_user *dep, enum device_event ev) { struct alias_device *alias; - bool present = false; + bool new_state = false; alias = container_of(dep, struct alias_device, dep); switch (ev) { case DEV_EVENT_ADD: - present = true; + new_state = true; case DEV_EVENT_REMOVE: - device_set_present(&alias->dev, present); + device_set_present(&alias->dev, new_state); + break; + case DEV_EVENT_LINK_UP: + new_state = true; + case DEV_EVENT_LINK_DOWN: + device_set_link(&alias->dev, new_state); + break; + case DEV_EVENT_UPDATE_IFINDEX: + device_set_ifindex(&alias->dev, dep->dev->ifindex); break; default: device_broadcast_event(&alias->dev, ev); |