X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=alias.c;h=cef125f578d4e6da125138180e28e9309772cd42;hp=e4f28e52c277b55a908d7879e3edac2b8d674772;hb=2d09cca0e90127d33eed43b8790f5778ba3b943f;hpb=ed984c7aea436999c38cc40c5ebaf98bd8294df4 diff --git a/alias.c b/alias.c index e4f28e5..cef125f 100644 --- a/alias.c +++ b/alias.c @@ -37,6 +37,7 @@ static void alias_set_device(struct alias_device *alias, struct device *dev) if (dev == alias->dep.dev) return; + device_set_present(&alias->dev, false); device_remove_user(&alias->new_dep); if (alias->dev.active) { if (dev) @@ -50,6 +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) { + 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); @@ -81,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);