[beken-72xx] Improve WiFi status recognition, fix null pointer access

This commit is contained in:
Kuba Szczodrzyński
2022-08-16 22:52:05 +02:00
parent 4096253694
commit a0a0e6775b
6 changed files with 37 additions and 6 deletions

View File

@@ -3,6 +3,7 @@
#include "WiFiPriv.h"
WiFiClass::WiFiClass() {
memset(&data, 0x00, sizeof(WiFiData));
data.scanSem = xSemaphoreCreateBinary();
}

View File

@@ -7,6 +7,7 @@
extern "C" {
#include <FreeRTOS.h>
#include <rw_msg_pub.h>
#include <semphr.h>
} // extern "C"
@@ -18,4 +19,5 @@ typedef struct {
SemaphoreHandle_t scanSem;
void *statusIp;
void *statusLink;
rw_evt_type lastEvent;
} WiFiData;

View File

@@ -51,6 +51,7 @@ void wifiEventHandler(rw_evt_type event) {
return; // failsafe
LT_D_WG("WiFi event %u", event);
pWiFi->data.lastEvent = event;
EventId eventId;
EventInfo eventInfo;

View File

@@ -7,11 +7,13 @@ bool WiFiClass::modePriv(WiFiMode mode, WiFiModeAction sta, WiFiModeAction ap) {
startWifiTask();
if (mode && !data.statusIp) {
LT_D_WG("Init data struct");
data.configSta = zalloc(sizeof(network_InitTypeDef_st));
data.configAp = zalloc(sizeof(network_InitTypeDef_ap_st));
data.statusIp = malloc(sizeof(IPStatusTypedef));
data.statusLink = malloc(sizeof(LinkStatusTypeDef));
STA_CFG->dhcp_mode = DHCP_CLIENT;
LT_D_WG("data status = %p", data.configSta);
}
if (!__bk_rf_is_init) {
@@ -32,6 +34,9 @@ bool WiFiClass::modePriv(WiFiMode mode, WiFiModeAction sta, WiFiModeAction ap) {
if (sta == WLMODE_ENABLE) {
LT_D_WG("Enabling STA");
bk_wlan_sta_init(NULL);
#if CFG_WPA_CTRL_IFACE
wlan_sta_enable();
#endif
wifiEventSendArduino(ARDUINO_EVENT_WIFI_STA_START);
} else if (sta == WLMODE_DISABLE) {
LT_D_WG("Disabling STA");
@@ -44,6 +49,9 @@ bool WiFiClass::modePriv(WiFiMode mode, WiFiModeAction sta, WiFiModeAction ap) {
if (ap == WLMODE_ENABLE) {
LT_D_WG("Enabling AP");
bk_wlan_ap_init(NULL);
#if CFG_WPA_CTRL_IFACE
wlan_ap_enable();
#endif
wifiEventSendArduino(ARDUINO_EVENT_WIFI_AP_START);
} else if (ap == WLMODE_DISABLE) {
LT_D_WG("Disabling AP");
@@ -51,7 +59,11 @@ bool WiFiClass::modePriv(WiFiMode mode, WiFiModeAction sta, WiFiModeAction ap) {
wifiEventSendArduino(ARDUINO_EVENT_WIFI_AP_STOP);
}
// force checking actual mode again
mode = getMode();
if (!mode) {
LT_D_WG("Free data struct");
free(data.configSta);
free(data.configAp);
free(data.statusIp);
@@ -69,15 +81,13 @@ bool WiFiClass::modePriv(WiFiMode mode, WiFiModeAction sta, WiFiModeAction ap) {
}
WiFiMode WiFiClass::getMode() {
if (!g_wlan_general_param)
return WIFI_MODE_NULL;
uint8_t role = g_wlan_general_param->role;
// change 1->2, 2->1
return (WiFiMode)(role + (role == 1) - (role == 2));
uint8_t sta = !!bk_wlan_has_role(VIF_STA) * WIFI_MODE_STA;
uint8_t ap = !!bk_wlan_has_role(VIF_AP) * WIFI_MODE_AP;
return (WiFiMode)(sta | ap);
}
WiFiStatus WiFiClass::status() {
rw_evt_type status = mhdr_get_station_status();
rw_evt_type status = data.lastEvent;
if (status == RW_EVT_STA_CONNECTED && STA_CFG->dhcp_mode == DHCP_DISABLE)
status = RW_EVT_STA_GOT_IP;
return eventTypeToStatus(status);

View File

@@ -20,6 +20,7 @@ extern "C" {
#include <main_none.h>
#include <param_config.h>
#include <rw_msg_rx.h>
#include <vif_mgmt.h>
#include <wlan_ui_pub.h>
#include <wpa_supplicant_i.h>

View File

@@ -11,6 +11,8 @@ WiFiClass::begin(const char *ssid, const char *passphrase, int32_t channel, cons
LT_HEAP_I();
disconnect(false);
strcpy(STA_CFG->wifi_ssid, ssid);
if (passphrase) {
strcpy(STA_CFG->wifi_key, passphrase);
@@ -35,8 +37,16 @@ bool WiFiClass::config(IPAddress localIP, IPAddress gateway, IPAddress subnet, I
sprintf(STA_CFG->gateway_ip_addr, IP_FMT, gateway[0], gateway[1], gateway[2], gateway[3]);
if (dns1) {
sprintf(STA_CFG->dns_server_ip_addr, IP_FMT, dns1[0], dns1[1], dns1[2], dns1[3]);
} else {
STA_CFG->dns_server_ip_addr[0] = '\0';
}
} else {
STA_CFG->local_ip_addr[0] = '\0';
STA_CFG->net_mask[0] = '\0';
STA_CFG->gateway_ip_addr[0] = '\0';
STA_CFG->dns_server_ip_addr[0] = '\0';
}
// from wlan_ui.c:1370
if (sta_ip_is_start()) {
sta_ip_down();
@@ -65,6 +75,8 @@ bool WiFiClass::reconnect(const uint8_t *bssid) {
LT_D_WG("Connecting to %s", STA_CFG->wifi_ssid);
}
LT_D_WG("data status = %p", data.configSta);
STA_CFG->wifi_mode = BK_STATION;
STA_CFG->wifi_retry_interval = 100;
if (bssid)
@@ -93,6 +105,10 @@ error:
}
bool WiFiClass::disconnect(bool wifiOff) {
#if LT_DEBUG_WIFI
bk_wlan_get_link_status(LINK_STATUS);
LT_D_WG("Disconnecting from %s", LINK_STATUS ? LINK_STATUS->ssid : NULL);
#endif
bk_wlan_connection_loss();
if (wifiOff)
enableSTA(false);