Author: Gregory Nutt <gnutt@nuttx.org>

Run all .c and .h files in last PR through nxstyle and fix all complaints.

Author: Xiang Xiao <xiaoxiang@xiaomi.com>

    Wapi improvement (#16)

    * wireless: add passphrase control
    * wireless: add disconnect control
This commit is contained in:
Xiang Xiao 2020-01-16 12:21:45 -06:00 committed by Gregory Nutt
parent db61c92100
commit 6d22dd0013
4 changed files with 179 additions and 21 deletions

View File

@ -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
}

View File

@ -268,3 +268,65 @@ 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");
}
}
}

View File

@ -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))
@ -506,6 +511,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
*
@ -731,16 +784,25 @@ 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 +817,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++)
{

View File

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