[OpenWrt-Devel] [PATCH 6/6] interface: teardown on l3_dev link lost.
Yousong Zhou
yszhou4tech at gmail.com
Tue May 19 08:38:33 EDT 2015
This is mainly for shell protocols that has no_proto_task so that we can
still teardown and setup the interface on l3_dev link lost instead of
depending on running state of proto_task.
Also rename related callbacks for better clarification.
Signed-off-by: Yousong Zhou <yszhou4tech at gmail.com>
---
interface.c | 28 +++++++++++++++++++++++-----
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/interface.c b/interface.c
index 997a721..baf521a 100644
--- a/interface.c
+++ b/interface.c
@@ -333,14 +333,14 @@ interface_set_link_state(struct interface *iface, bool new_state)
}
static void
-interface_ext_cb(struct device_user *dep, enum device_event ev)
+interface_ext_dev_cb(struct device_user *dep, enum device_event ev)
{
if (ev == DEV_EVENT_REMOVE)
device_remove_user(dep);
}
static void
-interface_cb(struct device_user *dep, enum device_event ev)
+interface_main_dev_cb(struct device_user *dep, enum device_event ev)
{
struct interface *iface;
bool new_state = false;
@@ -372,6 +372,24 @@ interface_cb(struct device_user *dep, enum device_event ev)
}
}
+static void
+interface_l3_dev_cb(struct device_user *dep, enum device_event ev)
+{
+ struct interface *iface;
+
+ iface = container_of(dep, struct interface, l3_dev);
+ if (iface->l3_dev.dev == iface->main_dev.dev)
+ return;
+
+ switch (ev) {
+ case DEV_EVENT_LINK_DOWN:
+ interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, false);
+ break;
+ default:
+ break;
+ }
+}
+
void
interface_set_available(struct interface *iface, bool new_state)
{
@@ -712,8 +730,9 @@ interface_alloc(const char *name, struct blob_attr *config)
avl_init(&iface->data, avl_strcmp, false, NULL);
iface->config_ip.enabled = false;
- iface->main_dev.cb = interface_cb;
- iface->ext_dev.cb = interface_ext_cb;
+ iface->main_dev.cb = interface_main_dev_cb;
+ iface->l3_dev.cb = interface_l3_dev_cb;
+ iface->ext_dev.cb = interface_ext_dev_cb;
blobmsg_parse(iface_attrs, IFACE_ATTR_MAX, tb,
blob_data(config), blob_len(config));
@@ -822,7 +841,6 @@ static bool __interface_add(struct interface *iface, struct blob_attr *config, b
iface->ifname = blobmsg_data(cur);
}
-
iface->config = config;
vlist_add(&interfaces, &iface->node, iface->name);
return true;
--
1.7.10.4
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list