You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ag...@apache.org on 2020/04/03 12:29:29 UTC

[incubator-nuttx-apps] branch master updated (7c8c305 -> 7cb5bc3)

This is an automated email from the ASF dual-hosted git repository.

aguettouche pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git.


    from 7c8c305  CI: remove the additional pull docker container step
     new 6bafe90  wireless/wapi: independent scan and scan_results
     new df1d0e7  wireless/wapi: add save_config/reconnect support
     new 6ab29d4  wapi: skip associate if ssid is invalid
     new 7cb5bc3  wapi: fix nxstyle warning

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 include/wireless/wapi.h              |  46 ++-
 netutils/netinit/netinit.c           |  56 ++--
 netutils/netinit/netinit_associate.c |   8 +-
 wireless/wapi/src/driver_wext.c      | 160 +++++++++--
 wireless/wapi/src/util.c             |  31 ++-
 wireless/wapi/src/wapi.c             | 523 +++++++++++++++++++++--------------
 wireless/wapi/src/wireless.c         |  59 +++-
 7 files changed, 606 insertions(+), 277 deletions(-)


[incubator-nuttx-apps] 04/04: wapi: fix nxstyle warning

Posted by ag...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aguettouche pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git

commit 7cb5bc3b76d2c49795fc2663d6dfaf8d78e1b34b
Author: chao.an <an...@xiaomi.com>
AuthorDate: Fri Apr 3 13:59:50 2020 +0800

    wapi: fix nxstyle warning
    
    Signed-off-by: chao.an <an...@xiaomi.com>
---
 wireless/wapi/src/driver_wext.c | 16 +++++++++-------
 wireless/wapi/src/util.c        |  7 ++++---
 wireless/wapi/src/wapi.c        |  7 ++++---
 wireless/wapi/src/wireless.c    | 13 ++++++++-----
 4 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/wireless/wapi/src/driver_wext.c b/wireless/wapi/src/driver_wext.c
index 6f473ec..c4fbe14 100644
--- a/wireless/wapi/src/driver_wext.c
+++ b/wireless/wapi/src/driver_wext.c
@@ -6,8 +6,8 @@
  *   Author: Simon Piriou <sp...@gmail.com>
  *           Gregory Nutt <gn...@nuttx.org>
  *
- * Adapted for NuttX from the driver_ext.c of WPA suplicant written originally
- * by Jouni Malinen
+ * Adapted for NuttX from the driver_ext.c of WPA suplicant written
+ * originally by Jouni Malinen
  *
  *   Copyright (c) 2003-2015, Jouni Malinen <j...@w1.fi>
  *
@@ -41,10 +41,11 @@
  ****************************************************************************/
 
 /* This file implements a driver interface for the Linux Wireless Extensions.
- * When used with WE-18 or newer, this interface can be used as-is with number
- * of drivers. In addition to this, some of the common functions in this file
- * can be used by other driver interface implementations that use generic WE
- * ioctls, but require private ioctls for some of the functionality.
+ * When used with WE-18 or newer, this interface can be used as-is with
+ * number of drivers. In addition to this, some of the common functions
+ * in this file can be used by other driver interface implementations that
+ * use generic WE ioctls, but require private ioctls for some of the
+ * functionality.
  */
 
 /****************************************************************************
@@ -443,7 +444,8 @@ void wpa_driver_wext_disconnect(int sockfd, FAR const char *ifname)
           ssid[i] = rand() & 0xff;
         }
 
-      if (wapi_set_essid(sockfd, ifname, (FAR const char *)ssid, WAPI_ESSID_OFF) < 0)
+      if (wapi_set_essid(sockfd, ifname,
+                         (FAR const char *)ssid, WAPI_ESSID_OFF) < 0)
         {
           nerr("WEXT: Failed to set bogus " "SSID to disconnect\n");
         }
diff --git a/wireless/wapi/src/util.c b/wireless/wapi/src/util.c
index 2a51257..33008cc 100644
--- a/wireless/wapi/src/util.c
+++ b/wireless/wapi/src/util.c
@@ -10,10 +10,11 @@
  *   All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
+ * modification, are permitted provided that the following conditions
+ * are met:
  *
- *  - Redistributions of  source code must  retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
+ *  - Redistributions of  source code must  retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
  *
  *  - Redistributions in binary form must reproduce the above copyright
  *    notice, this list of  conditions and the  following disclaimer in the
diff --git a/wireless/wapi/src/wapi.c b/wireless/wapi/src/wapi.c
index eb7ebc7..c5dc085 100644
--- a/wireless/wapi/src/wapi.c
+++ b/wireless/wapi/src/wapi.c
@@ -11,10 +11,11 @@
  *   All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
+ * modification, are permitted provided that the following conditions
+ * are met:
  *
- *  - Redistributions of  source code must  retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
+ *  - Redistributions of  source code must  retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
  *
  *  - Redistributions in binary form must reproduce the above copyright
  *    notice, this list of  conditions and the  following disclaimer in the
diff --git a/wireless/wapi/src/wireless.c b/wireless/wapi/src/wireless.c
index ecb9ffb..f41c3bc 100644
--- a/wireless/wapi/src/wireless.c
+++ b/wireless/wapi/src/wireless.c
@@ -10,10 +10,11 @@
  *   All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
+ * modification, are permitted provided that the following conditions are
+ * met:
  *
- *  - Redistributions of  source code must  retain the above copyright notice,
- *    this list of conditions and the following disclaimer.
+ *  - Redistributions of  source code must  retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
  *
  *  - Redistributions in binary form must reproduce the above copyright
  *    notice, this list of  conditions and the  following disclaimer in the
@@ -151,7 +152,8 @@ static inline double wapi_freq2float(const struct iw_freq *freq)
  * Name: wapi_float2freq
  *
  * Description:
- *   Converts a floating point the our internal representation of frequencies.
+ *   Converts a floating point the our internal representation of
+ *   frequencies.
  *
  ****************************************************************************/
 
