VIF_ATTR_DISABLED,
VIF_ATTR_NETWORK,
VIF_ATTR_ISOLATE,
+ VIF_ATTR_MODE,
__VIF_ATTR_MAX,
};
[VIF_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
[VIF_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_ARRAY },
[VIF_ATTR_ISOLATE] = { .name = "isolate", .type = BLOBMSG_TYPE_BOOL },
+ [VIF_ATTR_MODE] = { .name = "mode", .type = BLOBMSG_TYPE_STRING },
};
static const struct uci_blob_param_list vif_param = {
if (!dev)
return;
- if (dev->type != &bridge_device_type)
+ if (!dev->type->bridge_capability)
return;
}
if (dev) {
dev->wireless_isolate = vif->isolate;
dev->wireless = true;
+ dev->wireless_ap = vif->ap_mode;
}
}
if (wdev->disabled)
return;
+ if (wdev->retry_setup_failed)
+ return;
+
+ if (!wdev->autostart)
+ return;
+
if (wdev->state != IFS_DOWN || config_init)
return;
switch(state) {
case IFC_NORMAL:
case IFC_RELOAD:
+ __wireless_device_set_up(wdev);
+
wdev->config_state = IFC_NORMAL;
- if (wdev->autostart)
- __wireless_device_set_up(wdev);
break;
case IFC_REMOVE:
wireless_device_free(wdev);
return;
if (--wdev->retry < 0)
- wdev->autostart = false;
+ wdev->retry_setup_failed = true;
__wireless_device_set_down(wdev);
}
void
wireless_device_set_down(struct wireless_device *wdev)
{
+ wdev->retry_setup_failed = false;
wdev->autostart = false;
__wireless_device_set_down(wdev);
}
free(wdev->config);
wdev->config = blob_memdup(new_config);
wdev->disabled = disabled;
+ wdev->retry_setup_failed = false;
wdev_set_config_state(wdev, IFC_RELOAD);
}
if ((cur = tb[VIF_ATTR_NETWORK]))
vif->network = cur;
+
+ cur = tb[VIF_ATTR_ISOLATE];
+ if (cur)
+ vif->isolate = blobmsg_get_bool(cur);
+
+ cur = tb[VIF_ATTR_MODE];
+ if (cur)
+ vif->ap_mode = !strcmp(blobmsg_get_string(cur), "ap");
}
static void
}
D(WIRELESS, "Update wireless interface %s on device %s\n", vif_new->name, wdev->name);
+ wireless_interface_handle_link(vif_old, false);
free(vif_old->config);
vif_old->config = blob_memdup(vif_new->config);
+ vif_old->isolate = vif_new->isolate;
+ vif_old->ap_mode = vif_new->ap_mode;
wireless_interface_init_config(vif_old);
free(vif_new);
} else if (vif_new) {
wireless_interface_init_config(vif_new);
} else if (vif_old) {
D(WIRELESS, "Delete wireless interface %s on device %s\n", vif_old->name, wdev->name);
+ wireless_interface_handle_link(vif_old, false);
free((void *) vif_old->section);
free(vif_old->config);
free(vif_old);
wdev->config_state = IFC_NORMAL;
wdev->name = strcpy(name_buf, name);
wdev->config = data;
- wdev->config_autostart = true;
- wdev->autostart = wdev->config_autostart;
+ wdev->retry_setup_failed = false;
+ wdev->autostart = true;
INIT_LIST_HEAD(&wdev->script_proc);
vlist_init(&wdev->interfaces, avl_strcmp, vif_update);
wdev->interfaces.keep_old = true;
vif->section = section;
vif->isolate = false;
- cur = tb[VIF_ATTR_ISOLATE];
- if (cur && blobmsg_get_bool(cur))
- vif->isolate = blobmsg_get_bool(cur);
-
vlist_add(&wdev->interfaces, &vif->node, vif->name);
}
blobmsg_add_u8(b, "pending", wdev->state == IFS_SETUP || wdev->state == IFS_TEARDOWN);
blobmsg_add_u8(b, "autostart", wdev->autostart);
blobmsg_add_u8(b, "disabled", wdev->disabled);
+ blobmsg_add_u8(b, "retry_setup_failed", wdev->retry_setup_failed);
put_container(b, wdev->config, "config");
i = blobmsg_open_array(b, "interfaces");
struct wireless_device *wdev;
vlist_for_each_element(&wireless_devices, wdev, node)
- if (wdev->autostart)
- __wireless_device_set_up(wdev);
+ __wireless_device_set_up(wdev);
}