Files
m241Neelima/components/ip_net2-6.9/ipwlan/src/ipwlan_cmd_wlan.c
T
2026-07-30 11:19:44 +05:30

3605 lines
92 KiB
C

/*
******************************************************************************
* SOURCE FILE
*
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipwlan_cmd_wlan.c,v $ $Revision: 1.16.16.4 $
* $Source: /home/interpeak/CVSRoot/ipwlan/src/ipwlan_cmd_wlan.c,v $
* $Author: svc-cmnet $ $Date: 2014-06-10 23:33:34 $
* $State: Exp $ $Locker: $
*
* INTERPEAK_COPYRIGHT_STRING
* Design and implementation by Firstname Lastname <email@interpeak.se>
******************************************************************************
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
#include "ipcom_config.h"
/*
****************************************************************************
* 3 INCLUDE FILES.
****************************************************************************
*/
#define IPCOM_USE_CLIB_PROTO
#include <stdarg.h>
#include "ipcom_clib.h"
#include "ipcom_cstyle.h"
#include "ipcom_getopt.h"
#include "ipcom_os.h"
#include "ipcom_sock.h"
#include "ipcom_sock2.h"
#include "ipcom_time.h"
#include "ipcom_type.h"
#include "ipwlan_wlan.h"
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
#define MIN(a, b) (((a)<(b))?(a):(b))
#define WLAN_FREQUENCY_BAND 2412000
#define WLAN_MAX_TEXT_LEN 100
#define IS_A_NEXT_IWE(iwe, iw_end) (((char *)iwe + IP_IW_EV_LCP_LEN) < (char *)iw_end)
#define NEXT_IWE(iwe) ((iw_event *)((char *)iwe + iwe->len))
#define MAX_SCAN_WAITING_TIME (25)
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
enum { wlan_mode_client_infra = 0, wlan_mode_client_adhoc, wlan_mode_client_auto, wlan_mode_ap, wlan_mode_unknown };
typedef Ipcom_iw_event iw_event;
/*
****************************************************************************
* 6 EXTERNAL FUNCTIONS
****************************************************************************
*/
IP_EXTERN int ipcom_vprintf(const char *format, va_list ap);
IP_EXTERN int vsnprintf(char *, int, const char *, va_list);
#ifdef IP_PORT_VXWORKS
IP_EXTERN void * muxTkCookieGet(char *,int);
IP_EXTERN int muxIoctl(void *,int,char *);
#endif /* IP_PORT_VXWORKS */
/*
****************************************************************************
* 6 LOCAL PROTOTYPES
****************************************************************************
*/
IP_PUBLIC int ipwlan_cmd_wlan(int argc, char **argv);
Ip_u8 convertDecimalToKeycode(Ip_u8 dec);
/*
****************************************************************************
* 7 DATA
****************************************************************************
*/
/*
*===========================================================================
* STATIC DATA
*===========================================================================
*/
IP_STATIC IP_CONST char *wlan_mode_text[] = {"client infra", "client adhoc", "client auto", "access point", "adhoc", "unknown"};
IP_CONST int ipwlan_encr_policy[] = {
IP_IW_CIPHPOL_NONE,
IP_IW_CIPHPOL_WEP40,
IP_IW_CIPHPOL_WEP104,
IP_IW_CIPHPOL_WEP40+IP_IW_CIPHPOL_WEP104,
IP_IW_CIPHPOL_TKIP,
IP_IW_CIPHPOL_CCMP,
IP_IW_CIPHPOL_TKIP+IP_IW_CIPHPOL_CCMP,
IP_IW_CIPHPOL_CCMP+IP_IW_CIPHPOL_WEP40,
IP_IW_CIPHPOL_CCMP+IP_IW_CIPHPOL_WEP104,
IP_IW_CIPHPOL_CCMP+IP_IW_CIPHPOL_WEP40+IP_IW_CIPHPOL_WEP104,
IP_IW_CIPHPOL_TKIP+IP_IW_CIPHPOL_WEP40,
IP_IW_CIPHPOL_TKIP+IP_IW_CIPHPOL_WEP104,
IP_IW_CIPHPOL_TKIP+IP_IW_CIPHPOL_WEP40+IP_IW_CIPHPOL_WEP104,
IP_IW_CIPHPOL_TKIP+IP_IW_CIPHPOL_CCMP+IP_IW_CIPHPOL_WEP40,
IP_IW_CIPHPOL_TKIP+IP_IW_CIPHPOL_CCMP+IP_IW_CIPHPOL_WEP104,
IP_IW_CIPHPOL_TKIP+IP_IW_CIPHPOL_CCMP+IP_IW_CIPHPOL_WEP40+IP_IW_CIPHPOL_WEP104
};
IP_STATIC IP_CONST char *wlan_encr_text[] = {
"none",
"WEP40",
"WEP104",
"WEP40 WEP104",
"TKIP",
"AES_CCMP",
"TKIP, AES_CCMP",
"AES_CCMP, WEP40",
"AES_CCMP, WEP104",
"AES_CCMP, WEP40, WEP104",
"TKIP, WEP40",
"TKIP, WEP104",
"TKIP, WEP40, WEP104",
"TKIP, AES_CCMP, WEP40",
"TKIP, AES_CCMP, WEP104",
"TKIP, AES_CCMP, WEP40, WEP104"
};
/*
****************************************************************************
* WME Standard Queue
****************************************************************************
*/
IP_STATIC IP_CONST char IP_IW_WMM_AC_CATEGORY[IP_IW_AC_COUNT][6] = {"AC_BE", "AC_BK", "AC_VI", "AC_VO"};
/*
****************************************************************************
* 8 LOCAL FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipwlan_printf
*===========================================================================
* Description: Prints to console
* Parameters: 'enabled' == 0 => printout is suppressed
* Returns: 0
*/
IP_STATIC int
ipwlan_printf(int enabled, const char *format, ...)
{
va_list ptr;
char text[WLAN_MAX_TEXT_LEN];
va_start(ptr, format);
if (enabled)
{
vsnprintf(text, WLAN_MAX_TEXT_LEN - 1, format, ptr);
ipcom_printf("%s", text);
}
va_end(ptr);
return 0;
}
/*
*===========================================================================
* ipwlan_print_usage
*===========================================================================
* Description: Lists shell commands available
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> acl Get Access control list"IP_LF);
ipwlan_printf(en, " acl mode [allow|deny] Set/Get Access control list mode"IP_LF);
ipwlan_printf(en, " acl add|del <mac> Add/Delete station to/from acl"IP_LF);
ipwlan_printf(en, " auth [open|shared-key] Set/Get authentication policy"IP_LF);
ipwlan_printf(en, " auth [wpa|wpa-psk] Set/Get authentication policy"IP_LF);
ipwlan_printf(en, " auth [wpa2|wpa2-psk] Set/Get authentication policy"IP_LF);
ipwlan_printf(en, " bi [<interval>] Set/Get beacon interval (us)"IP_LF);
ipwlan_printf(en, " bss add|del [<index>] Add/Delete bss"IP_LF);
ipwlan_printf(en, " bss [<index>] Set/Get current bss index"IP_LF);
ipwlan_printf(en, " channel [<channel>] Set/Get channel"IP_LF);
ipwlan_printf(en, " channel supp Get supported channels"IP_LF);
ipwlan_printf(en, " country [<code>] Set/Get country code"IP_LF);
ipwlan_printf(en, " debug [<level>] | -h Set/Get debug level(s)"IP_LF);
ipwlan_printf(en, " encr [none|tkip|ccmp] Set/Get encryption type"IP_LF);
ipwlan_printf(en, " encr wep 1|2|3|4 [<key>|<pass>] Set/Get WEP group key"IP_LF);
ipwlan_printf(en, " encr wep <mac> [<key>|<pass>] Set/Get WEP pairwise key"IP_LF);
ipwlan_printf(en, " encr wpa [<key>|<pass>] Set/Get WPA encryption"IP_LF);
ipwlan_printf(en, " encr wpa2 [<key>|<pass>] Set/Get WPA2 encryption"IP_LF);
ipwlan_printf(en, " mcast_encr Get multicast encryption type"IP_LF);
ipwlan_printf(en, " fragthresh [<thresh>] Set/Get fragmentation threshold"IP_LF);
ipwlan_printf(en, " lrl [<lrl>] Set/Get long retry limit"IP_LF);
ipwlan_printf(en, " mbss [on|off] Set/Get multiple bss mode"IP_LF);
ipwlan_printf(en, " mode Get current mode"IP_LF);
ipwlan_printf(en, " mode ap Configure as access point"IP_LF);
ipwlan_printf(en, " mode client adhoc|infra Configure as client"IP_LF);
ipwlan_printf(en, " pm [on|off] Set/Get power management mode"IP_LF);
ipwlan_printf(en, " ps [<factor>] Set/Get tx power scale (%%)"IP_LF);
ipwlan_printf(en, " quality Get link status"IP_LF);
ipwlan_printf(en, " radiomode [auto|a|b|g] Set/Get radio mode"IP_LF);
ipwlan_printf(en, " radiomode n bw [<bandwidth>] Set/Get MIMO bandwidth"IP_LF);
ipwlan_printf(en, " radiomode n legacy <rate> Set/Get 802.11n legacy rate"IP_LF);
ipwlan_printf(en, " radiomode n on|off Enable/Disable 802.11n mode"IP_LF);
ipwlan_printf(en, " rate [<rate>] Set/Get rate"IP_LF);
ipwlan_printf(en, " rate supp [<rates>] Set/Get supported rates"IP_LF);
ipwlan_printf(en, " regulatory [on|off] Set/Get 802.11d regulatory mode"IP_LF);
ipwlan_printf(en, " rtsthresh [<thresh>] Set/Get rts/cts threshold"IP_LF);
ipwlan_printf(en, " scan <1-%ds> [<ssid>] Scan for <secs>, display result"IP_LF, MAX_SCAN_WAITING_TIME);
ipwlan_printf(en, " scan mode [active|passive] Set/Get scan mode"IP_LF);
ipwlan_printf(en, " srl [<srl>] Set/Get short retry limit"IP_LF);
ipwlan_printf(en, " ssid [<ssid>] Set/Get SSID"IP_LF);
ipwlan_printf(en, " ssid broadcast [on|off] Set/Get SSID broadcast mode"IP_LF);
ipwlan_printf(en, " statistics Get system statistics"IP_LF);
ipwlan_printf(en, " status Get system status"IP_LF);
ipwlan_printf(en, " vlan [<id>] Set/Get current vlan"IP_LF);
ipwlan_printf(en, " wme [on|off] Enable/Disable wme"IP_LF);
ipwlan_printf(en, " wme_ac [ap|sta] Get wme edcf parameters"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_acl
*===========================================================================
* Description: Prints acl shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_acl(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> acl mode [allow|deny] Set/Get Access control list mode"IP_LF);
ipwlan_printf(en, " acl add|del <mac> Add/Delete station to/from acl"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_auth
*===========================================================================
* Description: Prints auth shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_auth(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> auth [open|shared-key] Set/Get authentication policy"IP_LF);
ipwlan_printf(en, " auth [wpa|wpa-psk] Set/Get authentication policy"IP_LF);
ipwlan_printf(en, " auth [wpa2|wpa2-psk] Set/Get authentication policy"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_bi
*===========================================================================
* Description: Prints bi shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_bi(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> bi [<interval>] Set/Get beacon interval (us)"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_bss
*===========================================================================
* Description: Prints bss shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_bss(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> bss add|del [<index>] Add/Delete bss"IP_LF);
ipwlan_printf(en, " bss [<index>] Set/Get current bss index"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_channel
*===========================================================================
* Description: Prints channel shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_channel(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> channel [<channel>] Set/Get channel"IP_LF);
ipwlan_printf(en, " channel supp Get supported channels"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_country
*===========================================================================
* Description: Prints country shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_country(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> country [<code>] Set/Get country code"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_debug
*===========================================================================
* Description: Prints debug shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_GLOBAL void
ipwlan_print_usage_debug(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> debug [<level>] | -h Set/Get debug level(s)"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_encr
*===========================================================================
* Description: Prints encr shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_encr(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> encr [none|tkip|ccmp] Set/Get encryption type"IP_LF);
ipwlan_printf(en, " encr wep 1|2|3|4 [<key>|<pass>] Set/Get WEP group key"IP_LF);
ipwlan_printf(en, " encr wep <mac> [<key>|<pass>] Set/Get WEP pairwise key"IP_LF);
ipwlan_printf(en, " encr wpa [<key>|<pass>] Set/Get WPA encryption"IP_LF);
ipwlan_printf(en, " encr wpa2 [<key>|<pass>] Set/Get WPA2 encryption"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_fragthresh
*===========================================================================
* Description: Prints fragthresh shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_fragthresh(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> fragthresh [<thresh>] Set/Get fragmentation threshold"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_lrl
*===========================================================================
* Description: Prints lrl shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_lrl(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> lrl [<lrl>] Set/Get long retry limit"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_mbss
*===========================================================================
* Description: Prints mbss shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_mbss(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> mbss [on|off] Set/Get multiple bss mode"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_wme
*===========================================================================
* Description: Prints wme shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_wme(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> wme [on|off] Turn on/off wme"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_wmeac
*===========================================================================
*/
IP_STATIC void
ipwlan_print_usage_wmeac(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> wme_ac [ap|sta] Get wme edcf parameter"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_mode
*===========================================================================
* Description: Prints channel shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_mode(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> mode Get current mode"IP_LF);
ipwlan_printf(en, " mode ap Configure as access point"IP_LF);
ipwlan_printf(en, " mode client adhoc|infra Configure as client in adhoc or"IP_LF);
ipwlan_printf(en, " infra mode"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_pm
*===========================================================================
* Description: Prints pm shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_pm(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> pm [on|off] Set/Get power management mode"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_ps
*===========================================================================
* Description: Prints ps shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_ps(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> ps [<factor>] Set/Get tx power scale (%%)"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_quality
*===========================================================================
* Description: Prints quality shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_quality(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> quality Get link status"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_radiomode
*===========================================================================
* Description: Prints radiomode shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_radiomode(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> radiomode [auto|a|b|g] Set/Get radio mode"IP_LF);
ipwlan_printf(en, " radiomode n bw [<bandwidth>] Set/Get MIMO bandwidth"IP_LF);
ipwlan_printf(en, " radiomode n legacy <rate> Set/Get 802.11n legacy rate"IP_LF);
ipwlan_printf(en, " radiomode n on|off Enable/Disable 802.11n mode"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_rate
*===========================================================================
* Description: Prints rate shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_rate(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> rate [<rate>] Set/Get rate"IP_LF);
ipwlan_printf(en, " rate supp [<rates>] Set/Get supported rates"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_regulatory
*===========================================================================
* Description: Prints rtsthresh shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_regulatory(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> regulatory [on|off] Set/Get 802.11d regulatory mode"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_rtsthresh
*===========================================================================
* Description: Prints rtsthresh shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_rtsthresh(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> rtsthresh [<thresh>] Set/Get rts/cts threshold"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_scan
*===========================================================================
* Description: Prints scan shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_scan(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> scan <1-%ds> [<ssid>] Scan for <secs>, display result"IP_LF, MAX_SCAN_WAITING_TIME);
ipwlan_printf(en, " scan mode [active|passive] Set/Get scan mode"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_srl
*===========================================================================
* Description: Prints srl shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_srl(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> srl [<srl>] Set/Get short retry limit"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_ssid
*===========================================================================
* Description: Prints ssid shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_ssid(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> ssid [<ssid>] Set/Get SSID"IP_LF);
ipwlan_printf(en, " ssid broadcast [on|off] Set/Get SSID broadcast mode"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_statistics
*===========================================================================
* Description: Prints channel shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_statistics(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> statistics Get system statistics"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_status
*===========================================================================
* Description: Prints status shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_status(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> status Get system status"IP_LF);
}
/*
*===========================================================================
* ipwlan_print_usage_vlan
*===========================================================================
* Description: Prints vlan shell command usage
* Parameters: 'en' == 0 => No printout to console
* Returns: <void>
*/
IP_STATIC void
ipwlan_print_usage_vlan(int en)
{
ipwlan_printf(en, "Usage:"IP_LF);
ipwlan_printf(en, " wifi <iface> vlan [<id>] Set/Get current vlan"IP_LF);
}
/*
*===========================================================================
* ipwlan_get_next_iwap
*===========================================================================
* Description: Get next AP entry in iw_event list
* Parameters: 'iwap' : current AP entry, 'iwap_end' : end of AP list
* Returns: next AP entry, or IP_NULL
*/
IP_STATIC void *
ipwlan_get_next_iwap(iw_event *iwap, iw_event *iwap_end)
{
iw_event *iw;
for (iw = NEXT_IWE(iwap); iw < iwap_end; iw = NEXT_IWE(iw))
{
if (iw->cmd == SIOCGIWAP)
{
return iw;
}
}
return IP_NULL;
}
/*
*===========================================================================
* ipwlan_get_next_iwe
*===========================================================================
* Description: Get next AP item
* Parameters: iwe' : current AP item, 'iwap_end' : end of AP list
* Returns: next item, or IP_NULL
*/
IP_STATIC void *
ipwlan_get_next_iwe(iw_event *iwe, iw_event *iwap_end)
{
iw_event *iw;
if (!IS_A_NEXT_IWE(iwe, iwap_end))
{
return IP_NULL;
}
iw = NEXT_IWE(iwe);
if (iw < iwap_end && iw->cmd != SIOCGIWAP)
{
return iw;
}
return IP_NULL;
}
/*
*===========================================================================
* ipwlan_parse_ether_addr
*===========================================================================
* Description: Parse ethernet address from command line
* Parameters: 'ea_num' : destination, 'ea_string' : source
* Returns: IPCOM_SUCCESS or IPCOM_ERR_FAILED
*/
IP_STATIC Ip_err
ipwlan_parse_ether_addr(char *ea_num, char *ea_string)
{
int i,j;
char *startp;
char *endp;
i = 0;
startp = ipcom_strtok( ea_string, ":" );
while( startp != IP_NULL && i < IP_IW_ADDR_LEN)
{
j = ipcom_strtol(startp, &endp, 16);
ea_num[i] = j;
startp = ipcom_strtok( IP_NULL, ":" );
i ++;
}
if (*endp != '\0' || i < IP_IW_ADDR_LEN)
{
return IPCOM_ERR_FAILED;
}
return IPCOM_SUCCESS;
}
/*
*===========================================================================
* ipwlan_parse_key
*===========================================================================
* Description: Parse key from command line
* Parameters: 'key_iw' : destination, 'key_string' : source
* Returns: IPCOM_SUCCESS or IPCOM_ERR_FAILED
*/
IP_STATIC Ip_err
ipwlan_parse_key(Ipcom_iw_key *key_iw, char *key_string)
{
int j;
int k;
if (ipcom_strspn(key_string + 2, "0123456789ABCDEFabcdef") != ipcom_strlen(key_string + 2) ||
ipcom_strlen(key_string + 2) > IP_IW_KEY_TKIP_LEN * 2)
{
return IPCOM_ERR_FAILED;
}
for (j = 0; ipcom_sscanf(key_string + 2 + 2 * j, "%2x", &k); j++)
{
key_iw->key[j] = (unsigned char)k;
}
key_iw->len = ipcom_strlen(key_string + 2)/2;
return IPCOM_SUCCESS;
}
/*
*===========================================================================
* ipwlan_ioctl
*===========================================================================
* Description: Call ioctl
* Returns: success or failure of ioctl call
*/
IP_GLOBAL int
ipwlan_ioctl(Ip_fd sock, unsigned long request, Ipcom_iwreq *iwreq)
{
int status;
#ifdef IP_PORT_VXWORKS
void * pCookie;
char * end_name;
int end_instance;
char if_name[IP_IFNAMSIZ];
#endif
#ifdef IP_PORT_VXWORKS
end_instance = atoi(iwreq->if_name+strlen(iwreq->if_name)-1);
strncpy(if_name, iwreq->if_name, IP_IFNAMSIZ);
end_name = ipcom_strtok(if_name,"0123456789");
if (end_name == IP_NULL || strlen(end_name) > IP_IFNAMSIZ)
{
return IPCOM_ERR_FAILED;
}
if ((pCookie = muxTkCookieGet(end_name, end_instance)) == IP_NULL)
{
return IPCOM_ERR_FAILED;
}
status = muxIoctl(pCookie, (int)request, (char*)iwreq);
#else
status = ipcom_socketioctl(sock, request, iwreq);
#endif
return status;
}
/*
****************************************************************************
* 9 PUBLIC FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipwlan_cmd_wlan_en
*===========================================================================
* Description: Parses and executes wlan shell commands.
* Parameters: 'en' == 0 => Do not print to console,
* Returns: 0 on success
*/
IP_STATIC int
ipwlan_cmd_wlan_en(int en, int argc, char **argv)
{
int i = 0;
int j = 0;
int val;
int basic;
Ip_u8 r;
Ip_fd fd;
char *endp;
char *data;
char *startp;
char ssid[32+1];
Ipcom_iwreq *iwl;
Ipcom_iwreq iwreq;
Ipcom_iw_event *iwe;
Ipcom_iw_event *iwap, *iwap_end;
Ipcom_iw_event iwe_res;
Ipcom_iw_debug_level *dbg_lvl;
Ipcom_iw_statistic *stat;
Ip_u8 auth_known=0;
Ipcom_iw_scan_result scanned;
unsigned char oid_data[10];
Ip_err ret = IPCOM_SUCCESS;
char *status_argv[4];
if (argc < 3)
{
/* To few arguments */
ipwlan_print_usage(en);
return ret;
}
#ifdef IPCOM_USE_INET
fd = ipcom_socket(IP_AF_INET, IP_SOCK_DGRAM, 0);
#else
fd = ipcom_socket(IP_AF_INET6, IP_SOCK_DGRAM, 0);
#endif
if (fd == IP_SOCKERR)
{
ipwlan_printf(en, "Error: unable to create command socket"IP_LF);
return IPCOM_ERR_FAILED;
}
ipcom_memset(&iwreq, 0, sizeof(iwreq));
ipcom_sprintf(iwreq.if_name, "%.*s", IP_IFNAMSIZ - 1, argv[1]);
#ifndef IP_PORT_VXWORKS
/* Verify interface existance */
if(ipcom_if_nametoindex(iwreq.if_name) < 1)
{
ipwlan_printf(en, "Error: Interface '%s' does not exist"IP_LF, iwreq.if_name);
goto error;
}
#endif
/* Reset WLAN device */
if (!ipcom_strcmp(argv[2], "reset"))
{
(void)ipwlan_ioctl(fd, IP_SIOCSIWRESET, &iwreq);
goto done;
}
/* Set/Get mode */
if (!ipcom_strcmp(argv[2], "mode"))
{
if (argc < 4)
{
if(ipwlan_ioctl(fd, IP_SIOCGIWMODE, &iwreq) < 0)
{
goto error;
}
if(iwreq.u.mode == IP_IW_MODE_INFRA)
{
i = wlan_mode_client_infra;
}
else if(iwreq.u.mode == IP_IW_MODE_AUTO)
{
i = wlan_mode_client_auto;
}
else if(iwreq.u.mode == IP_IW_MODE_ADHOC)
{
i = wlan_mode_client_adhoc;
}
else if(iwreq.u.mode == IP_IW_MODE_MASTER)
{
i = wlan_mode_ap;
}
else
{
i = wlan_mode_unknown;
}
ipwlan_printf(en, "%s"IP_LF, wlan_mode_text[i]);
}
else
{
/* Set mode */
if (!strcmp(argv[3], "client"))
{
if(argc < 5 ||
(ipcom_strcmp(argv[4], "adhoc") &&
ipcom_strcmp(argv[4], "auto") &&
ipcom_strcmp(argv[4], "infra")))
{
ipwlan_print_usage_mode(en);
goto done;
}
iwreq.u.mode = !strcmp(argv[4], "auto") ? IP_IW_MODE_AUTO : (!strcmp(argv[4], "infra") ? IP_IW_MODE_INFRA : IP_IW_MODE_ADHOC);
}
else if (!strcmp(argv[3], "ap"))
{
iwreq.u.mode = IP_IW_MODE_MASTER;
}
else
{
ipwlan_print_usage_mode(en);
goto done;
}
if (ipwlan_ioctl(fd, IP_SIOCSIWMODE, &iwreq) < 0)
{
goto error;
}
/* initialize the auth wpa or auth supp based on mode */
if (ipwlan_ioctl(fd, IP_SIOCGIWAUTHTYPE, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.auth_type & (IP_IW_AUTHPOL_WPA2|IP_IW_AUTHPOL_WPA|IP_IW_AUTHPOL_WPA_PSK|IP_IW_AUTHPOL_WPA2_PSK) )
{
if (!strcmp(argv[3], "ap"))
{
iwreq.u.wpa_type=1;
if (ipwlan_ioctl(fd,IP_SIOCSIWAUTHWPA, &iwreq) < 0)
{
goto error;
}
iwreq.u.wpa_type = 0;
#ifdef BCM43XXX_SUPWPA_ENABLED
if (ipwlan_ioctl(fd,IP_SIOCSIWSUPWPA, &iwreq) < 0)
{
goto error;
}
#endif
}
else
{
iwreq.u.wpa_type=1;
if (ipwlan_ioctl(fd,IP_SIOCSIWSUPWPA, &iwreq) < 0)
{
goto error;
}
iwreq.u.wpa_type = 0;
if (ipwlan_ioctl(fd,IP_SIOCSIWAUTHWPA, &iwreq) < 0)
{
goto error;
}
}
}
}
goto done;
}
/* Get/Set SSID */
if (!ipcom_strcmp(argv[2], "ssid"))
{
iwreq.u.essid.pointer = ssid;
if (argc > 5)
{
ipwlan_print_usage_ssid(en);
goto done;
}
if (argc < 4)
{
/* Get SSID */
iwreq.u.essid.length = sizeof(ssid);
ipcom_memset(&ssid, 0, sizeof(ssid));
if (ipwlan_ioctl(fd, IP_SIOCGIWESSID, &iwreq) == 0)
{
if(ssid[0])
{
ipwlan_printf(en, "%s"IP_LF, ssid);
}
else
{
ipwlan_printf(en, "SSID not set or client not associated"IP_LF);
}
goto done;
}
}
else
{
if (!ipcom_strcmp(argv[3], "broadcast"))
{
if (argc < 5)
{
/* Get broadcast ssid capability */
if (ipwlan_ioctl(fd, IP_SIOCGIWHIDESSID, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.hidessid == IP_IW_SSID_SHOW)
{
ipwlan_printf(en, "on"IP_LF);
}
else if (iwreq.u.hidessid == IP_IW_SSID_HIDE)
{
ipwlan_printf(en, "off"IP_LF);
}
else
{
goto error;
}
}
else
{
/* Set broadcast SSID capability */
if (!strcmp(argv[4], "off"))
{
iwreq.u.hidessid = IP_IW_SSID_HIDE;
}
else if (!strcmp(argv[4], "on"))
{
iwreq.u.hidessid = IP_IW_SSID_SHOW;
}
else
{
ipwlan_print_usage_ssid(en);
goto done;
}
if (ipwlan_ioctl(fd, IP_SIOCSIWHIDESSID, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
else if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_ssid(en);
goto done;
}
/* Set SSID */
startp = argv[3];
if (!ipcom_strncmp(argv[3], "--",2))
{
startp = argv[3] + 2;
}
iwreq.u.essid.length = ipcom_sprintf(ssid, "%.*s", sizeof(ssid) , startp);
if (ipwlan_ioctl(fd, IP_SIOCSIWESSID, &iwreq) == 0)
{
goto done;
}
}
goto error;
}
/* Get/Set frequency */
if (!ipcom_strcmp(argv[2], "freq"))
{
if(argc < 4)
{
/* Get frequency */
if (ipwlan_ioctl(fd, IP_SIOCGIWFREQ, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d kHz"IP_LF, iwreq.u.freq.m);
}
else
{
/* Set frequency */
if (!strcmp(argv[3], "auto"))
{
iwreq.u.freq.flags = IP_IW_FREQ_AUTO;
iwreq.u.freq.m = WLAN_FREQUENCY_BAND;
iwreq.u.freq.e = 0;
}
else
{
i = ipcom_strtol(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid frequency value, '%s'"IP_LF, argv[3]);
goto done;
}
iwreq.u.freq.flags = IP_IW_FREQ_FIXED;
iwreq.u.freq.m = i;
iwreq.u.freq.e = 0;
if (ipwlan_ioctl(fd, IP_SIOCSIWFREQ, &iwreq) < 0)
{
goto error;
}
}
}
goto done;
}
/* Get/Set authentication */
if (!ipcom_strcmp(argv[2], "auth"))
{
if (argc > 4)
{
ipwlan_print_usage_auth(en);
goto done;
}
if (argc < 4)
{
/* Get auth type */
if (ipwlan_ioctl(fd, IP_SIOCGIWAUTHTYPE, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.auth_type & IP_IW_AUTHPOL_WPA2_PSK)
{
auth_known=1;
ipwlan_printf(en, "wpa2-psk ");
}
if (iwreq.u.auth_type & IP_IW_AUTHPOL_WPA2)
{
auth_known=1;
ipwlan_printf(en, "wpa2 ");
}
if (iwreq.u.auth_type & IP_IW_AUTHPOL_WPA_PSK)
{
auth_known=1;
ipwlan_printf(en, "wpa-psk ");
}
if (iwreq.u.auth_type & IP_IW_AUTHPOL_WPA)
{
auth_known=1;
ipwlan_printf(en, "wpa ");
}
if (iwreq.u.auth_type & IP_IW_AUTHPOL_SHARED_KEY)
{
auth_known=1;
ipwlan_printf(en, "shared-key ");
}
if (iwreq.u.auth_type == IP_IW_AUTHPOL_OPEN)
{
auth_known=1;
ipwlan_printf(en, "open "IP_LF);
}
ipwlan_printf(en, " "IP_LF);
if(!auth_known)
{
ipwlan_printf(en, "unknown (%d)"IP_LF, iwreq.u.auth_type);
goto done;
}
}
else
{
/* Set authentication policy */
if(ipcom_strcmp(argv[3], "open") == 0)
iwreq.u.auth_type = IP_IW_AUTHPOL_OPEN;
else if(ipcom_strcmp(argv[3], "shared-key") == 0)
iwreq.u.auth_type = IP_IW_AUTHPOL_SHARED_KEY;
else if (ipcom_strcmp(argv[3], "wpa2-psk") == 0)
iwreq.u.auth_type = IP_IW_AUTHPOL_WPA2_PSK;
else if (ipcom_strcmp(argv[3], "wpa2") == 0)
iwreq.u.auth_type = IP_IW_AUTHPOL_WPA2;
else if (ipcom_strcmp(argv[3], "wpa-psk") == 0)
iwreq.u.auth_type = IP_IW_AUTHPOL_WPA_PSK;
else if (ipcom_strcmp(argv[3], "wpa") == 0)
iwreq.u.auth_type = IP_IW_AUTHPOL_WPA;
else
{
ipwlan_print_usage_auth(en);
goto done;
}
if (ipwlan_ioctl(fd, IP_SIOCSIWAUTHTYPE, &iwreq) < 0)
{
goto error;
}
if(ipwlan_ioctl(fd, IP_SIOCGIWMODE, &iwreq) < 0)
{
ipwlan_printf(en,"Error: could not determine the mode"IP_LF);
}
if(iwreq.u.mode == IP_IW_MODE_MASTER)
{
i=0;
iwreq.u.wpa_type = 1;
if (ipwlan_ioctl(fd,IP_SIOCSIWAUTHWPA, &iwreq) < 0)
{
goto error;
}
iwreq.u.wpa_type = 0;
if (ipwlan_ioctl(fd,IP_SIOCSIWSUPWPA, &iwreq) < 0)
{
goto error;
}
}
else
{
iwreq.u.wpa_type = 1;
if (ipwlan_ioctl(fd,IP_SIOCSIWSUPWPA, &iwreq) < 0)
{
goto error;
}
iwreq.u.wpa_type = 0;
if (ipwlan_ioctl(fd,IP_SIOCSIWAUTHWPA, &iwreq) < 0)
{
goto error;
}
}
}
goto done;
}
/* Get Multicast encryption */
if (!ipcom_strcmp(argv[2], "mcast_encr"))
{
if (argc != 3)
{
ipwlan_print_usage_encr(en);
goto done;
}
if (ipwlan_ioctl(fd, IP_SIOCGIWMCASTENCRTYPE, &iwreq) < 0)
{
goto error;
}
for(i = 0; i < (int) (sizeof(ipwlan_encr_policy)/sizeof(ipwlan_encr_policy[0])); i++)
{
if (ipwlan_encr_policy[i] == iwreq.u.encr_type)
{
break;
}
}
if (i >= (int) (sizeof(wlan_encr_text)/sizeof(wlan_encr_text[0])))
ipwlan_printf(en, "%s (0x%x)"IP_LF, "unknown", iwreq.u.encr_type);
else
ipwlan_printf(en, "%s"IP_LF, wlan_encr_text[i]);
goto done;
}
/* Get/Set encryption */
if (!ipcom_strcmp(argv[2], "encr"))
{
if (argc > 6)
{
ipwlan_print_usage_encr(en);
goto done;
}
if (argc < 4)
{
if (ipwlan_ioctl(fd, IP_SIOCGIWENCRTYPE, &iwreq) < 0)
{
goto error;
}
for(i = 0; i < (int) (sizeof(ipwlan_encr_policy)/sizeof(ipwlan_encr_policy[0])); i++)
{
if (ipwlan_encr_policy[i] == iwreq.u.encr_type)
{
break;
}
}
if (i >= (int) (sizeof(wlan_encr_text)/sizeof(wlan_encr_text[0])))
ipwlan_printf(en, "%s (0x%x)"IP_LF, "unknown", iwreq.u.encr_type);
else
ipwlan_printf(en, "%s"IP_LF, wlan_encr_text[i]);
}
else
{
/* Set encryption parameters */
if (!strcmp(argv[3], "wep"))
{
if (argc < 5 || argc > 6)
{
ipwlan_print_usage_encr(en);
goto done;
}
iwreq.u.key.flags = 0;
iwreq.u.key.len = 0;
i = ipwlan_parse_ether_addr((char *)iwreq.u.key.addr,argv[4]);
if (i == IPCOM_ERR_FAILED)
{
i = ipcom_strtol(argv[4], &endp, 10);
if (*endp != '\0' || i < 1 || i > 4)
{
ipwlan_printf(en, "Error: Invalid index value allowed are 1 to 4" IP_LF);
goto done;
}
iwreq.u.key.flags |= IP_IW_KEY_FLAG_GROUP;
iwreq.u.key.index = i - 1; /* Index 1 - 4 */
}
else
{
iwreq.u.key.flags |= IP_IW_KEY_FLAG_PAIR;
}
if(argc == 6)
{
if (argv[5][0] == '0' && argv[5][1] == 'x')
{
ipwlan_parse_key(&iwreq.u.key, argv[5]);
}
else
{
/* key is a text string */
iwreq.u.key.len = ipcom_sprintf((char *)iwreq.u.key.key, "%.*s", MIN(sizeof(iwreq.u.key.key) - 1, ipcom_strlen(argv[5])), argv[5]);
}
}
else
{
iwreq.u.key.flags |= IP_IW_KEY_FLAG_NOKEY;
}
if (iwreq.u.key.len == IP_IW_KEY_WEP40_LEN)
{
iwreq.u.key.type = IP_IW_KEY_WEP40_TYPE;
}
else if (iwreq.u.key.len == IP_IW_KEY_WEP104_LEN)
{
iwreq.u.key.type = IP_IW_KEY_WEP104_TYPE;
}
else if (iwreq.u.key.len == IP_IW_KEY_TKIP_LEN)
{
iwreq.u.key.type = IP_IW_KEY_TKIP_TYPE;
}
else if (iwreq.u.key.len == IP_IW_KEY_AES_LEN)
{
iwreq.u.key.type = IP_IW_KEY_AES_TYPE;
}
if (ipwlan_ioctl(fd, IP_SIOCSIWENCRKEY, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.key.len == IP_IW_KEY_WEP40_LEN)
{
iwreq.u.encr_type = IP_IW_CIPHPOL_WEP40;
}
else if (iwreq.u.key.len == IP_IW_KEY_WEP104_LEN)
{
iwreq.u.encr_type = IP_IW_CIPHPOL_WEP104;
}
if (ipwlan_ioctl(fd, IP_SIOCSIWENCRTYPE, &iwreq) < 0)
{
goto error;
}
goto done;
}
else if (!strcmp(argv[3], "wpa"))
{
if ( argc != 5 )
{
ipwlan_print_usage_encr(en);
goto done;
}
if(argc == 5)
{
if ((argv[4][0] == '0' && argv[4][1] == 'x') || (argv[4][0] == '0' && argv[4][1] == 'X'))
{
if((ipcom_strlen(argv[4] + 2) == IP_IW_KEY_WPA_LEN)&&(ipcom_strspn((argv[4]+2), "0123456789ABCDEFabcdef")== IP_IW_KEY_WPA_LEN))
{
iwreq.u.key.len = ipcom_sprintf((char *)iwreq.u.key.key, "%.*s", MIN(sizeof(iwreq.u.key.key), ipcom_strlen(argv[4]+2)), argv[4]+2);
iwreq.u.key.flags = 0;
}
else if ((ipcom_strlen(argv[4]) >= 8) && (ipcom_strlen(argv[4]) < IP_IW_KEY_WPA_LEN ))
{
/*handle 0 x as a passphrase string*/
iwreq.u.key.len = ipcom_sprintf((char *)iwreq.u.key.key, "%.*s", MIN(sizeof(iwreq.u.key.key), ipcom_strlen(argv[4])), argv[4]);
iwreq.u.key.flags = IP_IW_KEY_FLAG_PASS;
}
else
{
ipwlan_printf(en, "Error: hex string should be 64 characters. (%d)\r\n", ipcom_strlen(argv[4] + 2));
ipwlan_printf(en, "Error: passphrase should be 8-64 characters. (%d)\r\n", ipcom_strlen(argv[4]));
goto error;
}
}
else if ((ipcom_strlen(argv[4]) >= 8) && (ipcom_strlen(argv[4]) < IP_IW_KEY_WPA_LEN ))
{
iwreq.u.key.len = ipcom_sprintf((char *)iwreq.u.key.key, "%.*s", MIN(sizeof(iwreq.u.key.key), ipcom_strlen(argv[4])), argv[4]);
iwreq.u.key.flags = IP_IW_KEY_FLAG_PASS;
}
else
{
ipwlan_printf(en, "Error: passphrase should be 8-64 characters. (%d)\r\n", ipcom_strlen(argv[4]));
goto error;
}
}
#if 0
/* dead code (coverity) */
else
{
iwreq.u.key.flags = IP_IW_KEY_FLAG_NOKEY;
}
#endif
iwreq.u.key.type = IP_IW_KEY_WPA_TYPE;
iwreq.u.key.index = 1;
if(iwreq.u.auth_type & (IP_IW_AUTHPOL_WPA_PSK|IP_IW_AUTHPOL_WPA2_PSK) )
{
if (ipwlan_ioctl(fd, IP_SIOCSIWPMKKEY, &iwreq) < 0)
{
goto error;
}
goto done;
}
if (ipwlan_ioctl(fd, IP_SIOCSIWPMKKEY, &iwreq) < 0)
{
goto error;
}
goto done;
}
else if (!strcmp(argv[3], "wpa2"))
{
if (argc != 5)
{
ipwlan_print_usage_encr(en);
goto done;
}
if(argc == 5)
{
if ((argv[4][0] == '0' && argv[4][1] == 'x') || (argv[4][0] == '0' && argv[4][1] == 'X'))
{
if((ipcom_strlen(argv[4] + 2) == IP_IW_KEY_WPA2_LEN)&&(ipcom_strspn((argv[4]+2), "0123456789ABCDEFabcdef")== IP_IW_KEY_WPA2_LEN))
{
iwreq.u.key.len = ipcom_sprintf((char *)iwreq.u.key.key, "%.*s", MIN(sizeof(iwreq.u.key.key), ipcom_strlen(argv[4]+2)), argv[4]+2);
iwreq.u.key.flags = 0;
}
else if ((ipcom_strlen(argv[4]) >= 8) && (ipcom_strlen(argv[4]) < IP_IW_KEY_WPA2_LEN ))
{
/*handle 0 x as a passphrase string*/
iwreq.u.key.len = ipcom_sprintf((char *)iwreq.u.key.key, "%.*s", MIN(sizeof(iwreq.u.key.key), ipcom_strlen(argv[4])), argv[4]);
iwreq.u.key.flags = IP_IW_KEY_FLAG_PASS;
}
else
{
ipwlan_printf(en, "Error: hex string should be 64 characters. (%d)\r\n", ipcom_strlen(argv[4] + 2));
ipwlan_printf(en, "Error: passphrase should be 8-64 characters. (%d)\r\n", ipcom_strlen(argv[4]));
goto error;
}
}
else if ((ipcom_strlen(argv[4]) >= 8) && (ipcom_strlen(argv[4]) < IP_IW_KEY_WPA2_LEN ))
{
iwreq.u.key.len = ipcom_sprintf((char *)iwreq.u.key.key, "%.*s", MIN(sizeof(iwreq.u.key.key), ipcom_strlen(argv[4])), argv[4]);
iwreq.u.key.flags = IP_IW_KEY_FLAG_PASS;
}
else
{
ipwlan_printf(en, "Error: passphrase should be 8-64 characters. (%d)\r\n", ipcom_strlen(argv[4]));
goto error;
}
}
iwreq.u.key.type = IP_IW_KEY_WPA2_TYPE;
iwreq.u.key.index = 1;
if (ipwlan_ioctl(fd, IP_SIOCSIWPMKKEY, &iwreq) < 0)
{
goto error;
}
else
goto done;
}
else if (!strcmp(argv[3], "none"))
{
iwreq.u.encr_type = IP_IW_CIPHPOL_NONE;
if (ipwlan_ioctl(fd, IP_SIOCSIWENCRTYPE, &iwreq) < 0)
{
goto error;
}
}
else if (!strcmp(argv[3], "tkip"))
{
iwreq.u.encr_type = IP_IW_CIPHPOL_TKIP;
if (ipwlan_ioctl(fd, IP_SIOCSIWENCRTYPE, &iwreq) < 0)
{
goto error;
}
}
else if (!strcmp(argv[3], "ccmp"))
{
iwreq.u.encr_type = IP_IW_CIPHPOL_CCMP;
if (ipwlan_ioctl(fd, IP_SIOCSIWENCRTYPE, &iwreq) < 0)
{
goto error;
}
}
else if (!strcmp(argv[3], "-h"))
{
ipwlan_print_usage_encr(en);
goto done;
}
else
{
goto error;
}
}
goto done;
}
/* Commit changes */
if (!ipcom_strcmp(argv[2], "commit"))
{
if (ipwlan_ioctl(fd, IP_SIOCSIWCOMMIT, &iwreq) < 0)
{
goto error;
}
goto done;
}
/* Get link quality */
if (!ipcom_strcmp(argv[2], "quality"))
{
if (argc > 3)
{
ipwlan_print_usage_quality(en);
goto done;
}
(void)ipwlan_ioctl(fd, IP_SIOCGIWAP, &iwreq);
ipcom_memcpy(oid_data, iwreq.u.addr.sa_data, 6);
ipcom_memcpy(iwreq.u.quality.bssid, oid_data, 6);
if (ipwlan_ioctl(fd, IP_SIOCGIWQUALITY, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "\r\nLink quality\r\n============\r\n");
ipwlan_printf(en, "RSSI: % 3d dBm\r\n", (int)iwreq.u.quality.level);
ipwlan_printf(en, "Rate: % 3d Mbps\r\n", (unsigned int)iwreq.u.quality.qual);
goto done;
}
if (!ipcom_strcmp(argv[2], "scan"))
{
if (argc > 5)
{
ipwlan_print_usage_scan(en);
goto error;
}
if (argc >= 4)
{
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_scan(en);
goto done;
}
else if (!ipcom_strcmp(argv[3], "mode"))
{
if (argc < 5)
{
/* Get scan mode */
if (ipwlan_ioctl(fd, IP_SIOCGIWSCANMODE, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.scanmode & IP_IW_SCANMODE_PASSIVE)
{
ipwlan_printf(en, "passive");
}
if (iwreq.u.scanmode & IP_IW_SCANMODE_ACTIVE)
{
ipwlan_printf(en, "active");
}
ipwlan_printf(en, IP_LF);
}
else
{
if (!ipcom_strcmp(argv[4], "passive"))
{
iwreq.u.scanmode = IP_IW_SCANMODE_PASSIVE;
}
else if (!ipcom_strcmp(argv[4], "active"))
{
iwreq.u.scanmode = IP_IW_SCANMODE_ACTIVE;
}
else
{
ipwlan_printf(en, "Error: Invalid scan mode. (%s)\r\n", argv[4]);
goto error;
}
/* Set scan mode */
if (ipwlan_ioctl(fd, IP_SIOCSIWSCANMODE, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
else
{
val = ipcom_strtol(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: Invalid waiting time. (%s)\r\n", argv[3]);
goto error;
}
if (val > MAX_SCAN_WAITING_TIME || val < 1)
{
ipwlan_printf(en, "Error: Illegal waiting time. Allowed are 1 - %d)\r\n", val, MAX_SCAN_WAITING_TIME);
goto error;
}
/* Start a scan */
iwreq.u.essid.pointer = ssid;
if (argc < 5)
{
iwreq.u.essid.length = 0;
}
else
{
startp = argv[4];
iwreq.u.essid.length = ipcom_sprintf(ssid, "%.*s", sizeof(ssid) - 1, startp);
}
if (ipwlan_ioctl(fd, IP_SIOCSIWSCAN, &iwreq) < 0)
{
goto error;
}
}
}
else
{
val = IP_IW_DEFAULT_SCAN_TIME;
}
/* Allow scan time */
ipcom_millisleep(val * 1000);
/* Report scan results */
iwl = ipcom_malloc(sizeof(Ipcom_iwreq) + MAX_IWREQ_LARGE_DATA);
if(iwl == IP_NULL)
{
goto error;
}
ipcom_memcpy(iwl, &iwreq, sizeof(iwreq));
iwl->u.data.length = MAX_IWREQ_LARGE_DATA;
ipcom_memset(&iwe_res, 0, sizeof(Ipcom_iw_event));
if (ipwlan_ioctl(fd, IP_SIOCGIWSCAN, iwl) == 0 && iwl->u.data.length)
{
iwap = iwl->u.data.pointer;
iwap_end = (iw_event *)((char *)iwap + iwl->u.data.length);
ipwlan_printf(en, " no bssid type ch rssi noise ssid\r\n");
ipwlan_printf(en, " --|-----------------|-----|---|----|-----|--------------------------------\r\n");
for (i = 0; iwap; iwap = ipwlan_get_next_iwap(iwap, iwap_end), i++)
{
ipcom_memset(&scanned, 0, sizeof(scanned));
for(iwe = iwap; iwe; iwe = ipwlan_get_next_iwe(iwe, iwap_end))
{
if (iwe->cmd == SIOCGIWAP)
{
scanned.bssid = (unsigned char *)&iwe->u.addr.sa_data;
}
else if (iwe->cmd == SIOCGIWESSID)
{
ipcom_memcpy(&iwe_res, iwe, IP_IW_EV_POINT_LEN);
scanned.ssid = iwe_res.u.essid.pointer;
}
else if (iwe->cmd == SIOCGIWMODE)
{
ipcom_memcpy(&iwe_res, iwe, IP_IW_EV_UINT_LEN);
scanned.mode = iwe_res.u.mode;
}
else if (iwe->cmd == SIOCGIWFREQ)
{
ipcom_memcpy(&iwe_res, iwe, IP_IW_EV_FREQ_LEN);
scanned.channel = iwe_res.u.freq.m;
}
else if (iwe->cmd == SIOCGIWSPY)
{
ipcom_memcpy(&iwe_res, iwe, IP_IW_EV_QUAL_LEN);
scanned.level = iwe_res.u.quality.level;
scanned.noise = iwe_res.u.quality.noise;
}
}
ipwlan_printf(en, " %2d", i);
ipwlan_printf(en, " %02x:%02x:%02x:%02x:%02x:%02x",
scanned.bssid[0], scanned.bssid[1], scanned.bssid[2],
scanned.bssid[3], scanned.bssid[4], scanned.bssid[5]);
ipwlan_printf(en, " %s", (scanned.mode == IP_IW_MODE_INFRA) ? "infra" : ((scanned.mode == IP_IW_MODE_ADHOC) ? "adhoc" : " ? "));
ipwlan_printf(en, " %3d", scanned.channel);
ipwlan_printf(en, " %3d", scanned.level);
ipwlan_printf(en, " %3d", (scanned.noise > 127) ? (128 - scanned.noise): scanned.noise);
ipwlan_printf(en, " %.*s\r\n", 32, scanned.ssid);
}
}
ipcom_free(iwl);
goto done;
}
/* Set/Get power management mode */
if (!ipcom_strcmp(argv[2], "pm"))
{
if (argc > 4)
{
ipwlan_print_usage_pm(en);
goto done;
}
if(argc < 4)
{
/* Get power management mode */
if (ipwlan_ioctl(fd, IP_SIOCGIWPOWERMAN, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.pm >= 1)
{
ipwlan_printf(en, "on"IP_LF);
}
else
{
ipwlan_printf(en, "off"IP_LF);
}
}
else
{
/* Set power management mode */
if (!strcmp(argv[3], "on"))
{
iwreq.u.pm = 1;
}
else if (!strcmp(argv[3], "off"))
{
iwreq.u.pm = 0;
}
else if (!strcmp(argv[3], "-h"))
{
ipwlan_print_usage_pm(en);
goto done;
}
else
{
ipwlan_printf(en, "Error: Invalid power management mode. (%s)\r\n", argv[3]);
goto error;
}
if (ipwlan_ioctl(fd, IP_SIOCSIWPOWERMAN, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Set/Get channel */
if (!ipcom_strcmp(argv[2], "channel"))
{
if (argc > 4)
{
ipwlan_print_usage_channel(en);
goto done;
}
if(argc < 4)
{
/* Get channel */
if (ipwlan_ioctl(fd, IP_SIOCGIWCHANNEL, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d"IP_LF,iwreq.u.channel);
}
else
{
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_channel(en);
goto done;
}
else if (!ipcom_strcmp(argv[3], "supp"))
{
if (argc < 5)
{
/* Get supported channels */
ret = ipwlan_ioctl(fd, IP_SIOCGIWSUPPCHAN, &iwreq);
if (ret < 0)
{
goto error;
}
ipwlan_printf(en, "[");
for (j = 0; j < iwreq.u.suppchan.count; j ++)
{
ipwlan_printf(en, " %d",iwreq.u.suppchan.chan[j]);
}
ipwlan_printf(en, " ]"IP_LF);
goto done;
}
}
else
{
/* Set channel */
i = ipcom_strtoul(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid channel value, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.channel = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWCHANNEL, &iwreq) < 0)
{
goto error;
}
}
}
goto done;
}
/* Set/Get long retry limit */
if (!ipcom_strcmp(argv[2], "lrl"))
{
if (argc > 4)
{
ipwlan_print_usage_lrl(en);
goto done;
}
if(argc < 4)
{
/* Get long retry limit */
if (ipwlan_ioctl(fd, IP_SIOCGIWLRL, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d"IP_LF,iwreq.u.lrl);
}
else
{
/* Set long retry limit */
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_lrl(en);
goto done;
}
i = ipcom_strtoul(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid long retry limit value, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.lrl = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWLRL, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Set/Get short retry limit */
if (!ipcom_strcmp(argv[2], "srl"))
{
if (argc > 4)
{
ipwlan_print_usage_srl(en);
goto done;
}
if(argc < 4)
{
/* Get short retry limit */
if (ipwlan_ioctl(fd, IP_SIOCGIWSRL, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d"IP_LF,iwreq.u.srl);
}
else
{
/* Set short retry limit */
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_srl(en);
goto done;
}
i = ipcom_strtoul(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid short retry limit value, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.srl = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWSRL, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Set/Get beacon interval */
if (!ipcom_strcmp(argv[2], "bi"))
{
if (argc > 4)
{
ipwlan_print_usage_bi(en);
goto done;
}
if(argc < 4)
{
/* Get beacon interval */
if (ipwlan_ioctl(fd, IP_SIOCGIWBEACONINT, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d (us)"IP_LF,iwreq.u.bi);
}
else
{
/* Set beacon interval */
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_bi(en);
goto done;
}
i = ipcom_strtoul(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid beacon interval, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.bi = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWBEACONINT, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Set/Get current/supported rates */
if (!ipcom_strcmp(argv[2], "rate"))
{
if (argc > 5)
{
ipwlan_print_usage_rate(en);
goto done;
}
if(argc < 4)
{
/* Get current rate */
if (ipwlan_ioctl(fd, IP_SIOCGIWRATE, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d Mbps"IP_LF,iwreq.u.rate/2);
}
else
{
if (!ipcom_strcmp(argv[3], "supp"))
{
if (argc < 5)
{
/* Get supported rates */
if (ipwlan_ioctl(fd, IP_SIOCGIWSUPPRATES, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "[");
for (j = 0; j < iwreq.u.supprates.count; j ++)
{
if ((i = iwreq.u.supprates.rates[j] & 0x7f) == 0)
{
break;
}
ipwlan_printf(en, " %d",i/2);
if (i%2)
{
ipwlan_printf(en, ".5");
}
if (iwreq.u.supprates.rates[j] & 0x80)
{
ipwlan_printf(en, "(b)");
}
}
ipwlan_printf(en, " ]"IP_LF);
goto done;
}
else
{
/* Set supported rates */
basic = 0;
iwreq.u.supprates.count = 0;
for (j = 4; j < IP_IW_MAX_RATES+4; j ++)
{
if (argv[j] == IP_NULL)
{
break;
}
/* convert the rate number to a 500kbps rate by multiplying by 2 */
r = (ipcom_strtoul(argv[j], &endp, 10) & 0x7f) * 2;
if (endp == argv[j])
{
ipwlan_printf(en, "Error: invalid rate, '%s'"IP_LF, argv[j]);
goto error;
}
if (!ipcom_strcmp(endp, ".5"))
{
r += 1;
}
/* check for a basic rate specifier */
if (!ipcom_strcmp(endp, "b"))
{
basic = 1;
r |= 0x80;
}
iwreq.u.supprates.rates[j-4] = r;
iwreq.u.supprates.count ++;
}
if (basic == 0)
{
ipwlan_printf(en, "Error: no rates marked as basic (b)\n");
goto error;
}
else
{
if (ipwlan_ioctl(fd, IP_SIOCSIWSUPPRATES, &iwreq) < 0)
{
goto error;
}
goto done;
}
}
/*goto done;*/
}
else if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_rate(en);
goto done;
}
/* Set current rate */
i = ipcom_strtoul(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid rate, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.rate = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWRATE, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Set/Get fragmentation threshold */
if (!ipcom_strcmp(argv[2], "fragthresh"))
{
if (argc > 4)
{
ipwlan_print_usage_fragthresh(en);
goto done;
}
if(argc < 4)
{
/* Get fragmentation threshold */
if (ipwlan_ioctl(fd, IP_SIOCGIWFRAGTHRESH, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d"IP_LF,iwreq.u.fragthresh);
}
else
{
/* Set fragmentation threshold */
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_fragthresh(en);
goto done;
}
i = ipcom_strtoul(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid fragmentation threshold, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.fragthresh = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWFRAGTHRESH, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Set/Get rts/cts threshold */
if (!ipcom_strcmp(argv[2], "rtsthresh"))
{
if (argc > 4)
{
ipwlan_print_usage_rtsthresh(en);
goto done;
}
if(argc < 4)
{
/* Get rts/cts threshold */
if (ipwlan_ioctl(fd, IP_SIOCGIWRTSTHRESH, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d"IP_LF,iwreq.u.rtsthresh);
}
else
{
/* Set rts/cts threshold */
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_rtsthresh(en);
goto done;
}
i = ipcom_strtoul(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid RTS/CTS threshold, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.rtsthresh = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWRTSTHRESH, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Set/Get 802.11 radio mode */
if (!ipcom_strcmp(argv[2], "radiomode"))
{
if (argc > 6)
{
ipwlan_print_usage_radiomode(en);
goto done;
}
if(argc < 4)
{
/* Get radio mode */
if (ipwlan_ioctl(fd, IP_SIOCGIWRADIOMODE, &iwreq) < 0)
{
goto error;
}
i = iwreq.u.radiomode;
if ( (i & IP_IW_RADIOMODE_11B) && (i & IP_IW_RADIOMODE_11G))
{
ipwlan_printf(en, "Auto ");
}
else
{
if (i & IP_IW_RADIOMODE_11A)
{
ipwlan_printf(en, "a ");
}
if (i & IP_IW_RADIOMODE_11B)
{
ipwlan_printf(en, "b ");
}
if (i & IP_IW_RADIOMODE_11G)
{
ipwlan_printf(en, "g ");
}
}
/* Get existing 802.11n rate settings */
iwreq.u.nmode.status = 0;
(void)ipwlan_ioctl(fd, IP_SIOCGIWRADIONSTAT, &iwreq);
if (iwreq.u.nmode.status == 1)
{
ipwlan_printf(en, ", n ");
}
else
{
ret = 0;
}
ipwlan_printf(en, IP_LF);
goto done;
}
else
{
/* Set radio mode */
i = 0;
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_radiomode(en);
goto done;
}
else if (!ipcom_strcmp(argv[3], "auto"))
{
i |= IP_IW_RADIOMODE_11G | IP_IW_RADIOMODE_11B | IP_IW_RADIOMODE_11A | IP_IW_RADIOMODE_11N;
}
else if (!ipcom_strcmp(argv[3], "a"))
{
i |= IP_IW_RADIOMODE_11A;
}
else if (!ipcom_strcmp(argv[3], "b"))
{
i |= IP_IW_RADIOMODE_11B;
}
else if (!ipcom_strcmp(argv[3], "g"))
{
i |= IP_IW_RADIOMODE_11G;
}
else if (!ipcom_strcmp(argv[3], "n"))
{
i |= IP_IW_RADIOMODE_11N;
if (argc < 5)
{
/* Get existing 802.11n rate settings */
if (ipwlan_ioctl(fd, IP_SIOCGIWRADIONRATE, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.nmode.legacymode == IP_FALSE)
{
ipwlan_printf(en, " Modulation Control Scheme index: %d"IP_LF,iwreq.u.nmode.mcs);
ipwlan_printf(en, " Legacy rate: N/A"IP_LF);
}
else
{
ipwlan_printf(en, " Modulation Control Scheme index: N/A"IP_LF);
ipwlan_printf(en, " Legacy rate: %d"IP_LF,iwreq.u.nmode.legacyrate);
}
ipwlan_printf(en, " Spacial Diversity method: ");
if (iwreq.u.nmode.std == IP_IW_MIMO_STD_SISO)
{
ipwlan_printf(en, "SISO (Single Input Single Output)"IP_LF);
}
else if (iwreq.u.nmode.std == IP_IW_MIMO_STD_CDD)
{
ipwlan_printf(en, "CDD (Cyclic Delay Diversity)"IP_LF);
}
else if (iwreq.u.nmode.std == IP_IW_MIMO_STD_STBC)
{
ipwlan_printf(en, "STBC (Space-Time Block Codes)"IP_LF);
}
else if (iwreq.u.nmode.std == IP_IW_MIMO_STD_SDM)
{
ipwlan_printf(en, "SDM (Space Division Multiplexing)"IP_LF);
}
/* Get existing 802.11n rate settings */
if (ipwlan_ioctl(fd, IP_SIOCGIWRADIONSTAT, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, " Status: ");
if (iwreq.u.nmode.status == 1)
{
ipwlan_printf(en, "enabled"IP_LF);
}
else
{
ipwlan_printf(en, " disabled"IP_LF);
}
goto done;
}
else
{
/* Get modulation/coding and spacial diversity settings */
if (ipwlan_ioctl(fd, IP_SIOCGIWRADIONRATE, &iwreq) < 0)
{
goto error;
}
if (!ipcom_strcmp(argv[4], "mcs"))
{
if (argc < 6)
{
ipwlan_printf(en, "mcs: %d std: %d"IP_LF, iwreq.u.nmode.mcs, iwreq.u.nmode.std);
goto done;
}
else
{
/* Set modulation and coding scheme */
r = ipcom_strtoul(argv[5], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid mcs, '%s'"IP_LF, argv[5]);
goto error;
}
iwreq.u.nmode.mcs = r;
if (argc > 6)
{
if (!ipcom_strcmp(argv[6], "std"))
{
r = ipcom_strtoul(argv[7], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid std, '%s'"IP_LF, argv[7]);
goto error;
}
iwreq.u.nmode.std = r;
}
}
iwreq.u.nmode.legacymode = IP_FALSE;
if (ipwlan_ioctl(fd, IP_SIOCSIWRADIONRATE, &iwreq) < 0)
{
goto error;
}
goto done;
}
}
else if (!ipcom_strcmp(argv[4], "std"))
{
if (argc < 6)
{
/* Get space time diversity scheme */
if (ipwlan_ioctl(fd, IP_SIOCGIWRADIONRATE, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "std: %d"IP_LF, iwreq.u.nmode.std);
goto done;
}
else
{
/* First, get mcs */
if (ipwlan_ioctl(fd, IP_SIOCGIWRADIONRATE, &iwreq) < 0)
{
goto error;
}
/* Set space time diversity scheme */
r = ipcom_strtoul(argv[5], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid std, '%s'"IP_LF, argv[5]);
goto error;
}
iwreq.u.nmode.std = r;
iwreq.u.nmode.legacymode = IP_FALSE;
if (ipwlan_ioctl(fd, IP_SIOCSIWRADIONRATE, &iwreq) < 0)
{
goto error;
}
goto done;
}
}
else if (!ipcom_strcmp(argv[4], "legacy"))
{
if (argc < 6)
{
/* Get legacy rate */
if (ipwlan_ioctl(fd, IP_SIOCGIWRADIONRATE, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.nmode.legacymode == IP_TRUE)
{
ipwlan_printf(en, "%d", iwreq.u.nmode.legacyrate);
}
else
{
ipwlan_printf(en, "disabled"IP_LF);
}
goto done;
}
else
{
/* Set legacy rate */
/* convert the rate number to a 500kbps rate */
/* r = ipcom_strtoul(argv[5], &endp, 10) & 0x7f * 2; */
r = ipcom_strtoul(argv[5], &endp, 10) * 2;
if (endp == argv[5])
{
ipwlan_printf(en, "Error: invalid rate, '%s'"IP_LF, argv[5]);
goto error;
}
if (!ipcom_strcmp(endp, ".5"))
{
r += 1;
}
iwreq.u.nmode.legacyrate = r;
iwreq.u.nmode.legacymode = IP_TRUE;
if (ipwlan_ioctl(fd, IP_SIOCSIWRADIONRATE, &iwreq) < 0)
{
goto error;
}
goto done;
}
}
else if (!ipcom_strcmp(argv[4], "on"))
{
/* Enable 802.11n capabilities */
iwreq.u.nmode.status = 1;
if (ipwlan_ioctl(fd, IP_SIOCSIWRADIONSTAT, &iwreq) < 0)
{
goto error;
}
goto done;
}
else if (!ipcom_strcmp(argv[4], "off"))
{
/* Disable 802.11n capabilities */
iwreq.u.nmode.status = 0;
if (ipwlan_ioctl(fd, IP_SIOCSIWRADIONSTAT, &iwreq) < 0)
{
goto error;
}
goto done;
}
else if (!ipcom_strcmp(argv[4], "bw"))
{
/* get/set mimo txbw (2=20Mhz(lower), 3=20Mhz upper, 4=40Mhz, 5=40Mhz dup<mcs32 only */
if(argc < 6)
{
/* Get current mimo bandwidth */
if (ipwlan_ioctl(fd,IP_SIOCGIWMIMOTXBW, &iwreq) < 0)
{
goto error;
}
if(iwreq.u.mimobw==IP_IW_MIMO_BW_40MHZ)
ipwlan_printf(en, "40 MHz"IP_LF);
else if(iwreq.u.mimobw==IP_IW_MIMO_BW_20MHZ_LOWER)
ipwlan_printf(en, "20 MHz (lower)"IP_LF);
else if(iwreq.u.mimobw==IP_IW_MIMO_BW_20MHZ_UPPER)
ipwlan_printf(en, "20 MHz (upper)"IP_LF);
else
ipwlan_printf(en, "unknown"IP_LF);
}
else
{
i = ipcom_strtol(argv[5], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: Invalid bandwidth" IP_LF);
goto done;
}
if (i == 40)
{
i = IP_IW_MIMO_BW_40MHZ;
j |= (IP_IW_CHANSPEC_BW_40 | IP_IW_CHANSPEC_CTL_SB_NONE);
}
else if (i == -20)
{
i = IP_IW_MIMO_BW_20MHZ_LOWER;
j |= (IP_IW_CHANSPEC_BW_20 | IP_IW_CHANSPEC_CTL_SB_LOWER);
}
else if (i == 20)
{
i = IP_IW_MIMO_BW_20MHZ_UPPER;
j |= (IP_IW_CHANSPEC_BW_20 | IP_IW_CHANSPEC_CTL_SB_UPPER);
}
else
{
goto error;
}
/* Get channel */
if (ipwlan_ioctl(fd, IP_SIOCGIWCHANNEL, &iwreq) < 0)
{
goto error;
}
j = iwreq.u.channel;
j |= IP_IW_CHANSPEC_BAND_2G;
(void)ipwlan_ioctl(fd, IP_SIOCSIWCHANNELMIMO, &iwreq);
iwreq.u.mimobw = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWMIMOTXBW, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
}
}
else
{
ipwlan_printf(en, "Error: invalid radio mode, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.radiomode = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWRADIOMODE, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Get/Set Access control list */
if (!ipcom_strcmp(argv[2], "acl"))
{
if (argc > 5)
{
ipwlan_print_usage_acl(en);
goto done;
}
if (argc < 4)
{
/* Get Access control list */
iwl = ipcom_malloc(sizeof(Ipcom_iwreq) + MAX_IWREQ_LARGE_DATA);
if(iwl == IP_NULL)
{
goto error;
}
ipcom_memcpy(iwl, &iwreq, sizeof(iwreq));
iwl->u.data.length = MAX_IWREQ_LARGE_DATA;
ipcom_memset(&iwe_res, 0, sizeof(Ipcom_iw_event));
if (ipwlan_ioctl(fd, IP_SIOCGIWACL, iwl) == 0 && iwl->u.data.length)
{
iwap = iwl->u.data.pointer;
iwap_end = (iw_event *)((char *)iwap + iwl->u.data.length);
ipwlan_printf(en, " no|bssid \r\n");
ipwlan_printf(en, " --|-----------------|\r\n");
for (i = 0; iwap; iwap = ipwlan_get_next_iwap(iwap, iwap_end), i++)
{
ipcom_memset(&scanned, 0, sizeof(scanned));
for(iwe = iwap; iwe; iwe = ipwlan_get_next_iwe(iwe, iwap_end))
{
if (iwe->cmd == SIOCGIWAP)
{
scanned.bssid = (unsigned char *)&iwe->u.addr.sa_data;
}
}
ipwlan_printf(en, " %2d", i);
ipwlan_printf(en, " %02x:%02x:%02x:%02x:%02x:%02x"IP_LF,
scanned.bssid[0], scanned.bssid[1], scanned.bssid[2],
scanned.bssid[3], scanned.bssid[4], scanned.bssid[5]);
}
}
ipcom_free(iwl);
goto done;
}
else
{
if (!ipcom_strcmp(argv[3], "mode"))
{
if (argc < 5)
{
/* Get access control mode */
if (ipwlan_ioctl(fd, IP_SIOCGIWACLMODE, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.aclmode == IP_IW_ACL_NONE)
{
ipwlan_printf(en, "disabled"IP_LF);
}
else if (iwreq.u.aclmode == IP_IW_ACL_ALLOW)
{
ipwlan_printf(en, "allow"IP_LF);
}
else if (iwreq.u.aclmode == IP_IW_ACL_DENY)
{
ipwlan_printf(en, "deny"IP_LF);
}
goto done;
}
else
{
/* Set access control list mode */
if (!ipcom_strcmp(argv[4], "allow"))
{
iwreq.u.aclmode = IP_IW_ACL_ALLOW;
}
else if (!ipcom_strcmp(argv[4], "deny"))
{
iwreq.u.aclmode = IP_IW_ACL_DENY;
}
if (ipwlan_ioctl(fd, IP_SIOCSIWACLMODE, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
else if (!ipcom_strcmp(argv[3], "add"))
{
(void)ipwlan_parse_ether_addr(iwreq.u.addr.sa_data, argv[4]);
if (ipwlan_ioctl(fd, IP_SIOCSIWACLADD, &iwreq) < 0)
{
goto error;
}
goto done;
}
else if (!ipcom_strcmp(argv[3], "del"))
{
(void)ipwlan_parse_ether_addr(iwreq.u.addr.sa_data, argv[4]);
if (ipwlan_ioctl(fd, IP_SIOCSIWACLDEL, &iwreq) < 0)
{
goto error;
}
goto done;
}
else
{
ipwlan_print_usage_acl(en);
goto done;
}
}
/*goto error;*/
}
/* Set/Get power scale factor */
if (!ipcom_strcmp(argv[2], "ps"))
{
if (argc > 4)
{
ipwlan_print_usage_ps(en);
goto done;
}
if(argc < 4)
{
/* Get power scale factor */
if (ipwlan_ioctl(fd, IP_SIOCGIWPOWERSCALE, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.ps >= 1)
{
ipwlan_printf(en, "%d"IP_LF, iwreq.u.ps);
}
else
{
ipwlan_printf(en, "%d"IP_LF, iwreq.u.ps);
}
}
else
{
/* Set power scale factor */
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_ps(en);
goto done;
}
i = ipcom_strtoul(argv[3], &endp, 10);
if (endp == '\0' || i < 0 || i > 100)
{
ipwlan_printf(en, "Error: invalid powerscale factor, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.pm = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWPOWERSCALE, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Set/Get country code */
if (!ipcom_strcmp(argv[2], "country"))
{
if (argc > 4)
{
ipwlan_print_usage_country(en);
goto done;
}
if(argc < 4)
{
/* Get country code */
if (ipwlan_ioctl(fd, IP_SIOCGIWCOUNTRYCODE, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d"IP_LF, iwreq.u.countrycode);
}
else
{
/* Set country code */
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_country(en);
goto done;
}
i = ipcom_strtoul(argv[3], &endp, 10);
if (endp == '\0' || i < 0)
{
ipwlan_printf(en, "Error: invalid country code, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.countrycode = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWCOUNTRYCODE, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Set/Get/Create bss */
if (!ipcom_strcmp(argv[2], "bss"))
{
if (argc > 5)
{
ipwlan_print_usage_bss(en);
goto done;
}
if(argc < 4)
{
/* Get current bss index */
if (ipwlan_ioctl(fd, IP_SIOCGIWBSSINDEX, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d"IP_LF,iwreq.u.bssindex);
}
else
{
if (!ipcom_strcmp(argv[3], "add"))
{
/* Add BSS */
if (ipwlan_ioctl(fd, IP_SIOCSIWBSSADD, &iwreq) < 0)
{
goto error;
}
}
else if (!ipcom_strcmp(argv[3], "del"))
{
/* Del BSS */
i = ipcom_strtoul(argv[4], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid bss index, '%s'"IP_LF, argv[4]);
goto error;
}
iwreq.u.bssindex = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWBSSDEL, &iwreq) < 0)
{
goto error;
}
}
else if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_bss(en);
goto done;
}
else
{
/* Set bss index*/
i = ipcom_strtoul(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid bss index, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.bssindex = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWBSSINDEX, &iwreq) < 0)
{
goto error;
}
}
}
goto done;
}
/* Enable / Disable 802.11d regulatory mode */
if (!ipcom_strcmp(argv[2], "regulatory"))
{
if (argc > 4)
{
ipwlan_print_usage_regulatory(en);
goto done;
}
if(argc < 4)
{
/* Get current regulatory mode */
if (ipwlan_ioctl(fd, IP_SIOCGIWREGMODE, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.regmode == 0)
{
ipwlan_printf(en, "off"IP_LF);
}
else
{
ipwlan_printf(en, "on"IP_LF);
}
}
else
{
/* Set regulatory mode */
if (!ipcom_strcmp(argv[3], "on"))
{
iwreq.u.regmode = 1;
}
else if (!ipcom_strcmp(argv[3], "off"))
{
iwreq.u.regmode = 0;
}
else
{
ipwlan_print_usage_regulatory(en);
goto done;
}
if (ipwlan_ioctl(fd, IP_SIOCSIWREGMODE, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Get overall system status */
if (!ipcom_strcmp(argv[2], "status"))
{
if(argc < 4)
{
/* Call every ioctl to retrieve system status */
/* general */
status_argv[0] = "wifi";
status_argv[1] = iwreq.if_name;
/* mode */
status_argv[2] = "mode";
ipwlan_printf(en, "Mode: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* ssid */
status_argv[2] = "ssid";
ipwlan_printf(en, "SSID: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* channel */
status_argv[2] = "channel";
ipwlan_printf(en, "Channel: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* radio mode */
status_argv[2] = "radiomode";
ipwlan_printf(en, "Current Radio Mode: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* radio mode n enabled */
status_argv[2] = "radiomode";
status_argv[3] = "n";
ipwlan_printf(en, "802.11n: "IP_LF);
ipwlan_cmd_wlan_en(en, 4, status_argv);
/* rate */
status_argv[2] = "rate";
ipwlan_printf(en, "Rate: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* encryption type */
status_argv[2] = "encr";
ipwlan_printf(en, "Unicast Encryption type: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* encryption type */
status_argv[2] = "mcast_encr";
ipwlan_printf(en, "Multicast Encryption type: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* auth type */
status_argv[2] = "auth";
ipwlan_printf(en, "Authentication Type: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* country code */
status_argv[2] = "country";
ipwlan_printf(en, "Country Code: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* power scale */
status_argv[2] = "ps";
ipwlan_printf(en, "Power Scale Factor: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* fragthresh */
status_argv[2] = "fragthresh";
ipwlan_printf(en, "Fragmentation Threshold: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* rtsthresh */
status_argv[2] = "rtsthresh";
ipwlan_printf(en, "RTS/CTS Threshold: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* srl */
status_argv[2] = "srl";
ipwlan_printf(en, "Short Retry Limit: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* lrl */
status_argv[2] = "lrl";
ipwlan_printf(en, "Long Retry Limit: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
if(ipwlan_ioctl(fd, IP_SIOCGIWMODE, &iwreq) < 0)
{
goto error;
}
/* Station only features */
if(iwreq.u.mode == IP_IW_MODE_INFRA || iwreq.u.mode == IP_IW_MODE_AUTO || iwreq.u.mode == IP_IW_MODE_ADHOC)
{
status_argv[2] = "scan";
status_argv[3] = "mode";
ipwlan_printf(en, "Scan Mode: ");
ipwlan_cmd_wlan_en(en, 4, status_argv);
/* pm */
status_argv[2] = "pm";
ipwlan_printf(en, "Power Management: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
}
/* AP / Adhoc only features */
else if(iwreq.u.mode == IP_IW_MODE_ADHOC || iwreq.u.mode == IP_IW_MODE_MASTER)
{
/* broadcast ssid */
status_argv[2] = "ssid";
status_argv[3] = "broadcast";
ipwlan_printf(en, "Broadcast SSID: ");
ipwlan_cmd_wlan_en(en, 4, status_argv);
/* beacon interval */
status_argv[2] = "bi";
ipwlan_printf(en, "Beacon Interval: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* bss index */
status_argv[2] = "bss";
ipwlan_printf(en, "Current BSS: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* acl list */
status_argv[2] = "acl";
ipwlan_printf(en, "Access Control List: "IP_LF);
ipwlan_cmd_wlan_en(en, 3, status_argv);
/* 802.11d enabled */
status_argv[2] = "regulatory";
ipwlan_printf(en, "802.11d Regulatory Mode: ");
ipwlan_cmd_wlan_en(en, 3, status_argv);
}
}
else
{
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_status(en);
goto done;
}
}
goto done;
}
/* Set/Get debug level */
if (!ipcom_strcmp(argv[2], "debug"))
{
if(argc < 4)
{
/* Get current debug level */
if (ipwlan_ioctl(fd, IP_SIOCGIWDEBUGLEVEL, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "0x%08x"IP_LF,iwreq.u.debuglevel);
}
else
{
if (!ipcom_strcmp(argv[3], "-h"))
{
/* Get debug options*/
if (ipwlan_ioctl(fd, IP_SIOCGIWDEBUGOPTIONS, &iwreq) < 0)
{
goto error;
}
data = (char *)&iwreq.u.data.pointer;
for (i=0; i < IP_IW_MAX_DEBUG_LEVELS; i++)
{
dbg_lvl = (Ipcom_iw_debug_level *)data;
if (dbg_lvl->value == IP_NULL && dbg_lvl->description == IP_NULL)
{
break;
}
ipwlan_printf(en, "0x%08x: %s"IP_LF, dbg_lvl->value,dbg_lvl->description);
data += sizeof(Ipcom_iw_debug_level);
}
}
else
{
/* Set debug level */
if (argv[3][0] == '0' && argv[3][1] == 'x')
{
i = ipcom_strtol(argv[3]+2, &endp, 16);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid debug level, '%s'"IP_LF, argv[3]);
goto error;
}
}
else
{
ipwlan_printf(en, "Error: invalid debug level, '%s'"IP_LF, argv[3]);
}
iwreq.u.debuglevel = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWDEBUGLEVEL, &iwreq) < 0)
{
goto error;
}
}
}
goto done;
}
/* Get system statistics */
if (!ipcom_strcmp(argv[2], "statistics"))
{
if(argc < 4)
{
iwl = ipcom_malloc(sizeof(Ipcom_iwreq) + MAX_IWREQ_LARGE_DATA);
if(iwl == IP_NULL)
{
goto error;
}
ipcom_memcpy(iwl, &iwreq, sizeof(iwreq));
iwl->u.data.length = MAX_IWREQ_LARGE_DATA;
if (ipwlan_ioctl(fd, IP_SIOCGIWSTATISTICS, iwl) < 0)
{
goto error;
}
data = iwl->u.data.pointer;
for (i=0; i < IP_IW_MAX_STATISTICS; i++)
{
stat = (Ipcom_iw_statistic *)data;
if (stat->value == IP_NULL && stat->description == IP_NULL)
{
break;
}
ipwlan_printf(en, "%s: %lld"IP_LF,stat->description,stat->value);
data += sizeof(Ipcom_iw_statistic);
}
ipcom_free(iwl);
}
else
{
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_statistics(en);
goto done;
}
}
goto done;
}
/* Set/Get/Create vlan */
if (!ipcom_strcmp(argv[2], "vlan"))
{
if (argc > 4)
{
ipwlan_print_usage_vlan(en);
goto done;
}
if(argc < 4)
{
/* Get current bss index */
if (ipwlan_ioctl(fd, IP_SIOCGIWVLAN, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "%d"IP_LF,iwreq.u.vlan);
}
else
{
/* Set vlan */
if (!ipcom_strcmp(argv[3], "-h"))
{
ipwlan_print_usage_vlan(en);
goto done;
}
i = ipcom_strtoul(argv[3], &endp, 10);
if (*endp != '\0')
{
ipwlan_printf(en, "Error: invalid vlan, '%s'"IP_LF, argv[3]);
goto error;
}
iwreq.u.vlan = i;
if (ipwlan_ioctl(fd, IP_SIOCSIWVLAN, &iwreq) < 0)
{
goto error;
}
}
goto done;
}
/* Turn On/Off Multiple ssid */
if (!ipcom_strcmp(argv[2], "mbss"))
{
if (argc > 4)
{
ipwlan_print_usage_mbss(en);
goto done;
}
if(argc < 4)
{
/* Get current bss index */
if (ipwlan_ioctl(fd, IP_SIOCGIWMBSS, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.mbss == 0)
{
ipwlan_printf(en, "off"IP_LF);
}
else
{
ipwlan_printf(en, "on"IP_LF);
}
}
else
{
if (!strcmp(argv[3], "on"))
{
/* Turn on mssid */
iwreq.u.mbss = 1;
if (ipwlan_ioctl(fd, IP_SIOCSIWMBSS, &iwreq) < 0)
{
goto error;
}
}
else if (!strcmp(argv[3], "off"))
{
/* Turn off mssid */
iwreq.u.mbss = 0;
if (ipwlan_ioctl(fd, IP_SIOCSIWMBSS, &iwreq) < 0)
{
goto error;
}
}
else
{
ipwlan_print_usage_mbss(en);
goto done;
}
}
goto done;
}
/* wmm: wme on/off */
if (!ipcom_strcmp(argv[2], "wme"))
{
if (argc > 4)
{
ipwlan_print_usage_wme(en);
goto done;
}
if(argc < 4)
{
/* Get current wme status */
if (ipwlan_ioctl(fd, IP_SIOCGIWMM, &iwreq) < 0)
{
goto error;
}
if (iwreq.u.wme == 0)
{
ipwlan_printf(en, "off"IP_LF);
}
else if((int)iwreq.u.wme == -1)
{
ipwlan_printf(en, "auto"IP_LF);
}
else if(iwreq.u.wme == 1 )
{
ipwlan_printf(en, "on"IP_LF);
}
else
{
ipwlan_printf(en, "unknown"IP_LF);
}
}
else
{
if (!ipcom_strcmp(argv[3], "on"))
{
/* Turn on mssid */
iwreq.u.wme = 1;
if (ipwlan_ioctl(fd,IP_SIOCSIWMM, &iwreq) < 0)
{
goto error;
}
}
else if (!ipcom_strcmp(argv[3], "off"))
{
/* Turn off mssid */
iwreq.u.wme = 0;
if (ipwlan_ioctl(fd, IP_SIOCSIWMM, &iwreq) < 0)
{
goto error;
}
}
else
{
ipwlan_print_usage_wme(en);
goto done;
}
}
goto done;
}
/* wme: access category get for ap/sta */
if (!ipcom_strcmp(argv[2], "wme_ac"))
{
int count =0;
if (argc > 4 || argc < 4)
{
ipwlan_print_usage_wmeac(en);
goto done;
}
if(argc < 5)
{
/* Get current ap/sta wme edcf parameter*/
if (!ipcom_strcmp(argv[3], "ap"))
{
iwreq.u.value32=1; /* getting parameter for ap */
}
else if(!ipcom_strcmp(argv[3], "sta"))
{
iwreq.u.value32=0; /* getting parameter for sta*/
}
else
{
ipwlan_print_usage_wmeac(en);
goto done;
}
if (ipwlan_ioctl(fd,IP_SIOCGIWMMAC, &iwreq) < 0)
{
goto error;
}
ipwlan_printf(en, "\taci\tacm\taifsn\tecwmin\tecwmax\ttxop"IP_LF);
for (count = 0; count < IP_IW_AC_COUNT; count++)
{
ipwlan_printf(en, "\t%s\t%d\t%d\t%d\t%d\t0x%x"IP_LF,
IP_IW_WMM_AC_CATEGORY[count],iwreq.u.edcf[count].acm,iwreq.u.edcf[count].aifsn,iwreq.u.edcf[count].ecwmin,
iwreq.u.edcf[count].ecwmax,iwreq.u.edcf[count].txop);
}
}
goto done;
}
error:
ipwlan_printf(en, "Error: command %s failed"IP_LF, argv[2]);
ret = IPCOM_ERR_FAILED;
done:
(void)ipcom_socketclose(fd);
return ret;
}
/*
*===========================================================================
* ipwlan_cmd_wlan
*===========================================================================
* Description: Executes shell commands. Prints output to console
* Parameters:
* Returns: Non-zero on failure
*/
IP_PUBLIC int ipwlan_cmd_wlan(int argc, char **argv)
{
return ipwlan_cmd_wlan_en(1, argc, argv);
}
/*
*===========================================================================
* ipwlan_cmd_wlan_silent
*===========================================================================
* Description: Executes shell commands. Printouts are disabled
* Parameters:
* Returns: Non-zero on failure
*/
IP_PUBLIC int
ipwlan_cmd_wlan_silent(int argc, char **argv)
{
return ipwlan_cmd_wlan_en(0, argc, argv);
}
Ip_u8 convertDecimalToKeycode(Ip_u8 dec)
{
Ip_u8 decimalTokeycode[]={48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70};
dec &=0x0f;
return decimalTokeycode[dec];
}
/*
*===========================================================================
* END OF FILE
*===========================================================================
*/