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:
parent
db61c92100
commit
6d22dd0013
@ -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
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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++)
|
||||
{
|
||||
|
@ -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
|
||||
****************************************************************************/
|
||||
|
Loading…
x
Reference in New Issue
Block a user