Skip to content

Commit

Permalink
wfa-qt-control-app: Handle supplicant event
Browse files Browse the repository at this point in the history
Implement imperative check for supplicant
readiness prior to QT thread initiation.

Signed-off-by: Triveni Danda <[email protected]>
  • Loading branch information
D-Triveni committed Feb 26, 2024
1 parent f27b635 commit 7bdeeea
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 8 deletions.
1 change: 1 addition & 0 deletions zephyr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ zephyr_include_directories(

zephyr_library_sources(
# Zephyr's port of the Indigo API
${SOURCES_BASE}/zephyr/src/wpas_events.c
${SOURCES_BASE}/zephyr/src/main.c
${SOURCES_BASE}/zephyr/src/indigo_api_callback_dut.c
${SOURCES_BASE}/zephyr/src/vendor_specific_dut.c
Expand Down
22 changes: 14 additions & 8 deletions zephyr/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,19 @@ module-help = Sets log level for WFA Quick Track
source "subsys/logging/Kconfig.template.log_config"

config WFA_QT_CONTROL_APP
# Need full POSIX from libc, Zephyr's POSIX support is only partial
depends on !POSIX_API
select PTHREAD_IPC
bool "WFA Quicktrack control app"
# Need full POSIX from libc, Zephyr's POSIX support is only partial
depends on !POSIX_API
select PTHREAD_IPC
bool "WFA Quicktrack control app"

config WFA_QT_THREAD_STACK_SIZE
int "WFA QT thread stack size"
default 4096
help
Set the stack size for WFA QT thread.
int "WFA QT thread stack size"
default 4096
help
Set the stack size for WFA QT thread.

config WPAS_READY_TIMEOUT_MS
int "WPA supplicant ready timeout (ms)"
default 10000
help
Set the timeout for WPA supplicant to be ready.
9 changes: 9 additions & 0 deletions zephyr/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
LOG_MODULE_REGISTER(wfa_qt, CONFIG_WFA_QT_LOG_LEVEL);
int control_socket_init(int port);
void qt_main(void);
int wpa_supp_events_register(void);
int wait_for_wpa_s_ready(void);
K_THREAD_DEFINE(qt_main_tid,
CONFIG_WFA_QT_THREAD_STACK_SIZE,
qt_main,
Expand All @@ -36,6 +38,13 @@ static void print_welcome() {

void qt_main(void) {
int service_socket = -1;
int ret;

ret = wpa_supp_events_register();
ret = wait_for_wpa_s_ready();
if (ret < 0) {
LOG_DBG("Control interface is not initialized");
}

/* Welcome message */
print_welcome();
Expand Down
80 changes: 80 additions & 0 deletions zephyr/src/wpas_events.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* Copyright (c) 2024 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/

/** @file
* @brief WPA SUPP events
*/

#include <stdio.h>
#include <zephyr/net/net_event.h>
#include <ctrl_iface_zephyr.h>
#include <supp_events.h>
#include <utils.h>
#include <supp_main.h>
#include <zephyr/logging/log.h>
#include <zephyr/kernel.h>
LOG_MODULE_REGISTER(wpas_event, CONFIG_WFA_QT_LOG_LEVEL);

#define WPA_SUPP_EVENTS (NET_EVENT_WPA_SUPP_READY)

static struct net_mgmt_event_callback net_wpa_supp_cb;

K_SEM_DEFINE(wpa_supp_ready_sem, 0, 1);

#define DEFAULT_WIFI_IFACE "wlan0"

static void handle_wpa_supp_ready(struct net_mgmt_event_callback *cb)
{
k_sem_give(&wpa_supp_ready_sem);
}

static void wpa_supp_event_handler(struct net_mgmt_event_callback *cb,
uint32_t mgmt_event, struct net_if *iface)
{
/* TODO: Handle other events */
switch (mgmt_event) {
case NET_EVENT_WPA_SUPP_READY:
handle_wpa_supp_ready(cb);
break;
default:
LOG_DBG("Unhandled event (%d)", mgmt_event);
break;
}
}

int wait_for_wpa_s_ready(void)
{
struct wpa_supplicant *wpa_s = z_wpas_get_handle_by_ifname(DEFAULT_WIFI_IFACE);

if (wpa_s) {
LOG_INF("Supplicant is ready");
return 0;
}

k_sem_take(&wpa_supp_ready_sem, K_MSEC(CONFIG_WPAS_READY_TIMEOUT_MS));

wpa_s = z_wpas_get_handle_by_ifname(DEFAULT_WIFI_IFACE);
if (!wpa_s) {
LOG_INF("Supplicant is not ready");
return -1;
}

/* Belts and braces: Check for ctrl_iface initialization */
if (wpa_s->ctrl_iface->sock_pair[0] < 0) {
LOG_INF("Control iface is not ready");
return -1;
}

return 0;
}

int wpa_supp_events_register(void)
{
net_mgmt_init_event_callback(&net_wpa_supp_cb, wpa_supp_event_handler, WPA_SUPP_EVENTS);
net_mgmt_add_event_callback(&net_wpa_supp_cb);

return 0;
}

0 comments on commit 7bdeeea

Please sign in to comment.