X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=alias.c;h=1f23da08ac5e66eab4f2b6569013f7fc0d098673;hp=4e0a6be0d7fb78659e0f9f4f5aa5bf3bea061a94;hb=fa624787a83347039ff690ec0a8e209fd1642c2e;hpb=889f3236fde274d6ebff23fe62c5cd66ed8b3eb7 diff --git a/alias.c b/alias.c index 4e0a6be..1f23da0 100644 --- a/alias.c +++ b/alias.c @@ -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); @@ -104,6 +112,9 @@ alias_device_create(const char *name, struct blob_attr *attr) struct alias_device *alias; alias = calloc(1, sizeof(*alias) + strlen(name) + 1); + if (!alias) + return NULL; + strcpy(alias->name, name); alias->dev.set_state = alias_device_set_state; alias->dev.hidden = true; @@ -122,6 +133,8 @@ static void alias_device_free(struct device *dev) struct alias_device *alias; alias = container_of(dev, struct alias_device, dev); + device_remove_user(&alias->new_dep); + device_remove_user(&alias->dep); avl_delete(&aliases, &alias->avl); free(alias); }