Skip to content

Commit cecde0e

Browse files
committed
Handle Syncronization between EMAC & WLAN Driver + Message Pool Overflow fix
1 parent 7f36fbc commit cecde0e

File tree

4 files changed

+75
-50
lines changed

4 files changed

+75
-50
lines changed

features/netsocket/emac-drivers/TARGET_STM_EMAC/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_EMAC/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
@@ -156,15 +156,15 @@ struct wlan_callb_s {
156156
bool OdinWiFiInterface::_wlan_initialized = false;
157157
int32_t OdinWiFiInterface::_target_id = cbMAIN_TARGET_INVALID_ID;
158158

159-
OdinWiFiInterface::OdinWiFiInterface(OdinWiFiEMAC &emac , OnboardNetworkStack &stack) :
160-
EMACInterface(emac, stack),
159+
OdinWiFiInterface::OdinWiFiInterface(OdinWiFiEMAC &emac_obj, OnboardNetworkStack &stack) :
160+
EMACInterface(emac_obj, stack),
161161
_thread(osPriorityNormal, 4096)
162162
{
163163
init(false);
164164
}
165165

166-
OdinWiFiInterface::OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac, OnboardNetworkStack &stack) :
167-
EMACInterface(emac, stack),
166+
OdinWiFiInterface::OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac_obj, OnboardNetworkStack &stack) :
167+
EMACInterface(emac_obj, stack),
168168
_thread(osPriorityNormal, 4096)
169169
{
170170
init(debug);
@@ -755,7 +755,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_connect_fail_wait_disc
755755
cbRTSL_Status error_code;
756756

757757
cbMAIN_driverLock();
758-
error_code = cbWLAN_disconnect(handle);
758+
error_code = cbWLAN_disconnect(_wlan_status_connected_info.handle);
759759
cbMAIN_driverUnlock();
760760

761761
MBED_ASSERT(error_code == cbSTATUS_OK);
@@ -776,7 +776,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_wait_disconnect()
776776
cbRTSL_Status error_code;
777777

778778
cbMAIN_driverLock();
779-
error_code = cbWLAN_disconnect(handle);
779+
error_code = cbWLAN_disconnect(_wlan_status_disconnected_info.handle);
780780
cbMAIN_driverUnlock();
781781

782782
MBED_ASSERT(error_code == cbSTATUS_OK);
@@ -800,7 +800,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_started()
800800
OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_wait_stop()
801801
{
802802
cbMAIN_driverLock();
803-
cbRTSL_Status status = cbWLAN_apStop(handle);
803+
cbRTSL_Status status = cbWLAN_apStop(_ap.handle);
804804
cbMAIN_driverUnlock();
805805

806806
MBED_ASSERT(status == cbSTATUS_OK);
@@ -811,7 +811,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_wait_stop()
811811
OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_fail_wait_stop()
812812
{
813813
cbMAIN_driverLock();
814-
cbRTSL_Status status = cbWLAN_apStop(handle);
814+
cbRTSL_Status status = cbWLAN_apStop(_ap.handle);
815815
cbMAIN_driverUnlock();
816816

817817
MBED_ASSERT(status == cbSTATUS_OK);
@@ -915,7 +915,9 @@ void OdinWiFiInterface::handle_in_msg(void)
915915
break;
916916

917917
case cbWLAN_STATUS_CONNECTED:
918+
flush_while_wlan_status_connected = true;
918919
handle_wlan_status_connected(&(msg->data.wlan_status_connected));
920+
flush_while_wlan_status_connected = false;
919921
break;
920922

921923
case cbWLAN_SCAN_INDICATION:
@@ -1022,11 +1024,6 @@ void OdinWiFiInterface::handle_user_connect(user_connect_s *user_connect)
10221024
}
10231025

10241026
if(error_code == NSAPI_ERROR_OK) {
1025-
memset(&_wlan_status_connected_info, 0, sizeof(cbWLAN_StatusConnectedInfo));
1026-
memset(&_wlan_status_disconnected_info, 0, sizeof(cbWLAN_StatusDisconnectedInfo));
1027-
_wlan_status_disconnected_info.handle = cbWLAN_DEFAULT_HANDLE;
1028-
_wlan_status_connected_info.handle = cbWLAN_DEFAULT_HANDLE;
1029-
10301027
_state_sta = entry_wait_connect();
10311028
}
10321029
else
@@ -1043,6 +1040,7 @@ void OdinWiFiInterface::handle_user_disconnect(void)
10431040
switch(_state_sta) {
10441041
case S_STA_CONNECTED:
10451042
case S_STA_DISCONNECTED_WAIT_CONNECT:
1043+
emac.set_wifi_emac_handle(_wlan_status_disconnected_info.handle);
10461044
_state_sta = entry_wait_disconnect();
10471045
break;
10481046

@@ -1121,6 +1119,7 @@ void OdinWiFiInterface::handle_user_connect_timeout()
11211119
}
11221120
_timer.stop();
11231121

1122+
emac.set_wifi_emac_handle(_wlan_status_connected_info.handle);
11241123
_state_sta = entry_connect_fail_wait_disconnect();
11251124
}
11261125
}
@@ -1312,9 +1311,10 @@ void OdinWiFiInterface::handle_wlan_status_connected(wlan_status_connected_s *wl
13121311
_gateway[0] ? _gateway : 0,
13131312
DEFAULT_STACK);
13141313

