diff --git a/features/netsocket/emac-drivers/TARGET_STM/TARGET_STM32F4/TARGET_MODULE_UBLOX_ODIN_W2/wifi_emac/wifi_emac.cpp b/features/netsocket/emac-drivers/TARGET_STM/TARGET_STM32F4/TARGET_MODULE_UBLOX_ODIN_W2/wifi_emac/wifi_emac.cpp index 2f44f9b3be..91265aeded 100644 --- a/features/netsocket/emac-drivers/TARGET_STM/TARGET_STM32F4/TARGET_MODULE_UBLOX_ODIN_W2/wifi_emac/wifi_emac.cpp +++ b/features/netsocket/emac-drivers/TARGET_STM/TARGET_STM32F4/TARGET_MODULE_UBLOX_ODIN_W2/wifi_emac/wifi_emac.cpp @@ -39,7 +39,7 @@ cb_uint32 handleWlanTargetGetDataFrameSize(cbWLANTARGET_dataFrame* frame); cb_uint8 handleWlanTargetGetDataFrameTID(cbWLANTARGET_dataFrame* frame); void handleWlanStatusIndication(void *dummy, cbWLAN_StatusIndicationInfo status, void *data); void handleWlanPacketIndication(void *dummy, cbWLAN_PacketIndicationInfo *packetInfo); -void send_wlan_packet(void *buf); +void send_wlan_packet(OdinWiFiEMAC *ptr, void *buf); static const cbWLANTARGET_Callback _wlanTargetCallback = { @@ -202,9 +202,19 @@ OdinWiFiEMAC::OdinWiFiEMAC() cbWLANTARGET_registerCallbacks((cbWLANTARGET_Callback*)&_wlanTargetCallback); } -void send_wlan_packet(void *buf) +cbWLAN_Handle OdinWiFiEMAC::get_wifi_emac_handle() { - cbWLAN_sendPacket(cbWLAN_DEFAULT_HANDLE, buf); + return this->handle; +} + +void OdinWiFiEMAC::set_wifi_emac_handle(cbWLAN_Handle _handle) +{ + this->handle = _handle; +} + +void send_wlan_packet(OdinWiFiEMAC *ptr, void *buf) +{ + cbWLAN_sendPacket(ptr->handle, buf); } bool OdinWiFiEMAC::link_out(emac_mem_buf_t *buf) @@ -215,7 +225,7 @@ bool OdinWiFiEMAC::link_out(emac_mem_buf_t *buf) emac_mem_buf_t *new_buf = mem->alloc_pool(mem->get_total_len(buf), 0); if (new_buf != NULL) { mem->copy(new_buf, buf); - int id = cbMAIN_getEventQueue()->call(send_wlan_packet, new_buf); + int id = cbMAIN_getEventQueue()->call(send_wlan_packet, this, new_buf); if (id != 0) { cbMAIN_dispatchEventQueue(); } else { @@ -262,9 +272,8 @@ void OdinWiFiEMAC::set_hwaddr(const uint8_t *addr) void OdinWiFiEMAC::set_link_input_cb(emac_link_input_cb_t input_cb) { emac_link_input_cb = input_cb; - cbMAIN_driverLock(); - cbWLAN_registerPacketIndicationCallback(cbWLAN_DEFAULT_HANDLE, handleWlanPacketIndication, NULL); + cbWLAN_registerPacketIndicationCallback(get_wifi_emac_handle(), handleWlanPacketIndication, NULL); cbMAIN_driverUnlock(); } diff --git a/features/netsocket/emac-drivers/TARGET_STM/TARGET_STM32F4/TARGET_MODULE_UBLOX_ODIN_W2/wifi_emac/wifi_emac.h b/features/netsocket/emac-drivers/TARGET_STM/TARGET_STM32F4/TARGET_MODULE_UBLOX_ODIN_W2/wifi_emac/wifi_emac.h index 22e68baa27..f8fe5ceebb 100644 --- a/features/netsocket/emac-drivers/TARGET_STM/TARGET_STM32F4/TARGET_MODULE_UBLOX_ODIN_W2/wifi_emac/wifi_emac.h +++ b/features/netsocket/emac-drivers/TARGET_STM/TARGET_STM32F4/TARGET_MODULE_UBLOX_ODIN_W2/wifi_emac/wifi_emac.h @@ -124,8 +124,13 @@ public: virtual void remove_multicast_group(const uint8_t *address); virtual void set_all_multicast(bool all); + cbWLAN_Handle get_wifi_emac_handle(); + void set_wifi_emac_handle(cbWLAN_Handle _handle); + private: + cbWLAN_Handle handle = cbWLAN_DEFAULT_HANDLE; + emac_link_input_cb_t emac_link_input_cb; /**< Callback for incoming data */ emac_link_state_change_cb_t emac_link_state_cb; /**< Link state change callback */ EMACMemoryManager *memory_manager; @@ -138,7 +143,7 @@ private: friend void handleWlanStatusIndication(void *dummy, cbWLAN_StatusIndicationInfo status, void *data); friend void handleWlanPacketIndication(void *dummy, cbWLAN_PacketIndicationInfo *packetInfo); - friend void send_wlan_packet(void *buf); + friend void send_wlan_packet(OdinWiFiEMAC *ptr, void *buf); }; #endif /* WIFI_EMAC_H_ */ diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_ARM/libublox-odin-w2-driver.ar b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_ARM/libublox-odin-w2-driver.ar index b60db71788..8390fe50e3 100644 Binary files a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_ARM/libublox-odin-w2-driver.ar and b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_ARM/libublox-odin-w2-driver.ar differ diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_GCC_ARM/libublox-odin-w2-driver.a b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_GCC_ARM/libublox-odin-w2-driver.a index b2e4128a9e..7923dfc2d6 100644 Binary files a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_GCC_ARM/libublox-odin-w2-driver.a and b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_GCC_ARM/libublox-odin-w2-driver.a differ diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_IAR/libublox-odin-w2-driver.a b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_IAR/libublox-odin-w2-driver.a index dfa5235558..a7e547190d 100644 Binary files a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_IAR/libublox-odin-w2-driver.a and b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_IAR/libublox-odin-w2-driver.a differ diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.cpp b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.cpp index 4ebdd6683a..81bd32a7b8 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.cpp +++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.cpp @@ -158,15 +158,15 @@ struct wlan_callb_s { bool OdinWiFiInterface::_wlan_initialized = false; int32_t OdinWiFiInterface::_target_id = cbMAIN_TARGET_INVALID_ID; -OdinWiFiInterface::OdinWiFiInterface(OdinWiFiEMAC &emac , OnboardNetworkStack &stack) : - EMACInterface(emac, stack), +OdinWiFiInterface::OdinWiFiInterface(OdinWiFiEMAC &emac_obj, OnboardNetworkStack &stack) : + EMACInterface(emac_obj, stack), _thread(osPriorityNormal, 4096) { init(false); } -OdinWiFiInterface::OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac, OnboardNetworkStack &stack) : - EMACInterface(emac, stack), +OdinWiFiInterface::OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac_obj, OnboardNetworkStack &stack) : + EMACInterface(emac_obj, stack), _thread(osPriorityNormal, 4096) { init(debug); @@ -386,7 +386,7 @@ nsapi_error_t OdinWiFiInterface::connect( return NSAPI_ERROR_PARAMETER; } - if((security == NSAPI_SECURITY_EAP_TLS) && (cert_handle->client_cert == NULL)) { + if((security == NSAPI_SECURITY_EAP_TLS) && (cert_handle->client_cert == NULL || cert_handle->client_prvt_key == NULL)) { return NSAPI_ERROR_PARAMETER; } @@ -757,7 +757,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_connect_fail_wait_disc cbRTSL_Status error_code; cbMAIN_driverLock(); - error_code = cbWLAN_disconnect(handle); + error_code = cbWLAN_disconnect(_wlan_status_connected_info.handle); cbMAIN_driverUnlock(); MBED_ASSERT(error_code == cbSTATUS_OK); @@ -778,7 +778,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_wait_disconnect() cbRTSL_Status error_code; cbMAIN_driverLock(); - error_code = cbWLAN_disconnect(handle); + error_code = cbWLAN_disconnect(_wlan_status_disconnected_info.handle); cbMAIN_driverUnlock(); MBED_ASSERT(error_code == cbSTATUS_OK); @@ -802,7 +802,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_started() OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_wait_stop() { cbMAIN_driverLock(); - cbRTSL_Status status = cbWLAN_apStop(handle); + cbRTSL_Status status = cbWLAN_apStop(_ap.handle); cbMAIN_driverUnlock(); MBED_ASSERT(status == cbSTATUS_OK); @@ -813,7 +813,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_wait_stop() OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_fail_wait_stop() { cbMAIN_driverLock(); - cbRTSL_Status status = cbWLAN_apStop(handle); + cbRTSL_Status status = cbWLAN_apStop(_ap.handle); cbMAIN_driverUnlock(); MBED_ASSERT(status == cbSTATUS_OK); @@ -917,7 +917,9 @@ void OdinWiFiInterface::handle_in_msg(void) break; case cbWLAN_STATUS_CONNECTED: + flush_drvr_ind_pkts = true; handle_wlan_status_connected(&(msg->data.wlan_status_connected)); + flush_drvr_ind_pkts = false; break; case cbWLAN_SCAN_INDICATION: @@ -1024,11 +1026,6 @@ void OdinWiFiInterface::handle_user_connect(user_connect_s *user_connect) } if(error_code == NSAPI_ERROR_OK) { - memset(&_wlan_status_connected_info, 0, sizeof(cbWLAN_StatusConnectedInfo)); - memset(&_wlan_status_disconnected_info, 0, sizeof(cbWLAN_StatusDisconnectedInfo)); - _wlan_status_disconnected_info.handle = cbWLAN_DEFAULT_HANDLE; - _wlan_status_connected_info.handle = cbWLAN_DEFAULT_HANDLE; - _state_sta = entry_wait_connect(); } else @@ -1045,6 +1042,7 @@ void OdinWiFiInterface::handle_user_disconnect(void) switch(_state_sta) { case S_STA_CONNECTED: case S_STA_DISCONNECTED_WAIT_CONNECT: + emac.set_wifi_emac_handle(_wlan_status_disconnected_info.handle); _state_sta = entry_wait_disconnect(); break; @@ -1123,6 +1121,7 @@ void OdinWiFiInterface::handle_user_connect_timeout() } _timer.stop(); + emac.set_wifi_emac_handle(_wlan_status_connected_info.handle); _state_sta = entry_connect_fail_wait_disconnect(); } } @@ -1314,9 +1313,10 @@ void OdinWiFiInterface::handle_wlan_status_connected(wlan_status_connected_s *wl _gateway[0] ? _gateway : 0, DEFAULT_STACK); + memcpy(&_wlan_status_connected_info, &(wlan_connect->info), sizeof(cbWLAN_StatusConnectedInfo)); + emac.set_wifi_emac_handle(_wlan_status_connected_info.handle); if (error_code == NSAPI_ERROR_OK || error_code == NSAPI_ERROR_IS_CONNECTED) { - memcpy(&_wlan_status_connected_info, &(wlan_connect->info), sizeof(cbWLAN_StatusConnectedInfo)); if(_state_sta != S_STA_CONNECTED){ _state_sta = S_STA_CONNECTED; 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 } memcpy(&_wlan_status_disconnected_info, &(connect_failure->info), sizeof(cbWLAN_StatusDisconnectedInfo)); + emac.set_wifi_emac_handle(_wlan_status_disconnected_info.handle); switch(_state_sta) { case S_STA_WAIT_CONNECT: @@ -1383,7 +1384,7 @@ void OdinWiFiInterface::handle_wlan_status_connection_failure(wlan_status_connec void OdinWiFiInterface::handle_wlan_status_disconnected(void) { - nsapi_error_t error_code; + nsapi_error_t error_code = NSAPI_ERROR_OK; if(_debug) { printf("WLAN STATUS DISCONNECTED\r\n"); @@ -1404,24 +1405,19 @@ void OdinWiFiInterface::handle_wlan_status_disconnected(void) case S_STA_CONNECTION_FAIL_WAIT_DISCONNECT: _state_sta = S_STA_IDLE; - if(_wlan_status_disconnected_info.handle == cbWLAN_DEFAULT_HANDLE){ - switch(_wlan_status_disconnected_info.reason) { - error_code = NSAPI_ERROR_NO_SSID; - break; - - case cbWLAN_STATUS_DISCONNECTED_AUTH_FAILURE: - case cbWLAN_STATUS_DISCONNECTED_ASSOC_FAILURE: - case cbWLAN_STATUS_DISCONNECTED_MIC_FAILURE: - error_code = NSAPI_ERROR_AUTH_FAILURE; - break; - case cbWLAN_STATUS_DISCONNECTED_NO_BSSID_FOUND: - case cbWLAN_STATUS_DISCONNECTED_UNKNOWN: - error_code = NSAPI_ERROR_NO_CONNECTION; - break; - default: - error_code = NSAPI_ERROR_DEVICE_ERROR; - break; - } + switch(_wlan_status_disconnected_info.reason) { + case cbWLAN_STATUS_DISCONNECTED_AUTH_FAILURE: + case cbWLAN_STATUS_DISCONNECTED_ASSOC_FAILURE: + case cbWLAN_STATUS_DISCONNECTED_MIC_FAILURE: + error_code = NSAPI_ERROR_AUTH_FAILURE; + break; + case cbWLAN_STATUS_DISCONNECTED_NO_BSSID_FOUND: + case cbWLAN_STATUS_DISCONNECTED_UNKNOWN: + error_code = NSAPI_ERROR_NO_CONNECTION; + break; + default: + error_code = NSAPI_ERROR_DEVICE_ERROR; + break; } send_user_response_msg(ODIN_WIFI_MSG_USER_CONNECT, error_code); break; @@ -1564,6 +1560,9 @@ void OdinWiFiInterface::init(bool debug = false) memset(_mac_addr_str, 0, ODIN_WIFI_MAX_MAC_ADDR_STR); memset(&_wlan_status_connected_info, 0, sizeof(cbWLAN_StatusConnectedInfo)); memset(&_wlan_status_disconnected_info, 0, sizeof(cbWLAN_StatusDisconnectedInfo)); + _wlan_status_connected_info.handle = cbWLAN_DEFAULT_HANDLE; + _wlan_status_disconnected_info.handle = cbWLAN_DEFAULT_HANDLE; + _ap.handle = cbWLAN_DEFAULT_HANDLE; _msg_pool = new MemoryPool(); @@ -1655,6 +1654,7 @@ nsapi_error_t OdinWiFiInterface::wlan_connect( cbRTSL_Status status = cbSTATUS_OK; cbWLAN_CommonConnectParameters connect_params; cbWLAN_EnterpriseConnectParameters enterpriseParams; + static cbWLAN_Handle handle = cbWLAN_DEFAULT_HANDLE; memset(&enterpriseParams, 0, sizeof(cbWLAN_EnterpriseConnectParameters)); memset(&connect_params, 0, sizeof(cbWLAN_CommonConnectParameters)); @@ -1739,6 +1739,8 @@ nsapi_error_t OdinWiFiInterface::wlan_ap_start( cbWLAN_CommonApParameters params; cbWLAN_WPAPSKApParameters wpa_params; + static cbWLAN_Handle handle = cbWLAN_DEFAULT_HANDLE; + char temp_passphrase[cbWLAN_MAX_PASSPHRASE_LENGTH]; memset(¶ms, 0, sizeof(cbWLAN_CommonApParameters)); @@ -1793,7 +1795,7 @@ nsapi_error_t OdinWiFiInterface::wlan_ap_start( error_code = NSAPI_ERROR_UNSUPPORTED; } } - + _ap.handle = handle; return error_code; } @@ -1832,14 +1834,16 @@ void OdinWiFiInterface::wlan_scan_indication(cbWLAN_ScanIndicationInfo *scan_inf void OdinWiFiInterface::wlan_status_indication(cbWLAN_StatusIndicationInfo status, void *data) { - struct odin_wifi_msg_s* msg = _msg_pool->alloc(); - MBED_ASSERT(msg != NULL); + if (!flush_drvr_ind_pkts) { + struct odin_wifi_msg_s* msg = _msg_pool->alloc(); + MBED_ASSERT(msg != NULL); - msg->type = status; - memcpy(&(msg->data), data, sizeof(odin_wifi_msg_s::data_t)); + msg->type = status; + memcpy(&(msg->data), data, sizeof(odin_wifi_msg_s::data_t)); - osStatus ok = _in_queue.put(msg, 0); - MBED_ASSERT(ok == osOK); + osStatus ok = _in_queue.put(msg, 0); + MBED_ASSERT(ok == osOK); + } } static nsapi_security_t convertToNSAPI_security(cbWLAN_AuthenticationSuite authSuit) diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h index 8a0c1d3bd7..f747134fdd 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h +++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h @@ -65,9 +65,9 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface public: /** OdinWiFiInterface lifetime */ - OdinWiFiInterface(OdinWiFiEMAC &emac = OdinWiFiEMAC::get_instance(), OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance()); + OdinWiFiInterface(OdinWiFiEMAC &emac_obj = OdinWiFiEMAC::get_instance(), OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance()); - OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac = OdinWiFiEMAC::get_instance(), OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance()); + OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac_obj = OdinWiFiEMAC::get_instance(), OnboardNetworkStack &stack = OnboardNetworkStack::get_default_instance()); ~OdinWiFiInterface(); @@ -340,6 +340,8 @@ private: nsapi_error_t error_code; uint16_t beacon_interval; + + cbWLAN_Handle handle; }; struct scan_cache_s { @@ -348,7 +350,6 @@ private: cbWLAN_MACAddress bssid[ODIN_WIFI_SCAN_CACHE_SIZE]; }; - cbWLAN_Handle handle = cbWLAN_INVALID_HANDLE; OdinWifiState entry_connect_fail_wait_disconnect(); OdinWifiState entry_wait_connect(); OdinWifiState entry_wait_disconnect(); @@ -442,6 +443,11 @@ private: bool _debug; int _dbg_timeout; + + OdinWiFiEMAC &emac = OdinWiFiEMAC::get_instance(); + + // This flag is added to flush the packets that were coming in between while the status was connected hence causing message pool overflow + bool flush_drvr_ind_pkts = false; }; #endif