You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gn...@apache.org on 2020/01/16 18:14:29 UTC

[incubator-nuttx-apps] branch pr16 updated: Wapi improvement (#16)

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

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


The following commit(s) were added to refs/heads/pr16 by this push:
     new f56f12e  Wapi improvement (#16)
f56f12e is described below

commit f56f12e97fea33974f5f5c4cca77a0c98f2cb439
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Fri Jan 17 02:14:23 2020 +0800

    Wapi improvement (#16)
    
    * wireless: add passphrase control
    * wireless: add disconnect control
---
 include/wireless/wapi.h         |  17 +++++++
 wireless/wapi/src/driver_wext.c |  63 ++++++++++++++++++++++++
 wireless/wapi/src/wapi.c        | 103 ++++++++++++++++++++++++++++++++--------
 wireless/wapi/src/wireless.c    |  11 +++++
 4 files changed, 173 insertions(+), 21 deletions(-)

diff --git a/include/wireless/wapi.h b/include/wireless/wapi.h
index 1844dcd..40ccc9d 100644
--- a/include/wireless/wapi.h
+++ b/include/wireless/wapi.h
@@ -277,6 +277,10 @@ EXTERN FAR const char *g_wapi_freq_flags[];
 
 EXTERN FAR const char *g_wapi_essid_flags[];
 
+/* Passphrase algorithm flag names. */
+
+EXTERN FAR const char *g_wapi_alg_flags[];
+
 /* Supported operation mode names. */
 
 EXTERN FAR const char *g_wapi_modes[];
@@ -703,6 +707,19 @@ int wpa_driver_wext_associate(FAR struct wpa_wconfig_s *wconfig);
 int wpa_driver_wext_set_auth_param(int sockfd, FAR const char *ifname,
                                    int idx, uint32_t value);
 
+/************************************************************************************
+ * Name: wpa_driver_wext_disconnect
+ *
+ * Description:
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ************************************************************************************/
+
+void wpa_driver_wext_disconnect(int sockfd, FAR const char *ifname);
+
 #undef EXTERN
 #ifdef __cplusplus
 }
diff --git a/wireless/wapi/src/driver_wext.c b/wireless/wapi/src/driver_wext.c
index debb082..b8644d8 100644
--- a/wireless/wapi/src/driver_wext.c
+++ b/wireless/wapi/src/driver_wext.c
@@ -268,3 +268,66 @@ int wpa_driver_wext_set_auth_param(int sockfd, FAR const char *ifname,
 
   return ret;
 }
+
+/************************************************************************************
+ * Name: wpa_driver_wext_disconnect
+ *
+ * Description:
+ *
+ * Input Parameters:
+ *
+ * Returned Value:
+ *
+ ************************************************************************************/
+
+void wpa_driver_wext_disconnect(int sockfd, FAR const char *ifname)
+{
+  uint8_t ssid[WAPI_ESSID_MAX_SIZE];
+  const struct ether_addr bssid =
+  {
+  };
+  struct iwreq iwr;
+  int i;
+
+  /*
+   * Only force-disconnect when the card is in infrastructure mode,
+   * otherwise the driver might interpret the cleared BSSID and random
+   * SSID as an attempt to create a new ad-hoc network.
+   */
+
+  memset(&iwr, 0, sizeof(iwr));
+  strncpy(iwr.ifr_name, ifname, IFNAMSIZ);
+
+  if (ioctl(sockfd, SIOCGIWMODE, (unsigned long)&iwr) < 0)
+    {
+      nerr("ioctl[SIOCGIWMODE]: %s\n", strerror(errno));
+      iwr.u.mode = IW_MODE_INFRA;
+    }
+
+  if (iwr.u.mode == IW_MODE_INFRA)
+    {
+      /* Clear the BSSID selection */
+
+      if (wapi_set_ap(sockfd, ifname, &bssid) < 0)
+        {
+          nerr("WEXT: Failed to clear BSSID " "selection on disconnect\n");
+        }
+
+      /*
+       * Set a random SSID to make sure the driver will not be trying
+       * to associate with something even if it does not understand
+       * SIOCSIWMLME commands (or tries to associate automatically
+       * after deauth/disassoc).
+       */
+
+      for (i = 0; i < WAPI_ESSID_MAX_SIZE; i++)
+        {
+          ssid[i] = rand() & 0xFF;
+        }
+
+      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/wapi.c b/wireless/wapi/src/wapi.c
index fd1b898..a992b4d 100644
--- a/wireless/wapi/src/wapi.c
+++ b/wireless/wapi/src/wapi.c
@@ -88,6 +88,9 @@ 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,
@@ -108,17 +111,19 @@ static void wapi_showusage(FAR const char *progname, int exitcode);
 
 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},
-  {"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, (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},
 };
 
 #define NCOMMANDS (sizeof(g_wapi_commands) / sizeof(struct wapi_command_s))
@@ -507,6 +512,54 @@ static void wapi_essid_cmd(int sock, FAR const char *ifname,
 }
 
 /****************************************************************************
+ * Name: wapi_psk_cmd
+ *
+ * Description:
+ *  Set the Passphrase
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+static void wapi_psk_cmd(int sock, FAR const char *ifname,
+                         FAR const char *passphrase, FAR const char *flagstr)
+{
+  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);
+
+  /* Set the Passphrase */
+
+  ret = wpa_driver_wext_set_key_ext(sock, ifname, alg_flag,
+                                    (FAR const uint8_t *)passphrase,
+                                    strlen(passphrase));
+  if (ret < 0)
+    {
+      WAPI_ERROR("ERROR: wpa_driver_wext_set_key_ext() failed: %d\n", ret);
+    }
+}
+
+/****************************************************************************
+ * Name: wapi_disconnect_cmd
+ *
+ * Description:
+ *   Disconnect the AP in the range using given ifname interface.
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+static void wapi_disconnect_cmd(int sock, FAR const char *ifname)
+{
+  wpa_driver_wext_disconnect(sock, ifname);
+}
+
+/****************************************************************************
  * Name: wapi_mode_cmd
  *
  * Description:
@@ -731,16 +784,18 @@ 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 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, "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, "\nFrequency Flags:\n");
@@ -755,6 +810,12 @@ static void wapi_showusage(FAR const char *progname, int exitcode)
       fprintf(stderr, "       [%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, "\nOperating Modes:\n");
   for (i = 0; g_wapi_modes[i]; i++)
     {
diff --git a/wireless/wapi/src/wireless.c b/wireless/wapi/src/wireless.c
index 6b2383d..f58b4dd 100644
--- a/wireless/wapi/src/wireless.c
+++ b/wireless/wapi/src/wireless.c
@@ -119,6 +119,17 @@ FAR const char *g_wapi_txpower_flags[] =
   NULL
 };
 
+/* Passphrase Algorithm */
+
+FAR const char *g_wapi_alg_flags[] =
+{
+  "WPA_ALG_NONE",
+  "WPA_ALG_WEP",
+  "WPA_ALG_TKIP",
+  "WPA_ALG_CCMP",
+  NULL
+};
+
 /****************************************************************************
  * Private Functions
  ****************************************************************************/