diff options
author | Hans Dedecker <dedeckeh@gmail.com> | 2015-11-02 11:16:12 +0100 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2015-11-04 01:12:25 +0100 |
commit | 4902ba2999dec02e82066d70ab6096b852a33007 (patch) | |
tree | 04ceb89fb4497849162a056664379fd3d75f2971 | |
parent | fa64fe118945127007fc6f6f558d0630258790bd (diff) | |
download | netifd-4902ba2999dec02e82066d70ab6096b852a33007.tar.gz |
device: Don't process link events anymore in device user specific callback handlers
Set link_state for all device types via the device_set_link API as all devices are registered
in the device tree list making it possible to always get the device via device_get.
The decice link state parameter will now actually reflect the corresponding kernel device
carrier state in all cases.
Before this change a vlan/macvlan device could still have link_state enabled if an interface
was brought down; this was the case when the parent vlan/macvlan device was still enabled as
the netlink link_state event would be dropped for vlan/macvlan devices due to keep_link_state
in the function cb_rtnl_event.
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
-rw-r--r-- | device.h | 2 | ||||
-rw-r--r-- | macvlan.c | 8 | ||||
-rw-r--r-- | system-linux.c | 2 | ||||
-rw-r--r-- | vlan.c | 6 | ||||
-rw-r--r-- | vlandev.c | 8 |
5 files changed, 1 insertions, 25 deletions
@@ -58,8 +58,6 @@ struct device_type { struct list_head list; const char *name; - bool keep_link_status; - const struct uci_blob_param_list *config_params; struct device *(*create)(const char *name, struct blob_attr *attr); @@ -72,12 +72,6 @@ macvlan_base_cb(struct device_user *dev, enum device_event ev) case DEV_EVENT_REMOVE: device_set_present(&mvdev->dev, false); break; - case DEV_EVENT_LINK_UP: - device_set_link(&mvdev->dev, true); - break; - case DEV_EVENT_LINK_DOWN: - device_set_link(&mvdev->dev, false); - break; default: return; } @@ -261,8 +255,6 @@ macvlan_create(const char *name, struct blob_attr *attr) const struct device_type macvlan_device_type = { .name = "MAC VLAN", .config_params = &macvlan_attr_list, - .keep_link_status = true, - .create = macvlan_create, .config_init = macvlan_config_init, .reload = macvlan_reload, diff --git a/system-linux.c b/system-linux.c index 611acb8..4ccc9d2 100644 --- a/system-linux.c +++ b/system-linux.c @@ -424,7 +424,7 @@ static int cb_rtnl_event(struct nl_msg *msg, void *arg) goto out; struct device *dev = device_get(nla_data(nla[IFLA_IFNAME]), false); - if (!dev || dev->type->keep_link_status) + if (!dev) goto out; if (!system_get_dev_sysctl("/sys/class/net/%s/carrier", dev->ifname, buf, sizeof(buf))) @@ -79,11 +79,6 @@ static void vlan_dev_cb(struct device_user *dep, enum device_event ev) case DEV_EVENT_REMOVE: device_set_present(&vldev->dev, new_state); break; - case DEV_EVENT_LINK_UP: - new_state = true; - case DEV_EVENT_LINK_DOWN: - device_set_link(&vldev->dev, new_state); - break; case DEV_EVENT_UPDATE_IFNAME: vlan_dev_set_name(vldev, dep->dev); device_broadcast_event(&vldev->dev, ev); @@ -102,7 +97,6 @@ static struct device *get_vlan_device(struct device *dev, int id, bool create) static const struct device_type vlan_type = { .name = "VLAN", .config_params = &device_attr_list, - .keep_link_status = true, .free = free_vlan_if, }; struct vlan_device *vldev; @@ -63,12 +63,6 @@ vlandev_base_cb(struct device_user *dev, enum device_event ev) case DEV_EVENT_REMOVE: device_set_present(&mvdev->dev, false); break; - case DEV_EVENT_LINK_UP: - device_set_link(&mvdev->dev, true); - break; - case DEV_EVENT_LINK_DOWN: - device_set_link(&mvdev->dev, false); - break; default: return; } @@ -249,8 +243,6 @@ vlandev_create(const char *name, struct blob_attr *attr) const struct device_type vlandev_device_type = { .name = "VLANDEV", .config_params = &vlandev_attr_list, - .keep_link_status = true, - .create = vlandev_create, .config_init = vlandev_config_init, .reload = vlandev_reload, |