projects
/
project
/
netifd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
wireless: cancel the script check timer
[project/netifd.git]
/
wireless.c
diff --git
a/wireless.c
b/wireless.c
index
508d35e
..
0fd209e
100644
(file)
--- a/
wireless.c
+++ b/
wireless.c
@@
-40,7
+40,7
@@
enum {
static const struct blobmsg_policy vif_policy[__VIF_ATTR_MAX] = {
[VIF_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
static const struct blobmsg_policy vif_policy[__VIF_ATTR_MAX] = {
[VIF_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
- [VIF_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_
STRING
},
+ [VIF_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_
ARRAY
},
};
static const struct uci_blob_param_list vif_param = {
};
static const struct uci_blob_param_list vif_param = {
@@
-57,23
+57,33
@@
put_container(struct blob_buf *buf, struct blob_attr *attr, const char *name)
}
static void
}
static void
-vif_config_add_bridge(struct blob_buf *buf,
const char *network
, bool prepare)
+vif_config_add_bridge(struct blob_buf *buf,
struct blob_attr *networks
, bool prepare)
{
struct interface *iface;
{
struct interface *iface;
- struct device *dev;
+ struct device *dev = NULL;
+ struct blob_attr *cur;
+ const char *network;
+ int rem;
- if (!network)
+ if (!network
s
)
return;
return;
- iface = vlist_find(&interfaces, network, iface, node);
- if (!iface)
- return;
+ blobmsg_for_each_attr(cur, networks, rem) {
+ network = blobmsg_data(cur);
-
dev = iface->main_dev.dev
;
-
if (!dev
)
-
return
;
+
iface = vlist_find(&interfaces, network, iface, node)
;
+
if (!iface
)
+
continue
;
- if (dev->type != &bridge_device_type)
+ dev = iface->main_dev.dev;
+ if (!dev)
+ return;
+
+ if (dev->type != &bridge_device_type)
+ return;
+ }
+
+ if (!dev)
return;
if (dev->hotplug_ops && dev->hotplug_ops->prepare)
return;
if (dev->hotplug_ops && dev->hotplug_ops->prepare)
@@
-170,6
+180,7
@@
wireless_device_free_state(struct wireless_device *wdev)
{
struct wireless_interface *vif;
{
struct wireless_interface *vif;
+ uloop_timeout_cancel(&wdev->script_check);
uloop_timeout_cancel(&wdev->timeout);
wireless_complete_kill_request(wdev);
free(wdev->data);
uloop_timeout_cancel(&wdev->timeout);
wireless_complete_kill_request(wdev);
free(wdev->data);
@@
-184,15
+195,22
@@
wireless_device_free_state(struct wireless_device *wdev)
static void wireless_interface_handle_link(struct wireless_interface *vif, bool up)
{
struct interface *iface;
static void wireless_interface_handle_link(struct wireless_interface *vif, bool up)
{
struct interface *iface;
+ struct blob_attr *cur;
+ const char *network;
+ int rem;
if (!vif->network || !vif->ifname)
return;
if (!vif->network || !vif->ifname)
return;
- iface = vlist_find(&interfaces, vif->network, iface, node);
- if (!iface)
- return;
+ blobmsg_for_each_attr(cur, vif->network, rem) {
+ network = blobmsg_data(cur);
- interface_handle_link(iface, vif->ifname, up);
+ iface = vlist_find(&interfaces, network, iface, node);
+ if (!iface)
+ continue;
+
+ interface_handle_link(iface, vif->ifname, up);
+ }
}
static void
}
static void
@@
-253,9
+271,10
@@
__wireless_device_set_up(struct wireless_device *wdev)
static void
wireless_device_free(struct wireless_device *wdev)
{
static void
wireless_device_free(struct wireless_device *wdev)
{
- vlist_flush_all(&wdev->interfaces);
- free(wdev->config);
- free(wdev);
+ vlist_flush_all(&wdev->interfaces);
+ avl_delete(&wireless_devices.avl, &wdev->node.avl);
+ free(wdev->config);
+ free(wdev);
}
static void
}
static void
@@
-263,10
+282,10
@@
wdev_handle_config_change(struct wireless_device *wdev)
{
enum interface_config_state state = wdev->config_state;
{
enum interface_config_state state = wdev->config_state;
- wdev->config_state = IFC_NORMAL;
switch(state) {
case IFC_NORMAL:
case IFC_RELOAD:
switch(state) {
case IFC_NORMAL:
case IFC_RELOAD:
+ wdev->config_state = IFC_NORMAL;
if (wdev->autostart)
__wireless_device_set_up(wdev);
break;
if (wdev->autostart)
__wireless_device_set_up(wdev);
break;
@@
-377,12
+396,10
@@
wireless_device_set_down(struct wireless_device *wdev)
static void
wdev_set_config_state(struct wireless_device *wdev, enum interface_config_state s)
{
static void
wdev_set_config_state(struct wireless_device *wdev, enum interface_config_state s)
{
- enum interface_config_state old_state = wdev->config_state;
-
- wdev->config_state = s;
- if (old_state != IFC_NORMAL)
+ if (wdev->config_state != IFC_NORMAL)
return;
return;
+ wdev->config_state = s;
if (wdev->state == IFS_DOWN)
wdev_handle_config_change(wdev);
else
if (wdev->state == IFS_DOWN)
wdev_handle_config_change(wdev);
else
@@
-494,7
+511,7
@@
wireless_interface_init_config(struct wireless_interface *vif)
blobmsg_parse(vif_policy, __VIF_ATTR_MAX, tb, blob_data(vif->config), blob_len(vif->config));
if ((cur = tb[VIF_ATTR_NETWORK]))
blobmsg_parse(vif_policy, __VIF_ATTR_MAX, tb, blob_data(vif->config), blob_len(vif->config));
if ((cur = tb[VIF_ATTR_NETWORK]))
- vif->network =
blobmsg_data(cur)
;
+ vif->network =
cur
;
}
static void
}
static void
@@
-608,7
+625,6
@@
wireless_device_create(struct wireless_driver *drv, const char *name, struct blo
INIT_LIST_HEAD(&wdev->script_proc);
vlist_init(&wdev->interfaces, avl_strcmp, vif_update);
wdev->interfaces.keep_old = true;
INIT_LIST_HEAD(&wdev->script_proc);
vlist_init(&wdev->interfaces, avl_strcmp, vif_update);
wdev->interfaces.keep_old = true;
- wdev->interfaces.no_delete = true;
vlist_add(&wireless_devices, &wdev->node, wdev->name);
wdev->timeout.cb = wireless_device_setup_timeout;
vlist_add(&wireless_devices, &wdev->node, wdev->name);
wdev->timeout.cb = wireless_device_setup_timeout;