1314+
memcpy(&_wlan_status_connected_info, &(wlan_connect->info), sizeof(cbWLAN_StatusConnectedInfo));
1315+
emac.set_wifi_emac_handle(_wlan_status_connected_info.handle);
13151316

13161317
if (error_code == NSAPI_ERROR_OK || error_code == NSAPI_ERROR_IS_CONNECTED) {
1317-
memcpy(&_wlan_status_connected_info, &(wlan_connect->info), sizeof(cbWLAN_StatusConnectedInfo));
13181318
if(_state_sta != S_STA_CONNECTED){
13191319
_state_sta = S_STA_CONNECTED;
13201320
send_user_response_msg(ODIN_WIFI_MSG_USER_CONNECT, NSAPI_ERROR_OK);
@@ -1349,6 +1349,7 @@ void OdinWiFiInterface::handle_wlan_status_connection_failure(wlan_status_connec
13491349
}
13501350

13511351
memcpy(&_wlan_status_disconnected_info, &(connect_failure->info), sizeof(cbWLAN_StatusDisconnectedInfo));
1352+
emac.set_wifi_emac_handle(_wlan_status_disconnected_info.handle);
13521353

13531354
switch(_state_sta) {
13541355
case S_STA_WAIT_CONNECT:
@@ -1381,7 +1382,7 @@ void OdinWiFiInterface::handle_wlan_status_connection_failure(wlan_status_connec
13811382

13821383
void OdinWiFiInterface::handle_wlan_status_disconnected(void)
13831384
{
1384-
nsapi_error_t error_code;
1385+
nsapi_error_t error_code = NSAPI_ERROR_OK;
13851386

13861387
if(_debug) {
13871388
printf("WLAN STATUS DISCONNECTED\r\n");
@@ -1402,24 +1403,19 @@ void OdinWiFiInterface::handle_wlan_status_disconnected(void)
14021403

14031404
case S_STA_CONNECTION_FAIL_WAIT_DISCONNECT:
14041405
_state_sta = S_STA_IDLE;
1405-
if(_wlan_status_disconnected_info.handle == cbWLAN_DEFAULT_HANDLE){
1406-
switch(_wlan_status_disconnected_info.reason) {
1407-
error_code = NSAPI_ERROR_NO_SSID;
1408-
break;
1409-
1410-
case cbWLAN_STATUS_DISCONNECTED_AUTH_FAILURE:
1411-
case cbWLAN_STATUS_DISCONNECTED_ASSOC_FAILURE:
1412-
case cbWLAN_STATUS_DISCONNECTED_MIC_FAILURE:
1413-
error_code = NSAPI_ERROR_AUTH_FAILURE;
1414-
break;
1415-
case cbWLAN_STATUS_DISCONNECTED_NO_BSSID_FOUND:
1416-
case cbWLAN_STATUS_DISCONNECTED_UNKNOWN:
1417-
error_code = NSAPI_ERROR_NO_CONNECTION;
1418-
break;
1419-
default:
1420-
error_code = NSAPI_ERROR_DEVICE_ERROR;
1421-
break;
1422-
}
1406+
switch(_wlan_status_disconnected_info.reason) {
1407+
case cbWLAN_STATUS_DISCONNECTED_AUTH_FAILURE:
1408+
case cbWLAN_STATUS_DISCONNECTED_ASSOC_FAILURE:
1409+
case cbWLAN_STATUS_DISCONNECTED_MIC_FAILURE:
1410+
error_code = NSAPI_ERROR_AUTH_FAILURE;
1411+
break;
1412+
case cbWLAN_STATUS_DISCONNECTED_NO_BSSID_FOUND:
1413+
case cbWLAN_STATUS_DISCONNECTED_UNKNOWN:
1414+
error_code = NSAPI_ERROR_NO_CONNECTION;
1415+
break;
1416+
default:
1417+
error_code = NSAPI_ERROR_DEVICE_ERROR;
1418+
break;
14231419
}
14241420
send_user_response_msg(ODIN_WIFI_MSG_USER_CONNECT, error_code);
14251421
break;
@@ -1562,6 +1558,9 @@ void OdinWiFiInterface::init(bool debug = false)
15621558
memset(_mac_addr_str, 0, ODIN_WIFI_MAX_MAC_ADDR_STR);
15631559
memset(&_wlan_status_connected_info, 0, sizeof(cbWLAN_StatusConnectedInfo));
15641560
memset(&_wlan_status_disconnected_info, 0, sizeof(cbWLAN_StatusDisconnectedInfo));
1561+
_wlan_status_connected_info.handle = cbWLAN_DEFAULT_HANDLE;
1562+
_wlan_status_disconnected_info.handle = cbWLAN_DEFAULT_HANDLE;
1563+
_ap.handle = cbWLAN_DEFAULT_HANDLE;
15651564

15661565
_msg_pool = new MemoryPool<odin_wifi_msg_s, 11>();
15671566

@@ -1660,6 +1659,8 @@ nsapi_error_t OdinWiFiInterface::wlan_connect(
16601659
strncpy((char*)connect_params.ssid.ssid, ssid, cbWLAN_SSID_MAX_LENGTH);
16611660
connect_params.ssid.ssidLength = strlen((const char*)connect_params.ssid.ssid);
16621661

1662+
static cbWLAN_Handle handle;
1663+
16631664
switch (security)
16641665
{
16651666
case NSAPI_SECURITY_NONE:
@@ -1717,6 +1718,7 @@ nsapi_error_t OdinWiFiInterface::wlan_connect(
17171718
break;
17181719
}
17191720

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

1757+
static cbWLAN_Handle handle;
1758+
17551759
if (status != cbSTATUS_OK) {
17561760
error_code = NSAPI_ERROR_PARAMETER;
17571761
} else {
@@ -1791,7 +1795,7 @@ nsapi_error_t OdinWiFiInterface::wlan_ap_start(
17911795
error_code = NSAPI_ERROR_UNSUPPORTED;
17921796
}
17931797
}
1794-
1798+
_ap.handle = handle;
17951799
return error_code;
17961800
}
17971801

@@ -1830,14 +1834,16 @@ void OdinWiFiInterface::wlan_scan_indication(cbWLAN_ScanIndicationInfo *scan_inf
18301834

18311835
void OdinWiFiInterface::wlan_status_indication(cbWLAN_StatusIndicationInfo status, void *data)
18321836
{
1833-
struct odin_wifi_msg_s* msg = _msg_pool->alloc();
1834-
MBED_ASSERT(msg != NULL);
1837+
if (!flush_while_wlan_status_connected) {
1838+
struct odin_wifi_msg_s* msg = _msg_pool->alloc();
1839+
MBED_ASSERT(msg != NULL);
18351840

1836-
msg->type = status;
1837-
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));
18381843

1839-
osStatus ok = _in_queue.put(msg, 0);
1840-
MBED_ASSERT(ok == osOK);
1844+
osStatus ok = _in_queue.put(msg, 0);
1845+
MBED_ASSERT(ok == osOK);
1846+
}
18411847
}
18421848

18431849
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
@@ -63,9 +63,9 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
6363
public:
6464
/** OdinWiFiInterface lifetime
6565
*/
66-
OdinWiFiInterface(OdinWiFiEMAC &emac = OdinWiFiEMAC::get_instance(), OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance());
66+
OdinWiFiInterface(OdinWiFiEMAC &emac_obj = OdinWiFiEMAC::get_instance(), OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance());
6767

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

7070
~OdinWiFiInterface();
7171

@@ -291,6 +291,8 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
291291

292292
private:
293293

294+
OdinWiFiEMAC &emac = OdinWiFiEMAC::get_instance();
295+
294296
enum OdinWifiState {
295297
S_NOT_INITIALISED = 1,
296298
S_WAIT_START,
@@ -338,6 +340,8 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
338340

339341
nsapi_error_t error_code;
340342
uint16_t beacon_interval;
343+
344+
cbWLAN_Handle handle;
341345
};
342346

343347
struct scan_cache_s {
@@ -346,7 +350,6 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
346350
cbWLAN_MACAddress bssid[ODIN_WIFI_SCAN_CACHE_SIZE];
347351
};
348352

349-
cbWLAN_Handle handle = cbWLAN_INVALID_HANDLE;
350353
OdinWifiState entry_connect_fail_wait_disconnect();
351354
OdinWifiState entry_wait_connect();
352355
OdinWifiState entry_wait_disconnect();
@@ -440,6 +443,8 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
440443

441444
bool _debug;
442445
int _dbg_timeout;
446+
447+
bool flush_while_wlan_status_connected = false;
443448
};
444449

445450
#endif

0 commit comments

Comments
 (0)