VIF_ATTR_DISABLED,
VIF_ATTR_NETWORK,
VIF_ATTR_NETWORK_VLAN,
+ VIF_ATTR_BRIDGE_ISOLATE,
VIF_ATTR_ISOLATE,
VIF_ATTR_MODE,
VIF_ATTR_PROXYARP,
[VIF_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
[VIF_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_ARRAY },
[VIF_ATTR_NETWORK_VLAN] = { .name = "network_vlan", .type = BLOBMSG_TYPE_ARRAY },
+ [VIF_ATTR_BRIDGE_ISOLATE] = { .name = "bridge_isolate", .type = BLOBMSG_TYPE_BOOL },
[VIF_ATTR_ISOLATE] = { .name = "isolate", .type = BLOBMSG_TYPE_BOOL },
[VIF_ATTR_MODE] = { .name = "mode", .type = BLOBMSG_TYPE_STRING },
[VIF_ATTR_PROXYARP] = { .name = "proxy_arp", .type = BLOBMSG_TYPE_BOOL },
VLAN_ATTR_DISABLED,
VLAN_ATTR_NETWORK,
VLAN_ATTR_NETWORK_VLAN,
+ VLAN_ATTR_BRIDGE_ISOLATE,
VLAN_ATTR_ISOLATE,
VLAN_ATTR_MCAST_TO_UCAST,
__VLAN_ATTR_MAX,
[VLAN_ATTR_DISABLED] = { .name = "disabled", .type = BLOBMSG_TYPE_BOOL },
[VLAN_ATTR_NETWORK] = { .name = "network", .type = BLOBMSG_TYPE_ARRAY },
[VLAN_ATTR_NETWORK_VLAN] = { .name = "network_vlan", .type = BLOBMSG_TYPE_ARRAY },
+ [VLAN_ATTR_BRIDGE_ISOLATE] = { .name = "bridge_isolate", .type = BLOBMSG_TYPE_BOOL },
[VLAN_ATTR_ISOLATE] = { .name = "isolate", .type = BLOBMSG_TYPE_BOOL },
[VLAN_ATTR_MCAST_TO_UCAST] = { .name = "multicast_to_unicast", .type = BLOBMSG_TYPE_BOOL },
};
static void
wireless_process_free(struct wireless_device *wdev, struct wireless_process *proc)
{
- D(WIRELESS, "Wireless device '%s' free pid %d\n", wdev->name, proc->pid);
+ D(WIRELESS, "Wireless device '%s' free pid %d", wdev->name, proc->pid);
list_del(&proc->list);
free(proc);
bool check = wireless_process_check(proc);
if (check && !proc->keep) {
- D(WIRELESS, "Wireless device '%s' kill pid %d\n", wdev->name, proc->pid);
+ D(WIRELESS, "Wireless device '%s' kill pid %d", wdev->name, proc->pid);
kill(proc->pid, signal);
}
struct interface *iface;
struct blob_attr *cur;
const char *network;
+ struct device *dev;
size_t rem;
if (!vif->network || !vif->ifname)
if (!ifname)
ifname = vif->ifname;
- if (up) {
- struct device *dev = __device_get(ifname, 2, false);
+ if (!up)
+ goto out;
- if (dev && !strcmp(ifname, vif->ifname)) {
- dev->wireless_isolate = vif->isolate;
- dev->wireless_proxyarp = vif->proxyarp;
- dev->wireless = true;
- dev->wireless_ap = vif->ap_mode;
- wireless_device_set_mcast_to_unicast(dev, vif->multicast_to_unicast);
- dev->bpdu_filter = dev->wireless_ap;
- }
- }
+ dev = __device_get(ifname, 2, false);
+ if (!dev)
+ goto out;
+
+ dev->wireless = true;
+ dev->settings.flags |= DEV_OPT_ISOLATE;
+ dev->settings.isolate = vif->bridge_isolate;
+ if (strcmp(ifname, vif->ifname) != 0)
+ goto out;
+
+ dev->wireless_isolate = vif->isolate;
+ dev->wireless_proxyarp = vif->proxyarp;
+ dev->wireless_ap = vif->ap_mode;
+ wireless_device_set_mcast_to_unicast(dev, vif->multicast_to_unicast);
+ dev->bpdu_filter = dev->wireless_ap;
+
+out:
blobmsg_for_each_attr(cur, vif->network, rem) {
network = blobmsg_data(cur);
dev->wireless = true;
dev->wireless_ap = true;
dev->bpdu_filter = true;
+ dev->settings.flags |= DEV_OPT_ISOLATE;
+ dev->settings.isolate = vlan->bridge_isolate;
wireless_device_set_mcast_to_unicast(dev, vlan->multicast_to_unicast);
}
}
return;
wireless_handler_stop(wdev);
- D(WIRELESS, "Cancel wireless device '%s' setup\n", wdev->name);
+ D(WIRELESS, "Cancel wireless device '%s' setup", wdev->name);
wdev->cancel = true;
uloop_timeout_set(&wdev->timeout, 10 * 1000);
}
if (wdev->serialize)
handler_pending = true;
- D(WIRELESS, "Wireless device '%s' run %s handler\n", wdev->name, action);
+ D(WIRELESS, "Wireless device '%s' run %s handler", wdev->name, action);
if (!up && wdev->prev_config) {
config = blobmsg_format_json(wdev->prev_config, true);
free(wdev->prev_config);
if (blob_attr_equal(wdev->config, new_config) && wdev->disabled == disabled)
return;
- D(WIRELESS, "Update configuration of wireless device '%s'\n", wdev->name);
+ D(WIRELESS, "Update configuration of wireless device '%s'", wdev->name);
free(wdev->config);
wdev->config = blob_memdup(new_config);
wdev->disabled = disabled;
struct wireless_device *wd_new = container_of(node_new, struct wireless_device, node);
if (wd_old && wd_new) {
- D(WIRELESS, "Update wireless device '%s'\n", wd_old->name);
+ D(WIRELESS, "Update wireless device '%s'", wd_old->name);
wdev_change_config(wd_old, wd_new);
} else if (wd_old) {
- D(WIRELESS, "Delete wireless device '%s'\n", wd_old->name);
+ D(WIRELESS, "Delete wireless device '%s'", wd_old->name);
wdev_set_config_state(wd_old, IFC_REMOVE);
} else if (wd_new) {
- D(WIRELESS, "Create wireless device '%s'\n", wd_new->name);
+ D(WIRELESS, "Create wireless device '%s'", wd_new->name);
wdev_create(wd_new);
}
}
drv->node.key = drv->name;
avl_insert(&wireless_drivers, &drv->node);
- D(WIRELESS, "Add handler for script %s: %s\n", script, name);
+ D(WIRELESS, "Add handler for script %s: %s", script, name);
}
void wireless_init(void)
cur = tb[VIF_ATTR_MODE];
vif->ap_mode = cur && !strcmp(blobmsg_get_string(cur), "ap");
+ cur = tb[VIF_ATTR_BRIDGE_ISOLATE];
+ vif->bridge_isolate = cur && blobmsg_get_bool(cur);
+
cur = tb[VIF_ATTR_ISOLATE];
- vif->isolate = vif->ap_mode && cur && blobmsg_get_bool(cur);
+ vif->isolate = cur && blobmsg_get_bool(cur);
cur = tb[VIF_ATTR_PROXYARP];
vif->proxyarp = vif->ap_mode && cur && blobmsg_get_bool(cur);
return;
}
- D(WIRELESS, "Update wireless interface %s on device %s\n", vif_new->name, wdev->name);
+ D(WIRELESS, "Update wireless interface %s on device %s", vif_new->name, wdev->name);
wireless_interface_handle_link(vif_old, NULL, false);
free(vif_old->config);
vif_old->config = blob_memdup(vif_new->config);
wireless_interface_init_config(vif_old);
free(vif_new);
} else if (vif_new) {
- D(WIRELESS, "Create new wireless interface %s on device %s\n", vif_new->name, wdev->name);
+ D(WIRELESS, "Create new wireless interface %s on device %s", vif_new->name, wdev->name);
vif_new->section = strdup(vif_new->section);
vif_new->config = blob_memdup(vif_new->config);
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);
+ D(WIRELESS, "Delete wireless interface %s on device %s", vif_old->name, wdev->name);
wireless_interface_handle_link(vif_old, NULL, false);
vif_free(vif_old);
}
if ((cur = tb[VLAN_ATTR_NETWORK_VLAN]))
vlan->network_vlan = cur;
+ cur = tb[VLAN_ATTR_BRIDGE_ISOLATE];
+ vlan->bridge_isolate = cur && blobmsg_get_bool(cur);
+
cur = tb[VLAN_ATTR_ISOLATE];
- if (cur)
- vlan->isolate = blobmsg_get_bool(cur);
+ vlan->isolate = cur && blobmsg_get_bool(cur);
cur = tb[VLAN_ATTR_MCAST_TO_UCAST];
vlan->multicast_to_unicast = cur ? blobmsg_get_bool(cur) : -1;
return;
}
- D(WIRELESS, "Update wireless vlan %s on device %s\n", vlan_new->name, wdev->name);
+ D(WIRELESS, "Update wireless vlan %s on device %s", vlan_new->name, wdev->name);
wireless_vlan_handle_link(vlan_old, false);
free(vlan_old->config);
vlan_old->config = blob_memdup(vlan_new->config);
wireless_vlan_init_config(vlan_old);
free(vlan_new);
} else if (vlan_new) {
- D(WIRELESS, "Create new wireless vlan %s on device %s\n", vlan_new->name, wdev->name);
+ D(WIRELESS, "Create new wireless vlan %s on device %s", vlan_new->name, wdev->name);
vlan_new->section = strdup(vlan_new->section);
vlan_new->config = blob_memdup(vlan_new->config);
wireless_vlan_init_config(vlan_new);
} else if (vlan_old) {
- D(WIRELESS, "Delete wireless vlan %s on device %s\n", vlan_old->name, wdev->name);
+ D(WIRELESS, "Delete wireless vlan %s on device %s", vlan_old->name, wdev->name);
wireless_vlan_handle_link(vlan_old, false);
free((void *) vlan_old->section);
free(vlan_old->config);
return;
}
- D(WIRELESS, "Update wireless station %s on device %s\n", sta_new->name, wdev->name);
+ D(WIRELESS, "Update wireless station %s on device %s", sta_new->name, wdev->name);
free(sta_old->config);
sta_old->config = blob_memdup(sta_new->config);
free(sta_new);
} else if (sta_new) {
- D(WIRELESS, "Create new wireless station %s on device %s\n", sta_new->name, wdev->name);
+ D(WIRELESS, "Create new wireless station %s on device %s", sta_new->name, wdev->name);
sta_new->section = strdup(sta_new->section);
sta_new->config = blob_memdup(sta_new->config);
} else if (sta_old) {
- D(WIRELESS, "Delete wireless station %s on device %s\n", sta_old->name, wdev->name);
+ D(WIRELESS, "Delete wireless station %s on device %s", sta_old->name, wdev->name);
free((void *) sta_old->section);
free(sta_old->config);
free(sta_old);
if (wireless_process_check(proc))
continue;
- D(WIRELESS, "Wireless device '%s' pid %d has terminated\n", wdev->name, proc->pid);
+ D(WIRELESS, "Wireless device '%s' pid %d has terminated", wdev->name, proc->pid);
if (proc->required)
restart = true;
if (tb[PROC_ATTR_KEEP])
proc->keep = blobmsg_get_bool(tb[PROC_ATTR_KEEP]);
- D(WIRELESS, "Wireless device '%s' add pid %d\n", wdev->name, proc->pid);
+ D(WIRELESS, "Wireless device '%s' add pid %d", wdev->name, proc->pid);
list_add(&proc->list, &wdev->script_proc);
uloop_timeout_set(&wdev->script_check, 0);
struct wireless_interface *vif;
struct interface *iface;
struct blob_attr *cur;
- int rem;
+ size_t rem;
vlist_for_each_element(&wdev->interfaces, vif, node) {
int enabled = -1;