wireless/wapi: Re-write of wapi tool UI.
This commit is contained in:
parent
dae395cb8e
commit
1a470c6480
@ -93,13 +93,14 @@ typedef enum
|
|||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
WAPI_MODE_AUTO = IW_MODE_AUTO, /* Driver decides. */
|
WAPI_MODE_AUTO = IW_MODE_AUTO, /* Driver decides. */
|
||||||
WAPI_MODE_ADHOC = IW_MODE_ADHOC, /* Single cell network. */
|
WAPI_MODE_ADHOC = IW_MODE_ADHOC, /* Single cell network. */
|
||||||
WAPI_MODE_MANAGED = IW_MODE_INFRA, /* Multi cell network, roaming, ... */
|
WAPI_MODE_MANAGED = IW_MODE_INFRA, /* Multi cell network, roaming, ... */
|
||||||
WAPI_MODE_MASTER = IW_MODE_MASTER, /* Synchronisation master or access point. */
|
WAPI_MODE_MASTER = IW_MODE_MASTER, /* Synchronisation master or access point. */
|
||||||
WAPI_MODE_REPEAT = IW_MODE_REPEAT, /* Wireless repeater, forwarder. */
|
WAPI_MODE_REPEAT = IW_MODE_REPEAT, /* Wireless repeater, forwarder. */
|
||||||
WAPI_MODE_SECOND = IW_MODE_SECOND, /* Secondary master/repeater, backup. */
|
WAPI_MODE_SECOND = IW_MODE_SECOND, /* Secondary master/repeater, backup. */
|
||||||
WAPI_MODE_MONITOR = IW_MODE_MONITOR /* Passive monitor, listen only. */
|
WAPI_MODE_MONITOR = IW_MODE_MONITOR, /* Passive monitor, listen only. */
|
||||||
|
WAPI_MODE_MESH = IW_MODE_MESH /* Mesh (IEEE 802.11s) network */
|
||||||
} wapi_mode_t;
|
} wapi_mode_t;
|
||||||
|
|
||||||
/* Bitrate flags.
|
/* Bitrate flags.
|
||||||
|
@ -21,10 +21,6 @@ config WIRELESS_WAPI_CMDTOOL
|
|||||||
selected than a simple command line tool that can be ran from NSH
|
selected than a simple command line tool that can be ran from NSH
|
||||||
will also be generated.
|
will also be generated.
|
||||||
|
|
||||||
config WIRELESS_WAPI_ENABLE_SET
|
|
||||||
bool "Enable Setting Options"
|
|
||||||
default n
|
|
||||||
|
|
||||||
config WIRELESS_WAPI_PROGNAME
|
config WIRELESS_WAPI_PROGNAME
|
||||||
string "Program Name"
|
string "Program Name"
|
||||||
default "wapi"
|
default "wapi"
|
||||||
|
@ -41,19 +41,141 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <strings.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
#include "wireless/wapi.h"
|
#include "wireless/wapi.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Describes one command */
|
||||||
|
|
||||||
|
struct wapi_command_s
|
||||||
|
{
|
||||||
|
FAR const char *name;
|
||||||
|
uint8_t noptions;
|
||||||
|
CODE void *handler;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Generic form of a commnd 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 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_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 void wapi_showusage(FAR const char *progname, int exitcode);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* 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},
|
||||||
|
{"mode", 2, (CODE void *)wapi_mode_cmd},
|
||||||
|
{"ap", 2, (CODE void *)wapi_ap_cmd},
|
||||||
|
{"bitrate", 3, (CODE void *)wapi_bitrate_cmd},
|
||||||
|
{"txpower", 2, (CODE void *)wapi_txpower_cmd},
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NCOMMANDS (sizeof(g_wapi_commands) / sizeof(struct wapi_command_s))
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: wapi_show_command
|
* Name: wapi_str2int
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Convert a string to an integer value
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int wapi_str2int(FAR const char *str)
|
||||||
|
{
|
||||||
|
FAR char *endptr;
|
||||||
|
long value;
|
||||||
|
|
||||||
|
value = strtol(str, &endptr, 0);
|
||||||
|
if (*endptr != '\0')
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Garbage after numeric argument\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value > INT_MAX || value < INT_MIN)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Integer value out of range\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: wapi_str2double
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Convert a string to a double value
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static double wapi_str2double(FAR const char *str)
|
||||||
|
{
|
||||||
|
FAR char *endptr;
|
||||||
|
double value;
|
||||||
|
|
||||||
|
value = strtod(str, &endptr);
|
||||||
|
if (*endptr != '\0')
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Garbage after numeric argument\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: wapi_show_cmd
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Gets current configuration of the ifname using WAPI accessors and prints
|
* Gets current configuration of the ifname using WAPI accessors and prints
|
||||||
@ -66,7 +188,7 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void wapi_show_command(int sock, FAR const char *ifname)
|
static void wapi_show_cmd(int sock, FAR const char *ifname)
|
||||||
{
|
{
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
|
|
||||||
@ -128,7 +250,7 @@ static void wapi_show_command(int sock, FAR const char *ifname)
|
|||||||
double tmpfreq;
|
double tmpfreq;
|
||||||
int chan;
|
int chan;
|
||||||
|
|
||||||
printf("Frequency: %g\n", freq;
|
printf("Frequency: %g\n", freq);
|
||||||
printf(" Flag: %s\n", g_wapi_freq_flags[freq_flag]);
|
printf(" Flag: %s\n", g_wapi_freq_flags[freq_flag]);
|
||||||
|
|
||||||
ret = wapi_freq2chan(sock, ifname, freq, &chan);
|
ret = wapi_freq2chan(sock, ifname, freq, &chan);
|
||||||
@ -220,7 +342,7 @@ static void wapi_show_command(int sock, FAR const char *ifname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: wapi_setip_cmd
|
* Name: wapi_ip_cmd
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Set the IP address.
|
* Set the IP address.
|
||||||
@ -230,13 +352,15 @@ static void wapi_show_command(int sock, FAR const char *ifname)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void wapi_setip_cmd(int sock, FAR const char *addrstr)
|
static void wapi_ip_cmd(int sock, FAR const char *ifname,
|
||||||
|
FAR const char *addrstr)
|
||||||
{
|
{
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Format the request */
|
/* Format the request */
|
||||||
#warning Missing logic
|
|
||||||
|
addr.s_addr = inet_addr(addrstr);
|
||||||
|
|
||||||
/* Set the IP address */
|
/* Set the IP address */
|
||||||
|
|
||||||
@ -248,7 +372,7 @@ static void wapi_setip_cmd(int sock, FAR const char *addrstr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: wapi_setmask_cmd
|
* Name: wapi_mask_cmd
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Set the network mask
|
* Set the network mask
|
||||||
@ -258,13 +382,15 @@ static void wapi_setip_cmd(int sock, FAR const char *addrstr)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void wapi_setmask_cmd(int sock, FAR const char *maskstr)
|
static void wapi_mask_cmd(int sock, FAR const char *ifname,
|
||||||
|
FAR const char *maskstr)
|
||||||
{
|
{
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Format the request */
|
/* Format the request */
|
||||||
#warning Missing logic
|
|
||||||
|
addr.s_addr = inet_addr(maskstr);
|
||||||
|
|
||||||
/* Set the network mask */
|
/* Set the network mask */
|
||||||
|
|
||||||
@ -276,7 +402,7 @@ static void wapi_setmask_cmd(int sock, FAR const char *maskstr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: wapi_setfreq_cmd
|
* Name: wapi_freq_cmd
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Set the frequency
|
* Set the frequency
|
||||||
@ -286,14 +412,38 @@ static void wapi_setmask_cmd(int sock, FAR const char *maskstr)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void wapi_setfreq_cmd(int sock, double frequency,
|
static void wapi_freq_cmd(int sock, FAR const char *ifname,
|
||||||
wapi_freq_flag_t freq_flag)
|
FAR const char *freqstr, FAR const char *flagstr)
|
||||||
{
|
{
|
||||||
|
double frequency;
|
||||||
|
wapi_freq_flag_t freq_flag;
|
||||||
|
bool found = false;
|
||||||
int ret;
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* Set the network mask */
|
/* Convert input strings to values */
|
||||||
|
|
||||||
ret = wapi_set_freq(sock, ifname, freq, freq_flag);
|
frequency = wapi_str2double(freqstr);
|
||||||
|
|
||||||
|
for (i = 0; i < IW_FREQ_NFLAGS; i++)
|
||||||
|
{
|
||||||
|
if (strcmp(flagstr, g_wapi_freq_flags[i]) == 0)
|
||||||
|
{
|
||||||
|
freq_flag = (wapi_freq_flag_t)i;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Invalid frequency flag: %s\n", flagstr);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the frequency */
|
||||||
|
|
||||||
|
ret = wapi_set_freq(sock, ifname, frequency, freq_flag);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ERROR: \nwapi_set_freq() failed: %d", ret);
|
fprintf(stderr, "ERROR: \nwapi_set_freq() failed: %d", ret);
|
||||||
@ -301,22 +451,43 @@ static void wapi_setfreq_cmd(int sock, double frequency,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: wapi_setessid_cmd
|
* Name: wapi_essid_cmd
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Set the frequency
|
* Set the ESSID
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* None
|
* None
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void wapi_setessid_cmd(int sock, FAR char *essid,
|
static void wapi_essid_cmd(int sock, FAR const char *ifname,
|
||||||
wapi_essid_flag_t essid_flag)
|
FAR const char *essid, FAR const char *flagstr)
|
||||||
{
|
{
|
||||||
|
wapi_essid_flag_t essid_flag;
|
||||||
|
bool found = false;
|
||||||
int ret;
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* Set essid */
|
/* Convert input strings to values */
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
if (strcmp(flagstr, g_wapi_essid_flags[i]) == 0)
|
||||||
|
{
|
||||||
|
essid_flag = (wapi_essid_flag_t)i;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Invalid ESSID flag: %s\n", flagstr);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the ESSID */
|
||||||
|
|
||||||
ret = wapi_set_essid(sock, ifname, essid, essid_flag);
|
ret = wapi_set_essid(sock, ifname, essid, essid_flag);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -326,7 +497,7 @@ static void wapi_setessid_cmd(int sock, FAR char *essid,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: wapi_setmode_cmd
|
* Name: wapi_mode_cmd
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Set the operating mode
|
* Set the operating mode
|
||||||
@ -336,9 +507,31 @@ static void wapi_setessid_cmd(int sock, FAR char *essid,
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void wapi_setmode_cmd(int sock, FAR char *ifname, wapi_mode_t mode)
|
static void wapi_mode_cmd(int sock, FAR const char *ifname,
|
||||||
|
FAR const char *modestr)
|
||||||
{
|
{
|
||||||
|
wapi_mode_t mode;
|
||||||
|
bool found = false;
|
||||||
int ret;
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Convert input strings to values */
|
||||||
|
|
||||||
|
for (i = 0; i < IW_MODE_NFLAGS; i++)
|
||||||
|
{
|
||||||
|
if (strcmp(modestr, g_wapi_modes[i]) == 0)
|
||||||
|
{
|
||||||
|
mode = (wapi_mode_t)i;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Invalid operating mode: %s\n", modestr);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
/* Set operating mode */
|
/* Set operating mode */
|
||||||
|
|
||||||
@ -350,7 +543,7 @@ static void wapi_setmode_cmd(int sock, FAR char *ifname, wapi_mode_t mode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: wapi_setap_cmd
|
* Name: wapi_ap_cmd
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Set the AP
|
* Set the AP
|
||||||
@ -360,14 +553,22 @@ static void wapi_setmode_cmd(int sock, FAR char *ifname, wapi_mode_t mode)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void wapi_setap_cmd(int sock, FAR char *ifname,
|
static void wapi_ap_cmd(int sock, FAR const char *ifname,
|
||||||
FAR struct ether_addr *ap)
|
FAR const char *macstr)
|
||||||
{
|
{
|
||||||
|
struct ether_addr ap;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
/* Convert input strings to values */
|
||||||
|
|
||||||
|
sscanf(macstr, "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||||
|
&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 */
|
/* Set ap */
|
||||||
|
|
||||||
ret = wapi_set_ap(sock, ifname, ap);
|
ret = wapi_set_ap(sock, ifname, &ap);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ERROR: \nwapi_set_ap() failed: %d", ret);
|
fprintf(stderr, "ERROR: \nwapi_set_ap() failed: %d", ret);
|
||||||
@ -375,7 +576,7 @@ static void wapi_setap_cmd(int sock, FAR char *ifname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: wapi_setbitrate_cmd
|
* Name: wapi_bitrate_cmd
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Set the bit rate
|
* Set the bit rate
|
||||||
@ -385,10 +586,35 @@ static void wapi_setap_cmd(int sock, FAR char *ifname,
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void wapi_setbitrate_cmd(int sock, int bitrate,
|
static void wapi_bitrate_cmd(int sock, FAR const char *ifname,
|
||||||
wapi_bitrate_flag_t bitrate_flag)
|
FAR const char *ratestr, FAR const char *flagstr)
|
||||||
|
|
||||||
{
|
{
|
||||||
|
wapi_bitrate_flag_t bitrate_flag;
|
||||||
|
bool found = false;
|
||||||
|
int bitrate;
|
||||||
int ret;
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Convert input strings to values */
|
||||||
|
|
||||||
|
bitrate = wapi_str2int(ratestr);
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
if (strcmp(flagstr, g_wapi_bitrate_flags[i]) == 0)
|
||||||
|
{
|
||||||
|
bitrate_flag = (wapi_bitrate_flag_t)i;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Invalid bitrate flag: %s\n", flagstr);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
/* Set bitrate */
|
/* Set bitrate */
|
||||||
|
|
||||||
@ -410,11 +636,34 @@ static void wapi_setbitrate_cmd(int sock, int bitrate,
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void wapi_txpower_cmd(int sock, int txpower,
|
static void wapi_txpower_cmd(int sock, FAR const char *ifname,
|
||||||
wapi_txpower_flag_t txpower_flag)
|
FAR const char *pwrstr, FAR const char *flagstr)
|
||||||
{
|
{
|
||||||
|
wapi_txpower_flag_t txpower_flag;
|
||||||
|
bool found = false;
|
||||||
|
int txpower;
|
||||||
int ret;
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Convert input strings to values */
|
||||||
|
|
||||||
|
txpower = wapi_str2int(pwrstr);
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
if (strcmp(flagstr, g_wapi_txpower_flags[i]) == 0)
|
||||||
|
{
|
||||||
|
txpower_flag = (wapi_txpower_flag_t)i;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Invalid TX power flag: %s\n", flagstr);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
/* Set txpower */
|
/* Set txpower */
|
||||||
|
|
||||||
@ -426,7 +675,7 @@ static void wapi_txpower_cmd(int sock, int txpower,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: wapi_scan
|
* Name: wapi_scan_cmd
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Scans available APs in the range using given ifname interface.
|
* Scans available APs in the range using given ifname interface.
|
||||||
@ -436,7 +685,7 @@ static void wapi_txpower_cmd(int sock, int txpower,
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void wapi_scan(int sock, FAR const char *ifname)
|
static void wapi_scan_cmd(int sock, FAR const char *ifname)
|
||||||
{
|
{
|
||||||
int sleepdur = 1;
|
int sleepdur = 1;
|
||||||
int sleeptries = 5;
|
int sleeptries = 5;
|
||||||
@ -510,18 +759,52 @@ static void wapi_scan(int sock, FAR const char *ifname)
|
|||||||
|
|
||||||
static void wapi_showusage(FAR const char *progname, int exitcode)
|
static void wapi_showusage(FAR const char *progname, int exitcode)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
fprintf(stderr, "Usage: %s show <ifname>\n", progname);
|
fprintf(stderr, "Usage: %s show <ifname>\n", progname);
|
||||||
fprintf(stderr, " %s setip <ifname> OPTIONS\n", progname);
|
|
||||||
fprintf(stderr, " %s setmask <ifname> OPTIONS\n", progname);
|
|
||||||
fprintf(stderr, " %s setfreq <ifname> OPTIONS\n", progname);
|
|
||||||
fprintf(stderr, " %s setessid <ifname> OPTIONS\n", progname);
|
|
||||||
fprintf(stderr, " %s setmode <ifname> OPTIONS\n", progname);
|
|
||||||
fprintf(stderr, " %s setap <ifname> OPTIONS\n", progname);
|
|
||||||
fprintf(stderr, " %s setbitrate <ifname> OPTIONS\n", progname);
|
|
||||||
fprintf(stderr, " %s txpower <ifname> OPTIONS\n", progname);
|
|
||||||
fprintf(stderr, " %s scan <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> <flag>\n", progname);
|
||||||
|
fprintf(stderr, " %s essid <ifname> <essid> <flag>\n", progname);
|
||||||
|
fprintf(stderr, " %s mode <ifname> <ifname> <mode>\n", progname);
|
||||||
|
fprintf(stderr, " %s ap <ifname> <ifname> <MAC address>\n", progname);
|
||||||
|
fprintf(stderr, " %s bitrate <ifname> <bitrate> <flag>\n", progname);
|
||||||
|
fprintf(stderr, " %s txpower <ifname> <txpower> <flag>\n", progname);
|
||||||
fprintf(stderr, " %s help\n", progname);
|
fprintf(stderr, " %s help\n", progname);
|
||||||
|
|
||||||
|
fprintf(stderr, "\nFrequency Flags:\n");
|
||||||
|
for (i = 0; i < IW_FREQ_NFLAGS; i++)
|
||||||
|
{
|
||||||
|
fprintf(stderr, " %s", g_wapi_freq_flags[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "\nESSID Flags:\n");
|
||||||
|
for (i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
fprintf(stderr, " %s", g_wapi_essid_flags[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "\nOperating Modes:\n");
|
||||||
|
for (i = 0; i < IW_MODE_NFLAGS; i++)
|
||||||
|
{
|
||||||
|
fprintf(stderr, " %s", g_wapi_modes[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "\nBitrate Flags:\n");
|
||||||
|
for (i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
fprintf(stderr, " %s", g_wapi_bitrate_flags[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "\nTX power Flags:\n");
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
fprintf(stderr, " %s", g_wapi_txpower_flags[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
putchar('\n');
|
||||||
|
|
||||||
exit(exitcode);
|
exit(exitcode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -535,28 +818,61 @@ int main(int argc, FAR char *argv[])
|
|||||||
int wapi_main(int argc, char *argv[])
|
int wapi_main(int argc, char *argv[])
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
FAR const char *cmd;
|
FAR const char *cmdname;
|
||||||
FAR const char *ifname;
|
FAR const struct wapi_command_s *wapicmd;
|
||||||
wapi_list_t list;
|
|
||||||
int ret;
|
|
||||||
int sock;
|
int sock;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* Check command line args */
|
/* Get the command */
|
||||||
|
|
||||||
if (argc == 1 && strcmp(argv[1], "help") == 0)
|
if (argc < 2)
|
||||||
{
|
{
|
||||||
wapi_showusage(argv[0], EXIT_SUCCESS);
|
fprintf(stderr, "ERROR: Missing command\n");
|
||||||
}
|
|
||||||
else if (argc < 3)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "ERROR: Too few command line arguments\n");
|
|
||||||
wapi_showusage(argv[0], EXIT_FAILURE);
|
wapi_showusage(argv[0], EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd = argv[1];
|
cmdname = argv[1];
|
||||||
ifname = argv[2];
|
|
||||||
|
|
||||||
/* Create a communication sock. */
|
/* Find the command in the g_wapi_command[] list */
|
||||||
|
|
||||||
|
wapicmd = NULL;
|
||||||
|
for (i = 0; i < NCOMMANDS; i++)
|
||||||
|
{
|
||||||
|
FAR const struct wapi_command_s *cmd = &g_wapi_commands[i];
|
||||||
|
if (strcmp(cmdname, cmd->name) == 0)
|
||||||
|
{
|
||||||
|
wapicmd = cmd;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wapicmd == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Unsupported command: %s\n", cmdname);
|
||||||
|
wapi_showusage(argv[0], EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wapicmd->noptions + 2 < argc)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Garbage at end of command ignored\n");
|
||||||
|
}
|
||||||
|
else if (wapicmd->noptions + 2 > argc)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR: Missing required command options: %s\n",
|
||||||
|
cmdname);
|
||||||
|
wapi_showusage(argv[0], EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Special case the help command which has no arguments, no handler,
|
||||||
|
* and does not need a socket.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (wapicmd->handler == NULL)
|
||||||
|
{
|
||||||
|
wapi_showusage(argv[0], EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create a communication socket */
|
||||||
|
|
||||||
sock = wapi_make_socket();
|
sock = wapi_make_socket();
|
||||||
if (sock < 0)
|
if (sock < 0)
|
||||||
@ -564,81 +880,26 @@ int wapi_main(int argc, char *argv[])
|
|||||||
fprintf(stderr, "ERROR: wapi_make_socket() failed: %d\n", sock);
|
fprintf(stderr, "ERROR: wapi_make_socket() failed: %d\n", sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Execute command */
|
/* Dispatch the command handling */
|
||||||
|
|
||||||
if (strcmp(cmd, "show")
|
switch (wapicmd->noptions)
|
||||||
{
|
{
|
||||||
wapi_show_command(sock, ifname);
|
default:
|
||||||
}
|
case 0:
|
||||||
else if (strcmp(cmd, "setip")
|
fprintf(stderr, "ERROR: Internal craziness\n");
|
||||||
{
|
wapi_showusage(argv[0], EXIT_FAILURE);
|
||||||
/* Parse command specific options */
|
|
||||||
#warning Missing logic *
|
|
||||||
|
|
||||||
/* Execute the command */
|
case 1:
|
||||||
//wapi_setip_cmd(sock, addrstr);
|
((cmd1_t)wapicmd->handler)(sock, argv[2]);
|
||||||
}
|
break;
|
||||||
else if (strcmp(cmd, "setmask")
|
|
||||||
{
|
|
||||||
/* Parse command specific options */
|
|
||||||
#warning Missing logic *
|
|
||||||
|
|
||||||
/* Execute the command */
|
case 2:
|
||||||
//wapi_setmask_cmd(sock, maskstr);
|
((cmd2_t)wapicmd->handler)(sock, argv[2], argv[3]);
|
||||||
}
|
break;
|
||||||
else if (strcmp(cmd, "setfreq")
|
|
||||||
{
|
|
||||||
/* Parse command specific options */
|
|
||||||
#warning Missing logic *
|
|
||||||
|
|
||||||
/* Execute the command */
|
case 3:
|
||||||
//wapi_setfreq_cmd(sock, frequency, freq_flag);
|
((cmd3_t)wapicmd->handler)(sock, argv[2], argv[3], argv[4]);
|
||||||
}
|
break;
|
||||||
else if (strcmp(cmd, "setessid")
|
|
||||||
{
|
|
||||||
/* Parse command specific options */
|
|
||||||
#warning Missing logic *
|
|
||||||
|
|
||||||
/* Execute the command */
|
|
||||||
//wapi_setessid_cmd(sock, essid, essid_flag);
|
|
||||||
}
|
|
||||||
else if (strcmp(cmd, "setmode")
|
|
||||||
{
|
|
||||||
/* Parse command specific options */
|
|
||||||
#warning Missing logic *
|
|
||||||
|
|
||||||
/* Execute the command */
|
|
||||||
//wapi_setmode_cmd(sock, ifname, mode);
|
|
||||||
}
|
|
||||||
else if (strcmp(cmd, "setbitrate")
|
|
||||||
{
|
|
||||||
/* Parse command specific options */
|
|
||||||
#warning Missing logic *
|
|
||||||
|
|
||||||
/* Execute the command */
|
|
||||||
//wapi_setap_cmd(sock, ifname, ap);
|
|
||||||
}
|
|
||||||
else if (strcmp(cmd, "txpower")
|
|
||||||
{
|
|
||||||
/* Parse command specific options */
|
|
||||||
#warning Missing logic *
|
|
||||||
|
|
||||||
/* Execute the command */
|
|
||||||
//wapi_setbitrate_cmd(sock, bitrate, bitrate_flag);
|
|
||||||
}
|
|
||||||
else if (strcmp(cmd, "scan")
|
|
||||||
{
|
|
||||||
wapi_scan(sock, ifname);
|
|
||||||
}
|
|
||||||
else if (strcmp(cmd, "help")
|
|
||||||
{
|
|
||||||
fprintf(stderr, "WARNING: Garbage after help common ignored.\n");
|
|
||||||
wapi_showusage(argv[0], EXIT_SUCCESS);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fprintf(stderr, "WARNING: Unrecognized command: %s\n", cmd);
|
|
||||||
wapi_showusage(argv[0], EXIT_FAILURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close communication socket */
|
/* Close communication socket */
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
* Included Files
|
* Included Files
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
@ -99,6 +100,7 @@ FAR const char *g_wapi_modes[] =
|
|||||||
"WAPI_MODE_REPEAT",
|
"WAPI_MODE_REPEAT",
|
||||||
"WAPI_MODE_SECOND",
|
"WAPI_MODE_SECOND",
|
||||||
"WAPI_MODE_MONITOR"
|
"WAPI_MODE_MONITOR"
|
||||||
|
"WAPI_MODE_MESH"
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Bit Rate */
|
/* Bit Rate */
|
||||||
|
Loading…
Reference in New Issue
Block a user