[OpenWrt-Devel] [PATCH 4/5] hostapd: Add channel information to iface state event
Yury Shvedov
yshvedov at wimarksystems.com
Mon Oct 8 08:45:19 EDT 2018
This adds wide information about current channel of interface to
hostapd.iface_state event. Additional event sent when interface
completes csa operation.
Signed-off-by: Yury Shvedov <yshvedov at wimarksystems.com>
---
.../hostapd/patches/600-ubus_support.patch | 8 +++
.../services/hostapd/src/src/ap/ubus.c | 69 +++++++++++++++++--
.../services/hostapd/src/src/ap/ubus.h | 4 ++
3 files changed, 77 insertions(+), 4 deletions(-)
diff --git a/package/network/services/hostapd/patches/600-ubus_support.patch b/package/network/services/hostapd/patches/600-ubus_support.patch
index c0db5be4e9..0bba0ba752 100644
--- a/package/network/services/hostapd/patches/600-ubus_support.patch
+++ b/package/network/services/hostapd/patches/600-ubus_support.patch
@@ -354,6 +354,14 @@
#ifdef CONFIG_P2P
if (elems.p2p) {
wpabuf_free(sta->p2p_ie);
+@@ -816,6 +827,7 @@ void hostapd_event_ch_switch(struct host
+ wpa_msg(hapd->msg_ctx, MSG_INFO, AP_CSA_FINISHED
+ "freq=%d dfs=%d", freq, is_dfs);
+ }
++ hostapd_ubus_event_ch_switch(hapd->iface);
+ #endif /* NEED_AP_MLME */
+ }
+
--- a/src/ap/sta_info.c
+++ b/src/ap/sta_info.c
@@ -162,6 +162,7 @@ void ap_free_sta(struct hostapd_data *ha
diff --git a/package/network/services/hostapd/src/src/ap/ubus.c b/package/network/services/hostapd/src/src/ap/ubus.c
index 2ceb2de159..abbe3fac88 100644
--- a/package/network/services/hostapd/src/src/ap/ubus.c
+++ b/package/network/services/hostapd/src/src/ap/ubus.c
@@ -1300,6 +1300,53 @@ void hostapd_ubus_notify(struct hostapd_data *hapd, const char *type, const u8 *
ubus_notify(ctx, &hapd->ubus.obj, type, b.head, -1);
}
+static void blobmsg_add_iface_state(struct blob_buf *buff,
+ struct hostapd_iface *iface, int cur, int old)
+{
+ blobmsg_add_u32(buff, "oldstate_num", old);
+ blobmsg_add_string(buff, "oldstate", hostapd_state_text(old));
+ blobmsg_add_u32(buff, "state_num", cur);
+ blobmsg_add_string(buff, "state", hostapd_state_text(cur));
+}
+static void blobmsg_add_iface_channel(struct blob_buf *buff,
+ struct hostapd_iface *iface)
+{
+ struct hostapd_config *conf = iface->conf;
+ int width = 20;
+ void *chan;
+
+ if (!iface->freq) {
+ return;
+ }
+
+ chan = blobmsg_open_table(buff, "channel");
+
+ blobmsg_add_u32(buff, "freq", iface->freq);
+ blobmsg_add_u32(buff, "channel", conf->channel);
+ blobmsg_add_u8(buff, "ht", conf->ieee80211n);
+ blobmsg_add_u8(buff, "vht", conf->ieee80211ac);
+ blobmsg_add_u32(buff, "secondary_channel", conf->secondary_channel);
+ switch (conf->vht_oper_chwidth) {
+ case VHT_CHANWIDTH_USE_HT:
+ width = conf->secondary_channel ? 40 : 20;
+ break;
+ case VHT_CHANWIDTH_80MHZ:
+ width = 80;
+ break;
+ case VHT_CHANWIDTH_160MHZ:
+ width = 160;
+ break;
+ case VHT_CHANWIDTH_80P80MHZ:
+ width = 8080;
+ break;
+ }
+ blobmsg_add_u32(buff, "width", width);
+ blobmsg_add_u32(buff, "center_idx0", conf->vht_oper_centr_freq_seg0_idx);
+ blobmsg_add_u32(buff, "center_idx1", conf->vht_oper_centr_freq_seg1_idx);
+ blobmsg_add_u8(buff, "is_dfs", ieee80211_is_dfs(iface->freq,
+ iface->hw_features, iface->num_hw_features));
+ blobmsg_close_table(buff, chan);
+}
/* Send ubus event in case new event differs. */
void hostapd_ubus_event_iface_state(struct hostapd_iface *iface, int s)
{
@@ -1316,10 +1363,24 @@ void hostapd_ubus_event_iface_state(struct hostapd_iface *iface, int s)
blobmsg_add_string(&b, "device", hapd->conf->uci_device);
if (iface->ubus.obj.id)
blobmsg_add_string(&b, "uobject", iface->ubus.obj.name);
- blobmsg_add_u32(&b, "oldstate_num", iface->state);
- blobmsg_add_string(&b, "oldstate", hostapd_state_text(iface->state));
- blobmsg_add_u32(&b, "state_num", s);
- blobmsg_add_string(&b, "state", hostapd_state_text(s));
+ blobmsg_add_iface_state(&b, iface, s, iface->state);
+ blobmsg_add_iface_channel(&b, iface);
+ ubus_send_event(ctx, "hostapd.iface_state", b.head);
+}
+void hostapd_ubus_event_ch_switch(struct hostapd_iface *iface)
+{
+ struct hostapd_data *hapd = iface->bss[0];
+
+ if (!hostapd_ubus_init())
+ return;
+ hostapd_ubus_add_iface(iface);
+ blob_buf_init(&b, 0);
+ if (hapd && hapd->conf->uci_device)
+ blobmsg_add_string(&b, "device", hapd->conf->uci_device);
+ if (iface->ubus.obj.id)
+ blobmsg_add_string(&b, "uobject", iface->ubus.obj.name);
+ blobmsg_add_iface_state(&b, iface, iface->state, iface->state);
+ blobmsg_add_iface_channel(&b, iface);
ubus_send_event(ctx, "hostapd.iface_state", b.head);
}
static void
diff --git a/package/network/services/hostapd/src/src/ap/ubus.h b/package/network/services/hostapd/src/src/ap/ubus.h
index cc4b5fcb0f..6d2e1c7bcd 100644
--- a/package/network/services/hostapd/src/src/ap/ubus.h
+++ b/package/network/services/hostapd/src/src/ap/ubus.h
@@ -58,6 +58,7 @@ void hostapd_ubus_event_sta_account_start(struct hostapd_data *hapd,
struct sta_info *sta);
void hostapd_ubus_event_sta_account_stop(struct hostapd_data *hapd,
struct sta_info *sta);
+void hostapd_ubus_event_ch_switch(struct hostapd_iface *iface);
#else
@@ -92,6 +93,9 @@ static inline void hostapd_ubus_notify(struct hostapd_data *hapd, const char *ty
static inline void hostapd_ubus_event_iface_state(struct hostapd_iface *iface, int s)
{
}
+static inline void hostapd_ubus_event_ch_switch(struct hostapd_iface *iface)
+{
+}
static inline void hostapd_ubus_event_sta_account_start(struct hostapd_data *hapd,
struct sta_info *sta)
{
--
2.19.0
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list