hostap: Implement AP mode events These events are used by AP mode, tied to AP-ENABLED and AP-DISABLED events in the hostapd/wpa_supplicant. Signed-off-by: Chaitanya Tata <Chaitanya.Tata@nordicsemi.no> Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
diff --git a/modules/hostap/src/supp_api.c b/modules/hostap/src/supp_api.c index 066507d..f9db87c 100644 --- a/modules/hostap/src/supp_api.c +++ b/modules/hostap/src/supp_api.c
@@ -7,6 +7,7 @@ #include <zephyr/logging/log.h> #include <zephyr/kernel.h> +#include <zephyr/net/wifi_mgmt.h> #include "includes.h" #include "common.h" @@ -490,6 +491,8 @@ static int wpas_disconnect_network(const struct device *dev) { struct net_if *iface = net_if_lookup_by_dev(dev); + struct wpa_supplicant *wpa_s; + bool is_ap = false; int ret = 0; if (!iface) { @@ -498,8 +501,19 @@ return ret; } + wpa_s = get_wpa_s_handle(dev); + if (!wpa_s) { + ret = -1; + wpa_printf(MSG_ERROR, "Interface %s not found", dev->name); + goto out; + } + k_mutex_lock(&wpa_supplicant_mutex, K_FOREVER); + if (wpa_s->current_ssid && wpa_s->current_ssid->mode == WPAS_MODE_AP) { + is_ap = true; + } + wpas_api_ctrl.dev = dev; wpas_api_ctrl.requested_op = DISCONNECT; @@ -518,8 +532,17 @@ wpa_supp_restart_status_work(); ret = wait_for_disconnect_complete(dev); - - wifi_mgmt_raise_disconnect_complete_event(iface, ret); +#ifdef CONFIG_AP + if (is_ap) { + supplicant_send_wifi_mgmt_ap_status(wpa_s, + NET_EVENT_WIFI_CMD_AP_DISABLE_RESULT, + ret == 0 ? WIFI_STATUS_AP_SUCCESS : WIFI_STATUS_AP_FAIL); + } else { +#else + { +#endif /* CONFIG_AP */ + wifi_mgmt_raise_disconnect_complete_event(iface, ret); + } return ret; }
diff --git a/modules/hostap/src/supp_events.c b/modules/hostap/src/supp_events.c index 62043d6..6108d4a 100644 --- a/modules/hostap/src/supp_events.c +++ b/modules/hostap/src/supp_events.c
@@ -192,9 +192,20 @@ { struct wpa_supplicant *wpa_s = ctx; int status = wpas_to_wifi_mgmt_conn_status(status_code); + enum net_event_wifi_cmd event; + + if (!wpa_s || !wpa_s->current_ssid) { + return -EINVAL; + } + + if (wpa_s->current_ssid->mode == WPAS_MODE_AP) { + event = NET_EVENT_WIFI_CMD_AP_ENABLE_RESULT; + } else { + event = NET_EVENT_WIFI_CMD_CONNECT_RESULT; + } return supplicant_send_wifi_mgmt_event(wpa_s->ifname, - NET_EVENT_WIFI_CMD_CONNECT_RESULT, + event, (void *)&status, sizeof(int)); } @@ -205,10 +216,22 @@ int status = wpas_to_wifi_mgmt_diconn_status(reason_code); enum net_event_wifi_cmd event; + if (!wpa_s || !wpa_s->current_ssid) { + return -EINVAL; + } + if (wpa_s->wpa_state >= WPA_COMPLETED) { - event = NET_EVENT_WIFI_CMD_DISCONNECT_RESULT; + if (wpa_s->current_ssid->mode == WPAS_MODE_AP) { + event = NET_EVENT_WIFI_CMD_AP_DISABLE_RESULT; + } else { + event = NET_EVENT_WIFI_CMD_DISCONNECT_RESULT; + } } else { - event = NET_EVENT_WIFI_CMD_CONNECT_RESULT; + if (wpa_s->current_ssid->mode == WPAS_MODE_AP) { + event = NET_EVENT_WIFI_CMD_AP_ENABLE_RESULT; + } else { + event = NET_EVENT_WIFI_CMD_CONNECT_RESULT; + } } return supplicant_send_wifi_mgmt_event(wpa_s->ifname, @@ -217,6 +240,21 @@ sizeof(int)); } +#ifdef CONFIG_AP +int supplicant_send_wifi_mgmt_ap_status(void *ctx, + enum net_event_wifi_cmd event, + enum wifi_ap_status ap_status) +{ + struct wpa_supplicant *wpa_s = ctx; + int status = ap_status; + + return supplicant_send_wifi_mgmt_event(wpa_s->ifname, + event, + (void *)&status, + sizeof(int)); +} +#endif /* CONFIG_AP */ + int supplicant_send_wifi_mgmt_event(const char *ifname, enum net_event_wifi_cmd event, void *supplicant_status, size_t len) { @@ -240,6 +278,16 @@ iface, *(int *)supplicant_status); break; +#ifdef CONFIG_AP + case NET_EVENT_WIFI_CMD_AP_ENABLE_RESULT: + wifi_mgmt_raise_ap_enable_result_event(iface, + *(int *)supplicant_status); + break; + case NET_EVENT_WIFI_CMD_AP_DISABLE_RESULT: + wifi_mgmt_raise_ap_disable_result_event(iface, + *(int *)supplicant_status); + break; +#endif /* CONFIG_AP */ case NET_EVENT_SUPPLICANT_CMD_INT_EVENT: event_data.data = &data; if (supplicant_process_status(&event_data, (char *)supplicant_status) > 0) {
diff --git a/modules/hostap/src/supp_events.h b/modules/hostap/src/supp_events.h index f2030ed..2cf796b 100644 --- a/modules/hostap/src/supp_events.h +++ b/modules/hostap/src/supp_events.h
@@ -55,6 +55,12 @@ int supplicant_send_wifi_mgmt_conn_event(void *ctx, int status_code); int supplicant_send_wifi_mgmt_disc_event(void *ctx, int reason_code); +#ifdef CONFIG_AP +int supplicant_send_wifi_mgmt_ap_status(void *ctx, + enum net_event_wifi_cmd event, + enum wifi_ap_status); +#endif /* CONFIG_AP */ + #define REASON_CODE_LEN 18 #define NM_WIFI_EVENT_STR_LEN 64 #define ETH_ALEN 6