+/* creates a wireless station object. Called by config */
+void
+wireless_station_create(struct wireless_interface *vif, struct blob_attr *data, const char *section)
+{
+ struct wireless_station *sta;
+ struct blob_attr *tb[__STA_ATTR_MAX];
+ struct blob_attr *cur;
+ char *name_buf;
+ char name[8];
+
+ blobmsg_parse(sta_policy, __STA_ATTR_MAX, tb, blob_data(data), blob_len(data));
+
+ cur = tb[STA_ATTR_DISABLED];
+ if (cur && blobmsg_get_bool(cur))
+ return;
+
+ sprintf(name, "%d", vif->sta_idx++);
+
+ sta = calloc_a(sizeof(*sta),
+ &name_buf, strlen(name) + 1);
+ sta->name = strcpy(name_buf, name);
+ sta->config = data;
+ sta->section = section;
+
+ vlist_add(&vif->stations, &sta->node, sta->name);
+}
+
+/* ubus callback network.wireless.status, runs for every interface, encode the station */
+static void
+wireless_station_status(struct wireless_station *sta, struct blob_buf *b)
+{
+ void *i;
+
+ i = blobmsg_open_table(b, NULL);
+ if (sta->section)
+ blobmsg_add_string(b, "section", sta->section);
+ put_container(b, sta->config, "config");
+ blobmsg_close_table(b, i);
+}
+
+/* create a vlan object. Called by config */
+void
+wireless_vlan_create(struct wireless_interface *vif, struct blob_attr *data, const char *section)
+{
+ struct wireless_vlan *vlan;
+ struct blob_attr *tb[__VLAN_ATTR_MAX];
+ struct blob_attr *cur;
+ char *name_buf;
+ char name[8];
+
+ blobmsg_parse(vlan_policy, __VLAN_ATTR_MAX, tb, blob_data(data), blob_len(data));
+
+ cur = tb[VLAN_ATTR_DISABLED];
+ if (cur && blobmsg_get_bool(cur))
+ return;
+
+ sprintf(name, "%d", vif->vlan_idx++);
+
+ vlan = calloc_a(sizeof(*vlan), &name_buf, strlen(name) + 1);
+ vlan->name = strcpy(name_buf, name);
+ vlan->config = data;
+ vlan->section = section;
+
+ vlist_add(&vif->vlans, &vlan->node, vlan->name);
+}
+
+/* ubus callback network.wireless.status, runs for every interface, encode the vlan informations */
+static void
+wireless_vlan_status(struct wireless_vlan *vlan, struct blob_buf *b)
+{
+ void *i;
+
+ i = blobmsg_open_table(b, NULL);
+ if (vlan->section)
+ blobmsg_add_string(b, "section", vlan->section);
+ if (vlan->ifname)
+ blobmsg_add_string(b, "ifname", vlan->ifname);
+ put_container(b, vlan->config, "config");
+ blobmsg_close_table(b, i);
+}
+
+/* create a wireless interface object. Called by config */
+struct wireless_interface* wireless_interface_create(struct wireless_device *wdev, struct blob_attr *data, const char *section)