Skip to content

Commit c15320d

Browse files
author
Hamza Rizwan
committed
Fixes for Network WiFi Test Crashes
1 parent 9974d83 commit c15320d

File tree

7 files changed

+75
-51
lines changed

7 files changed

+75
-51
lines changed

features/netsocket/emac-drivers/TARGET_STM/TARGET_STM32F4/TARGET_MODULE_UBLOX_ODIN_W2/wifi_emac/wifi_emac.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ cb_uint32 handleWlanTargetGetDataFrameSize(cbWLANTARGET_dataFrame* frame);
3939
cb_uint8 handleWlanTargetGetDataFrameTID(cbWLANTARGET_dataFrame* frame);
4040
void handleWlanStatusIndication(void *dummy, cbWLAN_StatusIndicationInfo status, void *data);
4141
void handleWlanPacketIndication(void *dummy, cbWLAN_PacketIndicationInfo *packetInfo);
42-
void send_wlan_packet(void *buf);
42+
void send_wlan_packet(OdinWiFiEMAC *ptr, void *buf);
4343

4444
static const cbWLANTARGET_Callback _wlanTargetCallback =
4545
{
@@ -202,9 +202,19 @@ OdinWiFiEMAC::OdinWiFiEMAC()
202202
cbWLANTARGET_registerCallbacks((cbWLANTARGET_Callback*)&_wlanTargetCallback);
203203
}
204204

205-
void send_wlan_packet(void *buf)
205+
cbWLAN_Handle OdinWiFiEMAC::get_wifi_emac_handle()
206206
{
207-
cbWLAN_sendPacket(cbWLAN_DEFAULT_HANDLE, buf);
207+
return this->handle;
208+
}
209+
210+
void OdinWiFiEMAC::set_wifi_emac_handle(cbWLAN_Handle _handle)
211+
{
212+
this->handle = _handle;
213+
}
214+
215+
void send_wlan_packet(OdinWiFiEMAC *ptr, void *buf)
216+
{
217+
cbWLAN_sendPacket(ptr->handle, buf);
208218
}
209219

