| |
| /**************************************************************************** |
| * (c) Copyright 2007 Wi-Fi Alliance. All Rights Reserved |
| * |
| * |
| * LICENSE |
| * |
| * License is granted only to Wi-Fi Alliance members and designated |
| * contractors ($B!H(BAuthorized Licensees$B!I(B)..AN Authorized Licensees are granted |
| * the non-exclusive, worldwide, limited right to use, copy, import, export |
| * and distribute this software: |
| * (i) solely for noncommercial applications and solely for testing Wi-Fi |
| * equipment; and |
| * (ii) solely for the purpose of embedding the software into Authorized |
| * Licensee$B!G(Bs proprietary equipment and software products for distribution to |
| * its customers under a license with at least the same restrictions as |
| * contained in this License, including, without limitation, the disclaimer of |
| * warranty and limitation of liability, below..AN The distribution rights |
| * granted in clause |
| * (ii), above, include distribution to third party companies who will |
| * redistribute the Authorized Licensee$B!G(Bs product to their customers with or |
| * without such third party$B!G(Bs private label. Other than expressly granted |
| * herein, this License is not transferable or sublicensable, and it does not |
| * extend to and may not be used with non-Wi-Fi applications..AN Wi-Fi Alliance |
| * reserves all rights not expressly granted herein..AN |
| *.AN |
| * Except as specifically set forth above, commercial derivative works of |
| * this software or applications that use the Wi-Fi scripts generated by this |
| * software are NOT AUTHORIZED without specific prior written permission from |
| * Wi-Fi Alliance. |
| *.AN |
| * Non-Commercial derivative works of this software for internal use are |
| * authorized and are limited by the same restrictions; provided, however, |
| * that the Authorized Licensee shall provide Wi-Fi Alliance with a copy of |
| * such derivative works under a perpetual, payment-free license to use, |
| * modify, and distribute such derivative works for purposes of testing Wi-Fi |
| * equipment. |
| *.AN |
| * Neither the name of the author nor "Wi-Fi Alliance" may be used to endorse |
| * or promote products that are derived from or that use this software without |
| * specific prior written permission from Wi-Fi Alliance. |
| * |
| * THIS SOFTWARE IS PROVIDED BY WI-FI ALLIANCE "AS IS" AND ANY EXPRESS OR |
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| * OF MERCHANTABILITY, NON-INFRINGEMENT AND FITNESS FOR A.AN PARTICULAR PURPOSE, |
| * ARE DISCLAIMED. IN NO EVENT SHALL WI-FI ALLIANCE BE LIABLE FOR ANY DIRECT, |
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| * (INCLUDING, BUT NOT LIMITED TO, THE COST OF PROCUREMENT OF SUBSTITUTE |
| * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
| * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
| * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE) ARISING IN ANY WAY OUT OF |
| * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************************************************************** |
| */ |
| /* |
| * File: wfa_cmdproc.c |
| * Library functions to handle all string command parsing and convert it |
| * to an internal format for DUT. They should be called by Control Agent |
| * and Test console while receiving commands from CLI or TM |
| * |
| * Revision History: |
| * 2006/03/10 -- initially created by qhu |
| * 2006/06/01 -- BETA release by qhu |
| * 2006/06/13 -- 00.02 release by qhu |
| * 2006/06/30 -- 00.10 Release by qhu |
| * 2006/07/10 -- 01.00 Release by qhu |
| * 2006/08/30 -- add some print statements by Isaac in Epson. |
| * 2006/09/01 -- 01.05 release by qhu |
| * 2006/10/26 -- 01.06 release by qhu |
| * 2006/12/02 -- bug fix reported by p.schwan |
| * 2007/01/11 -- 01.10 release by qhu |
| * 2007/02/15 -- WMM Extension Beta released by qhu, mkaroshi |
| * 2007/03/30 -- 01.40 WPA2 and Official WMM Beta Release by qhu |
| * 2007/04/20 -- 02.00 WPA2 and Official WMM Release by qhu |
| * 2007/08/15 -- 02.10 WMM-Power Save release by qhu |
| * 2007/10/10 -- 02.20 Voice SOHO beta -- qhu |
| * 2007/11/07 -- 02.30 Voice HSO -- qhu |
| */ |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #ifndef WIN32 |
| #include <sys/socket.h> |
| #endif |
| #include "wfa_debug.h" |
| #include "wfa_types.h" |
| #include "wfa_tlv.h" |
| #include "wfa_tg.h" |
| #include "wfa_ca.h" |
| #include "wfa_cmds.h" |
| #include "wfa_miscs.h" |
| #include "wfa_agtctrl.h" |
| |
| extern int gSock; |
| extern void printProfile(tgProfile_t *); |
| extern unsigned short wfa_defined_debug; |
| |
| /* command KEY WORD String table */ |
| typeNameStr_t keywordStr[] = |
| { |
| { KW_PROFILE, "profile", NULL}, |
| { KW_DIRECTION, "direction", NULL}, |
| { KW_DIPADDR, "destination", NULL}, |
| { KW_DPORT, "destinationport", NULL}, |
| { KW_SIPADDR, "source", NULL}, |
| { KW_SPORT, "sourceport", NULL}, |
| { KW_FRATE, "framerate", NULL}, |
| { KW_DURATION, "duration", NULL}, |
| { KW_PLOAD, "payloadsize", NULL}, |
| { KW_TCLASS, "trafficClass", NULL}, /* It is to indicate WMM traffic pattern */ |
| { KW_STREAMID, "streamid", NULL}, |
| { KW_STARTDELAY, "startdelay", NULL}, /* It is used to schedule multi-stream test such as WMM */ |
| { KW_NUMFRAME, "numframes", NULL}, |
| { KW_USESYNCCLOCK, "useSyncClock", NULL}, |
| { KW_USERPRIORITY, "userpriority", NULL} |
| }; |
| |
| /* profile type string table */ |
| typeNameStr_t profileStr[] = |
| { |
| { PROF_FILE_TX, "file_transfer", NULL}, |
| { PROF_MCAST, "multicast", NULL}, |
| { PROF_IPTV, "iptv", NULL}, /* This is used for WMM, confused? */ |
| { PROF_TRANSC, "transaction", NULL}, |
| { PROF_START_SYNC, "start_sync", NULL}, |
| { PROF_CALI_RTD, "cali_rtd", NULL}, |
| { PROF_UAPSD, "uapsd", NULL}, |
| { PROF_FILE_TX_TCP, "file_transfer_tcp", NULL}, |
| { PROF_TRANSC_TCP, "transaction_tcp", NULL} |
| }; |
| |
| /* direction string table */ |
| typeNameStr_t direcStr[] = |
| { |
| { DIRECT_SEND, "send", NULL}, |
| { DIRECT_RECV, "receive", NULL} |
| }; |
| |
| /* |
| * cmdProcNotDefinedYet(): a dummy function |
| */ |
| int cmdProcNotDefinedYet(char *pcmdStr, char *buf, int len) |
| { |
| DPRINT_INFO(WFA_OUT,"The command processing function not defined.\n"); |
| |
| /* need to send back a response */ |
| |
| return (TRUE); |
| } |
| |
| extern unsigned short wfa_defined_debug; |
| |
| /* |
| * xcCmdProcGetVersion(): process the command get_version string from TM |
| * to convert it into a internal format |
| * input: pcmdStr -- a string pointer to the command string |
| */ |
| int xcCmdProcGetVersion(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| DPRINT_INFO(WFA_OUT, "start xcCmdProcGetVersion ...\n"); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| /* encode the tag without values */ |
| wfaEncodeTLV(WFA_GET_VERSION_TLV, 0, NULL, aBuf); |
| |
| *aLen = 4; |
| |
| return TRUE; |
| } |
| |
| /* |
| * xcCmdProcAgentConfig(): process the command traffic_agent_config string |
| * from TM to convert it into a internal format |
| * input: pcmdStr -- a string pointer to the command string |
| */ |
| int xcCmdProcAgentConfig(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| char *str; |
| int i = 0, j=0, kwcnt = 0; |
| wfaTLV *hdr = (wfaTLV *)aBuf; |
| tgProfile_t tgpf; |
| tgProfile_t *pf = &tgpf; |
| int userPrio = 0; |
| |
| DPRINT_INFO(WFA_OUT, "start xcCmdProcAgentConfig ...\n"); |
| DPRINT_INFO(WFA_OUT, "params: %s\n", pcmdStr); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| while((str = strtok_r(NULL, ",", (char **)&pcmdStr)) != NULL) |
| { |
| DPRINT_INFO(WFA_OUT,"key word %s\n", str); |
| for(i = 0; i<sizeof(keywordStr); i++) |
| { |
| if(strcasecmp(str, keywordStr[i].name) == 0) |
| { |
| switch(keywordStr[i].type) |
| { |
| case KW_PROFILE: |
| str = strtok_r(NULL, ",", (char **)&pcmdStr); |
| if(isString(str) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect profile keyword format\n"); |
| return FALSE; |
| } |
| |
| for(j = 0; j < PROF_LAST; j++) |
| if(strcasecmp(str, profileStr[j].name) == 0) |
| { |
| pf->profile = profileStr[j].type; |
| } |
| |
| DPRINT_INFO(WFA_OUT, "profile type %i\n", pf->profile); |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_DIRECTION: |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(isString(str) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect direction keyword format\n"); |
| return FALSE; |
| } |
| |
| if(strcasecmp(str, "send") == 0) |
| { |
| pf->direction = DIRECT_SEND; |
| } |
| else if(strcasecmp(str, "receive") == 0) |
| { |
| pf->direction = DIRECT_RECV; |
| } |
| else |
| DPRINT_INFO(WFA_OUT,"Don't know direction\n"); |
| |
| DPRINT_INFO(WFA_OUT, "direction %i\n", pf->direction); |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_DIPADDR: /* dest ip address */ |
| memcpy(pf->dipaddr, strtok_r(NULL, ",", &pcmdStr), IPV4_ADDRESS_STRING_LEN); |
| if(isIpV4Addr(pf->dipaddr) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect ipaddr format\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "dipaddr %s\n", pf->dipaddr); |
| |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_DPORT: |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(isNumber(str) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect port number format\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "dport %s\n", str); |
| pf->dport = atoi(str); |
| |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_SIPADDR: |
| memcpy(pf->sipaddr, strtok_r(NULL, ",", &pcmdStr), IPV4_ADDRESS_STRING_LEN); |
| |
| if(isIpV4Addr(pf->sipaddr) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect ipaddr format\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "sipaddr %s\n", pf->sipaddr); |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_SPORT: |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(isNumber(str) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect port number format\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "sport %s\n", str); |
| pf->sport = atoi(str); |
| |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_FRATE: |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(isNumber(str) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect frame rate format\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "framerate %s\n", str); |
| pf->rate = atoi(str); |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_DURATION: |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if (strlen(str)) { |
| if(isNumber(str) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect duration format\n"); |
| return FALSE; |
| } |
| } |
| else |
| { |
| DPRINT_ERR(WFA_ERR, "No duration specified\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "duration %s\n", str); |
| pf->duration = atoi(str); |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_PLOAD: |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(isNumber(str) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect payload format\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "payload %s\n", str); |
| pf->pksize = atoi(str); |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_STARTDELAY: |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(isNumber(str) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect startDelay format\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "startDelay %s\n", str); |
| pf->startdelay = atoi(str); |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_TCLASS: |
| str = strtok_r(NULL, ",", &pcmdStr); |
| |
| /* if user priority is used, tclass is ignored. */ |
| if(userPrio == 1) |
| break; |
| |
| if(strcasecmp(str, "voice") == 0) |
| { |
| pf->trafficClass = TG_WMM_AC_VO; |
| } |
| else if(strcasecmp(str, "Video") == 0) |
| { |
| pf->trafficClass = TG_WMM_AC_VI; |
| } |
| else if(strcasecmp(str, "Background") == 0) |
| { |
| pf->trafficClass = TG_WMM_AC_BK; |
| } |
| else if(strcasecmp(str, "BestEffort") == 0) |
| { |
| pf->trafficClass = TG_WMM_AC_BE; |
| } |
| else |
| { |
| pf->trafficClass = TG_WMM_AC_BE; |
| } |
| |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_USERPRIORITY: |
| str = strtok_r(NULL, ",", &pcmdStr); |
| |
| if( strcasecmp(str, "6") == 0 ) |
| { |
| pf->trafficClass = TG_WMM_AC_UP6; |
| } |
| else if( strcasecmp(str, "7") == 0 ) |
| { |
| pf->trafficClass = TG_WMM_AC_UP7; |
| } |
| else if( strcasecmp(str, "5") == 0 ) |
| { |
| pf->trafficClass = TG_WMM_AC_UP5; |
| } |
| else if( strcasecmp(str, "4") == 0 ) |
| { |
| pf->trafficClass = TG_WMM_AC_UP4; |
| } |
| else if( strcasecmp(str, "1") == 0 ) |
| { |
| pf->trafficClass = TG_WMM_AC_UP1; |
| } |
| else if( strcasecmp(str, "2") == 0 ) |
| { |
| pf->trafficClass = TG_WMM_AC_UP2; |
| } |
| else if( strcasecmp(str, "0") == 0 ) |
| { |
| pf->trafficClass = TG_WMM_AC_UP0; |
| } |
| else if( strcasecmp(str, "3") == 0) |
| { |
| pf->trafficClass = TG_WMM_AC_UP3; |
| } |
| |
| /* if User Priority is used */ |
| userPrio = 1; |
| |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_STREAMID: |
| kwcnt++; |
| break; |
| |
| case KW_NUMFRAME: |
| DPRINT_INFO(WFA_OUT,"Number of Frame\n"); |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(isNumber(str) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect numframe format\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "num frame %s\n", str); |
| DPRINT_INFO(WFA_OUT,"num frame %s\n", str); |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| case KW_USESYNCCLOCK: |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(isNumber(str) == FALSE) |
| { |
| DPRINT_ERR(WFA_ERR, "Incorrect sync clock format\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "sync clock %s\n", str); |
| DPRINT_INFO(WFA_OUT,"sync clock %s\n", str); |
| kwcnt++; |
| str = NULL; |
| break; |
| |
| default: |
| ; |
| } /* switch */ |
| |
| if(str==NULL) |
| break; |
| } |
| |
| } /* for */ |
| } /* while */ |
| |
| |
| printProfile(pf); |
| hdr->tag = WFA_TRAFFIC_AGENT_CONFIG_TLV; |
| hdr->len = sizeof(tgProfile_t); |
| |
| memcpy(aBuf+4, pf, sizeof(tgpf)); |
| |
| *aLen = 4+sizeof(tgProfile_t); |
| |
| return TRUE; |
| } |
| |
| /* |
| * xcCmdProcAgentSend(): Process and send the Control command |
| * "traffic_agent_send" |
| * input - pcmdStr parameter string pointer |
| * return - TRUE or FALSE; |
| */ |
| int xcCmdProcAgentSend(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| wfaTLV *hdr = (wfaTLV *)aBuf; |
| char *str, *sid; |
| int strid; |
| int id_cnt = 0; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, 512); |
| |
| DPRINT_INFO(WFA_OUT, "Entering xcCmdProcAgentSend ...\n"); |
| /* there is only one stream for baseline. Will support |
| * multiple streams later. |
| */ |
| str = strtok_r(NULL, ",", &pcmdStr); |
| |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| |
| /* take the stream ids */ |
| if(strcasecmp(str, "streamid") != 0) |
| { |
| DPRINT_ERR(WFA_ERR, "invalid type name\n"); |
| return FALSE; |
| } |
| |
| /* |
| * To handle there are multiple stream ids such as WMM |
| */ |
| while(1) |
| { |
| sid = strtok_r (NULL, " ", &pcmdStr); |
| if(sid == NULL) |
| break; |
| |
| if(isNumber(sid) == FALSE) |
| continue; |
| |
| strid = atoi(sid); |
| DPRINT_INFO(WFA_OUT,"id %i\n", strid); |
| id_cnt++; |
| |
| memcpy(aBuf+4*id_cnt, (char *)&strid, 4); |
| } |
| |
| hdr->tag = WFA_TRAFFIC_AGENT_SEND_TLV; |
| hdr->len = 4*id_cnt; /* multiple 4s if more streams */ |
| |
| *aLen = 4 + 4*id_cnt; |
| |
| #ifdef DEBUG |
| { |
| int i; |
| for(i = 0; i< *aLen; i++) |
| DPRINT_INFO(WFA_OUT,"%x ", aBuf[i]); |
| |
| DPRINT_INFO(WFA_OUT,"\n"); |
| } |
| #endif |
| |
| |
| return TRUE; |
| } |
| |
| /* |
| * xcCmdProcAgentReset(): Process and send the Control command |
| * "traffic_agent_reset" |
| * input - pcmdStr parameter string pointer |
| * return - TRUE or FALSE; |
| */ |
| int xcCmdProcAgentReset(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| wfaTLV *hdr = (wfaTLV *)aBuf; |
| |
| DPRINT_INFO(WFA_OUT, "Entering xcCmdProcAgentReset ...\n"); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| hdr->tag = WFA_TRAFFIC_AGENT_RESET_TLV; |
| hdr->len = 0; /* multiple 4s if more streams */ |
| |
| *aLen = 4; |
| |
| return TRUE; |
| } |
| |
| /* |
| * xcCmdProcAgentRecvStart(): Process and send the Control command |
| * "traffic_agent_receive_start" |
| * input - pcmdStr parameter string pointer |
| * return - TRUE or FALSE; |
| */ |
| int xcCmdProcAgentRecvStart(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| |
| wfaTLV *hdr = (wfaTLV *)aBuf; |
| char *str, *sid; |
| int strid; |
| int id_cnt = 0; |
| |
| DPRINT_INFO(WFA_OUT, "Entering xcCmdProcAgentRecvStart ...%s\n", pcmdStr); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| /* there is only one stream for baseline. Will support |
| * multiple streams later. |
| */ |
| str = strtok_r(NULL, ",", &pcmdStr); |
| |
| if(str == NULL || str[0] == '\0') |
| { |
| DPRINT_ERR(WFA_ERR, "Null string\n"); |
| return FALSE; |
| } |
| |
| |
| if(strcasecmp(str, "streamid") != 0) |
| { |
| DPRINT_ERR(WFA_ERR, "invalid type name\n"); |
| return FALSE; |
| } |
| |
| while(1) |
| { |
| sid = strtok_r (NULL, " ", &pcmdStr); |
| if(sid == NULL) |
| break; |
| |
| if(isNumber(sid) == FALSE) |
| continue; |
| |
| strid = atoi(sid); |
| id_cnt++; |
| |
| memcpy(aBuf+4*id_cnt, (char *)&strid, 4); |
| } |
| |
| hdr->tag = WFA_TRAFFIC_AGENT_RECV_START_TLV; |
| hdr->len = 4*id_cnt; /* multiple 4s if more streams */ |
| |
| *aLen = 4 + 4*id_cnt; |
| |
| #ifdef DEBUG |
| { |
| int i; |
| for(i = 0; i< *aLen; i++) |
| DPRINT_INFO(WFA_OUT,"%x ", aBuf[i]); |
| |
| DPRINT_INFO(WFA_OUT,"\n"); |
| } |
| #endif |
| return TRUE; |
| } |
| |
| /* |
| * xcCmdProcAgentRecvStop(): Process and send the Control command |
| * "traffic_agent_receive_stop" |
| * input - pcmdStr parameter string pointer |
| * return - TRUE or FALSE; |
| */ |
| int xcCmdProcAgentRecvStop(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| wfaTLV *hdr = (wfaTLV *)aBuf; |
| char *str, *sid; |
| int strid; |
| int id_cnt = 0; |
| |
| DPRINT_INFO(WFA_OUT, "Entering xcCmdProcAgentRecvStop ...\n"); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| /* there is only one stream for baseline. Will support |
| * multiple streams later. |
| */ |
| str = strtok_r(NULL, ",", &pcmdStr); |
| |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| |
| if(strcasecmp(str, "streamid") != 0) |
| { |
| DPRINT_ERR(WFA_ERR, "invalid type name\n"); |
| return FALSE; |
| } |
| while(1) |
| { |
| sid = strtok_r (NULL, " ", &pcmdStr); |
| if(sid == NULL) |
| break; |
| if(isNumber(sid) == FALSE) |
| continue; |
| |
| strid = atoi(sid); |
| id_cnt++; |
| |
| memcpy(aBuf+4*id_cnt, (char *)&strid, 4); |
| } |
| |
| hdr->tag = WFA_TRAFFIC_AGENT_RECV_STOP_TLV; |
| hdr->len = 4*id_cnt; /* multiple 4s if more streams */ |
| |
| *aLen = 4 + 4*id_cnt; |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcAgentSendPing(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| wfaTLV *hdr = (wfaTLV *)aBuf; |
| tgPingStart_t *staping = (tgPingStart_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| staping->type = 0; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "destination") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(staping->dipaddr, str, 15); |
| DPRINT_INFO(WFA_OUT, "destination %s\n", staping->dipaddr); |
| } |
| if(strcasecmp(str, "frameSize") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| staping->frameSize=atoi(str); |
| DPRINT_INFO(WFA_OUT, "framesize %i\n", staping->frameSize); |
| } |
| if(strcasecmp(str, "frameRate") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| staping->frameRate=atoi(str); |
| DPRINT_INFO(WFA_OUT, "framerate %i\n", staping->frameRate); |
| } |
| if(strcasecmp(str, "duration") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| staping->duration=atoi(str); |
| DPRINT_INFO(WFA_OUT, "duration %i\n", staping->duration); |
| } |
| if(strcasecmp(str, "type") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str, "udp") == 0) |
| staping->type = 1; |
| else |
| staping->type = 0; |
| } |
| } |
| |
| hdr->tag = WFA_TRAFFIC_SEND_PING_TLV; |
| hdr->len = sizeof(tgPingStart_t); |
| |
| *aLen = hdr->len + 4; |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcAgentStopPing(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| wfaTLV *hdr = (wfaTLV *)aBuf; |
| char *str; |
| int strid; |
| str = strtok_r(NULL, ",", &pcmdStr); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| |
| if(strcasecmp(str, "streamid") == 0) |
| str = strtok_r(NULL, ",", &pcmdStr); |
| else |
| { |
| DPRINT_ERR(WFA_ERR, "invalid type name\n"); |
| return FALSE; |
| } |
| |
| if(isNumber(str) == FALSE) |
| return FALSE; |
| |
| strid = atoi(str); |
| |
| memcpy(aBuf+4, (char *)&strid, 4); |
| |
| hdr->tag = WFA_TRAFFIC_STOP_PING_TLV; |
| hdr->len = 4; /* multiple 4s if more streams */ |
| |
| *aLen = 8; |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaGetIpConfig(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| int slen; |
| char *str = NULL; |
| dutCommand_t getipconf; |
| memset(&getipconf, 0, sizeof(dutCommand_t)); |
| |
| DPRINT_INFO(WFA_OUT, "Entering xcCmdProcStaGetIpConfig ...\n"); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| str = strtok_r(NULL, ",", &pcmdStr); |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL) |
| return FALSE; |
| |
| |
| slen = strlen(str); |
| memcpy(getipconf.intf, str, slen); |
| wfaEncodeTLV(WFA_STA_GET_IP_CONFIG_TLV, sizeof(dutCommand_t), (BYTE *)&getipconf, aBuf); |
| |
| *aLen = 4+sizeof(getipconf); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetIpConfig(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t staSetIpConfig; |
| char *str; |
| caStaSetIpConfig_t *setip; |
| memset(&staSetIpConfig, 0, sizeof(staSetIpConfig)); |
| setip = (caStaSetIpConfig_t *)&staSetIpConfig.cmdsu.ipconfig; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setip->intf, str, 15); |
| DPRINT_INFO(WFA_OUT, "interface %s\n", setip->intf); |
| } |
| else if(strcasecmp(str, "dhcp") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setip->isDhcp = atoi(str); |
| DPRINT_INFO(WFA_OUT, "dhcp %i\n", setip->isDhcp); |
| } |
| else if(strcasecmp(str, "ip") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setip->ipaddr, str, 15); |
| DPRINT_INFO(WFA_OUT, "ip %s\n", setip->ipaddr); |
| } |
| else if(strcasecmp(str, "mask") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setip->mask, str, 15); |
| DPRINT_INFO(WFA_OUT, "mask %s\n", setip->mask); |
| } |
| else if(strcasecmp(str, "defaultGateway") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setip->defGateway, str, 15); |
| DPRINT_INFO(WFA_OUT, "gw %s\n", setip->defGateway); |
| } |
| else if(strcasecmp(str, "primary-dns") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setip->pri_dns, str, 15); |
| DPRINT_INFO(WFA_OUT, "dns p %s\n", setip->pri_dns); |
| } |
| else if(strcasecmp(str, "secondary-dns") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setip->sec_dns, str, 15); |
| DPRINT_INFO(WFA_OUT, "dns s %s\n", setip->sec_dns); |
| } |
| else |
| { |
| DPRINT_ERR(WFA_ERR, "invalid command\n"); |
| return FALSE; |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_IP_CONFIG_TLV, sizeof(staSetIpConfig), (BYTE *)&staSetIpConfig, aBuf); |
| |
| *aLen = 4+sizeof(staSetIpConfig); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaGetMacAddress(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| int slen; |
| char *str = NULL; |
| dutCommand_t getmac; |
| |
| DPRINT_INFO(WFA_OUT, "Entering xcCmdProcStaGetMacAddress ...\n"); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| memset(&getmac, 0, sizeof(getmac)); |
| str = strtok_r(NULL, ",", &pcmdStr); |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL) |
| return FALSE; |
| |
| slen = strlen(str); |
| memcpy(getmac.intf, str, slen); |
| wfaEncodeTLV(WFA_STA_GET_MAC_ADDRESS_TLV, sizeof(getmac), (BYTE *)&getmac, aBuf); |
| |
| *aLen = 4+sizeof(getmac); |
| |
| return TRUE; |
| } |
| |
| |
| int xcCmdProcStaIsConnected(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| int slen; |
| char *str = NULL; |
| dutCommand_t isconnected; |
| |
| DPRINT_INFO(WFA_OUT, "Entering xcCmdProcStaIsConnected\n"); |
| |
| memset(&isconnected, 0, sizeof(isconnected)); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| str = strtok_r(NULL, ",", &pcmdStr); |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL) |
| return FALSE; |
| |
| slen = strlen(str); |
| memcpy(isconnected.intf, str, slen); |
| wfaEncodeTLV(WFA_STA_IS_CONNECTED_TLV, sizeof(isconnected), (BYTE *)&isconnected, aBuf); |
| |
| *aLen = 4+sizeof(isconnected); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaVerifyIpConnection(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| wfaTLV *hdr = (wfaTLV *)aBuf; |
| dutCommand_t *verifyip = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| DPRINT_INFO(WFA_OUT, "Entering xcCmdProcStaVerifyIpConnection ...\n"); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(verifyip->intf, str); |
| verifyip->intf[15]='\0'; |
| DPRINT_INFO(WFA_OUT, "interface %s %i\n", verifyip->intf, strlen(verifyip->intf)); |
| } |
| else if(strcasecmp(str, "destination") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(verifyip->cmdsu.verifyIp.dipaddr, str, 15); |
| DPRINT_INFO(WFA_OUT, "ip %s\n", verifyip->cmdsu.verifyIp.dipaddr); |
| } |
| else if(strcasecmp(str, "timeout") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| verifyip->cmdsu.verifyIp.timeout = atoi(str); |
| DPRINT_INFO(WFA_OUT, "timeout %i\n", verifyip->cmdsu.verifyIp.timeout); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_VERIFY_IP_CONNECTION_TLV, sizeof(verifyip), (BYTE *)&verifyip, aBuf); |
| |
| hdr->tag = WFA_STA_VERIFY_IP_CONNECTION_TLV; |
| hdr->len = sizeof(dutCommand_t); |
| |
| *aLen = 4+sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaGetBSSID(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| int slen; |
| char *str = NULL; |
| dutCommand_t getbssid; |
| |
| DPRINT_INFO(WFA_OUT, "Entering xcCmdProcStaGetBSSID ...\n"); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| memset(&getbssid, 0, sizeof(getbssid)); |
| str = strtok_r(NULL, ",", &pcmdStr); |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL) |
| return FALSE; |
| |
| slen = strlen(str); |
| memcpy(getbssid.intf, str, slen-1); |
| getbssid.intf[slen-1] = '\0'; |
| wfaEncodeTLV(WFA_STA_GET_BSSID_TLV, sizeof(getbssid), (BYTE *)&getbssid, aBuf); |
| |
| *aLen = 4+sizeof(getbssid); |
| |
| return TRUE; |
| } |
| |
| |
| int xcCmdProcStaGetStats(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| int slen; |
| char *str = NULL; |
| dutCommand_t getstats; |
| |
| DPRINT_INFO(WFA_OUT, "Entering xcCmdProcStaGetStats ...\n"); |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| memset(&getstats, 0, sizeof(getstats)); |
| str = strtok_r(NULL, ",", &pcmdStr); |
| /* need to check if the parameter name is called interface */ |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL) |
| return FALSE; |
| |
| slen = strlen(str); |
| memcpy(getstats.intf, str, slen-1); |
| getstats.intf[slen-1] = '\0'; |
| wfaEncodeTLV(WFA_STA_GET_STATS_TLV, sizeof(getstats), (BYTE *)&getstats, aBuf); |
| |
| *aLen = 4+sizeof(getstats); |
| |
| return TRUE; |
| } |
| |
| |
| int xcCmdProcStaSetEncryption(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetEncryption_t *setencryp = (caStaSetEncryption_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setencryp->intf, str, 15); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setencryp->ssid, str, 64); |
| } |
| else if(strcasecmp(str, "encpType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str, "wep") == 0) |
| setencryp->encpType = ENCRYPT_WEP; |
| else |
| setencryp->encpType = 0; |
| } |
| else if(strcasecmp(str, "key1") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setencryp->keys[0], str, 26); |
| DPRINT_INFO(WFA_OUT, "%s\n", setencryp->keys[0]); |
| setencryp->activeKeyIdx = 0; |
| } |
| else if(strcasecmp(str, "key2") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setencryp->keys[1], str, 26); |
| DPRINT_INFO(WFA_OUT, "%s\n", setencryp->keys[1]); |
| } |
| else if(strcasecmp(str, "key3") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setencryp->keys[2], str, 26); |
| DPRINT_INFO(WFA_OUT, "%s\n", setencryp->keys[2]); |
| } |
| else if(strcasecmp(str, "key4") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setencryp->keys[3], str, 26); |
| DPRINT_INFO(WFA_OUT, "%s\n", setencryp->keys[3]); |
| } |
| else if(strcasecmp(str, "activeKey") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setencryp->activeKeyIdx = atoi(str); |
| } |
| else |
| { |
| DPRINT_INFO(WFA_WNG, "Incorrect Command, check syntax\n"); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_ENCRYPTION_TLV, sizeof(caStaSetEncryption_t), (BYTE *)setencryp, aBuf); |
| |
| *aLen = 4+sizeof(caStaSetEncryption_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetPSK(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetPSK_t *setencryp = (caStaSetPSK_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setencryp->intf, str, 15); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setencryp->ssid, str, 64); |
| DPRINT_INFO(WFA_OUT, "ssid %s\n", setencryp->ssid); |
| } |
| else if(strcasecmp(str, "passPhrase") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setencryp->passphrase, str, 64); |
| } |
| else if(strcasecmp(str, "keyMgmtType") == 0) |
| { |
| str=strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setencryp->keyMgmtType, str, 7); |
| } |
| else if(strcasecmp(str, "encpType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| |
| if(strcasecmp(str, "tkip") == 0) |
| setencryp->encpType = ENCRYPT_TKIP; |
| else if(strcasecmp(str, "aes-ccmp") == 0) |
| setencryp->encpType = ENCRYPT_AESCCMP; |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_PSK_TLV, sizeof(caStaSetPSK_t), (BYTE *)setencryp, aBuf); |
| |
| *aLen = 4+sizeof(caStaSetPSK_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetEapTLS(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetEapTLS_t *setsec = (caStaSetEapTLS_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->intf, str, 15); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->ssid, str, 64); |
| } |
| else if(strcasecmp(str, "keyMgmtType") == 0) |
| { |
| str=strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->keyMgmtType, str, 7); |
| } |
| else if(strcasecmp(str, "encpType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->encrptype, str, 8); |
| } |
| else if(strcasecmp(str, "trustedRootCA") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->trustedRootCA, str); |
| } |
| else if(strcasecmp(str, "clientCertificate") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->clientCertificate, str); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_EAPTLS_TLV, sizeof(caStaSetEapTLS_t), (BYTE *)setsec, aBuf); |
| |
| *aLen = 4+sizeof(caStaSetEapTLS_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetEapTTLS(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetEapTTLS_t *setsec = (caStaSetEapTTLS_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->intf, str, 15); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->ssid, str, 64); |
| } |
| else if(strcasecmp(str, "username") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->username, str); |
| } |
| else if(strcasecmp(str, "password") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->passwd, str); |
| } |
| else if(strcasecmp(str, "keyMgmtType") == 0) |
| { |
| str=strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->keyMgmtType, str, 7); |
| } |
| else if(strcasecmp(str, "encpType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->encrptype, str, 8); |
| } |
| else if(strcasecmp(str, "trustedRootCA") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->trustedRootCA, str); |
| } |
| else if(strcasecmp(str, "clientCertificate") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->clientCertificate, str); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_EAPTTLS_TLV, sizeof(caStaSetEapTTLS_t), (BYTE *)setsec, aBuf); |
| |
| *aLen = 4+sizeof(caStaSetEapTTLS_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetEapSIM(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetEapSIM_t *setsec = (caStaSetEapSIM_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->intf, str, 15); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->ssid, str, 64); |
| } |
| else if(strcasecmp(str, "username") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->username, str); |
| } |
| else if(strcasecmp(str, "password") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->passwd, str); |
| } |
| else if(strcasecmp(str, "keyMgmtType") == 0) |
| { |
| str=strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->keyMgmtType, str, 7); |
| } |
| else if(strcasecmp(str, "encpType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->encrptype, str, 8); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_EAPSIM_TLV, sizeof(caStaSetEapSIM_t), (BYTE *)setsec, aBuf); |
| |
| *aLen = 4+sizeof(caStaSetEapSIM_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetPEAP(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetEapPEAP_t *setsec = (caStaSetEapPEAP_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->intf, str, 15); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->ssid, str, 64); |
| } |
| else if(strcasecmp(str, "username") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->username, str); |
| } |
| else if(strcasecmp(str, "password") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->passwd, str); |
| } |
| else if(strcasecmp(str, "keyMgmtType") == 0) |
| { |
| str=strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->keyMgmtType, str, 7); |
| } |
| else if(strcasecmp(str, "encpType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->encrptype, str, 8); |
| } |
| else if(strcasecmp(str, "innerEAP") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->innerEAP, str); |
| } |
| else if(strcasecmp(str, "peapVersion") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setsec->peapVersion = atoi(str); |
| } |
| } |
| |
| |
| wfaEncodeTLV(WFA_STA_SET_PEAP_TLV, sizeof(caStaSetEapPEAP_t), (BYTE *)setsec, aBuf); |
| |
| *aLen = 4+sizeof(caStaSetEapPEAP_t); |
| |
| return TRUE; |
| } |
| |
| |
| int xcCmdProcStaSetIBSS(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetIBSS_t *setibss = (caStaSetIBSS_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setibss->intf, str, 15); |
| DPRINT_INFO(WFA_OUT, "interface %s\n", setibss->intf); |
| |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setibss->ssid, str, 64); |
| DPRINT_INFO(WFA_OUT, "ssid %s\n", setibss->ssid); |
| } |
| else if(strcasecmp(str, "channel") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setibss->channel = atoi(str); |
| } |
| else if(strcasecmp(str, "encpType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str, "wep") == 0) |
| setibss->encpType = ENCRYPT_WEP; |
| else |
| setibss->encpType = 0; |
| } |
| else if(strcasecmp(str, "key1") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setibss->keys[0], str, 26); |
| setibss->activeKeyIdx = 0; |
| } |
| else if(strcasecmp(str, "key2") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setibss->keys[1], str, 26); |
| setibss->activeKeyIdx = 1; |
| } |
| else if(strcasecmp(str, "key3") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setibss->keys[2], str, 26); |
| setibss->activeKeyIdx = 2; |
| } |
| else if(strcasecmp(str, "key4") == 0) |
| { |
| DPRINT_INFO(WFA_OUT,"in key 4\n"); |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setibss->keys[3], str, 26); |
| setibss->activeKeyIdx = 3; |
| } |
| else if(strcasecmp(str, "activeKey") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setibss->activeKeyIdx = atoi(str); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_IBSS_TLV, sizeof(caStaSetIBSS_t), (BYTE *)setibss, aBuf); |
| |
| *aLen = 4+sizeof(caStaSetIBSS_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcDeviceGetInfo(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *dutCmd = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| caDevInfo_t *dinfo = &dutCmd->cmdsu.dev; |
| char *str; |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| dinfo->fw = 0; |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL && str[0] == '\0') |
| { |
| if(strcasecmp(str, "firmware") == 0) |
| { |
| dinfo->fw = 1; |
| } |
| } |
| |
| wfaEncodeTLV(WFA_DEVICE_GET_INFO_TLV, 0, NULL, aBuf); |
| |
| *aLen = 4; |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaGetInfo(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| char *str; |
| dutCommand_t *getInfo = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(getInfo->intf, str, 15); |
| DPRINT_INFO(WFA_OUT, "interface %s\n", getInfo->intf); |
| |
| } |
| |
| wfaEncodeTLV(WFA_STA_GET_INFO_TLV, sizeof(dutCommand_t), (BYTE *)getInfo, aBuf); |
| |
| *aLen = 4 + sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaGetTestData(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| char *str; |
| dutCommand_t *dutCmd = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| caStaGetTestData_t *tdp = &dutCmd->cmdsu.tdata; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| |
| if(strcasecmp(str, "testdata") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str, "voice") == 0) |
| { |
| tdp->type = 1; |
| DPRINT_INFO(WFA_OUT, "testdata voice %i\n", tdp->type); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_GET_INFO_TLV, sizeof(dutCommand_t), (BYTE *)dutCmd, aBuf); |
| |
| *aLen = 4 + sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaAssociate(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *setassoc = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setassoc->intf, str, 15); |
| DPRINT_INFO(WFA_OUT, "interface %s\n", setassoc->intf); |
| |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str != NULL){ |
| strncpy(setassoc->cmdsu.ssid, str, 64); |
| DPRINT_INFO(WFA_OUT, "ssid %s\n", setassoc->cmdsu.ssid); |
| } |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_ASSOCIATE_TLV, sizeof(dutCommand_t), (BYTE *)setassoc, aBuf); |
| |
| *aLen = 4+sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaReAssociate(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *setassoc = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setassoc->intf, str, 15); |
| DPRINT_INFO(WFA_OUT, "interface %s\n", setassoc->intf); |
| |
| } |
| else if(strcasecmp(str, "bssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setassoc->cmdsu.bssid, str, 64); |
| DPRINT_INFO(WFA_OUT, "bssid %s\n", setassoc->cmdsu.bssid); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_REASSOCIATE_TLV, sizeof(dutCommand_t), (BYTE *)setassoc, aBuf); |
| |
| *aLen = 4+sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcDeviceListIF(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *getdevlist = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| #ifdef DEBUG |
| int i; |
| #endif |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| |
| if(strcasecmp(str, "interfaceType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcmp(str, "802.11") == 0) |
| getdevlist->cmdsu.iftype = IF_80211; |
| |
| DPRINT_INFO(WFA_OUT, "interface type %i\n", getdevlist->cmdsu.iftype); |
| } |
| |
| wfaEncodeTLV(WFA_DEVICE_LIST_IF_TLV, sizeof(dutCommand_t), (BYTE *)getdevlist, aBuf); |
| |
| *aLen = 4 + sizeof(dutCommand_t); |
| |
| #if DEBUG |
| for(i = 0; i< *aLen; i++) |
| DPRINT_INFO(WFA_OUT,"%x ", aBuf[i]); |
| |
| DPRINT_INFO(WFA_OUT,"\n"); |
| #endif |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetUAPSD(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetUAPSD_t *setuapsd = (caStaSetUAPSD_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| memset(setuapsd, 0, sizeof(caStaSetUAPSD_t)); /* Added as per BRCM 1.3 ASD */ |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setuapsd->intf, str, 15); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setuapsd->ssid, str, 64); |
| } |
| else if(strcasecmp(str, "maxSPlength") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setuapsd->maxSPLength = atoi(str); |
| } |
| else if(strcasecmp(str, "acBE") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setuapsd->acBE = atoi(str); |
| } |
| else if(strcasecmp(str, "acBK") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setuapsd->acBK = atoi(str); |
| |
| } |
| else if(strcasecmp(str, "acVI") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setuapsd->acVI = atoi(str); |
| |
| } |
| else if(strcasecmp(str, "acVO") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setuapsd->acVO = atoi(str); |
| } |
| } |
| |
| /* Start: Added as per BRCM 1.3 ASD */ |
| wfaEncodeTLV(WFA_STA_SET_UAPSD_TLV, sizeof(caStaSetUAPSD_t), (BYTE *)setuapsd, aBuf); |
| *aLen = 4+sizeof(caStaSetUAPSD_t); |
| /* End: Added as per BRCM 1.3 ASD */ |
| |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaDebugSet(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *debugSet = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "level") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(atoi(str) == WFA_DEBUG_INFO || WFA_DEBUG_WARNING) |
| { |
| debugSet->cmdsu.dbg.level = atoi(str); |
| DPRINT_INFO(WFA_OUT, "dbg level %i\n", debugSet->cmdsu.dbg.level); |
| } |
| else |
| return FALSE; /* not support */ |
| |
| } |
| else if(strcasecmp(str, "enable") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| DPRINT_INFO(WFA_OUT,"enable %i\n", atoi(str)); |
| switch(atoi(str)) /* enable */ |
| { |
| case 1: |
| debugSet->cmdsu.dbg.state = 1; |
| DPRINT_INFO(WFA_OUT,"enable\n"); |
| break; |
| case 0: |
| debugSet->cmdsu.dbg.state = 0; |
| DPRINT_INFO(WFA_OUT,"disable\n"); |
| break; |
| default: |
| DPRINT_INFO(WFA_OUT,"wrong\n"); |
| return FALSE; /* command invalid */ |
| } |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_DEBUG_SET_TLV, sizeof(dutCommand_t), (BYTE *)debugSet, aBuf); |
| |
| *aLen = 4 + sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetMode(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetMode_t *setmode = (caStaSetMode_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setmode->intf, str, 15); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setmode->ssid, str, 64); |
| } |
| else if(strcasecmp(str, "encpType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str, "wep") == 0) |
| setmode->encpType = ENCRYPT_WEP; |
| else |
| setmode->encpType = 0; |
| } |
| else if(strcasecmp(str, "key1") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setmode->keys[0], str, 26); |
| DPRINT_INFO(WFA_OUT, "%s\n", setmode->keys[0]); |
| setmode->activeKeyIdx = 0; |
| } |
| else if(strcasecmp(str, "key2") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setmode->keys[1], str, 26); |
| DPRINT_INFO(WFA_OUT, "%s\n", setmode->keys[1]); |
| } |
| else if(strcasecmp(str, "key3") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setmode->keys[2], str, 26); |
| DPRINT_INFO(WFA_OUT, "%s\n", setmode->keys[2]); |
| } |
| else if(strcasecmp(str, "key4") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setmode->keys[3], str, 26); |
| DPRINT_INFO(WFA_OUT, "%s\n", setmode->keys[3]); |
| } |
| else if(strcasecmp(str, "activeKey") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setmode->activeKeyIdx = atoi(str); |
| } |
| else if(strcasecmp(str, "mode") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| DPRINT_INFO(WFA_OUT,"\r\n mode is %s\n",str); |
| if(strcasecmp(str, "adhoc") == 0) |
| setmode->mode = 1; |
| else |
| setmode->mode = 0; |
| } |
| else if(strcasecmp(str, "channel") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setmode->channel = atoi(str); |
| } |
| else |
| { |
| DPRINT_INFO(WFA_WNG, "Incorrect Command, check syntax\n"); |
| DPRINT_INFO(WFA_OUT,"\r\n mode is %s\n",str); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_MODE_TLV, sizeof(caStaSetMode_t), (BYTE *)setmode, aBuf); |
| *aLen = 4+sizeof(caStaSetMode_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetPwrSave(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetPwrSave_t *setps = (caStaSetPwrSave_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setps->intf, str, 15); |
| } |
| else if(strcasecmp(str, "mode") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str,"on") == 0) |
| setps->mode = 2; |
| else if(strcasecmp(str,"off") == 0) |
| setps->mode = 0; |
| else |
| return FALSE; |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_PWRSAVE_TLV, sizeof(caStaSetPwrSave_t), (BYTE *)setps, aBuf); |
| *aLen = 4+sizeof(caStaSetPwrSave_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetWMM(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetWMM_t *setwmm = (caStaSetWMM_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| wfaTLV *hdr = (wfaTLV *)aBuf; |
| |
| DPRINT_INFO(WFA_OUT, "start xcCmdProcStaSetWMM ...\n"); |
| DPRINT_INFO(WFA_OUT, "params: %s\n", pcmdStr); |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| /* Some default values, in case they are not specified*/ |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setwmm->intf, str, 15); |
| } |
| else if(strcasecmp(str, "GROUP") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str,"WMMAC") == 0) |
| setwmm->group = GROUP_WMMAC; |
| else if(strcasecmp(str,"WMM-CONFIG") == 0) |
| { |
| setwmm->group = GROUP_WMMCONF; |
| setwmm->actions.config.frag_thr = 2346; |
| setwmm->actions.config.rts_thr = 2346; |
| setwmm->actions.config.wmm = 1; |
| } |
| } |
| else if(strcasecmp(str, "ACTION") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str,"addts") == 0) |
| { |
| /* Put default values for the tspec element */ |
| setwmm->action = WMMAC_ADDTS; |
| setwmm->actions.addts.accesscat = WMMAC_AC_BE; |
| setwmm->actions.addts.tspec.tsinfo.dummy1 = 1; |
| setwmm->actions.addts.tspec.tsinfo.dummy2 = 0; |
| } |
| else if(strcasecmp(str,"delts") == 0) |
| setwmm->action = WMMAC_DELTS; |
| DPRINT_INFO(WFA_OUT,"action is %d\n",setwmm->action); |
| } |
| else if(strcasecmp(str, "RTS_thr") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.config.rts_thr = atoi(str); |
| } |
| else if(strcasecmp(str, "wmm") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(atoi(str) != 0) |
| setwmm->actions.config.wmm = 1; |
| else |
| setwmm->actions.config.wmm = 0; |
| } |
| else if(strcasecmp(str, "Frag_thr") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.config.frag_thr = atoi(str); |
| } |
| else if(strcasecmp(str, "DIALOG_TOKEN") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.dialog_token = atoi(str); |
| } |
| else if(strcasecmp(str, "TID") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(setwmm->action == WMMAC_ADDTS) |
| setwmm->actions.addts.tspec.tsinfo.TID = atoi(str); |
| else |
| setwmm->actions.delts = atoi(str); |
| } |
| else if(strcasecmp(str, "SENDTRIG") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str,"true") == 0) |
| setwmm->send_trig=1; |
| else |
| setwmm->send_trig=0; |
| } |
| else if(strcasecmp(str, "DEST") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setwmm->dipaddr, str, 15); |
| } |
| else if(strcasecmp(str, "trigac") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str,"VO") == 0) |
| setwmm->trig_ac= TG_WMM_AC_VO; |
| else if(strcasecmp(str,"VI") == 0) |
| setwmm->trig_ac= TG_WMM_AC_VI; |
| else if(strcasecmp(str,"BE") == 0) |
| setwmm->trig_ac= TG_WMM_AC_BE; |
| else if(strcasecmp(str,"BK") == 0) |
| setwmm->trig_ac= TG_WMM_AC_BK; |
| } |
| else if(strcasecmp(str, "DIRECTION") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str,"UP") == 0) |
| setwmm->actions.addts.tspec.tsinfo.direction = WMMAC_UPLINK; |
| else if(strcasecmp(str,"DOWN") == 0) |
| setwmm->actions.addts.tspec.tsinfo.direction = WMMAC_DOWNLINK; |
| else if(strcasecmp(str,"BIDI") == 0) |
| setwmm->actions.addts.tspec.tsinfo.direction = WMMAC_BIDIR; |
| } |
| else if(strcasecmp(str, "PSB") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str,"UAPSD") == 0) |
| setwmm->actions.addts.tspec.tsinfo.PSB = 1; |
| else |
| setwmm->actions.addts.tspec.tsinfo.PSB = 0; |
| } |
| else if(strcasecmp(str, "UP") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.tsinfo.UP = atoi(str); |
| } |
| else if(strcasecmp(str, "Fixed") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str, "true") == 0) |
| setwmm->actions.addts.tspec.Fixed = 1; |
| else |
| setwmm->actions.addts.tspec.Fixed = 0; |
| } |
| else if(strcasecmp(str, "SIZE") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.size = atoi(str); |
| } |
| else if(strcasecmp(str, "MAXSIZE") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.maxsize = atoi(str); |
| } |
| else if(strcasecmp(str, "MIN_SRVC_INTRVL") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.min_srvc = atoi(str); |
| } |
| else if(strcasecmp(str, "MAX_SRVC_INTRVL") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.max_srvc = atoi(str); |
| } |
| else if(strcasecmp(str, "INACTIVITY") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.inactivity = atoi(str); |
| } |
| else if(strcasecmp(str, "SUSPENSION") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.suspension = atoi(str); |
| } |
| else if(strcasecmp(str, "SRVCSTARTTIME") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.srvc_strt_tim = atoi(str); |
| } |
| else if(strcasecmp(str, "MINDATARATE") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.mindatarate = atoi(str); |
| } |
| else if(strcasecmp(str, "MEANDATARATE") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.meandatarate = atoi(str); |
| } |
| else if(strcasecmp(str, "PEAKDATARATE") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.peakdatarate = atoi(str); |
| } |
| else if(strcasecmp(str, "BURSTSIZE") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.burstsize = atoi(str); |
| } |
| else if(strcasecmp(str, "DELAYBOUND") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.delaybound = atoi(str); |
| } |
| else if(strcasecmp(str, "PHYRATE") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.PHYrate = atoi(str); |
| } |
| else if(strcasecmp(str, "SBA") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.sba = (float)atof(str); |
| } |
| else if(strcasecmp(str, "MEDIUM_TIME") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| setwmm->actions.addts.tspec.medium_time = atoi(str); |
| } |
| else if(strcasecmp(str, "ACCESSCAT") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str,"VO") == 0) |
| setwmm->actions.addts.accesscat = WMMAC_AC_VO; |
| else if(strcasecmp(str,"VI") == 0) |
| setwmm->actions.addts.accesscat = WMMAC_AC_VI; |
| else if(strcasecmp(str,"BE") == 0) |
| setwmm->actions.addts.accesscat = WMMAC_AC_BE; |
| else if(strcasecmp(str,"BK") == 0) |
| setwmm->actions.addts.accesscat = WMMAC_AC_BK; |
| } |
| } |
| if (setwmm->action == WMMAC_ADDTS) { |
| DPRINT_INFO(WFA_OUT, "ADDTS AC PARAMS: dialog id: %d, TID: %d, DIRECTION: %d, PSB: %d, UP: %d,\ |
| Fixed %d, MSDU Size: %d, Max MSDU Size %d, MIN SERVICE INTERVAL: %d, MAX SERVICE INTERVAL: %d\ |
| ,INACTIVITY: %d,SUSPENSION %d,SERVICE START TIME: %d,MIN DATARATE: %d,MEAN DATA RATE: %d\ |
| , PEAK DATA RATE: %d,BURSTSIZE: %d,DELAY BOUND: %d,PHYRATE: %d, SPLUSBW: %f,MEDIUM TIME: %d, ACCESSCAT: %d\n"\ |
| ,setwmm->actions.addts.dialog_token,setwmm->actions.addts.tspec.tsinfo.TID\ |
| ,setwmm->actions.addts.tspec.tsinfo.direction,setwmm->actions.addts.tspec.tsinfo.PSB,setwmm->actions.addts.tspec.tsinfo.UP\ |
| ,setwmm->actions.addts.tspec.Fixed,setwmm->actions.addts.tspec.size, setwmm->actions.addts.tspec.maxsize,\ |
| setwmm->actions.addts.tspec.min_srvc,\ |
| setwmm->actions.addts.tspec.max_srvc,setwmm->actions.addts.tspec.inactivity,setwmm->actions.addts.tspec.suspension,\ |
| setwmm->actions.addts.tspec.srvc_strt_tim,setwmm->actions.addts.tspec.mindatarate,setwmm->actions.addts.tspec.meandatarate\ |
| ,setwmm->actions.addts.tspec.peakdatarate,setwmm->actions.addts.tspec.burstsize,\ |
| setwmm->actions.addts.tspec.delaybound,setwmm->actions.addts.tspec.PHYrate,setwmm->actions.addts.tspec.sba,\ |
| setwmm->actions.addts.tspec.medium_time,setwmm->actions.addts.accesscat); |
| } |
| else |
| DPRINT_INFO(WFA_OUT, "DELTS AC PARAMS: TID: %d\n", setwmm->actions.delts); |
| |
| hdr->tag = WFA_STA_SET_WMM_TLV; |
| hdr->len = sizeof(caStaSetWMM_t); |
| |
| memcpy(aBuf+4, setwmm, sizeof(caStaSetWMM_t)); |
| |
| *aLen = 4+sizeof(caStaSetWMM_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaNeigreq(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *neigreq = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "mac") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(neigreq->mac, str, WFA_MAC_ADDR_STR_LEN); |
| DPRINT_INFO(WFA_OUT, "mac %s\n", neigreq->mac); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str != NULL) |
| { |
| strncpy(neigreq->cmdsu.ssid, str, WFA_SSID_NAME_LEN); |
| DPRINT_INFO(WFA_OUT, "ssid %s\n", neigreq->cmdsu.ssid); |
| } |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SEND_NEIGREQ_TLV, sizeof(dutCommand_t), (BYTE *)neigreq, aBuf); |
| |
| *aLen = 4+sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| |
| int xcCmdProcStaSetSystime(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *systime = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| int temp; |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "month") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| temp = atoi(str); |
| /* |
| * If month is more than 2 character then error |
| * If it is 2 character and less than 10 and first char is not 0 like '1b' |
| * 'b7' etc. All possible errors input taken care |
| */ |
| if ((temp > 12 || temp < 1) || (strlen(str) > 2) || |
| (strlen(str) == 2 && temp < 10 && str[0] != '0')) |
| { |
| DPRINT_ERR(WFA_OUT, "Wrong month input \n"); |
| return FALSE; |
| } |
| systime->cmdsu.stime.month = temp; |
| DPRINT_INFO(WFA_OUT, "month %d\n", systime->cmdsu.stime.month); |
| } |
| else if(strcasecmp(str, "date") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| temp = atoi(str); |
| if ((temp > 31 || temp < 1) || (strlen(str) > 2) || |
| (strlen(str) == 2 && temp < 10 && str[0] != '0')) |
| { |
| DPRINT_ERR(WFA_OUT, "Wrong date input \n"); |
| return FALSE; |
| } |
| /* In case of Linux there is no invalid date, all dates will be accepted and it will |
| * set to next corresponding valid date |
| * In case of win32 system will return error while setting bad date |
| */ |
| systime->cmdsu.stime.date = temp; |
| DPRINT_INFO(WFA_OUT, "date %d\n", systime->cmdsu.stime.date); |
| } |
| else if(strcasecmp(str, "year") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| temp = atoi(str); |
| /* |
| * Unix date start from 1970, so lower limit kept |
| */ |
| if (temp < 1970 || strlen(str) > 4) |
| { |
| DPRINT_ERR(WFA_OUT, "Wrong year input\n"); |
| return FALSE; |
| } |
| systime->cmdsu.stime.year = temp; |
| DPRINT_INFO(WFA_OUT, "year %d\n", systime->cmdsu.stime.year); |
| } |
| else if(strcasecmp(str, "hours") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| temp = atoi(str); |
| if ((temp > 23 || temp < 0) || (strlen(str) > 2) || |
| (strlen(str) == 2 && temp < 10 && str[0] != '0')) |
| { |
| DPRINT_ERR(WFA_OUT, "Wrong hours input \n"); |
| return FALSE; |
| } |
| systime->cmdsu.stime.hours = temp; |
| DPRINT_INFO(WFA_OUT, "hours %d\n", systime->cmdsu.stime.hours); |
| } |
| else if(strcasecmp(str, "minutes") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| temp = atoi(str); |
| if ((temp > 59 || temp < 0) || (strlen(str) > 2) || |
| (strlen(str) == 2 && temp < 10 && str[0] != '0')) |
| { |
| DPRINT_ERR(WFA_OUT, "Wrong minutes input \n"); |
| return FALSE; |
| } |
| systime->cmdsu.stime.minutes = temp; |
| DPRINT_INFO(WFA_OUT, "minutes %d\n", systime->cmdsu.stime.minutes); |
| } |
| else if(strcasecmp(str, "seconds") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| temp = atoi(str); |
| if ((temp > 59 || temp < 0) || (strlen(str) > 2) || |
| (strlen(str) == 2 && temp < 10 && str[0] != '0')) |
| { |
| DPRINT_ERR(WFA_OUT, "Wrong seconds input \n"); |
| return FALSE; |
| } |
| systime->cmdsu.stime.seconds = temp; |
| DPRINT_INFO(WFA_OUT, "seconds %d\n", systime->cmdsu.stime.seconds); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_SYSTIME_TLV, sizeof(dutCommand_t), (BYTE *)systime, aBuf); |
| |
| *aLen = 4+sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| #ifdef WFA_STA_TB |
| |
| int xcCmdProcStaSet11n(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *Set11n = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| int smps; |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| /* 1 is for disable and 2 is for enable, as all values set to 0 initially */ |
| if(strcasecmp(str, "40_intolerant") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "enable") == 0) |
| Set11n->cmdsu.set11n.intolerant_40 = 2; |
| else if(strcasecmp(str, "disable") == 0) |
| Set11n->cmdsu.set11n.intolerant_40 = 1; |
| else |
| { |
| DPRINT_ERR(WFA_OUT, "not a proper action id\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "40_intolerant %d\n", Set11n->cmdsu.set11n.intolerant_40); |
| } |
| else if(strcasecmp(str, "addba_reject") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "enable") == 0) |
| Set11n->cmdsu.set11n.addba_reject = 2; |
| else if(strcasecmp(str, "disable") == 0) |
| Set11n->cmdsu.set11n.addba_reject = 1; |
| else |
| { |
| DPRINT_ERR(WFA_OUT, "not a proper action id\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "addba_reject %d\n", Set11n->cmdsu.set11n.addba_reject); |
| } |
| else if(strcasecmp(str, "ampdu") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "enable") == 0) |
| Set11n->cmdsu.set11n.ampdu = 2; |
| else if(strcasecmp(str, "disable") == 0) |
| Set11n->cmdsu.set11n.ampdu = 1; |
| else |
| { |
| DPRINT_ERR(WFA_OUT, "not a proper action id\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "ampdu %d\n", Set11n->cmdsu.set11n.ampdu); |
| } |
| else if(strcasecmp(str, "amsdu") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "enable") == 0) |
| Set11n->cmdsu.set11n.amsdu = 2; |
| else if(strcasecmp(str, "disable") == 0) |
| Set11n->cmdsu.set11n.amsdu = 1; |
| else |
| { |
| DPRINT_ERR(WFA_OUT, "not a proper action id\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "amsdu %d\n", Set11n->cmdsu.set11n.amsdu); |
| } |
| else if(strcasecmp(str, "greenfield") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "enable") == 0) |
| Set11n->cmdsu.set11n.greenfield = 2; |
| else if(strcasecmp(str, "disable") == 0) |
| Set11n->cmdsu.set11n.greenfield = 1; |
| else |
| { |
| DPRINT_ERR(WFA_OUT, "not a proper action id\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "greenfield %d\n", Set11n->cmdsu.set11n.greenfield); |
| } |
| else if(strcasecmp(str, "sgi20") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "enable") == 0) |
| Set11n->cmdsu.set11n.sgi20 = 2; |
| else if(strcasecmp(str, "disable") == 0) |
| Set11n->cmdsu.set11n.sgi20 = 1; |
| else |
| { |
| DPRINT_ERR(WFA_OUT, "not a proper action id\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "sgi20 %d\n", Set11n->cmdsu.set11n.sgi20); |
| } |
| else if(strcasecmp(str, "stbc_rx") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| Set11n->cmdsu.set11n.stbc_rx = atoi(str); |
| DPRINT_INFO(WFA_OUT, "stbc_rx %d\n", Set11n->cmdsu.set11n.stbc_rx); |
| } |
| else if(Set11n->cmdsu.set11n.stbc_rx == 0) |
| { |
| Set11n->cmdsu.set11n.stbc_rx = -1; |
| } |
| else if(strcasecmp(str, "width") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "auto") == 0) |
| Set11n->cmdsu.set11n.width = -1; |
| else |
| Set11n->cmdsu.set11n.width = atoi(str); |
| DPRINT_INFO(WFA_OUT, "width %d\n", Set11n->cmdsu.set11n.width); |
| } |
| else if(strcasecmp(str, "mcs32") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "enable") == 0) |
| Set11n->cmdsu.set11n.mcs32 = 2; |
| else if(strcasecmp(str, "disable") == 0) |
| Set11n->cmdsu.set11n.mcs32 = 1; |
| else |
| { |
| DPRINT_ERR(WFA_OUT, "not a proper action id\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "mcs32 %d\n", Set11n->cmdsu.set11n.mcs32); |
| } |
| else if(strcasecmp(str, "smps") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| smps = atoi(str); |
| smps++; |
| Set11n->cmdsu.set11n.smps = smps; |
| DPRINT_INFO(WFA_OUT, "smps %d\n", Set11n->cmdsu.set11n.smps); |
| } |
| else if(strcasecmp(str, "txsp_stream") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| Set11n->cmdsu.set11n.txsp_stream = atoi(str); |
| DPRINT_INFO(WFA_OUT, "txsp_stream %d\n", Set11n->cmdsu.set11n.txsp_stream); |
| } |
| else if(strcasecmp(str, "rxsp_stream") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| Set11n->cmdsu.set11n.rxsp_stream = atoi(str); |
| DPRINT_INFO(WFA_OUT, "rxsp_stream %d\n", Set11n->cmdsu.set11n.rxsp_stream); |
| } |
| else if(strcasecmp(str, "mcs_fixedrate") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| Set11n->cmdsu.set11n.mcs_fixedrate = atoi(str); |
| if((Set11n->cmdsu.set11n.mcs_fixedrate > 31) || (Set11n->cmdsu.set11n.mcs_fixedrate < 0)) |
| return FALSE; |
| DPRINT_INFO(WFA_OUT, "mcs_fixedrate %d\n", Set11n->cmdsu.set11n.mcs_fixedrate); |
| } |
| else |
| { |
| /* done to ignore mcs if it is not set */ |
| Set11n->cmdsu.set11n.mcs_fixedrate = -1; |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_11N_TLV, sizeof(dutCommand_t), (BYTE *)Set11n, aBuf); |
| |
| *aLen = 4+sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetRIFSTest(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *rifstest = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| strncpy(rifstest->intf, str, WFA_IF_NAME_LEN); |
| DPRINT_INFO(WFA_OUT, "interface %s\n", rifstest->intf); |
| } |
| if(strcasecmp(str, "action") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "enable") == 0) |
| rifstest->cmdsu.action_rifs = 2; |
| else if(strcasecmp(str, "disable") == 0) |
| rifstest->cmdsu.action_rifs = 1; |
| else |
| { |
| DPRINT_ERR(WFA_OUT, "not a proper action id\n"); |
| return FALSE; |
| } |
| DPRINT_INFO(WFA_OUT, "action %d\n", rifstest->cmdsu.action_rifs); |
| } |
| } |
| wfaEncodeTLV(WFA_STA_SET_RIFS_TEST_TLV, sizeof(dutCommand_t), (BYTE *)rifstest, aBuf); |
| |
| *aLen = 4 + sizeof(dutCommand_t); |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetWireless(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *wireless = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| strncpy(wireless->intf, str, WFA_IF_NAME_LEN); |
| DPRINT_INFO(WFA_OUT, "interface %s\n", wireless->intf); |
| } |
| else if(strcasecmp(str, "band") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| strncpy(wireless->cmdsu.wireless_band, str, strlen(str)); |
| DPRINT_INFO(WFA_OUT, "band %s\n", wireless->cmdsu.wireless_band); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_WIRELESS_TLV, sizeof(dutCommand_t), (BYTE *)wireless, aBuf); |
| |
| *aLen = 4+sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSendAddba(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *addba = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| strncpy(addba->intf, str, WFA_IF_NAME_LEN); |
| DPRINT_INFO(WFA_OUT, "interface %s\n", addba->intf); |
| } |
| else if(strcasecmp(str, "tid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| addba->cmdsu.tid = atoi(str); |
| DPRINT_INFO(WFA_OUT, "tid %d\n", addba->cmdsu.tid); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SEND_ADDBA_TLV, sizeof(dutCommand_t), (BYTE *)addba, aBuf); |
| |
| *aLen = 4+sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSendCoexistMGMT(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *coexist = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| strncpy(coexist->intf, str, WFA_IF_NAME_LEN); |
| DPRINT_INFO(WFA_OUT, "interface %s\n", coexist->intf); |
| } |
| else if(strcasecmp(str, "type") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "MHz") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "value") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| strncpy(coexist->cmdsu.coexistmgmt.Mhz, str, 1); |
| } |
| } |
| else if(strcasecmp(str, "BSS") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "value") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| strncpy(coexist->cmdsu.coexistmgmt.bss, str, 1); |
| } |
| } |
| else if(strcasecmp(str, "ChnlRepo") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| if(strcasecmp(str, "value") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| strncpy(coexist->cmdsu.coexistmgmt.ChnlRepo, str, strlen(str)); |
| } |
| } |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SEND_COEXIST_MGMT_TLV, sizeof(dutCommand_t), (BYTE *)coexist, aBuf); |
| |
| *aLen = 4+sizeof(dutCommand_t); |
| return TRUE; |
| } |
| |
| int xcCmdProcStaDisconnect(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| dutCommand_t *disconnect = (dutCommand_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| return FALSE; |
| strncpy(disconnect->intf, str, WFA_IF_NAME_LEN); |
| DPRINT_INFO(WFA_OUT, "intf %s\n", disconnect->intf); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_DISCONNECT_TLV, sizeof(dutCommand_t), (BYTE *)disconnect, aBuf); |
| |
| *aLen = 4+sizeof(dutCommand_t); |
| |
| return TRUE; |
| } |
| |
| #endif /* WFA_STA_TB */ |
| |
| int xcCmdProcStaResetDefault(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaResetDefault_t *reset = (caStaResetDefault_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(reset->intf, str, 15); |
| } |
| else if(strcasecmp(str, "program") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(reset->prog, str, 16); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_RESET_DEFAULT_TLV, sizeof(caStaResetDefault_t), (BYTE *)reset, aBuf); |
| *aLen = 4+sizeof(caStaResetDefault_t); |
| |
| return TRUE; |
| } |
| |
| int xcCmdProcStaSetEapFAST(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetEapFAST_t *setsec = (caStaSetEapFAST_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->intf, str, 15); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->ssid, str, 64); |
| } |
| else if(strcasecmp(str, "username") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->username, str); |
| } |
| else if(strcasecmp(str, "password") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->passwd, str); |
| } |
| else if(strcasecmp(str, "keyMgmtType") == 0) |
| { |
| str=strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->keyMgmtType, str, 7); |
| } |
| else if(strcasecmp(str, "encpType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->encrptype, str, 8); |
| } |
| else if(strcasecmp(str, "trustedRootCA") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->trustedRootCA, str,31); |
| } |
| else if(strcasecmp(str, "innerEAP") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->innerEAP, str); |
| } |
| else if(strcasecmp(str, "validateServer") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(strcasecmp(str, "yes") == 0) |
| { |
| setsec->validateServer=1; |
| } |
| else if(strcasecmp(str, "no") == 0) |
| { |
| setsec->validateServer=0; |
| } |
| } |
| else if(strcasecmp(str, "pacFile") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->pacFileName, str); |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_EAPFAST_TLV, sizeof(caStaSetEapFAST_t), (BYTE *)setsec, aBuf); |
| |
| *aLen = 4+sizeof(caStaSetEapFAST_t); |
| |
| return TRUE; |
| } |
| |
| |
| int xcCmdProcStaSetEapAKA(char *pcmdStr, BYTE *aBuf, int *aLen) |
| { |
| caStaSetEapAKA_t *setsec = (caStaSetEapAKA_t *) (aBuf+sizeof(wfaTLV)); |
| char *str; |
| |
| if(aBuf == NULL) |
| return FALSE; |
| |
| memset(aBuf, 0, *aLen); |
| |
| for(;;) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| if(str == NULL || str[0] == '\0') |
| break; |
| |
| if(strcasecmp(str, "interface") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->intf, str, 15); |
| } |
| else if(strcasecmp(str, "ssid") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->ssid, str, 64); |
| } |
| else if(strcasecmp(str, "username") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->username, str); |
| } |
| else if(strcasecmp(str, "password") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strcpy(setsec->passwd, str); |
| } |
| else if(strcasecmp(str, "keyMgmtType") == 0) |
| { |
| str=strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->keyMgmtType, str, 7); |
| } |
| else if(strcasecmp(str, "encpType") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy(setsec->encrptype, str, 8); |
| } |
| else if(strcasecmp(str, "triplet1") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setsec->tripletSet[0], str, 63); |
| DPRINT_INFO(WFA_OUT, "Triplet1 : %s\n", setsec->tripletSet[0]); |
| setsec->tripletCount = 1; |
| } |
| else if(strcasecmp(str, "triplet2") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setsec->tripletSet[1], str, 63); |
| DPRINT_INFO(WFA_OUT, "Triplet2 : %s\n", setsec->tripletSet[1]); |
| setsec->tripletCount=2; |
| } |
| else if(strcasecmp(str, "triplet3") == 0) |
| { |
| str = strtok_r(NULL, ",", &pcmdStr); |
| strncpy((char *)setsec->tripletSet[2], str, 63); |
| DPRINT_INFO(WFA_OUT, "Triplet1 : %s\n", setsec->tripletSet[2]); |
| setsec->tripletCount = 3; |
| } |
| } |
| |
| wfaEncodeTLV(WFA_STA_SET_EAPAKA_TLV, sizeof(caStaSetEapAKA_t), (BYTE *)setsec, aBuf); |
| |
| *aLen = 4+sizeof(caStaSetEapAKA_t); |
| |
| return TRUE; |
| } |