device: Don't process link events anymore in device user specific callback handlers
authorHans Dedecker <dedeckeh@gmail.com>
Mon, 2 Nov 2015 10:16:12 +0000 (11:16 +0100)
committerSteven Barth <steven@midlink.org>
Wed, 4 Nov 2015 00:12:25 +0000 (01:12 +0100)
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>
device.h
macvlan.c
system-linux.c
vlan.c
vlandev.c

index 37814c8..4ff335d 100644 (file)
--- a/device.h
+++ b/device.h
@@ -58,8 +58,6 @@ struct device_type {
        struct list_head list;
        const char *name;
 
        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);
        const struct uci_blob_param_list *config_params;
 
        struct device *(*create)(const char *name, struct blob_attr *attr);
index 051fe05..a0f11ae 100644 (file)
--- a/macvlan.c
+++ b/macvlan.c
@@ -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_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;
        }
        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,
 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,
        .create = macvlan_create,
        .config_init = macvlan_config_init,
        .reload = macvlan_reload,
index 611acb8..4ccc9d2 100644 (file)
@@ -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);
                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)))
                goto out;
 
        if (!system_get_dev_sysctl("/sys/class/net/%s/carrier", dev->ifname, buf, sizeof(buf)))
diff --git a/vlan.c b/vlan.c
index 3d0a4cf..8e7141f 100644 (file)
--- a/vlan.c
+++ b/vlan.c
@@ -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_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);
        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,
        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;
                .free = free_vlan_if,
        };
        struct vlan_device *vldev;
index 884e6ef..b93527c 100644 (file)
--- a/vlandev.c
+++ b/vlandev.c
@@ -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_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;
        }
        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,
 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,
        .create = vlandev_create,
        .config_init = vlandev_config_init,
        .reload = vlandev_reload,