X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=config.c;h=a7f9c0b64a44567ecb11c32aa3b059883cc507a7;hb=HEAD;hp=e1c01e12994ba222e062e633e5094b2aafa65c02;hpb=1fe1d4f5e8c2e235a1ab4e0df8baa734142fe994;p=project%2Fnetifd.git diff --git a/config.c b/config.c index e1c01e1..d187152 100644 --- a/config.c +++ b/config.c @@ -27,6 +27,7 @@ #include "proto.h" #include "wireless.h" #include "config.h" +#include "ubus.h" bool config_init = false; @@ -146,7 +147,7 @@ config_parse_bridge_interface(struct uci_section *s, struct device_type *devtype config_fixup_bridge_vlan_filtering(s, name); uci_to_blob(&b, s, devtype->config_params); if (!device_create(name, devtype, b.head)) { - D(INTERFACE, "Failed to create '%s' device for interface '%s'\n", + D(INTERFACE, "Failed to create '%s' device for interface '%s'", devtype->name, s->e.name); } @@ -557,8 +558,8 @@ config_parse_wireless_device(struct uci_section *s) wireless_device_create(drv, s->e.name, b.head); } -static struct wireless_interface* -config_parse_wireless_interface(struct wireless_device *wdev, struct uci_section *s) +static void +config_parse_wireless_vlan(struct wireless_interface *vif, struct uci_section *s) { char *name; @@ -566,12 +567,12 @@ config_parse_wireless_interface(struct wireless_device *wdev, struct uci_section sprintf(name, "@%s[%d]", s->type, config_section_idx(s)); blob_buf_init(&b, 0); - uci_to_blob(&b, s, wdev->drv->interface.config); - return wireless_interface_create(wdev, b.head, s->anonymous ? name : s->e.name); + uci_to_blob(&b, s, vif->wdev->drv->vlan.config); + wireless_vlan_create(vif, b.head, s->anonymous ? name : s->e.name); } static void -config_parse_wireless_vlan(struct wireless_device *wdev, char *vif, struct uci_section *s) +config_parse_wireless_station(struct wireless_interface *vif, struct uci_section *s) { char *name; @@ -579,21 +580,125 @@ config_parse_wireless_vlan(struct wireless_device *wdev, char *vif, struct uci_s sprintf(name, "@%s[%d]", s->type, config_section_idx(s)); blob_buf_init(&b, 0); - uci_to_blob(&b, s, wdev->drv->vlan.config); - wireless_vlan_create(wdev, vif, b.head, s->anonymous ? name : s->e.name); + uci_to_blob(&b, s, vif->wdev->drv->station.config); + wireless_station_create(vif, b.head, s->anonymous ? name : s->e.name); } static void -config_parse_wireless_station(struct wireless_device *wdev, char *vif, struct uci_section *s) +config_parse_wireless_interface(struct wireless_device *wdev, struct uci_section *s) { + struct wireless_interface *vif; + struct uci_element *f; char *name; name = alloca(strlen(s->type) + 16); sprintf(name, "@%s[%d]", s->type, config_section_idx(s)); blob_buf_init(&b, 0); - uci_to_blob(&b, s, wdev->drv->station.config); - wireless_station_create(wdev, vif, b.head, s->anonymous ? name : s->e.name); + uci_to_blob(&b, s, wdev->drv->interface.config); + vif = wireless_interface_create(wdev, b.head, s->anonymous ? name : s->e.name); + if (!vif) + return; + + if (s->anonymous) + goto out; + + uci_foreach_element(&uci_wireless->sections, f) { + struct uci_section *cur = uci_to_section(f); + const char *vif_name; + + if (strcmp(cur->type, "wifi-vlan") != 0) + continue; + + vif_name = uci_lookup_option_string(uci_ctx, cur, "iface"); + if (vif_name && strcmp(s->e.name, vif_name)) + continue; + config_parse_wireless_vlan(vif, cur); + } + + uci_foreach_element(&uci_wireless->sections, f) { + struct uci_section *cur = uci_to_section(f); + const char *vif_name; + + if (strcmp(cur->type, "wifi-station") != 0) + continue; + + vif_name = uci_lookup_option_string(uci_ctx, cur, "iface"); + if (vif_name && strcmp(s->e.name, vif_name)) + continue; + config_parse_wireless_station(vif, cur); + } + +out: + vlist_flush(&vif->vlans); + vlist_flush(&vif->stations); +} + +static void +config_init_procd_wireless_interface(const char *wdev_name, const char *vif_name, + struct blob_attr *config, + struct blob_attr *vlans, + struct blob_attr *stations) +{ + struct wireless_interface *vif; + struct wireless_device *wdev; + struct blob_attr *cur; + char name[16]; + int idx = 0; + int rem; + + wdev = vlist_find(&wireless_devices, wdev_name, wdev, node); + if (!wdev) { + D(WIRELESS, "device %s not found!", wdev_name); + return; + } + + vif = wireless_interface_create(wdev, config, vif_name); + if (!vif) + return; + + blobmsg_for_each_attr(cur, vlans, rem) { + snprintf(name, sizeof(name), "%d", ++idx); + wireless_vlan_create(vif, cur, name); + } + + blobmsg_for_each_attr(cur, stations, rem) { + snprintf(name, sizeof(name), "%d", ++idx); + wireless_station_create(vif, cur, name); + } + + vlist_flush(&vif->vlans); + vlist_flush(&vif->stations); +} + +static void +config_procd_wireless_interface_cb(struct blob_attr *data) +{ + enum { + UDATA_ATTR_DEVICE, + UDATA_ATTR_CONFIG, + UDATA_ATTR_STATIONS, + UDATA_ATTR_VLANS, + __UDATA_ATTR_MAX, + }; + static const struct blobmsg_policy policy[__UDATA_ATTR_MAX] = { + [UDATA_ATTR_DEVICE] = { "device", BLOBMSG_TYPE_STRING }, + [UDATA_ATTR_CONFIG] = { "config", BLOBMSG_TYPE_TABLE }, + [UDATA_ATTR_STATIONS] = { "stations", BLOBMSG_TYPE_ARRAY }, + [UDATA_ATTR_VLANS] = { "vlans", BLOBMSG_TYPE_ARRAY }, + }; + struct blob_attr *tb[__UDATA_ATTR_MAX]; + const char *dev; + + blobmsg_parse_attr(policy, __UDATA_ATTR_MAX, tb, data); + if (!tb[UDATA_ATTR_DEVICE] || !tb[UDATA_ATTR_CONFIG]) + return; + + dev = blobmsg_get_string(tb[UDATA_ATTR_DEVICE]); + config_init_procd_wireless_interface(dev, blobmsg_name(data), + tb[UDATA_ATTR_CONFIG], + tb[UDATA_ATTR_VLANS], + tb[UDATA_ATTR_STATIONS]); } static void @@ -604,7 +709,7 @@ config_init_wireless(void) const char *dev_name; if (!uci_wireless) { - DPRINTF("No wireless configuration found\n"); + D(WIRELESS, "No wireless configuration found"); return; } @@ -623,16 +728,10 @@ config_init_wireless(void) vlist_for_each_element(&wireless_devices, wdev, node) { wdev->vif_idx = 0; vlist_update(&wdev->interfaces); - wdev->vlan_idx = 0; - vlist_update(&wdev->vlans); - wdev->sta_idx = 0; - vlist_update(&wdev->stations); } uci_foreach_element(&uci_wireless->sections, e) { struct uci_section *s = uci_to_section(e); - struct wireless_interface *vif; - struct uci_element *f; if (strcmp(s->type, "wifi-iface") != 0) continue; @@ -643,46 +742,17 @@ config_init_wireless(void) wdev = vlist_find(&wireless_devices, dev_name, wdev, node); if (!wdev) { - DPRINTF("device %s not found!\n", dev_name); + D(WIRELESS, "device %s not found!", dev_name); continue; } - vif = config_parse_wireless_interface(wdev, s); - - if (!vif || s->anonymous) - continue; - uci_foreach_element(&uci_wireless->sections, f) { - struct uci_section *s = uci_to_section(f); - const char *vif_name; - - if (strcmp(s->type, "wifi-vlan") != 0) - continue; - - vif_name = uci_lookup_option_string(uci_ctx, s, "iface"); - if (vif_name && strcmp(e->name, vif_name)) - continue; - config_parse_wireless_vlan(wdev, vif->name, s); - } - - uci_foreach_element(&uci_wireless->sections, f) { - struct uci_section *s = uci_to_section(f); - const char *vif_name; - - if (strcmp(s->type, "wifi-station") != 0) - continue; - - vif_name = uci_lookup_option_string(uci_ctx, s, "iface"); - if (vif_name && strcmp(e->name, vif_name)) - continue; - config_parse_wireless_station(wdev, vif->name, s); - } + config_parse_wireless_interface(wdev, s); } - vlist_for_each_element(&wireless_devices, wdev, node) { + netifd_ubus_get_procd_data("wifi-iface", config_procd_wireless_interface_cb); + + vlist_for_each_element(&wireless_devices, wdev, node) vlist_flush(&wdev->interfaces); - vlist_flush(&wdev->vlans); - vlist_flush(&wdev->stations); - } } @@ -715,6 +785,42 @@ struct ether_addr *config_get_default_macaddr(const char *ifname) return ether_aton(blobmsg_get_string(cur)); } +int config_get_default_gro(const char *ifname) +{ + struct blob_attr *cur; + + if (!board_netdevs) + return -1; + + cur = config_find_blobmsg_attr(board_netdevs, ifname, BLOBMSG_TYPE_TABLE); + if (!cur) + return -1; + + cur = config_find_blobmsg_attr(cur, "gro", BLOBMSG_TYPE_BOOL); + if (!cur) + return -1; + + return blobmsg_get_bool(cur); +} + +const char *config_get_default_conduit(const char *ifname) +{ + struct blob_attr *cur; + + if (!board_netdevs) + return NULL; + + cur = config_find_blobmsg_attr(board_netdevs, ifname, BLOBMSG_TYPE_TABLE); + if (!cur) + return NULL; + + cur = config_find_blobmsg_attr(cur, "conduit", BLOBMSG_TYPE_STRING); + if (!cur) + return NULL; + + return blobmsg_get_string(cur); +} + static void config_init_board(void) { @@ -728,7 +834,7 @@ config_init_board(void) free(board_netdevs); board_netdevs = NULL; - cur = config_find_blobmsg_attr(b.head, "network-device", + cur = config_find_blobmsg_attr(b.head, "network_device", BLOBMSG_TYPE_TABLE); if (!cur) return; @@ -780,7 +886,7 @@ config_init_all(void) vlist_flush(&interfaces); interface_refresh_assignments(false); interface_start_pending(); - wireless_start_pending(); + wireless_start_pending(0); return ret; }