Merge pull request #11983 from u-blox/ublox_odin_driver_os_5_v3.7.1_rc3

Ublox Odin Driver OS 5 v3.7.1 rc3: Network-WiFi Test Crash Fixes
pull/12025/head
Martin Kojtal 2019-12-04 10:12:11 +01:00 committed by GitHub
commit bbf68d7272
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 75 additions and 51 deletions

View File

@ -39,7 +39,7 @@ cb_uint32 handleWlanTargetGetDataFrameSize(cbWLANTARGET_dataFrame* frame);
cb_uint8 handleWlanTargetGetDataFrameTID(cbWLANTARGET_dataFrame* frame); cb_uint8 handleWlanTargetGetDataFrameTID(cbWLANTARGET_dataFrame* frame);
void handleWlanStatusIndication(void *dummy, cbWLAN_StatusIndicationInfo status, void *data); void handleWlanStatusIndication(void *dummy, cbWLAN_StatusIndicationInfo status, void *data);
void handleWlanPacketIndication(void *dummy, cbWLAN_PacketIndicationInfo *packetInfo); 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 = static const cbWLANTARGET_Callback _wlanTargetCallback =
{ {
@ -202,9 +202,19 @@ OdinWiFiEMAC::OdinWiFiEMAC()
cbWLANTARGET_registerCallbacks((cbWLANTARGET_Callback*)&_wlanTargetCallback); 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) 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); emac_mem_buf_t *new_buf = mem->alloc_pool(mem->get_total_len(buf), 0);
if (new_buf != NULL) { if (new_buf != NULL) {
mem->copy(new_buf, buf); 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) { if (id != 0) {
cbMAIN_dispatchEventQueue(); cbMAIN_dispatchEventQueue();
} else { } 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) void OdinWiFiEMAC::set_link_input_cb(emac_link_input_cb_t input_cb)
{ {
emac_link_input_cb = input_cb; emac_link_input_cb = input_cb;
cbMAIN_driverLock(); cbMAIN_driverLock();
cbWLAN_registerPacketIndicationCallback(cbWLAN_DEFAULT_HANDLE, handleWlanPacketIndication, NULL); cbWLAN_registerPacketIndicationCallback(get_wifi_emac_handle(), handleWlanPacketIndication, NULL);
cbMAIN_driverUnlock(); cbMAIN_driverUnlock();
} }

View File

@ -124,8 +124,13 @@ public:
virtual void remove_multicast_group(const uint8_t *address); virtual void remove_multicast_group(const uint8_t *address);
virtual void set_all_multicast(bool all); virtual void set_all_multicast(bool all);
cbWLAN_Handle get_wifi_emac_handle();
void set_wifi_emac_handle(cbWLAN_Handle _handle);
private: private:
cbWLAN_Handle handle = cbWLAN_DEFAULT_HANDLE;
emac_link_input_cb_t emac_link_input_cb; /**< Callback for incoming data */ 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 */ emac_link_state_change_cb_t emac_link_state_cb; /**< Link state change callback */
EMACMemoryManager *memory_manager; EMACMemoryManager *memory_manager;
@ -138,7 +143,7 @@ private:
friend void handleWlanStatusIndication(void *dummy, cbWLAN_StatusIndicationInfo status, void *data); friend void handleWlanStatusIndication(void *dummy, cbWLAN_StatusIndicationInfo status, void *data);
friend void handleWlanPacketIndication(void *dummy, cbWLAN_PacketIndicationInfo *packetInfo); 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_ */ #endif /* WIFI_EMAC_H_ */

View File

@ -158,15 +158,15 @@ struct wlan_callb_s {
bool OdinWiFiInterface::_wlan_initialized = false; bool OdinWiFiInterface::_wlan_initialized = false;
int32_t OdinWiFiInterface::_target_id = cbMAIN_TARGET_INVALID_ID; int32_t OdinWiFiInterface::_target_id = cbMAIN_TARGET_INVALID_ID;
OdinWiFiInterface::OdinWiFiInterface(OdinWiFiEMAC &emac , OnboardNetworkStack &stack) : OdinWiFiInterface::OdinWiFiInterface(OdinWiFiEMAC &emac_obj, OnboardNetworkStack &stack) :
EMACInterface(emac, stack), EMACInterface(emac_obj, stack),
_thread(osPriorityNormal, 4096) _thread(osPriorityNormal, 4096)
{ {
init(false); init(false);
} }
OdinWiFiInterface::OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac, OnboardNetworkStack &stack) : OdinWiFiInterface::OdinWiFiInterface(bool debug, OdinWiFiEMAC &emac_obj, OnboardNetworkStack &stack) :
EMACInterface(emac, stack), EMACInterface(emac_obj, stack),
_thread(osPriorityNormal, 4096) _thread(osPriorityNormal, 4096)
{ {
init(debug); init(debug);
@ -386,7 +386,7 @@ nsapi_error_t OdinWiFiInterface::connect(
return NSAPI_ERROR_PARAMETER; 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; return NSAPI_ERROR_PARAMETER;
} }
@ -757,7 +757,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_connect_fail_wait_disc
cbRTSL_Status error_code; cbRTSL_Status error_code;
cbMAIN_driverLock(); cbMAIN_driverLock();
error_code = cbWLAN_disconnect(handle); error_code = cbWLAN_disconnect(_wlan_status_connected_info.handle);
cbMAIN_driverUnlock(); cbMAIN_driverUnlock();
MBED_ASSERT(error_code == cbSTATUS_OK); MBED_ASSERT(error_code == cbSTATUS_OK);
@ -778,7 +778,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_wait_disconnect()
cbRTSL_Status error_code; cbRTSL_Status error_code;
cbMAIN_driverLock(); cbMAIN_driverLock();
error_code = cbWLAN_disconnect(handle); error_code = cbWLAN_disconnect(_wlan_status_disconnected_info.handle);
cbMAIN_driverUnlock(); cbMAIN_driverUnlock();
MBED_ASSERT(error_code == cbSTATUS_OK); MBED_ASSERT(error_code == cbSTATUS_OK);
@ -802,7 +802,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_started()
OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_wait_stop() OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_wait_stop()
{ {
cbMAIN_driverLock(); cbMAIN_driverLock();
cbRTSL_Status status = cbWLAN_apStop(handle); cbRTSL_Status status = cbWLAN_apStop(_ap.handle);
cbMAIN_driverUnlock(); cbMAIN_driverUnlock();
MBED_ASSERT(status == cbSTATUS_OK); MBED_ASSERT(status == cbSTATUS_OK);
@ -813,7 +813,7 @@ OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_wait_stop()
OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_fail_wait_stop() OdinWiFiInterface::OdinWifiState OdinWiFiInterface::entry_ap_fail_wait_stop()
{ {
cbMAIN_driverLock(); cbMAIN_driverLock();
cbRTSL_Status status = cbWLAN_apStop(handle); cbRTSL_Status status = cbWLAN_apStop(_ap.handle);
cbMAIN_driverUnlock(); cbMAIN_driverUnlock();
MBED_ASSERT(status == cbSTATUS_OK); MBED_ASSERT(status == cbSTATUS_OK);
@ -917,7 +917,9 @@ void OdinWiFiInterface::handle_in_msg(void)
break; break;
case cbWLAN_STATUS_CONNECTED: case cbWLAN_STATUS_CONNECTED:
flush_drvr_ind_pkts = true;
handle_wlan_status_connected(&(msg->data.wlan_status_connected)); handle_wlan_status_connected(&(msg->data.wlan_status_connected));
flush_drvr_ind_pkts = false;
break; break;
case cbWLAN_SCAN_INDICATION: case cbWLAN_SCAN_INDICATION:
@ -1024,11 +1026,6 @@ void OdinWiFiInterface::handle_user_connect(user_connect_s *user_connect)
} }
if(error_code == NSAPI_ERROR_OK) { 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(); _state_sta = entry_wait_connect();
} }
else else
@ -1045,6 +1042,7 @@ void OdinWiFiInterface::handle_user_disconnect(void)
switch(_state_sta) { switch(_state_sta) {
case S_STA_CONNECTED: case S_STA_CONNECTED:
case S_STA_DISCONNECTED_WAIT_CONNECT: case S_STA_DISCONNECTED_WAIT_CONNECT:
emac.set_wifi_emac_handle(_wlan_status_disconnected_info.handle);
_state_sta = entry_wait_disconnect(); _state_sta = entry_wait_disconnect();
break; break;
@ -1123,6 +1121,7 @@ void OdinWiFiInterface::handle_user_connect_timeout()
} }
_timer.stop(); _timer.stop();
emac.set_wifi_emac_handle(_wlan_status_connected_info.handle);
_state_sta = entry_connect_fail_wait_disconnect(); _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, _gateway[0] ? _gateway : 0,
DEFAULT_STACK); 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) { 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){ if(_state_sta != S_STA_CONNECTED){
_state_sta = S_STA_CONNECTED; _state_sta = S_STA_CONNECTED;
send_user_response_msg(ODIN_WIFI_MSG_USER_CONNECT, NSAPI_ERROR_OK); 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)); memcpy(&_wlan_status_disconnected_info, &(connect_failure->info), sizeof(cbWLAN_StatusDisconnectedInfo));
emac.set_wifi_emac_handle(_wlan_status_disconnected_info.handle);
switch(_state_sta) { switch(_state_sta) {
case S_STA_WAIT_CONNECT: 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) void OdinWiFiInterface::handle_wlan_status_disconnected(void)
{ {
nsapi_error_t error_code; nsapi_error_t error_code = NSAPI_ERROR_OK;
if(_debug) { if(_debug) {
printf("WLAN STATUS DISCONNECTED\r\n"); printf("WLAN STATUS DISCONNECTED\r\n");
@ -1404,24 +1405,19 @@ void OdinWiFiInterface::handle_wlan_status_disconnected(void)
case S_STA_CONNECTION_FAIL_WAIT_DISCONNECT: case S_STA_CONNECTION_FAIL_WAIT_DISCONNECT:
_state_sta = S_STA_IDLE; _state_sta = S_STA_IDLE;
if(_wlan_status_disconnected_info.handle == cbWLAN_DEFAULT_HANDLE){ switch(_wlan_status_disconnected_info.reason) {
switch(_wlan_status_disconnected_info.reason) { case cbWLAN_STATUS_DISCONNECTED_AUTH_FAILURE:
error_code = NSAPI_ERROR_NO_SSID; case cbWLAN_STATUS_DISCONNECTED_ASSOC_FAILURE:
break; case cbWLAN_STATUS_DISCONNECTED_MIC_FAILURE:
error_code = NSAPI_ERROR_AUTH_FAILURE;
case cbWLAN_STATUS_DISCONNECTED_AUTH_FAILURE: break;
case cbWLAN_STATUS_DISCONNECTED_ASSOC_FAILURE: case cbWLAN_STATUS_DISCONNECTED_NO_BSSID_FOUND:
case cbWLAN_STATUS_DISCONNECTED_MIC_FAILURE: case cbWLAN_STATUS_DISCONNECTED_UNKNOWN:
error_code = NSAPI_ERROR_AUTH_FAILURE; error_code = NSAPI_ERROR_NO_CONNECTION;
break; break;
case cbWLAN_STATUS_DISCONNECTED_NO_BSSID_FOUND: default:
case cbWLAN_STATUS_DISCONNECTED_UNKNOWN: error_code = NSAPI_ERROR_DEVICE_ERROR;
error_code = NSAPI_ERROR_NO_CONNECTION; break;
break;
default:
error_code = NSAPI_ERROR_DEVICE_ERROR;
break;
}
} }
send_user_response_msg(ODIN_WIFI_MSG_USER_CONNECT, error_code); send_user_response_msg(ODIN_WIFI_MSG_USER_CONNECT, error_code);
break; break;
@ -1564,6 +1560,9 @@ void OdinWiFiInterface::init(bool debug = false)
memset(_mac_addr_str, 0, ODIN_WIFI_MAX_MAC_ADDR_STR); memset(_mac_addr_str, 0, ODIN_WIFI_MAX_MAC_ADDR_STR);
memset(&_wlan_status_connected_info, 0, sizeof(cbWLAN_StatusConnectedInfo)); memset(&_wlan_status_connected_info, 0, sizeof(cbWLAN_StatusConnectedInfo));
memset(&_wlan_status_disconnected_info, 0, sizeof(cbWLAN_StatusDisconnectedInfo)); 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<odin_wifi_msg_s, 11>(); _msg_pool = new MemoryPool<odin_wifi_msg_s, 11>();
@ -1655,6 +1654,7 @@ nsapi_error_t OdinWiFiInterface::wlan_connect(
cbRTSL_Status status = cbSTATUS_OK; cbRTSL_Status status = cbSTATUS_OK;
cbWLAN_CommonConnectParameters connect_params; cbWLAN_CommonConnectParameters connect_params;
cbWLAN_EnterpriseConnectParameters enterpriseParams; cbWLAN_EnterpriseConnectParameters enterpriseParams;
static cbWLAN_Handle handle = cbWLAN_DEFAULT_HANDLE;
memset(&enterpriseParams, 0, sizeof(cbWLAN_EnterpriseConnectParameters)); memset(&enterpriseParams, 0, sizeof(cbWLAN_EnterpriseConnectParameters));
memset(&connect_params, 0, sizeof(cbWLAN_CommonConnectParameters)); memset(&connect_params, 0, sizeof(cbWLAN_CommonConnectParameters));
@ -1739,6 +1739,8 @@ nsapi_error_t OdinWiFiInterface::wlan_ap_start(
cbWLAN_CommonApParameters params; cbWLAN_CommonApParameters params;
cbWLAN_WPAPSKApParameters wpa_params; cbWLAN_WPAPSKApParameters wpa_params;
static cbWLAN_Handle handle = cbWLAN_DEFAULT_HANDLE;
char temp_passphrase[cbWLAN_MAX_PASSPHRASE_LENGTH]; char temp_passphrase[cbWLAN_MAX_PASSPHRASE_LENGTH];
memset(&params, 0, sizeof(cbWLAN_CommonApParameters)); memset(&params, 0, sizeof(cbWLAN_CommonApParameters));
@ -1793,7 +1795,7 @@ nsapi_error_t OdinWiFiInterface::wlan_ap_start(
error_code = NSAPI_ERROR_UNSUPPORTED; error_code = NSAPI_ERROR_UNSUPPORTED;
} }
} }
_ap.handle = handle;
return error_code; 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) void OdinWiFiInterface::wlan_status_indication(cbWLAN_StatusIndicationInfo status, void *data)
{ {
struct odin_wifi_msg_s* msg = _msg_pool->alloc(); if (!flush_drvr_ind_pkts) {
MBED_ASSERT(msg != NULL); struct odin_wifi_msg_s* msg = _msg_pool->alloc();
MBED_ASSERT(msg != NULL);
msg->type = status; msg->type = status;
memcpy(&(msg->data), data, sizeof(odin_wifi_msg_s::data_t)); memcpy(&(msg->data), data, sizeof(odin_wifi_msg_s::data_t));
osStatus ok = _in_queue.put(msg, 0); osStatus ok = _in_queue.put(msg, 0);
MBED_ASSERT(ok == osOK); MBED_ASSERT(ok == osOK);
}
} }
static nsapi_security_t convertToNSAPI_security(cbWLAN_AuthenticationSuite authSuit) static nsapi_security_t convertToNSAPI_security(cbWLAN_AuthenticationSuite authSuit)

View File

@ -65,9 +65,9 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
public: public:
/** OdinWiFiInterface lifetime /** 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(); ~OdinWiFiInterface();
@ -340,6 +340,8 @@ private:
nsapi_error_t error_code; nsapi_error_t error_code;
uint16_t beacon_interval; uint16_t beacon_interval;
cbWLAN_Handle handle;
}; };
struct scan_cache_s { struct scan_cache_s {
@ -348,7 +350,6 @@ private:
cbWLAN_MACAddress bssid[ODIN_WIFI_SCAN_CACHE_SIZE]; cbWLAN_MACAddress bssid[ODIN_WIFI_SCAN_CACHE_SIZE];
}; };
cbWLAN_Handle handle = cbWLAN_INVALID_HANDLE;
OdinWifiState entry_connect_fail_wait_disconnect(); OdinWifiState entry_connect_fail_wait_disconnect();
OdinWifiState entry_wait_connect(); OdinWifiState entry_wait_connect();
OdinWifiState entry_wait_disconnect(); OdinWifiState entry_wait_disconnect();
@ -442,6 +443,11 @@ private:
bool _debug; bool _debug;
int _dbg_timeout; 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 #endif