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
****************************************************************************/