Skip to content

Ublox Odin Driver OS 5 v3.7.1 rc3: Network-WiFi Test Crash Fixes #11983

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
{
Expand Down Expand Up @@ -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)
Expand All @@ -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 {
Expand Down Expand Up @@ -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();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,13 @@ class OdinWiFiEMAC : public EMAC {
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;
Expand All @@ -138,7 +143,7 @@ class OdinWiFiEMAC : public EMAC {

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_ */
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand All @@ -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;

Expand Down Expand Up @@ -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();
}
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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");
Expand All @@ -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;
Expand Down Expand Up @@ -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>();

Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -1793,7 +1795,7 @@ nsapi_error_t OdinWiFiInterface::wlan_ap_start(
error_code = NSAPI_ERROR_UNSUPPORTED;
}
}

_ap.handle = handle;
return error_code;
}

Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -340,6 +340,8 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface

nsapi_error_t error_code;
uint16_t beacon_interval;

cbWLAN_Handle handle;
};

struct scan_cache_s {
Expand All @@ -348,7 +350,6 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface
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();
Expand Down Expand Up @@ -442,6 +443,11 @@ class OdinWiFiInterface : public WiFiInterface, public EMACInterface

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
Expand Down