blob: 5e5c2c36d2434bae3bb9c28d36d6510350e82a6f [file] [log] [blame]
/*
* Copyright (c) 2012 Qualcomm Atheros, Inc..
* All Rights Reserved.
* Qualcomm Atheros Confidential and Proprietary.
*/
#define SUPPORT_11N
#include "libtcmd.h"
#include <sys/types.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#include <a_config.h>
#include <a_osapi.h>
#include <athdefs.h>
#include <a_types.h>
#include <wmi.h>
#include "athdrv_linux.h"
#include "ieee80211.h"
#include "ieee80211_ioctl.h"
#include "wmiconfig.h"
#include "pkt_log.h"
#include "wmi.h"
#include "dbglog.h"
#include "testcmd.h"
#define TO_LOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c)+ 0x20) : (c))
#define ISDIGIT(c) ( (((c) >= '0') && ((c) <= '9')) ? (1) : (0) )
//static int send_connect_cmd();
//static int send_scan_probedssid_cmd();
static int _from_hex(char c);
//static A_INT8 getPhyMode(char *pArg);
static A_UINT16 wmic_ieee2freq(int chan);
static A_STATUS wmic_ether_aton(const char *orig, A_UINT8 *eth);
void printTargetStats(TARGET_STATS *pStats);
static A_STATUS
wmic_get_ip(const char *ipstr, A_UINT32 *ip);
A_STATUS
wmic_validate_setkeepalive(WMI_SET_KEEPALIVE_CMD_EXT *cmd, char **argv);
A_STATUS
wmic_validate_roam_ctrl(WMI_SET_ROAM_CTRL_CMD *pRoamCtrl, A_UINT8 numArgs,
char **argv);
A_STATUS
wmic_validate_appie(struct ieee80211req_getset_appiebuf *appIEInfo, char **argv);
void rx_cb(void *buf, int len);
A_STATUS
wmic_validate_mgmtfilter(A_UINT32 *pMgmtFilter, char **argv);
void convert_hexstring_bytearray(char *hexStr, A_UINT8 *byteArray,
A_UINT8 numBytes);
//static int is_mac_null(A_UINT8 *mac);
void print_wild_mac(unsigned char *mac, char wildcard);
A_STATUS wmic_ether_aton_wild(const char *orig, A_UINT8 *eth, A_UINT8 *wild);
void printBtcoexConfig(WMI_BTCOEX_CONFIG_EVENT * pConfig);
void printBtcoexStats(WMI_BTCOEX_STATS_EVENT * pStats);
#ifdef ATH_INCLUDE_PAL
void *phy_attach(char *if_name);
int pal_send_hci_cmd(void *dev, char *buf, short sz);
int pal_send_acl_data_pkt(void *dev, char *buf, short sz);
void cmdParser(A_UINT8 *cmd,A_UINT16 len);
void palData(A_UINT8 *data,A_UINT32 len);
extern int eventLogLevel; //To enable/disable Debug messages. defined in pal parser library
const char palcommands[]=
"--sendpalcmd <filename> <on/off> ; on - enable debug; off - disable debug \n\
--sendpaldata <filename> <on/off>; on - enable debug; off - disable debug \n";
#endif
const char *progname;
const char commands[] =
"commands:\n\
--version\n\
--power <mode> where <mode> is rec or maxperf\n\
--getpower is used to get the power mode(rec or maxperf)\n\
--pmparams --it=<msec> --np=<number of PS POLL> --dp=<DTIM policy: ignore/normal/stick> --twp=<Tx wakeup policy: wakeup/sleep> --nt=<number of tx to wakeup>\n\
--psparams --psPollTimer=<psPollTimeout> --triggerTimer=<triggerTimeout> --apsdTimPolicy=<ignore/adhere> --simulatedAPSDTimPolicy=<ignore/adhere>\n\
--forceAssert \n\
--ibsspmcaps --ps=<disable/atheros/ieee> --aw=<ATIM Windows in millisecond> --to=<TIMEOUT in millisecond> --ttl=<Time to live in number of beacon periods>\n\
--appsparams --pstype=<disable/atheros> --psit=<millisecond> --psperiod=<in microsecond> --sleepperiod=<in psperiods>\n\
--scan --fgstart=<sec> --fgend=<sec> --bg=<sec> --minact=<msec> maxact=<msec> --pas=<msec> --sr=<short scan ratio> --maxact2pas=<msec> --scanctrlflags <connScan> <scanConnected> <activeScan> <roamScan> <reportBSSINFO> <EnableAutoScan> --maxactscan_ssid=<Max no of active scan per probed ssid>\n\
where: \n\\n\
<connScan> is 0 to not scan when Connect and Reconnect command, \n\
1 to scan when Connect and Reconnect command, \n\
<scanConnected> is 0 to skip the ssid it is already connected to, \n\
1 to scan the ssid it is already connected to, \n\
<activeScan> is 0 to disable active scan, \n\
1 to enable active scan, \n\
<roamScan> is 0 to disable roam scan when beacom miss and low rssi.(It's only valible when connScan is 0.\n\
1 to enable roam scan.\n\
<reportBSSINFO> is 0 to disable specified BSSINFO reporting rule.\n\
1 to enable specified BSSINFO reporting rule.\n\
<EnableAutoScan> is 0 to disable autonomous scan. No scan after a disconnect event\n\
1 Enable autonomous scan.\n\
--listen=<#of TUs, can range from 15 to 5000>\n\
--listenbeacons=<#of beacons, can range from 1 to 50>\n\
--setbmisstime <#of TUs, can range from 1000 to 5000>\n\
--setbmissbeacons <#of beacons, can range from 5 to 50>\n\
--filter=<filter> --ieMask 0x<mask> where <filter> is none, all, profile, not_profile, bss, not_bss, or ssid and <mask> is a combination of the following\n\
{\n\
BSS_ELEMID_CHANSWITCH = 0x01 \n\
BSS_ELEMID_ATHEROS = 0x02\n\
}\n\
--wmode <mode> <list> sc <scan> where \n\
<mode> is a, g, b,ag, gonly (use mode alone in AP mode) \n\
<list> is a list of channels (frequencies in mhz or ieee channel numbers)\n\
<scan> is 0 to disable scan after setting channel list.\n\
1 to enable scan after setting channel list.\n\
--getwmode \n\
--ssid <index> <ssid> \n\
where <ssid> is the wireless network string,'any' mean empty ssid, 'off' means disable \n\
<index> is 0 ~ 15 \n\
--badAP=<macaddr> [--num=<index>] where macaddr is macaddr of AP to be avoided in xx:xx:xx:xx:xx:xx format, and num is index from 0-1.\n\
--clrAP [--num=<index>] is used to clear a badAP entry. num is index from 0-1\n\
--createqos <user priority> <direction> <traffic class> <trafficType> <voice PS capability> \n\
<min service interval> <max service interval> <inactivity interval> <suspension interval> \n\
<service start time> <tsid> <nominal MSDU> <max MSDU> <min data rate> <mean data rate> \n\
<peak data rate> <max burst size> <delay bound> <min phy rate> <sba> <medium time>where:\n\
<user priority> 802.1D user priority range : 0-7 \n\
<direction> is 0 for Tx(uplink) traffic, \n\
1 for Rx(downlink) traffic, \n\
2 for bi-directional traffic; \n\
<traffic class> is 0 for BE, \n\
1 for BK, \n\
2 for VI, \n\
3 for VO; \n\
<trafficType> 1-periodic, 0-aperiodic \n\
<voice PS capability> specifies whether the voice power save mechanism \n\
(APSD if AP supports it or legacy/simulated APSD \n\
[using PS-Poll] ) should be used \n\
= 0 to disable voice power save for this traffic class,\n\
= 1 to enable APSD voice power save for this traffic class,\n\
= 2 to enable voice power save for ALL traffic classes,\n\
<min service interval> in milliseconds \n\
<max service interval> in milliseconds \n\
<inactivity interval> in milliseconds;=0 means infinite inactivity interval\n\
<suspension interval> in milliseconds \n\
<service start time> service start time \n\
<tsid> TSID range: 0-15 \n\
<nominal MSDU> nominal MAC SDU size \n\
<max MSDU> maximum MAC SDU size \n\
<min data rate> min data rate in bps \n\
<mean data rate> mean data rate in bps \n\
<peak data rate> peak data rate in bps \n\
<max burst size> max burst size in bps \n\
<delay bound> delay bound \n\
<min phy rate> min phy rate in bps \n\
<sba> surplus bandwidth allowance \n\
<medium time> medium time in TU of 32-us periods per sec \n\
--deleteqos <trafficClass> <tsid> where:\n\
<traffic class> is 0 for BE, \n\
1 for BK, \n\
2 for VI, \n\
3 for VO; \n\
<tsid> is the TspecID, use --qosqueue option to get the active tsids\n\
--qosqueue <traffic class>, where:\n\
<traffic class> is 0 for BE, \n\
1 for BK, \n\
2 for VI, \n\
3 for VO; \n\
--getTargetStats --clearStats\n\
tx_unicast_rate, rx_unicast_rate values will be 0Kbps when no tx/rx \n\
unicast data frame is received.\n\
--setErrorReportingBitmask\n\
--acparams --acval <0-3> --txop <limit> --cwmin <0-15> --cwmax <0-15> --aifsn<0-15>\n\
--disc=<timeout> to set the disconnect timeout in seconds\n\
--mode <mode> set the optional mode, where mode is special or off \n\
--sendframe <frmType> <dstaddr> <bssid> <optIEDatalen> <optIEData> where:\n\
<frmType> is 1 for probe request frame,\n\
2 for probe response frame,\n\
3 for CPPP start,\n\
4 for CPPP stop, \n\
<dstaddr> is the destination mac address, in xx:xx:xx:xx:xx:xx format, \n\
<bssid> is the bssid, in xx:xx:xx:xx:xx:xx format, \n\
<optIEDatalen> optional IE data length,\n\
<optIEData> is the pointer to optional IE data arrary \n\
--adhocbssid <macaddr> where macaddr is the BSSID for IBSS to be created in xx:xx:xx:xx:xx:xx format\n\
--beaconintvl <beacon_interval in milliseonds> \n\
--getbeaconintvl \n\
--setretrylimits <frameType> <trafficClass> <maxRetries> <enableNotify>\n\
<frameType> is 0 for management frame, \n\
1 for control frame,\n\
2,for data frame;\n\
<trafficClass> is 0 for BE, 1 for BK, 2 for VI, 3 for VO, only applies to data frame type\n\
<maxRetries> is # in [2 - 13]; \n\
<enableNotify> is \"on\" to enable the notification of max retries exceed \n\
\"off\" to disable the notification of max retries excedd \n\
--rssiThreshold <weight> <pollTimer> <above_threshold_tag_1> <above_threshold_val_1> ... \n\
<above_threshold_tag_6> <above_threshold_val_6> \n\
<below_threshold_tag_1> <below_threshold_val_1> ... \n\
<below_threshold_tag_6> <below_threshold_val_6> \n\
<weight> share with snrThreshold\n\
<threshold_x> will be converted to negatvie value automatically, \n\
i.e. input 90, actually -90 will be set into HW\n\
<pollTimer> is timer to poll rssi value(factor of LI), set to 0 will disable all thresholds\n\
\n\
--snrThreshold <weight> <upper_threshold_1> ... <upper_threshold_4> \n\
<lower_threshold_1> ... <lower_threshold_4> <pollTimer>\n\
<weight> share with rssiThreshold\n\
<threshold_x> is positive value, in ascending order\n\
<pollTimer> is timer to poll snr value(factor of LI), set to 0 will disable all thresholds\n\
\n\
--cleanRssiSnr \n\
--lqThreshold <enable> <upper_threshold_1> ... <upper_threshold_4>\n\
<lower_threshold_1> ... <lower_threshold_4>\n\
<enable> is 0 for disable,\n\
1 for enable lqThreshold\n\
<threshold_x> is in ascending order \n\
--setlongpreamble <enable>\n\
<enable> is 0 for diable,\n\
1 for enable.\n\
--setRTS <pkt length threshold>\n\
--getRTS \n\
--startscan --homeDwellTime=<msec> --forceScanInt<ms> --forceScanFlags <scan type> <forcefgscan> <isLegacyCisco> --scanlist <list> where:\n\
<homeDwellTime> Maximum duration in the home channel(milliseconds),\n\
<forceScanInt> Time interval between scans (milliseconds),\n\
<scan type> is 0 for long scan,\n\
1 for short scan,\n\
<forcefgscan> is 0 for disable force fgscan,\n\
1 for enable force fgscan,\n\
<isLegacyCisco> is 0 for disable legacy Cisco AP compatible,\n\
1 for enable legacy Cisco AP compatible,\n\
<list> is a list of channels (frequencies in mhz or ieee channel numbers)\n\
--setfixrates <rate index> where: \n\
<rate index> is {0 1M},{1 2M},{2 5.5M},{3 11M},{4 6M},{5 9M},{6 12M},{7 18M},{8 24M},{9 36M},{10 48M},{11 54M},\n\
if want to config more rare index, can use blank to space out, such as: --setfixrates 0 1 2 \n\
--getfixrates : Get the fix rate index from target\n\
--setauthmode <mode> where:\n\
<mode> is 0 to do authentication when reconnect, \n\
1 to not do authentication when reconnect.(not clean key). \n\
--setreassocmode <mode> where:\n\
<mode> is 0 do send disassoc when reassociation, \n\
1 do not send disassoc when reassociation. \n\
--setVoicePktSize is maximum size of voice packet \n\
--setMaxSPLength is the maximum service period in packets, as applicable in APSD \n\
0 - deliver all packets \n\
1 - deliver up to 2 packets \n\
2 - deliver up to 4 packets \n\
3 - deliver up to 6 packets \n\
--setAssocIe <IE String>\n\
--roam <roamctrl> <info>\n\
where <roamctrl> is 1 force a roam to specified bssid\n\
2 set the roam mode \n\
3 set the host bias of the specified BSSID\n\
4 set the lowrssi scan parameters \n\
where <info> is BSSID<aa:bb:cc:dd:ee:ff> for roamctrl of 1\n\
DEFAULT ,BSSBIAS or LOCK for roamctrl of 2\n\
BSSID<aa:bb:cc:dd:ee:ff> <bias> for roamctrl of 3\n\
where <bias> is a value between -256 and 255\n\
<scan period> <scan threshold> <roam threshold> \n\
<roam rssi floor> for roamctrl of 4\n\
--getroamtable\n\
--getroamdata\n\
--wlan <enable/disable/query>\n\
--bt <on/off/query>\n\
--setBTstatus <streamType> <status>\n\
where <streamType> is 1 - Bluetooth SCO stream\n\
2 - Bluetooth A2DP stream\n\
3 - Bluetooth Inquiry/low priority stream\n\
4 - Bluetooth E-SCO stream\n\
\n\
where <status> is 1 - stream started\n\
2 - stream stopped\n\
3 - stream resumed\n\
4 - stream suspended\n\
--setBTparams <paramType> <params>\n\
where <paramType> is 1 - Bluetooth SCO stream parameters\n\
2 - Bluetooth A2DP stream parameters \n\
3 - Front end antenna configuration \n\
4 - Co-located Bluetooth configuration\n\
5 - Bluetooth ACL coex (non-a2dp) parameters\n\
6 - 11a is using a separate antenna\n\
\n\
where <params> for Bluetooth SCO are:\n\
<numScoCyclesForceTrigger> - number of Sco cyles, to force a trigger\n\
<dataResponseTimeout> - timeout for receiving downlink packet per PS-poll\n\
<stompScoRules> - Applicable for dual/splitter front end\n\
1, Never stomp BT to receive downlink pkt\n\
2, Always stomp BT to receive downlink pkt\n\
3, Stomp BT only during low rssi conditions\n\
<stompDutyCyleVal> If Sco is stomped while waiting for downlink pkt, number sco cyles to not queue ps-poll-(Applicable only for switch FE)\n\
<psPollLatencyFraction> Fraction of idle SCO idle time.\n\
1, if more than 3/4 idle duration is left, retrieve downlink pkt\n\
2, if more than 1/2 idle duration is left, retrieve downlink pkt\n\
3, if more 1/4 idle duration is left, retrieve dwnlink pkt\n\
<SCO slots> - number of Tx+Rx SCO slots : 2 for single-slot SCO, 6 for 3-slot SCO\n\
<Idle SCO slots> - number of idle slots between two SCO Tx+Rx instances\n\
\n\
where <params> for A2DP configuration are\n\
<a2dpWlanUsageLimit> Max duration wlan can use the medium ,whenever firmware detects medium for wlan (in msecs) \n\
<a2dpBurstCntMin> Mininum number of bluetooth data frames to replenish wlan usage time\n\
<a2dpDataRespTimeout> Time to wait for downlink data, after queuing pspoll\n\
where <params> for front end antenna configuration are\n\
1 - Dual antenna configuration (BT and wlan have seperate antenna) \n\
2 - Single antenna splitter configuration \n\
3 - Single antenna switch configuration \n\
\n\
where <params> for co-located Bluetooth configuration are\n\
0 - Qualcomm BTS402x (default)\n\
1 - CSR Bluetooth\n\
2 - Atheros Bluetooth\n\
\n\
where <params> for Bluetooth ACL coex(bt ftp or bt OPP or other data based ACL profile (non a2dp) parameter are \n\
<aclWlanMediumUsageTime> Usage time for Wlan.(default 30 msecs)\n\
<aclBtMediumUsageTime> Usage time for bluetooth (default 30 msecs)\n\
<aclDataRespTimeout> - timeout for receiving downlink packet per PS-poll\n\
--setbtcoexfeant <antType> \n\
<antType> - Front end antenna type\n\
1 - Single antenna\n\
2 - Dual antenna\n\
3 - Dual antenna high isolation\n\
4 - bypass mode\n\
5 - combine mode\n\
--setbtcoexcolocatedbt <btdevType >\n\
<btdevType> Co-located bluetooth device\n\
1 - Qualcomm BTS402X \n\
2 - CSR BC06 bluetooth \n\
3 - Atheros 3001 bluetooth\n\
4 - ST-ericssion CG2900 \n\
5 - Atheros 3002/MCI \n\
--setbtcoexscoconfig <noscoSlots> <noidleslots> <scoflags> <linkid> <scoCyclesForceTrigger> <scoDataResponseTimeout> <scoStompDutyCyleVal> <scoStompDutyCyleMaxVal> <scoPsPollLatencyFraction> <scoStompCntIn100ms> <scoContStompMax> <scoMinlowRateMbps> <scoLowRateCnt> <scoHighPktRatio> <scoMaxAggrSize>\n\
--setbtcoexa2dpconfig <a2dpFlags> <linkid> <a2dpWlanMaxDur> <a2dpMinBurstCnt> <a2dpDataRespTimeout> <a2dpMinlowRateMbps> <a2dpLowRateCnt> <a2dpHighPktRatio> <a2dpMaxAggrSize> <a2dpPktStompCnt>\n\
--setbtcoexaclcoexconfig <aclWlanMediumDur> <aclBtMediumDur> <aclDetectTimeout> <aclPktCntLowerLimit> <aclIterForEnDis> <aclPktCntUpperLimit> <aclCoexFlags> <linkId> <aclDataRespTimeout> <aclCoexMinlowRateMbps> <aclCoexLowRateCnt> <aclCoexHighPktRatio> <aclCoexMaxAggrSize> <aclPktStompCnt> \n\
--setbtcoexbtinquirypageconfig <btInquiryDataFetchFrequency> <protectBmissDurPostBtInquiry> <btInquiryPageFlag>\n\
--setbtcoexbtoperatingstatus <btprofiletype> <btoperatingstatus> <btlinkid>\n\
<btprofiletype> - Bluetooth profile\n\
1 - Bluetooth SCO profile \n\
2 - Bluetooth A2DP profile \n\
3 - Bluetooth Inquiry Page profile \n\
4 - Bluetooth ACL (non-a2dp) profile \n\
\n\
<btoperatingstatus> profile operating status \n\
1 - start \n\
2 - stop \n\
\n\
<btlinkid> bluetooth link id -Applicable only for STE Bluetooth\n\
\n\
--setbtcoexdebug <params1> <params2> <params3> <params4> <params5> \n\
--getbtcoexconfig <btprofile> <linkid>\n\
<btprofile> - bluetooth profile \n\
1 - Bluetooth SCO profile \n\
2 - Bluetooth A2DP profile \n\
3 - Bluetooth Inquiry Page profile \n\
4 - Bluetooth ACL (non-a2dp) profile \n\
\n\
<btlinkid> bluetooth link id -Applicable only for STE Bluetooth\n\
\n\
\n\
--getbtcoexstats\n\
--detecterror --frequency=<sec> --threshold=<count> where:\n\
<frequency> is the periodicity of the challenge messages in seconds, \n\
<threshold> is the number of challenge misses after which the error detection module in the driver will report an error, \n\
--getheartbeat --cookie=<cookie>\n\
<cookie> is used to identify the response corresponding to a challenge sent\n\
--usersetkeys --initrsc=<on/off>\n\
initrsc=on(off> initialises(doesnot initialise) the RSC in the firmware\n\
--getRD\n\
--setcountry <countryCode> (Use --countrycodes for list of codes)\n\
--countrycodes (Lists all the valid country codes)\n\
--getcountry \n\
--disableregulatory\n\
--txopbursting <burstEnable>\n\
where <burstEnable> is 0 disallow TxOp bursting\n\
1 allow TxOp bursting\n\
--diagread\n\
--diagwrite\n\
--setkeepalive <keepalive interval> <keepalive mode> <peer mac address> <arp src ip> <arp tgt ip>\n\
<keepalive interval> is the time within which if there is no transmission/reception activity, the station sends a null packet to AP.\n\
<keepalive mode> 1: NULL data frame (default)\n\
2: ARP response \n\
3: both \n\
valid if <keepalive mode> is 2 or 3:\n\
<peer mac address>: target mac address for arp response\n\
<arp src ip>: host ip\n\
<arp tgt ip>: arp response target ip\n\
--getkeepalive\n\
--setappie <frame> <IE>\n\
where frame is one of beacon, probe, respon, assoc\n\
IE is a hex string starting with dd\n\
if IE is 0 then no IE is sent in the management frame\n\
--setmgmtfilter <op> <frametype>\n\
op is one of set, clear\n\
frametype is one of beacon proberesp\n\
--setdbglogconfig --mmask=<mask> --rep=<0/1> --tsr=<tsr codes> --size=<num>\n\
where <mask> is a 16 bit wide mask to selectively enable logging for different modules. Example: 0xFFFD enables logging for all modules except WMI. The mask is derived from the module ids defined in etna/include/dbglog.h header file.\n\
<rep> is whether the target should generate log events to the host whenever the log buffer is full.\n\
<tsr> resolution of the debug timestamp (less than 16)\n\
0: 31.25 us\n\
1: 62.50 us\n\
2: 125.0 us\n\
3: 250.0 us\n\
4: 500.0 us\n\
5: 1.0 ms and so on.\n\
<size> size of the report in number of debug logs.\n\
--getdbglogs\n\
--sethostmode <mode>\n\
where <mode> is awake\n\
asleep\n\
--setwowmode <mode> --wowfilter <filter> --hostreqdelay <hostreqdelay> \n\
where <mode> is enable \n\
disable\n\
where <filter> is ssid -to enable ssid filtering when asleep\n\
none \n\
--getwowlist <listid> \n\
--addwowpattern <list-id> <pattern-size> <pattern-offset> <pattern> <pattern-mask \n\
--delwowpattern <list-id> <pattern-id>\n\
--dumpchipmem \n\
--dumpchipmem_venus \n\
--setconnectctrl <ctrl flags bitmask> \n\
where <flags> could take the following values:\n\
0x0001(CONNECT_ASSOC_POLICY_USER): Assoc frames are sent using the policy specified by the flag below.\n\
0x0002(CONNECT_SEND_REASSOC): Send Reassoc frame while connecting otherwise send assoc frames.\n\
0x0004(CONNECT_IGNORE_WPAx_GROUP_CIPHER): Ignore WPAx group cipher for WPA/WPA2.\n\
0x0008(CONNECT_PROFILE_MATCH_DONE): Ignore any profile check.\n\
0x0010(CONNECT_IGNORE_AAC_BEACON): Ignore the admission control beacon.\n\
0x0020(CONNECT_CSA_FOLLOW_BSS):Set to Follow BSS to the new channel and connect \n\
and reset to disconnect from BSS and change channel \n\
--dumpcreditstates \n\
Triggers the HTC layer to dump credit state information to the debugger \n\
--setakmp --multipmkid=<on/off>\n\
multipmkid=on(off> enables(doesnot enable) Multi PMKID Caching in firmware\n\
--setpmkidlist --numpmkid=<n> --pmkid=<pmkid_1> ... --pmkid=<pmkid_n>\n\
where n is the number of pmkids (max 8)\n\
and pmkid_i is the ith pmkid (16 bytes in hex format)\n\
--setbsspmkid --bssid=<aabbccddeeff> --bsspmkid=<pmkid>\n\
bssid is 6 bytes in hex format\n\
bsspmkid is 16 bytes in hex format\n\
--getpmkidlist \n\
--abortscan \n\
--settgtevt <event value>\n\
where <event value> is 0 send WMI_DISCONNECT_EVENT with disconnectReason = BSS_DISCONNECTED\n\
after re-connection with AP\n\
1 NOT send WMI_DISCONNECT_EVENT with disconnectReason = BSS_DISCONNECTED\n\
after re-connection with AP\n\
--getsta \n\
--hiddenssid <value> \n\
where value 1-Enable, 0-Disable. \n\
--gethiddenssid \n\
--numsta <num> \n\
--gnumsta <num> \n\
--getnumsta \n\
--getgnumsta \n\
--conninact <period> \n\
where period is time in min (default 5min). \n\
0 will disable STA inactivity check. \n\
--protectionscan <period> <dwell> \n\
where period is in min (default 5min). 0 will disable. \n\
dwell is in ms. (default 200ms). \n\
--addacl <mac> \n\
where mac is of the format xx:xx:xx:xx:xx:xx \n\
--delacl <index> \n\
use --getacl to get index \n\
--getacl \n\
--aclpolicy <policy> <retain list> \n\
where <policy> \n\
0 - Disable ACL \n\
1 - Allow MAC \n\
2 - Deny MAC \n\
<retain list> \n\
0 - Clear the current ACL list \n\
1 - Retain the current ACL list \n\
--removesta <action> <reason> <mac> \n\
where <action> \n\
2 - Disassoc \n\
3 - Deauth \n\
<reason> protocol reason code, use 1 when in doubt \n\
<mac> mac addr of a connected STA \n\
--dtim <period> \n\
--getdtim \n\
--intrabss <ctrl> \n\
where <ctrl> 0 - Disable, 1 - Enable (default) \n\
--interbss <ctrl> \n\
where <ctrl> 0 - Disable, 1 - Enable (default) \n\
--apgetstats \n\
--apclearstats \n\
--acsdisablehichannels <0/1> \n\
where 0 - ACS will choose 1, 6 or 11 \n\
1 - ACS will choose 1, 6 or 11 \n\
--commit \n\
--ip arg, arg may be \n\
none - resets ip \n\
x.x.x.x - ip addr is dotted form\n\
--set_ht_cap <band> <enable> <supported channel width set> <short GI 20MHz> <short GI 40MHz> <40MHz intolerant> <max AMPDU len exponent> \n\
where <band> : 'g' for 2.4 GHZ or 'a' for 5GHZ \n\
<enable> : 0 to disable 11n in band, 1 to enable 11n in band \n\
<supported channel width set> : 0 if only 20MHz operation supported \n\
1 if 20MHz and 40MHz operation supported \n\
<short GI 20MHz> : 0 if not supported, 1 if supported \n\
<short GI 40MHz> : 0 if not supported, 1 if supported \n\
<40MHz intolerant> : 1 if prohibit a receing AP from operating as a 20/40 MHz BSS \n\
0 otherwise \n\
<max AMPDU len exponent> : valid values from 0 to 3 \n\
--dump_recv_aggr_stats \n\
--setup_aggr <tid> <aid> \n\
where <aid> = aid of a connected STA. Ignored in STA mode \n\
--allow_aggr <tx_tid_mask> <rx_tid_mask> \n\
--dele_aggr <tid> <direction> <aid> \n\
where <direction> =1 uplink; \n\
=0 dnlink \n\
<aid> = aid of a connected STA. Ignored in STA mode \n\
--set_ht_op <STA channel width> : 0 if only allow 20MHz channel width\n\
1 if allow any channel width in the supported channel width set \n\
--wlan_conn_prec <prec_val> \n\
where 0: WLAN connection will have precedence;\n\
1: PAL connection will have precedence;\n\
--settxselrates <11A ratemask> <11G ratemask> <11B ratemask> <11GOnly ratemask> <11A_HT20 ratemask> <11G_HT20 ratemask> \
<11A_HT40 ratemask> <11G_HT40 ratemask> where all rate masks are hex integers. \n\
--aprateset <val> \n\
where 1: RateSet#1 - 1,2,5.5,11 basic rates (default)\n\
2: RateSet#2 - 1,2,5.5,11,6,12,24 basic rates\n\
--connect <ssid> \n\
--connect <ssid> --wpa <ver> <ucipher> <mcipher> <psk> \n\
--connect <ssid> --wep <mode> <def_keyix> <key1> <key2*> <key3*> <key4*> \n\
where <ssid> : SSID of network \n\
<ver> : 1 - WPA, 2 - RSN \n\
<ucipher> : TKIP or CCMP for unicast \n\
<mcipher> : TKIP or CCMP for multicast \n\
<psk> : passphrase for WPA \n\
<mode> : open or shared \n\
<def_keyix>: Default TX wep key index [1-4] \n\
<key> : wep key \n\
* : optional parameters \n\
--set_tx_sgi --masksgi <mask> --persgi <value> \n\
where <mask> is a 32 bit hexadecimal value (eg: 0x0808000 or 08080000) to select desired MCS and ht20/ht40 SGI implementation (refer spec for bit location of each MCS)\n\
For disabling SGI enter 0x00000000 or 0.\n\
If mask is not entered, the default mask is 0x08080000 which enables MCS 7 to use SGI for both ht20 and ht40, when set_tx_sgi command is issued \n\
where <value> is the acceptable loss percentage for Packet Error Rate (PER) for SGI (default : 10)\n\
--set_dfs <enable> \n\
where <enable> : 1 to allow DFS \n\
: 0 to disable DFS \n\
--setdivparam <idleTime> <RSSIThresh> <Enable> <Threshold Rate> \n\
where <idleTime> : time in ms where the idle timer would start checking the other antenna (default: 10000) \n\
<RSSIThresh> : in db, where the firmware will check the other antenna if the RSSI drops below this delta (default: 10) \n\
<Enable> : 1 to enable diversity \n\
<Threshold Rate> : in Mbps, where the firmware will block the idleTimer if the throughput is above this rate (default 48) \n\
--scanprobedssid <ssid> where <ssid> is the wireless network string to scan. Broadcast probe will not be sent . Set ssid to 'off' or 'any' to send broadcast probe requests \n\
--ap_apsd <value> \n\
where value 1-Enable, 0-Disable \n\
--get_ht_cap <band> \n\
where <band> : 'g' for 2.4 GHZ or 'a' for 5GHZ \n\
--set_mcast_rate <value> \n\
where value is rate in units of 100 Kbps \n\
Valid values are 10, 20, 55, 110, 60, 90, 120, 180, 240, 360, 480, 540 \n\
--enablevoicedetection <enable> \n\
where <enable> : 1 to enable voice detection \n\
: 0 to disable voice detection \n\
--txe-notify <rate> <pkts> <intvl> \n\
send a TXE_NOTIFY_EVENT when <rate>% of <pkts> in given <intvl> fail to be transmitted to current AP.\n\
--setrecoverysim <type> <delay_time_ms> \n\
where <type> : 1 assert \n\
: 2 not respond detect command \n\
: 3 simulate ep-full (disable wmi control ep), use 'echo 60>keepalive' trigger\n\
: 4 null access \n\
: 5: stack overflow\n\
<delay_time_ms> : 0~65534 ,delay time ms\n\
: 65535 ,delay random time( 0~65535) ms\n\
--disablebcast <enable> \n\
--blwl <control> <index> <mac> \n\
where <control>: 0 disable blwl \n\
: 1 enable blwl \n\
: 2 add white mac \n\
: 3 add black mac \n\
: 4 reset whitelist \n\
: 5 reset blacklist \n\
<index> : valid when control=2 3 4 5, mac address index [0,9] \n\
<mac> : valid when control=2 3 4 5, mac address xx:xx:xx:xx:xx:xx \n\
--setrssifilter <snr_value> \n\
where <snr_value> : 0~127 the rssi value, (DBM: value-95dbm) \n\
";
A_UINT32 mercuryAdd[5][2] = {
{0x20000, 0x200fc},
{0x28000, 0x28800},
{0x20800, 0x20a40},
{0x21000, 0x212f0},
{0x500000, 0x500000+184*1024},
};
typedef struct chip_internal_t{
A_UINT32 addr_st;
A_UINT32 addr_end;
A_UINT8 *info;
}CHIP_INTERNAL;
CHIP_INTERNAL venus_internal[8] = {
{0x20000, 0x200fc, (A_UINT8 *)"General DMA and recv related registers"},
{0x28000, 0x28900, (A_UINT8 *)"MAC PCU register & keycache"},
{0x20800, 0x20a40, (A_UINT8 *)"QCU"},
{0x21000, 0x212f0, (A_UINT8 *)"DCU"},
{0x4000, 0x42e4, (A_UINT8 *)"RTC"},
{0x540000, 0x540000+256*1024, (A_UINT8 *)"RAM"},
{0x29800, 0x2B210, (A_UINT8 *)"BB"},
{0x1C000, 0x1C748, (A_UINT8 *)"Analog"},
};
static void
usage(void)
{
fprintf(stderr, "usage:\n%s [-i device] commands\n", progname);
fprintf(stderr, "%s\n", commands);
#ifdef ATH_INCLUDE_PAL
fprintf(stderr, "%s\n", palcommands);
#endif
fprintf(stderr, "The options can be given in any order\n");
exit(-1);
}
/* List of Country codes */
char *my_ctr[] = {
"DB", "NA", "AL", "DZ", "AR", "AM", "AU", "AT", "AZ", "BH", "BY", "BE", "BZ", "BO", "BR", "BN",
"BG", "CA", "CL", "CN", "CO", "CR", "HR", "CY", "CZ", "DK", "DO", "EC", "EG", "SV", "EE", "FI",
"FR", "GE", "DE", "GR", "GT", "HN", "HK", "HU", "IS", "IN", "ID", "IR", "IE", "IL", "IT", "JP",
"JO", "KZ", "KP", "KR", "K2", "KW", "LV", "LB", "LI", "LT", "LU",
"MO", "MK", "MY", "MX", "MC", "MA", "NL", "NZ", "NO", "OM", "PK", "PA", "PE", "PH", "PL", "PT",
"PR", "QA", "RO", "RU", "SA", "SG", "SK", "SI", "ZA", "ES", "SE", "CH", "SY", "TW", "TH", "TT",
"TN", "TR", "UA", "AE", "GB", "US", "UY", "UZ", "VE", "VN", "YE", "ZW"
};
const char *targ_reg_name[] = {
"zero", "pc", "lbeg", "lend", "lcount", "sar", "litbaddr", "ps",
"brtarg", "epc1", "epc2", "epc3", "epc4", "windowbase", "windowstart", "zero",
"zero", "zero", "zero", "zero", "zero", "zero", "zero", "zero",
"zero", "zero", "zero", "zero", "zero", "zero", "zero", "zero",
"ar0", "ar1", "ar2", "ar3", "ar4", "ar5", "ar6", "ar7",
"ar8", "ar9", "ar10", "ar11", "ar12", "ar13", "ar14", "ar15",
"ar16", "ar17", "ar18", "ar19", "ar20", "ar21", "ar22", "ar23",
"ar24", "ar25", "ar26", "ar27", "ar28", "ar29", "ar30", "ar31",
};
#ifdef ATH_INCLUDE_PAL
A_INT32
get_input_choice(char *fname,A_UINT8 *pdu, A_UINT16 *sz)
{
int fhdl;
A_INT32 ret = -1;
fhdl = open(fname, O_RDONLY);
if(fhdl != -1)
{
*sz = read(fhdl, pdu,MAX_BUFFER_SIZE);
close(fhdl);
ret = 0;
}
return ret;
}
#endif
int
main (int argc, char **argv)
{
int c, error;
char ifname[IFNAMSIZ];
unsigned int cmd = 0;
progname = argv[0];
char *buf = malloc(sizeof(PACKET_LOG));
int clearstat = 0;
WMI_DISABLE_BCAST_IN_PM_CMD *disableBcastCmd = (WMI_DISABLE_BCAST_IN_PM_CMD *) (buf+4);
WMI_LISTEN_INT_CMD *listenCmd = (WMI_LISTEN_INT_CMD*)buf;
WMI_BMISS_TIME_CMD *bmissCmd = (WMI_BMISS_TIME_CMD*)buf;
WMI_POWER_MODE_CMD *pwrCmd = (WMI_POWER_MODE_CMD *)buf;
WMI_SET_MCAST_FILTER_CMD *sMcastFilterCmd = (WMI_SET_MCAST_FILTER_CMD *)(buf + 4);
WMI_MCAST_FILTER_CMD *mcastFilterCmd = (WMI_MCAST_FILTER_CMD *)(buf + 4);
WMI_IBSS_PM_CAPS_CMD *adhocPmCmd = (WMI_IBSS_PM_CAPS_CMD *)buf;
WMI_AP_PS_CMD *apPsCmd = (WMI_AP_PS_CMD *)(buf + 4);
WMI_SCAN_PARAMS_CMD *sParamCmd = (WMI_SCAN_PARAMS_CMD *)(buf + 4);
WMI_BSS_FILTER_CMD *filterCmd = (WMI_BSS_FILTER_CMD *)buf;
WMI_CHANNEL_PARAMS_CMD *chParamCmd = (WMI_CHANNEL_PARAMS_CMD *)buf;
WMI_POWER_PARAMS_CMD *pmParamCmd = (WMI_POWER_PARAMS_CMD *)buf;
WMI_ADD_BAD_AP_CMD *badApCmd = (WMI_ADD_BAD_AP_CMD *)buf;
WMI_CREATE_PSTREAM_CMD *crePStreamCmd = (WMI_CREATE_PSTREAM_CMD *)buf;
WMI_DELETE_PSTREAM_CMD *delPStreamCmd = (WMI_DELETE_PSTREAM_CMD *)buf;
USER_RSSI_PARAMS *rssiThresholdParam = (USER_RSSI_PARAMS *)(buf + 4);
WMI_SNR_THRESHOLD_PARAMS_CMD *snrThresholdParam = (WMI_SNR_THRESHOLD_PARAMS_CMD *)buf;
WMI_LQ_THRESHOLD_PARAMS_CMD *lqThresholdParam = (WMI_LQ_THRESHOLD_PARAMS_CMD *)(buf + 4);
WMI_TARGET_ERROR_REPORT_BITMASK *pBitMask =
(WMI_TARGET_ERROR_REPORT_BITMASK *)buf;
WMI_SET_ASSOC_INFO_CMD *ieInfo = (WMI_SET_ASSOC_INFO_CMD *)buf;
WMI_SET_ACCESS_PARAMS_CMD *acParamsCmd = (WMI_SET_ACCESS_PARAMS_CMD *)buf;
WMI_DISC_TIMEOUT_CMD *discCmd = (WMI_DISC_TIMEOUT_CMD *)(buf + 4);
WMI_SET_ADHOC_BSSID_CMD *adhocBssidCmd = (WMI_SET_ADHOC_BSSID_CMD *)(buf + 4);
WMI_BEACON_INT_CMD *bconIntvl = (WMI_BEACON_INT_CMD *)(buf + 4);
WMI_SET_RETRY_LIMITS_CMD *setRetryCmd = (WMI_SET_RETRY_LIMITS_CMD *)(buf + 4);
WMI_START_SCAN_CMD *startScanCmd = (WMI_START_SCAN_CMD *)(buf + 4);
WMI_SET_LPREAMBLE_CMD *setLpreambleCmd = (WMI_SET_LPREAMBLE_CMD *)(buf + 4);
WMI_SET_RTS_CMD *setRtsCmd = (WMI_SET_RTS_CMD *)(buf + 4);
struct ar6000_queuereq *getQosQueueCmd = (struct ar6000_queuereq *)buf;
WMI_SET_VOICE_PKT_SIZE_CMD *pSizeThresh = (WMI_SET_VOICE_PKT_SIZE_CMD *)(buf + sizeof(int));
WMI_SET_MAX_SP_LEN_CMD *pMaxSP = (WMI_SET_MAX_SP_LEN_CMD *)(buf + sizeof(int));
WMI_SET_ROAM_CTRL_CMD *pRoamCtrl = (WMI_SET_ROAM_CTRL_CMD *)(buf +
sizeof(int));
WMI_POWERSAVE_TIMERS_POLICY_CMD *pPowerSave = (WMI_POWERSAVE_TIMERS_POLICY_CMD *)(buf + sizeof(int));
WMI_SET_BT_STATUS_CMD *pBtStatCmd = (WMI_SET_BT_STATUS_CMD *) (buf + sizeof(int));
WMI_SET_BT_PARAMS_CMD *pBtParmCmd = (WMI_SET_BT_PARAMS_CMD *) (buf + sizeof(int));
WMI_SET_BTCOEX_FE_ANT_CMD *pBtcoexFeAntCmd = (WMI_SET_BTCOEX_FE_ANT_CMD *) (buf + sizeof(int));
WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMD *pBtcoexCoLocatedBtCmd = (WMI_SET_BTCOEX_COLOCATED_BT_DEV_CMD *) (buf + sizeof(int));
WMI_SET_BTCOEX_SCO_CONFIG_CMD *pBtcoexScoConfigCmd = (WMI_SET_BTCOEX_SCO_CONFIG_CMD *) (buf + sizeof(int));
WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD *pBtcoexbtinquiryPageConfigCmd = (WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD *) (buf + sizeof(int));
AR6000_BTCOEX_CONFIG *pBtcoexConfig = (AR6000_BTCOEX_CONFIG *) (buf + sizeof(int));
WMI_SET_BTCOEX_A2DP_CONFIG_CMD *pBtcoexA2dpConfigCmd = (WMI_SET_BTCOEX_A2DP_CONFIG_CMD *) (buf + sizeof(int));
WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMD *pBtcoexAclCoexConfigCmd = (WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMD *) (buf + sizeof(int));
WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD *pBtcoexBtOperatingStatusCmd = (WMI_SET_BTCOEX_BT_OPERATING_STATUS_CMD *) (buf + sizeof(int));
WMI_SET_WMM_CMD *setWmmCmd = (WMI_SET_WMM_CMD *)(buf + 4);
WMI_SET_QOS_SUPP_CMD *qosSupp = (WMI_SET_QOS_SUPP_CMD *)(buf +4);
WMI_SET_HB_CHALLENGE_RESP_PARAMS_CMD *hbparam = (WMI_SET_HB_CHALLENGE_RESP_PARAMS_CMD *)(buf + 4);
A_UINT32 *cookie = (A_UINT32 *)(buf + 4);
A_UINT32 *diagaddr = (A_UINT32 *)(buf + 4);
A_UINT32 *diagdata = (A_UINT32 *)(buf + 8);
WMI_SET_WMM_TXOP_CMD *pTxOp = (WMI_SET_WMM_TXOP_CMD *)(buf + sizeof(int));
WMI_AP_SET_COUNTRY_CMD *pCountry = (WMI_AP_SET_COUNTRY_CMD *)(buf + sizeof(int));
WMI_SET_KEEPALIVE_CMD_EXT *setKeepAlive = (WMI_SET_KEEPALIVE_CMD_EXT *)(buf + 4);
struct ieee80211req_getset_appiebuf *appIEInfo = (struct ieee80211req_getset_appiebuf *)(buf + 4);
A_UINT32 *pMgmtFilter = (A_UINT32 *)(buf + 4);
DBGLOG_MODULE_CONFIG *dbglogCfg = (DBGLOG_MODULE_CONFIG *)(buf + 4);
WMI_SET_HOST_SLEEP_MODE_CMD *hostSleepModeCmd = (WMI_SET_HOST_SLEEP_MODE_CMD*)(buf + sizeof(int));
WMI_SET_WOW_MODE_CMD *wowModeCmd = (WMI_SET_WOW_MODE_CMD*)(buf + sizeof(int));
WMI_ADD_WOW_PATTERN_CMD *addWowCmd = (WMI_ADD_WOW_PATTERN_CMD*)(buf + sizeof(int));
WMI_DEL_WOW_PATTERN_CMD *delWowCmd = (WMI_DEL_WOW_PATTERN_CMD*)(buf + sizeof(int));
WMI_GET_WOW_LIST_CMD *getWowListCmd = (WMI_GET_WOW_LIST_CMD*)(buf + sizeof(int));
AR6000_USER_SETKEYS_INFO *user_setkeys_info =
(AR6000_USER_SETKEYS_INFO *)(buf + sizeof(int));
WMI_SET_AKMP_PARAMS_CMD *akmpCtrlCmd =
(WMI_SET_AKMP_PARAMS_CMD *)(buf + sizeof(int));
WMI_SET_TARGET_EVENT_REPORT_CMD *evtCfgCmd = (WMI_SET_TARGET_EVENT_REPORT_CMD *) (buf + sizeof(int));
WMI_ENABLE_SMPS_CMD *setDfsCmd = (WMI_ENABLE_SMPS_CMD*)(buf + 4);
pmkidUserInfo_t pmkidUserInfo;
A_UINT8 bssid[ATH_MAC_LEN];
struct ieee80211req_addpmkid *pi_cmd = (struct ieee80211req_addpmkid *)buf;
int i, index = 0, channel, chindex;//, cnt;
A_INT16 threshold[26]; /* user can set rssi tags */
A_UINT16 *clist;
A_UCHAR *ssid;
char *ethIf;
WMI_AP_HIDDEN_SSID_CMD *pHidden = (WMI_AP_HIDDEN_SSID_CMD *)(buf + 4);
WMI_AP_ACL_MAC_CMD *pACL = (WMI_AP_ACL_MAC_CMD *)(buf + 4);
WMI_AP_NUM_STA_CMD *pNumSta = (WMI_AP_NUM_STA_CMD *)(buf + 4);
WMI_AP_CONN_INACT_CMD *pInact = (WMI_AP_CONN_INACT_CMD *)(buf + 4);
WMI_AP_PROT_SCAN_TIME_CMD *pProt = (WMI_AP_PROT_SCAN_TIME_CMD *)(buf + 4);
struct ieee80211req_mlme *pMlme = (struct ieee80211req_mlme *)buf;
WMI_AP_SET_DTIM_CMD *pDtim = (WMI_AP_SET_DTIM_CMD *)(buf + 4);
WMI_AP_ACL_POLICY_CMD *pACLpolicy = (WMI_AP_ACL_POLICY_CMD *)(buf + 4);
A_UINT8 *intra = (A_UINT8 *)(buf + 4);
WMI_ADDBA_REQ_CMD *pAddbaReq = (WMI_ADDBA_REQ_CMD *)(buf + 4);
WMI_ALLOW_AGGR_CMD *pAllowAggr = (WMI_ALLOW_AGGR_CMD *)(buf + 4);
WMI_DELBA_REQ_CMD *pDeleteAggr = (WMI_DELBA_REQ_CMD *)(buf + 4);
WMI_SET_BT_WLAN_CONN_PRECEDENCE *prec = (WMI_SET_BT_WLAN_CONN_PRECEDENCE *) (buf + 4);
WMI_AP_SET_11BG_RATESET_CMD *pAPrs = (WMI_AP_SET_11BG_RATESET_CMD *) (buf + 4);
WMI_SET_TX_SGI_PARAM_CMD *set_txsgiparam = (WMI_SET_TX_SGI_PARAM_CMD *) (buf + 4);
WMI_DIV_PARAMS_CMD *pDiversity = (WMI_DIV_PARAMS_CMD *)(buf + 4);
WMI_AP_SET_APSD_CMD *pApApsd = (WMI_AP_SET_APSD_CMD *)(buf + 4);
WMI_SET_MCASTRATE_CMD *pMcast = (WMI_SET_MCASTRATE_CMD *)(buf + 4);
WMI_VOICE_DETECTION_ENABLE_CMD *pVoiceDetectionEnable = (WMI_VOICE_DETECTION_ENABLE_CMD *)(buf + 4);
WMI_SET_TXE_NOTIFY_CMD *pTXe = (WMI_SET_TXE_NOTIFY_CMD *)(buf + 4);
WMI_SET_RECOVERY_TEST_PARAMETER_CMD *pSetRecoveryParam = (WMI_SET_RECOVERY_TEST_PARAMETER_CMD*)(buf + 4);
WMI_SET_RSSI_FILTER_CMD *pSetRssiFilter = (WMI_SET_RSSI_FILTER_CMD*)(buf + 4);
WMI_PROBED_SSID_CMD *pSsidCmd = (WMI_PROBED_SSID_CMD*)(buf + 4);
profile_t cp;
A_UINT8 *pWpaOffloadState = (A_UINT8 *) (buf + 4);
A_UINT32 *pExcessTxRetryThres = (A_UINT32 *)(buf + 4);
if (argc == 1) {
usage();
}
memset(buf, 0, sizeof(buf));
memset(ifname, '\0', IFNAMSIZ);
if ((ethIf = getenv("NETIF")) == NULL) {
ethIf = "eth1";
}
while (1) {
int option_index = 0;
static struct option long_options[] = {
{"it", 1, NULL, 'a'},
{"bg", 1, NULL, 'b'},
{"np", 1, NULL, 'c'},
{"dp", 1, NULL, 'd'},
{"fgend", 1, NULL, 'e'},
{"filter", 1, NULL, 'f'},
{"fgstart", 1, NULL, 'g'},
{"maxact", 1, NULL, 'h'},
{"interface", 1, NULL, 'i'},
{"createqos", 1, NULL, 'j'},
{"deleteqos", 1, NULL, 'k'},
{"listen", 1, NULL, 'l'},
{"listenbeacons", 1, NULL, 'N'},
{"pmparams", 0, NULL, 'm'},
{"num", 1, NULL, 'n'},
{"qosqueue", 1, NULL, 'o'},
{"power", 1, NULL, 'p'},
{"pas", 1, NULL, 'q'},
{"scan", 0, NULL, 's'},
{"sr", 1, NULL, 'r'},
{"ssid", 1, NULL, 't'},
{"rssiThreshold", 1, NULL, 'u'},
{"snrThreshold", 1, NULL, WMI_SET_SNR_THRESHOLDS},
{"cleanRssiSnr", 0, NULL, WMI_CLR_RSSISNR},
{"lqThreshold", 1, NULL, WMI_SET_LQ_THRESHOLDS},
{"version", 0, NULL, 'v'}, //WMI_GET_VERSION
{"wmode", 1, NULL, 'w'},
{"badAP", 1, NULL, 'x'},
{"clrAP", 0, NULL, 'y'},
{"minact", 1, NULL, 'z'},
{"getTargetStats", 0, NULL, WMI_GET_TARGET_STATS},
{"setErrorReportingBitmask", 1, NULL,
WMI_SET_TARGET_ERROR_REPORTING_BITMASK},
{"acparams", 0, NULL, WMI_SET_AC_PARAMS},
{"acval", 1, NULL, WMI_SET_AC_VAL},
{"txop", 1, NULL, 'A'},
{"cwmin", 1, NULL, 'B'},
{"cwmax", 1, NULL, 'C'},
{"aifsn", 1, NULL, 'D'},
{"ps", 1, NULL, 'E'},
{"aw", 1, NULL, 'F'},
{"adhocbssid", 1, NULL, 'G'},
{"mode", 1, NULL, 'H'},
{"sendframe", 1, NULL, 'I'},
{"wlan", 1, NULL, 'J'},
{"to", 1, NULL, 'K'},
{"ttl", 1, NULL, 'L'},
{"scanctrlflags", 1, NULL, 'O'},
{"homeDwellTime", 1, NULL, 'P'},
{"forceScanInt", 1, NULL, 'Q'},
{"forceScanFlags",1, NULL, 'R'},
{"threshold", 1, NULL, 'S'},
{"frequency", 1, NULL, 'T'},
{"cookie", 1, NULL, 'U'},
{"mmask", 1, NULL, 'V'},
{"rep", 1, NULL, 'W'},
{"tsr", 1, NULL, 'X'},
{"size", 1, NULL, 'Y'},
{"bssid",1, NULL, WMI_BSSID},
{"initrsc", 1, NULL, USER_SETKEYS_INITRSC},
{"multipmkid", 1, NULL, WMI_AKMP_MULTI_PMKID},
{"numpmkid", 1, NULL, WMI_NUM_PMKID},
{"pmkid", 1, NULL, WMI_PMKID_ENTRY},
{"clearStats", 0, NULL, 'Z'},
{"maxact2pas", 1, NULL, WMI_SCAN_DFSCH_ACT_TIME},
{"maxactscan_ssid", 1, NULL, WMI_SCAN_MAXACT_PER_SSID},
{"ibsspmcaps", 0, NULL, WMI_SET_IBSS_PM_CAPS},
{"appsparams", 0, NULL, WMI_SET_AP_PS},
{"setAssocIe", 1, NULL, WMI_SET_ASSOC_IE},
{"setbmisstime", 1, NULL, WMI_SET_BMISS_TIME},
{"setbmissbeacons", 1, NULL, 'M'},
{"disc", 1, NULL, WMI_SET_DISC_TIMEOUT},
{"beaconintvl", 1, NULL, WMI_SET_BEACON_INT},
{"setVoicePktSize", 1, NULL, WMI_SET_VOICE_PKT_SIZE},
{"setMaxSPLength", 1, NULL, WMI_SET_MAX_SP},
{"getroamtable", 0, NULL, WMI_GET_ROAM_TBL},
{"roam", 1, NULL, WMI_SET_ROAM_CTRL},
{"psparams", 0, NULL, WMI_SET_POWERSAVE_TIMERS},
{"psPollTimer", 1, NULL, WMI_SET_POWERSAVE_TIMERS_PSPOLLTIMEOUT},
{"triggerTimer", 1, NULL, WMI_SET_POWERSAVE_TIMERS_TRIGGERTIMEOUT},
{"getpower", 0, NULL, WMI_GET_POWER_MODE},
{"getroamdata", 0, NULL, WMI_GET_ROAM_DATA},
{"setBTstatus", 1, NULL, WMI_SET_BT_STATUS},
{"setBTparams", 1, NULL, WMI_SET_BT_PARAMS},
{"setbtcoexfeant", 1, NULL, WMI_SET_BTCOEX_FE_ANT},
{"setbtcoexcolocatedbt", 1, NULL, WMI_SET_BTCOEX_COLOCATED_BT_DEV},
{"setbtcoexscoconfig", 1, NULL, WMI_SET_BTCOEX_SCO_CONFIG},
{"setbtcoexa2dpconfig", 1, NULL, WMI_SET_BTCOEX_A2DP_CONFIG},
{"setbtcoexaclcoexconfig", 1, NULL, WMI_SET_BTCOEX_ACLCOEX_CONFIG},
{"setbtcoexbtinquirypageconfig", 1, NULL, WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG},
{"setbtcoexbtoperatingstatus", 1, NULL, WMI_SET_BTCOEX_BT_OPERATING_STATUS},
{"getbtcoexconfig",1,NULL, WMI_GET_BTCOEX_CONFIG},
{"getbtcoexstats", 0, NULL, WMI_GET_BTCOEX_STATS},
{"setretrylimits", 1, NULL, WMI_SET_RETRYLIMITS},
{"startscan", 0, NULL, WMI_START_SCAN},
{"setfixrates", 1, NULL, WMI_SET_FIX_RATES},
{"getfixrates", 0, NULL, WMI_GET_FIX_RATES},
{"setauthmode", 1, NULL, WMI_SET_AUTH_MODE},
{"setreassocmode", 1, NULL, WMI_SET_REASSOC_MODE},
{"setlongpreamble", 1, NULL, WMI_SET_LPREAMBLE},
{"setRTS", 1, NULL, WMI_SET_RTS},
{"setwmm", 1, NULL, WMI_SET_WMM},
{"setqos", 1, NULL, WMI_SET_QOS_SUPP},
{"apsdTimPolicy", 1, NULL, WMI_APSD_TIM_POLICY},
{"simulatedAPSDTimPolicy", 1, NULL, WMI_SIMULATED_APSD_TIM_POLICY},
{"detecterror", 0, NULL, WMI_SET_ERROR_DETECTION},
{"getheartbeat", 0, NULL, WMI_GET_HB_CHALLENGE_RESP},
#ifdef USER_KEYS
{"usersetkeys", 0, NULL, USER_SETKEYS},
#endif
{"getRD", 0, NULL, WMI_GET_RD},
{"setcountry", 1, NULL, WMI_AP_SET_COUNTRY},
{"countrycodes", 0, NULL, WMI_AP_GET_COUNTRY_LIST},
{"disableregulatory", 0, NULL, WMI_AP_DISABLE_REGULATORY},
{"txopbursting", 1, NULL, WMI_SET_TXOP},
{"diagaddr", 1, NULL, DIAG_ADDR},
{"diagdata", 1, NULL, DIAG_DATA},
{"diagread", 0, NULL, DIAG_READ},
{"diagwrite", 0, NULL, DIAG_WRITE},
{"setkeepalive", 1, NULL, WMI_SET_KEEPALIVE},
{"getkeepalive", 0, NULL, WMI_GET_KEEPALIVE},
{"setappie", 1, NULL, WMI_SET_APPIE},
{"setmgmtfilter", 1, NULL, WMI_SET_MGMT_FRM_RX_FILTER},
{"setdbglogconfig", 0, NULL, WMI_DBGLOG_CFG_MODULE},
{"getdbglogs", 0, NULL, WMI_DBGLOG_GET_DEBUG_LOGS},
{"sethostmode", 1, NULL, WMI_SET_HOST_SLEEP_MODE},
{"setwowmode", 1, NULL, WMI_SET_WOW_MODE},
{"wowfilter",1,NULL,WMI_SET_WOW_FILTER},
{"hostreqdelay",1,NULL,WMI_SET_WOW_HOST_REQ_DELAY},
{"getwowlist", 1, NULL, WMI_GET_WOW_LIST},
{"addwowpattern", 1, NULL, WMI_ADD_WOW_PATTERN},
{"delwowpattern", 1, NULL, WMI_DEL_WOW_PATTERN},
{"dumpchipmem", 0, NULL, DIAG_DUMP_CHIP_MEM},
{"dumpchipmem_venus", 0, NULL, DIAG_DUMP_CHIP_MEM_VENUS},
{"setconnectctrl", 1, NULL, WMI_SET_CONNECT_CTRL_FLAGS},
{"dumpcreditstates",0, NULL, DUMP_HTC_CREDITS},
{"setakmp", 0, NULL, WMI_SET_AKMP_INFO},
{"setpmkidlist", 0, NULL, WMI_SET_PMKID_LIST},
{"getpmkidlist", 0, NULL, WMI_GET_PMKID_LIST},
{"ieMask", 1, NULL, WMI_SET_IEMASK},
{"scanlist", 1, NULL, WMI_SCAN_CHANNEL_LIST},
{"setbsspmkid", 0, NULL, WMI_SET_BSS_PMKID_INFO},
{"bsspmkid", 1, NULL, WMI_BSS_PMKID_ENTRY},
{"abortscan", 0, NULL, WMI_ABORT_SCAN},
{"settgtevt", 1, NULL, WMI_TARGET_EVENT_REPORT},
{"getsta", 0, NULL, WMI_AP_GET_STA_LIST}, /* AP mode */
{"hiddenssid", 0, NULL, WMI_AP_HIDDEN_SSID}, /* AP mode */
{"numsta", 0, NULL, WMI_AP_SET_NUM_STA}, /* AP mode */
{"aclpolicy", 0, NULL, WMI_AP_ACL_POLICY}, /* AP mode */
{"addacl", 0, NULL, WMI_AP_ACL_MAC_LIST1}, /* AP mode */
{"delacl", 0, NULL, WMI_AP_ACL_MAC_LIST2}, /* AP mode */
{"getacl", 0, NULL, WMI_AP_GET_ACL_LIST}, /* AP mode */
{"commit", 0, NULL, WMI_AP_COMMIT_CONFIG}, /* AP mode */
{"conninact", 0, NULL, WMI_AP_INACT_TIME}, /* AP mode */
{"protectionscan", 0, NULL, WMI_AP_PROT_TIME}, /* AP mode */
{"removesta", 0, NULL, WMI_AP_SET_MLME}, /* AP mode */
{"dtim", 0, NULL, WMI_AP_SET_DTIM}, /* AP mode */
{"intrabss", 0, NULL, WMI_AP_INTRA_BSS}, /* AP mode */
{"interbss", 0, NULL, WMI_AP_INTER_BSS}, /* AP mode */
{"ip", 1, NULL, WMI_GET_IP},
{"setMcastFilter", 1, NULL, WMI_SET_MCAST_FILTER},
{"delMcastFilter", 1, NULL, WMI_DEL_MCAST_FILTER},
{"mcastFilter", 1, NULL, WMI_MCAST_FILTER},
{"dump_recv_aggr_stats",0, NULL, WMI_DUMP_RCV_AGGR_STATS},
{"setup_aggr", 2, NULL, WMI_SETUP_AGGR},
{"allow_aggr", 2, NULL, WMI_CFG_ALLOW_AGGR},
{"dele_aggr", 2, NULL, WMI_CFG_DELE_AGGR},
{"set_ht_cap",1, NULL, WMI_SET_HT_CAP},
{"set_ht_op",1, NULL, WMI_SET_HT_OP},
{"apgetstats", 0, NULL, WMI_AP_GET_STAT}, /* AP mode */
{"apclearstats", 0, NULL, WMI_AP_CLR_STAT}, /* AP mode */
{"settxselrates", 1, NULL, WMI_SET_TX_SELECT_RATES},
{"gethiddenssid", 0, NULL, WMI_AP_GET_HIDDEN_SSID}, /* AP mode */
{"getcountry", 0, NULL, WMI_AP_GET_COUNTRY}, /* AP mode */
{"getwmode", 0, NULL, WMI_AP_GET_WMODE},
{"getdtim", 0, NULL, WMI_AP_GET_DTIM}, /* AP mode */
{"getbeaconintvl", 0, NULL, WMI_AP_GET_BINTVL}, /* AP mode */
{"getRTS", 0, NULL, WMI_GET_RTS},
{"targregs", 0, NULL, DIAG_FETCH_TARGET_REGS},
#ifdef ATH_INCLUDE_PAL
{"sendpalcmd", 2, NULL, WMI_SEND_PAL_CMD},
{"sendpaldata", 2, NULL, WMI_SEND_PAL_DATA},
{"wlan_conn_prec", 1, NULL, WMI_SET_WLAN_CONN_PRECDNCE},
#endif
{"aprateset", 0, NULL, WMI_SET_AP_RATESET},
{"twp", 1, NULL, WMI_SET_TX_WAKEUP_POLICY},
{"nt", 1, NULL, WMI_SET_TX_NUM_FRAMES_TO_WAKEUP},
{"pstype", 1, NULL, WMI_SET_AP_PS_PSTYPE},
{"psit", 1, NULL, WMI_SET_AP_PS_IDLE_TIME},
{"psperiod", 1, NULL, WMI_SET_AP_PS_PS_PERIOD},
{"sleepperiod", 1, NULL, WMI_SET_AP_PS_SLEEP_PERIOD},
{"connect", 1, NULL, WMI_SEND_CONNECT_CMD},
{"wpa", 1, NULL, WMI_SEND_CONNECT_CMD1},
{"wep", 1, NULL, WMI_SEND_CONNECT_CMD2},
{"set_dfs", 1, NULL, WMI_AP_SET_DFS},
{"bt",1,NULL,BT_HW_POWER_STATE},
{"set_tx_sgi", 0, NULL, WMI_SET_TX_SGI_PARAM},
{"masksgi", 1, NULL, WMI_SGI_MASK},
{"persgi", 1, NULL, WMI_PER_SGI},
{"wac", 1, NULL, WMI_WAC_ENABLE},
{"setwpaoffload", 1, NULL, WMI_SET_WPA_OFFLOAD_STATE},
{"acsdisablehichannels", 0, NULL, WMI_AP_ACS_DISABLE_HI_CHANNELS},
{"setdivparam", 1, NULL, WMI_SET_DIVERSITY_PARAM},
{"setexcesstxretrythres", 1, NULL, WMI_SET_EXCESS_TX_RETRY_THRES},
{"forceAssert", 0, NULL, WMI_FORCE_ASSERT},
{"gnumsta", 0, NULL, WMI_AP_SET_GNUM_STA}, /* AP mode */
{"getgnumsta", 0, NULL, WMI_AP_GET_GNUM_STA}, /* AP mode */
{"getnumsta", 0, NULL, WMI_AP_GET_NUM_STA}, /* AP mode */
{"suspend", 0, NULL, WMI_SUSPEND_DRIVER},
{"resume", 0, NULL, WMI_RESUME_DRIVER},
{"scanprobedssid", 1, NULL, WMI_SCAN_PROBED_SSID},
{"ap_apsd", 0, NULL, WMI_AP_SET_APSD}, /* AP mode */
{"get_ht_cap", 0, NULL, WMI_GET_HT_CAP},
{"set_mcast_rate", 1, NULL, WMI_SET_MCASTRATE},
{"enablevoicedetection", 1, NULL, WMI_VOICE_DETECTION_ENABLE}, /* enable/disable voice detection command */
{"txe-notify", 1, NULL, WMI_SET_TXE_NOTIFY},
{"setrecoverysim", 0, NULL, WMI_SET_RECOVERY_SIMULATE}, /* set recovery simulation */
{"disablebcast", 1, NULL, WMI_DISABLE_BCAST_IN_PM}, /* disable broadcast in power save */
{"blwl", 0, NULL, WMI_AP_BLWL}, /* AP mode */
{"setrssifilter", 0, NULL, WMI_SET_RSSI_FILTER},
{0, 0, 0, 0}
};
c = getopt_long(argc, argv, "rsvda:b:c:e:h:f:g:h:i:l:p:q:r:w:n:t:u:x:y:z:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z:", long_options, &option_index);
if (c == -1)
break;
switch (c) {
case 'a':
pmParamCmd->idle_period = atoi(optarg);
break;
case 'b':
if (!strcasecmp(optarg,"default")) {
sParamCmd->bg_period = 0;
} else {
sParamCmd->bg_period = atoi(optarg);
/* Setting the background scan to 0 or 65535 has the same effect
- it disables background scanning */
if(!sParamCmd->bg_period)
sParamCmd->bg_period = 65535;
}
break;
case 'c':
pmParamCmd->pspoll_number = atoi(optarg);
break;
case 'd':
if (!strcmp(optarg, "ignore")) {
pmParamCmd->dtim_policy = IGNORE_DTIM;
} else if (!strcmp(optarg, "normal")) {
pmParamCmd->dtim_policy = NORMAL_DTIM;
} else if (!strcmp(optarg, "stick")) {
pmParamCmd->dtim_policy = STICK_DTIM;
} else {
cmd = 0;
}
break;
case 'f':
cmd = WMI_SET_BSS_FILTER;
if (!strcmp(optarg, "none")) {
filterCmd->bssFilter = NONE_BSS_FILTER;
} else if (!strcmp(optarg, "all")) {
filterCmd->bssFilter = ALL_BSS_FILTER;
} else if (!strcmp(optarg, "profile")) {
filterCmd->bssFilter = PROFILE_FILTER;
} else if (!strcmp(optarg, "not_profile")) {
filterCmd->bssFilter = ALL_BUT_PROFILE_FILTER;
} else if (!strcmp(optarg, "bss")) {
filterCmd->bssFilter = CURRENT_BSS_FILTER;
} else if (!strcmp(optarg, "not_bss")) {
filterCmd->bssFilter = ALL_BUT_BSS_FILTER;
} else if (!strcmp(optarg, "ssid")) {
filterCmd->bssFilter = PROBED_SSID_FILTER;
} else {
cmd = 0;
}
break;
case 'e':
sParamCmd->fg_end_period = atoi(optarg);
break;
case 'g':
sParamCmd->fg_start_period = atoi(optarg);
break;
case 'h':
sParamCmd->maxact_chdwell_time = atoi(optarg);
break;
case 'q':
sParamCmd->pas_chdwell_time = atoi(optarg);
break;
case 'j':
cmd = WMI_CREATE_QOS;
crePStreamCmd->userPriority = atoi(optarg);
break;
case 'k':
cmd = WMI_DELETE_QOS;
delPStreamCmd->trafficClass = atoi(optarg);
break;
case 'l':
cmd = WMI_SET_LISTEN_INTERVAL;
listenCmd->listenInterval = atoi(optarg);
if ((listenCmd->listenInterval < MIN_LISTEN_INTERVAL) ||
(listenCmd->listenInterval > MAX_LISTEN_INTERVAL))
{
printf("Listen Interval out of range\n");
cmd = 0;
}
break;
case 'N':
cmd = WMI_SET_LISTEN_INTERVAL;
listenCmd->numBeacons = atoi(optarg);
if ((listenCmd->numBeacons < MIN_LISTEN_BEACONS) ||
(listenCmd->numBeacons > MAX_LISTEN_BEACONS))
{
printf("Listen beacons out of range\n");
cmd = 0;
}
break;
case 'm':
cmd = WMI_SET_PM_PARAMS;
break;
case 'n':
index = atoi(optarg);
break;
case 'v':
cmd = WMI_GET_VERSION;
break;
case 'o':
cmd = WMI_GET_QOS_QUEUE;
getQosQueueCmd->trafficClass = atoi(optarg);
break;
case 'p':
cmd = WMI_SET_POWER_MODE;
if (!strcmp(optarg, "rec")) {
pwrCmd->powerMode = REC_POWER;
} else if (!strcmp(optarg, "maxperf")) {
pwrCmd->powerMode = MAX_PERF_POWER;
} else {
cmd = 0;
}
break;
case WMI_FORCE_ASSERT:
cmd = WMI_FORCE_ASSERT;
break;
case WMI_SET_MCAST_FILTER:
cmd = WMI_SET_MCAST_FILTER;
sMcastFilterCmd->multicast_mac[0] = (unsigned int) atoi(argv[2]);
sMcastFilterCmd->multicast_mac[1] = (unsigned int) atoi(argv[3]);
sMcastFilterCmd->multicast_mac[2] = (unsigned int) atoi(argv[4]);
sMcastFilterCmd->multicast_mac[3] = (unsigned int) atoi(argv[5]);
sMcastFilterCmd->multicast_mac[4] = (unsigned int) atoi(argv[6]);
sMcastFilterCmd->multicast_mac[5] = (unsigned int) atoi(argv[7]);
printf("sMcastFilterCmd->multicast_mac[0] %d\n",sMcastFilterCmd->multicast_mac[0] );
printf("sMcastFilterCmd->multicast_mac[1] %d\n",sMcastFilterCmd->multicast_mac[1] );
printf("sMcastFilterCmd->multicast_mac[2] %d\n",sMcastFilterCmd->multicast_mac[2] );
printf("sMcastFilterCmd->multicast_mac[3] %d\n",sMcastFilterCmd->multicast_mac[3] );
printf("sMcastFilterCmd->multicast_mac[4] %d\n",sMcastFilterCmd->multicast_mac[4] );
printf("sMcastFilterCmd->multicast_mac[5] %d\n",sMcastFilterCmd->multicast_mac[5] );
break;
case WMI_DEL_MCAST_FILTER:
cmd = WMI_DEL_MCAST_FILTER;
sMcastFilterCmd->multicast_mac[0] = (unsigned int) atoi(argv[2]);
sMcastFilterCmd->multicast_mac[1] = (unsigned int) atoi(argv[3]);
sMcastFilterCmd->multicast_mac[2] = (unsigned int) atoi(argv[4]);
sMcastFilterCmd->multicast_mac[3] = (unsigned int) atoi(argv[5]);
sMcastFilterCmd->multicast_mac[4] = (unsigned int) atoi(argv[6]);
sMcastFilterCmd->multicast_mac[5] = (unsigned int) atoi(argv[7]);
printf("sMcastFilterCmd->multicast_mac[0] %d\n",sMcastFilterCmd->multicast_mac[0] );
printf("sMcastFilterCmd->multicast_mac[1] %d\n",sMcastFilterCmd->multicast_mac[1] );
printf("sMcastFilterCmd->multicast_mac[2] %d\n",sMcastFilterCmd->multicast_mac[2] );
printf("sMcastFilterCmd->multicast_mac[3] %d\n",sMcastFilterCmd->multicast_mac[3] );
printf("sMcastFilterCmd->multicast_mac[4] %d\n",sMcastFilterCmd->multicast_mac[4] );
printf("sMcastFilterCmd->multicast_mac[5] %d\n",sMcastFilterCmd->multicast_mac[5] );
break;
case WMI_MCAST_FILTER:
cmd = WMI_MCAST_FILTER;
mcastFilterCmd->enable = (unsigned int) atoi(argv[2]);
printf("Multicast Filter State: %s\n", mcastFilterCmd->enable ? "enable" : "disable");
break;
case 'r':
sParamCmd->shortScanRatio = atoi(optarg);
break;
case 's':
cmd = WMI_SET_SCAN_PARAMS;
sParamCmd->scanCtrlFlags = DEFAULT_SCAN_CTRL_FLAGS;
sParamCmd->shortScanRatio = WMI_SHORTSCANRATIO_DEFAULT;
sParamCmd->max_dfsch_act_time = 0 ;
break;
case WMI_SCAN_DFSCH_ACT_TIME:
sParamCmd->max_dfsch_act_time = atoi(optarg);
break;
case WMI_SCAN_MAXACT_PER_SSID:
sParamCmd->maxact_scan_per_ssid = atoi(optarg);
break;
case 't':
cmd = WMI_SET_SSID;
index = optind-1;
pSsidCmd->entryIndex =(A_UINT8)atoi(argv[index++]);
ssid = (A_UCHAR *)argv[index++];
break;
case 'u':
cmd = WMI_SET_RSSI_THRESHOLDS;
memset(threshold, 0, sizeof(threshold));
for (index = optind; index <= argc; index++)
threshold[index-optind] = atoi(argv[index-1]);
rssiThresholdParam->weight = threshold[0];
rssiThresholdParam->pollTime = threshold[1];
rssiThresholdParam->tholds[0].tag = threshold[2];
rssiThresholdParam->tholds[0].rssi = 0 - threshold[3];
rssiThresholdParam->tholds[1].tag = threshold[4];
rssiThresholdParam->tholds[1].rssi = 0 - threshold[5];
rssiThresholdParam->tholds[2].tag = threshold[6];
rssiThresholdParam->tholds[2].rssi = 0 - threshold[7];
rssiThresholdParam->tholds[3].tag = threshold[8];
rssiThresholdParam->tholds[3].rssi = 0 - threshold[9];
rssiThresholdParam->tholds[4].tag = threshold[10];
rssiThresholdParam->tholds[4].rssi = 0 - threshold[11];
rssiThresholdParam->tholds[5].tag = threshold[12];
rssiThresholdParam->tholds[5].rssi = 0 - threshold[13];
rssiThresholdParam->tholds[6].tag = threshold[14];
rssiThresholdParam->tholds[6].rssi = 0 - threshold[15];
rssiThresholdParam->tholds[7].tag = threshold[16];
rssiThresholdParam->tholds[7].rssi = 0 - threshold[17];
rssiThresholdParam->tholds[8].tag = threshold[18];
rssiThresholdParam->tholds[8].rssi = 0 - threshold[19];
rssiThresholdParam->tholds[9].tag = threshold[20];
rssiThresholdParam->tholds[9].rssi = 0 - threshold[21];
rssiThresholdParam->tholds[10].tag = threshold[22];
rssiThresholdParam->tholds[10].rssi = 0 - threshold[23];
rssiThresholdParam->tholds[11].tag = threshold[24];
rssiThresholdParam->tholds[11].rssi = 0 - threshold[25];
break;
case WMI_SET_SNR_THRESHOLDS:
cmd = WMI_SET_SNR_THRESHOLDS;
memset(threshold, 0, sizeof(threshold));
for (index = optind; index <= argc; index++)
threshold[index-optind] = atoi(argv[index-1]);
snrThresholdParam->weight = threshold[0];
snrThresholdParam->thresholdAbove1_Val = threshold[1];
snrThresholdParam->thresholdAbove2_Val = threshold[2];
snrThresholdParam->thresholdAbove3_Val = threshold[3];
snrThresholdParam->thresholdAbove4_Val = threshold[4];
snrThresholdParam->thresholdBelow1_Val = threshold[5];
snrThresholdParam->thresholdBelow2_Val = threshold[6];
snrThresholdParam->thresholdBelow3_Val = threshold[7];
snrThresholdParam->thresholdBelow4_Val = threshold[8];
snrThresholdParam->pollTime = threshold[9];
break;
case WMI_CLR_RSSISNR:
cmd = WMI_CLR_RSSISNR;
break;
case WMI_SET_LQ_THRESHOLDS:
cmd = WMI_SET_LQ_THRESHOLDS;
memset(threshold, 0, sizeof(threshold));
for (index = optind; index <= argc; index++)
threshold[index-optind] = atoi(argv[index-1]);
lqThresholdParam->enable = threshold[0];
lqThresholdParam->thresholdAbove1_Val = threshold[1];
lqThresholdParam->thresholdAbove2_Val = threshold[2];
lqThresholdParam->thresholdAbove3_Val = threshold[3];
lqThresholdParam->thresholdAbove4_Val = threshold[4];
lqThresholdParam->thresholdBelow1_Val = threshold[5];
lqThresholdParam->thresholdBelow2_Val = threshold[6];
lqThresholdParam->thresholdBelow3_Val = threshold[7];
lqThresholdParam->thresholdBelow4_Val = threshold[8];
break;
case 'i':
memset(ifname, '\0', 8);
strncpy(ifname, optarg, sizeof(ifname));
break;
case 'w':
cmd = WMI_SET_CHANNEL;
chParamCmd->numChannels = 0;
chParamCmd->scanParam = 0;
break;
case 'x':
if (wmic_ether_aton(optarg, badApCmd->bssid) != A_OK) {
printf("bad mac address\n");
break;
}
cmd = WMI_SET_BADAP;
break;
case 'y':
/*
* we are clearing a bad AP. We pass a null mac address
*/
cmd = WMI_DELETE_BADAP;
break;
case 'z':
sParamCmd->minact_chdwell_time = atoi(optarg);
break;
case WMI_GET_TARGET_STATS:
cmd = WMI_GET_TARGET_STATS;
break;
case WMI_SET_TARGET_ERROR_REPORTING_BITMASK:
cmd = WMI_SET_TARGET_ERROR_REPORTING_BITMASK;
pBitMask->bitmask = atoi(optarg);
printf("Setting the bitmask = 0x%x\n", pBitMask->bitmask);
break;
case WMI_SET_ASSOC_IE:
cmd = WMI_SET_ASSOC_INFO_CMDID;
ieInfo->ieType = 1;
if (strlen(optarg) > WMI_MAX_ASSOC_INFO_LEN) {
printf("IE Size cannot be greater than %d\n",
WMI_MAX_ASSOC_INFO_LEN);
cmd = 0;
} else {
ieInfo->bufferSize = strlen(optarg) + 2;
memcpy(&ieInfo->assocInfo[2], optarg,
ieInfo->bufferSize - 2);
ieInfo->assocInfo[0] = 0xdd;
ieInfo->assocInfo[1] = ieInfo->bufferSize - 2;
}
break;
case WMI_SET_BMISS_TIME:
cmd = WMI_SET_BMISS_TIME;
bmissCmd->bmissTime = atoi(optarg);
if ((bmissCmd->bmissTime < MIN_BMISS_TIME) ||
(bmissCmd->bmissTime > MAX_BMISS_TIME))
{
printf("BMISS time out of range\n");
cmd = 0;
}
break;
case 'M':
cmd = WMI_SET_BMISS_TIME;
bmissCmd->numBeacons = atoi(optarg);
if ((bmissCmd->numBeacons < MIN_BMISS_BEACONS) ||
(bmissCmd->numBeacons > MAX_BMISS_BEACONS))
{
printf("BMISS beacons out of range\n");
cmd = 0;
}
break;
case WMI_SET_AC_PARAMS:
cmd = WMI_SET_AC_PARAMS;
break;
case WMI_SET_AC_VAL:
acParamsCmd->ac = atoi(optarg);
break;
case 'A':
acParamsCmd->txop = atoi(optarg);
break;
case 'B':
acParamsCmd->eCWmin = atoi(optarg);
break;
case 'C':
acParamsCmd->eCWmax = atoi(optarg);
break;
case 'D':
acParamsCmd->aifsn = atoi(optarg);
break;
case 'E':
if (!strcmp(optarg, "disable")) {
adhocPmCmd->power_saving = ADHOC_PS_DISABLE;
} else if (!strcmp(optarg, "atheros")) {
adhocPmCmd->power_saving = ADHOC_PS_ATH;
} else if (!strcmp(optarg, "ieee")) {
adhocPmCmd->power_saving = ADHOC_PS_IEEE;
} else {
cmd = 0;
}
break;
case 'F':
adhocPmCmd->atim_windows = atoi(optarg);
break;
case 'G':
if (wmic_ether_aton(optarg, adhocBssidCmd->bssid) != A_OK) {
printf("bad mac address\n");
break;
}
printf("adhoc bssid address, %x\n", adhocBssidCmd->bssid[0]);
cmd = WMI_SET_ADHOC_BSSID;
break;
case 'J':
cmd = WMI_SET_WLAN_STATE;
if (!strcmp(optarg, "enable")) {
((int *)buf)[1] = WLAN_ENABLED;
} else if (!strcmp(optarg, "disable")) {
((int *)buf)[1] = WLAN_DISABLED;
} else if (!strcmp(optarg, "query")) {
cmd = WMI_GET_WLAN_STATE;
} else {
usage();
}
break;
case 'K':
adhocPmCmd->timeout_value = atoi(optarg);
break;
case 'O':
index = optind;
index--;
if((index + 6) > argc) { /*6 is the number of flags
scanctrlflags takes */
printf("Incorrect number of scanctrlflags\n");
cmd = 0;
break;
}
sParamCmd->scanCtrlFlags = 0;
if (atoi(argv[index]) == 1)
sParamCmd->scanCtrlFlags |= CONNECT_SCAN_CTRL_FLAGS;
index++;
if (atoi(argv[index]) == 1)
sParamCmd->scanCtrlFlags |= SCAN_CONNECTED_CTRL_FLAGS;
index++;
if (atoi(argv[index]) == 1)
sParamCmd->scanCtrlFlags |= ACTIVE_SCAN_CTRL_FLAGS;
index++;
if (atoi(argv[index]) == 1)
sParamCmd->scanCtrlFlags |= ROAM_SCAN_CTRL_FLAGS;
index++;
if (atoi(argv[index]) == 1)
sParamCmd->scanCtrlFlags |= REPORT_BSSINFO_CTRL_FLAGS;
index++;
if(atoi(argv[index]) == 1)
sParamCmd->scanCtrlFlags |= ENABLE_AUTO_CTRL_FLAGS;
index++;
if (argc - index) {
if(atoi(argv[index]) == 1)
sParamCmd->scanCtrlFlags |= ENABLE_SCAN_ABORT_EVENT;
index++;
}
if(!sParamCmd->scanCtrlFlags) {
sParamCmd->scanCtrlFlags = 255; /* all flags have being disabled by the user */
}
break;
case 'L':
adhocPmCmd->ttl = atoi(optarg);
break;
case 'P':
startScanCmd->homeDwellTime =atoi(optarg);
break;
case 'Q':
startScanCmd->forceScanInterval =atoi(optarg);
break;
case 'R':
index = optind;
index--;
if((index + 3) > argc) {
printf("Incorrect number of forceScanCtrlFlags\n");
cmd = 0;
break;
}
startScanCmd->scanType = atoi(argv[index]);
index++;
startScanCmd->forceFgScan = atoi(argv[index]);
index++;
startScanCmd->isLegacy = atoi(argv[index]);
index++;
break;
case WMI_SCAN_CHANNEL_LIST:
chindex = 0;
index = optind - 1;
clist = startScanCmd->channelList;
while (argv[index] != NULL) {
channel = atoi(argv[index]);
if (channel < 255) {
/*
* assume channel is a ieee channel #
*/
clist[chindex] = wmic_ieee2freq(channel);
} else {
clist[chindex] = channel;
}
chindex++;
index++;
}
startScanCmd->numChannels = chindex;
break;
case WMI_SET_IBSS_PM_CAPS:
cmd = WMI_SET_IBSS_PM_CAPS;
break;
case WMI_SET_AP_PS:
cmd = WMI_SET_AP_PS;
break;
case WMI_SET_DISC_TIMEOUT:
cmd = WMI_SET_DISC_TIMEOUT;
discCmd->disconnectTimeout = atoi(optarg);
break;
case WMI_SET_BEACON_INT:
cmd = WMI_SET_BEACON_INT;
bconIntvl->beaconInterval = atoi(optarg);
break;
case WMI_SET_VOICE_PKT_SIZE:
cmd = WMI_SET_VOICE_PKT_SIZE;
pSizeThresh->voicePktSize = atoi(optarg);
break;
case WMI_SET_MAX_SP:
cmd = WMI_SET_MAX_SP;
pMaxSP->maxSPLen = atoi(optarg);
break;
case WMI_GET_ROAM_TBL:
cmd = WMI_GET_ROAM_TBL;
break;
case WMI_SET_ROAM_CTRL:
pRoamCtrl->roamCtrlType = atoi(optarg);
if (A_OK != wmic_validate_roam_ctrl(pRoamCtrl, argc-optind, argv)) {
break;
}
cmd = WMI_SET_ROAM_CTRL;
break;
case WMI_SET_POWERSAVE_TIMERS:
cmd = WMI_SET_POWERSAVE_TIMERS;
break;
case WMI_SET_POWERSAVE_TIMERS_PSPOLLTIMEOUT:
pPowerSave->psPollTimeout = atoi(optarg);
break;
case WMI_SET_POWERSAVE_TIMERS_TRIGGERTIMEOUT:
pPowerSave->triggerTimeout = atoi(optarg);
break;
case WMI_GET_POWER_MODE:
cmd = WMI_GET_POWER_MODE;
break;
case WMI_GET_ROAM_DATA:
cmd = WMI_GET_ROAM_DATA;
break;
case WMI_SET_BT_STATUS:
cmd = WMI_SET_BT_STATUS;
pBtStatCmd->streamType = atoi(optarg);
pBtStatCmd->status = atoi(argv[optind]);
if (pBtStatCmd->streamType >= BT_STREAM_MAX ||
pBtStatCmd->status >= BT_STATUS_MAX)
{
fprintf(stderr, "Invalid parameters.\n");
exit(0);
}
break;
case WMI_SET_BT_PARAMS:
cmd = WMI_SET_BT_PARAMS;
pBtParmCmd->paramType = atoi(optarg);
if (pBtParmCmd->paramType >= BT_PARAM_MAX)
{
fprintf(stderr, "Invalid parameters.\n");
exit(0);
}
if (BT_PARAM_SCO == pBtParmCmd->paramType) {
pBtParmCmd->info.scoParams.numScoCyclesForceTrigger =
strtoul(argv[optind], NULL, 0);
pBtParmCmd->info.scoParams.dataResponseTimeout =
strtoul(argv[optind+1], NULL, 0);
pBtParmCmd->info.scoParams.stompScoRules =
strtoul(argv[optind+2], NULL, 0);
pBtParmCmd->info.scoParams.scoOptFlags =
strtoul(argv[optind+3], NULL, 0);
pBtParmCmd->info.scoParams.stompDutyCyleVal =
strtoul(argv[optind+4], NULL, 0);
pBtParmCmd->info.scoParams.stompDutyCyleMaxVal =
strtoul(argv[optind+5], NULL, 0);
pBtParmCmd->info.scoParams. psPollLatencyFraction =
strtoul(argv[optind+6], NULL, 0);
pBtParmCmd->info.scoParams.noSCOSlots =
strtoul(argv[optind+7], NULL, 0);
pBtParmCmd->info.scoParams.noIdleSlots =
strtoul(argv[optind+8], NULL, 0);
pBtParmCmd->info.scoParams.scoOptOffRssi =
strtoul(argv[optind+9], NULL, 0);
pBtParmCmd->info.scoParams.scoOptOnRssi =
strtoul(argv[optind+10], NULL, 0);
pBtParmCmd->info.scoParams.scoOptRtsCount =
strtoul(argv[optind+11], NULL, 0);
}else if (BT_PARAM_A2DP == pBtParmCmd->paramType) {
pBtParmCmd->info.a2dpParams.a2dpWlanUsageLimit =
strtoul(argv[optind], NULL, 0);
pBtParmCmd->info.a2dpParams.a2dpBurstCntMin =
strtoul(argv[optind+1 ], NULL, 0);
pBtParmCmd->info.a2dpParams.a2dpDataRespTimeout =
strtoul(argv[optind+2 ], NULL, 0);
pBtParmCmd->info.a2dpParams.a2dpOptFlags =
strtoul(argv[optind+3 ], NULL, 0);
pBtParmCmd->info.a2dpParams.isCoLocatedBtRoleMaster =
strtoul(argv[optind+4 ], NULL, 0);
pBtParmCmd->info.a2dpParams.a2dpOptOffRssi =
strtoul(argv[optind+5], NULL, 0);
pBtParmCmd->info.a2dpParams.a2dpOptOnRssi =
strtoul(argv[optind+6], NULL, 0);
pBtParmCmd->info.a2dpParams.a2dpOptRtsCount =
strtoul(argv[optind+7 ], NULL, 0);
}else if (BT_PARAM_ANTENNA_CONFIG == pBtParmCmd->paramType) {
pBtParmCmd->info.antType = strtoul(argv[optind], NULL, 0);
} else if (BT_PARAM_COLOCATED_BT_DEVICE == pBtParmCmd->paramType) {
pBtParmCmd->info.coLocatedBtDev =
strtoul(argv[optind], NULL, 0);
}else if(BT_PARAM_ACLCOEX == pBtParmCmd->paramType) {
pBtParmCmd->info.aclCoexParams.aclWlanMediumUsageTime =
strtoul(argv[optind], NULL, 0);
pBtParmCmd->info.aclCoexParams.aclBtMediumUsageTime =
strtoul(argv[optind+1], NULL, 0);
pBtParmCmd->info.aclCoexParams.aclDataRespTimeout =
strtoul(argv[optind+2], NULL, 0);
pBtParmCmd->info.aclCoexParams.aclDetectTimeout =
strtoul(argv[optind+3], NULL, 0);
pBtParmCmd->info.aclCoexParams.aclmaxPktCnt =
strtoul(argv[optind + 4], NULL, 0);
} else if (BT_PARAM_11A_SEPARATE_ANT == pBtParmCmd->paramType) {
printf("BT_PARAM_11A_SEPARATE_ANT \n");
}
else
{
fprintf(stderr, "Invalid parameters.\n");
exit(0);
}
break;
case WMI_SET_BTCOEX_FE_ANT:
cmd = WMI_SET_BTCOEX_FE_ANT;
pBtcoexFeAntCmd->btcoexFeAntType = atoi(optarg);
if (pBtcoexFeAntCmd->btcoexFeAntType >= WMI_BTCOEX_FE_ANT_TYPE_MAX) {
printf("Invalid configuration [1-Single Antenna, 2- dual antenna low isolation, 3 - dual antenna high isolation\n");
printf("4 - bypass mode, 5 - combine mode]\n");
exit(-1);
}
break;
case WMI_SET_BTCOEX_COLOCATED_BT_DEV:
cmd = WMI_SET_BTCOEX_COLOCATED_BT_DEV;
pBtcoexCoLocatedBtCmd->btcoexCoLocatedBTdev = atoi(optarg);
if (pBtcoexCoLocatedBtCmd->btcoexCoLocatedBTdev > 4) {
printf("Invalid configuration %d\n",
pBtcoexCoLocatedBtCmd->btcoexCoLocatedBTdev);
exit(-1);
}
printf("btcoex colocated antType = %d\n",
pBtcoexCoLocatedBtCmd->btcoexCoLocatedBTdev);
break;
case WMI_SET_BTCOEX_SCO_CONFIG:
cmd = WMI_SET_BTCOEX_SCO_CONFIG;
index = optind - 1;
if((index + 17) > argc) {
printf("Incorrect number of sco Config\n");
exit(-1);
}
pBtcoexScoConfigCmd->scoConfig.scoSlots = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoConfig.scoIdleSlots = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoConfig.scoFlags = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoConfig.linkId = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoPspollConfig.scoCyclesForceTrigger = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoPspollConfig.scoDataResponseTimeout = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoPspollConfig.scoStompDutyCyleVal = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoPspollConfig.scoStompDutyCyleMaxVal = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoPspollConfig.scoPsPollLatencyFraction = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoOptModeConfig.scoStompCntIn100ms = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoOptModeConfig.scoContStompMax = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoOptModeConfig.scoMinlowRateMbps = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoOptModeConfig.scoLowRateCnt = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoOptModeConfig.scoHighPktRatio = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoOptModeConfig.scoMaxAggrSize = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoWlanScanConfig.scanInterval = atoi(argv[index++]);
pBtcoexScoConfigCmd->scoWlanScanConfig.maxScanStompCnt = atoi(argv[index++]);
break;
case WMI_SET_BTCOEX_A2DP_CONFIG:
cmd = WMI_SET_BTCOEX_A2DP_CONFIG;
index = optind - 1;
if((index + 10) > argc ) {
printf("Incorrect number of A2DP Config\n");
exit(-1);
}
pBtcoexA2dpConfigCmd->a2dpConfig.a2dpFlags = atoi(argv[index++]);
pBtcoexA2dpConfigCmd->a2dpConfig.linkId = atoi(argv[index++]);
pBtcoexA2dpConfigCmd->a2dppspollConfig.a2dpWlanMaxDur = atoi(argv[index++]);
pBtcoexA2dpConfigCmd->a2dppspollConfig.a2dpMinBurstCnt = atoi(argv[index++]);
pBtcoexA2dpConfigCmd->a2dppspollConfig.a2dpDataRespTimeout = atoi(argv[index++]);
pBtcoexA2dpConfigCmd->a2dpOptConfig.a2dpMinlowRateMbps = atoi(argv[index++]);
pBtcoexA2dpConfigCmd->a2dpOptConfig.a2dpLowRateCnt = atoi(argv[index++]);
pBtcoexA2dpConfigCmd->a2dpOptConfig.a2dpHighPktRatio = atoi(argv[index++]);
pBtcoexA2dpConfigCmd->a2dpOptConfig.a2dpMaxAggrSize = atoi(argv[index++]);
pBtcoexA2dpConfigCmd->a2dpOptConfig.a2dpPktStompCnt = atoi(argv[index++]);
printf("a2dp Config, flags=%x\n", pBtcoexA2dpConfigCmd->a2dpConfig.a2dpFlags);
break;
case WMI_SET_BTCOEX_ACLCOEX_CONFIG:
cmd = WMI_SET_BTCOEX_ACLCOEX_CONFIG;
index = optind - 1;
if((index + 14) > argc ) {
printf("Incorrect number of ACL COEX Config\n");
exit(-1);
}
pBtcoexAclCoexConfigCmd->aclCoexConfig.aclWlanMediumDur = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexConfig.aclBtMediumDur = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexConfig.aclDetectTimeout = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexConfig.aclPktCntLowerLimit = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexConfig.aclIterForEnDis = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexConfig.aclPktCntUpperLimit = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexConfig.aclCoexFlags = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexConfig.linkId = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexPspollConfig.aclDataRespTimeout = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexOptConfig.aclCoexMinlowRateMbps = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexOptConfig.aclCoexLowRateCnt = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexOptConfig.aclCoexHighPktRatio = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexOptConfig.aclCoexMaxAggrSize = atoi(argv[index++]);
pBtcoexAclCoexConfigCmd->aclCoexOptConfig.aclPktStompCnt = atoi(argv[index++]);
break;
case WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG:
cmd = WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG;
index = optind - 1;
if((index + 3) > argc) {
printf("Incorrect number of inquiry_page Config\n");
exit(-1);
}
pBtcoexbtinquiryPageConfigCmd->btInquiryDataFetchFrequency = atoi(argv[index++]);
pBtcoexbtinquiryPageConfigCmd->protectBmissDurPostBtInquiry = atoi(argv[index++]);
pBtcoexbtinquiryPageConfigCmd->btInquiryPageFlag = atoi(argv[index++]);
break;
case WMI_SET_BTCOEX_BT_OPERATING_STATUS:
cmd = WMI_SET_BTCOEX_BT_OPERATING_STATUS;
index = optind - 1;
if((index + 3) > argc) {
printf("Incorrect number of operating status cmdn");
exit(-1);
}
pBtcoexBtOperatingStatusCmd->btProfileType =atoi(argv[index++]);
pBtcoexBtOperatingStatusCmd->btOperatingStatus =atoi(argv[index++]);
pBtcoexBtOperatingStatusCmd->btLinkId =atoi(argv[index++]);
break;
case WMI_GET_BTCOEX_CONFIG:
cmd = WMI_GET_BTCOEX_CONFIG;
index = optind - 1;
if((index + 2) > argc) {
printf("Incorrect number of get Config\n");
exit(-1);
}
pBtcoexConfig->configCmd.btProfileType = atoi(argv[index++]);
pBtcoexConfig->configCmd.linkId = atoi(argv[index++]);
break;
case WMI_GET_BTCOEX_STATS:
cmd = WMI_GET_BTCOEX_STATS;
break;
case WMI_SET_RETRYLIMITS:
index = optind - 1;
setRetryCmd->frameType = atoi(argv[index++]);
if (setRetryCmd->frameType > 2) {
printf("Invalid frame type! [0 - 2]\n");
exit(-1);
}
setRetryCmd->trafficClass = atoi(argv[index++]);
if (setRetryCmd->trafficClass > 3) {
printf("Invalid traffic class! [0 - 3]\n");
exit(-1);
}
setRetryCmd->maxRetries = atoi(argv[index++]);
if (setRetryCmd->maxRetries > WMI_MAX_RETRIES) {
printf("Invalid max retries! [0 - 13] \n");
exit(-1);
}
if (!strcmp(argv[index], "on")) {
setRetryCmd->enableNotify = 1;
} else if (!strcmp(argv[index], "off")) {
setRetryCmd->enableNotify = 0;
} else {
usage();
}
cmd = WMI_SET_RETRYLIMITS;
break;
case WMI_START_SCAN:
cmd = WMI_START_SCAN;
startScanCmd->scanType= 0;
startScanCmd->forceFgScan= false;
startScanCmd->isLegacy= false;
startScanCmd->homeDwellTime = 0;
startScanCmd->forceScanInterval = 0;
startScanCmd->numChannels = 0;
break;
case WMI_SET_FIX_RATES:
cmd = WMI_SET_FIX_RATES;
break;
case WMI_GET_FIX_RATES:
cmd = WMI_GET_FIX_RATES;
break;
case WMI_SET_AUTH_MODE:
cmd = WMI_SET_AUTH_MODE;
break;
case WMI_SET_REASSOC_MODE:
cmd = WMI_SET_REASSOC_MODE;
break;
case WMI_SET_LPREAMBLE:
cmd = WMI_SET_LPREAMBLE;
setLpreambleCmd->status = atoi(optarg);
break;
case WMI_SET_RTS:
cmd = WMI_SET_RTS;
setRtsCmd->threshold = atoi(optarg);
break;
case WMI_SET_WMM:
cmd = WMI_SET_WMM;
setWmmCmd->status = atoi(optarg);
break;
case WMI_SET_QOS_SUPP:
cmd = WMI_SET_QOS_SUPP;
qosSupp->status = atoi(optarg);
break;
case WMI_APSD_TIM_POLICY:
if (!strcmp(optarg, "ignore")) {
pPowerSave->apsdTimPolicy = IGNORE_TIM_ALL_QUEUES_APSD;
} else {
pPowerSave->apsdTimPolicy = PROCESS_TIM_ALL_QUEUES_APSD;
}
break;
case WMI_SIMULATED_APSD_TIM_POLICY:
if (!strcmp(optarg, "ignore")) {
pPowerSave->simulatedAPSDTimPolicy = IGNORE_TIM_SIMULATED_APSD;
} else {
pPowerSave->simulatedAPSDTimPolicy = PROCESS_TIM_SIMULATED_APSD;
}
break;
case WMI_SET_ERROR_DETECTION:
cmd = WMI_SET_ERROR_DETECTION;
break;
case 'S':
hbparam->threshold = atoi(optarg);
break;
case 'T':
hbparam->frequency = atoi(optarg);
break;
case WMI_GET_HB_CHALLENGE_RESP:
cmd = WMI_GET_HB_CHALLENGE_RESP;
break;
case 'U':
*cookie = strtoul(optarg, (char **)NULL, 0);
break;
case USER_SETKEYS:
if (argc == 5) {
user_setkeys_info->keyOpCtrl = 0;
cmd = USER_SETKEYS;
} else {
printf("Invalid arg %s:Usage --usersetkeys --initrsc=<on/off>",
optarg);
}
break;
case WMI_GET_RD:
cmd = WMI_GET_RD;
break;
case WMI_SET_TXOP:
cmd = WMI_SET_TXOP;
pTxOp->txopEnable = atoi(optarg);
break;
case DIAG_ADDR:
*diagaddr = strtoul(optarg, (char **)NULL, 0);
printf("addr: 0x%x\n", *diagaddr);
break;
case DIAG_DATA:
*diagdata = strtoul(optarg, (char **)NULL, 0);
printf("data: 0x%x\n", *diagdata);
break;
case DIAG_READ:
cmd = DIAG_READ;
break;
case DIAG_WRITE:
cmd = DIAG_WRITE;
break;
case WMI_SET_KEEPALIVE:
cmd = WMI_SET_KEEPALIVE;
if (wmic_validate_setkeepalive(setKeepAlive, argv) != A_OK) {
printf("setkeepalive: invalid args\n");
cmd = 0;
break;
}
break;
case WMI_GET_KEEPALIVE:
cmd = WMI_GET_KEEPALIVE;
break;
case WMI_SET_APPIE:
cmd = WMI_SET_APPIE;
if (argc - optind != 1) {
printf("Usage is --setappie <beacon/probe/respon/assoc> <IE>\n");
cmd = 0;
break;
}
if (A_OK != wmic_validate_appie(appIEInfo, argv)) {
cmd = 0;
break;
}
break;
case WMI_SET_MGMT_FRM_RX_FILTER:
cmd = WMI_SET_MGMT_FRM_RX_FILTER;
if (argc - optind != 1) {
printf("Usage is --setmgmtfilter <set/clear> <frmtype> \n");
cmd = 0;
break;
}
if (A_OK != wmic_validate_mgmtfilter(pMgmtFilter, argv)) {
cmd = 0;
break;
}
break;
case 'V':
dbglogCfg->mmask = strtoul(optarg, (char **)NULL, 0);
dbglogCfg->valid |= DBGLOG_MODULE_LOG_ENABLE_MASK;
break;
case 'W':
dbglogCfg->rep = strtoul(optarg, (char **)NULL, 0);
dbglogCfg->valid |= DBGLOG_REPORTING_ENABLED_MASK;
break;
case 'X':
dbglogCfg->tsr = strtoul(optarg, (char **)NULL, 0);
dbglogCfg->valid |= DBGLOG_TIMESTAMP_RESOLUTION_MASK;
break;
case 'Y':
dbglogCfg->size = strtoul(optarg, (char **)NULL, 0);
dbglogCfg->valid |= DBGLOG_REPORT_SIZE_MASK;
break;
case 'Z':
clearstat = 1;
break;
case WMI_BSSID:
convert_hexstring_bytearray(optarg, bssid, sizeof(bssid));
break;
case USER_SETKEYS_INITRSC:
if (strcmp(optarg, "on") == 0) {
user_setkeys_info->keyOpCtrl &=
~AR6000_USER_SETKEYS_RSC_UNCHANGED;
} else if (strcmp(optarg, "off") == 0) {
user_setkeys_info->keyOpCtrl |=
AR6000_USER_SETKEYS_RSC_UNCHANGED;
} else {
printf("Invalid arg %s:Usage --usersetkeys --initrsc=<on/off>",
optarg);
}
break;
case WMI_DBGLOG_CFG_MODULE:
dbglogCfg->valid = 0;
cmd = WMI_DBGLOG_CFG_MODULE;
break;
case WMI_DBGLOG_GET_DEBUG_LOGS:
cmd = WMI_DBGLOG_GET_DEBUG_LOGS;
break;
case WMI_SET_HOST_SLEEP_MODE:
cmd = WMI_SET_HOST_SLEEP_MODE;
if (!strcmp(optarg, "asleep")) {
hostSleepModeCmd->asleep = TRUE;
hostSleepModeCmd->awake = FALSE;
} else if (!strcmp(optarg, "awake")) {
hostSleepModeCmd->asleep = FALSE;
hostSleepModeCmd->awake = TRUE;
}
break;
case WMI_SET_WOW_MODE:
cmd = WMI_SET_WOW_MODE;
if (!strcmp(optarg, "enable")) {
wowModeCmd->enable_wow = TRUE;
} else if (!strcmp(optarg, "disable")) {
wowModeCmd->enable_wow = FALSE;
}
break;
case WMI_SET_WOW_FILTER:
if (!strcmp(optarg, "none")) {
wowModeCmd->filter = 0;
} else if (!strcmp(optarg, "ssid")) {
wowModeCmd->filter |= (1<<WOW_FILTER_SSID);
}
break;
case WMI_SET_WOW_HOST_REQ_DELAY:
wowModeCmd->hostReqDelay=atoi(optarg);
break;
case WMI_ADD_WOW_PATTERN:
cmd = WMI_ADD_WOW_PATTERN;
index = (optind - 1);
A_UINT8* filter_mask = NULL;
A_UINT8 temp1[64]={0};
A_UINT8 temp2[64]={0};
if((index + 4) > argc) {
printf("Incorrect number of add wow pattern parameters\n");
cmd = 0;
break;
}
memset((char*)addWowCmd, 0, sizeof(WMI_ADD_WOW_PATTERN_CMD));
i = addWowCmd->filter_list_id = 0;
addWowCmd->filter_list_id = atoi(argv[index++]);
addWowCmd->filter_size = atoi(argv[index++]);
addWowCmd->filter_offset = atoi(argv[index++]);
printf("optind=%d, size=%d offset=%d id=%d\n", optind,
addWowCmd->filter_size, addWowCmd->filter_offset,
addWowCmd->filter_list_id);
convert_hexstring_bytearray(argv[index], temp1,addWowCmd->filter_size );
memcpy(&addWowCmd->filter[0], temp1, addWowCmd->filter_size);
index++;
filter_mask = (A_UINT8*)(addWowCmd->filter + addWowCmd->filter_size);
convert_hexstring_bytearray(argv[index], temp2,addWowCmd->filter_size );
memcpy(filter_mask, temp2, addWowCmd->filter_size);
for (i=0; i< addWowCmd->filter_size; i++) {
printf ("mask[%d]=%x pattern[%d]=%x temp=%x\n", i, filter_mask[i], i, addWowCmd->filter[i], temp1[i]);
}
break;
case WMI_DEL_WOW_PATTERN:
cmd = WMI_DEL_WOW_PATTERN;
index = (optind - 1);
if ((index + 1) > argc) {
printf("Incorrect number of del wow pattern parameters\n");
cmd = 0;
break;
}
delWowCmd->filter_list_id = 0;
index++;
delWowCmd->filter_id = atoi(argv[index]);
break;
case WMI_GET_WOW_LIST:
cmd = WMI_GET_WOW_LIST;
index = (optind - 1);
if ((index + 1) > argc) {
printf("Incorrect number of get wow list parameters\n");
cmd = 0;
break;
}
getWowListCmd->filter_list_id = atoi(argv[index]);
printf("Get wow filters in list %d\n", getWowListCmd->filter_list_id);
break;
case DIAG_DUMP_CHIP_MEM:
cmd = DIAG_DUMP_CHIP_MEM;
break;
case DIAG_DUMP_CHIP_MEM_VENUS:
cmd = DIAG_DUMP_CHIP_MEM_VENUS;
break;
case WMI_SET_CONNECT_CTRL_FLAGS:
cmd = WMI_SET_CONNECT_CTRL_FLAGS;
break;
case DUMP_HTC_CREDITS:
cmd = DUMP_HTC_CREDITS;
break;
case WMI_AKMP_MULTI_PMKID:
if (strcmp(optarg, "on") == 0) {
akmpCtrlCmd->akmpInfo |= WMI_AKMP_MULTI_PMKID_EN;
} else if (strcmp(optarg, "off") == 0) {
akmpCtrlCmd->akmpInfo &= ~WMI_AKMP_MULTI_PMKID_EN;
} else {
printf("Invalid arg %s:Usage --setakmctrl --multipmkid=<on/off>",
optarg);
}
break;
case WMI_SET_AKMP_INFO:
cmd = WMI_SET_AKMP_INFO;
break;
case WMI_NUM_PMKID:
if ((pmkidUserInfo.numPMKIDUser = atoi(optarg))
> WMI_MAX_PMKID_CACHE)
{
printf("Number of PMKIDs %d is out of range [1-%d]\n",
pmkidUserInfo.numPMKIDUser,
WMI_MAX_PMKID_CACHE);
pmkidUserInfo.numPMKIDUser = 0;
}
break;
case WMI_PMKID_ENTRY:
if (pmkidUserInfo.pmkidInfo->numPMKID <
pmkidUserInfo.numPMKIDUser)
{
A_UINT8 nextEntry = pmkidUserInfo.pmkidInfo->numPMKID;
convert_hexstring_bytearray(optarg,
pmkidUserInfo.pmkidInfo->
pmkidList[nextEntry].pmkid,
WMI_PMKID_LEN);
pmkidUserInfo.pmkidInfo->numPMKID++;
}
break;
case WMI_SET_PMKID_LIST:
cmd = WMI_SET_PMKID_LIST;
pmkidUserInfo.pmkidInfo =
(WMI_SET_PMKID_LIST_CMD *)(buf + sizeof(int));
pmkidUserInfo.pmkidInfo->numPMKID = 0;
pmkidUserInfo.numPMKIDUser = 0;
break;
case WMI_GET_PMKID_LIST:
cmd = WMI_GET_PMKID_LIST;
break;
case WMI_SET_IEMASK:
filterCmd->ieMask = strtoul(argv[optind-1], NULL, 0);
break;
case WMI_SET_BSS_PMKID_INFO:
cmd = WMI_SET_BSS_PMKID_INFO;
memset(bssid, 0, sizeof(bssid));
pi_cmd->pi_enable = FALSE;
break;
case WMI_BSS_PMKID_ENTRY:
convert_hexstring_bytearray(optarg, pi_cmd->pi_pmkid,
sizeof(pi_cmd->pi_pmkid));
memcpy(pi_cmd->pi_bssid, bssid, sizeof(bssid));
pi_cmd->pi_enable = TRUE;
break;
case WMI_ABORT_SCAN:
cmd = WMI_ABORT_SCAN;
break;
case WMI_TARGET_EVENT_REPORT:
cmd = WMI_TARGET_EVENT_REPORT;
evtCfgCmd->evtConfig = atoi(optarg);
break;
/* AP mode commands */
case WMI_AP_GET_STA_LIST:
cmd = WMI_AP_GET_STA_LIST;
break;
case WMI_AP_HIDDEN_SSID:
cmd = WMI_AP_HIDDEN_SSID;
pHidden->hidden_ssid = atoi(argv[optind]);
break;
case WMI_AP_SET_NUM_STA:
cmd = WMI_AP_SET_NUM_STA;
pNumSta->num_sta = atoi(argv[optind]);
break;
case WMI_AP_SET_GNUM_STA:
cmd = WMI_AP_SET_GNUM_STA;
pNumSta->num_sta = atoi(argv[optind]);
pNumSta->num_sta |= 0x80;
break;
case WMI_AP_GET_NUM_STA:
cmd = WMI_AP_GET_NUM_STA;
pNumSta->num_sta = 0;
break;
case WMI_AP_GET_GNUM_STA:
cmd = WMI_AP_GET_GNUM_STA;
pNumSta->num_sta = 0x80;
break;
case WMI_AP_SET_DFS:
cmd = WMI_AP_SET_DFS;
setDfsCmd->enable = atoi(optarg);
break;
case WMI_AP_ACL_POLICY:
{
A_UINT8 policy, retain;
cmd = WMI_AP_ACL_POLICY;
index = optind;
policy = atoi(argv[index++]);
retain = atoi(argv[index++]);
pACLpolicy->policy = policy |
(retain?AP_ACL_RETAIN_LIST_MASK:0);
break;
}
case WMI_AP_ACL_MAC_LIST1:
cmd = WMI_AP_ACL_MAC_LIST1;
pACL->action = ADD_MAC_ADDR;
if(wmic_ether_aton_wild(argv[optind], pACL->mac, &pACL->wildcard) != A_OK) {
printf("bad mac address\n");
exit (0);
}
break;
case WMI_AP_ACL_MAC_LIST2:
cmd = WMI_AP_ACL_MAC_LIST2;
pACL->action = DEL_MAC_ADDR;
if( (strlen(argv[optind]) == 2) && ISDIGIT(argv[optind][0]) && ISDIGIT(argv[optind][1]) ) {
pACL->index = atoi(argv[optind]);
} else if( (strlen(argv[optind]) == 1) && ISDIGIT(argv[optind][0]) ) {
pACL->index = atoi(argv[optind]);
} else {
printf("bad ACL index\n");
exit(0);
}
break;
case WMI_AP_GET_ACL_LIST:
cmd = WMI_AP_GET_ACL_LIST;
break;
case WMI_AP_COMMIT_CONFIG:
cmd = WMI_AP_COMMIT_CONFIG;
break;
case WMI_AP_INACT_TIME:
cmd = WMI_AP_INACT_TIME;
pInact->period = atoi(argv[optind]);
break;
case WMI_AP_PROT_TIME:
cmd = WMI_AP_PROT_TIME;
index = optind;
pProt->period_min = atoi(argv[index++]);
pProt->dwell_ms = atoi(argv[index++]);
break;
case WMI_AP_SET_MLME:
cmd = WMI_AP_SET_MLME;
index = optind;
if((index + 3) > argc) {
printf("Incorrect number of arguments\n");
exit(0);
}
pMlme->im_op = atoi(argv[index++]);
pMlme->im_reason = atoi(argv[index++]);
if(wmic_ether_aton(argv[index++], pMlme->im_macaddr) != A_OK) {
printf("bad mac address\n");
exit (0);
}
break;
case WMI_AP_SET_DTIM:
cmd = WMI_AP_SET_DTIM;
pDtim->dtim = atoi(argv[optind]);
break;
case WMI_AP_SET_COUNTRY:
cmd = WMI_AP_SET_COUNTRY;
A_BOOL match=FALSE;
for(i = 0; i < sizeof(my_ctr)/sizeof(my_ctr[0]); i++) {
if(!strcasecmp(optarg, my_ctr[i])) {
match = 1;
break;
}
}
if (!match) {
cmd = 0;
} else {
memcpy(pCountry->countryCode,my_ctr[i], 2);
*(pCountry->countryCode + 2)=0x20;
}
break;
case WMI_AP_GET_COUNTRY_LIST:
cmd = WMI_AP_GET_COUNTRY_LIST;
break;
case WMI_AP_DISABLE_REGULATORY:
cmd = WMI_AP_DISABLE_REGULATORY;
break;
case WMI_AP_INTRA_BSS:
cmd = WMI_AP_INTRA_BSS;
*intra = atoi(argv[optind]);
*intra &= 0xF;
break;
case WMI_AP_INTER_BSS:
cmd = WMI_AP_INTER_BSS;
*intra = atoi(argv[optind]);
*intra |= 0x80;
break;
case WMI_DUMP_RCV_AGGR_STATS:
cmd = WMI_DUMP_RCV_AGGR_STATS;
break;
case WMI_SUSPEND_DRIVER:
cmd = WMI_SUSPEND_DRIVER;
break;
case WMI_RESUME_DRIVER:
cmd = WMI_RESUME_DRIVER;
break;
case WMI_SETUP_AGGR:
{
A_UINT8 aid;
cmd = WMI_SETUP_AGGR;
if(argc-optind < 2) {
printf("--setup_aggr <tid> <aid>\n");
return 0;
}
pAddbaReq->tid = strtoul(argv[optind++], NULL, 0);
if(argv[optind]) aid = strtoul(argv[optind], NULL, 0);
pAddbaReq->tid = (pAddbaReq->tid & 0xF) | (aid << 4);
break;
}
case WMI_CFG_ALLOW_AGGR:
cmd = WMI_CFG_ALLOW_AGGR;
pAllowAggr->tx_allow_aggr = strtoul(argv[argc-2], NULL, 0);
pAllowAggr->rx_allow_aggr = strtoul(argv[argc-1], NULL, 0);
break;
case WMI_CFG_DELE_AGGR:
{
A_UINT8 aid;
cmd = WMI_CFG_DELE_AGGR;
if(argc-optind < 2) {
printf("--dele_aggr <tid> <direction> <aid>\n");
return 0;
}
pDeleteAggr->tid = strtoul(argv[optind++], NULL, 0);
pDeleteAggr->is_sender_initiator = strtoul(argv[optind++], NULL, 0);
if(argv[optind]) aid = strtoul(argv[optind], NULL, 0);
pDeleteAggr->tid = (pDeleteAggr->tid & 0xF) | (aid << 4);
break;
}
case WMI_SET_HT_CAP:
cmd = WMI_SET_HT_CAP;
break;
case WMI_SET_HT_OP:
cmd = WMI_SET_HT_OP;
break;
case WMI_AP_GET_STAT:
cmd = WMI_AP_GET_STAT;
break;
case WMI_AP_CLR_STAT:
cmd = WMI_AP_CLR_STAT;
break;
case WMI_SET_TX_SELECT_RATES:
cmd = WMI_SET_TX_SELECT_RATES;
break;
case WMI_AP_GET_HIDDEN_SSID:
cmd = WMI_AP_GET_HIDDEN_SSID;
break;
case WMI_AP_GET_COUNTRY:
cmd = WMI_AP_GET_COUNTRY;
break;
case WMI_AP_GET_WMODE:
cmd = WMI_AP_GET_WMODE;
break;
case WMI_AP_GET_DTIM:
cmd = WMI_AP_GET_DTIM;
break;
case WMI_AP_GET_BINTVL:
cmd = WMI_AP_GET_BINTVL;
break;
case WMI_GET_RTS:
cmd = WMI_GET_RTS;
break;
case DIAG_FETCH_TARGET_REGS:
cmd = DIAG_FETCH_TARGET_REGS;
break;
#ifdef ATH_INCLUDE_PAL
case WMI_SEND_PAL_CMD:
cmd = WMI_SEND_PAL_CMD;
break;
case WMI_SEND_PAL_DATA:
cmd = WMI_SEND_PAL_DATA;
break;
#endif
case WMI_SET_WLAN_CONN_PRECDNCE:
cmd = WMI_SET_WLAN_CONN_PRECDNCE;
prec->precedence = atoi(argv[argc-1]);
break;
case WMI_SET_AP_RATESET:
cmd = WMI_SET_AP_RATESET;
pAPrs->rateset = atoi(argv[optind]);
break;
case WMI_SET_TX_WAKEUP_POLICY:
if (!strcmp(optarg, "sleep")) {
pmParamCmd->tx_wakeup_policy = TX_DONT_WAKEUP_UPON_SLEEP;
} else if (!strcmp(optarg, "wakeup")) {
pmParamCmd->tx_wakeup_policy = TX_WAKEUP_UPON_SLEEP;
} else {
cmd = 0;
}
break;
case WMI_SET_TX_NUM_FRAMES_TO_WAKEUP:
pmParamCmd->num_tx_to_wakeup = atoi(optarg);
break;
case WMI_SET_AP_PS_PSTYPE:
if (!strcmp(optarg, "disable")) {
apPsCmd->psType = AP_PS_DISABLE;
} else if (!strcmp(optarg, "atheros")) {
apPsCmd->psType = AP_PS_ATH;
} else {
cmd = 0;
}
break;
case WMI_SET_AP_PS_IDLE_TIME:
apPsCmd->idle_time = atoi(optarg);
break;
case WMI_SET_AP_PS_PS_PERIOD:
apPsCmd->ps_period = atoi(optarg);
break;
case WMI_SET_AP_PS_SLEEP_PERIOD:
apPsCmd->sleep_period = atoi(optarg);
break;
case WMI_SEND_CONNECT_CMD:
cmd = WMI_SEND_CONNECT_CMD;
memset(&cp,0,sizeof(cp));
if(strlen(optarg) > 32) {
printf("Error: Wrong SSID\n");
} else {
cp.ssid_len = strlen(optarg);
memcpy(cp.ssid, optarg, cp.ssid_len);
}
break;
case WMI_SEND_CONNECT_CMD1:
#ifdef WPA_SUPPORT
{
unsigned long val;
index = optind-1;
if(argc-index != 4) {
printf("Error: wpa needs 4 args but only %d given\n", argc-index);
break;
}
val = strtol(argv[index++], NULL, 0);
if(val == 1) {
cp.wpa = IW_AUTH_WPA_VERSION_WPA;
} else if(val == 2) {
cp.wpa = IW_AUTH_WPA_VERSION_WPA2;
} else {
cp.wpa = 0;
printf("Error: Wrong WPA version\n");
}
if (!strcasecmp(argv[index], "tkip")) {
cp.ucipher = IW_AUTH_CIPHER_TKIP;
} else if (!strcasecmp(argv[index], "ccmp")) {
cp.ucipher = IW_AUTH_CIPHER_CCMP;
} else {
cp.ucipher = IW_AUTH_CIPHER_NONE;
printf("Error: Wrong unicast cipher\n");
}
index++;
if (!strcasecmp(argv[index], "tkip")) {
cp.mcipher = IW_AUTH_CIPHER_TKIP;
} else if (!strcasecmp(argv[index], "ccmp")) {
cp.mcipher = IW_AUTH_CIPHER_CCMP;
} else {
cp.mcipher = IW_AUTH_CIPHER_NONE;
printf("Error: Wrong multicast cipher\n");
}
index++;
val = strlen(argv[index]);
if(val >= 8 && val <= 63) {
memcpy(cp.psk, argv[index], val);
cp.psk_type = KEYTYPE_PHRASE;
} else if (val == 64) {
memcpy(cp.psk, argv[index], val);
cp.psk_type = KEYTYPE_PSK;
} else {
printf("Error: Wrong PSK\n");
}
break;
}
#else
return -1;
#endif
case WMI_SEND_CONNECT_CMD2:
printf("Error: WEP not yet implemented\n");
return 0;
case WMI_SET_WPA_OFFLOAD_STATE:
{
index = optind-1;
if(argc-index != 1) {
printf("Error: setwpaoffload needs 1 arg but only %d given\n", argc-index);
break;
}
*pWpaOffloadState = strtol(argv[index++], NULL, 0);
cmd = WMI_SET_WPA_OFFLOAD_STATE;
break;
}
case WMI_SET_EXCESS_TX_RETRY_THRES:
{
index = optind-1;
if(argc-index != 1) {
printf("Error: setexcesstxretrythres needs 1 arg but only %d given\n", argc-index);
break;
}
*pExcessTxRetryThres = strtol(argv[index++], NULL, 0);
cmd = WMI_SET_EXCESS_TX_RETRY_THRES;
break;
}
case BT_HW_POWER_STATE:
if (!strcmp(optarg, "on")) {
cmd = SET_BT_HW_POWER_STATE;
((int *)buf)[0] = AR6000_XIOCTL_SET_BT_HW_POWER_STATE;
((int *)buf)[1] = 1;
} else if (!strcmp(optarg, "off")) {
cmd = SET_BT_HW_POWER_STATE;
((int *)buf)[0] = AR6000_XIOCTL_SET_BT_HW_POWER_STATE;
((int *)buf)[1] = 0;
} else if (!strcmp(optarg, "query")) {
cmd = GET_BT_HW_POWER_STATE;
((int *)buf)[0] = AR6000_XIOCTL_GET_BT_HW_POWER_STATE;
} else {
usage();
}
break;
case WMI_SET_TX_SGI_PARAM:
cmd = WMI_SET_TX_SGI_PARAM;
set_txsgiparam->sgiMask[0] = DEFAULT_SGI_MASK_L32;
set_txsgiparam->sgiMask[1] = DEFAULT_SGI_MASK_U32;
set_txsgiparam->sgiPERThreshold = DEFAULT_SGI_PER;
break;
case WMI_SGI_MASK:
{
unsigned long long val;
val = strtoll(optarg, NULL, 16);
set_txsgiparam->sgiMask[0] = (unsigned long) val;
set_txsgiparam->sgiMask[1] = (unsigned long) (val>>32);
}
break;
case WMI_PER_SGI:
{set_txsgiparam->sgiPERThreshold = atoi(optarg);
break;
}
case WMI_WAC_ENABLE:
cmd = WMI_WAC_ENABLE;
break;
case WMI_AP_ACS_DISABLE_HI_CHANNELS:
cmd = WMI_AP_ACS_DISABLE_HI_CHANNELS;
((int *)buf)[1] = atoi(argv[optind]);
break;
case WMI_SET_DIVERSITY_PARAM:
cmd = WMI_SET_DIVERSITY_PARAM;
index = optind-1;
pDiversity->divIdleTime = atoi(argv[index++]);
pDiversity->antRssiThresh = atoi(argv[index++]);
pDiversity->divEnable = atoi(argv[index++]);
pDiversity->active_treshold_rate = atoi(argv[index++]);
break;
case WMI_SCAN_PROBED_SSID:
cmd = WMI_SCAN_PROBED_SSID;
ssid = (A_UCHAR *)optarg;
break;
case WMI_AP_SET_APSD:
cmd = WMI_AP_SET_APSD;
pApApsd->enable = atoi(argv[optind]);
break;
case WMI_GET_HT_CAP:
cmd = WMI_GET_HT_CAP;
break;
case WMI_SET_MCASTRATE:
cmd = WMI_SET_MCASTRATE;
break;
case WMI_VOICE_DETECTION_ENABLE:
cmd = WMI_VOICE_DETECTION_ENABLE;
if (argc - optind != 0) {
printf("Usage is --enablevoicedetection <enable>\n");
cmd = 0;
break;
}
pVoiceDetectionEnable->enable = atoi(optarg);
break;
case WMI_SET_TXE_NOTIFY:
cmd = WMI_SET_TXE_NOTIFY;
index = optind - 1;
pTXe->rate = atoi(argv[index++]);
pTXe->pkts = atoi(argv[index++]);
pTXe->intvl = atoi(argv[index++]);
break;
case WMI_SET_RECOVERY_SIMULATE:
/*wmiconfig -i wlan0 --setrecoverysim 0 100*/
if(argc - optind != 2){
printf("Error: WMI_SET_RECOVERY_SIMULATE optind:%x argc:%x\n", optind,argc);
cmd = 0;
break;
}
cmd = WMI_SET_RECOVERY_SIMULATE;
index = optind;
pSetRecoveryParam->type = atoi(argv[index++]);
pSetRecoveryParam->delay_time_ms = atoi(argv[index++]);
break;
case WMI_DISABLE_BCAST_IN_PM:
/* wmiconfig -i wlan0 --disablebcast <para0> */
index = optind-1;
if (argc - index != 1) {
printf("Error: WMI_DISABLE_BCAST_IN_PM optind:%x argc:%x\n", optind, argc);
cmd = 0;
break;
}
cmd = WMI_DISABLE_BCAST_IN_PM;
disableBcastCmd->disable = atoi(argv[index++]);
break;
case WMI_AP_BLWL:
{
A_UINT8 control, macindex;
index = optind;
control = atoi(argv[index++]);
if (0 == control) //enable blwl
{
cmd = WMI_AP_BLWL_POLICY;
pACLpolicy->policy = AP_ACL_DISABLE;
}
else if (1 == control) //enable blwl
{
cmd = WMI_AP_BLWL_POLICY;
pACLpolicy->policy = AP_ACL_BLWL_MAC;
}
else if (2 == control) //add a mac into whitelist
{
cmd = WMI_AP_BLWL_MAC_LIST;
macindex = atoi(argv[index++]);
pACL->action = ADD_WHITE_MAC_ADDR;
pACL->index = macindex;
if (wmic_ether_aton_wild(argv[index], pACL->mac, &pACL->wildcard) != A_OK)
{
printf("bad mac address\n");
exit (0);
}
}
else if (3 == control) //add a mac into blacklist
{
cmd = WMI_AP_BLWL_MAC_LIST;
macindex = atoi(argv[index++]);
pACL->action = ADD_BLACK_MAC_ADDR;
pACL->index = macindex;
if (wmic_ether_aton_wild(argv[index], pACL->mac, &pACL->wildcard) != A_OK)
{
printf("bad mac address\n");
exit (0);
}
}
else if (4 == control) //reset whitelist
{
cmd = WMI_AP_BLWL_MAC_LIST;
pACL->action = RESET_WHITE_LIST;
}
else if (5 == control) //reset blacklist
{
cmd = WMI_AP_BLWL_MAC_LIST;
pACL->action = RESET_BLACK_LIST;
}
else
{
printf("cmd para error\n");
exit (0);
}
break;
}
case WMI_SET_RSSI_FILTER:
cmd = WMI_SET_RSSI_FILTER;
pSetRssiFilter->rssi_value = atoi(argv[optind]);
pSetRssiFilter->rssi_value -= 95; /*the configure value is the real dbm*/
break;
default:
usage();
break;
}
}
error = tcmd_init(ifname, rx_cb, TCMD_EP_WMI);
if (error) {
printf("Error\n");
return error;
}
switch (cmd) {
case WMI_SET_KEEPALIVE:
((int *)buf)[0] = WMI_SET_KEEPALIVE_CMDID_EXT;
printf("Sending WMI_SET_KEEPALIVE\n");
tcmd_tx(buf, sizeof(*setKeepAlive) + 4, false);
break;
case WMI_SET_DISC_TIMEOUT:
((int *)buf)[0] = WMI_SET_DISC_TIMEOUT_CMDID;
index = optind;
index--;
printf("Sending WMI_SET_DISC_TIMEOUT\n");
tcmd_tx(buf, 5, false);
break;
case WMI_GET_TARGET_STATS:
((int *)buf)[0] = WMI_GET_STATISTICS_CMDID;
index = optind;
index--;
printf("case WMI_GET_TARGET_STATS=%d\n", WMI_GET_STATISTICS_CMDID);
tcmd_tx(buf, 4, true);
//printTargetStats(&(tgtStatsCmd.targetStats))
break;
case WMI_GET_VERSION:
((int *)buf)[0] = WMI_GET_VERSION;
index = optind;
index--;
printf("case WMI_GET_VERSION\n");
tcmd_tx(buf, 4, true);
//printTargetStats(&(tgtStatsCmd.targetStats))
break;
case WMI_SET_SCAN_PARAMS:
((int *)buf)[0] = WMI_SET_SCAN_PARAMS_CMDID;
index = optind;
index--;
printf("Sending WMI_SET_SCAN_PARAMS\n");
tcmd_tx(buf, 24, false);
break;
case WMI_SET_MCASTRATE:
((int *)buf)[0] = WMI_SET_MCASTRATE_CMDID;
index = optind;
index--;
pMcast->bitrate = atoi(argv[index]);
printf("Sending WMI_SET_MCASTRATE %d\n", pMcast->bitrate);
tcmd_tx(buf, sizeof(WMI_SET_MCASTRATE_CMD) + 4, false);
break;
case WMI_VOICE_DETECTION_ENABLE:
((int *)buf)[0] = WMI_VOICE_DETECTION_ENABLE_CMDID;
printf("Sending WMI_VOICE_DETECTION_ENABLE_CMDID(0x%x) to %s\n", WMI_VOICE_DETECTION_ENABLE_CMDID, pVoiceDetectionEnable->enable?"enable":"disable");
tcmd_tx(buf, sizeof(WMI_VOICE_DETECTION_ENABLE_CMD) + 4, false);
break;
case WMI_SET_TXE_NOTIFY:
((int *)buf)[0] = WMI_SET_TXE_NOTIFY_CMDID;
printf("Sending WMI_SET_TXE_NOTIFY_CMDID, rate %d, pkts %d, intvl %d\n", pTXe->rate, pTXe->pkts, pTXe->intvl);
/* XXX: we do expect a TXE_NOTIFY_EVENT in response to this, but
* libtcmd currently does not support event listening. */
tcmd_tx(buf, sizeof(WMI_SET_TXE_NOTIFY_CMD) + 4, false);
break;
case WMI_SET_RECOVERY_SIMULATE:
((int *)buf)[0] = WMI_SET_RECOVERY_TEST_PARAMETER_CMDID;
printf("Sending WMI_SET_RECOVERY_TEST_PARAMETER_CMDID(0x%x),type:%d, delay:%d\n", WMI_SET_RECOVERY_TEST_PARAMETER_CMDID,pSetRecoveryParam->type,pSetRecoveryParam->delay_time_ms);
tcmd_tx(buf, sizeof(WMI_SET_RECOVERY_TEST_PARAMETER_CMD) + 4, false);
break;
case WMI_DISABLE_BCAST_IN_PM:
((int *)buf)[0] = WMI_DISABLE_BCAST_IN_PM_CMDID;
printf("Sending WMI_DISABLE_BCAST_IN_PM(0x%x),disable:%d\n", WMI_DISABLE_BCAST_IN_PM, disableBcastCmd->disable);
tcmd_tx(buf, sizeof(WMI_DISABLE_BCAST_IN_PM_CMD)+4, false);
break;
case WMI_AP_BLWL_POLICY:
((int *)buf)[0] = WMI_AP_ACL_POLICY_CMDID;
printf("Sending WMI_AP_ACL_POLICY_CMDID(0x%x), policy = %d\n", WMI_AP_ACL_POLICY_CMDID, pACLpolicy->policy);
tcmd_tx(buf, sizeof(WMI_AP_ACL_POLICY_CMD) + 4, false);
break;
case WMI_AP_BLWL_MAC_LIST:
((int *)buf)[0] = WMI_AP_ACL_MAC_LIST_CMDID;
printf("Sending WMI_AP_ACL_MAC_LIST_CMDID(0x%x), action = %d, index = %d, mac=%02X:%02X:%02X:%02X:%02X:%02X\n",
WMI_AP_ACL_MAC_LIST_CMDID, pACL->action, pACL->index,
pACL->mac[0], pACL->mac[1], pACL->mac[2], pACL->mac[3], pACL->mac[4], pACL->mac[5]);
tcmd_tx(buf, sizeof(WMI_AP_ACL_MAC_CMD) + 4, false);
break;
case WMI_AP_SET_NUM_STA:
((int *)buf)[0] = WMI_AP_SET_NUM_STA_CMDID;
printf("Sending WMI_AP_SET_NUM_STA_CMDID(0x%x),NUMBER:%d\n", WMI_AP_SET_NUM_STA_CMDID, pNumSta->num_sta);
tcmd_tx(buf, sizeof(WMI_AP_NUM_STA_CMD)+4, false);
break;
case WMI_SET_RSSI_FILTER:
((int *)buf)[0] = WMI_SET_RSSI_FILTER_CMDID;
printf("Sending WMI_SET_RSSI_FILTER_CMDID(0x%x),rssi:%d\n", WMI_SET_RSSI_FILTER_CMDID, pSetRssiFilter->rssi_value);
tcmd_tx(buf, sizeof(WMI_SET_RSSI_FILTER_CMD)+4, false);
break;
case WMI_SET_SSID:
((int *)buf)[0] = WMI_SET_PROBED_SSID_CMDID;
printf("Sending WMI_SET_PROBED_SSID_CMDID(0x%x),ssid:%s index:%d\n", WMI_SET_PROBED_SSID_CMDID, ssid, pSsidCmd->entryIndex);
if (ssid && (strlen((const char *)ssid) > sizeof (pSsidCmd->ssid))) {
break;
}
if (strcmp((const char *)ssid, "off") == 0) {
pSsidCmd->ssidLength = 0;
pSsidCmd->flag = DISABLE_SSID_FLAG;
} else if (strcmp((const char *)ssid, "any") == 0) {
pSsidCmd->ssidLength = 0;
pSsidCmd->flag = ANY_SSID_FLAG;
} else {
pSsidCmd->flag = SPECIFIC_SSID_FLAG;
pSsidCmd->ssidLength = (A_UINT8)strlen((const char *)ssid);
memcpy(pSsidCmd->ssid, ssid, pSsidCmd->ssidLength);
}
tcmd_tx(buf, sizeof(WMI_PROBED_SSID_CMD)+4, false);
break;
case WMI_START_SCAN:
((int *)buf)[0] = WMI_START_SCAN_CMDID;
printf("Sending WMI_START_SCAN_CMDID(0x%x),scanType:%d forceFgScan:%d,isLegacy:%d,homeDwellTime:%d,forceScanInterval:%d,numChannels:%d\n",
WMI_START_SCAN_CMDID, startScanCmd->scanType,startScanCmd->forceFgScan,startScanCmd->isLegacy,startScanCmd->homeDwellTime,startScanCmd->forceScanInterval,startScanCmd->numChannels);
tcmd_tx(buf, sizeof(WMI_START_SCAN_CMD)+4, false);
break;
case WMI_AP_SET_DTIM:
((int *)buf)[0] = WMI_AP_SET_DTIM_CMDID;
printf("Sending WMI_AP_SET_DTIM_CMD(0x%x), dtim = %d\n", WMI_AP_SET_DTIM_CMDID, pDtim->dtim);
tcmd_tx(buf, sizeof(WMI_AP_SET_DTIM_CMD) + 4, false);
break;
case WMI_SET_DIVERSITY_PARAM:
((int *)buf)[0] = WMI_SET_DIV_PARAMS_CMDID;
printf("Sending WMI_SET_DIVERSITY_PARAM IdleTime %d, antRssiThresh %d, divEnable %d, active_threshols_rate %d\n",
pDiversity->divIdleTime,
pDiversity->antRssiThresh,
pDiversity->divEnable,
pDiversity->active_treshold_rate);
tcmd_tx(buf, sizeof(WMI_DIV_PARAMS_CMD) + 4, false);
break;
default:
usage();
}
exit (0);
}
void rx_cb(void *buf, int len)
{
TCMD_ID tcmd;
int i;
uint32_t * buff;
buff = (uint32_t *) buf;
char fw_version[32];
tcmd = * ((uint32_t *) buf + 1);
//printf("rx_cb: sizeof(TARGET_STATS)=%d, len=%d, user_cmd=%d\n",
// sizeof(TARGET_STATS), len, user_cmd);
for (i=0; i< len/4+1; i=i+4)
printf("rx_cb: 0x%08X 0x%08X 0x%08X 0x%08X\n",
buff[i], buff[i+1], buff[i+2], buff[i+3]);
//fprintf(stderr, "tcmd=%d\n", tcmd);
switch (buff[0]) {
case WMI_REPORT_STATISTICS_EVENTID:
printTargetStats((TARGET_STATS *)((uint32_t*)buf+1));
break;
case WMI_WLAN_VERSION_EVENTID:
memcpy(fw_version, (int *)buf+1, 32);
printf("FW Version: %s\n", fw_version);
break;
default:
break;
}
}
/*
* converts ieee channel number to frequency
*/
static A_UINT16
wmic_ieee2freq(int chan)
{
if (chan == 14) {
return 2484;
}
if (chan < 14) { /* 0-13 */
return (2407 + (chan*5));
}
if (chan < 27) { /* 15-26 */
return (2512 + ((chan-15)*20));
}
return (5000 + (chan*5));
}
#ifdef NOT_YET
// Validate a hex character
static A_BOOL
_is_hex(char c)
{
return (((c >= '0') && (c <= '9')) ||
((c >= 'A') && (c <= 'F')) ||
((c >= 'a') && (c <= 'f')));
}
// Validate alpha
static A_BOOL
isalpha(int c)
{
return (((c >= 'a') && (c <= 'z')) ||
((c >= 'A') && (c <= 'Z')));
}
// Validate alphanum
static A_BOOL
isalnum(int c)
{
return (isalpha(c) || isdigit(c));
}
#endif
// Convert a single hex nibble
static int
_from_hex(char c)
{
int ret = 0;
if ((c >= '0') && (c <= '9')) {
ret = (c - '0');
} else if ((c >= 'a') && (c <= 'f')) {
ret = (c - 'a' + 0x0a);
} else if ((c >= 'A') && (c <= 'F')) {
ret = (c - 'A' + 0x0A);
}
return ret;
}
// Validate digit
static A_BOOL
isdigit(int c)
{
return ((c >= '0') && (c <= '9'));
}
void
convert_hexstring_bytearray(char *hexStr, A_UINT8 *byteArray, A_UINT8 numBytes)
{
A_UINT8 i;
for (i = 0; i < numBytes; i++) {
byteArray[i] = 16*_from_hex(hexStr[2*i + 0]) + _from_hex(hexStr[2*i +1]);
}
}
/*------------------------------------------------------------------*/
/*
* Input an Ethernet address and convert to binary.
*/
static A_STATUS
wmic_ether_aton(const char *orig, A_UINT8 *eth)
{
const char *bufp;
int i;
i = 0;
for(bufp = orig; *bufp != '\0'; ++bufp) {
unsigned int val;
unsigned char c = *bufp++;
if (isdigit(c)) val = c - '0';
else if (c >= 'a' && c <= 'f') val = c - 'a' + 10;
else if (c >= 'A' && c <= 'F') val = c - 'A' + 10;
else break;
val <<= 4;
c = *bufp++;
if (isdigit(c)) val |= c - '0';
else if (c >= 'a' && c <= 'f') val |= c - 'a' + 10;
else if (c >= 'A' && c <= 'F') val |= c - 'A' + 10;
else break;
eth[i] = (unsigned char) (val & 0377);
if(++i == ATH_MAC_LEN) {
/* That's it. Any trailing junk? */
if (*bufp != '\0') {
#ifdef DEBUG
fprintf(stderr, "iw_ether_aton(%s): trailing junk!\n", orig);
return(A_EINVAL);
#endif
}
return(A_OK);
}
if (*bufp != ':')
break;
}
return(A_EINVAL);
}
A_STATUS
wmic_ether_aton_wild(const char *orig, A_UINT8 *eth, A_UINT8 *wild)
{
const char *bufp;
unsigned char val, c;
int i=0;
*wild = 0;
for(bufp = orig; *bufp != '\0'; ++bufp) {
c = *bufp++;
if (isdigit(c)) val = c - '0';
else if (c >= 'a' && c <= 'f') val = c - 'a' + 10;
else if (c >= 'A' && c <= 'F') val = c - 'A' + 10;
else if (c == '*') { val = 0; *wild |= 1<<i; goto next; }
else break;
val <<= 4;
c = *bufp++;
if (isdigit(c)) val |= c - '0';
else if (c >= 'a' && c <= 'f') val |= c - 'a' + 10;
else if (c >= 'A' && c <= 'F') val |= c - 'A' + 10;
else break;
next:
eth[i] = (unsigned char) (val & 0xFF);
if(++i == ATH_MAC_LEN) {
/* That's it. Any trailing junk? */
if (*bufp != '\0') {
}
return(A_OK);
}
if (*bufp != ':')
break;
}
return(A_EINVAL);
}
A_STATUS
wmic_validate_roam_ctrl(WMI_SET_ROAM_CTRL_CMD *pRoamCtrl, A_UINT8 numArgs,
char **argv)
{
A_STATUS status = A_OK;
WMI_BSS_BIAS *pBssBias;
A_INT32 bias;
A_UINT8 i = 0;
switch (pRoamCtrl->roamCtrlType) {
case WMI_FORCE_ROAM:
if (numArgs != 1) {
fprintf(stderr, "BSSID to roam not given\n");
status = A_EINVAL;
} else if (wmic_ether_aton(argv[optind], pRoamCtrl->info.bssid)
!= A_OK)
{
fprintf(stderr,"BSSID %s not in correct format\n",
argv[optind]);
status = A_EINVAL;
}
break;
case WMI_SET_ROAM_MODE:
if (numArgs != 1) {
fprintf(stderr, "roam mode(default, bssbias, lock) not "
" given\n");
status = A_EINVAL;
} else {
if (strcasecmp(argv[optind], "default") == 0) {
pRoamCtrl->info.roamMode = WMI_DEFAULT_ROAM_MODE;
} else if (strcasecmp(argv[optind], "bssbias") == 0) {
pRoamCtrl->info.roamMode = WMI_HOST_BIAS_ROAM_MODE;
} else if (strcasecmp(argv[optind], "lock") == 0) {
pRoamCtrl->info.roamMode = WMI_LOCK_BSS_MODE;
} else {
fprintf(stderr, "roam mode(default, bssbias, lock) not "
" given\n");
status = A_EINVAL;
}
}
break;
case WMI_SET_HOST_BIAS:
if ((numArgs & 0x01) || (numArgs > 25) ) {
fprintf(stderr, "roam bias too many entries or bss bias"
"not input for every BSSID\n");
status = A_EINVAL;
} else {
pRoamCtrl->info.bssBiasInfo.numBss = numArgs >> 1;
pBssBias = pRoamCtrl->info.bssBiasInfo.bssBias;
while (i < pRoamCtrl->info.bssBiasInfo.numBss) {
if (wmic_ether_aton(argv[optind + 2 * i],
pBssBias[i].bssid)
!= A_OK)
{
fprintf(stderr,"BSSID %s not in correct format\n",
argv[optind + 2 * i]);
status = A_EINVAL;
pRoamCtrl->info.bssBiasInfo.numBss = 0;
break;
}
bias = atoi(argv[optind + 2 * i + 1]);
if ((bias < -256) || (bias > 255)) {
fprintf(stderr,"bias value %d is not in range\n",
bias);
status = A_EINVAL;
pRoamCtrl->info.bssBiasInfo.numBss = 0;
break;
}
pBssBias[i].bias = bias;
i++;
}
}
break;
case WMI_SET_LOWRSSI_SCAN_PARAMS:
if (numArgs != 4) {
fprintf(stderr, "not enough arguments\n");
status = A_EINVAL;
} else {
pRoamCtrl->info.lrScanParams.lowrssi_scan_period = atoi(argv[optind]);
if (atoi(argv[optind+1]) >= atoi(argv[optind+2])) {
pRoamCtrl->info.lrScanParams.lowrssi_scan_threshold = atoi(argv[optind+1]);
pRoamCtrl->info.lrScanParams.lowrssi_roam_threshold = atoi(argv[optind+2]);
} else {
fprintf(stderr, "Scan threshold should be greater than \
equal to roam threshold\n");
status = A_EINVAL;
}
pRoamCtrl->info.lrScanParams.roam_rssi_floor = atoi(argv[optind+3]);
}
break;
default:
status = A_EINVAL;
fprintf(stderr,"roamctrl type %d out if range should be between"
" %d and %d\n", pRoamCtrl->roamCtrlType,
WMI_MIN_ROAM_CTRL_TYPE, WMI_MAX_ROAM_CTRL_TYPE);
break;
}
return status;
}
A_STATUS
wmic_validate_appie(struct ieee80211req_getset_appiebuf *appIEInfo, char **argv)
{
A_STATUS status = A_OK;
A_UINT8 index = optind - 1;
A_UINT16 ieLen;
if ((strlen(argv[index]) == strlen("probe")) &&
(strcmp(argv[index], "probe") == 0))
{
appIEInfo->app_frmtype = IEEE80211_APPIE_FRAME_PROBE_REQ;
} else if ((strlen(argv[index]) == strlen("assoc")) &&
(strcmp(argv[index], "assoc") == 0))
{
appIEInfo->app_frmtype = IEEE80211_APPIE_FRAME_ASSOC_REQ;
} else if((strlen(argv[index]) == strlen("beacon")) &&
(strcmp(argv[index], "beacon") == 0)) {
appIEInfo->app_frmtype = IEEE80211_APPIE_FRAME_BEACON;
} else if((strlen(argv[index]) == strlen("respon")) &&
(strcmp(argv[index], "respon") == 0)) {
appIEInfo->app_frmtype = IEEE80211_APPIE_FRAME_PROBE_RESP;
} else {
printf("specify one of beacon/probe/respon/assoc\n");
return A_EINVAL;
}
index++;
ieLen = strlen(argv[index]);
if ((ieLen == 1) && argv[index][0] == '0') {
appIEInfo->app_buflen = 0;
} else if ((ieLen > 4) && (ieLen <= 2*IEEE80211_APPIE_FRAME_MAX_LEN) &&
_from_hex(argv[index][2])*16 +
_from_hex(argv[index][3]) + 2 == ieLen/2)
{
if ((argv[index][0] != 'd') && (argv[index][1] != 'd')) {
status = A_EINVAL;
} else {
convert_hexstring_bytearray(argv[index], appIEInfo->app_buf, ieLen/2);
appIEInfo->app_buflen = ieLen/2;
}
} else {
status = A_EINVAL;
printf("Invalid IE format should be of format dd04aabbccdd\n");
}
return status;
}
static A_STATUS
wmic_get_ip(const char *ipstr, A_UINT32 *ip)
{
char tokstr[strlen(ipstr)];
char *tok;
int i = 4;
A_UINT32 addr = 0;
A_UINT32 sb;
strcpy(tokstr, ipstr);
tok = strtok(tokstr, ".");
if (!tok)
return A_EINVAL;
do {
if ((sb = strtoul(tok, NULL, 10)) < 0)
return A_EINVAL;
addr |= sb << (--i * 8);
if (i < 0)
return A_EINVAL;
} while ((tok = strtok(NULL, ".")) != NULL);
*ip = addr;
return A_OK;
}
A_STATUS
wmic_validate_setkeepalive(WMI_SET_KEEPALIVE_CMD_EXT *cmd, char **argv)
{
A_STATUS status = A_OK;
A_UINT8 index = optind - 1;
A_UINT8 intvl, mode;
if ((intvl = strtol(argv[index++], NULL, 10)) < 0) {
status = A_EINVAL;
printf("invalid keepalive interval\n");
goto out;
}
cmd->keepaliveInterval = intvl;
mode = strtol(argv[index++], NULL, 10);
if (mode < 0 || mode > 3) {
status = A_EINVAL;
printf("invalid keepalive mode\n");
goto out;
}
cmd->keepaliveMode = mode;
if (wmic_ether_aton(argv[index++], cmd->peer_mac_address) != A_OK) {
status = A_EINVAL;
printf("invalid target mac\n");
goto out;
}
if (wmic_get_ip(argv[index++], &cmd->keepalive_arp_srcip) != A_OK) {
status = A_EINVAL;
printf("invalid src ip\n");
goto out;
}
if (wmic_get_ip(argv[index++], &cmd->keepalive_arp_tgtip) != A_OK) {
status = A_EINVAL;
printf("invalid tgt ip\n");
goto out;
}
out:
return status;
}
A_STATUS
wmic_validate_mgmtfilter(A_UINT32 *pMgmtFilter, char **argv)
{
A_UINT8 index = optind - 1;
A_BOOL setFilter = FALSE;
A_UINT32 filterType;
if ((strlen(argv[index]) == strlen("set")) &&
(strcmp(argv[index], "set") == 0))
{
setFilter = TRUE;
} else if ((strlen(argv[index]) == strlen("clear")) &&
(strcmp(argv[index], "clear") == 0))
{
setFilter = FALSE;
} else {
printf("specify one of set/clear\n");
return A_EINVAL;
}
index++;
if ((strlen(argv[index]) == strlen("beacon")) &&
(strcmp(argv[index], "beacon") == 0))
{
filterType = IEEE80211_FILTER_TYPE_BEACON;
} else if ((strlen(argv[index]) == strlen("proberesp")) &&
(strcmp(argv[index], "proberesp") == 0))
{
filterType = IEEE80211_FILTER_TYPE_PROBE_RESP;
} else {
printf("specify one of beacon/proberesp\n");
return A_EINVAL;
}
*pMgmtFilter = 0;
if (setFilter) {
*pMgmtFilter |= filterType;
} else {
*pMgmtFilter &= ~filterType;
}
return A_OK;
}
void
printTargetStats(TARGET_STATS *pStats)
{
printf("Target stats\n");
printf("------------\n");
printf("tx_packets = %d\n"
"tx_bytes = %d\n"
"tx_unicast_pkts = %d\n"
"tx_unicast_bytes = %d\n"
"tx_multicast_pkts = %d\n"
"tx_multicast_bytes = %d\n"
"tx_broadcast_pkts = %d\n"
"tx_broadcast_bytes = %d\n"
"tx_rts_success_cnt = %d\n"
"tx_packet_per_ac[%d] = %d\n"
"tx_packet_per_ac[%d] = %d\n"
"tx_packet_per_ac[%d] = %d\n"
"tx_packet_per_ac[%d] = %d\n"
"tx_errors = %d\n"
"tx_failed_cnt = %d\n"
"tx_retry_cnt = %d\n"
"tx_mult_retry_cnt = %d\n"
"tx_rts_fail_cnt = %d\n"
"tx_unicast_rate = %d Kbps\n"
"rx_packets = %d\n"
"rx_bytes = %d\\n"
"rx_unicast_pkts = %d\n"
"rx_unicast_bytes = %d\n"
"rx_multicast_pkts = %d\n"
"rx_multicast_bytes = %d\n"
"rx_broadcast_pkts = %d\n"
"rx_broadcast_bytes = %d\n"
"rx_fragment_pkt = %d\n"
"rx_errors = %d\n"
"rx_crcerr = %d\n"
"rx_key_cache_miss = %d\n"
"rx_decrypt_err = %d\n"
"rx_duplicate_frames = %d\n"
"rx_unicast_rate = %d Kbps\n"
"tkip_local_mic_failure = %d\n"
"tkip_counter_measures_invoked = %d\n"
"tkip_replays = %d\n"
"tkip_format_errors = %d\n"
"ccmp_format_errors = %d\n"
"ccmp_replays = %d\n"
"power_save_failure_cnt = %d\n"
"noise_floor_calibation = %d\n"
"cs_bmiss_cnt = %d\n"
"cs_lowRssi_cnt = %d\n"
"cs_connect_cnt = %d\n"
"cs_disconnect_cnt = %d\n"
"cs_aveBeacon_snr= %d\n"
"cs_aveBeacon_rssi = %d\n"
"cs_lastRoam_msec = %d\n"
"cs_rssi = %d\n"
"cs_snr = %d\n"
"lqVal = %d\n"
"wow_num_pkts_dropped = %d\n"
"wow_num_host_pkt_wakeups = %d\n"
"wow_num_host_event_wakeups = %d\n"
"wow_num_events_discarded = %d\n"
"arp_received = %d\n"
"arp_matched = %d\n"
"arp_replied = %d\n",
(int) pStats->tx_packets,
(int) pStats->tx_bytes,
(int) pStats->tx_unicast_pkts,
(int) pStats->tx_unicast_bytes,
(int) pStats->tx_multicast_pkts,
(int) pStats->tx_multicast_bytes,
(int) pStats->tx_broadcast_pkts,
(int) pStats->tx_broadcast_bytes,
(int) pStats->tx_rts_success_cnt,
0, (int) pStats->tx_packet_per_ac[0],
1, (int) pStats->tx_packet_per_ac[1],
2, (int) pStats->tx_packet_per_ac[2],
3, (int) pStats->tx_packet_per_ac[3],
(int) pStats->tx_errors,
(int) pStats->tx_failed_cnt,
(int) pStats->tx_retry_cnt,
(int) pStats->tx_mult_retry_cnt,
(int) pStats->tx_rts_fail_cnt,
(int) pStats->tx_unicast_rate,
(int) pStats->rx_packets,
(int) pStats->rx_bytes,
(int) pStats->rx_unicast_pkts,
(int) pStats->rx_unicast_bytes,
(int) pStats->rx_multicast_pkts,
(int) pStats->rx_multicast_bytes,
(int) pStats->rx_broadcast_pkts,
(int) pStats->rx_broadcast_bytes,
(int) pStats->rx_fragment_pkt,
(int) pStats->rx_errors,
(int) pStats->rx_crcerr,
(int) pStats->rx_key_cache_miss,
(int) pStats->rx_decrypt_err,
(int) pStats->rx_duplicate_frames,
(int) pStats->rx_unicast_rate,
(int) pStats->tkip_local_mic_failure,
(int) pStats->tkip_counter_measures_invoked,
(int) pStats->tkip_replays,
(int) pStats->tkip_format_errors,
(int) pStats->ccmp_format_errors,
(int) pStats->ccmp_replays,
(int) pStats->power_save_failure_cnt,
(int) pStats->noise_floor_calibation,
(int) pStats->cs_bmiss_cnt,
(int) pStats->cs_lowRssi_cnt,
(int) pStats->cs_connect_cnt,
(int) pStats->cs_disconnect_cnt,
(int) pStats->cs_aveBeacon_snr,
(int) pStats->cs_aveBeacon_rssi,
(int) pStats->cs_lastRoam_msec,
(int) pStats->cs_rssi,
(int) pStats->cs_snr,
(int) pStats->lq_val,
(int) pStats->wow_num_pkts_dropped,
(int) pStats->wow_num_host_pkt_wakeups,
(int) pStats->wow_num_host_event_wakeups,
(int) pStats->wow_num_events_discarded,
(int) pStats->arp_received,
(int) pStats->arp_matched,
(int) pStats->arp_replied
);
}
void
printBtcoexConfig(WMI_BTCOEX_CONFIG_EVENT *pConfig)
{
switch(pConfig->btProfileType) {
case WMI_BTCOEX_BT_PROFILE_SCO:
{
WMI_SET_BTCOEX_SCO_CONFIG_CMD *scoConfigCmd = &pConfig->info.scoConfigCmd;
printf("BTCOEX SCO CONFIG\n");
printf("GENERIC SCO CONFIG\n");
printf("scoSlots =%d\n"
"scoIdleSlots =%d\n"
"scoFlags = %d\n"
"linkId = %d\n",
scoConfigCmd->scoConfig.scoSlots,
scoConfigCmd->scoConfig.scoIdleSlots,
scoConfigCmd->scoConfig.scoFlags,
scoConfigCmd->scoConfig.linkId
);
printf("PSPOLL SCO CONFIG \n");
printf( "scoCyclesForceTrigger = %d\n"
"scoDataResponseTimeout = %d\n"
"scoStompDutyCyleVal = %d\n"
"scoStompDutyCyleMaxVal = %d\n"
"scoPsPollLatencyFraction = %d\n",
scoConfigCmd->scoPspollConfig.scoCyclesForceTrigger,
scoConfigCmd->scoPspollConfig.scoDataResponseTimeout,
scoConfigCmd->scoPspollConfig.scoStompDutyCyleVal,
scoConfigCmd->scoPspollConfig.scoStompDutyCyleMaxVal,
scoConfigCmd->scoPspollConfig.scoPsPollLatencyFraction
);
printf("SCO optmode Config\n");
printf( "scoStompCntIn100ms = %d\n"
"scoContStompMax = %d\n"
"scoMinlowRateMbps = %d\n"
"scoLowRateCnt = %d\n"
"scoHighPktRatio = %d\n"
"scoMaxAggrSize = %d\n",
scoConfigCmd->scoOptModeConfig.scoStompCntIn100ms,
scoConfigCmd->scoOptModeConfig.scoContStompMax,
scoConfigCmd->scoOptModeConfig.scoMinlowRateMbps,
scoConfigCmd->scoOptModeConfig.scoLowRateCnt,
scoConfigCmd->scoOptModeConfig.scoHighPktRatio,
scoConfigCmd->scoOptModeConfig.scoMaxAggrSize
);
printf("SCO wlan scan config\n");
printf("scanInterval = %d\n"
"maxScanStompCnt = %d\n",
scoConfigCmd->scoWlanScanConfig.scanInterval,
scoConfigCmd->scoWlanScanConfig.maxScanStompCnt
);
}
break;
case WMI_BTCOEX_BT_PROFILE_A2DP:
{
WMI_SET_BTCOEX_A2DP_CONFIG_CMD *a2dpConfigCmd = &pConfig->info.a2dpConfigCmd;
printf("BTCOEX A2DP CONFIG\n");
printf("a2dpFlags = %d\n"
"linkId = %d\n",
a2dpConfigCmd->a2dpConfig.a2dpFlags,
a2dpConfigCmd->a2dpConfig.linkId
);
printf("BTCOEX PSPOLLMODE A2DP CONFIG\n");
printf("a2dpWlanMaxDur = %d\n"
"a2dpMinBurstCnt = %d\n"
"a2dpDataRespTimeout = %d\n",
a2dpConfigCmd->a2dppspollConfig.a2dpWlanMaxDur,
a2dpConfigCmd->a2dppspollConfig.a2dpMinBurstCnt,
a2dpConfigCmd->a2dppspollConfig.a2dpDataRespTimeout
);
printf("BTCOEX OPTMODE A2DP CONFIG\n");
printf("a2dpMinlowRateMbps = %d\n"
"a2dpLowRateCnt = %d\n"
"a2dpHighPktRatio = %d\n"
"a2dpMaxAggrSize = %d\n"
"a2dpPktStompCnt = %d\n",
a2dpConfigCmd->a2dpOptConfig.a2dpMinlowRateMbps,
a2dpConfigCmd->a2dpOptConfig.a2dpLowRateCnt,
a2dpConfigCmd->a2dpOptConfig.a2dpHighPktRatio,
a2dpConfigCmd->a2dpOptConfig.a2dpMaxAggrSize,
a2dpConfigCmd->a2dpOptConfig.a2dpPktStompCnt
);
}
break;
case WMI_BTCOEX_BT_PROFILE_INQUIRY_PAGE:
{
WMI_SET_BTCOEX_BTINQUIRY_PAGE_CONFIG_CMD *btinquiryPageConfigCmd = &pConfig->info.btinquiryPageConfigCmd;
printf("BTCOEX BTINQUIRY PAGE CONFIG\n");
printf("btInquiryDataFetchFrequency = %d\n"
"protectBmissDurPostBtInquiry = %d\n"
"maxpageStomp = %d\n"
"btInquiryPageFlag = %d\n",
btinquiryPageConfigCmd->btInquiryDataFetchFrequency,
btinquiryPageConfigCmd->protectBmissDurPostBtInquiry,
btinquiryPageConfigCmd->maxpageStomp,
btinquiryPageConfigCmd->btInquiryPageFlag
);
}
break;
case WMI_BTCOEX_BT_PROFILE_ACLCOEX:
{
WMI_SET_BTCOEX_ACLCOEX_CONFIG_CMD *aclcoexConfig = &pConfig->info.aclcoexConfig;
printf("BTCOEX ACLCOEX CONFIG\n");
printf("aclWlanMediumDur = %d\n"
"aclBtMediumDur = %d\n"
"aclDetectTimeout = %d\n"
"aclPktCntLowerLimit = %d\n"
"aclIterForEnDis = %d\n"
"aclPktCntUpperLimit = %d\n"
"aclCoexFlags = %d\n"
"linkId = %d\n",
aclcoexConfig->aclCoexConfig.aclWlanMediumDur,
aclcoexConfig->aclCoexConfig.aclBtMediumDur,
aclcoexConfig->aclCoexConfig.aclDetectTimeout,
aclcoexConfig->aclCoexConfig.aclPktCntLowerLimit,
aclcoexConfig->aclCoexConfig.aclIterForEnDis,
aclcoexConfig->aclCoexConfig.aclPktCntUpperLimit,
aclcoexConfig->aclCoexConfig.aclCoexFlags,
aclcoexConfig->aclCoexConfig.linkId
);
printf("BTCOEX PSPOLLMODE ACLCOEX CONFIG\n");
printf("aclDataRespTimeout = %d\n",
aclcoexConfig->aclCoexPspollConfig.aclDataRespTimeout
);
printf("BTCOEX OPTMODE ACLCOEX CONFIG\n");
printf("aclCoexMinlowRateMbps = %d\n"
"aclCoexLowRateCnt = %d\n"
"aclCoexHighPktRatio = %d\n"
"aclCoexMaxAggrSize = %d\n"
"aclPktStompCnt = %d\n",
aclcoexConfig->aclCoexOptConfig.aclCoexMinlowRateMbps,
aclcoexConfig->aclCoexOptConfig.aclCoexLowRateCnt,
aclcoexConfig->aclCoexOptConfig.aclCoexHighPktRatio,
aclcoexConfig->aclCoexOptConfig.aclCoexMaxAggrSize,
aclcoexConfig->aclCoexOptConfig.aclPktStompCnt
);
}
break;
default:
break;
}
return;
}
void print_wild_mac(unsigned char *mac, char wildcard)
{
int i;
printf(" ");
for(i=0;i<5;i++) {
if(wildcard & (1<<i)) printf("*:");
else printf("%02X:", mac[i]);
}
if(wildcard & (1<<i)) printf("*\n");
else printf("%02X\n", mac[5]);
}