[Title] New DM connectivity APIs for WiFi start, DHCP and scan
authorVenkatraman Iyer <venkat.iyer@samsung.com>
Mon, 24 Apr 2017 10:52:20 +0000 (19:52 +0900)
committerVenkatraman Iyer <venkat.iyer@samsung.com>
Thu, 27 Apr 2017 10:44:05 +0000 (19:44 +0900)
[Description] Added new APIs to DM module to start device in WiFi STA mode, perform DHCP and WiFi channel scans

apps/examples/wakaama_client/wakaama_client.c
apps/wpa_supplicant/src/common/wpa_ctrl.c
framework/include/dm/dm_connectivity.h
framework/src/dm/arch/sidk_s5jt200/s5j_dm_connectivity.c

index 677ac83..c481e99 100644 (file)
 
 #define NET_DEVNAME "wl1"
 
+#define WAKAAMA_CHECK_ARG()    do {\
+       if (opt >= argc) { \
+               app_print_usage(); \
+               return 0; \
+       } \
+} \
+while (0);
+
+
+#if defined(CONFIG_NET_LWIP_DHCPC) && !defined(CONFIG_NETUTILS_DHCPC)
+struct dhcp dhcp_handle;
+#endif
+
+static dm_scan_info_t *appwifiscan_result = NULL;
+static dm_scan_info_t *wifi_iterator;
+
+static char *wifi_aps[] = {"hack07", "hack10", "hack13", "hack14", "hack17", "hack18", "hack21", "hack23", "hack24", "hack28", "hack11"};
+
+static uint8_t appscan_iteration;
+
 #define DM_LIFETIME 300
 #define DM_SERVERIP "192.168.1.152"
 #define DM_SERVERPORT LWM2M_STANDARD_PORT_STR
@@ -45,8 +65,8 @@ extern int dm_lwm2m_change_client_resource(char *buffer);
 static int g_wakaama_initialized;
 
 struct wakaama_param_s {
-       unsigned char serverip[20];
-       unsigned char serverport[6];
+       char serverip[20];
+       char serverport[6];
        unsigned int lifetime;
 };
 
@@ -55,7 +75,7 @@ typedef struct wakaama_param_s wakaama_param_t;
 static wakaama_param_t wakaama_param;
 
 static struct dm_lwm2m_context_s dm_context;
-static int isConnected = 0;
+static int g_isconnected;
 
 struct work_s wakaama_wq;
 
@@ -89,40 +109,16 @@ void app_print_usage(void)
 }
 
 static void prv_wakaama_start(void)
