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);
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();
}

View File

@ -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_ */

View File

@ -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<odin_wifi_msg_s, 11>();
@ -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(&params, 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)

View File

@ -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