@@ -1061,7 +1063,8 @@ int wapi_get_txpower(int sock, FAR const char *ifname, FAR int *power,
         {
           *flag = WAPI_TXPOWER_MWATT;
         }
-      else if (IW_TXPOW_RELATIVE == (wrq.u.txpower.flags & IW_TXPOW_RELATIVE))
+      else if (IW_TXPOW_RELATIVE ==
+               (wrq.u.txpower.flags & IW_TXPOW_RELATIVE))
         {
           *flag = WAPI_TXPOWER_RELATIVE;
         }


[incubator-nuttx-apps] 03/04: wapi: skip associate if ssid is invalid

Posted by ag...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aguettouche pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git

commit 6ab29d4ffbba32d6a80884c6b90e8147c48b0517
Author: chao.an <an...@xiaomi.com>
AuthorDate: Fri Apr 3 13:30:45 2020 +0800

    wapi: skip associate if ssid is invalid
    
    Signed-off-by: chao.an <an...@xiaomi.com>
---
 netutils/netinit/netinit.c           | 56 +++++++++++++++++++-----------------
 netutils/netinit/netinit_associate.c |  8 ++++--
 2 files changed, 36 insertions(+), 28 deletions(-)

diff --git a/netutils/netinit/netinit.c b/netutils/netinit/netinit.c
index 1921655..0bc5346 100644
--- a/netutils/netinit/netinit.c
+++ b/netutils/netinit/netinit.c
@@ -411,17 +411,24 @@ static void netinit_net_bringup(void)
 {
 #ifdef CONFIG_NETINIT_DHCPC
   uint8_t mac[IFHWADDRLEN];
+  struct dhcpc_state ds;
   FAR void *handle;
 #endif
 
   /* Bring the network up. */
 
-  netlib_ifup(NET_DEVNAME);
+  if (netlib_ifup(NET_DEVNAME) < 0)
+    {
+      return;
+    }
 
 #ifdef CONFIG_WIRELESS_WAPI
   /* Associate the wlan with an access point. */
 
-  netinit_associate(NET_DEVNAME);
+  if (netinit_associate(NET_DEVNAME) < 0)
+    {
+      return;
+    }
 #endif
 
 #ifdef CONFIG_NET_ICMPv6_AUTOCONF
@@ -438,40 +445,37 @@ static void netinit_net_bringup(void)
   /* Set up the DHCPC modules */
 
   handle = dhcpc_open(NET_DEVNAME, &mac, IFHWADDRLEN);
+  if (handle == NULL)
+    {
+      return;
+    }
 
-  /* Get an IP address.  Note that there is no logic for renewing the IP
-   * address in this example.  The address should be renewed in
-   * ds.lease_time/2 seconds.
+  /* Get an IP address.  Note that there is no logic for renewing the
+   * IP address in this example. The address should be renewed in
+   * (ds.lease_time / 2) seconds.
    */
 
-  if (handle != NULL)
+  if (dhcpc_request(handle, &ds) == OK)
     {
-      struct dhcpc_state ds =
-      {
-      };
+      netlib_set_ipv4addr(NET_DEVNAME, &ds.ipaddr);
 
-      if (dhcpc_request(handle, &ds) == OK)
+      if (ds.netmask.s_addr != 0)
         {
-          netlib_set_ipv4addr(NET_DEVNAME, &ds.ipaddr);
-
-          if (ds.netmask.s_addr != 0)
-            {
-              netlib_set_ipv4netmask(NET_DEVNAME, &ds.netmask);
-            }
-
-          if (ds.default_router.s_addr != 0)
-            {
-              netlib_set_dripv4addr(NET_DEVNAME, &ds.default_router);
-            }
+          netlib_set_ipv4netmask(NET_DEVNAME, &ds.netmask);
+        }
 
-          if (ds.dnsaddr.s_addr != 0)
-            {
-              netlib_set_ipv4dnsaddr(&ds.dnsaddr);
-            }
+      if (ds.default_router.s_addr != 0)
+        {
+          netlib_set_dripv4addr(NET_DEVNAME, &ds.default_router);
         }
 
-      dhcpc_close(handle);
+      if (ds.dnsaddr.s_addr != 0)
+        {
+          netlib_set_ipv4dnsaddr(&ds.dnsaddr);
+        }
     }
+
+  dhcpc_close(handle);
 #endif
 
 #ifdef CONFIG_NETUTILS_NTPCLIENT
diff --git a/netutils/netinit/netinit_associate.c b/netutils/netinit/netinit_associate.c
index f225d03..1250109 100644
--- a/netutils/netinit/netinit_associate.c
+++ b/netutils/netinit/netinit_associate.c
@@ -41,6 +41,7 @@
 
 #include <unistd.h>
 #include <string.h>
+#include <errno.h>
 
 #include <nuttx/wireless/wireless.h>
 
@@ -60,7 +61,7 @@
 int netinit_associate(FAR const char *ifname)
 {
   struct wpa_wconfig_s conf;
-  int ret;
+  int ret = -EINVAL;
   FAR void *load;
 
   load = wapi_load_config(ifname, NULL, &conf);
@@ -77,7 +78,10 @@ int netinit_associate(FAR const char *ifname)
       conf.phraselen   = strlen(conf.passphrase);
     }
 
-  ret = wpa_driver_wext_associate(&conf);
+  if (conf.ssidlen > 0)
+    {
+      ret = wpa_driver_wext_associate(&conf);
+    }
 
   wapi_unload_config(load);
 


[incubator-nuttx-apps] 02/04: wireless/wapi: add save_config/reconnect support

Posted by ag...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aguettouche pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git

commit df1d0e73f8cee308dfde71061e1732f2fe5037ea
Author: chao.an <an...@xiaomi.com>
AuthorDate: Fri Apr 3 13:22:28 2020 +0800

    wireless/wapi: add save_config/reconnect support
    
    Signed-off-by: chao.an <an...@xiaomi.com>
---
 include/wireless/wapi.h         |  31 +++++++++
 wireless/wapi/src/driver_wext.c | 144 ++++++++++++++++++++++++++++++++++++----
 wireless/wapi/src/util.c        |  24 ++++---
 wireless/wapi/src/wapi.c        | 143 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 322 insertions(+), 20 deletions(-)

diff --git a/include/wireless/wapi.h b/include/wireless/wapi.h
index 6407590..af05e2d 100644
--- a/include/wireless/wapi.h
+++ b/include/wireless/wapi.h
@@ -748,6 +748,23 @@ int wpa_driver_wext_set_key_ext(int sockfd, FAR const char *ifname,
                                 size_t key_len);
 
 /****************************************************************************
+ * Name: wpa_driver_wext_get_key_ext
+ *
+ * Description:
+ *
+ * Input Parameters:
+ *   sockfd - Opened network socket
+ *   ifname - Interface name
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+int wpa_driver_wext_get_key_ext(int sockfd, FAR const char *ifname,
+                                enum wpa_alg_e *alg, FAR char *key,
+                                size_t *req_len);
+
+/****************************************************************************
  * Name: wpa_driver_wext_associate
  *
  * Description:
@@ -776,6 +793,20 @@ int wpa_driver_wext_set_auth_param(int sockfd, FAR const char *ifname,
                                    int idx, uint32_t value);
 
 /****************************************************************************
+ * Name: wpa_driver_wext_get_auth_param
+ *
+ * Description:
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+int wpa_driver_wext_get_auth_param(int sockfd, FAR const char *ifname,
+                                   int idx, uint32_t *value);
+
+/****************************************************************************
  * Name: wpa_driver_wext_disconnect
  *
  * Description:
diff --git a/wireless/wapi/src/driver_wext.c b/wireless/wapi/src/driver_wext.c
index 20e2b67..6f473ec 100644
--- a/wireless/wapi/src/driver_wext.c
+++ b/wireless/wapi/src/driver_wext.c
@@ -70,6 +70,76 @@
  ****************************************************************************/
 
 /****************************************************************************
+ * Name: wpa_driver_wext_get_key_ext
+ *
+ * Description:
+ *
+ * Input Parameters:
+ *   sockfd - Opened network socket
+ *   ifname - Interface name
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+int wpa_driver_wext_get_key_ext(int sockfd, FAR const char *ifname,
+                                enum wpa_alg_e *alg, FAR char *key,
+                                size_t *req_len)
+{
+  struct iw_encode_ext *ext;
+  struct iwreq iwr;
+  int ret;
+
+  ext = malloc(sizeof(*ext) + *req_len);
+  if (ext == NULL)
+    {
+      return -1;
+    }
+
+  memset(&iwr, 0, sizeof(iwr));
+  strncpy(iwr.ifr_name, ifname, IFNAMSIZ);
+
+  iwr.u.encoding.pointer = (caddr_t) ext;
+  iwr.u.encoding.length = sizeof(*ext) + *req_len;
+
+  ret = ioctl(sockfd, SIOCGIWENCODEEXT, (unsigned long)&iwr);
+  if (ret >= 0)
+    {
+      switch (ext->alg)
+        {
+          case IW_ENCODE_ALG_NONE:
+            *alg = WPA_ALG_NONE;
+            break;
+
+          case IW_ENCODE_ALG_WEP:
+            *alg = WPA_ALG_WEP;
+            break;
+
+          case IW_ENCODE_ALG_TKIP:
+            *alg = WPA_ALG_TKIP;
+            break;
+
+          case IW_ENCODE_ALG_CCMP:
+            *alg = WPA_ALG_CCMP;
+            break;
+
+          default:
+            free(ext);
+            return -1;
+        }
+
+     if (key && ext->key_len < *req_len)
+       {
+         memcpy(key, ext->key, ext->key_len);
+         *req_len = ext->key_len;
+       }
+  }
+
+  free(ext);
+  return ret;
+}
+
+/****************************************************************************
  * Name: wpa_driver_wext_set_key_ext
  *
  * Description:
@@ -82,7 +152,7 @@
  *
  ****************************************************************************/
 
-int wpa_driver_wext_set_key_ext(int sockfd,  FAR const char *ifname,
+int wpa_driver_wext_set_key_ext(int sockfd, FAR const char *ifname,
                                 enum wpa_alg_e alg, FAR const char *key,
                                 size_t key_len)
 {
@@ -208,16 +278,21 @@ int wpa_driver_wext_associate(FAR struct wpa_wconfig_s *wconfig)
       goto close_socket;
     }
 
-  ret = wpa_driver_wext_set_key_ext(sockfd, wconfig->ifname, wconfig->alg,
-                                    wconfig->passphrase, wconfig->phraselen);
-  if (ret < 0)
+  if (wconfig->phraselen > 0)
     {
-      nerr("ERROR: Fail set key: %d\n", ret);
-      ret = -1;
-      goto close_socket;
+      ret = wpa_driver_wext_set_key_ext(sockfd, wconfig->ifname,
+                                        wconfig->alg,
+                                        wconfig->passphrase,
+                                        wconfig->phraselen);
+      if (ret < 0)
+        {
+          nerr("ERROR: Fail set key: %d\n", ret);
+          goto close_socket;
+        }
     }
 
-  ret = wapi_set_essid(sockfd, wconfig->ifname, wconfig->ssid, WAPI_ESSID_ON);
+  ret = wapi_set_essid(sockfd, wconfig->ifname, wconfig->ssid,
+                       WAPI_ESSID_ON);
   if (ret < 0)
     {
       nerr("ERROR: Fail set ssid: %d\n", ret);
@@ -239,8 +314,11 @@ close_socket:
  *
  ****************************************************************************/
 
-int wpa_driver_wext_set_auth_param(int sockfd, FAR const char *ifname,
-                                   int idx, uint32_t value)
+static int wpa_driver_wext_process_auth_param(int sockfd,
+                                              FAR const char *ifname,
+                                              int idx,
+                                              uint32_t *value,
+                                              bool set)
 {
   struct iwreq iwr;
   int errcode;
@@ -251,9 +329,10 @@ int wpa_driver_wext_set_auth_param(int sockfd, FAR const char *ifname,
   memset(&iwr, 0, sizeof(iwr));
   strncpy(iwr.ifr_name, ifname, IFNAMSIZ);
   iwr.u.param.flags = idx & IW_AUTH_INDEX;
-  iwr.u.param.value = value;
+  iwr.u.param.value = set ? *value : 0;
 
-  if (ioctl(sockfd, SIOCSIWAUTH, (unsigned long)&iwr) < 0)
+  if (ioctl(sockfd, set ? SIOCSIWAUTH : SIOCGIWAUTH,
+            (unsigned long)&iwr) < 0)
     {
       errcode = errno;
       if (errcode != EOPNOTSUPP)
@@ -265,10 +344,51 @@ int wpa_driver_wext_set_auth_param(int sockfd, FAR const char *ifname,
       ret = errcode == EOPNOTSUPP ? -2 : -1;
     }
 
+  if (ret == 0 && !set)
+    {
+      *value = iwr.u.param.value;
+    }
+
   return ret;
 }
 
 /****************************************************************************
+ * Name: wpa_driver_wext_set_auth_param
+ *
+ * Description:
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+int wpa_driver_wext_set_auth_param(int sockfd, FAR const char *ifname,
+                                   int idx, uint32_t value)
+{
+  return wpa_driver_wext_process_auth_param(sockfd, ifname,
+                                            idx, &value, true);
+}
+
+/****************************************************************************
+ * Name: wpa_driver_wext_get_auth_param
+ *
+ * Description:
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ****************************************************************************/
+
+int wpa_driver_wext_get_auth_param(int sockfd, FAR const char *ifname,
+                                   int idx, uint32_t *value)
+{
+  return wpa_driver_wext_process_auth_param(sockfd, ifname,
+                                            idx, value, false);
+}
+
+/****************************************************************************
  * Name: wpa_driver_wext_disconnect
  *
  * Description:
diff --git a/wireless/wapi/src/util.c b/wireless/wapi/src/util.c
index 7b821ef..2a51257 100644
--- a/wireless/wapi/src/util.c
+++ b/wireless/wapi/src/util.c
@@ -63,6 +63,12 @@
 #define WAPI_IOCTL_COMMAND_NAMEBUFSIZ 24
 
 /****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+static char g_ioctl_command_namebuf[WAPI_IOCTL_COMMAND_NAMEBUFSIZ];
+
+/****************************************************************************
  * Private Functions
  ****************************************************************************/
 
@@ -135,7 +141,15 @@ static bool wapi_json_update(FAR cJSON *root,
         }
       else
         {
-          if (!strncmp(value, obj->valuestring, strlen(obj->valuestring)))
+          int len = strlen(obj->valuestring);
+          if (len > 0)
+            {
+              if (!strncmp(value, obj->valuestring, len))
+                {
+                  return false;
+                }
+            }
+          else if (len == 0 && value == NULL)
             {
               return false;
             }
@@ -159,12 +173,6 @@ static bool wapi_json_update(FAR cJSON *root,
  * Public Functions
  ****************************************************************************/
 
-static char g_ioctl_command_namebuf[WAPI_IOCTL_COMMAND_NAMEBUFSIZ];
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
 /****************************************************************************
  * Name: wapi_make_socket
  *
@@ -377,7 +385,7 @@ FAR void *wapi_load_config(FAR const char *ifname,
 
   conf->ifname     = ifname;
   conf->ssidlen    = strlen(conf->ssid);
-  conf->phraselen  = strlen(conf->passphrase);
+  conf->phraselen  = conf->passphrase ? strlen(conf->passphrase) : 0;
 
   return root;
 
diff --git a/wireless/wapi/src/wapi.c b/wireless/wapi/src/wapi.c
index e8a4577..eb7ebc7 100644
--- a/wireless/wapi/src/wapi.c
+++ b/wireless/wapi/src/wapi.c
@@ -47,6 +47,8 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
+#include "netutils/netlib.h"
+
 #include "wireless/wapi.h"
 #include "util.h"
 
@@ -91,6 +93,10 @@ static int wapi_bitrate_cmd      (int sock, int argc, FAR char **argv);
 static int wapi_txpower_cmd      (int sock, int argc, FAR char **argv);
 static int wapi_scan_results_cmd (int sock, int argc, FAR char **argv);
 static int wapi_scan_cmd         (int sock, int argc, FAR char **argv);
+#ifdef CONFIG_WIRELESS_WAPI_INITCONF
+static int wapi_reconnect_cmd    (int sock, int argc, FAR char **argv);
+static int wapi_save_config_cmd  (int sock, int argc, FAR char **argv);
+#endif
 
 /****************************************************************************
  * Private Data
@@ -112,6 +118,10 @@ static const struct wapi_command_s g_wapi_commands[] =
   {"ap",           2, 2, wapi_ap_cmd},
   {"bitrate",      3, 3, wapi_bitrate_cmd},
   {"txpower",      3, 3, wapi_txpower_cmd},
+#ifdef CONFIG_WIRELESS_WAPI_INITCONF
+  {"reconnect",    1, 1, wapi_reconnect_cmd},
+  {"save_config",  1, 1, wapi_save_config_cmd},
+#endif
 };
 
 /****************************************************************************
@@ -739,6 +749,135 @@ static int wapi_scan_cmd(int sock, int argc, FAR char **argv)
   return wapi_scan_results_cmd(sock, 1, argv);
 }
 
+#ifdef CONFIG_WIRELESS_WAPI_INITCONF
+
+/****************************************************************************
+ * Name: wapi_reconnect_cmd
+ *
+ * Description:
+ *   Reconnect the AP in the range using given ifname interface.
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+static int wapi_reconnect_cmd(int sock, int argc, FAR char **argv)
+{
+  struct wpa_wconfig_s conf;
+  FAR void *load;
+  int ret;
+
+  load = wapi_load_config(argv[0], NULL, &conf);
+  if (load == NULL)
+    {
+      return -1;
+    }
+
+  ret = wpa_driver_wext_associate(&conf);
+
+  wapi_unload_config(load);
+
+  return ret;
+}
+
+/****************************************************************************
+ * Name: wapi_save_config_cmd
+ *
+ * Description:
+ *   Scans available APs in the range using given ifname interface.
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+static int wapi_save_config_cmd(int sock, int argc, FAR char **argv)
+{
+  char essid[WAPI_ESSID_MAX_SIZE + 1];
+  enum wapi_essid_flag_e essid_flag;
+  struct wpa_wconfig_s conf;
+  uint8_t if_flags;
+  uint32_t value;
+  size_t psk_len;
+  char psk[32];
+  int ret;
+
+  ret = netlib_getifstatus(argv[0], &if_flags);
+  if (ret < 0)
+    {
+      return ret;
+    }
+
+  if (!IFF_IS_RUNNING(if_flags))
+    {
+      return -1;
+    }
+
+  psk_len = sizeof(psk);
+
+  memset(&conf, 0, sizeof(struct wpa_wconfig_s));
+  ret = wapi_get_mode(sock, argv[0], &conf.sta_mode);
+  if (ret < 0)
+    {
+      return ret;
+    }
+
+  memset(essid, 0, sizeof(essid));
+  ret = wapi_get_essid(sock, argv[0], essid, &essid_flag);
+  if (ret < 0)
+    {
+      return ret;
+    }
+
+  conf.ssid = essid;
+  conf.ssidlen = strnlen(essid, sizeof(essid));
+
+  memset(psk, 0, sizeof(psk));
+  ret = wpa_driver_wext_get_key_ext(sock,
+                                    argv[0],
+                                    &conf.alg,
+                                    psk,
+                                    &psk_len);
+  if (ret == 0)
+    {
+      conf.passphrase = psk;
+      conf.phraselen = psk_len;
+    }
+
+  ret = wpa_driver_wext_get_auth_param(sock,
+                                       argv[0],
+                                       IW_AUTH_WPA_VERSION,
+                                       &value);
+  if (ret < 0)
+    {
+      conf.auth_wpa = IW_AUTH_WPA_VERSION_WPA2;
+    }
+  else
+    {
+      conf.auth_wpa = value;
+    }
+
+  ret = wpa_driver_wext_get_auth_param(sock,
+                                       argv[0],
+                                       IW_AUTH_CIPHER_PAIRWISE,
+                                       &value);
+  if (ret < 0)
+    {
+      if (conf.phraselen > 0)
+        conf.cipher_mode = IW_AUTH_CIPHER_CCMP;
+      else
+        conf.cipher_mode = IW_AUTH_CIPHER_NONE;
+    }
+  else
+    {
+      conf.cipher_mode = value;
+    }
+
+  return wapi_save_config(argv[0], NULL, &conf);
+}
+#endif
+
 /****************************************************************************
  * Name: wapi_showusage
  *
@@ -775,6 +914,10 @@ static void wapi_showusage(FAR const char *progname, int exitcode)
                    progname);
   fprintf(stderr, "\t%s txpower      <ifname> <txpower>    <index/flag>\n",
                    progname);
+#ifdef CONFIG_WIRELESS_WAPI_INITCONF
+  fprintf(stderr, "\t%s reconnect    <ifname>\n", progname);
+  fprintf(stderr, "\t%s save_config  <ifname>\n", progname);
+#endif
   fprintf(stderr, "\t%s help\n", progname);
 
   fprintf(stderr, "\nFrequency Flags:\n");


[incubator-nuttx-apps] 01/04: wireless/wapi: independent scan and scan_results

Posted by ag...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aguettouche pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git

commit 6bafe90db449293465814e247eb321788b54234e
Author: chao.an <an...@xiaomi.com>
AuthorDate: Fri Apr 3 13:07:58 2020 +0800

    wireless/wapi: independent scan and scan_results
    
    add scan <ssid> support
    
    Signed-off-by: chao.an <an...@xiaomi.com>
---
 include/wireless/wapi.h      |  15 +-
 wireless/wapi/src/wapi.c     | 375 +++++++++++++++++++------------------------
 wireless/wapi/src/wireless.c |  46 +++++-
 3 files changed, 224 insertions(+), 212 deletions(-)

diff --git a/include/wireless/wapi.h b/include/wireless/wapi.h
index 5813c31..6407590 100644
--- a/include/wireless/wapi.h
+++ b/include/wireless/wapi.h
@@ -641,7 +641,7 @@ int wapi_make_socket(void);
  *
  ****************************************************************************/
 
-int wapi_scan_init(int sock, FAR const char *ifname);
+int wapi_scan_init(int sock, FAR const char *ifname, FAR const char *essid);
 
 /****************************************************************************
  * Name: wapi_scan_stat
@@ -670,6 +670,19 @@ int wapi_scan_stat(int sock, FAR const char *ifname);
 int wapi_scan_coll(int sock, FAR const char *ifname,
                    FAR struct wapi_list_s *aps);
 
+/****************************************************************************
+ * Name: wapi_scan_coll_free
+ *
+ * Description:
+ *   Free the scan results.
+ *
+ * Input Parameters:
+ *   aps - Release the collected struct wapi_scan_info_s.
+ *
+ ****************************************************************************/
+
+void wapi_scan_coll_free(FAR struct wapi_list_s *aps);
+
 #ifdef CONFIG_WIRELESS_WAPI_INITCONF
 /****************************************************************************
  * Name: wapi_load_config
diff --git a/wireless/wapi/src/wapi.c b/wireless/wapi/src/wapi.c
index 2953fd2..e8a4577 100644
--- a/wireless/wapi/src/wapi.c
+++ b/wireless/wapi/src/wapi.c
@@ -54,78 +54,70 @@
  * Private Types
  ****************************************************************************/
 
+/* Generic form of a command handler */
+
+typedef CODE int (*wapi_cmd_t)(int sock, int argc, FAR char **argv);
+
 /* Describes one command */
 
 struct wapi_command_s
 {
   FAR const char *name;
-  uint8_t noptions;
-  CODE void *handler;
+  uint8_t minargs;
+  uint8_t maxargs;
+  wapi_cmd_t handler;
 };
 
-/* Generic form of a command handler */
-
-typedef void (*cmd1_t)(int sock, FAR const char *arg1);
-typedef void (*cmd2_t)(int sock, FAR const char *arg1,
-                       FAR const char *arg2);
-typedef void (*cmd3_t)(int sock, FAR const char *arg1,
-                       FAR const char *arg2, FAR const char *arg3);
-
 /****************************************************************************
  * Private Function Prototypes
  ****************************************************************************/
 
 static int wapi_str2int(FAR const char *str);
 static double wapi_str2double(FAR const char *str);
-static unsigned int wapi_str2ndx(FAR const char *name, FAR const char **list);
-
-static void wapi_show_cmd(int sock, FAR const char *ifname);
-static void wapi_ip_cmd(int sock, FAR const char *ifname,
-                        FAR const char *addrstr);
-static void wapi_mask_cmd(int sock, FAR const char *ifname,
-                          FAR const char *maskstr);
-static void wapi_freq_cmd(int sock, FAR const char *ifname,
-                          FAR const char *freqstr, FAR const char *flagstr);
-static void wapi_essid_cmd(int sock, FAR const char *ifname,
-                           FAR const char *essid, FAR const char *flagstr);
-static void wapi_psk_cmd(int sock, FAR const char *ifname,
-                         FAR const char *passphrase, FAR const char *flagstr);
-static void wapi_disconnect_cmd(int sock, FAR const char *ifname);
-static void wapi_mode_cmd(int sock, FAR const char *ifname,
-                          FAR const char *modestr);
-static void wapi_ap_cmd(int sock, FAR const char *ifname,
-                        FAR const char *macstr);
-static void wapi_bitrate_cmd(int sock, FAR const char *ifname,
-                             FAR const char *ratestr,
-                             FAR const char *flagstr);
-static void wapi_txpower_cmd(int sock, FAR const char *ifname,
-                             FAR const char *pwrstr,
-                             FAR const char *flagstr);
-static void wapi_scan_cmd(int sock, FAR const char *ifname);
-
+static unsigned int wapi_str2ndx(FAR const char *name,
+                                 FAR const char **list);
 static void wapi_showusage(FAR const char *progname, int exitcode);
 
+static int wapi_show_cmd         (int sock, int argc, FAR char **argv);
+static int wapi_ip_cmd           (int sock, int argc, FAR char **argv);
+static int wapi_mask_cmd         (int sock, int argc, FAR char **argv);
+static int wapi_freq_cmd         (int sock, int argc, FAR char **argv);
+static int wapi_essid_cmd        (int sock, int argc, FAR char **argv);
+static int wapi_psk_cmd          (int sock, int argc, FAR char **argv);
+static int wapi_disconnect_cmd   (int sock, int argc, FAR char **argv);
+static int wapi_mode_cmd         (int sock, int argc, FAR char **argv);
+static int wapi_ap_cmd           (int sock, int argc, FAR char **argv);
+static int wapi_bitrate_cmd      (int sock, int argc, FAR char **argv);
+static int wapi_txpower_cmd      (int sock, int argc, FAR char **argv);
+static int wapi_scan_results_cmd (int sock, int argc, FAR char **argv);
+static int wapi_scan_cmd         (int sock, int argc, FAR char **argv);
+
 /****************************************************************************
  * Private Data
  ****************************************************************************/
 
 static const struct wapi_command_s g_wapi_commands[] =
 {
-  {"help",       0, (CODE void *)NULL},
-  {"show",       1, (CODE void *)wapi_show_cmd},
-  {"scan",       1, (CODE void *)wapi_scan_cmd},
-  {"ip",         2, (CODE void *)wapi_ip_cmd},
-  {"mask",       2, (CODE void *)wapi_mask_cmd},
-  {"freq",       3, (CODE void *)wapi_freq_cmd},
-  {"essid",      3, (CODE void *)wapi_essid_cmd},
-  {"psk",        3, (CODE void *)wapi_psk_cmd},
-  {"disconnect", 1, (CODE void *)wapi_disconnect_cmd},
-  {"mode",       2, (CODE void *)wapi_mode_cmd},
-  {"ap",         2, (CODE void *)wapi_ap_cmd},
-  {"bitrate",    3, (CODE void *)wapi_bitrate_cmd},
-  {"txpower",    3, (CODE void *)wapi_txpower_cmd},
+  {"help",         0, 0, NULL},
+  {"show",         1, 1, wapi_show_cmd},
+  {"scan",         1, 2, wapi_scan_cmd},
+  {"scan_results", 1, 1, wapi_scan_results_cmd},
+  {"ip",           2, 2, wapi_ip_cmd},
+  {"mask",         2, 2, wapi_mask_cmd},
+  {"freq",         3, 3, wapi_freq_cmd},
+  {"essid",        3, 3, wapi_essid_cmd},
+  {"psk",          3, 3, wapi_psk_cmd},
+  {"disconnect",   1, 1, wapi_disconnect_cmd},
+  {"mode",         2, 2, wapi_mode_cmd},
+  {"ap",           2, 2, wapi_ap_cmd},
+  {"bitrate",      3, 3, wapi_bitrate_cmd},
+  {"txpower",      3, 3, wapi_txpower_cmd},
 };
 
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
 #define NCOMMANDS (sizeof(g_wapi_commands) / sizeof(struct wapi_command_s))
 
 /****************************************************************************
@@ -235,8 +227,9 @@ static unsigned int wapi_str2ndx(FAR const char *name, FAR const char **list)
  *
  ****************************************************************************/
 
-static void wapi_show_cmd(int sock, FAR const char *ifname)
+static int wapi_show_cmd(int sock, int argc, FAR char **argv)
 {
+  FAR const char *ifname = argv[0];
   struct in_addr addr;
 
   double freq;
@@ -266,6 +259,7 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
   if (ret < 0)
     {
       WAPI_ERROR("ERROR: wapi_get_ip() failed: %d\n", ret);
+      return ret;
     }
   else
     {
@@ -279,6 +273,7 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
   if (ret < 0)
     {
       WAPI_ERROR("ERROR: wapi_get_netmask() failed: %d\n", ret);
+      return ret;
     }
   else
     {
@@ -291,6 +286,7 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
   if (ret < 0)
     {
       WAPI_ERROR("ERROR: wapi_get_freq() failed: %d\n", ret);
+      return ret;
     }
   else
     {
@@ -304,6 +300,7 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
       if (ret < 0)
         {
           WAPI_ERROR("ERROR: wapi_freq2chan() failed: %d\n", ret);
+          return ret;
         }
       else
         {
@@ -314,6 +311,7 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
       if (ret < 0)
         {
           WAPI_ERROR("ERROR: wapi_chan2freq() failed: %d\n", ret);
+          return ret;
         }
       else
         {
@@ -327,6 +325,7 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
   if (ret < 0)
     {
       WAPI_ERROR("ERROR: wapi_get_essid() failed: %d\n", ret);
+      return ret;
     }
   else
     {
@@ -340,6 +339,7 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
   if (ret < 0)
     {
       WAPI_ERROR("ERROR: wapi_get_mode() failed: %d\n", ret);
+      return ret;
     }
   else
     {
@@ -352,6 +352,7 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
   if (ret < 0)
     {
       WAPI_ERROR("ERROR: wapi_get_ap() failed: %d\n", ret);
+      return ret;
     }
   else
     {
@@ -367,6 +368,7 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
   if (ret < 0)
     {
       WAPI_ERROR("ERROR: wapi_get_bitrate() failed: %d\n", ret);
+      return ret;
     }
   else
     {
@@ -380,12 +382,15 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
   if (ret < 0)
     {
       WAPI_ERROR("ERROR: wapi_get_txpower() failed: %d\n", ret);
+      return ret;
     }
   else
     {
       printf("  TxPower: %d\n", txpower);
       printf("     Flag: %s\n", g_wapi_txpower_flags[txpower_flag]);
     }
+
+  return ret;
 }
 
 /****************************************************************************
@@ -399,23 +404,17 @@ static void wapi_show_cmd(int sock, FAR const char *ifname)
  *
  ****************************************************************************/
 
-static void wapi_ip_cmd(int sock, FAR const char *ifname,
-                        FAR const char *addrstr)
+static int wapi_ip_cmd(int sock, int argc, FAR char **argv)
 {
   struct in_addr addr;
-  int ret;
 
   /* Format the request */
 
-  addr.s_addr = inet_addr(addrstr);
+  addr.s_addr = inet_addr(argv[1]);
 
   /* Set the IP address */
 
-  ret = wapi_set_ip(sock, ifname, &addr);
-  if (ret < 0)
-    {
-      WAPI_ERROR("ERROR: wapi_set_ip() failed: %d\n", ret);
-    }
+  return wapi_set_ip(sock, argv[0], &addr);
 }
 
 /****************************************************************************
@@ -429,23 +428,17 @@ static void wapi_ip_cmd(int sock, FAR const char *ifname,
  *
  ****************************************************************************/
 
-static void wapi_mask_cmd(int sock, FAR const char *ifname,
-                          FAR const char *maskstr)
+static int wapi_mask_cmd(int sock, int argc, FAR char **argv)
 {
   struct in_addr addr;
-  int ret;
 
   /* Format the request */
 
-  addr.s_addr = inet_addr(maskstr);
+  addr.s_addr = inet_addr(argv[1]);
 
   /* Set the network mask */
 
-  ret = wapi_set_netmask(sock, ifname, &addr);
-  if (ret < 0)
-    {
-      WAPI_ERROR("ERROR: wapi_set_netmask() failed: %d\n", ret);
-    }
+  return wapi_set_netmask(sock, argv[0], &addr);
 }
 
 /****************************************************************************
@@ -459,25 +452,20 @@ static void wapi_mask_cmd(int sock, FAR const char *ifname,
  *
  ****************************************************************************/
 
-static void wapi_freq_cmd(int sock, FAR const char *ifname,
-                          FAR const char *freqstr, FAR const char *flagstr)
+static int wapi_freq_cmd(int sock, int argc, FAR char **argv)
 {
   double frequency;
   enum wapi_freq_flag_e freq_flag;
-  int ret;
 
   /* Convert input strings to values */
 
-  frequency = wapi_str2double(freqstr);
-  freq_flag = (enum wapi_freq_flag_e)wapi_str2ndx(flagstr, g_wapi_freq_flags);
+  frequency = wapi_str2double(argv[1]);
+  freq_flag = (enum wapi_freq_flag_e)wapi_str2ndx(argv[2],
+                                                  g_wapi_freq_flags);
 
   /* Set the frequency */
 
-  ret = wapi_set_freq(sock, ifname, frequency, freq_flag);
-  if (ret < 0)
-    {
-      WAPI_ERROR("ERROR: \nwapi_set_freq() failed: %d\n", ret);
-    }
+  return wapi_set_freq(sock, argv[0], frequency, freq_flag);
 }
 
 /****************************************************************************
@@ -491,24 +479,18 @@ static void wapi_freq_cmd(int sock, FAR const char *ifname,
  *
  ****************************************************************************/
 
-static void wapi_essid_cmd(int sock, FAR const char *ifname,
-                           FAR const char *essid, FAR const char *flagstr)
+static int wapi_essid_cmd(int sock, int argc, FAR char **argv)
 {
   enum wapi_essid_flag_e essid_flag;
-  int ret;
 
   /* Convert input strings to values */
 
   essid_flag = (enum wapi_essid_flag_e)
-    wapi_str2ndx(flagstr, g_wapi_essid_flags);
+    wapi_str2ndx(argv[2], g_wapi_essid_flags);
 
   /* Set the ESSID */
 
-  ret = wapi_set_essid(sock, ifname, essid, essid_flag);
-  if (ret < 0)
-    {
-      WAPI_ERROR("ERROR: wapi_set_essid() failed: %d\n", ret);
-    }
+  return wapi_set_essid(sock, argv[0], argv[1], essid_flag);
 }
 
 /****************************************************************************
@@ -522,24 +504,18 @@ static void wapi_essid_cmd(int sock, FAR const char *ifname,
  *
  ****************************************************************************/
 
-static void wapi_psk_cmd(int sock, FAR const char *ifname,
-                         FAR const char *passphrase, FAR const char *flagstr)
+static int wapi_psk_cmd(int sock, int argc, FAR char **argv)
 {
   enum wpa_alg_e alg_flag;
-  int ret;
 
   /* Convert input strings to values */
 
-  alg_flag = (enum wpa_alg_e)wapi_str2ndx(flagstr, g_wapi_alg_flags);
+  alg_flag = (enum wpa_alg_e)wapi_str2ndx(argv[2], g_wapi_alg_flags);
 
   /* Set the Passphrase */
 
-  ret = wpa_driver_wext_set_key_ext(sock, ifname, alg_flag,
-                                    passphrase, strlen(passphrase));
-  if (ret < 0)
-    {
-      WAPI_ERROR("ERROR: wpa_driver_wext_set_key_ext() failed: %d\n", ret);
-    }
+  return wpa_driver_wext_set_key_ext(sock, argv[0], alg_flag,
+                                     argv[1], strlen(argv[1]));
 }
 
 /****************************************************************************
@@ -553,9 +529,11 @@ static void wapi_psk_cmd(int sock, FAR const char *ifname,
  *
  ****************************************************************************/
 
-static void wapi_disconnect_cmd(int sock, FAR const char *ifname)
+static int wapi_disconnect_cmd(int sock, int argc, FAR char **argv)
 {
-  wpa_driver_wext_disconnect(sock, ifname);
+  wpa_driver_wext_disconnect(sock, argv[0]);
+
+  return 0;
 }
 
 /****************************************************************************
@@ -569,23 +547,17 @@ static void wapi_disconnect_cmd(int sock, FAR const char *ifname)
  *
  ****************************************************************************/
 
-static void wapi_mode_cmd(int sock, FAR const char *ifname,
-                          FAR const char *modestr)
+static int wapi_mode_cmd(int sock, int argc, FAR char **argv)
 {
   enum wapi_mode_e mode;
-  int ret;
 
   /* Convert input strings to values */
 
-  mode = (enum wapi_mode_e)wapi_str2ndx(modestr, g_wapi_modes);
+  mode = (enum wapi_mode_e)wapi_str2ndx(argv[1], g_wapi_modes);
 
   /* Set operating mode */
 
-  ret = wapi_set_mode(sock, ifname, mode);
-  if (ret < 0)
-    {
-      WAPI_ERROR("ERROR: \nwapi_set_mode() failed: %d\n", ret);
-    }
+  return wapi_set_mode(sock, argv[0], mode);
 }
 
 /****************************************************************************
@@ -599,26 +571,20 @@ static void wapi_mode_cmd(int sock, FAR const char *ifname,
  *
  ****************************************************************************/
 
-static void wapi_ap_cmd(int sock, FAR const char *ifname,
-                        FAR const char *macstr)
+static int wapi_ap_cmd(int sock, int argc, FAR char **argv)
 {
   struct ether_addr ap;
-  int ret;
 
   /* Convert input strings to values */
 
-  sscanf(macstr, "%02x:%02x:%02x:%02x:%02x:%02x",
+  sscanf(argv[1], "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx",
          &ap.ether_addr_octet[0], &ap.ether_addr_octet[1],
          &ap.ether_addr_octet[2], &ap.ether_addr_octet[3],
          &ap.ether_addr_octet[4], &ap.ether_addr_octet[5]);
 
   /* Set ap */
 
-  ret = wapi_set_ap(sock, ifname, &ap);
-  if (ret < 0)
-    {
-      WAPI_ERROR("ERROR: \nwapi_set_ap() failed: %d\n", ret);
-    }
+  return wapi_set_ap(sock, argv[0], &ap);
 }
 
 /****************************************************************************
@@ -632,27 +598,20 @@ static void wapi_ap_cmd(int sock, FAR const char *ifname,
  *
  ****************************************************************************/
 
-static void wapi_bitrate_cmd(int sock, FAR const char *ifname,
-                             FAR const char *ratestr, FAR const char *flagstr)
-
+static int wapi_bitrate_cmd(int sock, int argc, FAR char **argv)
 {
   enum wapi_bitrate_flag_e bitrate_flag;
   int bitrate;
-  int ret;
 
   /* Convert input strings to values */
 
-  bitrate      = wapi_str2int(ratestr);
+  bitrate      = wapi_str2int(argv[1]);
   bitrate_flag = (enum wapi_bitrate_flag_e)
-    wapi_str2ndx(flagstr, g_wapi_bitrate_flags);
+    wapi_str2ndx(argv[2], g_wapi_bitrate_flags);
 
   /* Set bitrate */
 
-  ret = wapi_set_bitrate(sock, ifname, bitrate, bitrate_flag);
-  if (ret < 0)
-    {
-      WAPI_ERROR("ERROR: \nwapi_set_bitrate() failed: %d\n", ret);
-    }
+  return wapi_set_bitrate(sock, argv[0], bitrate, bitrate_flag);
 }
 
 /****************************************************************************
@@ -666,82 +625,71 @@ static void wapi_bitrate_cmd(int sock, FAR const char *ifname,
  *
  ****************************************************************************/
 
-static void wapi_txpower_cmd(int sock, FAR const char *ifname,
-                             FAR const char *pwrstr, FAR const char *flagstr)
+static int wapi_txpower_cmd(int sock, int argc, FAR char **argv)
 {
   enum wapi_txpower_flag_e txpower_flag;
   int txpower;
-  int ret;
 
   /* Convert input strings to values */
 
-  txpower      = wapi_str2int(pwrstr);
+  txpower      = wapi_str2int(argv[1]);
   txpower_flag = (enum wapi_txpower_flag_e)
-    wapi_str2ndx(flagstr, g_wapi_txpower_flags);
+    wapi_str2ndx(argv[2], g_wapi_txpower_flags);
 
   /* Set txpower */
 
-  ret = wapi_set_txpower(sock, ifname, txpower, txpower_flag);
-  if (ret < 0)
-    {
-      WAPI_ERROR("ERROR: \nwapi_set_txpower() failed: %d\n", ret);
-    }
+  return wapi_set_txpower(sock, argv[0], txpower, txpower_flag);
 }
 
 /****************************************************************************
- * Name: wapi_scan_cmd
+ * Name: wapi_scan_results_cmd
  *
  * Description:
- *   Scans available APs in the range using given ifname interface.
+ *   Print the scan results.
  *
  * Returned Value:
  *   None
  *
  ****************************************************************************/
 
-static void wapi_scan_cmd(int sock, FAR const char *ifname)
+static int wapi_scan_results_cmd(int sock, int argc, FAR char **argv)
 {
-  int sleepdur = 1;
-  int sleeptries = 5;
+  int sleepdur = 200 * 1000;
+  int sleeptries = 25;
   struct wapi_list_s list;
   FAR struct wapi_scan_info_s *info;
   int ret;
 
-  /* Start scan */
-
-  ret = wapi_scan_init(sock, ifname);
-  if (ret < 0)
-    {
-      WAPI_ERROR("ERROR: wapi_scan_init() failed: %d\n", ret);
-      return;
-    }
-
   /* Wait for completion */
 
   do
     {
-      sleep(sleepdur);
-      ret = wapi_scan_stat(sock, ifname);
+      ret = wapi_scan_stat(sock, argv[0]);
       if (ret < 0)
         {
           WAPI_ERROR("ERROR: wapi_scan_stat() failed: %d, sleeptries: %d\n",
                       ret, sleeptries);
         }
+      else if (ret == 1)
+        {
+          usleep(sleepdur);
+        }
     }
   while (--sleeptries > 0 && ret > 0);
 
   if (ret < 0)
     {
-      return;
+      return ret;
     }
 
   /* Collect results */
 
   bzero(&list, sizeof(struct wapi_list_s));
-  ret = wapi_scan_coll(sock, ifname, &list);
+  ret = wapi_scan_coll(sock, argv[0], &list);
   if (ret < 0)
     {
       WAPI_ERROR("ERROR: wapi_scan_coll() failed: %d\n", ret);
+      return ret;
     }
 
   /* Print found aps */
@@ -758,15 +706,37 @@ static void wapi_scan_cmd(int sock, FAR const char *ifname)
 
   /* Free ap list */
 
-  info = list.head.scan;
-  while (info)
-    {
-      FAR struct wapi_scan_info_s *temp;
+  wapi_scan_coll_free(&list);
+  return 0;
+}
 
-      temp = info->next;
-      free(info);
-      info = temp;
+/****************************************************************************
+ * Name: wapi_scan_cmd
+ *
+ * Description:
+ *   Scans available APs in the range using given ifname interface.
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+static int wapi_scan_cmd(int sock, int argc, FAR char **argv)
+{
+  FAR const char *essid;
+  int ret;
+
+  essid = argc > 1 ? argv[1] : NULL;
+
+  /* Start scan */
+
+  ret = wapi_scan_init(sock, argv[0], essid);
+  if (ret < 0)
+    {
+      return ret;
     }
+
+  return wapi_scan_results_cmd(sock, 1, argv);
 }
 
 /****************************************************************************
@@ -784,61 +754,63 @@ static void wapi_showusage(FAR const char *progname, int exitcode)
 {
   int i;
 
-  fprintf(stderr, "Usage: %s show       <ifname>\n", progname);
-  fprintf(stderr, "       %s scan       <ifname>\n", progname);
-  fprintf(stderr, "       %s ip         <ifname> <IP address>\n", progname);
-  fprintf(stderr, "       %s mask       <ifname> <mask>\n", progname);
-  fprintf(stderr, "       %s freq       <ifname> <frequency>  <index/flag>\n",
-          progname);
-  fprintf(stderr, "       %s essid      <ifname> <essid>      <index/flag>\n",
-          progname);
-  fprintf(stderr, "       %s psk        <ifname> <passphrase> <index/flag>\n",
-          progname);
-  fprintf(stderr, "       %s disconnect <ifname>\n", progname);
-  fprintf(stderr, "       %s mode       <ifname> <ifname>     <index/mode>\n",
-          progname);
-  fprintf(stderr, "       %s ap         <ifname> <ifname>     <MAC address>\n",
-          progname);
-  fprintf(stderr, "       %s bitrate    <ifname> <bitrate>    <index/flag>\n",
-          progname);
-  fprintf(stderr, "       %s txpower    <ifname> <txpower>    <index/flag>\n",
-          progname);
-  fprintf(stderr, "       %s help\n", progname);
+  fprintf(stderr, "Usage:\n");
+  fprintf(stderr, "\t%s show         <ifname>\n", progname);
+  fprintf(stderr, "\t%s scan         <ifname>\n", progname);
+  fprintf(stderr, "\t%s scan_results <ifname>\n", progname);
+  fprintf(stderr, "\t%s ip           <ifname> <IP address>\n", progname);
+  fprintf(stderr, "\t%s mask         <ifname> <mask>\n", progname);
+  fprintf(stderr, "\t%s freq         <ifname> <frequency>  <index/flag>\n",
+                   progname);
+  fprintf(stderr, "\t%s essid        <ifname> <essid>      <index/flag>\n",
+                   progname);
+  fprintf(stderr, "\t%s psk          <ifname> <passphrase> <index/flag>\n",
+                   progname);
+  fprintf(stderr, "\t%s disconnect   <ifname>\n", progname);
+  fprintf(stderr, "\t%s mode         <ifname> <ifname>     <index/mode>\n",
+                   progname);
+  fprintf(stderr, "\t%s ap           <ifname> <ifname>     <MAC address>\n",
+                   progname);
+  fprintf(stderr, "\t%s bitrate      <ifname> <bitrate>    <index/flag>\n",
+                   progname);
+  fprintf(stderr, "\t%s txpower      <ifname> <txpower>    <index/flag>\n",
+                   progname);
+  fprintf(stderr, "\t%s help\n", progname);
 
   fprintf(stderr, "\nFrequency Flags:\n");
   for (i = 0; g_wapi_freq_flags[i]; i++)
     {
-      fprintf(stderr, "       [%d] %s\n", i, g_wapi_freq_flags[i]);
+      fprintf(stderr, "\t[%d] %s\n", i, g_wapi_freq_flags[i]);
     }
 
   fprintf(stderr, "\nESSID Flags:\n");
   for (i = 0; g_wapi_essid_flags[i]; i++)
     {
-      fprintf(stderr, "       [%d] %s\n", i, g_wapi_essid_flags[i]);
+      fprintf(stderr, "\t[%d] %s\n", i, g_wapi_essid_flags[i]);
     }
 
   fprintf(stderr, "\nPassphrase algorithm Flags:\n");
   for (i = 0; g_wapi_alg_flags[i]; i++)
     {
-      fprintf(stderr, "       [%d] %s\n", i, g_wapi_alg_flags[i]);
+      fprintf(stderr, "\t[%d] %s\n", i, g_wapi_alg_flags[i]);
     }
 
   fprintf(stderr, "\nOperating Modes:\n");
   for (i = 0; g_wapi_modes[i]; i++)
     {
-      fprintf(stderr, "       [%d] %s\n", i, g_wapi_modes[i]);
+      fprintf(stderr, "\t[%d] %s\n", i, g_wapi_modes[i]);
     }
 
   fprintf(stderr, "\nBitrate Flags:\n");
   for (i = 0; g_wapi_bitrate_flags[i]; i++)
     {
-      fprintf(stderr, "       [%d] %s\n", i, g_wapi_bitrate_flags[i]);
+      fprintf(stderr, "\t[%d] %s\n", i, g_wapi_bitrate_flags[i]);
     }
 
   fprintf(stderr, "\nTX power Flags:\n");
   for (i = 0; g_wapi_txpower_flags[i]; i++)
     {
-      fprintf(stderr, "       [%d] %s\n", i, g_wapi_txpower_flags[i]);
+      fprintf(stderr, "\t[%d] %s\n", i, g_wapi_txpower_flags[i]);
     }
 
   exit(exitcode);
@@ -884,11 +856,11 @@ int main(int argc, FAR char *argv[])
       wapi_showusage(argv[0], EXIT_FAILURE);
     }
 
-  if (wapicmd->noptions + 2 < argc)
+  if (wapicmd->maxargs + 2 < argc)
     {
       WAPI_ERROR("ERROR: Garbage at end of command ignored\n");
     }
-  else if (wapicmd->noptions + 2 > argc)
+  else if (wapicmd->minargs + 2 > argc)
     {
       WAPI_ERROR("ERROR: Missing required command options: %s\n",
                  cmdname);
@@ -913,26 +885,9 @@ int main(int argc, FAR char *argv[])
       return EXIT_FAILURE;
     }
 
-  /* Dispatch the command handling */
-
-  switch (wapicmd->noptions)
+  if (wapicmd->handler(sock, argc - 2, argc == 2 ? NULL : &argv[2]) < 0)
     {
-      default:
-      case 0:
-        WAPI_ERROR("ERROR: Internal craziness\n");
-        wapi_showusage(argv[0], EXIT_FAILURE);
-
-      case 1:
-        ((cmd1_t)wapicmd->handler)(sock, argv[2]);
-        break;
-
-      case 2:
-        ((cmd2_t)wapicmd->handler)(sock, argv[2], argv[3]);
-        break;
-
-      case 3:
-        ((cmd3_t)wapicmd->handler)(sock, argv[2], argv[3], argv[4]);
-        break;
+      WAPI_ERROR("ERROR: Process command (%s) failed.\n", cmdname);
     }
 
   /* Close communication socket */
diff --git a/wireless/wapi/src/wireless.c b/wireless/wapi/src/wireless.c
index 293c7fa..ecb9ffb 100644
--- a/wireless/wapi/src/wireless.c
+++ b/wireless/wapi/src/wireless.c
@@ -1143,14 +1143,28 @@ int wapi_set_txpower(int sock, FAR const char *ifname, int power,
  *
  ****************************************************************************/
 
-int wapi_scan_init(int sock, const char *ifname)
+int wapi_scan_init(int sock, const char *ifname, const char *essid)
 {
+  struct iw_scan_req req;
   struct iwreq wrq =
   {
   };
 
+  size_t essid_len;
   int ret;
 
+  if (essid && (essid_len = strlen(essid)) > 0)
+    {
+      memset(&req, 0, sizeof(req));
+      req.essid_len       = essid_len;
+      req.bssid.sa_family = ARPHRD_ETHER;
+      memset(req.bssid.sa_data, 0xff, IFHWADDRLEN);
+      memcpy(req.essid, essid, essid_len);
+      wrq.u.data.pointer  = (caddr_t)&req;
+      wrq.u.data.length   = sizeof(req);
+      wrq.u.data.flags    = IW_SCAN_THIS_ESSID;
+    }
+
   strncpy(wrq.ifr_name, ifname, IFNAMSIZ);
   ret = ioctl(sock, SIOCSIWSCAN, (unsigned long)((uintptr_t)&wrq));
   if (ret < 0)
@@ -1319,3 +1333,33 @@ alloc:
   free(buf);
   return ret;
 }
+
+/****************************************************************************
+ * Name: wapi_scan_coll_free
+ *
+ * Description:
+ *   Free the scan results.
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+void wapi_scan_coll_free(FAR struct wapi_list_s *list)
+{
+  FAR struct wapi_scan_info_s *temp;
+  FAR struct wapi_scan_info_s *info;
+
+  if (list == NULL)
+    {
+      return;
+    }
+
+  info = list->head.scan;
+  while (info)
+    {
+      temp = info->next;
+      free(info);
+      info = temp;
+    }
+}