-{
-       int ret;
-       ret = dm_lwm2m_start_client(&dm_context);
-       if (ret != DM_ERROR_NONE) {
+{      
+       if (dm_lwm2m_start_client(&dm_context) != DM_ERROR_NONE) {
                fprintf(stderr, "Error creating wakaama thread\n");
        } else {
                fprintf(stderr, "Successfully created wakaama thread\n");
        }
 }
 
-static int app_dhcp_main(void)
-{
-       uint32_t timeleft = 15000;
-       struct dhcpc_state state;
-       void * dhcp_handle;
-       int ret;
-
-       dhcp_handle = dhcpc_open(NET_DEVNAME);
-       ret = dhcpc_request(dhcp_handle, &state);
-       if (ret != OK) {
-                       dhcpc_close(dhcp_handle);
-                       return -1;
-       }
-
-       netlib_set_ipv4addr(NET_DEVNAME, &state.ipaddr);
-       netlib_set_ipv4netmask(NET_DEVNAME, &state.netmask);
-       netlib_set_dripv4addr(NET_DEVNAME, &state.default_router);
-
-       printf("IP address : %s ----\n", inet_ntoa(state.ipaddr));
-       return 1;
-}
-
 
-static int change_resource(FAR void *arg)
+static void change_resource(FAR void *arg)
 {
        char argbuffer[20];
        memset(argbuffer, 0x00, 20);
@@ -130,15 +126,13 @@ static int change_resource(FAR void *arg)
        dm_lwm2m_change_client_resource(argbuffer);
 }
 
-static conn_cb linkUpEvent()
+static void linkUpEvent(void)
 {
-       isConnected = 1;
+       g_isconnected = 1;
        if (g_wakaama_initialized == 1) {
-               int resource_val;
                int ret;
 
                printf("about to restart wakaama_client\n");
-               resource_val = 7;
                ret = dm_lwm2m_start_client(&dm_context);
                if (ret != DM_ERROR_NONE) {
                        fprintf(stderr, "Error creating wakaama thread\n");
@@ -150,88 +144,15 @@ static conn_cb linkUpEvent()
        }
 }
 
-static conn_cb linkDownEvent()
+static void linkDownEvent(void)
 {
-       isConnected = 0;
+       g_isconnected = 0;
        if (g_wakaama_initialized == 1) {
-               int resource_val;
                printf("about to close wakaama_client\n");
                dm_lwm2m_stop_client();
        }
 }
 
-static int wifiAutoConnectInit()
-{
-       int8_t ret;
-       uint8_t result;
-
-       isConnected = 0;
-       dm_conn_register_linkup_cb(linkUpEvent);
-       dm_conn_register_linkdown_cb(linkDownEvent);
-
-       if (WifiIsConnected(&result, NULL) != SLSI_STATUS_SUCCESS) {
-               printf("failed to WifiIsConnected\n");
-               return;
-       }
-
-       if (result > 0) {
-               printf("Wi-Fi status - Connected : %d\n", result);
-               isConnected = 1;
-               return 1;
-       }
-
-       ret = WiFiStart(SLSI_WIFI_STATION_IF, NULL);
-       if (ret == SLSI_STATUS_SUCCESS) {
-               printf("[AutoConnect]STA mode started\n");
-               ret = WiFiNetworkJoin(CONFIG_DM_AP_SSID, strlen(CONFIG_DM_AP_SSID), NULL, get_security_config(CONFIG_DM_AP_SECURITY, CONFIG_DM_AP_PASS));
-               sleep(1);
-               if (ret == SLSI_STATUS_SUCCESS) {
-                       printf("[AutoConnect]Start doJoin with SSID %s\n", CONFIG_DM_AP_SSID);
-                       return 1;
-               } else {
-                       printf("[AutoConnect]Failed to join the network.[%d]\n", ret);
-               }
-               return -1;
-       } else {
-               printf("[AutoConnect]Failed to start STA mode\n");
-       }
-       return -1;
-}
-
-static void wifiAutoConnectDeInit()
-{
-       isConnected = 0;
-       dm_conn_unregister_linkup_cb(linkUpEvent);
-}
-
-static void wifiAutoConnect()
-{
-       int ret;
-       if ((ret = wifiAutoConnectInit()) == 1) {
-               int waitTime = 10;
-               while (waitTime--) {
-                       if (isConnected == 1) {
-                               printf("[AutoConnect]WiFi Connected!\n");
-                               int dhcp_ret = app_dhcp_main();
-                               if (dhcp_ret == -1) {
-                                       printf("Timeout fail to get ip address\n");
-                                       return dhcp_ret;
-                               } else if (dhcp_ret == 0) {
-                                       printf("No network interface\n");
-                                       return dhcp_ret;
-                               }
-                               printf("DHCP done\n");
-                               break;
-                       }
-                       sleep(1);
-               }
-               if (waitTime <= 0) {
-                       printf("[AutoConnect]WiFi is not working. Test Canceled\n");
-                       return 0;
-               }
-       }
-}
-
 int wakaamaclient_main(int argc, char *argv[])
 {
        int opt;
@@ -241,11 +162,17 @@ int wakaamaclient_main(int argc, char *argv[])
                return 0;
        }
 
-
-
        if (!g_wakaama_initialized) {
                app_init_param();
-               wifiAutoConnect();
+               printf("trying connect\n");
+               if (dm_conn_wifi_connect(linkUpEvent, linkDownEvent) != DM_ERROR_NONE) {
+                       return -1;
+               }
+               sleep(10);
+               printf("trying dhcp\n");
+               if (dm_conn_dhcp_init() != DM_ERROR_NONE) {
+                       return -1;
+               }
        }
        opt = 1;
 
@@ -257,22 +184,15 @@ int wakaamaclient_main(int argc, char *argv[])
                switch (argv[opt][1]) {
                case 'b':
                        opt++;
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
                        bootstrap_requested = true;
                        strncpy(dm_context.server_info.ipAddress, \
                                        argv[opt], strlen(argv[opt]));
                        break;
                case 't':
                        opt++;
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
-                       if (1 != sscanf(argv[opt], "%d", \
-                                                       &(dm_context.client_info.lifetime))) {
+                       WAKAAMA_CHECK_ARG();
+                       if (sscanf(argv[opt], "%d", &(dm_context.client_info.lifetime)) != 1) {
                                app_print_usage();
                                return 0;
                        }
@@ -280,10 +200,7 @@ int wakaamaclient_main(int argc, char *argv[])
 
                case 's':
                        opt++;
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
                        strncpy(dm_context.server_info.ipAddress, \
                                        argv[opt], strlen(argv[opt]));
                        break;
@@ -294,27 +211,17 @@ int wakaamaclient_main(int argc, char *argv[])
 #ifdef WITH_TINYDTLS
                case 'i':
                        opt++;
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
                        break;
                case 'S':
                        opt++;
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
                        break;
 #endif
                case 'n': {
                        char argbuffer[20];
-                       int val = 7;
                        opt++;
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
 
                        memset(argbuffer, 0x00, 20);
                        strncpy(argbuffer, argv[opt], strlen(argv[opt]));
@@ -326,27 +233,18 @@ int wakaamaclient_main(int argc, char *argv[])
                return 0;
                case 'l':
                        opt++;
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
                        break;
                case 'p':
                        opt++;
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
                        strncpy(wakaama_param.serverport, argv[opt], strlen(argv[opt]));
                        break;
                case 'g': {
                        char ipAddress[IPADDRLEN_MAX];
                        int ret;
 
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
                        ret = dm_lwm2m_get_server_address(ipAddress);
                        if (ret == DM_ERROR_NONE) {
                                printf("Server ip address is %s\n", ipAddress);
@@ -356,13 +254,10 @@ int wakaamaclient_main(int argc, char *argv[])
                        return 0;
                }
                case 'h': {
-                       char *server_port[PORTLEN];
+                       char server_port[PORTLEN];
                        int ret;
 
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
                        ret = dm_lwm2m_get_server_port(server_port);
                        if (ret != DM_ERROR_NONE) {
                                printf("Server port is %s\n", server_port);
@@ -374,10 +269,7 @@ int wakaamaclient_main(int argc, char *argv[])
                case 'd': {
                        char argbuffer[20];
                        opt++;
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
                        printf("Read all resource of an object instance %s\n", argv[opt]);
                        memset(argbuffer, 0x00, 20);
                        strncpy(argbuffer, argv[opt], strlen(argv[opt]));
@@ -387,13 +279,45 @@ int wakaamaclient_main(int argc, char *argv[])
                        return 0;
                }
                case 'r':
-                       if (opt >= argc) {
-                               app_print_usage();
-                               return 0;
-                       }
+                       WAKAAMA_CHECK_ARG();
                        printf("Read a resource value\n");
                        return 0;
 
+               case 'f': {
+                       int i;
+                       int wifi_count;
+                       while (1) {
+                               wifi_count = 0;
+                               if (dm_conn_wifi_scan() == DM_ERROR_NONE) {
+                                       printf("DM scan network PASS\n");
+                               } else {
+                                       printf("Failed on wifi scan\n");
+                               }
+                               sleep(10);
+                               if (dm_conn_get_scan_result(&appwifiscan_result) ==  DM_ERROR_NONE) {
+                                       wifi_iterator = appwifiscan_result; 
+                                       while (wifi_iterator != NULL) {
+                                               for (i = 0; i < sizeof(wifi_aps) / sizeof(char *); i++) {
+                                                       if (!strncmp(wifi_iterator->ssid, wifi_aps[i], strlen(wifi_aps[i]))) {
+                                                               printf("AP:%d:%s:%s:%d\n", appscan_iteration,
+                                                                          wifi_iterator->ssid,
+                                                                          wifi_iterator->bssid,
+                                                                          wifi_iterator->rssi);
+                                                       }
+                                               }
+                                               wifi_count++;
+                                               wifi_iterator = wifi_iterator->next;
+                                       }
+                               } else {
+                                       printf("DM_ERROR_NO_DATA\n");
+                               }
+                               printf("AP:%d:totalAP#:%d\n", appscan_iteration, wifi_count);
+                               dm_conn_free_scan_result(&appwifiscan_result);
+                               appscan_iteration++;
+                       }
+               }
+               return 0;
+
                case 'x':
                        dm_lwm2m_stop_client();
                        return 0;
index 614b818..8960ccb 100644 (file)
@@ -594,7 +594,7 @@ int wpa_ctrl_recvfrom(int sock, char *buf, size_t len
 #ifdef CONFIG_CTRL_IFACE_UDP
                amount = recvfrom(sock, pos, recv_len, 0, from, fromlen);
 #else
-               amount = read(sock, pos, recv_len);
+               amount += read(sock, pos, recv_len);
 #endif
        }
        if (msg_size > len) {
index a64857d..ab078bb 100644 (file)
@@ -35,11 +35,13 @@ extern "C"
 {
 #endif
 
-#ifdef DM_API_DEBUG
-#define dmdbg(format, ...) printf("DM_API (%s): " format, __FUNCTION__, ##__VA_ARGS__)
-#else
-#define dmdbg(a, ...) (void)0
-#endif
+struct dm_scan_info_s {
+       char ssid[33];               // 802.11 spec defined unspecified or uint8
+       char bssid[18];                 // char string e.g. xx:xx:xx:xx:xx:xx
+       int8_t rssi;                    // rssi level of scanned device
+       struct dm_scan_info_s *next;
+};
+typedef struct dm_scan_info_s dm_scan_info_t;
 
 typedef void (*conn_cb)(void);
 
@@ -133,6 +135,54 @@ int dm_conn_unregister_linkup_cb(conn_cb cb);
  */
 int dm_conn_unregister_linkdown_cb(conn_cb cb);
 
+/**
+ * @brief Perform a WiFi scan over all channels
+ *
+ * @param[in] None.
+ * @return On success, 0 is returned. On failure, a negative value is returned.
+ */
+int dm_conn_wifi_scan(void);
+
+/**
+ * @brief Fetch WiFi scan result
+ *
+ * @param[out] pointer to WiFi scan structure to hold result.
+ * @return On success, 0 is returned. On failure, a negative value is returned.
+ */
+int dm_conn_get_scan_result(dm_scan_info_t **result);
+
+/**
+ * @brief Free WiFi scan result
+ *
+ * @param[out] pointer to WiFi scan structure that holds result.
+ * @return On completion, 0 is returned.
+ */
+int dm_conn_free_scan_result(dm_scan_info_t **result);
+
+/**
+ * @brief Start device as WiFi station and connect to designated Access Point
+ *
+ * @param[in] callback functions to handle WiFi link being up and down.
+ * @return On completion, 0 is returned. On failure, a negative value is returned.
+ */
+int dm_conn_wifi_connect(conn_cb linkUpEvent, conn_cb linkDownEvent);
+
+/**
+ * @brief Perform DHCP client routine to obtain IP address for WiFi interface
+ *
+ * @param None
+ * @return On completion, 0 is returned. On failure, a negative value is returned.
+ */
+int dm_conn_dhcp_init(void);
+
+/**
+ * @brief Mark WiFi state as disconnected
+ *
+ * @param None
+ * @return On completion, 0 is returned. On failure, a negative value is returned.
+ */
+int dm_conn_wifi_disconnect(void);
+
 #ifdef __cplusplus
 }
 #endif
index f79ad9c..bb08bc9 100644 (file)
 #include <dm/dm_error.h>
 #include <dm/dm_connectivity.h>
 
+#include <apps/netutils/dhcpc.h>
 #include <apps/netutils/wifi/slsi_wifi_api.h>
+#include <apps/netutils/wifi/slsi_wifi_utils.h>
 #include <arpa/inet.h>
 
 #define DM_GET_INTERFACE_INFO 0
 #define DM_GET_IP_ADDR_INFO 1
 
 #define DM_CALLBACK_BUFFER_SIZE 10
+#define DM_BSSID_LEN            18
+#define DM_NET_DEVNAME          "wl1"
+
+/* Static data structure to hold results of a WiFi scan.
+ */
+static slsi_scan_info_t *g_wifi_scan_result;
+static slsi_scan_info_t *g_wifi_scan_iter;
+
+/* WiFi connection status variable */
+static uint8_t g_dm_connected;
 
 static sem_t g_dm_link_evt;
 
@@ -385,3 +397,200 @@ int dm_conn_unregister_linkdown_cb(conn_cb cb)
        dmdbg("Link Down Callback UnRegistered Successfully\n");
        return DM_ERROR_NONE;
 }
+
+static int8_t prv_dm_conn_scan_result(slsi_reason_t *reason)
+{
+       if (reason->reason_code != 0) {
+               dmdbg("Failed to scan : reason %d, locally generated : %d\n", \
+                         reason->reason_code, reason->locally_generated);
+               g_wifi_scan_result = NULL;
+       } else {
+               WiFiFreeScanResults(&g_wifi_scan_result);
+               WiFiGetScanResults(&g_wifi_scan_result);
+               WiFiNetworkJoin((uint8_t *) CONFIG_DM_AP_SSID, strlen(CONFIG_DM_AP_SSID), \
+                                               NULL, (slsi_security_config_t *) getSecurityConfig(CONFIG_DM_AP_SECURITY, \
+                                                               CONFIG_DM_AP_PASS, SLSI_WIFI_STATION_IF));
+       }
+       printf("scanned result\n");
+       return SLSI_STATUS_SUCCESS;
+}
+
+int dm_conn_get_scan_result(dm_scan_info_t **result)
+{
+       dm_scan_info_t *curr_record;
+       dm_scan_info_t *prev_record = NULL;
+       if (g_wifi_scan_result == NULL) {
+               return DM_ERROR_NO_DATA;
+       }
+       /* Initialize pointer */
+       g_wifi_scan_iter = g_wifi_scan_result;
+
+       do {
+               curr_record = (dm_scan_info_t *)malloc(sizeof(dm_scan_info_t));
+               if (curr_record == NULL) {
+                       dm_conn_free_scan_result(result);
+                       return DM_ERROR_UNKNOWN;
+               }
+               if (!prev_record) {
+                       *result = curr_record;
+               } else {
+                       prev_record->next = curr_record;
+               }
+
+               memset(curr_record->ssid, 0x00, SLSI_SSID_LEN + 1);
+               memset(curr_record->bssid, 0x00, DM_BSSID_LEN);
+               curr_record->rssi = g_wifi_scan_iter->rssi;
+               strncpy(curr_record->ssid, (char *) g_wifi_scan_iter->ssid, strlen((const  char*)g_wifi_scan_iter->ssid));
+               strncpy(curr_record->bssid, (char *)g_wifi_scan_iter->bssid, strlen((const  char*)g_wifi_scan_iter->bssid));
+               prev_record = curr_record;
+               g_wifi_scan_iter = g_wifi_scan_iter->next;
+       } while (g_wifi_scan_iter != NULL);
+
+       curr_record->next = NULL;
+
+       return DM_ERROR_NONE;
+}
+
+int dm_conn_free_scan_result(dm_scan_info_t **result)
+{
+       dm_scan_info_t *curr_record;
+       dm_scan_info_t *next_record;
+
+       curr_record = *result;
+       while (curr_record != NULL) {
+               next_record = curr_record->next;
+               free(curr_record);
+               curr_record = next_record;
+       }
+
+       *result = NULL;
+       return DM_ERROR_NONE;
+}
+
+
+int dm_conn_wifi_scan(void)
+{
+       if (WiFiScanNetwork() == SLSI_STATUS_SUCCESS) {
+               WiFiFreeScanResults(&g_wifi_scan_result);
+               WiFiGetScanResults(&g_wifi_scan_result);
+               WiFiNetworkJoin((uint8_t *) CONFIG_DM_AP_SSID, strlen(CONFIG_DM_AP_SSID), \
+                                               NULL, (slsi_security_config_t *) getSecurityConfig(CONFIG_DM_AP_SECURITY, \
+                                                               CONFIG_DM_AP_PASS, SLSI_WIFI_STATION_IF));
+               return DM_ERROR_NONE;
+       }
+       return DM_ERROR_UNKNOWN;
+}
+
+int dm_conn_wifi_connect(conn_cb linkUpEvent, conn_cb linkDownEvent)
+{
+       uint8_t ret;
+       uint8_t result;
+
+       if (g_dm_connected == 1) {
+               dmdbg("Already, Init!\n");
+               return DM_ERROR_NONE;
+       }
+
+       dm_conn_register_linkup_cb(linkUpEvent);
+       dm_conn_register_linkdown_cb(linkDownEvent);
+
+       g_dm_connected = 0;
+       ret = WiFiIsConnected(&result, NULL);
+       if (ret == SLSI_STATUS_SUCCESS) {
+               dmdbg("Wi-Fi status - Already Connected : %d\n", result);
+               g_dm_connected = 1;
+               return 1;
+       } else if (ret != SLSI_STATUS_NOT_STARTED)
+               return DM_ERROR_UNKNOWN;
+
+
+       ret = WiFiStart(SLSI_WIFI_STATION_IF, NULL);
+       if (ret == SLSI_STATUS_SUCCESS) {
+               dmdbg("STA mode started\n");
+               ret = WiFiNetworkJoin((uint8_t *)CONFIG_DM_AP_SSID, strlen(CONFIG_DM_AP_SSID), \
+                                                         NULL, (slsi_security_config_t *) getSecurityConfig(CONFIG_DM_AP_SECURITY, CONFIG_DM_AP_PASS, SLSI_WIFI_STATION_IF));
+               sleep(1);
+               if (ret == SLSI_STATUS_SUCCESS) {
+                       dmdbg("Start doJoin with SSID %s\n", CONFIG_DM_AP_SSID);
+                       return DM_ERROR_NONE;
+               }
+               return DM_ERROR_UNKNOWN;
+       }
+       return DM_ERROR_UNKNOWN;
+}
+
+int dm_conn_wifi_disconnect(void)
+{
+       g_dm_connected = 0;
+       return DM_ERROR_NONE;
+}
+
+static int prv_dm_conn_dhcp(void)
+{
+       struct dhcpc_state state;
+       void *dhcp_handle;
+       int ret;
+
+       dhcp_handle = dhcpc_open(DM_NET_DEVNAME);
+       if (dhcp_handle == NULL) {
+               dmdbg("Invalid dhcp handle\n");
+               return -1;
+       }
+       ret = dhcpc_request(dhcp_handle, &state);
+       if (ret != OK) {
+               dhcpc_close(dhcp_handle);
+               return -1;
+       }
+
+       netlib_set_ipv4addr(DM_NET_DEVNAME, &state.ipaddr);
+       netlib_set_ipv4netmask(DM_NET_DEVNAME, &state.netmask);
+       netlib_set_dripv4addr(DM_NET_DEVNAME, &state.default_router);
+
+       dmdbg("IP address : %s ----\n", inet_ntoa(state.ipaddr));
+       return 1;
+}
+
+int dm_conn_dhcp_init(void)
+{
+       uint8_t wifi_status;
+       int8_t ret;
+
+       if (g_dm_connected == -1) {
+               dmdbg("First, Do Conn Init!\n");
+               return DM_ERROR_UNKNOWN;
+       }
+
+       if (g_dm_connected == 0) {
+               int waitTime = 10;
+               while (waitTime--) {
+                       ret = WiFiIsConnected(&wifi_status, NULL);
+                       dmdbg("retcode connect %d\n", ret);
+                       if (ret != SLSI_STATUS_SUCCESS) {
+                               dmdbg("Failed to WiFiIsConnected\n");
+                               return DM_ERROR_UNKNOWN;
+                       }
+
+                       if (wifi_status > 0) {
+                               g_dm_connected = 1;
+                               dmdbg("WiFi Connected!\n");
+                               int dhcp_ret = prv_dm_conn_dhcp();
+                               if (dhcp_ret == -1) {
+                                       dmdbg("Timeout fail to get ip address\n");
+                                       return DM_ERROR_TIMED_OUT;
+                               } else if (dhcp_ret == 0) {
+                                       dmdbg("No network interface\n");
+                                       return DM_ERROR_NOT_SUPPORTED;
+                               }
+                               dmdbg("DHCP done\n");
+                               break;
+                       }
+                       sleep(1);
+               }
+               if (waitTime <= 0) {
+                       dmdbg("WiFi is not working.\n");
+                       return DM_ERROR_UNKNOWN;
+               }
+       }
+
+       return DM_ERROR_NONE;
+}