return;
}
+static void hostapd_notify_ubus(struct ubus_object *obj, char *bssname, char *event)
+{
+ char *event_type;
+
+ if (!ctx || !obj)
+ return;
+
+ if (asprintf(&event_type, "bss.%s", event) < 0)
+ return;
+
+ blob_buf_init(&b, 0);
+ blobmsg_add_string(&b, "name", bssname);
+ ubus_notify(ctx, obj, event_type, b.head, -1);
+ free(event_type);
+}
+
+static void hostapd_send_procd_event(char *bssname, char *event)
+{
+ char *name, *s;
+ uint32_t id;
+ void *v;
+
+ if (!ctx || ubus_lookup_id(ctx, "service", &id))
+ return;
+
+ if (asprintf(&name, "hostapd.%s.%s", bssname, event) < 0)
+ return;
+
+ blob_buf_init(&b, 0);
+
+ s = blobmsg_alloc_string_buffer(&b, "type", strlen(name) + 1);
+ sprintf(s, "%s", name);
+ blobmsg_add_string_buffer(&b);
+
+ v = blobmsg_open_table(&b, "data");
+ blobmsg_close_table(&b, v);
+
+ ubus_invoke(ctx, id, "event", b.head, NULL, NULL, 1000);
+
+ free(name);
+}
+
+static void hostapd_send_shared_event(struct ubus_object *obj, char *bssname, char *event)
+{
+ hostapd_send_procd_event(bssname, event);
+ hostapd_notify_ubus(obj, bssname, event);
+}
+
static void
hostapd_bss_del_ban(void *eloop_data, void *user_ctx)
{
struct blob_attr *msg)
{
struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj);
- return hostapd_reload_config(hapd->iface, 1);
+ int ret = hostapd_reload_config(hapd->iface, 1);
+
+ hostapd_send_shared_event(&hapd->iface->interfaces->ubus, hapd->conf->iface, "reload");
+ return ret;
}
static int
struct blob_attr *tb_l[__NR_SET_LIST_MAX];
struct blob_attr *tb[ARRAY_SIZE(nr_e_policy)];
struct blob_attr *cur;
- int ret = 0;
int rem;
hostapd_rrm_nr_enable(hapd);
struct wpa_ssid_value ssid;
struct wpabuf *data;
u8 bssid[ETH_ALEN];
- char *s;
+ char *s, *nr_s;
blobmsg_parse_array(nr_e_policy, ARRAY_SIZE(nr_e_policy), tb, blobmsg_data(cur), blobmsg_data_len(cur));
if (!tb[0] || !tb[1] || !tb[2])
goto invalid;
+ /* Neighbor Report binary */
+ nr_s = blobmsg_get_string(tb[2]);
+ data = wpabuf_parse_bin(nr_s);
+ if (!data)
+ goto invalid;
+
+ /* BSSID */
s = blobmsg_get_string(tb[0]);
- if (hwaddr_aton(s, bssid))
+ if (strlen(s) == 0) {
+ /* Copy BSSID from neighbor report */
+ if (hwaddr_compact_aton(nr_s, bssid))
+ goto invalid;
+ } else if (hwaddr_aton(s, bssid)) {
goto invalid;
+ }
+ /* SSID */
s = blobmsg_get_string(tb[1]);
- ssid.ssid_len = strlen(s);
- if (ssid.ssid_len > sizeof(ssid.ssid))
- goto invalid;
+ if (strlen(s) == 0) {
+ /* Copy SSID from hostapd BSS conf */
+ memcpy(&ssid, &hapd->conf->ssid, sizeof(ssid));
+ } else {
+ ssid.ssid_len = strlen(s);
+ if (ssid.ssid_len > sizeof(ssid.ssid))
+ goto invalid;
- memcpy(&ssid, s, ssid.ssid_len);
- data = wpabuf_parse_bin(blobmsg_get_string(tb[2]));
- if (!data)
- goto invalid;
+ memcpy(&ssid, s, ssid.ssid_len);
+ }
hostapd_neighbor_set(hapd, bssid, &ssid, data, NULL, NULL, 0);
wpabuf_free(data);
continue;
invalid:
- ret = UBUS_STATUS_INVALID_ARGUMENT;
+ return UBUS_STATUS_INVALID_ARGUMENT;
}
return 0;
obj->n_methods = bss_object_type.n_methods;
ret = ubus_add_object(ctx, obj);
hostapd_ubus_ref_inc();
+
+ hostapd_send_shared_event(&hapd->iface->interfaces->ubus, hapd->conf->iface, "add");
}
void hostapd_ubus_free_bss(struct hostapd_data *hapd)
if (!ctx)
return;
+ hostapd_send_shared_event(&hapd->iface->interfaces->ubus, hapd->conf->iface, "remove");
+
if (obj->id) {
ubus_remove_object(ctx, obj);
hostapd_ubus_ref_dec();