Skip to content

Commit 854d872

Browse files
hmxmghlHamza Rizwan
authored andcommitted
Handle Syncronization between EMAC & WLAN Driver + Message Pool Overflow fix
1 parent 9974d83 commit 854d872

File tree

4 files changed

+75
-50
lines changed

4 files changed

+75
-50
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: 46 additions & 40 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);
@@ -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_while_wlan_status_connected = true;
920921
handle_wlan_status_connected(&(msg->data.wlan_status_connected));
922+
flush_while_wlan_status_connected = 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

@@ -1662,6 +1661,8 @@ nsapi_error_t OdinWiFiInterface::wlan_connect(
16621661
strncpy((char*)connect_params.ssid.ssid, ssid, cbWLAN_SSID_MAX_LENGTH);
16631662
connect_params.ssid.ssidLength = strlen((const char*)connect_params.ssid.ssid);
16641663

1664+
static cbWLAN_Handle handle;
1665+
16651666
switch (security)
16661667
{
16671668
case NSAPI_SECURITY_NONE:
@@ -1719,6 +1720,7 @@ nsapi_error_t OdinWiFiInterface::wlan_connect(
17191720
break;
17201721
}
17211722

1723+
//emac.set_wifi_emac_handle(handle); // Eliminated this because upcoming state will update the handle before it is used anywhere - to be tested
17221724
if(status != cbSTATUS_OK || handle == cbWLAN_INVALID_HANDLE) {
17231725
error_code = NSAPI_ERROR_UNSUPPORTED;
17241726
}
@@ -1754,6 +1756,8 @@ nsapi_error_t OdinWiFiInterface::wlan_ap_start(
17541756
status = cbWLAN_ioctl(cbWLAN_IOCTL_SET_AP_BEACON_INTERVAL, (void*)&beacon_interval);
17551757
cbMAIN_driverUnlock();
17561758

1759+
static cbWLAN_Handle handle;
1760+
17571761
if (status != cbSTATUS_OK) {
17581762
error_code = NSAPI_ERROR_PARAMETER;
17591763
} else {
@@ -1793,7 +1797,7 @@ nsapi_error_t OdinWiFiInterface::wlan_ap_start(
17931797
error_code = NSAPI_ERROR_UNSUPPORTED;
17941798
}
17951799
}
1796-
1800+
_ap.handle = handle;
17971801
return error_code;
17981802
}
17991803

@@ -1832,14 +1836,16 @@ void OdinWiFiInterface::wlan_scan_indication(cbWLAN_ScanIndicationInfo *scan_inf
18321836

18331837
void OdinWiFiInterface::wlan_status_indication(cbWLAN_StatusIndicationInfo status, void *data)
18341838
{
1835-
struct odin_wifi_msg_s* msg = _msg_pool->alloc();
1836-
MBED_ASSERT(msg != NULL);
1839+
if (!flush_while_wlan_status_connected) {
1840+
struct odin_wifi_msg_s* msg = _msg_pool->alloc();
1841+
MBED_ASSERT(msg != NULL);
18371842

1838-
msg->type = status;
1839-
memcpy(&(msg->data), data, sizeof(odin_wifi_msg_s::data_t));
1843+
msg->type = status;
1844+
memcpy(&(msg->data), data, sizeof(odin_wifi_msg_s::data_t));
18401845

1841-
osStatus ok = _in_queue.put(msg, 0);
1842-
MBED_ASSERT(ok == osOK);
1846+
osStatus ok = _in_queue.put(msg, 0);
1847+
MBED_ASSERT(ok == osOK);
1848+
}
18431849
}
18441850

18451851
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: 8 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

@@ -293,6 +293,8 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
293293

294294
private:
295295

296+
OdinWiFiEMAC &emac = OdinWiFiEMAC::get_instance();
297+
296298
enum OdinWifiState {
297299
S_NOT_INITIALISED = 1,
298300
S_WAIT_START,
@@ -340,6 +342,8 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
340342

341343
nsapi_error_t error_code;
342344
uint16_t beacon_interval;
345+
346+
cbWLAN_Handle handle;
343347
};
344348

345349
struct scan_cache_s {
@@ -348,7 +352,6 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
348352
cbWLAN_MACAddress bssid[ODIN_WIFI_SCAN_CACHE_SIZE];
349353
};
350354

351-
cbWLAN_Handle handle = cbWLAN_INVALID_HANDLE;
352355
OdinWifiState entry_connect_fail_wait_disconnect();
353356
OdinWifiState entry_wait_connect();
354357
OdinWifiState entry_wait_disconnect();
@@ -442,6 +445,8 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
442445

443446
bool _debug;
444447
int _dbg_timeout;
448+
449+
bool flush_while_wlan_status_connected = false;
445450
};
446451

447452
#endif

0 commit comments

Comments
 (0)