diff --git a/examples/platform/efr32/wf200/host_if.cpp b/examples/platform/efr32/wf200/host_if.cpp index d6f90419613f22..60b914c6597171 100644 --- a/examples/platform/efr32/wf200/host_if.cpp +++ b/examples/platform/efr32/wf200/host_if.cpp @@ -60,6 +60,7 @@ EventGroupHandle_t sl_wfx_event_group; TaskHandle_t wfx_events_task_handle; static sl_wfx_mac_address_t ap_mac; static uint32_t sta_ip; +static wfx_wifi_scan_result_t ap_info; // Set Scan Parameters #define ACTIVE_CHANNEL_TIME 110 @@ -88,6 +89,9 @@ uint8_t softap_channel = SOFTAP_CHANNEL_DEFAULT; /* station network interface structures */ struct netif * sta_netif; wfx_wifi_provision_t wifi_provision; +sl_wfx_get_counters_cnf_t * counters; +sl_wfx_get_counters_cnf_t * Tempcounters; +#define PUT_COUNTER(name) EFR32_LOG("%-24s %lu\r\n", #name, (unsigned long) counters->body.count_##name); bool hasNotifiedIPV6 = false; bool hasNotifiedIPV4 = false; @@ -111,7 +115,7 @@ static void sl_wfx_scan_complete_callback(uint32_t status); static void wfx_events_task(void * p_arg); /* WF200 host callbacks */ -static void sl_wfx_connect_callback(uint8_t * mac, uint32_t status); +static void sl_wfx_connect_callback(sl_wfx_connect_ind_body_t connect_indication_body); static void sl_wfx_disconnect_callback(uint8_t * mac, uint16_t reason); static void sl_wfx_generic_status_callback(sl_wfx_generic_ind_t * frame); @@ -123,12 +127,11 @@ static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t * ma static void sl_wfx_ap_client_rejected_callback(uint32_t status, uint8_t * mac); #endif +extern uint32_t gOverrunCount; + /*************************************************************************** - * @fn static void wfx_events_task_start() * @brief * Creates WFX events processing task. - * @param[in] None - * @return None ******************************************************************************/ static void wfx_events_task_start() { @@ -144,7 +147,6 @@ static void wfx_events_task_start() } /**************************************************************************** - * @fn sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t *event_payload) * @brief * Called when the driver needs to post an event * @param[in] event_payload: @@ -163,7 +165,7 @@ sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t * event_payload) } case SL_WFX_CONNECT_IND_ID: { sl_wfx_connect_ind_t * connect_indication = (sl_wfx_connect_ind_t *) event_payload; - sl_wfx_connect_callback(connect_indication->body.mac, connect_indication->body.status); + sl_wfx_connect_callback(connect_indication->body); break; } case SL_WFX_DISCONNECT_IND_ID: { @@ -272,11 +274,9 @@ sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t * event_payload) #ifdef SL_WFX_CONFIG_SCAN /**************************************************************************** - * @fn static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t *scan_result) * @brief * Callback for individual scan result - * @param[in] scan_result: - * @return None + * @param[in] scan_result: Scan result of all SSID's *****************************************************************************/ static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_result) { @@ -334,11 +334,9 @@ static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_res } /**************************************************************************** - * @fn static void sl_wfx_scan_complete_callback(uint32_t status) * @brief * Callback for scan complete - * @param[in] status: - * @return None + * @param[in] status:Status of WLAN scan api *****************************************************************************/ /* ARGSUSED */ static void sl_wfx_scan_complete_callback(uint32_t status) @@ -350,16 +348,15 @@ static void sl_wfx_scan_complete_callback(uint32_t status) #endif /* SL_WFX_CONFIG_SCAN */ /**************************************************************************** - * @fn static void sl_wfx_connect_callback(uint8_t *mac, uint32_t status) * @brief * Callback when station connects - * @param[in] mac: - * @param[in] status: - * @return None + * @param[in] mac: MAC address of device + * @param[in] status: Status of connect call *****************************************************************************/ -static void sl_wfx_connect_callback(uint8_t * mac, uint32_t status) +static void sl_wfx_connect_callback(sl_wfx_connect_ind_body_t connect_indication_body) { - (void) (mac); + uint8_t * mac = connect_indication_body.mac; + uint32_t status = connect_indication_body.status; switch (status) { case WFM_STATUS_SUCCESS: { @@ -407,12 +404,10 @@ static void sl_wfx_connect_callback(uint8_t * mac, uint32_t status) } /**************************************************************************** - * @fn static void sl_wfx_disconnect_callback(uint8_t *mac, uint16_t reason) * @brief * Callback for station disconnect - * @param[in] mac: - * @param[in] reason: - * @return None + * @param[in] mac: MAC address of device + * @param[in] reason: Reason code of disconnection *****************************************************************************/ static void sl_wfx_disconnect_callback(uint8_t * mac, uint16_t reason) { @@ -425,11 +420,9 @@ static void sl_wfx_disconnect_callback(uint8_t * mac, uint16_t reason) #ifdef SL_WFX_CONFIG_SOFTAP /**************************************************************************** - * @fn static void sl_wfx_start_ap_callback(uint32_t status) * @brief * Callback for AP started - * @param[in] status: - * @return None + * @param[in] status: Status of wfx start ap api *****************************************************************************/ static void sl_wfx_start_ap_callback(uint32_t status) { @@ -448,11 +441,8 @@ static void sl_wfx_start_ap_callback(uint32_t status) } /**************************************************************************** - * @fn static void sl_wfx_stop_ap_callback(void) * @brief * Callback for AP stopped - * @param[in] None - * @return None *****************************************************************************/ static void sl_wfx_stop_ap_callback(void) { @@ -465,11 +455,9 @@ static void sl_wfx_stop_ap_callback(void) } /**************************************************************************** - * @fn static void sl_wfx_client_connected_callback(uint8_t *mac) * @brief * Callback for client connect to AP - * @param[in] mac: - * @return None + * @param[in] mac: MAC adress of device *****************************************************************************/ static void sl_wfx_client_connected_callback(uint8_t * mac) { @@ -479,747 +467,804 @@ static void sl_wfx_client_connected_callback(uint8_t * mac) } /**************************************************************************** - * @fn static void sl_wfx_ap_client_rejected_callback(uint32_t status, uint8_t *mac) * @brief * Callback for client rejected from AP - * @param[in] status: - * @param[in] mac: - * @return None + * @param[in] status: Status of ap rejected + * @param[in] mac: MAC adress of device *****************************************************************************/ static void sl_wfx_ap_client_rejected_callback(uint32_t status, uint8_t * mac) { - { - // TODO - EFR32_LOG("Client rejected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); - } + EFR32_LOG("Client rejected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2], mac[3], + mac[4], mac[5]); +} - /**************************************************************************** - * @fn static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t *mac) - * @brief - * Callback for AP client disconnect - * @param[in] status: - * @param[in] mac: - * @return None - *****************************************************************************/ - static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t * mac) - { - // TODO - EFR32_LOG("Client disconnected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); - } +/**************************************************************************** + * @brief + * Callback for AP client disconnect + * @param[in] status: Status of ap dissconnect + * @param[in] mac: + *****************************************************************************/ +static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t * mac) +{ + // TODO + EFR32_LOG("Client disconnected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); +} #endif /* SL_WFX_CONFIG_SOFTAP */ - /**************************************************************************** - * @fn static void sl_wfx_generic_status_callback(sl_wfx_generic_ind_t *frame) - * @brief - * Callback for generic status received - * @param[in] farme: - * @return None - *****************************************************************************/ - static void sl_wfx_generic_status_callback(sl_wfx_generic_ind_t * frame) - { - (void) (frame); - EFR32_LOG("WFX Generic status received\r\n"); - } +/**************************************************************************** + * @brief + * Callback for generic status received + * @param[in] farme: + *****************************************************************************/ +static void sl_wfx_generic_status_callback(sl_wfx_generic_ind_t * frame) +{ + (void) (frame); + EFR32_LOG("WFX Generic status received\r\n"); +} - /*************************************************************************** - * @fn static void wfx_events_task(void *p_arg) - * @brief - * WFX events processing task. - * @param[in] p_arg: - * @return None - ******************************************************************************/ - static void wfx_events_task(void * p_arg) - { - TickType_t last_dhcp_poll, now; - EventBits_t flags; - (void) p_arg; +/*************************************************************************** + * @brief + * WFX events processing task. + * @param[in] p_arg: + * ******************************************************************************/ +static void wfx_events_task(void * p_arg) +{ + TickType_t last_dhcp_poll, now; + EventBits_t flags; + (void) p_arg; - sta_netif = wfx_get_netif(SL_WFX_STA_INTERFACE); - last_dhcp_poll = xTaskGetTickCount(); - while (true) - { - flags = xEventGroupWaitBits(sl_wfx_event_group, - SL_WFX_CONNECT | SL_WFX_DISCONNECT + sta_netif = wfx_get_netif(SL_WFX_STA_INTERFACE); + last_dhcp_poll = xTaskGetTickCount(); + while (true) + { + flags = xEventGroupWaitBits(sl_wfx_event_group, + SL_WFX_CONNECT | SL_WFX_DISCONNECT #ifdef SL_WFX_CONFIG_SOFTAP - | SL_WFX_START_AP | SL_WFX_STOP_AP + | SL_WFX_START_AP | SL_WFX_STOP_AP #endif /* SL_WFX_CONFIG_SOFTAP */ #ifdef SL_WFX_CONFIG_SCAN - | SL_WFX_SCAN_START | SL_WFX_SCAN_COMPLETE + | SL_WFX_SCAN_START | SL_WFX_SCAN_COMPLETE #endif /* SL_WFX_CONFIG_SCAN */ - | BITS_TO_WAIT, - pdTRUE, pdFALSE, pdMS_TO_TICKS(250)); /* 250 msec delay converted to ticks */ - if (flags & SL_WFX_RETRY_CONNECT) + | BITS_TO_WAIT, + pdTRUE, pdFALSE, pdMS_TO_TICKS(250)); /* 250 msec delay converted to ticks */ + if (flags & SL_WFX_RETRY_CONNECT) + { + if (!retryInProgress) { - if (!retryInProgress) - { - EFR32_LOG("WFX sending the connect command"); - wfx_connect_to_ap(); - retryInProgress = true; - } + EFR32_LOG("WFX sending the connect command"); + wfx_connect_to_ap(); + retryInProgress = true; } + } - if (wifi_extra & WE_ST_STA_CONN) + if (wifi_extra & WE_ST_STA_CONN) + { + if ((now = xTaskGetTickCount()) > (last_dhcp_poll + pdMS_TO_TICKS(250))) { - if ((now = xTaskGetTickCount()) > (last_dhcp_poll + pdMS_TO_TICKS(250))) - { #if (CHIP_DEVICE_CONFIG_ENABLE_IPV4) - uint8_t dhcp_state = dhcpclient_poll(sta_netif); + uint8_t dhcp_state = dhcpclient_poll(&sta_netif); - if ((dhcp_state == DHCP_ADDRESS_ASSIGNED) && !hasNotifiedIPV4) - { - wfx_dhcp_got_ipv4((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr); - hasNotifiedIPV4 = true; - if (!hasNotifiedWifiConnectivity) - { - EFR32_LOG("WIFI: Has Notified Wifi Connectivity"); - wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &ap_mac); - hasNotifiedWifiConnectivity = true; - } - } - else if (dhcp_state == DHCP_OFF) + if ((dhcp_state == DHCP_ADDRESS_ASSIGNED) && !hasNotifiedIPV4) + { + wfx_dhcp_got_ipv4((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr); + hasNotifiedIPV4 = true; + if (!hasNotifiedWifiConnectivity) { - wfx_ip_changed_notify(IP_STATUS_FAIL); - hasNotifiedIPV4 = false; + EFR32_LOG("WIFI: Has Notified Wifi Connectivity"); + wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &ap_mac); + hasNotifiedWifiConnectivity = true; } + } + else if (dhcp_state == DHCP_OFF) + { + wfx_ip_changed_notify(IP_STATUS_FAIL); + hasNotifiedIPV4 = false; + } #endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4 - if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !hasNotifiedIPV6) + if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !hasNotifiedIPV6) + { + wfx_ipv6_notify(1); + hasNotifiedIPV6 = true; + if (!hasNotifiedWifiConnectivity) { - wfx_ipv6_notify(GET_IPV6_SUCCESS); - hasNotifiedIPV6 = true; - if (!hasNotifiedWifiConnectivity) - { - wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &ap_mac); - hasNotifiedWifiConnectivity = true; - } + wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &ap_mac); + hasNotifiedWifiConnectivity = true; } - last_dhcp_poll = now; } + last_dhcp_poll = now; } + } - if (flags & SL_WFX_CONNECT) - { + if (flags & SL_WFX_CONNECT) + { #if (CHIP_DEVICE_CONFIG_ENABLE_IPV4) - wfx_ip_changed_notify(IP_STATUS_FAIL); - hasNotifiedIPV4 = false; + wfx_ip_changed_notify(IP_STATUS_FAIL); + hasNotifiedIPV4 = false; #endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4 - wfx_ipv6_notify(GET_IPV6_FAIL); - hasNotifiedIPV6 = false; - hasNotifiedWifiConnectivity = false; - EFR32_LOG("WIFI: Connected to AP"); - wifi_extra |= WE_ST_STA_CONN; - wfx_lwip_set_sta_link_up(); + wfx_ipv6_notify(GET_IPV6_FAIL); + hasNotifiedIPV6 = false; + hasNotifiedWifiConnectivity = false; + EFR32_LOG("WIFI: Connected to AP"); + wifi_extra |= WE_ST_STA_CONN; + wfx_lwip_set_sta_link_up(); #ifdef SLEEP_ENABLED - if (!(wfx_get_wifi_state() & SL_WFX_AP_INTERFACE_UP)) - { - // Enable the power save - sl_wfx_set_power_mode(WFM_PM_MODE_PS, WFM_PM_POLL_UAPSD, BEACON_1); - sl_wfx_enable_device_power_save(); - } -#endif // SLEEP_ENABLED + if (!(wfx_get_wifi_state() & SL_WFX_AP_INTERFACE_UP)) + { + // Enable the power save + sl_wfx_set_power_mode(WFM_PM_MODE_PS, WFM_PM_POLL_UAPSD, BEACON_1); + sl_wfx_enable_device_power_save(); } +#endif // SLEEP_ENABLED + } - if (flags & SL_WFX_DISCONNECT) - { + if (flags & SL_WFX_DISCONNECT) + { #if (CHIP_DEVICE_CONFIG_ENABLE_IPV4) - wfx_ip_changed_notify(IP_STATUS_FAIL); - hasNotifiedIPV4 = false; + wfx_ip_changed_notify(IP_STATUS_FAIL); + hasNotifiedIPV4 = false; #endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4 - wfx_ipv6_notify(GET_IPV6_FAIL); - hasNotifiedIPV6 = false; - hasNotifiedWifiConnectivity = false; - wifi_extra &= ~WE_ST_STA_CONN; - wfx_lwip_set_sta_link_down(); - } + wfx_ipv6_notify(GET_IPV6_FAIL); + hasNotifiedIPV6 = false; + hasNotifiedWifiConnectivity = false; + wifi_extra &= ~WE_ST_STA_CONN; + wfx_lwip_set_sta_link_down(); + } #ifdef SL_WFX_CONFIG_SCAN - if (flags & SL_WFX_SCAN_START) + if (flags & SL_WFX_SCAN_START) + { + /* + * Start the Scan + */ + sl_wfx_ssid_def_t ssid, *sp; + uint16_t num_ssid, slen; + if (scan_ssid) { - /* - * Start the Scan - */ - sl_wfx_ssid_def_t ssid, *sp; - uint16_t num_ssid, slen; - if (scan_ssid) - { - memset(&ssid, 0, sizeof(ssid)); - slen = strlen(scan_ssid); - memcpy(&ssid.ssid[0], scan_ssid, slen); - ssid.ssid_length = slen; - num_ssid = 1; - sp = &ssid; - } - else - { - num_ssid = 0; - sp = (sl_wfx_ssid_def_t *) 0; - } - - EFR32_LOG("WIFI Scan Paramter set to Active channel time %d, Passive " - "Channel Time: %d, Number of prob: %d", - ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); - (void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); - (void) sl_wfx_send_scan_command(WFM_SCAN_MODE_ACTIVE, CHANNEL_LIST, /* Channel list */ - CHANNEL_COUNT, /* Scan all chans */ - sp, num_ssid, IE_DATA, /* IE we're looking for */ - IE_DATA_LENGTH, BSSID_SCAN); + memset(&ssid, 0, sizeof(ssid)); + slen = strlen(scan_ssid); + memcpy(&ssid.ssid[0], scan_ssid, slen); + ssid.ssid_length = slen; + num_ssid = 1; + sp = &ssid; } - if (flags & SL_WFX_SCAN_COMPLETE) + else { - struct scan_result_holder *hp, *next; + num_ssid = 0; + sp = (sl_wfx_ssid_def_t *) 0; + } - EFR32_LOG("WIFI: Return %d scan results", scan_count); - for (hp = scan_save; hp; hp = next) - { - next = hp->next; - (*scan_cb)(&hp->scan); - vPortFree(hp); - } - (*scan_cb)((wfx_wifi_scan_result *) 0); - scan_save = (struct scan_result_holder *) 0; - scan_count = 0; - if (scan_ssid) - { - vPortFree(scan_ssid); - scan_ssid = (char *) 0; - } - /* Terminate scan */ - scan_cb = 0; + EFR32_LOG("WIFI Scan Paramter set to Active channel time %d, Passive " + "Channel Time: %d, Number of prob: %d", + ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); + (void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); + (void) sl_wfx_send_scan_command(WFM_SCAN_MODE_ACTIVE, CHANNEL_LIST, /* Channel list */ + CHANNEL_COUNT, /* Scan all chans */ + sp, num_ssid, IE_DATA, /* IE we're looking for */ + IE_DATA_LENGTH, BSSID_SCAN); + } + if (flags & SL_WFX_SCAN_COMPLETE) + { + struct scan_result_holder *hp, *next; + + EFR32_LOG("WIFI: Return %d scan results", scan_count); + for (hp = scan_save; hp; hp = next) + { + next = hp->next; + (*scan_cb)(&hp->scan); + vPortFree(hp); } -#endif /* SL_WFX_CONFIG_SCAN */ + (*scan_cb)((wfx_wifi_scan_result *) 0); + scan_save = (struct scan_result_holder *) 0; + scan_count = 0; + if (scan_ssid) + { + vPortFree(scan_ssid); + scan_ssid = (char *) 0; + } + /* Terminate scan */ + scan_cb = 0; } +#endif /* SL_WFX_CONFIG_SCAN */ } +} - /**************************************************************************** - * @fn static sl_status_t wfx_init(void) - * @brief - * Initialize the WF200 used by the two interfaces - * @param[in] None - * @return None - *****************************************************************************/ - static sl_status_t wfx_init(void) +/**************************************************************************** + * @brief + * Initialize the WF200 used by the two interfaces + *****************************************************************************/ +static sl_status_t wfx_init(void) +{ + /* Initialize the WF200 used by the two interfaces */ + wfx_events_task_start(); + sl_status_t status = sl_wfx_init(&wifiContext); + EFR32_LOG("FMAC Driver version %s", FMAC_DRIVER_VERSION_STRING); + switch (status) { - /* Initialize the WF200 used by the two interfaces */ - wfx_events_task_start(); - sl_status_t status = sl_wfx_init(&wifiContext); - EFR32_LOG("FMAC Driver version %s", FMAC_DRIVER_VERSION_STRING); - switch (status) + case SL_STATUS_OK: + EFR32_LOG("WF200 FW ver:%d.%d.%d [MAC %02x:%02x:%02x-%02x:%02x:%02x]", wifiContext.firmware_major, + wifiContext.firmware_minor, wifiContext.firmware_build, wifiContext.mac_addr_0.octet[0], + wifiContext.mac_addr_0.octet[1], wifiContext.mac_addr_0.octet[2], wifiContext.mac_addr_0.octet[3], + wifiContext.mac_addr_0.octet[4], wifiContext.mac_addr_0.octet[5]); + EFR32_LOG("WF200 Init OK"); + + if (wifiContext.state == SL_WFX_STA_INTERFACE_CONNECTED) { - case SL_STATUS_OK: - EFR32_LOG("WF200 FW ver:%d.%d.%d [MAC %02x:%02x:%02x-%02x:%02x:%02x]", wifiContext.firmware_major, - wifiContext.firmware_minor, wifiContext.firmware_build, wifiContext.mac_addr_0.octet[0], - wifiContext.mac_addr_0.octet[1], wifiContext.mac_addr_0.octet[2], wifiContext.mac_addr_0.octet[3], - wifiContext.mac_addr_0.octet[4], wifiContext.mac_addr_0.octet[5]); - EFR32_LOG("WF200 Init OK"); - - if (wifiContext.state == SL_WFX_STA_INTERFACE_CONNECTED) - { - sl_wfx_send_disconnect_command(); - } - - break; - case SL_STATUS_WIFI_INVALID_KEY: - EFR32_LOG("*ERR*WF200: F/W keyset invalid"); - break; - case SL_STATUS_WIFI_FIRMWARE_DOWNLOAD_TIMEOUT: - EFR32_LOG("*ERR*WF200: F/W download timo"); - break; - case SL_STATUS_TIMEOUT: - EFR32_LOG("*ERR*WF200: Poll for value timo"); - break; - case SL_STATUS_FAIL: - EFR32_LOG("*ERR*WF200: Error"); - break; - default: - EFR32_LOG("*ERR*WF200: Unknown"); + sl_wfx_send_disconnect_command(); } - return status; + break; + case SL_STATUS_WIFI_INVALID_KEY: + EFR32_LOG("*ERR*WF200: F/W keyset invalid"); + break; + case SL_STATUS_WIFI_FIRMWARE_DOWNLOAD_TIMEOUT: + EFR32_LOG("*ERR*WF200: F/W download timo"); + break; + case SL_STATUS_TIMEOUT: + EFR32_LOG("*ERR*WF200: Poll for value timo"); + break; + case SL_STATUS_FAIL: + EFR32_LOG("*ERR*WF200: Error"); + break; + default: + EFR32_LOG("*ERR*WF200: Unknown"); } - /***************************************************************************** - * @fn static void wfx_wifi_hw_start(void) - * @brief - * tcp ip, wfx and lwip stack and start dhcp client. - * - * @param[in] - * not used - * - * @return - * sl_status_t Shows init succes or error. - ******************************************************************************/ - static void wfx_wifi_hw_start(void) - { - sl_status_t status; + return status; +} - if (wifi_extra & WE_ST_HW_STARTED) - return; - EFR32_LOG("STARTING WF200\n"); - wifi_extra |= WE_ST_HW_STARTED; +/***************************************************************************** + * @brief + * tcp ip, wfx and lwip stack and start dhcp client. + * @return + * sl_status_t Shows init succes or error. + ******************************************************************************/ +static void wfx_wifi_hw_start(void) +{ + sl_status_t status; - sl_wfx_host_gpio_init(); - if ((status = wfx_init()) == SL_STATUS_OK) - { - /* Initialize the LwIP stack */ - EFR32_LOG("WF200:Start LWIP"); - wfx_lwip_start(); - wifiContext.state = SL_WFX_STARTED; /* Really this is a bit mask */ - EFR32_LOG("WF200:ready.."); - } - else - { - EFR32_LOG("*ERR*WF200:init failed"); - } + if (wifi_extra & WE_ST_HW_STARTED) + return; + EFR32_LOG("STARTING WF200\n"); + wifi_extra |= WE_ST_HW_STARTED; + + sl_wfx_host_gpio_init(); + if ((status = wfx_init()) == SL_STATUS_OK) + { + /* Initialize the LwIP stack */ + EFR32_LOG("WF200:Start LWIP"); + wfx_lwip_start(); + wifiContext.state = SL_WFX_STARTED; /* Really this is a bit mask */ + EFR32_LOG("WF200:ready.."); } + else + { + EFR32_LOG("*ERR*WF200:init failed"); + } +} - /************************************************************************ - * @fn int32_t wfx_get_ap_info(wfx_wifi_scan_result_t *ap) - * @brief - * Get AP info - * @param[in] ap: access point - * @return returns -1 - **************************************************************************/ - int32_t wfx_get_ap_info(wfx_wifi_scan_result_t * ap) +/*********************************************************************** + * @brief + * Get AP info + * @param[in] ap: access point information + * @return returns -1 + **************************************************************************/ +int32_t wfx_get_ap_info(wfx_wifi_scan_result_t * ap) +{ + int32_t signal_strength; + EFR32_LOG("WIFI:SSID:: %s", &ap_info.ssid[0]); + memcpy(ap->ssid, ap_info.ssid, sizeof(ap_info.ssid)); + EFR32_LOG("WIFI:Mac addr:: %02x:%02x:%02x:%02x:%02x:%02x", ap_info.bssid[0], ap_info.bssid[1], ap_info.bssid[2], + ap_info.bssid[3], ap_info.bssid[4], ap_info.bssid[5]); + memcpy(ap->bssid, ap_info.bssid, sizeof(ap_info.bssid)); + ap->security = ap_info.security; + EFR32_LOG("WIFI:security:: %d", ap->security); + ap->chan = ap_info.chan; + EFR32_LOG("WIFI:Channel:: to %d", ap->chan); + + sl_status_t status = sl_wfx_get_signal_strength((uint32_t *) &signal_strength); + + if (status == SL_STATUS_OK) { - /* TODO */ - return -1; + EFR32_LOG("status SL_STATUS_OK & signal_strength:: %d", signal_strength); + ap->rssi = (signal_strength - 220) / 2; } + return status; +} - /************************************************************************ - * @fn int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t *extra_info) - * @brief - * Get AP extra info - * @param[in] extra_info: access point extra information - * @return returns -1 - **************************************************************************/ - int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t * extra_info) +/************************************************************************ + * @brief + * Get AP extra info + * @param[in] extra_info: access point extra information + * @return returns -1 + **************************************************************************/ +int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t * extra_info) +{ + int32_t status; + status = get_all_counters(); + if (status != SL_STATUS_OK) { - /* TODO */ - return -1; + EFR32_LOG("Failed to get the couters"); } + else + { + extra_info->beacon_lost_count = counters->body.count_miss_beacon; + extra_info->beacon_rx_count = counters->body.count_rx_beacon; + extra_info->mcast_rx_count = counters->body.count_rx_multicast_frames; + extra_info->mcast_tx_count = counters->body.count_tx_multicast_frames; + extra_info->ucast_rx_count = counters->body.count_rx_packets; + extra_info->ucast_tx_count = counters->body.count_tx_packets; + extra_info->overrun_count = gOverrunCount; + } + return status; +} + +sl_status_t get_all_counters(void) +{ + sl_status_t result; + uint8_t command_id = 0x05; + uint16_t mib_id = 0x2035; + sl_wfx_mib_req_t * request = NULL; + uint32_t request_length = SL_WFX_ROUND_UP_EVEN(sizeof(sl_wfx_header_mib_t) + sizeof(sl_wfx_mib_req_body_t)); + + result = + sl_wfx_allocate_command_buffer((sl_wfx_generic_message_t **) &request, command_id, SL_WFX_CONTROL_BUFFER, request_length); - /************************************************************************ - * @fn int32_t wfx_reset_counts() - * @brief - * reset the count - * @param[in] None - * @return returns -1 - **************************************************************************/ - int32_t wfx_reset_counts() + if (request == NULL) { - /* TODO */ - return -1; } - /************************************************************************* - * @fn sl_status_t wfx_wifi_start(void) - * @brief - * I think that this is getting called before FreeRTOS threads are ready - * @param[in] none - * @return returns SL_STATUS_OK - **************************************************************************/ - sl_status_t wfx_wifi_start(void) + request->body.mib_id = mib_id; + request->header.interface = 0x2; + request->header.encrypted = 0x0; + + result = sl_wfx_send_request(command_id, (sl_wfx_generic_message_t *) request, request_length); + SL_WFX_ERROR_CHECK(result); + + result = sl_wfx_host_wait_for_confirmation(command_id, SL_WFX_DEFAULT_REQUEST_TIMEOUT_MS, (void **) &counters); + SL_WFX_ERROR_CHECK(result); + + EFR32_LOG("%-24s %12s \r\n", "", "Debug Counters Content"); + EFR32_LOG("%-24s %lu\r\n", "rcpi", (unsigned long) counters->body.rcpi); + PUT_COUNTER(plcp_errors); + PUT_COUNTER(fcs_errors); + PUT_COUNTER(tx_packets); + PUT_COUNTER(rx_packets); + PUT_COUNTER(rx_packet_errors); + PUT_COUNTER(rx_decryption_failures); + PUT_COUNTER(rx_mic_failures); + PUT_COUNTER(rx_no_key_failures); + PUT_COUNTER(tx_multicast_frames); + PUT_COUNTER(tx_frames_success); + PUT_COUNTER(tx_frame_failures); + PUT_COUNTER(tx_frames_retried); + PUT_COUNTER(tx_frames_multi_retried); + PUT_COUNTER(rx_frame_duplicates); + PUT_COUNTER(rts_success); + PUT_COUNTER(rts_failures); + PUT_COUNTER(ack_failures); + PUT_COUNTER(rx_multicast_frames); + PUT_COUNTER(rx_frames_success); + PUT_COUNTER(rx_cmacicv_errors); + PUT_COUNTER(rx_cmac_replays); + PUT_COUNTER(rx_mgmt_ccmp_replays); + PUT_COUNTER(rx_bipmic_errors); + PUT_COUNTER(rx_beacon); + PUT_COUNTER(miss_beacon); + +error_handler: + + if (result == SL_STATUS_TIMEOUT) { - if (wifi_extra & WE_ST_STARTED) + if (sl_wfx_context->used_buffers > 0) { - EFR32_LOG("WIFI: Already started"); - return SL_STATUS_OK; + sl_wfx_context->used_buffers--; } - wifi_extra |= WE_ST_STARTED; - wfx_soft_init(); - wfx_wifi_hw_start(); + } + if (request != NULL) + { + sl_wfx_free_command_buffer((sl_wfx_generic_message_t *) request, command_id, SL_WFX_CONTROL_BUFFER); + } + return result; +} + +/************************************************************************ + * @brief + * reset the count + * @return returns -1 + **************************************************************************/ +int32_t wfx_reset_counts() +{ + /* TODO */ + return -1; +} + +/************************************************************************* + * @brief + * I think that this is getting called before FreeRTOS threads are ready + * @return returns SL_STATUS_OK + **************************************************************************/ +sl_status_t wfx_wifi_start(void) +{ + if (wifi_extra & WE_ST_STARTED) + { + EFR32_LOG("WIFI: Already started"); return SL_STATUS_OK; } + wifi_extra |= WE_ST_STARTED; + wfx_soft_init(); + wfx_wifi_hw_start(); + + return SL_STATUS_OK; +} + +/**************************************************************************** + * @brief + * get the wifi state + * @return returns wificonetext state + *****************************************************************************/ +sl_wfx_state_t wfx_get_wifi_state(void) +{ + return wifiContext.state; +} - /**************************************************************************** - * @fn sl_wfx_state_t wfx_get_wifi_state(void) - * @brief - * get the wifi state - * @param[in] None - * @return returns wificonetext state - *****************************************************************************/ - sl_wfx_state_t wfx_get_wifi_state(void) { return wifiContext.state; } - - /**************************************************************************** - * @fn struct netif *wfx_GetNetif(sl_wfx_interface_t interface) - * @brief - * getnetif using interface - * @param[in] interface: - * @return returns selectedNetif - *****************************************************************************/ - struct netif * wfx_GetNetif(sl_wfx_interface_t interface) +/**************************************************************************** + * @brief + * getnetif using interface + * @param[in] interface: + * @return returns selectedNetif + *****************************************************************************/ +struct netif * wfx_GetNetif(sl_wfx_interface_t interface) +{ + struct netif * SelectedNetif = NULL; + if (interface == SL_WFX_STA_INTERFACE) { - struct netif * SelectedNetif = NULL; - if (interface == SL_WFX_STA_INTERFACE) - { - SelectedNetif = sta_netif; - } + SelectedNetif = sta_netif; + } #ifdef SL_WFX_CONFIG_SOFTAP - else if (interface == SL_WFX_SOFTAP_INTERFACE) - { - // no ap currently - } -#endif - return SelectedNetif; + else if (interface == SL_WFX_SOFTAP_INTERFACE) + { + // no ap currently } +#endif + return SelectedNetif; +} + +/**************************************************************************** + * @brief + * get the wifi mac address using interface + * @param[in] interface: + * @return returns wificontext.mac_addr_o if successful, + * wificontext.mac_addr_1 otherwise + *****************************************************************************/ +sl_wfx_mac_address_t wfx_get_wifi_mac_addr(sl_wfx_interface_t interface) +{ + // return Mac address used by WFX SL_WFX_STA_INTERFACE or SL_WFX_SOFTAP_INTERFACE, + return (interface == SL_WFX_STA_INTERFACE) ? wifiContext.mac_addr_0 : wifiContext.mac_addr_1; +} - /**************************************************************************** - * @fn sl_wfx_mac_address_t wfx_get_wifi_mac_addr(sl_wfx_interface_t interface) - * @brief - * get the wifi mac address using interface - * @param[in] interface: - * @return returns wificontext.mac_addr_o if successful, - * wificontext.mac_addr_1 otherwise - *****************************************************************************/ - sl_wfx_mac_address_t wfx_get_wifi_mac_addr(sl_wfx_interface_t interface) +/**************************************************************************** + * @brief + * set the wifi provision + * @param[in] wifiConfig: configuration of wifi + *****************************************************************************/ +void wfx_set_wifi_provision(wfx_wifi_provision_t * wifiConfig) +{ + memcpy(wifi_provision.ssid, wifiConfig->ssid, sizeof(wifiConfig->ssid)); + memcpy(wifi_provision.passkey, wifiConfig->passkey, sizeof(wifiConfig->passkey)); + EFR32_LOG("WIFI: Provision SSID=%s", &wifi_provision.ssid[0]); + + /* Not very good - To be improved */ + switch (wifiConfig->security) { - // return Mac address used by WFX SL_WFX_STA_INTERFACE or SL_WFX_SOFTAP_INTERFACE, - return (interface == SL_WFX_STA_INTERFACE) ? wifiContext.mac_addr_0 : wifiContext.mac_addr_1; + case WFX_SEC_WPA: + wifi_provision.security = static_cast(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK); + break; + case WFX_SEC_WPA3: + wifi_provision.security = WFM_SECURITY_MODE_WPA3_SAE; + break; + case WFX_SEC_WPA2: + wifi_provision.security = static_cast(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK); + break; + case WFX_SEC_WPA_WPA2_MIXED: + wifi_provision.security = static_cast(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK); + break; + default: + wifi_provision.security = WFM_SECURITY_MODE_WPA2_PSK; + break; } +} - /**************************************************************************** - * @fn void wfx_set_wifi_provision(wfx_wifi_provision_t *wifiConfig) - * @brief - * set the wifi provision - * @param[in] wifiConfig: configuration of wifi - * @return None - *****************************************************************************/ - void wfx_set_wifi_provision(wfx_wifi_provision_t * wifiConfig) +/**************************************************************************** + * @brief + * get the wifi provision + * @param[in] wifiConfig: configuration of wifi + * @return returns true if successful, + * false otherwise + *****************************************************************************/ +bool wfx_get_wifi_provision(wfx_wifi_provision_t * wifiConfig) +{ + if (wifiConfig == NULL) { - memcpy(wifi_provision.ssid, wifiConfig->ssid, sizeof(wifiConfig->ssid)); - memcpy(wifi_provision.passkey, wifiConfig->passkey, sizeof(wifiConfig->passkey)); - EFR32_LOG("WIFI: Provision SSID=%s", &wifi_provision.ssid[0]); - - /* Not very good - To be improved */ - switch (wifiConfig->security) - { - case WFX_SEC_WPA: - wifi_provision.security = static_cast(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK); - break; - case WFX_SEC_WPA3: - wifi_provision.security = WFM_SECURITY_MODE_WPA3_SAE; - break; - case WFX_SEC_WPA2: - wifi_provision.security = static_cast(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK); - break; - case WFX_SEC_WPA_WPA2_MIXED: - wifi_provision.security = static_cast(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK); - break; - default: - wifi_provision.security = WFM_SECURITY_MODE_WPA2_PSK; - break; - } + return false; } + memcpy(wifiConfig, &wifi_provision, sizeof(wfx_wifi_provision_t)); - /**************************************************************************** - * @fn bool wfx_get_wifi_provision(wfx_wifi_provision_t *wifiConfig) - * @brief - * get the wifi provision - * @param[in] wifiConfig: configuration of wifi - * @return returns true if successful, - * false otherwise - *****************************************************************************/ - bool wfx_get_wifi_provision(wfx_wifi_provision_t * wifiConfig) - { - if (wifiConfig == NULL) - { - return false; - } - memcpy(wifiConfig, &wifi_provision, sizeof(wfx_wifi_provision_t)); + return true; +} - return true; - } +/**************************************************************************** + * @brief + * clear the wifi provision + * @return returns true if successful, + * false otherwise + *****************************************************************************/ +void wfx_clear_wifi_provision(void) +{ + memset(&wifi_provision, 0, sizeof(wifi_provision)); +} - /**************************************************************************** - * @fn void wfx_clear_wifi_provision(void) - * @brief - * clear the wifi provision - * @param[in] None - * @return returns true if successful, - * false otherwise - *****************************************************************************/ - void wfx_clear_wifi_provision(void) { memset(&wifi_provision, 0, sizeof(wifi_provision)); } - - /**************************************************************************** - * @fn bool wfx_is_sta_provisioned(void) - * @brief - * driver STA provisioned - * @param[in] None - * @return returns true if successful, - * false otherwise - *****************************************************************************/ - bool wfx_is_sta_provisioned(void) { return (wifi_provision.ssid[0]) ? true : false; } - - /**************************************************************************** - * @fn sl_status_t wfx_connect_to_ap(void) - * @brief - * driver connect to ap - * @param[in] None - * @return returns SL_STATUS_NOT_AVAILABLE - *****************************************************************************/ - sl_status_t wfx_connect_to_ap(void) - { - sl_status_t result; +/**************************************************************************** + * @brief + * driver STA provisioned + * @return returns true if successful, + * false otherwise + *****************************************************************************/ +bool wfx_is_sta_provisioned(void) +{ + return (wifi_provision.ssid[0]) ? true : false; +} - if (wifi_provision.ssid[0] == 0) - { - return SL_STATUS_NOT_AVAILABLE; - } - EFR32_LOG("WIFI:JOIN to %s", &wifi_provision.ssid[0]); - - EFR32_LOG("WIFI Scan Paramter set to Active channel time %d, Passive Channel " - "Time: %d, Number of prob: %d", - ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); - (void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); - result = sl_wfx_send_join_command((uint8_t *) wifi_provision.ssid, strlen(wifi_provision.ssid), NULL, CHANNEL_0, - static_cast(wifi_provision.security), PREVENT_ROAMING, - DISABLE_PMF_MODE, (uint8_t *) wifi_provision.passkey, strlen(wifi_provision.passkey), - NULL, IE_DATA_LENGTH); - - return result; - } +/**************************************************************************** + * @fn sl_status_t wfx_connect_to_ap(void) + * @brief + * driver connect to ap + * @return returns SL_STATUS_NOT_AVAILABLE + *****************************************************************************/ +sl_status_t wfx_connect_to_ap(void) +{ + sl_status_t result; - /**************************************************************************** - * @fn void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t *addr) - * @brief - * get the wifi mac addresss - * @param[in] interface: - * @param[in] addr : address - * @return None - *****************************************************************************/ - void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * addr) + if (wifi_provision.ssid[0] == 0) { - sl_wfx_mac_address_t * mac; + return SL_STATUS_NOT_AVAILABLE; + } + EFR32_LOG("WIFI:JOIN to %s", &wifi_provision.ssid[0]); + + EFR32_LOG("WIFI Scan Paramter set to Active channel time %d, Passive Channel " + "Time: %d, Number of prob: %d", + ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); + (void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST); + result = + sl_wfx_send_join_command((uint8_t *) wifi_provision.ssid, strlen(wifi_provision.ssid), NULL, CHANNEL_0, + static_cast(wifi_provision.security), PREVENT_ROAMING, DISABLE_PMF_MODE, + (uint8_t *) wifi_provision.passkey, strlen(wifi_provision.passkey), NULL, IE_DATA_LENGTH); + + return result; +} + +/**************************************************************************** + * @brief + * get the wifi mac addresss + * @param[in] interface: + * @param[in] addr : address + *****************************************************************************/ +void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * addr) +{ + sl_wfx_mac_address_t * mac; #ifdef SL_WFX_CONFIG_SOFTAP - mac = (interface == SL_WFX_SOFTAP_INTERFACE) ? &wifiContext.mac_addr_1 : &wifiContext.mac_addr_0; + mac = (interface == SL_WFX_SOFTAP_INTERFACE) ? &wifiContext.mac_addr_1 : &wifiContext.mac_addr_0; #else mac = &wifiContext.mac_addr_0; #endif - *addr = *mac; - EFR32_LOG("WLAN:Get WiFi Mac addr %02x:%02x:%02x:%02x:%02x:%02x", mac->octet[0], mac->octet[1], mac->octet[2], - mac->octet[3], mac->octet[4], mac->octet[5]); - } + *addr = *mac; + EFR32_LOG("WLAN:Get WiFi Mac addr %02x:%02x:%02x:%02x:%02x:%02x", mac->octet[0], mac->octet[1], mac->octet[2], mac->octet[3], + mac->octet[4], mac->octet[5]); + memcpy(&ap_info.bssid[0], &mac->octet[0], 6); +} - /**************************************************************************** - * @fn bool wfx_have_ipv4_addr(sl_wfx_interface_t which_if) - * @brief - * function called when driver have ipv4 address - * @param[in] which_if: - * @return returns false if sucessful, - * true otherwise - *****************************************************************************/ - bool wfx_have_ipv4_addr(sl_wfx_interface_t which_if) +/**************************************************************************** + * @brief + * function called when driver have ipv4 address + * @param[in] which_if: + * @return returns false if sucessful, + * true otherwise + *****************************************************************************/ +bool wfx_have_ipv4_addr(sl_wfx_interface_t which_if) +{ + if (which_if == SL_WFX_STA_INTERFACE) { - if (which_if == SL_WFX_STA_INTERFACE) - { - return (sta_ip == STA_IP_FAIL) ? false : true; - } - else - { - return false; /* TODO */ - } + return (sta_ip == STA_IP_FAIL) ? false : true; } - - /**************************************************************************** - * @fn bool wfx_have_ipv6_addr(sl_wfx_interface_t which_if) - * @brief - * function called when driver have ipv6 address - * @param[in] which_if: - * @return returns false if sucessful, - * true otherwise - *****************************************************************************/ - bool wfx_have_ipv6_addr(sl_wfx_interface_t which_if) + else { - EFR32_LOG("%s: started.", __func__); - bool status = false; - if (which_if == SL_WFX_STA_INTERFACE) - { - status = wfx_is_sta_connected(); - } - else - { - status = false; /* TODO */ - } - EFR32_LOG("%s: status: %d", __func__, status); - return status; + return false; /* TODO */ } +} - /**************************************************************************** - * @fn sl_status_t wfx_sta_discon(void) - * @brief - * Disconnect station mode from connected AP - * @param[in] None - * @returns Returns SL_STATUS_OK if successful, - * SL_STATUS_FAIL otherwise - *****************************************************************************/ - sl_status_t wfx_sta_discon(void) +/**************************************************************************** + * @brief + * function called when driver have ipv6 address + * @param[in] which_if: + * @return returns false if sucessful, + * true otherwise + *****************************************************************************/ +bool wfx_have_ipv6_addr(sl_wfx_interface_t which_if) +{ + EFR32_LOG("%s: started.", __func__); + bool status = false; + if (which_if == SL_WFX_STA_INTERFACE) { - EFR32_LOG("STA-Disconnecting"); - int32_t status = sl_wfx_send_disconnect_command(); - wifi_extra &= ~WE_ST_STA_CONN; - xEventGroupSetBits(sl_wfx_event_group, SL_WFX_RETRY_CONNECT); - return status; + status = wfx_is_sta_connected(); } - - /**************************************************************************** - * @fn bool wfx_is_sta_mode_enabled(void) - * @brief - * enable the STA mode - * @param[in] None - * @return returns true - *****************************************************************************/ - bool wfx_is_sta_mode_enabled(void) { return true; /* It always is */ } - - /**************************************************************************** - * @fn bool wfx_is_sta_connected(void) - * @brief - * fuction called when driver is STA connected - * @param[in] None - * @return returns true if sucessful, - * false otherwise - *****************************************************************************/ - bool wfx_is_sta_connected(void) + else { - bool val; + status = false; /* TODO */ + } + EFR32_LOG("%s: status: %d", __func__, status); + return status; +} - val = (wifi_extra & WE_ST_STA_CONN) ? true : false; +/**************************************************************************** + * @brief + * Disconnect station mode from connected AP + * @returns Returns SL_STATUS_OK if successful, + * SL_STATUS_FAIL otherwise + *****************************************************************************/ +sl_status_t wfx_sta_discon(void) +{ + EFR32_LOG("STA-Disconnecting"); + int32_t status = sl_wfx_send_disconnect_command(); + wifi_extra &= ~WE_ST_STA_CONN; + xEventGroupSetBits(sl_wfx_event_group, SL_WFX_RETRY_CONNECT); + return status; +} - EFR32_LOG("WLAN: STA %s connected", (val ? "IS" : "NOT")); +/**************************************************************************** + * @brief + * enable the STA mode + * @return returns true + *****************************************************************************/ +bool wfx_is_sta_mode_enabled(void) +{ + return true; /* It always is */ +} - return val; - } +/**************************************************************************** + * @brief + * fuction called when driver is STA connected + * @return returns true if sucessful, + * false otherwise + *****************************************************************************/ +bool wfx_is_sta_connected(void) +{ + bool val; - /**************************************************************************** - * @fn void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif) - * @brief - * It is automatically done when lwip link up - * @param[in] None - * @return returns true if sucessful, - * false otherwise - *****************************************************************************/ - void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif) - { - EFR32_LOG("Setup-IP6: TODO"); /* It is automatically done when lwip link up */ - } + val = (wifi_extra & WE_ST_STA_CONN) ? true : false; - /**************************************************************************** - * @fn wifi_mode_t wfx_get_wifi_mode() - * @brief - * get the wifi mode - * @param[in] None - * @return returns WIFI_MODE_NULL if sucessful, - * WIFI_MODE_STA otherwise - *****************************************************************************/ - wifi_mode_t wfx_get_wifi_mode() - { - if (wifiContext.state & SL_WFX_STARTED) - return WIFI_MODE_STA; - return WIFI_MODE_NULL; - } + EFR32_LOG("WLAN: STA %s connected", (val ? "IS" : "NOT")); + + return val; +} - /***************************************************************************** - * @fn bool wfx_hw_ready(void) - * @brief - * This is called from the context of AppTask - * For WF200 - Start WIFI here - * @param[in] None - * @return returns true if sucessful, - * false otherwise - ******************************************************************************/ - bool wfx_hw_ready(void) { return (wifiContext.state & SL_WFX_STARTED) ? true : false; } +/**************************************************************************** + * @brief + * It is automatically done when lwip link up + * @return returns true if sucessful, + * false otherwise + *****************************************************************************/ +void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif) +{ + EFR32_LOG("Setup-IP6: TODO"); /* It is automatically done when lwip link up */ +} + +/**************************************************************************** + * @brief + * get the wifi mode + * @return returns WIFI_MODE_NULL if sucessful, + * WIFI_MODE_STA otherwise + *****************************************************************************/ +wifi_mode_t wfx_get_wifi_mode() +{ + if (wifiContext.state & SL_WFX_STARTED) + return WIFI_MODE_STA; + return WIFI_MODE_NULL; +} + +/***************************************************************************** + * @brief + * This is called from the context of AppTask + * For WF200 - Start WIFI here + * @return returns true if sucessful, + * false otherwise + ******************************************************************************/ +bool wfx_hw_ready(void) +{ + return (wifiContext.state & SL_WFX_STARTED) ? true : false; +} #if CHIP_DEVICE_CONFIG_ENABLE_IPV4 - /***************************************************************************** - * @fn void wfx_dhcp_got_ipv4(uint32_t ip) - * @brief - * function called when dhcp got ipv4 - * @param[in] ip : internet protocol - *@return None - ******************************************************************************/ - void wfx_dhcp_got_ipv4(uint32_t ip) - { - /* Acquire the new IP address - */ - sta_ip = ip; - wfx_ip_changed_notify(IP_STATUS_SUCCESS); - } +/***************************************************************************** + * @brief + * function called when dhcp got ipv4 + * @param[in] ip : internet protocol + ******************************************************************************/ +void wfx_dhcp_got_ipv4(uint32_t ip) +{ + /* Acquire the new IP address + */ + sta_ip = ip; + wfx_ip_changed_notify(IP_STATUS_SUCCESS); +} #endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */ - /***************************************************************************** - * @fn wfx_enable_sta_mode(void) - * @brief - * function called from connectivityManager - * @param[in] - * @return None - ******************************************************************************/ - void wfx_enable_sta_mode(void) - { - /* Nothing to do - default is that it is - place holder */ - } +/***************************************************************************** + * @brief + * function called from connectivityManager + ******************************************************************************/ +void wfx_enable_sta_mode(void) +{ + /* Nothing to do - default is that it is + place holder */ +} /**************************************************************************** - * @fn bool wfx_start_scan(char *ssid, void (*callback)(wfx_wifi_scan_result_t *)) * @brief * driver scan start - * @param[in] callback: + * @param[in] callback: Callback from the wifi scan results * @return returns true if sucessful, * false otherwise *****************************************************************************/ #ifdef SL_WFX_CONFIG_SCAN - bool wfx_start_scan(char * ssid, void (*callback)(wfx_wifi_scan_result_t *)) - { - int sz; +bool wfx_start_scan(char * ssid, void (*callback)(wfx_wifi_scan_result_t *)) +{ + int sz; - if (scan_cb) - return false; /* Already in progress */ - if (ssid) + if (scan_cb) + return false; /* Already in progress */ + if (ssid) + { + sz = strlen(ssid); + if ((scan_ssid = (char *) pvPortMalloc(sz + 1)) == (char *) 0) { - sz = strlen(ssid); - if ((scan_ssid = (char *) pvPortMalloc(sz + 1)) == (char *) 0) - { - return false; - } - strcpy(scan_ssid, ssid); + return false; } - scan_cb = callback; - xEventGroupSetBits(sl_wfx_event_group, SL_WFX_SCAN_START); - - return true; + strcpy(scan_ssid, ssid); } + scan_cb = callback; + xEventGroupSetBits(sl_wfx_event_group, SL_WFX_SCAN_START); - /**************************************************************************** - * @fn void wfx_cancel_scan(void) - * @brief - * driver scan cancelation - * @param[in] None - * @return None - *****************************************************************************/ - void wfx_cancel_scan(void) + return true; +} + +/**************************************************************************** + * @brief + * driver scan cancelation + *****************************************************************************/ +void wfx_cancel_scan(void) +{ + struct scan_result_holder *hp, *next; + /* Not possible */ + if (!scan_cb) { - struct scan_result_holder *hp, *next; - /* Not possible */ - if (!scan_cb) - { - return; - } - sl_wfx_send_stop_scan_command(); - for (hp = scan_save; hp; hp = next) - { - next = hp->next; - vPortFree(hp); - } - scan_save = (struct scan_result_holder *) 0; - scan_count = 0; - if (scan_ssid) - { - vPortFree(scan_ssid); - scan_ssid = (char *) 0; - } - scan_cb = 0; + return; } + sl_wfx_send_stop_scan_command(); + for (hp = scan_save; hp; hp = next) + { + next = hp->next; + vPortFree(hp); + } + scan_save = (struct scan_result_holder *) 0; + scan_count = 0; + if (scan_ssid) + { + vPortFree(scan_ssid); + scan_ssid = (char *) 0; + } + scan_cb = 0; +} #endif /* SL_WFX_CONFIG_SCAN */ diff --git a/src/platform/EFR32/wifi/ethernetif.cpp b/src/platform/EFR32/wifi/ethernetif.cpp index 4ac27d69f194e4..8c2e818222e138 100644 --- a/src/platform/EFR32/wifi/ethernetif.cpp +++ b/src/platform/EFR32/wifi/ethernetif.cpp @@ -61,6 +61,8 @@ StaticSemaphore_t xEthernetIfSemaBuffer; #define LWIP_FRAME_ALIGNMENT 60 +uint32_t gOverrunCount = 0; + /***************************************************************************** * Variables ******************************************************************************/ @@ -168,9 +170,16 @@ static void low_level_input(struct netif * netif, uint8_t * b, uint16_t len) if (netif->input(p, netif) != ERR_OK) { + gOverrunCount++; + EFR32_LOG("overrun count entering when fail to alloc value %d", gOverrunCount); pbuf_free(p); } } + else + { + gOverrunCount++; + EFR32_LOG("overrun count entering when fail to alloc value %d", gOverrunCount); + } } /***************************************************************************** @@ -217,6 +226,8 @@ static err_t low_level_output(struct netif * netif, struct pbuf * p) if (sl_wfx_host_allocate_buffer((void **) &tx_buffer, SL_WFX_TX_FRAME_BUFFER, asize) != SL_STATUS_OK) { EFR32_LOG("*ERR*EN-Out: No mem frame len=%d", framelength); + gOverrunCount++; + EFR32_LOG("overrun count exiting when faied to alloc value %d", gOverrunCount); return ERR_MEM; } buffer = tx_buffer->body.packet_data; diff --git a/src/platform/EFR32/wifi/wfx_host_events.h b/src/platform/EFR32/wifi/wfx_host_events.h index be64a8a65594b4..40e4d8e7fca166 100644 --- a/src/platform/EFR32/wifi/wfx_host_events.h +++ b/src/platform/EFR32/wifi/wfx_host_events.h @@ -26,7 +26,77 @@ #include "sl_wfx_cmd_api.h" #include "sl_wfx_constants.h" -#else /* RS911x */ + +typedef struct __attribute__((__packed__)) sl_wfx_get_counters_cnf_body_s +{ + uint32_t status; + uint16_t mib_id; + uint16_t length; + uint32_t rcpi; + uint32_t count_plcp_errors; + uint32_t count_fcs_errors; + uint32_t count_tx_packets; + uint32_t count_rx_packets; + uint32_t count_rx_packet_errors; + uint32_t count_rx_decryption_failures; + uint32_t count_rx_mic_failures; + uint32_t count_rx_no_key_failures; + uint32_t count_tx_multicast_frames; + uint32_t count_tx_frames_success; + uint32_t count_tx_frame_failures; + uint32_t count_tx_frames_retried; + uint32_t count_tx_frames_multi_retried; + uint32_t count_rx_frame_duplicates; + uint32_t count_rts_success; + uint32_t count_rts_failures; + uint32_t count_ack_failures; + uint32_t count_rx_multicast_frames; + uint32_t count_rx_frames_success; + uint32_t count_rx_cmacicv_errors; + uint32_t count_rx_cmac_replays; + uint32_t count_rx_mgmt_ccmp_replays; + uint32_t count_rx_bipmic_errors; + uint32_t count_rx_beacon; + uint32_t count_miss_beacon; + uint32_t reserved[15]; +} sl_wfx_get_counters_cnf_body_t; + +typedef struct __attribute__((__packed__)) sl_wfx_get_counters_cnf_s +{ + /** Common message header. */ + sl_wfx_header_t header; + /** Confirmation message body. */ + sl_wfx_get_counters_cnf_body_t body; +} sl_wfx_get_counters_cnf_t; + +typedef struct __attribute__((__packed__)) sl_wfx_mib_req_body_s +{ + uint16_t mib_id; ///< ID of the MIB to be read. + uint16_t reserved; +} sl_wfx_mib_req_body_t; + +typedef struct __attribute__((__packed__)) sl_wfx_header_mib_s +{ + uint16_t length; ///< Message length in bytes including this uint16_t. + ///< Maximum value is 8188 but maximum Request size is FW dependent and reported in the + ///< ::sl_wfx_startup_ind_body_t::size_inp_ch_buf. + uint8_t id; ///< Contains the message Id indexed by sl_wfx_general_commands_ids_t or sl_wfx_message_ids_t. + uint8_t reserved : 1; + uint8_t interface : 2; + uint8_t seqnum : 3; + uint8_t encrypted : 2; +} sl_wfx_header_mib_t; + +typedef struct __attribute__((__packed__)) sl_wfx_mib_req_s +{ + /** Common message header. */ + sl_wfx_header_mib_t header; + /** Request message body. */ + sl_wfx_mib_req_body_t body; +} sl_wfx_mib_req_t; + +#else /* End WF200 else RS911x */ + #include "wfx_msgs.h" /* Wi-Fi events*/ @@ -296,6 +366,7 @@ int32_t wfx_rsi_send_data(void * p, uint16_t len); #ifdef WF200_WIFI void wfx_bus_start(void); +sl_status_t get_all_counters(void); void sl_wfx_host_gpio_init(void); sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t * event_payload); #endif