210220
bool OdinWiFiEMAC::link_out(emac_mem_buf_t *buf)
@@ -215,7 +225,7 @@ bool OdinWiFiEMAC::link_out(emac_mem_buf_t *buf)
215225
emac_mem_buf_t *new_buf = mem->alloc_pool(mem->get_total_len(buf), 0);
216226
if (new_buf != NULL) {
217227
mem->copy(new_buf, buf);
218-
int id = cbMAIN_getEventQueue()->call(send_wlan_packet, new_buf);
228+
int id = cbMAIN_getEventQueue()->call(send_wlan_packet, this, new_buf);
219229
if (id != 0) {
220230
cbMAIN_dispatchEventQueue();
221231
} else {
@@ -262,9 +272,8 @@ void OdinWiFiEMAC::set_hwaddr(const uint8_t *addr)
262272
void OdinWiFiEMAC::set_link_input_cb(emac_link_input_cb_t input_cb)
263273
{
264274
emac_link_input_cb = input_cb;
265-
266275
cbMAIN_driverLock();
267-
cbWLAN_registerPacketIndicationCallback(cbWLAN_DEFAULT_HANDLE, handleWlanPacketIndication, NULL);
276+
cbWLAN_registerPacketIndicationCallback(get_wifi_emac_handle(), handleWlanPacketIndication, NULL);
268277
cbMAIN_driverUnlock();
269278
}
270279

features/netsocket/emac-drivers/TARGET_STM/TARGET_STM32F4/TARGET_MODULE_UBLOX_ODIN_W2/wifi_emac/wifi_emac.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,13 @@ class OdinWiFiEMAC : public EMAC {
124124
virtual void remove_multicast_group(const uint8_t *address);
125125
virtual void set_all_multicast(bool all);
126126

127+
cbWLAN_Handle get_wifi_emac_handle();
128+
void set_wifi_emac_handle(cbWLAN_Handle _handle);
129+
127130
private:
128131

132+
cbWLAN_Handle handle = cbWLAN_DEFAULT_HANDLE;
133+
129134
emac_link_input_cb_t emac_link_input_cb; /**< Callback for incoming data */
130135
emac_link_state_change_cb_t emac_link_state_cb; /**< Link state change callback */
131136
EMACMemoryManager *memory_manager;
@@ -138,7 +143,7 @@ class OdinWiFiEMAC : public EMAC {
138143

139144
friend void handleWlanStatusIndication(void *dummy, cbWLAN_StatusIndicationInfo status, void *data);
140145
friend void handleWlanPacketIndication(void *dummy, cbWLAN_PacketIndicationInfo *packetInfo);
141-
friend void send_wlan_packet(void *buf);
146+
friend void send_wlan_packet(OdinWiFiEMAC *ptr, void *buf);
142147
};
143148

144149
#endif /* WIFI_EMAC_H_ */

targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.cpp

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -158,15 +158,15 @@ struct wlan_callb_s {
158158
bool OdinWiFiInterface::_wlan_initialized = false;
159159
int32_t OdinWiFiInterface::_target_id = cbMAIN_TARGET_INVALID_ID;
160160

161-
OdinWiFiInterface::OdinWiFiInterface(OdinWiFiEMAC &emac , OnboardNetworkStack &stack) :
162-
EMACInterface(emac, stack),
161+
OdinWiFiInterface::OdinWiFiInterface(OdinWiFiEMAC &emac_obj, OnboardNetworkStack &stack) :
162+
EMACInterface(emac_obj, stack),
163163
_thread(osPriorityNormal, 4096)
164164
{
165165
init(false);
166166
}
167167

168-
OdinWiFiInterface::OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac, OnboardNetworkStack &stack) :
169-
EMACInterface(emac, stack),
168+
OdinWiFiInterface::OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac_obj, OnboardNetworkStack &stack) :
169+
EMACInterface(emac_obj, stack),
170170
_thread(osPriorityNormal, 4096)
171171
{
172172
init(debug);
@@ -386,7 +386,7 @@ nsapi_error_t OdinWiFiInterface::connect(
386386
return NSAPI_ERROR_PARAMETER;
387387
}
388388

389-
if((security == NSAPI_SECURITY_EAP_TLS) && (cert_handle->client_cert == NULL)) {
389+
if((security == NSAPI_SECURITY_EAP_TLS) && (cert_handle->client_cert == NULL || cert_handle->client_prvt_key == NULL)) {
390390
return NSAPI_ERROR_PARAMETER;
391391
}
392392

@@ -757,7 +757,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_connect_fail_wait_disc
757757
cbRTSL_Status error_code;
758758

759759
cbMAIN_driverLock();
760-
error_code = cbWLAN_disconnect(handle);
760+
error_code = cbWLAN_disconnect(_wlan_status_connected_info.handle);
761761
cbMAIN_driverUnlock();
762762

763763
MBED_ASSERT(error_code == cbSTATUS_OK);
@@ -778,7 +778,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_wait_disconnect()
778778
cbRTSL_Status error_code;
779779

780780
cbMAIN_driverLock();
781-
error_code = cbWLAN_disconnect(handle);
781+
error_code = cbWLAN_disconnect(_wlan_status_disconnected_info.handle);
782782
cbMAIN_driverUnlock();
783783

784784
MBED_ASSERT(error_code == cbSTATUS_OK);
@@ -802,7 +802,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_started()
802802
OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_wait_stop()
803803
{
804804
cbMAIN_driverLock();
805-
cbRTSL_Status status = cbWLAN_apStop(handle);
805+
cbRTSL_Status status = cbWLAN_apStop(_ap.handle);
806806
cbMAIN_driverUnlock();
807807

808808
MBED_ASSERT(status == cbSTATUS_OK);
@@ -813,7 +813,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_wait_stop()
813813
OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_fail_wait_stop()
814814
{
815815
cbMAIN_driverLock();
816-
cbRTSL_Status status = cbWLAN_apStop(handle);
816+
cbRTSL_Status status = cbWLAN_apStop(_ap.handle);
817817
cbMAIN_driverUnlock();
818818

819819
MBED_ASSERT(status == cbSTATUS_OK);
@@ -917,7 +917,9 @@ void OdinWiFiInterface::handle_in_msg(void)
917917
break;
918918

919919
case cbWLAN_STATUS_CONNECTED:
920+
flush_drvr_ind_pkts = true;
920921
handle_wlan_status_connected(&(msg->data.wlan_status_connected));
922+
flush_drvr_ind_pkts = false;
921923
break;
922924

923925
case cbWLAN_SCAN_INDICATION:
@@ -1024,11 +1026,6 @@ void OdinWiFiInterface::handle_user_connect(user_connect_s *user_connect)
10241026
}
10251027

10261028
if(error_code == NSAPI_ERROR_OK) {
1027-
memset(&_wlan_status_connected_info, 0, sizeof(cbWLAN_StatusConnectedInfo));
1028-
memset(&_wlan_status_disconnected_info, 0, sizeof(cbWLAN_StatusDisconnectedInfo));
1029-
_wlan_status_disconnected_info.handle = cbWLAN_DEFAULT_HANDLE;
1030-
_wlan_status_connected_info.handle = cbWLAN_DEFAULT_HANDLE;
1031-
10321029
_state_sta = entry_wait_connect();
10331030
}
10341031
else
@@ -1045,6 +1042,7 @@ void OdinWiFiInterface::handle_user_disconnect(void)
10451042
switch(_state_sta) {
10461043
case S_STA_CONNECTED:
10471044
case S_STA_DISCONNECTED_WAIT_CONNECT:
1045+
emac.set_wifi_emac_handle(_wlan_status_disconnected_info.handle);
10481046
_state_sta = entry_wait_disconnect();
10491047
break;
10501048

@@ -1123,6 +1121,7 @@ void OdinWiFiInterface::handle_user_connect_timeout()
11231121
}
11241122
_timer.stop();
11251123

1124+
emac.set_wifi_emac_handle(_wlan_status_connected_info.handle);
11261125
_state_sta = entry_connect_fail_wait_disconnect();
11271126
}
11281127
}
@@ -1314,9 +1313,10 @@ void OdinWiFiInterface::handle_wlan_status_connected(wlan_status_connected_s *wl
13141313
_gateway[0] ? _gateway : 0,
13151314
DEFAULT_STACK);
13161315

1316+
memcpy(&_wlan_status_connected_info, &(wlan_connect->info), sizeof(cbWLAN_StatusConnectedInfo));
1317+
emac.set_wifi_emac_handle(_wlan_status_connected_info.handle);
13171318

13181319
if (error_code == NSAPI_ERROR_OK || error_code == NSAPI_ERROR_IS_CONNECTED) {
1319-
memcpy(&_wlan_status_connected_info, &(wlan_connect->info), sizeof(cbWLAN_StatusConnectedInfo));
13201320
if(_state_sta != S_STA_CONNECTED){
13211321
_state_sta = S_STA_CONNECTED;
13221322
send_user_response_msg(ODIN_WIFI_MSG_USER_CONNECT, NSAPI_ERROR_OK);
@@ -1351,6 +1351,7 @@ void OdinWiFiInterface::handle_wlan_status_connection_failure(wlan_status_connec
13511351
}
13521352

13531353
memcpy(&_wlan_status_disconnected_info, &(connect_failure->info), sizeof(cbWLAN_StatusDisconnectedInfo));
1354+
emac.set_wifi_emac_handle(_wlan_status_disconnected_info.handle);
13541355

13551356
switch(_state_sta) {
13561357
case S_STA_WAIT_CONNECT:
@@ -1383,7 +1384,7 @@ void OdinWiFiInterface::handle_wlan_status_connection_failure(wlan_status_connec
13831384

13841385
void OdinWiFiInterface::handle_wlan_status_disconnected(void)
13851386
{
1386-
nsapi_error_t error_code;
1387+
nsapi_error_t error_code = NSAPI_ERROR_OK;
13871388

13881389
if(_debug) {
13891390
printf("WLAN STATUS DISCONNECTED\r\n");
@@ -1404,24 +1405,19 @@ void OdinWiFiInterface::handle_wlan_status_disconnected(void)
14041405

14051406
case S_STA_CONNECTION_FAIL_WAIT_DISCONNECT:
14061407
_state_sta = S_STA_IDLE;
1407-
if(_wlan_status_disconnected_info.handle == cbWLAN_DEFAULT_HANDLE){
1408-
switch(_wlan_status_disconnected_info.reason) {
1409-
error_code = NSAPI_ERROR_NO_SSID;
1410-
break;
1411-
1412-
case cbWLAN_STATUS_DISCONNECTED_AUTH_FAILURE:
1413-
case cbWLAN_STATUS_DISCONNECTED_ASSOC_FAILURE:
1414-
case cbWLAN_STATUS_DISCONNECTED_MIC_FAILURE:
1415-
error_code = NSAPI_ERROR_AUTH_FAILURE;
1416-
break;
1417-
case cbWLAN_STATUS_DISCONNECTED_NO_BSSID_FOUND:
1418-
case cbWLAN_STATUS_DISCONNECTED_UNKNOWN:
1419-
error_code = NSAPI_ERROR_NO_CONNECTION;
1420-
break;
1421-
default:
1422-
error_code = NSAPI_ERROR_DEVICE_ERROR;
1423-
break;
1424-
}
1408+
switch(_wlan_status_disconnected_info.reason) {
1409+
case cbWLAN_STATUS_DISCONNECTED_AUTH_FAILURE:
1410+
case cbWLAN_STATUS_DISCONNECTED_ASSOC_FAILURE:
1411+
case cbWLAN_STATUS_DISCONNECTED_MIC_FAILURE:
1412+
error_code = NSAPI_ERROR_AUTH_FAILURE;
1413+
break;
1414+
case cbWLAN_STATUS_DISCONNECTED_NO_BSSID_FOUND:
1415+
case cbWLAN_STATUS_DISCONNECTED_UNKNOWN:
1416+
error_code = NSAPI_ERROR_NO_CONNECTION;
1417+
break;
1418+
default:
1419+
error_code = NSAPI_ERROR_DEVICE_ERROR;
1420+
break;
14251421
}
14261422
send_user_response_msg(ODIN_WIFI_MSG_USER_CONNECT, error_code);
14271423
break;
@@ -1564,6 +1560,9 @@ void OdinWiFiInterface::init(bool debug = false)
15641560
memset(_mac_addr_str, 0, ODIN_WIFI_MAX_MAC_ADDR_STR);
15651561
memset(&_wlan_status_connected_info, 0, sizeof(cbWLAN_StatusConnectedInfo));
15661562
memset(&_wlan_status_disconnected_info, 0, sizeof(cbWLAN_StatusDisconnectedInfo));
1563+
_wlan_status_connected_info.handle = cbWLAN_DEFAULT_HANDLE;
1564+
_wlan_status_disconnected_info.handle = cbWLAN_DEFAULT_HANDLE;
1565+
_ap.handle = cbWLAN_DEFAULT_HANDLE;
15671566

15681567
_msg_pool = new MemoryPool<odin_wifi_msg_s, 11>();
15691568

@@ -1655,6 +1654,7 @@ nsapi_error_t OdinWiFiInterface::wlan_connect(
16551654
cbRTSL_Status status = cbSTATUS_OK;
16561655
cbWLAN_CommonConnectParameters connect_params;
16571656
cbWLAN_EnterpriseConnectParameters enterpriseParams;
1657+
static cbWLAN_Handle handle = cbWLAN_DEFAULT_HANDLE;
16581658

16591659
memset(&enterpriseParams, 0, sizeof(cbWLAN_EnterpriseConnectParameters));
16601660
memset(&connect_params, 0, sizeof(cbWLAN_CommonConnectParameters));
@@ -1739,6 +1739,8 @@ nsapi_error_t OdinWiFiInterface::wlan_ap_start(
17391739
cbWLAN_CommonApParameters params;
17401740
cbWLAN_WPAPSKApParameters wpa_params;
17411741

1742+
static cbWLAN_Handle handle = cbWLAN_DEFAULT_HANDLE;
1743+
17421744
char temp_passphrase[cbWLAN_MAX_PASSPHRASE_LENGTH];
17431745

17441746
memset(&params, 0, sizeof(cbWLAN_CommonApParameters));
@@ -1793,7 +1795,7 @@ nsapi_error_t OdinWiFiInterface::wlan_ap_start(
17931795
error_code = NSAPI_ERROR_UNSUPPORTED;
17941796
}
17951797
}
1796-
1798+
_ap.handle = handle;
17971799
return error_code;
17981800
}
17991801

@@ -1832,14 +1834,16 @@ void OdinWiFiInterface::wlan_scan_indication(cbWLAN_ScanIndicationInfo *scan_inf
18321834

18331835
void OdinWiFiInterface::wlan_status_indication(cbWLAN_StatusIndicationInfo status, void *data)
18341836
{
1835-
struct odin_wifi_msg_s* msg = _msg_pool->alloc();
1836-
MBED_ASSERT(msg != NULL);
1837+
if (!flush_drvr_ind_pkts) {
1838+
struct odin_wifi_msg_s* msg = _msg_pool->alloc();
1839+
MBED_ASSERT(msg != NULL);
18371840

1838-
msg->type = status;
1839-
memcpy(&(msg->data), data, sizeof(odin_wifi_msg_s::data_t));
1841+
msg->type = status;
1842+
memcpy(&(msg->data), data, sizeof(odin_wifi_msg_s::data_t));
18401843

1841-
osStatus ok = _in_queue.put(msg, 0);
1842-
MBED_ASSERT(ok == osOK);
1844+
osStatus ok = _in_queue.put(msg, 0);
1845+
MBED_ASSERT(ok == osOK);
1846+
}
18431847
}
18441848

18451849
static nsapi_security_t convertToNSAPI_security(cbWLAN_AuthenticationSuite authSuit)

targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
6565
public:
6666
/** OdinWiFiInterface lifetime
6767
*/
68-
OdinWiFiInterface(OdinWiFiEMAC &emac = OdinWiFiEMAC::get_instance(), OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance());
68+
OdinWiFiInterface(OdinWiFiEMAC &emac_obj = OdinWiFiEMAC::get_instance(), OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance());
6969

70-
OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac = OdinWiFiEMAC::get_instance(), OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance());
70+
OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac_obj = OdinWiFiEMAC::get_instance(), OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance());
7171

7272
~OdinWiFiInterface();
7373

@@ -340,6 +340,8 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
340340

341341
nsapi_error_t error_code;
342342
uint16_t beacon_interval;
343+
344+
cbWLAN_Handle handle;
343345
};
344346

345347
struct scan_cache_s {
@@ -348,7 +350,6 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
348350
cbWLAN_MACAddress bssid[ODIN_WIFI_SCAN_CACHE_SIZE];
349351
};
350352

351-
cbWLAN_Handle handle = cbWLAN_INVALID_HANDLE;
352353
OdinWifiState entry_connect_fail_wait_disconnect();
353354
OdinWifiState entry_wait_connect();
354355
OdinWifiState entry_wait_disconnect();
@@ -442,6 +443,11 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
442443

443444
bool _debug;
444445
int _dbg_timeout;
446+
447+
OdinWiFiEMAC &emac = OdinWiFiEMAC::get_instance();
448+
449+
// This flag is added to flush the packets that were coming in between while the status was connected hence causing message pool overflow
450+
bool flush_drvr_ind_pkts = false;
445451
};
446452

447453
#endif

0 commit comments

Comments
 (0)