blob: f44fce4a3da7db2700b25d381a956f73767ef9d0 [file] [log] [blame]
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001/****************************************************************************
Alan Tsaidfafa3a2016-09-23 16:53:35 -07002Copyright (c) 2016 Wi-Fi Alliance. All Rights Reserved
Dake Zhao97708202014-11-26 13:59:04 -08003
Dake Zhao0a832172015-01-06 11:08:47 -08004Permission to use, copy, modify, and/or distribute this software for any purpose with or
5without fee is hereby granted, provided that the above copyright notice and this permission
Dake Zhao97708202014-11-26 13:59:04 -08006notice appear in all copies.
7
Dake Zhao0a832172015-01-06 11:08:47 -08008THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
12FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
13NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
Dake Zhao97708202014-11-26 13:59:04 -080014THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
16******************************************************************************/
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000017
Dake Zhao0a832172015-01-06 11:08:47 -080018/*
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000019 * File: wfa_cs.c -- configuration and setup
Dake Zhao0a832172015-01-06 11:08:47 -080020 * This file contains all implementation for the dut setup and control
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000021 * functions, such as network interfaces, ip address and wireless specific
22 * setup with its supplicant.
23 *
24 * The current implementation is to show how these functions
Dake Zhao0a832172015-01-06 11:08:47 -080025 * should be defined in order to support the Agent Control/Test Manager
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000026 * control commands. To simplify the current work and avoid any GPL licenses,
27 * the functions mostly invoke shell commands by calling linux system call,
Dake Zhao0a832172015-01-06 11:08:47 -080028 * system("<commands>").
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000029 *
30 * It depends on the differnt device and platform, vendors can choice their
31 * own ways to interact its systems, supplicants and process these commands
32 * such as using the native APIs.
33 *
Dake Zhao0a832172015-01-06 11:08:47 -080034 *
35 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000036#include <stdio.h>
37#include <unistd.h>
38#include <string.h>
39#include <stdlib.h>
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +020040#include <stdbool.h>
41#include <stdarg.h>
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000042#include <sys/socket.h>
43#include <arpa/inet.h>
44#include <linux/types.h>
45#include <linux/socket.h>
46#include <poll.h>
47
48#include "wfa_portall.h"
49#include "wfa_debug.h"
50#include "wfa_ver.h"
51#include "wfa_main.h"
52#include "wfa_types.h"
53#include "wfa_ca.h"
54#include "wfa_tlv.h"
55#include "wfa_sock.h"
56#include "wfa_tg.h"
57#include "wfa_cmds.h"
58#include "wfa_rsp.h"
59#include "wfa_utils.h"
60#ifdef WFA_WMM_PS_EXT
61#include "wfa_wmmps.h"
62#endif
63
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +080064#define CERTIFICATES_PATH "/etc/wpa_supplicant"
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000065
66/* Some device may only support UDP ECHO, activate this line */
67//#define WFA_PING_UDP_ECHO_ONLY 1
68
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -080069#define WFA_ENABLED 1
70
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000071extern unsigned short wfa_defined_debug;
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +080072int wfaExecuteCLI(char* CLI);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000073
74/* Since the two definitions are used all over the CA function */
75char gCmdStr[WFA_CMD_STR_SZ];
76dutCmdResponse_t gGenericResp;
77int wfaTGSetPrio(int sockfd, int tgClass);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +080078void create_apts_msg(int msg, unsigned int txbuf[], int id);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000079
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -080080int sret = 0;
81
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000082extern char e2eResults[];
Dake Zhao862c94b2014-12-08 14:35:35 -080083
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +020084#define RETURN_STA_CMD_ERROR(resp, statusCode, ...) \
85 resp->status = statusCode; \
86 wfaEncodeTLV(WFA_STA_ASSOCIATE_RESP_TLV, sizeof(resp->status), (BYTE*)resp, \
87 respBuf); \
88 *respLen = WFA_TLV_HDR_LEN + sizeof(resp->status); \
89 DPRINT_ERR(WFA_ERR, __VA_ARGS__); \
90 return WFA_FAILURE;
91
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +080092FILE* e2efp = NULL;
93int chk_ret_status() {
94 char* ret = getenv(WFA_RET_ENV);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000095
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +080096 if (*ret == '1')
97 return WFA_SUCCESS;
98 else
99 return WFA_FAILURE;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000100}
101
Wojciech Jakobczyk249c1a02020-08-27 12:38:28 +0200102static int systemWithLog(char* command) {
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800103 DPRINT_INFO(WFA_OUT, "exec: %s\n", command);
104 int ret = system(command);
105 if (ret != 0) {
106 DPRINT_INFO(WFA_OUT, "exit code %d\n", ret);
107 }
108 return ret;
Wojciech Jakobczyk249c1a02020-08-27 12:38:28 +0200109}
110
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200111// Read a line from a file.
112// It reads at most bufSize-1 bytes to buf.
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800113bool readLine(const char* filename, char* buf, const int bufSize) {
114 FILE* fp = NULL;
115 fp = fopen(filename, "r+");
116 if (fp == NULL) {
117 return false;
118 }
119 char* ret = fgets(buf, bufSize, fp);
120 fclose(fp);
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200121
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800122 if (ret == NULL) {
123 return false;
124 }
125
126 if (buf[strlen(buf) - 1] == '\n') {
127 buf[strlen(buf) - 1] = 0;
128 }
129 return true;
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200130}
Wojciech Jakobczyk249c1a02020-08-27 12:38:28 +0200131
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000132/*
133 * agtCmdProcGetVersion(): response "ca_get_version" command to controller
134 * input: cmd --- not used
135 * valLen -- not used
136 * output: parms -- a buffer to store the version info response.
137 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800138int agtCmdProcGetVersion(int len, BYTE* parms, int* respLen, BYTE* respBuf) {
139 dutCmdResponse_t* getverResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000140
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800141 DPRINT_INFO(WFA_OUT, "entering agtCmdProcGetVersion ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000142
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800143 getverResp->status = STATUS_COMPLETE;
144 wSTRNCPY(getverResp->cmdru.version, WFA_SYSTEM_VER, WFA_VERNAM_LEN);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000145
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800146 wfaEncodeTLV(WFA_GET_VERSION_RESP_TLV, sizeof(dutCmdResponse_t),
147 (BYTE*)getverResp, respBuf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000148
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800149 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000150
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800151 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000152}
153
154/*
155 * wfaStaAssociate():
Dake Zhao0a832172015-01-06 11:08:47 -0800156 * The function is to force the station wireless I/F to re/associate
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000157 * with the AP.
158 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800159int wfaStaAssociate(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
160 dutCommand_t* assoc = (dutCommand_t*)caCmdBuf;
161 char* ifname = assoc->intf;
162 dutCmdResponse_t* staAssocResp = &gGenericResp;
163 char cmdResult[32];
164 const char* tmpfile = "/tmp/.wfaStaAssociateTmp";
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000165
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800166 DPRINT_INFO(WFA_OUT, "entering wfaStaAssociate ...\n");
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200167
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800168 // verify parameters
169 if (assoc->cmdsu.assoc.bssid[0] != '\0' || assoc->cmdsu.assoc.wps != 0) {
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +0200170 RETURN_STA_CMD_ERROR(staAssocResp, STATUS_INVALID,
171 "unsupported command parameter\n");
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800172 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000173
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800174 if (assoc->cmdsu.assoc.ssid[0] != '\0') {
175 int networkid = -1;
176
177 // get network id
178 sprintf(gCmdStr,
179 "wpa_cli.sh -i %s list_networks | grep %s | cut -f1 -d= > %s",
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200180 ifname, assoc->cmdsu.assoc.ssid, tmpfile);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800181 sret = systemWithLog(gCmdStr);
182 if (sret != 0) {
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +0200183 RETURN_STA_CMD_ERROR(staAssocResp, STATUS_ERROR,
184 "error running wpa_cli, exit code: %d\n", sret);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000185 }
186
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800187 if (!readLine(tmpfile, cmdResult, sizeof(cmdResult))) {
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +0200188 RETURN_STA_CMD_ERROR(
189 staAssocResp, STATUS_ERROR,
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800190 "unable to read network id (network not configured?)\n");
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200191 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800192 networkid = atoi(cmdResult);
193
194 if (networkid == -1) {
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +0200195 RETURN_STA_CMD_ERROR(staAssocResp, STATUS_ERROR,
196 "network not configured\n");
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800197 } else {
198 // enable the network and disable all others
199 sprintf(gCmdStr, "wpa_cli.sh -i %s select_network %d > %s", ifname,
200 networkid, tmpfile);
201 sret = systemWithLog(gCmdStr);
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200202 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800203 } else {
204 // reassociate to current connected network
205 sprintf(gCmdStr, "wpa_cli.sh -i%s reassociate > %s", ifname, tmpfile);
206 sret = systemWithLog(gCmdStr);
207 }
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200208
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800209 // check wpa_cli response
210 if (!readLine(tmpfile, cmdResult, sizeof(cmdResult))) {
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +0200211 RETURN_STA_CMD_ERROR(staAssocResp, STATUS_ERROR,
212 "unable to read command output\n");
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800213 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000214
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800215 if (strcmp(cmdResult, "OK") != 0) {
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +0200216 RETURN_STA_CMD_ERROR(staAssocResp, STATUS_ERROR,
217 "associate network failed, error: %s\n", cmdResult);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800218 }
219
220 staAssocResp->status = STATUS_COMPLETE;
221 wfaEncodeTLV(WFA_STA_ASSOCIATE_RESP_TLV, 4, (BYTE*)staAssocResp, respBuf);
222 *respLen = WFA_TLV_HDR_LEN + 4;
223
224 return WFA_SUCCESS;
Dake Zhao0a832172015-01-06 11:08:47 -0800225}
226
227/*
228 * wfaStaReAssociate():
229 * The function is to force the station wireless I/F to re/associate
230 * with the AP.
231 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800232int wfaStaReAssociate(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
233 dutCommand_t* assoc = (dutCommand_t*)caCmdBuf;
234 char* ifname = assoc->intf;
235 dutCmdResponse_t* staAssocResp = &gGenericResp;
Dake Zhao0a832172015-01-06 11:08:47 -0800236
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800237 DPRINT_INFO(WFA_OUT, "entering wfaStaAssociate ...\n");
238 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800239 * if bssid appears, station should associate with the specific
240 * BSSID AP at its initial association.
241 * If it is different to the current associating AP, it will be forced to
242 * roam the new AP
243 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800244 if (assoc->cmdsu.assoc.bssid[0] != '\0') {
245 /* if (the first association) */
246 /* just do initial association to the BSSID */
Dake Zhao0a832172015-01-06 11:08:47 -0800247
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800248 /* else (station already associate to an AP) */
249 /* Do forced roaming */
Dake Zhao0a832172015-01-06 11:08:47 -0800250
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800251 } else {
252 /* use 'ifconfig' command to bring down the interface (linux specific) */
253 sprintf(gCmdStr, "ifconfig %s down", ifname);
254 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -0800255
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800256 /* use 'ifconfig' command to bring up the interface (linux specific) */
257 sprintf(gCmdStr, "ifconfig %s up", ifname);
Dake Zhao0a832172015-01-06 11:08:47 -0800258
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800259 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800260 * use 'wpa_cli' command to force a 802.11 re/associate
261 * (wpa_supplicant specific)
262 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800263 sprintf(gCmdStr, "wpa_cli.sh -i%s reassociate", ifname);
264 sret = systemWithLog(gCmdStr);
265 }
Dake Zhao0a832172015-01-06 11:08:47 -0800266
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800267 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800268 * Then report back to control PC for completion.
269 * This does not have failed/error status. The result only tells
270 * a completion.
271 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800272 staAssocResp->status = STATUS_COMPLETE;
273 wfaEncodeTLV(WFA_STA_ASSOCIATE_RESP_TLV, 4, (BYTE*)staAssocResp, respBuf);
274 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -0800275
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800276 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000277}
278
279/*
280 * wfaStaIsConnected():
Dake Zhao0a832172015-01-06 11:08:47 -0800281 * The function is to check whether the station's wireless I/F has
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000282 * already connected to an AP.
283 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800284int wfaStaIsConnected(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
285 dutCommand_t* connStat = (dutCommand_t*)caCmdBuf;
286 dutCmdResponse_t* staConnectResp = &gGenericResp;
287 char* ifname = connStat->intf;
288 FILE* tmpfile = NULL;
289 char result[32];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000290
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800291 DPRINT_INFO(WFA_OUT, "Entering isConnected ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000292
293#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800294 sprintf(gCmdStr, "wfa_chkconnect %s\n", ifname);
295 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000296
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800297 if (chk_ret_status() == WFA_SUCCESS)
298 staConnectResp->cmdru.connected = 1;
299 else
300 staConnectResp->cmdru.connected = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000301#else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800302 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800303 * use 'wpa_cli' command to check the interface status
304 * none, scanning or complete (wpa_supplicant specific)
305 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800306 sprintf(gCmdStr,
307 "wpa_cli.sh -i%s status | grep ^wpa_state= | cut -f2- -d= > "
308 "/tmp/.isConnected",
309 ifname);
310 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000311
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800312 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800313 * the status is saved in a file. Open the file and check it.
314 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800315 tmpfile = fopen("/tmp/.isConnected", "r+");
316 if (tmpfile == NULL) {
317 staConnectResp->status = STATUS_ERROR;
318 wfaEncodeTLV(WFA_STA_IS_CONNECTED_RESP_TLV, 4, (BYTE*)staConnectResp,
319 respBuf);
320 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000321
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800322 DPRINT_ERR(WFA_ERR, "file open failed\n");
323 return WFA_FAILURE;
324 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000325
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800326 sret = fscanf(tmpfile, "%s", (char*)result);
327 fclose(tmpfile);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000328
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800329 if (strncmp(result, "COMPLETED", 9) == 0)
330 staConnectResp->cmdru.connected = 1;
331 else
332 staConnectResp->cmdru.connected = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000333#endif
334
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800335 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800336 * Report back the status: Complete or Failed.
337 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800338 staConnectResp->status = STATUS_COMPLETE;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000339
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800340 wfaEncodeTLV(WFA_STA_IS_CONNECTED_RESP_TLV, sizeof(dutCmdResponse_t),
341 (BYTE*)staConnectResp, respBuf);
342 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -0800343
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800344 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000345}
346
347/*
348 * wfaStaGetIpConfig():
349 * This function is to retriev the ip info including
350 * 1. dhcp enable
351 * 2. ip address
Dake Zhao0a832172015-01-06 11:08:47 -0800352 * 3. mask
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000353 * 4. primary-dns
354 * 5. secondary-dns
355 *
356 * The current implementation is to use a script to find these information
Dake Zhao0a832172015-01-06 11:08:47 -0800357 * and store them in a file.
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000358 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800359int wfaStaGetIpConfig(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
360 int slen, i = 0;
361 dutCommand_t* getIpConf = (dutCommand_t*)caCmdBuf;
362 dutCmdResponse_t* ipconfigResp = &gGenericResp;
363 char* ifname = getIpConf->intf;
364 caStaGetIpConfigResp_t* ifinfo = &ipconfigResp->cmdru.getIfconfig;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000365
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800366 FILE* tmpfd;
367 char string[256];
368 char* str;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000369
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800370 strcpy(ifinfo->dns[0], "0");
371 strcpy(ifinfo->dns[1], "0");
Dake Zhao0a832172015-01-06 11:08:47 -0800372
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800373 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800374 * Run the script file "getipconfig.sh" to check the ip status
375 * (current implementation specific).
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000376 * note: "getipconfig.sh" is only defined for the current implementation
Wojciech Jakobczyk71542532020-08-28 10:52:00 +0200377 *
378 * Example output:
379 * dhcpcli=/sbin/dhcpcd
380 *
381 * mac=50:e0:85:5f:e9:93
382 * ipaddr=192.168.0.116
383 * bcast=192.168.0.255
384 * mask=255.255.255.0
385 * nameserver 192.168.0.1
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000386 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800387 sprintf(gCmdStr, "getipconfig.sh /tmp/ipconfig.txt %s\n", ifname);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000388
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800389 sret = systemWithLog(gCmdStr);
390 if (sret != 0) {
391 ipconfigResp->status = STATUS_ERROR;
392 wfaEncodeTLV(WFA_STA_GET_IP_CONFIG_RESP_TLV, 4, (BYTE*)ipconfigResp,
393 respBuf);
394 *respLen = WFA_TLV_HDR_LEN + 4;
Wojciech Jakobczyk71542532020-08-28 10:52:00 +0200395
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800396 DPRINT_ERR(WFA_ERR, "error from getipconfig exec: %d\n", sret);
397 return WFA_FAILURE;
398 }
399
400 /* open the output result and scan/retrieve the info */
401 tmpfd = fopen("/tmp/ipconfig.txt", "r+");
402
403 if (tmpfd == NULL) {
404 ipconfigResp->status = STATUS_ERROR;
405 wfaEncodeTLV(WFA_STA_GET_IP_CONFIG_RESP_TLV, 4, (BYTE*)ipconfigResp,
406 respBuf);
407 *respLen = WFA_TLV_HDR_LEN + 4;
408
409 DPRINT_ERR(WFA_ERR, "file open failed\n");
410 return WFA_FAILURE;
411 }
412
413 for (;;) {
414 if (fgets(string, 256, tmpfd) == NULL)
415 break;
416
417 /* check dhcp enabled */
418 if (strncmp(string, "dhcpcli", 7) == 0) {
419 str = strtok(string, "=");
420 str = strtok(NULL, "=");
421 if (str != NULL)
422 ifinfo->isDhcp = 1;
423 else
424 ifinfo->isDhcp = 0;
Wojciech Jakobczyk71542532020-08-28 10:52:00 +0200425 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000426
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800427 if (strncmp(string, "ipaddr", 6) == 0) {
428 str = strchr(string, '=');
429 if (str != NULL) {
430 strcpy(ifinfo->ipaddr, str + 1);
431 slen = strlen(ifinfo->ipaddr);
432 ifinfo->ipaddr[slen - 1] = '\0';
433 } else
434 strcpy(ifinfo->ipaddr, "none");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000435 }
436
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800437 /* check the mask */
438 if (strncmp(string, "mask", 4) == 0) {
439 str = strchr(string, '=');
440 if (str != NULL) {
441 strcpy(ifinfo->mask, str + 1);
442 slen = strlen(ifinfo->mask);
443 ifinfo->mask[slen - 1] = '\0';
444 } else
445 strcpy(ifinfo->mask, "none");
Dake Zhao0a832172015-01-06 11:08:47 -0800446 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000447
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800448 /* find out the dns server ip address */
449 if (strncmp(string, "nameserv", 8) == 0) {
450 str = strchr(string, ' ');
451 if (str != NULL && i < 2) {
452 strcpy(ifinfo->dns[i], str + 1);
453 slen = strlen(ifinfo->dns[i]);
454 ifinfo->dns[i][slen - 1] = '\0';
455 } else
456 strcpy(ifinfo->dns[i], "none");
457
458 i++;
459 }
460 }
461
462 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800463 * Report back the results
464 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800465 ipconfigResp->status = STATUS_COMPLETE;
466 wfaEncodeTLV(WFA_STA_GET_IP_CONFIG_RESP_TLV, sizeof(dutCmdResponse_t),
467 (BYTE*)ipconfigResp, respBuf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000468
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800469 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000470
471#if 0
Dake Zhao0a832172015-01-06 11:08:47 -0800472 DPRINT_INFO(WFA_OUT, "%i %i %s %s %s %s %i\n", ipconfigResp->status,
473 ifinfo->isDhcp, ifinfo->ipaddr, ifinfo->mask,
474 ifinfo->dns[0], ifinfo->dns[1], *respLen);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000475#endif
476
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800477 fclose(tmpfd);
478 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000479}
480
481/*
482 * wfaStaSetIpConfig():
483 * The function is to set the ip configuration to a wireless I/F.
484 * 1. IP address
485 * 2. Mac address
486 * 3. default gateway
Dake Zhao0a832172015-01-06 11:08:47 -0800487 * 4. dns nameserver (pri and sec).
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000488 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800489int wfaStaSetIpConfig(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
490 dutCommand_t* setIpConf = (dutCommand_t*)caCmdBuf;
491 caStaSetIpConfig_t* ipconfig = &setIpConf->cmdsu.ipconfig;
492 dutCmdResponse_t* staSetIpResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000493
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800494 DPRINT_INFO(WFA_OUT, "entering wfaStaSetIpConfig ...\n");
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200495
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800496 if (ipconfig->isDhcp) {
497 DPRINT_INFO(WFA_OUT, "error: dhcp not supported\n");
498 staSetIpResp->status = STATUS_INVALID;
499 wfaEncodeTLV(WFA_STA_SET_IP_CONFIG_RESP_TLV, 4, (BYTE*)staSetIpResp,
500 respBuf);
501 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000502
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800503 return WFA_FAILURE;
504 }
505
506 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800507 * Use command 'ifconfig' to configure the interface ip address, mask.
508 * (Linux specific).
509 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800510 sprintf(gCmdStr, "ifconfig %s %s netmask %s >/tmp/ifconfig.log 2>&1",
511 ipconfig->intf, ipconfig->ipaddr, ipconfig->mask);
512 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
513 sret = systemWithLog(gCmdStr);
514 if (sret != 0) {
515 DPRINT_INFO(WFA_OUT, "exit code %d\n", sret);
516 }
517
518 /* use command 'route add' to set set gatewway (linux specific) */
519 if (ipconfig->defGateway[0] != '\0') {
520 sprintf(gCmdStr, "route add default gw %s >/tmp/route.log 2>&1",
521 ipconfig->defGateway);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200522 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +0200523 sret = systemWithLog(gCmdStr);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200524 if (sret != 0) {
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800525 DPRINT_INFO(WFA_OUT, "exit code %d\n", sret);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200526 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800527 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000528
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800529 /* set dns (linux specific) */
530 sprintf(gCmdStr, "cp /etc/resolv.conf /tmp/resolv.conf.bk");
531 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
532 sret = systemWithLog(gCmdStr);
533 if (sret != 0) {
534 DPRINT_INFO(WFA_OUT, "exit code %d backing up resolv.conf\n", sret);
535 }
Shuo-Peng Liao4a6d4ca2020-09-30 19:16:18 +0800536 sprintf(gCmdStr, "echo nameserver %s > /etc/resolv.conf", ipconfig->pri_dns);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800537 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
538 sret = systemWithLog(gCmdStr);
539 if (sret != 0) {
540 DPRINT_INFO(WFA_OUT, "exit code %d writing resolv.conf\n", sret);
541 }
542 if (strlen(ipconfig->sec_dns) > 0) {
Shuo-Peng Liao4a6d4ca2020-09-30 19:16:18 +0800543 sprintf(gCmdStr, "echo nameserver %s >> /etc/resolv.conf",
544 ipconfig->sec_dns);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200545 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +0200546 sret = systemWithLog(gCmdStr);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200547 if (sret != 0) {
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800548 DPRINT_INFO(WFA_OUT, "exit code %d writing resolv.conf\n", sret);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200549 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800550 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000551
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800552 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800553 * report status
554 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800555 staSetIpResp->status = STATUS_COMPLETE;
556 wfaEncodeTLV(WFA_STA_SET_IP_CONFIG_RESP_TLV, 4, (BYTE*)staSetIpResp, respBuf);
557 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000558
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800559 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000560}
561
562/*
563 * wfaStaVerifyIpConnection():
564 * The function is to verify if the station has IP connection with an AP by
565 * send ICMP/pings to the AP.
Dake Zhao0a832172015-01-06 11:08:47 -0800566 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800567int wfaStaVerifyIpConnection(int len,
568 BYTE* caCmdBuf,
569 int* respLen,
570 BYTE* respBuf) {
571 dutCommand_t* verip = (dutCommand_t*)caCmdBuf;
572 dutCmdResponse_t* verifyIpResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000573
574#ifndef WFA_PING_UDP_ECHO_ONLY
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800575 char strout[64], *pcnt;
576 FILE* tmpfile;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000577
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800578 DPRINT_INFO(WFA_OUT, "Entering wfaStaVerifyIpConnection ...\n");
Dake Zhao0a832172015-01-06 11:08:47 -0800579
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800580 /* set timeout value in case not set */
581 if (verip->cmdsu.verifyIp.timeout <= 0) {
582 verip->cmdsu.verifyIp.timeout = 10;
583 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000584
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800585 /* execute the ping command and pipe the result to a tmp file */
586 sprintf(gCmdStr,
587 "ping %s -c 3 -W %u | grep loss | cut -f3 -d, 1>& /tmp/pingout.txt",
588 verip->cmdsu.verifyIp.dipaddr, verip->cmdsu.verifyIp.timeout);
589 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000590
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800591 /* scan/check the output */
592 tmpfile = fopen("/tmp/pingout.txt", "r+");
593 if (tmpfile == NULL) {
594 verifyIpResp->status = STATUS_ERROR;
595 wfaEncodeTLV(WFA_STA_VERIFY_IP_CONNECTION_RESP_TLV, 4, (BYTE*)verifyIpResp,
596 respBuf);
597 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000598
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800599 DPRINT_ERR(WFA_ERR, "file open failed\n");
600 return WFA_FAILURE;
601 }
Dake Zhao0a832172015-01-06 11:08:47 -0800602
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800603 verifyIpResp->status = STATUS_COMPLETE;
604 if (fscanf(tmpfile, "%s", strout) == EOF)
Dake Zhao0a832172015-01-06 11:08:47 -0800605 verifyIpResp->cmdru.connected = 0;
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800606 else {
607 pcnt = strtok(strout, "%");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000608
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800609 /* if the loss rate is 100%, not able to connect */
610 if (atoi(pcnt) == 100)
611 verifyIpResp->cmdru.connected = 0;
612 else
613 verifyIpResp->cmdru.connected = 1;
614 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000615
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800616 fclose(tmpfile);
617#else
618 int btSockfd;
619 struct pollfd fds[2];
620 int timeout = 2000;
621 char anyBuf[64];
622 struct sockaddr_in toAddr;
623 int done = 1, cnt = 0, ret, nbytes;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000624
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800625 verifyIpResp->status = STATUS_COMPLETE;
626 verifyIpResp->cmdru.connected = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000627
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800628 btSockfd = wfaCreateUDPSock("127.0.0.1", WFA_UDP_ECHO_PORT);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000629
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800630 if (btSockfd == -1) {
631 verifyIpResp->status = STATUS_ERROR;
632 wfaEncodeTLV(WFA_STA_VERIFY_IP_CONNECTION_RESP_TLV, 4, (BYTE*)verifyIpResp,
633 respBuf);
634 *respLen = WFA_TLV_HDR_LEN + 4;
635 return WFA_FAILURE;
636 ;
637 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000638
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800639 toAddr.sin_family = AF_INET;
640 toAddr.sin_addr.s_addr = inet_addr(verip->cmdsu.verifyIp.dipaddr);
641 toAddr.sin_port = htons(WFA_UDP_ECHO_PORT);
642
643 while (done) {
644 wfaTrafficSendTo(btSockfd, (char*)anyBuf, 64, (struct sockaddr*)&toAddr);
645 cnt++;
646
647 fds[0].fd = btSockfd;
648 fds[0].events = POLLIN | POLLOUT;
649
650 ret = poll(fds, 1, timeout);
651 switch (ret) {
652 case 0:
653 /* it is time out, count a packet lost*/
654 break;
655 case -1:
656 /* it is an error */
657 default: {
658 switch (fds[0].revents) {
659 case POLLIN:
660 case POLLPRI:
661 case POLLOUT:
662 nbytes = wfaTrafficRecv(btSockfd, (char*)anyBuf,
663 (struct sockaddr*)&toAddr);
664 if (nbytes != 0)
665 verifyIpResp->cmdru.connected = 1;
Dake Zhao0a832172015-01-06 11:08:47 -0800666 done = 0;
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800667 break;
668 default:
669 /* errors but not care */
670 ;
Dake Zhao0a832172015-01-06 11:08:47 -0800671 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800672 }
Dake Zhao0a832172015-01-06 11:08:47 -0800673 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800674 if (cnt == 3) {
675 done = 0;
676 }
677 }
Dake Zhao0a832172015-01-06 11:08:47 -0800678
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000679#endif
680
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800681 wfaEncodeTLV(WFA_STA_VERIFY_IP_CONNECTION_RESP_TLV, sizeof(dutCmdResponse_t),
682 (BYTE*)verifyIpResp, respBuf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000683
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800684 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -0800685
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800686 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000687}
688
689/*
690 * wfaStaGetMacAddress()
691 * This function is to retrieve the MAC address of a wireless I/F.
692 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800693int wfaStaGetMacAddress(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
694 dutCommand_t* getMac = (dutCommand_t*)caCmdBuf;
695 dutCmdResponse_t* getmacResp = &gGenericResp;
696 char* str;
697 char* ifname = getMac->intf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000698
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800699 FILE* tmpfd;
700 char string[257];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000701
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800702 DPRINT_INFO(WFA_OUT, "Entering wfaStaGetMacAddress ...\n");
703 /*
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000704 * run the script "getipconfig.sh" to find out the mac
705 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800706 sprintf(gCmdStr, "ifconfig %s > /tmp/ipconfig.txt ", ifname);
707 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000708
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800709 tmpfd = fopen("/tmp/ipconfig.txt", "r+");
710 if (tmpfd == NULL) {
711 getmacResp->status = STATUS_ERROR;
712 wfaEncodeTLV(WFA_STA_GET_MAC_ADDRESS_RESP_TLV, 4, (BYTE*)getmacResp,
713 respBuf);
714 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000715
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800716 DPRINT_ERR(WFA_ERR, "file open failed\n");
717 return WFA_FAILURE;
718 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000719
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800720 if (fgets((char*)&string[0], 256, tmpfd) == NULL) {
721 getmacResp->status = STATUS_ERROR;
722 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -0800723
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800724 str = strtok(string, " ");
725 while (str && ((strcmp(str, "HWaddr")) != 0)) {
726 str = strtok(NULL, " ");
727 }
Dake Zhao0a832172015-01-06 11:08:47 -0800728
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800729 /* get mac */
730 if (str) {
731 str = strtok(NULL, " ");
732 strcpy(getmacResp->cmdru.mac, str);
733 getmacResp->status = STATUS_COMPLETE;
734 }
Dake Zhao0a832172015-01-06 11:08:47 -0800735
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800736 wfaEncodeTLV(WFA_STA_GET_MAC_ADDRESS_RESP_TLV, sizeof(dutCmdResponse_t),
737 (BYTE*)getmacResp, respBuf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000738
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800739 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000740
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800741 fclose(tmpfd);
742 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000743}
744
745/*
746 * wfaStaGetStats():
Dake Zhao0a832172015-01-06 11:08:47 -0800747 * The function is to retrieve the statistics of the I/F's layer 2 txFrames,
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000748 * rxFrames, txMulticast, rxMulticast, fcsErrors/crc, and txRetries.
Dake Zhao0a832172015-01-06 11:08:47 -0800749 * Currently there is not definition how to use these info.
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000750 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800751int wfaStaGetStats(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
752 dutCmdResponse_t* statsResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000753
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800754 /* this is never used, you can skip this call */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000755
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800756 statsResp->status = STATUS_ERROR;
757 wfaEncodeTLV(WFA_STA_GET_STATS_RESP_TLV, sizeof(dutCmdResponse_t),
758 (BYTE*)statsResp, respBuf);
759 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000760
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800761 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000762}
763
764/*
765 * wfaSetEncryption():
766 * The function is to set the wireless interface with WEP or none.
767 *
Dake Zhao0a832172015-01-06 11:08:47 -0800768 * Since WEP is optional test, current function is only used for
769 * resetting the Security to NONE/Plaintext (OPEN). To test WEP,
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000770 * this function should be replaced by the next one (wfaSetEncryption1())
771 *
Dake Zhao0a832172015-01-06 11:08:47 -0800772 * Input parameters:
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000773 * 1. I/F
774 * 2. ssid
775 * 3. encpType - wep or none
776 * Optional:
777 * 4. key1
778 * 5. key2
779 * 6. key3
780 * 7. key4
781 * 8. activeKey Index
782 */
783
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800784int wfaSetEncryption1(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
785 caStaSetEncryption_t* setEncryp = (caStaSetEncryption_t*)caCmdBuf;
786 dutCmdResponse_t* setEncrypResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000787
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800788 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800789 * disable the network first
790 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800791 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", setEncryp->intf);
792 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000793
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800794 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800795 * set SSID
796 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800797 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'",
798 setEncryp->intf, setEncryp->ssid);
799 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000800
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800801 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800802 * Tell the supplicant for infrastructure mode (1)
803 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800804 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 mode 0", setEncryp->intf);
805 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000806
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800807 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800808 * set Key management to NONE (NO WPA) for plaintext or WEP
809 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800810 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt NONE",
811 setEncryp->intf);
812 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000813
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800814 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setEncryp->intf);
815 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000816
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800817 setEncrypResp->status = STATUS_COMPLETE;
818 wfaEncodeTLV(WFA_STA_SET_ENCRYPTION_RESP_TLV, 4, (BYTE*)setEncrypResp,
819 respBuf);
820 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -0800821
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800822 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000823}
824
825/*
826 * Since WEP is optional, this function could be used to replace
Dake Zhao0a832172015-01-06 11:08:47 -0800827 * wfaSetEncryption() if necessary.
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000828 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800829int wfaSetEncryption(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
830 caStaSetEncryption_t* setEncryp = (caStaSetEncryption_t*)caCmdBuf;
831 dutCmdResponse_t* setEncrypResp = &gGenericResp;
832 int i;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000833
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800834 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800835 * disable the network first
836 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800837 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", setEncryp->intf);
838 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000839
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800840 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800841 * set SSID
842 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800843 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'",
844 setEncryp->intf, setEncryp->ssid);
845 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000846
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800847 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800848 * Tell the supplicant for infrastructure mode (1)
849 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800850 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 mode 0", setEncryp->intf);
851 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000852
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800853 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800854 * set Key management to NONE (NO WPA) for plaintext or WEP
855 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800856 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt NONE",
857 setEncryp->intf);
858 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000859
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800860 /* set keys */
861 if (setEncryp->encpType == 1) {
862 for (i = 0; i < 4; i++) {
863 if (setEncryp->keys[i][0] != '\0') {
864 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_key%i %s",
865 setEncryp->intf, i, setEncryp->keys[i]);
866 systemWithLog(gCmdStr);
867 }
Dake Zhao0a832172015-01-06 11:08:47 -0800868 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000869
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800870 /* set active key */
871 i = setEncryp->activeKeyIdx;
872 if (setEncryp->keys[i][0] != '\0') {
873 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_tx_keyidx %i",
874 setEncryp->intf, setEncryp->activeKeyIdx);
875 systemWithLog(gCmdStr);
876 }
877 } else /* clearly remove the keys -- reported by p.schwann */
878 {
879 for (i = 0; i < 4; i++) {
880 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_key%i \"\"",
881 setEncryp->intf, i);
882 systemWithLog(gCmdStr);
883 }
884 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000885
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800886 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setEncryp->intf);
887 systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -0800888
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800889 setEncrypResp->status = STATUS_COMPLETE;
890 wfaEncodeTLV(WFA_STA_SET_ENCRYPTION_RESP_TLV, sizeof(setEncrypResp->status),
891 (BYTE*)setEncrypResp, respBuf);
892 *respLen = WFA_TLV_HDR_LEN + sizeof(setEncrypResp->status);
893
894 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000895}
896
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800897int wfaStaSetSecurity(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
898 int ret = WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000899
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800900 return ret;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000901}
902
903/*
904 * wfaStaSetEapTLS():
905 * This is to set
906 * 1. ssid
907 * 2. encrypType - tkip or aes-ccmp
908 * 3. keyManagementType - wpa or wpa2
909 * 4. trustedRootCA
910 * 5. clientCertificate
911 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800912int wfaStaSetEapTLS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
913 caStaSetEapTLS_t* setTLS = (caStaSetEapTLS_t*)caCmdBuf;
914 char* ifname = setTLS->intf;
915 dutCmdResponse_t* setEapTlsResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000916
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800917 DPRINT_INFO(WFA_OUT, "Entering wfaStaSetEapTLS ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000918
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800919 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800920 * need to store the trustedROOTCA and clientCertificate into a file first.
921 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000922#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800923 sprintf(gCmdStr, "wfa_set_eaptls -i %s %s %s %s", ifname, setTLS->ssid,
924 setTLS->trustedRootCA, setTLS->clientCertificate);
925 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000926#else
927
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800928 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
929 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000930
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800931 /* ssid */
932 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
933 setTLS->ssid);
934 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000935
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800936 /* key management */
937 if (strcasecmp(setTLS->keyMgmtType, "wpa2-sha256") == 0) {
938 } else if (strcasecmp(setTLS->keyMgmtType, "wpa2-eap") == 0) {
939 } else if (strcasecmp(setTLS->keyMgmtType, "wpa2-ft") == 0) {
940 } else if (strcasecmp(setTLS->keyMgmtType, "wpa") == 0) {
941 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
942 } else if (strcasecmp(setTLS->keyMgmtType, "wpa2") == 0) {
943 // to take all and device to pick any one supported.
944 } else {
945 // ??
946 }
947 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000948
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800949 /* protocol WPA */
950 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA", ifname);
951 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000952
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800953 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap TLS", ifname);
954 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000955
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800956 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ca_cert '\"%s\"'", ifname,
957 setTLS->trustedRootCA);
958 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000959
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800960 sprintf(
961 gCmdStr,
962 "wpa_cli.sh -i %s set_network 0 identity '\"wifi-user@wifilabs.local\"'",
963 ifname);
964 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000965
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800966 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 private_key '\"%s/%s\"'",
967 ifname, CERTIFICATES_PATH, setTLS->clientCertificate);
968 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000969
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800970 sprintf(gCmdStr,
971 "wpa_cli.sh -i %s set_network 0 private_key_passwd '\"wifi\"'",
972 ifname);
973 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000974
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800975 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
976 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000977#endif
978
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800979 setEapTlsResp->status = STATUS_COMPLETE;
980 wfaEncodeTLV(WFA_STA_SET_EAPTLS_RESP_TLV, 4, (BYTE*)setEapTlsResp, respBuf);
981 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000982
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800983 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000984}
985
986/*
Dake Zhao0a832172015-01-06 11:08:47 -0800987 * The function is to set
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000988 * 1. ssid
989 * 2. passPhrase
990 * 3. keyMangementType - wpa/wpa2
991 * 4. encrypType - tkip or aes-ccmp
992 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800993int wfaStaSetPSK(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
994 /*Incompleted function*/
995 dutCmdResponse_t* setPskResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000996
Dake Zhaob7ed41a2014-12-04 11:24:58 -0800997#ifndef WFA_PC_CONSOLE
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800998 caStaSetPSK_t* setPSK = (caStaSetPSK_t*)caCmdBuf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000999#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001000 sprintf(gCmdStr, "wfa_set_psk %s %s %s", setPSK->intf, setPSK->ssid,
1001 setPSK->passphrase);
1002 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001003#else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001004 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", setPSK->intf,
1005 setPSK->ssid);
1006 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001007
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001008 if (strcasecmp(setPSK->keyMgmtType, "wpa2-sha256") == 0)
1009 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA2-SHA256",
1010 setPSK->intf);
1011 else if (strcasecmp(setPSK->keyMgmtType, "wpa2") == 0) {
1012 // take all and device to pick it supported.
1013 } else if (strcasecmp(setPSK->keyMgmtType, "wpa2-psk") == 0) {
1014 } else if (strcasecmp(setPSK->keyMgmtType, "wpa2-ft") == 0) {
1015 } else if (strcasecmp(setPSK->keyMgmtType, "wpa2-wpa-psk") == 0) {
1016 } else
1017 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-PSK",
1018 setPSK->intf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001019
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001020 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001021
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001022 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 psk '\"%s\"'", setPSK->intf,
1023 setPSK->passphrase);
1024 sret = systemWithLog(gCmdStr);
Ray Wang9c508692014-04-01 17:04:59 -07001025
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001026 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setPSK->intf);
1027 sret = systemWithLog(gCmdStr);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08001028
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001029 /* if PMF enable */
1030 if (setPSK->pmf == WFA_ENABLED || setPSK->pmf == WFA_OPTIONAL) {
1031 } else if (setPSK->pmf == WFA_REQUIRED) {
1032 } else if (setPSK->pmf == WFA_F_REQUIRED) {
1033 } else if (setPSK->pmf == WFA_F_DISABLED) {
1034 } else {
1035 /* Disable PMF */
1036 }
Dake Zhao0a832172015-01-06 11:08:47 -08001037
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001038#endif
1039
Dake Zhaob7ed41a2014-12-04 11:24:58 -08001040#endif
1041
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001042 setPskResp->status = STATUS_COMPLETE;
1043 wfaEncodeTLV(WFA_STA_SET_PSK_RESP_TLV, 4, (BYTE*)setPskResp, respBuf);
1044 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001045
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001046 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001047}
1048
1049/*
Dake Zhao0a832172015-01-06 11:08:47 -08001050 * wfaStaGetInfo():
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001051 * Get vendor specific information in name/value pair by a wireless I/F.
1052 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001053int wfaStaGetInfo(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1054 dutCmdResponse_t infoResp;
1055 dutCommand_t* getInfo = (dutCommand_t*)caCmdBuf;
1056 FILE* tmpfd;
1057 char vendor[256];
1058 const char* vendorFileName = "/tmp/ifvendor.txt";
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001059
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001060 sprintf(gCmdStr, "getifvendor.sh %s %s\n", getInfo->intf, vendorFileName);
Wojciech Jakobczykb8af9922020-08-25 14:49:44 +02001061
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001062 if (systemWithLog(gCmdStr) == -1) {
1063 infoResp.status = STATUS_ERROR;
1064 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(infoResp.status),
1065 (BYTE*)&infoResp, respBuf);
Wojciech Jakobczykb8af9922020-08-25 14:49:44 +02001066 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp.status);
Dake Zhao0a832172015-01-06 11:08:47 -08001067
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001068 DPRINT_ERR(WFA_ERR, "script %s failed\n", vendorFileName);
1069 return WFA_FAILURE;
1070 }
1071
1072 /* open the output result and scan/retrieve the info */
1073 tmpfd = fopen(vendorFileName, "r+");
1074
1075 if (tmpfd == NULL || fgets(vendor, 256, tmpfd) == NULL) {
1076 infoResp.status = STATUS_ERROR;
1077 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(infoResp.status),
1078 (BYTE*)&infoResp, respBuf);
1079 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp.status);
1080
1081 DPRINT_ERR(WFA_ERR, "file read failed\n");
1082
1083 if (tmpfd != NULL) {
1084 fclose(tmpfd);
1085 remove(vendorFileName);
1086 }
1087
1088 return WFA_FAILURE;
1089 }
1090
1091 snprintf(infoResp.cmdru.info, sizeof(infoResp.cmdru.info),
1092 "interface,%s,description,%s", getInfo->intf, vendor);
1093
1094 infoResp.status = STATUS_COMPLETE;
Shuo-Peng Liaob35966c2020-09-28 12:30:10 +08001095 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(dutCmdResponse_t),
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001096 (BYTE*)&infoResp, respBuf);
Shuo-Peng Liaob35966c2020-09-28 12:30:10 +08001097 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001098
1099 fclose(tmpfd);
1100 remove(vendorFileName);
1101
1102 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001103}
1104
1105/*
1106 * wfaStaSetEapTTLS():
1107 * This is to set
1108 * 1. ssid
1109 * 2. username
1110 * 3. passwd
1111 * 4. encrypType - tkip or aes-ccmp
1112 * 5. keyManagementType - wpa or wpa2
1113 * 6. trustedRootCA
1114 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001115int wfaStaSetEapTTLS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1116 caStaSetEapTTLS_t* setTTLS = (caStaSetEapTTLS_t*)caCmdBuf;
1117 char* ifname = setTTLS->intf;
1118 dutCmdResponse_t* setEapTtlsResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001119
1120#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001121 sprintf(gCmdStr, "wfa_set_eapttls %s %s %s %s %s", ifname, setTTLS->ssid,
1122 setTTLS->username, setTTLS->passwd, setTTLS->trustedRootCA);
1123 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001124#else
1125
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001126 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1127 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001128
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001129 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1130 setTTLS->ssid);
1131 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001132
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001133 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1134 setTTLS->username);
1135 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001136
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001137 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
1138 setTTLS->passwd);
1139 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001140
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001141 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1142 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001143
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001144 /* This may not need to set. if it is not set, default to take all */
1145 // sprintf(cmdStr, "wpa_cli.sh -i %s set_network 0 pairwise '\"%s\"", ifname, setTTLS->encrptype);
1146 if (strcasecmp(setTTLS->keyMgmtType, "wpa2-sha256") == 0) {
1147 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa2-eap") == 0) {
1148 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa2-ft") == 0) {
1149 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa") == 0) {
1150 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa2") == 0) {
1151 // to take all and device to pick one it supported
1152 } else {
1153 // ??
1154 }
1155 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001156
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001157 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap TTLS", ifname);
1158 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001159
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001160 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ca_cert '\"%s/%s\"'", ifname,
1161 CERTIFICATES_PATH, setTTLS->trustedRootCA);
1162 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001163
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001164 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA", ifname);
1165 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001166
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001167 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase2 '\"auth=MSCHAPV2\"'",
1168 ifname);
1169 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001170
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001171 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
1172 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001173#endif
1174
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001175 setEapTtlsResp->status = STATUS_COMPLETE;
1176 wfaEncodeTLV(WFA_STA_SET_EAPTTLS_RESP_TLV, 4, (BYTE*)setEapTtlsResp, respBuf);
1177 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001178
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001179 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001180}
1181
1182/*
1183 * wfaStaSetEapSIM():
1184 * This is to set
1185 * 1. ssid
1186 * 2. user name
1187 * 3. passwd
1188 * 4. encrypType - tkip or aes-ccmp
1189 * 5. keyMangementType - wpa or wpa2
1190 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001191int wfaStaSetEapSIM(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1192 caStaSetEapSIM_t* setSIM = (caStaSetEapSIM_t*)caCmdBuf;
1193 char* ifname = setSIM->intf;
1194 dutCmdResponse_t* setEapSimResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001195
1196#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001197 sprintf(gCmdStr, "wfa_set_eapsim %s %s %s %s", ifname, setSIM->ssid,
1198 setSIM->username, setSIM->encrptype);
1199 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001200#else
1201
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001202 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1203 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001204
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001205 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1206 setSIM->ssid);
1207 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001208
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001209 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1210 setSIM->username);
1211 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001212
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001213 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 pairwise '\"%s\"'", ifname,
1214 setSIM->encrptype);
1215 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001216
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001217 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap SIM", ifname);
1218 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001219
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001220 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA", ifname);
1221 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001222
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001223 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
1224 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001225
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001226 if (strcasecmp(setSIM->keyMgmtType, "wpa2-sha256") == 0) {
1227 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-SHA256",
1228 ifname);
1229 } else if (strcasecmp(setSIM->keyMgmtType, "wpa2-eap") == 0) {
1230 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1231 } else if (strcasecmp(setSIM->keyMgmtType, "wpa2-ft") == 0) {
1232 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-FT", ifname);
1233 } else if (strcasecmp(setSIM->keyMgmtType, "wpa") == 0) {
1234 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1235 } else if (strcasecmp(setSIM->keyMgmtType, "wpa2") == 0) {
1236 // take all and device to pick one which is supported.
1237 } else {
1238 // ??
1239 }
1240 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001241
1242#endif
1243
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001244 setEapSimResp->status = STATUS_COMPLETE;
1245 wfaEncodeTLV(WFA_STA_SET_EAPSIM_RESP_TLV, 4, (BYTE*)setEapSimResp, respBuf);
1246 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001247
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001248 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001249}
1250
1251/*
1252 * wfaStaSetPEAP()
1253 * This is to set
1254 * 1. ssid
1255 * 2. user name
1256 * 3. passwd
1257 * 4. encryType - tkip or aes-ccmp
1258 * 5. keyMgmtType - wpa or wpa2
1259 * 6. trustedRootCA
1260 * 7. innerEAP
1261 * 8. peapVersion
1262 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001263int wfaStaSetPEAP(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1264 caStaSetEapPEAP_t* setPEAP = (caStaSetEapPEAP_t*)caCmdBuf;
1265 char* ifname = setPEAP->intf;
1266 dutCmdResponse_t* setPeapResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001267
1268#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001269 sprintf(gCmdStr, "wfa_set_peap %s %s %s %s %s %s %i %s", ifname,
1270 setPEAP->ssid, setPEAP->username, setPEAP->passwd,
1271 setPEAP->trustedRootCA, setPEAP->encrptype, setPEAP->peapVersion,
1272 setPEAP->innerEAP);
1273 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001274#else
1275
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001276 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1277 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001278
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001279 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1280 setPEAP->ssid);
1281 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001282
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001283 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap PEAP", ifname);
1284 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001285
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001286 sprintf(gCmdStr,
1287 "wpa_cli.sh -i %s set_network 0 anonymous_identity '\"anonymous\"' ",
1288 ifname);
1289 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001290
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001291 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1292 setPEAP->username);
1293 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001294
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001295 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
1296 setPEAP->passwd);
1297 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001298
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001299 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ca_cert '\"%s/%s\"'", ifname,
1300 CERTIFICATES_PATH, setPEAP->trustedRootCA);
1301 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001302
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001303 if (strcasecmp(setPEAP->keyMgmtType, "wpa2-sha256") == 0) {
1304 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-SHA256",
1305 ifname);
1306 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa2-eap") == 0) {
1307 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1308 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa2-ft") == 0) {
1309 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-FT", ifname);
1310 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa") == 0) {
1311 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1312 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa2") == 0) {
1313 // take all and device to pick one which is supported.
1314 } else {
1315 // ??
1316 }
1317 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001318
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001319 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase1 '\"peaplabel=%i\"'",
1320 ifname, setPEAP->peapVersion);
1321 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001322
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001323 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase2 '\"auth=%s\"'",
1324 ifname, setPEAP->innerEAP);
1325 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001326
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001327 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
1328 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001329#endif
1330
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001331 setPeapResp->status = STATUS_COMPLETE;
1332 wfaEncodeTLV(WFA_STA_SET_PEAP_RESP_TLV, 4, (BYTE*)setPeapResp, respBuf);
1333 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001334
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001335 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001336}
1337
1338/*
1339 * wfaStaSetUAPSD()
1340 * This is to set
1341 * 1. acBE
1342 * 2. acBK
1343 * 3. acVI
1344 * 4. acVO
1345 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001346int wfaStaSetUAPSD(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1347 dutCmdResponse_t* setUAPSDResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001348#if 0 /* used for only one specific device, need to update to reflect yours */
Dake Zhao0a832172015-01-06 11:08:47 -08001349 caStaSetUAPSD_t *setUAPSD = (caStaSetUAPSD_t *)caCmdBuf;
1350 char *ifname = setUAPSD->intf;
1351 char tmpStr[10];
1352 char line[100];
1353 char *pathl="/etc/Wireless/RT61STA";
1354 BYTE acBE=1;
1355 BYTE acBK=1;
1356 BYTE acVO=1;
1357 BYTE acVI=1;
1358 BYTE APSDCapable;
1359 FILE *pipe;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001360
Dake Zhao0a832172015-01-06 11:08:47 -08001361 /*
1362 * A series of setting need to be done before doing WMM-PS
1363 * Additional steps of configuration may be needed.
1364 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001365
Dake Zhao0a832172015-01-06 11:08:47 -08001366 /*
1367 * bring down the interface
1368 */
1369 sprintf(gCmdStr, "ifconfig %s down",ifname);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001370 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001371 /*
1372 * Unload the Driver
1373 */
1374 sprintf(gCmdStr, "rmmod rt61");
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001375 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001376#ifndef WFA_WMM_AC
Dake Zhao0a832172015-01-06 11:08:47 -08001377 if(setUAPSD->acBE != 1)
1378 acBE=setUAPSD->acBE = 0;
1379 if(setUAPSD->acBK != 1)
1380 acBK=setUAPSD->acBK = 0;
1381 if(setUAPSD->acVO != 1)
1382 acVO=setUAPSD->acVO = 0;
1383 if(setUAPSD->acVI != 1)
1384 acVI=setUAPSD->acVI = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001385#else
Dake Zhao0a832172015-01-06 11:08:47 -08001386 acBE=setUAPSD->acBE;
1387 acBK=setUAPSD->acBK;
1388 acVO=setUAPSD->acVO;
1389 acVI=setUAPSD->acVI;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001390#endif
1391
Dake Zhao0a832172015-01-06 11:08:47 -08001392 APSDCapable = acBE||acBK||acVO||acVI;
1393 /*
1394 * set other AC parameters
1395 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001396
Dake Zhao0a832172015-01-06 11:08:47 -08001397 sprintf(tmpStr,"%d;%d;%d;%d",setUAPSD->acBE,setUAPSD->acBK,setUAPSD->acVI,setUAPSD->acVO);
1398 sprintf(gCmdStr, "sed -e \"s/APSDCapable=.*/APSDCapable=%d/g\" -e \"s/APSDAC=.*/APSDAC=%s/g\" %s/rt61sta.dat >/tmp/wfa_tmp",APSDCapable,tmpStr,pathl);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001399 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001400
Dake Zhao0a832172015-01-06 11:08:47 -08001401 sprintf(gCmdStr, "mv /tmp/wfa_tmp %s/rt61sta.dat",pathl);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001402 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001403 pipe = popen("uname -r", "r");
1404 /* Read into line the output of uname*/
1405 fscanf(pipe,"%s",line);
1406 pclose(pipe);
1407
1408 /*
1409 * load the Driver
1410 */
1411 sprintf(gCmdStr, "insmod /lib/modules/%s/extra/rt61.ko",line);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001412 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001413
1414 sprintf(gCmdStr, "ifconfig %s up",ifname);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001415 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001416#endif
1417
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001418 setUAPSDResp->status = STATUS_COMPLETE;
1419 wfaEncodeTLV(WFA_STA_SET_UAPSD_RESP_TLV, 4, (BYTE*)setUAPSDResp, respBuf);
1420 *respLen = WFA_TLV_HDR_LEN + 4;
1421 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001422}
1423
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001424int wfaDeviceGetInfo(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1425 dutCommand_t* dutCmd = (dutCommand_t*)caCmdBuf;
1426 caDevInfo_t* devInfo = &dutCmd->cmdsu.dev;
1427 dutCmdResponse_t* infoResp = &gGenericResp;
1428 /*a vendor can fill in the proper info or anything non-disclosure */
1429 caDeviceGetInfoResp_t dinfo = {"WFA Lab", "DemoUnit", WFA_SYSTEM_VER};
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001430
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001431 DPRINT_INFO(WFA_OUT, "Entering wfaDeviceGetInfo ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001432
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001433 if (devInfo->fw == 0)
1434 memcpy(&infoResp->cmdru.devInfo, &dinfo, sizeof(caDeviceGetInfoResp_t));
1435 else {
1436 // Call internal API to pull the version ID */
1437 strncpy(infoResp->cmdru.devInfo.firmware, "NOVERSION", 15);
1438 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001439
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001440 infoResp->status = STATUS_COMPLETE;
1441 wfaEncodeTLV(WFA_DEVICE_GET_INFO_RESP_TLV, sizeof(dutCmdResponse_t),
1442 (BYTE*)infoResp, respBuf);
1443 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001444
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001445 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001446}
1447
1448/*
1449 * This funciton is to retrieve a list of interfaces and return
1450 * the list back to Agent control.
1451 * ********************************************************************
1452 * Note: We intend to make this WLAN interface name as a hardcode name.
1453 * Therefore, for a particular device, you should know and change the name
Dake Zhao0a832172015-01-06 11:08:47 -08001454 * for that device while doing porting. The MACRO "WFA_STAUT_IF" is defined in
1455 * the file "inc/wfa_ca.h". If the device OS is not linux-like, this most
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001456 * likely is hardcoded just for CAPI command responses.
1457 * *******************************************************************
Dake Zhao0a832172015-01-06 11:08:47 -08001458 *
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001459 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001460int wfaDeviceListIF(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1461 dutCmdResponse_t* infoResp = &gGenericResp;
1462 dutCommand_t* ifList = (dutCommand_t*)caCmdBuf;
1463 caDeviceListIFResp_t* ifListResp = &infoResp->cmdru.ifList;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001464
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001465 DPRINT_INFO(WFA_OUT, "Entering wfaDeviceListIF ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001466
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001467 switch (ifList->cmdsu.iftype) {
Dake Zhao0a832172015-01-06 11:08:47 -08001468 case IF_80211:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001469 infoResp->status = STATUS_COMPLETE;
1470 ifListResp->iftype = IF_80211;
1471 strcpy(ifListResp->ifs[0], WFA_STAUT_IF);
1472 strcpy(ifListResp->ifs[1], "NULL");
1473 strcpy(ifListResp->ifs[2], "NULL");
1474 break;
Dake Zhao0a832172015-01-06 11:08:47 -08001475 case IF_ETH:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001476 infoResp->status = STATUS_COMPLETE;
1477 ifListResp->iftype = IF_ETH;
1478 strcpy(ifListResp->ifs[0], "eth0");
1479 strcpy(ifListResp->ifs[1], "NULL");
1480 strcpy(ifListResp->ifs[2], "NULL");
1481 break;
1482 default: {
1483 infoResp->status = STATUS_ERROR;
1484 wfaEncodeTLV(WFA_DEVICE_LIST_IF_RESP_TLV, 4, (BYTE*)infoResp, respBuf);
1485 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001486
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001487 return WFA_SUCCESS;
Dake Zhao0a832172015-01-06 11:08:47 -08001488 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001489 }
Dake Zhao0a832172015-01-06 11:08:47 -08001490
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001491 wfaEncodeTLV(WFA_DEVICE_LIST_IF_RESP_TLV, sizeof(dutCmdResponse_t),
1492 (BYTE*)infoResp, respBuf);
1493 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -08001494
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001495 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001496}
1497
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001498int wfaStaDebugSet(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1499 dutCmdResponse_t* debugResp = &gGenericResp;
1500 dutCommand_t* debugSet = (dutCommand_t*)caCmdBuf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001501
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001502 DPRINT_INFO(WFA_OUT, "Entering wfaStaDebugSet ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001503
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001504 if (debugSet->cmdsu.dbg.state == 1) /* enable */
1505 wfa_defined_debug |= debugSet->cmdsu.dbg.level;
1506 else
1507 wfa_defined_debug = (~debugSet->cmdsu.dbg.level & wfa_defined_debug);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001508
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001509 debugResp->status = STATUS_COMPLETE;
1510 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(dutCmdResponse_t),
1511 (BYTE*)debugResp, respBuf);
1512 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001513
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001514 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001515}
1516
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001517/*
1518 * wfaStaGetBSSID():
1519 * This function is to retrieve BSSID of a specific wireless I/F.
Dake Zhao0a832172015-01-06 11:08:47 -08001520 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001521int wfaStaGetBSSID(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1522 char string[64];
1523 char* str;
1524 FILE* tmpfd;
1525 dutCmdResponse_t* bssidResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001526
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001527 DPRINT_INFO(WFA_OUT, "Entering wfaStaGetBSSID ...\n");
1528 /* retrieve the BSSID */
1529 sprintf(gCmdStr, "wpa_cli.sh status > /tmp/bssid.txt");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001530
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001531 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001532
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001533 tmpfd = fopen("/tmp/bssid.txt", "r+");
1534 if (tmpfd == NULL) {
1535 bssidResp->status = STATUS_ERROR;
1536 wfaEncodeTLV(WFA_STA_GET_BSSID_RESP_TLV, 4, (BYTE*)bssidResp, respBuf);
1537 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001538
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001539 DPRINT_ERR(WFA_ERR, "file open failed\n");
1540 return WFA_FAILURE;
1541 }
1542
1543 for (;;) {
1544 if (fscanf(tmpfd, "%s", string) == EOF) {
1545 bssidResp->status = STATUS_COMPLETE;
1546 strcpy(bssidResp->cmdru.bssid, "00:00:00:00:00:00");
1547 break;
Dake Zhao0a832172015-01-06 11:08:47 -08001548 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001549
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001550 if (strncmp(string, "bssid", 5) == 0) {
1551 str = strtok(string, "=");
1552 str = strtok(NULL, "=");
1553 if (str != NULL) {
1554 strcpy(bssidResp->cmdru.bssid, str);
1555 bssidResp->status = STATUS_COMPLETE;
1556 break;
1557 }
Dake Zhao0a832172015-01-06 11:08:47 -08001558 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001559 }
Dake Zhao0a832172015-01-06 11:08:47 -08001560
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001561 wfaEncodeTLV(WFA_STA_GET_BSSID_RESP_TLV, sizeof(dutCmdResponse_t),
1562 (BYTE*)bssidResp, respBuf);
1563 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -08001564
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001565 fclose(tmpfd);
1566 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001567}
1568
1569/*
1570 * wfaStaSetIBSS()
1571 * This is to set
1572 * 1. ssid
1573 * 2. channel
1574 * 3. encrypType - none or wep
1575 * optional
1576 * 4. key1
1577 * 5. key2
1578 * 6. key3
1579 * 7. key4
1580 * 8. activeIndex - 1, 2, 3, or 4
1581 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001582int wfaStaSetIBSS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1583 caStaSetIBSS_t* setIBSS = (caStaSetIBSS_t*)caCmdBuf;
1584 dutCmdResponse_t* setIbssResp = &gGenericResp;
1585 int i;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001586
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001587 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001588 * disable the network first
1589 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001590 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", setIBSS->intf);
1591 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001592
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001593 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001594 * set SSID
1595 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001596 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'",
1597 setIBSS->intf, setIBSS->ssid);
1598 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001599
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001600 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001601 * Set channel for IBSS
1602 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001603 sprintf(gCmdStr, "iwconfig %s channel %i", setIBSS->intf, setIBSS->channel);
1604 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001605
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001606 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001607 * Tell the supplicant for IBSS mode (1)
1608 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001609 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 mode 1", setIBSS->intf);
1610 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001611
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001612 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001613 * set Key management to NONE (NO WPA) for plaintext or WEP
1614 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001615 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt NONE",
1616 setIBSS->intf);
1617 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001618
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001619 if (setIBSS->encpType == 1) {
1620 for (i = 0; i < 4; i++) {
1621 if (strlen(setIBSS->keys[i]) == 5 || strlen(setIBSS->keys[i]) == 13) {
1622 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_key%i \"%s\"",
1623 setIBSS->intf, i, setIBSS->keys[i]);
1624 sret = systemWithLog(gCmdStr);
1625 }
Dake Zhao0a832172015-01-06 11:08:47 -08001626 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001627
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001628 i = setIBSS->activeKeyIdx;
1629 if (strlen(setIBSS->keys[i]) == 5 || strlen(setIBSS->keys[i]) == 13) {
1630 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_tx_keyidx %i",
1631 setIBSS->intf, setIBSS->activeKeyIdx);
1632 sret = systemWithLog(gCmdStr);
1633 }
1634 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001635
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001636 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setIBSS->intf);
1637 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001638
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001639 setIbssResp->status = STATUS_COMPLETE;
1640 wfaEncodeTLV(WFA_STA_SET_IBSS_RESP_TLV, 4, (BYTE*)setIbssResp, respBuf);
1641 *respLen = WFA_TLV_HDR_LEN + 4;
1642
1643 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001644}
1645
1646/*
1647 * wfaSetMode():
Dake Zhao0a832172015-01-06 11:08:47 -08001648 * The function is to set the wireless interface with a given mode (possible
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001649 * adhoc)
1650 * Input parameters:
1651 * 1. I/F
1652 * 2. ssid
1653 * 3. mode adhoc or managed
1654 * 4. encType
1655 * 5. channel
1656 * 6. key(s)
1657 * 7. active key
Dake Zhao0a832172015-01-06 11:08:47 -08001658 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001659int wfaStaSetMode(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1660 caStaSetMode_t* setmode = (caStaSetMode_t*)caCmdBuf;
1661 dutCmdResponse_t* SetModeResp = &gGenericResp;
1662 int i;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001663
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001664 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001665 * bring down the interface
1666 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001667 sprintf(gCmdStr, "ifconfig %s down", setmode->intf);
1668 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001669
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001670 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001671 * distroy the interface
1672 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001673 sprintf(gCmdStr, "wlanconfig %s destroy", setmode->intf);
1674 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001675
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001676 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001677 * re-create the interface with the given mode
1678 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001679 if (setmode->mode == 1)
1680 sprintf(gCmdStr, "wlanconfig %s create wlandev wifi0 wlanmode adhoc",
1681 setmode->intf);
1682 else
1683 sprintf(gCmdStr, "wlanconfig %s create wlandev wifi0 wlanmode managed",
1684 setmode->intf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001685
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001686 sret = systemWithLog(gCmdStr);
1687 if (setmode->encpType == ENCRYPT_WEP) {
1688 int j = setmode->activeKeyIdx;
1689 for (i = 0; i < 4; i++) {
1690 if (setmode->keys[i][0] != '\0') {
1691 sprintf(gCmdStr, "iwconfig %s key s:%s", setmode->intf,
1692 setmode->keys[i]);
1693 sret = systemWithLog(gCmdStr);
1694 }
1695 /* set active key */
1696 if (setmode->keys[j][0] != '\0')
1697 sprintf(gCmdStr, "iwconfig %s key s:%s", setmode->intf,
1698 setmode->keys[j]);
1699 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001700 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001701 }
1702 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001703 * Set channel for IBSS
1704 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001705 if (setmode->channel) {
1706 sprintf(gCmdStr, "iwconfig %s channel %i", setmode->intf, setmode->channel);
1707 sret = systemWithLog(gCmdStr);
1708 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001709
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001710 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001711 * set SSID
1712 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001713 sprintf(gCmdStr, "iwconfig %s essid %s", setmode->intf, setmode->ssid);
1714 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001715
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001716 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001717 * bring up the interface
1718 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001719 sprintf(gCmdStr, "ifconfig %s up", setmode->intf);
1720 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001721
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001722 SetModeResp->status = STATUS_COMPLETE;
1723 wfaEncodeTLV(WFA_STA_SET_MODE_RESP_TLV, 4, (BYTE*)SetModeResp, respBuf);
1724 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001725
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001726 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001727}
1728
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001729int wfaStaSetPwrSave(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1730 caStaSetPwrSave_t* setps = (caStaSetPwrSave_t*)caCmdBuf;
1731 dutCmdResponse_t* SetPSResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001732
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001733 sprintf(gCmdStr, "iwconfig %s power %s", setps->intf, setps->mode);
1734 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001735
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001736 SetPSResp->status = STATUS_COMPLETE;
1737 wfaEncodeTLV(WFA_STA_SET_PWRSAVE_RESP_TLV, 4, (BYTE*)SetPSResp, respBuf);
1738 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001739
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001740 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001741}
1742
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001743int wfaStaUpload(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1744 caStaUpload_t* upload = &((dutCommand_t*)caCmdBuf)->cmdsu.upload;
1745 dutCmdResponse_t* upLoadResp = &gGenericResp;
1746 caStaUploadResp_t* upld = &upLoadResp->cmdru.uld;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001747
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001748 if (upload->type == WFA_UPLOAD_VHSO_RPT) {
1749 int rbytes;
1750 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001751 * if asked for the first packet, always to open the file
1752 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001753 if (upload->next == 1) {
1754 if (e2efp != NULL) {
1755 fclose(e2efp);
1756 e2efp = NULL;
1757 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001758
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001759 e2efp = fopen(e2eResults, "r");
1760 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001761
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001762 if (e2efp == NULL) {
1763 upLoadResp->status = STATUS_ERROR;
1764 wfaEncodeTLV(WFA_STA_UPLOAD_RESP_TLV, 4, (BYTE*)upLoadResp, respBuf);
1765 *respLen = WFA_TLV_HDR_LEN + 4;
1766 return WFA_FAILURE;
1767 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001768
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001769 rbytes = fread(upld->bytes, 1, 256, e2efp);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001770
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001771 if (rbytes < 256) {
1772 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001773 * this means no more bytes after this read
1774 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001775 upld->seqnum = 0;
1776 fclose(e2efp);
1777 e2efp = NULL;
1778 } else {
1779 upld->seqnum = upload->next;
Dake Zhao0a832172015-01-06 11:08:47 -08001780 }
1781
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001782 upld->nbytes = rbytes;
1783
1784 upLoadResp->status = STATUS_COMPLETE;
1785 wfaEncodeTLV(WFA_STA_UPLOAD_RESP_TLV, sizeof(dutCmdResponse_t),
1786 (BYTE*)upLoadResp, respBuf);
1787 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
1788 } else {
1789 upLoadResp->status = STATUS_ERROR;
1790 wfaEncodeTLV(WFA_STA_UPLOAD_RESP_TLV, 4, (BYTE*)upLoadResp, respBuf);
1791 *respLen = WFA_TLV_HDR_LEN + 4;
1792 }
1793
1794 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001795}
1796/*
1797 * wfaStaSetWMM()
1798 * TO be ported on a specific plaform for the DUT
1799 * This is to set the WMM related parameters at the DUT.
1800 * Currently the function is used for GROUPS WMM-AC and WMM general configuration for setting RTS Threshhold, Fragmentation threshold and wmm (ON/OFF)
1801 * It is expected that this function will set all the WMM related parametrs for a particular GROUP .
1802 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001803int wfaStaSetWMM(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001804#ifdef WFA_WMM_AC
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001805 caStaSetWMM_t* setwmm = (caStaSetWMM_t*)caCmdBuf;
1806 char* ifname = setwmm->intf;
1807 dutCmdResponse_t* setwmmResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001808
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001809 switch (setwmm->group) {
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001810 case GROUP_WMMAC:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001811 if (setwmm->send_trig) {
1812 int Sockfd;
1813 struct sockaddr_in psToAddr;
1814 unsigned int TxMsg[512];
Dake Zhao0a832172015-01-06 11:08:47 -08001815
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001816 Sockfd = wfaCreateUDPSock(setwmm->dipaddr, 12346);
1817 memset(&psToAddr, 0, sizeof(psToAddr));
1818 psToAddr.sin_family = AF_INET;
1819 psToAddr.sin_addr.s_addr = inet_addr(setwmm->dipaddr);
1820 psToAddr.sin_port = htons(12346);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001821
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001822 switch (setwmm->trig_ac) {
1823 case WMMAC_AC_VO:
1824 wfaTGSetPrio(Sockfd, 7);
1825 create_apts_msg(APTS_CK_VO, TxMsg, 0);
1826 printf("\r\nSending AC_VO trigger packet\n");
1827 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001828
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001829 case WMMAC_AC_VI:
1830 wfaTGSetPrio(Sockfd, 5);
1831 create_apts_msg(APTS_CK_VI, TxMsg, 0);
1832 printf("\r\nSending AC_VI trigger packet\n");
1833 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001834
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001835 case WMMAC_AC_BK:
1836 wfaTGSetPrio(Sockfd, 2);
1837 create_apts_msg(APTS_CK_BK, TxMsg, 0);
1838 printf("\r\nSending AC_BK trigger packet\n");
1839 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001840
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001841 default:
1842 case WMMAC_AC_BE:
1843 wfaTGSetPrio(Sockfd, 0);
1844 create_apts_msg(APTS_CK_BE, TxMsg, 0);
1845 printf("\r\nSending AC_BE trigger packet\n");
1846 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001847 }
1848
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001849 sendto(Sockfd, TxMsg, 256, 0, (struct sockaddr*)&psToAddr,
1850 sizeof(struct sockaddr));
1851 close(Sockfd);
1852 usleep(1000000);
1853 } else if (setwmm->action == WMMAC_ADDTS) {
1854 printf(
1855 "ADDTS AC PARAMS: dialog id: %d, TID: %d, "
1856 "DIRECTION: %d, PSB: %d, UP: %d, INFOACK: %d BURST SIZE DEF: %d"
1857 "Fixed %d, MSDU Size: %d, Max MSDU Size %d, "
1858 "MIN SERVICE INTERVAL: %d, MAX SERVICE INTERVAL: %d, "
1859 "INACTIVITY: %d, SUSPENSION %d, SERVICE START TIME: %d, "
1860 "MIN DATARATE: %d, MEAN DATA RATE: %d, PEAK DATA RATE: %d, "
1861 "BURSTSIZE or MSDU Aggreg: %d, DELAY BOUND: %d, PHYRATE: %d, "
1862 "SPLUSBW: %f, "
1863 "MEDIUM TIME: %d, ACCESSCAT: %d\n",
1864 setwmm->actions.addts.dialog_token,
1865 setwmm->actions.addts.tspec.tsinfo.TID,
1866 setwmm->actions.addts.tspec.tsinfo.direction,
1867 setwmm->actions.addts.tspec.tsinfo.PSB,
1868 setwmm->actions.addts.tspec.tsinfo.UP,
1869 setwmm->actions.addts.tspec.tsinfo.infoAck,
1870 setwmm->actions.addts.tspec.tsinfo.bstSzDef,
1871 setwmm->actions.addts.tspec.Fixed, setwmm->actions.addts.tspec.size,
1872 setwmm->actions.addts.tspec.maxsize,
1873 setwmm->actions.addts.tspec.min_srvc,
1874 setwmm->actions.addts.tspec.max_srvc,
1875 setwmm->actions.addts.tspec.inactivity,
1876 setwmm->actions.addts.tspec.suspension,
1877 setwmm->actions.addts.tspec.srvc_strt_tim,
1878 setwmm->actions.addts.tspec.mindatarate,
1879 setwmm->actions.addts.tspec.meandatarate,
1880 setwmm->actions.addts.tspec.peakdatarate,
1881 setwmm->actions.addts.tspec.burstsize,
1882 setwmm->actions.addts.tspec.delaybound,
1883 setwmm->actions.addts.tspec.PHYrate,
1884 setwmm->actions.addts.tspec.sba,
1885 setwmm->actions.addts.tspec.medium_time,
1886 setwmm->actions.addts.accesscat);
1887
1888 //tspec should be set here.
1889
1890 sret = systemWithLog(gCmdStr);
1891 } else if (setwmm->action == WMMAC_DELTS) {
1892 // send del tspec
1893 }
1894
1895 setwmmResp->status = STATUS_COMPLETE;
1896 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001897
1898 case GROUP_WMMCONF:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001899 sprintf(gCmdStr, "iwconfig %s rts %d", ifname,
1900 setwmm->actions.config.rts_thr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001901
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001902 sret = systemWithLog(gCmdStr);
1903 sprintf(gCmdStr, "iwconfig %s frag %d", ifname,
1904 setwmm->actions.config.frag_thr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001905
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001906 sret = systemWithLog(gCmdStr);
1907 sprintf(gCmdStr, "iwpriv %s wmmcfg %d", ifname,
1908 setwmm->actions.config.wmm);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001909
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001910 sret = systemWithLog(gCmdStr);
1911 setwmmResp->status = STATUS_COMPLETE;
1912 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001913
1914 default:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001915 DPRINT_ERR(WFA_ERR, "The group %d is not supported\n", setwmm->group);
1916 setwmmResp->status = STATUS_ERROR;
1917 break;
1918 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001919
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001920 wfaEncodeTLV(WFA_STA_SET_WMM_RESP_TLV, 4, (BYTE*)setwmmResp, respBuf);
1921 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001922#endif
1923
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001924 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001925}
1926
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001927int wfaStaSendNeigReq(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1928 dutCmdResponse_t* sendNeigReqResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001929
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001930 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001931 * run your device to send NEIGREQ
1932 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001933
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001934 sendNeigReqResp->status = STATUS_COMPLETE;
1935 wfaEncodeTLV(WFA_STA_SEND_NEIGREQ_RESP_TLV, 4, (BYTE*)sendNeigReqResp,
1936 respBuf);
1937 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001938
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001939 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001940}
1941
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001942int wfaStaSetEapFAST(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1943 caStaSetEapFAST_t* setFAST = (caStaSetEapFAST_t*)caCmdBuf;
1944 char* ifname = setFAST->intf;
1945 dutCmdResponse_t* setEapFastResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001946
1947#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001948 sprintf(gCmdStr, "wfa_set_eapfast %s %s %s %s %s %s", ifname, setFAST->ssid,
1949 setFAST->username, setFAST->passwd, setFAST->pacFileName,
1950 setFAST->innerEAP);
1951 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001952#else
1953
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001954 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1955 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001956
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001957 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1958 setFAST->ssid);
1959 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001960
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001961 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1962 setFAST->username);
1963 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001964
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001965 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
1966 setFAST->passwd);
1967 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001968
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001969 if (strcasecmp(setFAST->keyMgmtType, "wpa2-sha256") == 0) {
1970 } else if (strcasecmp(setFAST->keyMgmtType, "wpa2-eap") == 0) {
1971 } else if (strcasecmp(setFAST->keyMgmtType, "wpa2-ft") == 0) {
1972 } else if (strcasecmp(setFAST->keyMgmtType, "wpa") == 0) {
1973 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1974 } else if (strcasecmp(setFAST->keyMgmtType, "wpa2") == 0) {
1975 // take all and device to pick one which is supported.
1976 } else {
1977 // ??
1978 }
1979 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001980
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001981 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap FAST", ifname);
1982 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001983
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001984 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 pac_file '\"%s/%s\"'",
1985 ifname, CERTIFICATES_PATH, setFAST->pacFileName);
1986 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001987
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001988 sprintf(gCmdStr,
1989 "wpa_cli.sh -i %s set_network 0 anonymous_identity '\"anonymous\"'",
1990 ifname);
1991 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001992
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001993 sprintf(gCmdStr,
1994 "wpa_cli.sh -i %s set_network 0 phase1 '\"fast_provisioning=1\"'",
1995 ifname);
1996 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001997
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001998 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase2 '\"auth=%s\"'",
1999 ifname, setFAST->innerEAP);
2000 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002001
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002002 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
2003 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002004#endif
2005
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002006 setEapFastResp->status = STATUS_COMPLETE;
2007 wfaEncodeTLV(WFA_STA_SET_EAPFAST_RESP_TLV, 4, (BYTE*)setEapFastResp, respBuf);
2008 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002009
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002010 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002011}
2012
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002013int wfaStaSetEapAKA(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2014 caStaSetEapAKA_t* setAKA = (caStaSetEapAKA_t*)caCmdBuf;
2015 char* ifname = setAKA->intf;
2016 dutCmdResponse_t* setEapAkaResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002017
2018#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002019 sprintf(gCmdStr, "wfa_set_eapaka %s %s %s %s", ifname, setAKA->ssid,
2020 setAKA->username, setAKA->passwd);
2021 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002022#else
2023
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002024 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
2025 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002026
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002027 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
2028 setAKA->ssid);
2029 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002030
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002031 if (strcasecmp(setAKA->keyMgmtType, "wpa2-sha256") == 0) {
2032 } else if (strcasecmp(setAKA->keyMgmtType, "wpa2-eap") == 0) {
2033 } else if (strcasecmp(setAKA->keyMgmtType, "wpa2-ft") == 0) {
2034 } else if (strcasecmp(setAKA->keyMgmtType, "wpa") == 0) {
2035 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
2036 } else if (strcasecmp(setAKA->keyMgmtType, "wpa2") == 0) {
2037 // take all and device to pick one which is supported.
2038 } else {
2039 // ??
2040 }
2041 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08002042
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002043 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA2", ifname);
2044 sret = systemWithLog(gCmdStr);
2045 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto CCMP", ifname);
2046 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002047
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002048 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap AKA", ifname);
2049 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002050
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002051 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase1 \"result_ind=1\"",
2052 ifname);
2053 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002054
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002055 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
2056 setAKA->username);
2057 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002058
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002059 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
2060 setAKA->passwd);
2061 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002062
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002063 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
2064 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002065#endif
2066
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002067 setEapAkaResp->status = STATUS_COMPLETE;
2068 wfaEncodeTLV(WFA_STA_SET_EAPAKA_RESP_TLV, 4, (BYTE*)setEapAkaResp, respBuf);
2069 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002070
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002071 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002072}
2073
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002074int wfaStaSetSystime(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2075 caStaSetSystime_t* systime = (caStaSetSystime_t*)caCmdBuf;
2076 dutCmdResponse_t* setSystimeResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002077
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002078 DPRINT_INFO(WFA_OUT, "Entering wfaStaSetSystime ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002079
Wojciech Jakobczyk569662f2020-09-04 08:41:42 +02002080 sprintf(gCmdStr, "date %02d%02d%02d%02d%04d.%02d", systime->month,
2081 systime->date, systime->hours, systime->minutes, systime->year,
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002082 systime->seconds);
2083 sret = systemWithLog(gCmdStr);
Wojciech Jakobczyk569662f2020-09-04 08:41:42 +02002084 if (sret != 0) {
2085 RETURN_STA_CMD_ERROR(setSystimeResp, STATUS_ERROR,
2086 "error running date command, exit code: %d\n", sret);
2087 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002088
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002089 setSystimeResp->status = STATUS_COMPLETE;
2090 wfaEncodeTLV(WFA_STA_SET_SYSTIME_RESP_TLV, 4, (BYTE*)setSystimeResp, respBuf);
2091 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002092
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002093 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002094}
2095
2096#ifdef WFA_STA_TB
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002097int wfaStaPresetParams(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2098 dutCmdResponse_t* PresetParamsResp = &gGenericResp;
2099 caStaPresetParameters_t* presetParams = (caStaPresetParameters_t*)caCmdBuf;
2100 BYTE presetDone = 1;
2101 int st = 0;
2102 char cmdStr[128];
2103 char string[256];
2104 FILE* tmpfd = NULL;
2105 long val;
2106 char* endptr;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002107
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002108 DPRINT_INFO(WFA_OUT, "Inside wfaStaPresetParameters function ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002109
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002110 if (presetParams->supplicant == eWpaSupplicant) {
2111 st = access("/tmp/processid.txt", F_OK);
2112 if (st != -1) {
2113 st = remove("/tmp/processid.txt");
Dake Zhao0a832172015-01-06 11:08:47 -08002114 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002115
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002116 sprintf(cmdStr, "/usr/local/sbin/findprocess.sh %s /tmp/processid.txt\n",
2117 "wpa_supplicant");
2118 st = systemWithLog(cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002119
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002120 tmpfd = fopen("/tmp/processid.txt", "r+");
2121 if (tmpfd == NULL) {
2122 DPRINT_ERR(WFA_ERR, "process id file not exist\n");
2123 return WFA_FAILURE;
Dake Zhao0a832172015-01-06 11:08:47 -08002124 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002125
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002126 for (;;) {
2127 if (fgets(string, 256, tmpfd) == NULL)
2128 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002129
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002130 errno = 0;
2131 val = strtol(string, &endptr, 10);
2132 if (errno != 0 && val == 0) {
2133 DPRINT_ERR(WFA_ERR, "strtol error\n");
2134 return WFA_FAILURE;
2135 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002136
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002137 if (endptr == string) {
2138 DPRINT_ERR(WFA_ERR, "No wpa_supplicant instance was found\n");
2139 }
2140
2141 presetDone = 1;
2142 }
2143 }
2144
2145 if (presetParams->wmmFlag) {
2146 st = wfaExecuteCLI(gCmdStr);
2147 switch (st) {
2148 case 0:
2149 presetDone = 1;
2150 break;
2151 case 1:
2152 presetDone = 0;
2153 break;
2154 case 2:
2155 presetDone = 0;
2156 break;
2157 }
2158 }
2159
2160 if (presetParams->modeFlag != 0) {
2161 switch (presetParams->wirelessMode) {
2162 default:
2163 printf("other mode does not need to support\n");
Dake Zhao0a832172015-01-06 11:08:47 -08002164 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002165
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002166 st = wfaExecuteCLI(gCmdStr);
2167 switch (st) {
2168 case 0:
2169 presetDone = 1;
2170 break;
2171 case 1:
2172 presetDone = 0;
2173 case 2:
2174 presetDone = 0;
2175 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002176 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002177 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002178
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002179 if (presetParams->psFlag) {
2180 printf("%s\n", gCmdStr);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02002181 sret = systemWithLog(gCmdStr);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002182 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002183
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002184 /************the followings are used for Voice Enterprise **************/
2185 if (presetParams->program == PROG_TYPE_VENT) {
2186 if (presetParams->ftoa == eEnable) {
2187 // enable Fast BSS Transition Over the Air
2188 } else {
2189 // disable Fast BSS Transition Over the Air
2190 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002191
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002192 if (presetParams->ftds == eEnable) {
2193 // enable Fast BSS Transition Over the DS
2194 } else {
2195 // disable Fast BSS Transition Over the DS
2196 }
2197
2198 if (presetParams->activescan == eEnable) {
2199 // Enable Active Scan on STA
2200 } else {
2201 // disable Active Scan on STA
2202 }
2203 }
2204
2205 /************the followings are used for Wi-Fi Display *************/
2206 if (presetParams->program == PROG_TYPE_WFD) {
2207 if (presetParams->tdlsFlag) {
2208 // enable / disable tdls based on tdls
2209 }
2210 if (presetParams->wfdDevTypeFlag) {
2211 // set WFD device type to source/sink/dual based on wfdDevType
2212 }
2213 if (presetParams->wfdUibcGenFlag) {
2214 // enable / disable the feature
2215 }
2216 if (presetParams->wfdUibcHidFlag) {
2217 // enable / disable feature
2218 }
2219 if (presetParams->wfdUiInputFlag) {
2220 // set the UI input as mentioned
2221 }
2222 if (presetParams->wfdHdcpFlag) {
2223 // enable / disable feature
2224 }
2225 if (presetParams->wfdFrameSkipFlag) {
2226 // enable / disable feature
2227 }
2228 if (presetParams->wfdAvChangeFlag) {
2229 // enable / disable feature
2230 }
2231 if (presetParams->wfdStandByFlag) {
2232 // enable / disable feature
2233 }
2234 if (presetParams->wfdInVideoFlag) {
2235 // select the input vide as protecteed or non-protetcted or protected audio
2236 // or unprotected audio etc.
2237 }
2238
2239 if (presetParams->wfdVideoFmatFlag) {
2240 // set the video format as requested
2241
2242 //switch(presetParams->wfdVideoFmt )
2243 //{
2244 // case e640x480p60:
2245 // ;
2246 // default:
2247 // set the mandatory
2248 // }
2249 }
2250 if (presetParams->wfdAudioFmatFlag) {
2251 // set the Audio format as requested
2252
2253 //switch(presetParams->wfdAudioFmt )
2254 //{
2255 // case eMandatoryAudioMode:
2256 // ;
2257 // case eDefaultAudioMode:
2258 // ;
2259
2260 // default:
2261 // set the mandatory
2262 // }
2263 }
2264
2265 if (presetParams->wfdI2cFlag) {
2266 // enable / disable feature
2267 }
2268 if (presetParams->wfdVideoRecoveryFlag) {
2269 // enable / disable feature
2270 }
2271 if (presetParams->wfdPrefDisplayFlag) {
2272 // enable / disable feature
2273 }
2274 if (presetParams->wfdServiceDiscoveryFlag) {
2275 // enable / disable feature
2276 }
2277 if (presetParams->wfd3dVideoFlag) {
2278 // enable / disable feature
2279 }
2280 if (presetParams->wfdMultiTxStreamFlag) {
2281 // enable / disable feature
2282 }
2283 if (presetParams->wfdTimeSyncFlag) {
2284 // enable / disable feature
2285 }
2286 if (presetParams->wfdEDIDFlag) {
2287 // enable / disable feature
2288 }
2289 if (presetParams->wfdUIBCPrepareFlag) {
2290 // Provdes information to start valid WFD session to check UIBC operation.
2291 }
2292 if (presetParams->wfdCoupledCapFlag) {
2293 // enable / disable feature
2294 }
2295 if (presetParams->wfdOptionalFeatureFlag) {
2296 // disable all program specific optional features
2297 }
2298 if (presetParams->wfdSessionAvailFlag) {
2299 // enable / disable session available bit
2300 }
2301 if (presetParams->wfdDeviceDiscoverabilityFlag) {
2302 // enable / disable feature
2303 }
2304 }
2305
2306 if (presetParams->program == PROG_TYPE_WFDS) {
2307 if (presetParams->wfdsType == eAcceptPD) {
2308 // preset to accept PD request
2309 if (presetParams->wfdsConnectionCapabilityFlag == 1) {
2310 // use presetParams->wfdsConnectionCapability and set role accordingly
2311 }
2312 }
2313 if (presetParams->wfdsType == eRejectPD) {
2314 // preset to Reject PD request
2315 }
2316 if (presetParams->wfdsType == eIgnorePD) {
2317 // preset to Ignore PD request
2318 }
2319 if (presetParams->wfdsType == eRejectSession) {
2320 // preset to reject Session request
2321 }
2322 }
2323
2324 if (presetDone) {
2325 PresetParamsResp->status = STATUS_COMPLETE;
2326 } else {
2327 PresetParamsResp->status = STATUS_INVALID;
2328 }
2329
2330 wfaEncodeTLV(WFA_STA_PRESET_PARAMETERS_RESP_TLV, 4, (BYTE*)PresetParamsResp,
2331 respBuf);
2332 *respLen = WFA_TLV_HDR_LEN + 4;
2333
2334 return WFA_SUCCESS;
2335}
2336
2337int wfaStaSet11n(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2338 dutCmdResponse_t* v11nParamsResp = &gGenericResp;
2339
2340 v11nParamsResp->status = STATUS_COMPLETE;
2341 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, 4, (BYTE*)v11nParamsResp, respBuf);
2342 *respLen = WFA_TLV_HDR_LEN + 4;
2343 return WFA_SUCCESS;
2344}
2345int wfaStaSetWireless(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2346 dutCmdResponse_t* staWirelessResp = &gGenericResp;
2347
2348 staWirelessResp->status = STATUS_COMPLETE;
2349 wfaEncodeTLV(WFA_STA_SET_WIRELESS_RESP_TLV, 4, (BYTE*)staWirelessResp,
2350 respBuf);
2351 *respLen = WFA_TLV_HDR_LEN + 4;
2352 return WFA_SUCCESS;
2353}
2354
2355int wfaStaSendADDBA(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2356 dutCmdResponse_t* staSendADDBAResp = &gGenericResp;
2357
2358 wfaEncodeTLV(WFA_STA_SET_SEND_ADDBA_RESP_TLV, 4, (BYTE*)staSendADDBAResp,
2359 respBuf);
2360 *respLen = WFA_TLV_HDR_LEN + 4;
2361 return WFA_SUCCESS;
2362}
2363
2364int wfaStaSetRIFS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2365 dutCmdResponse_t* staSetRIFSResp = &gGenericResp;
2366
2367 wfaEncodeTLV(WFA_STA_SET_RIFS_TEST_RESP_TLV, 4, (BYTE*)staSetRIFSResp,
2368 respBuf);
2369 *respLen = WFA_TLV_HDR_LEN + 4;
2370
2371 return WFA_SUCCESS;
2372}
2373
2374int wfaStaSendCoExistMGMT(int len,
2375 BYTE* caCmdBuf,
2376 int* respLen,
2377 BYTE* respBuf) {
2378 dutCmdResponse_t* staSendMGMTResp = &gGenericResp;
2379
2380 wfaEncodeTLV(WFA_STA_SEND_COEXIST_MGMT_RESP_TLV, 4, (BYTE*)staSendMGMTResp,
2381 respBuf);
2382 *respLen = WFA_TLV_HDR_LEN + 4;
2383
2384 return WFA_SUCCESS;
2385}
2386
2387int wfaStaResetDefault(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2388 caStaResetDefault_t* reset = (caStaResetDefault_t*)caCmdBuf;
2389 dutCmdResponse_t* ResetResp = &gGenericResp;
2390
2391 // need to make your own command available for this, here is only an example
2392 sprintf(gCmdStr, "myresetdefault %s program %s", reset->intf, reset->prog);
2393 sret = systemWithLog(gCmdStr);
2394
2395 ResetResp->status = STATUS_COMPLETE;
2396 wfaEncodeTLV(WFA_STA_RESET_DEFAULT_RESP_TLV, 4, (BYTE*)ResetResp, respBuf);
2397 *respLen = WFA_TLV_HDR_LEN + 4;
2398
2399 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002400}
2401
2402#else
2403
Wojciech Jakobczyk01c627a2020-09-02 09:51:21 +02002404int wfaStaSetRIFS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2405 caStaSetRIFS_t* setRifs = (caStaSetRIFS_t*)caCmdBuf;
2406 dutCmdResponse_t* staSetRIFSResp = &gGenericResp;
2407
2408 DPRINT_INFO(WFA_OUT, "entering wfaStaSetRIFS ...\n");
2409 DPRINT_INFO(WFA_OUT, "%s %d\n", setRifs->intf, setRifs->action);
2410
2411 if (setRifs->action) {
2412 DPRINT_INFO(WFA_WNG,
2413 "command sta_set_rifs_test is deprecated and not implemented "
2414 "for action=enable\n");
2415
2416 staSetRIFSResp->status = STATUS_INVALID;
2417 wfaEncodeTLV(WFA_STA_SET_RIFS_TEST_RESP_TLV, sizeof(staSetRIFSResp->status),
2418 (BYTE*)staSetRIFSResp, respBuf);
2419 *respLen = WFA_TLV_HDR_LEN + sizeof(staSetRIFSResp->status);
2420
2421 return WFA_FAILURE;
2422 }
2423
2424 DPRINT_INFO(WFA_WNG,
2425 "command sta_set_rifs_test is deprecated and will be ignored for "
2426 "action=disable\n");
2427
2428 staSetRIFSResp->status = STATUS_COMPLETE;
2429 wfaEncodeTLV(WFA_STA_SET_RIFS_TEST_RESP_TLV, sizeof(staSetRIFSResp->status),
2430 (BYTE*)staSetRIFSResp, respBuf);
2431 *respLen = WFA_TLV_HDR_LEN + sizeof(staSetRIFSResp->status);
2432
2433 return WFA_SUCCESS;
2434}
2435
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002436int wfaStaTestBedCmd(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2437 dutCmdResponse_t* staCmdResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002438
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002439 wfaEncodeTLV(WFA_STA_DISCONNECT_RESP_TLV, 4, (BYTE*)staCmdResp, respBuf);
2440 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002441
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002442 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002443}
2444#endif
2445
2446/*
2447 * This is used to send a frame or action frame
2448 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002449int wfaStaDevSendFrame(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2450 dutCommand_t* cmd = (dutCommand_t*)caCmdBuf;
2451 /* uncomment it if needed */
2452 // char *ifname = cmd->intf;
2453 dutCmdResponse_t* devSendResp = &gGenericResp;
2454 caStaDevSendFrame_t* sf = &cmd->cmdsu.sf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002455
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002456 DPRINT_INFO(WFA_OUT, "Inside wfaStaDevSendFrame function ...\n");
2457 /* processing the frame */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002458
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002459 switch (sf->program) {
2460 case PROG_TYPE_PMF: {
2461 pmfFrame_t* pmf = &sf->frameType.pmf;
2462 switch (pmf->eFrameName) {
2463 case PMF_TYPE_DISASSOC: {
2464 /* use the protected to set what type of key to send */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002465
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002466 } break;
2467 case PMF_TYPE_DEAUTH: {
2468 } break;
2469 case PMF_TYPE_SAQUERY: {
2470 } break;
2471 case PMF_TYPE_AUTH: {
2472 } break;
2473 case PMF_TYPE_ASSOCREQ: {
2474 } break;
2475 case PMF_TYPE_REASSOCREQ: {
2476 } break;
2477 }
2478 } break;
2479 case PROG_TYPE_TDLS: {
2480 tdlsFrame_t* tdls = &sf->frameType.tdls;
2481 switch (tdls->eFrameName) {
Dake Zhao0a832172015-01-06 11:08:47 -08002482 case TDLS_TYPE_DISCOVERY:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002483 /* use the peer mac address to send the frame */
2484 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002485 case TDLS_TYPE_SETUP:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002486 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002487 case TDLS_TYPE_TEARDOWN:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002488 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002489 case TDLS_TYPE_CHANNELSWITCH:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002490 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002491 case TDLS_TYPE_NULLFRAME:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002492 break;
2493 }
2494 } break;
2495 case PROG_TYPE_VENT: {
2496 ventFrame_t* vent = &sf->frameType.vent;
2497 switch (vent->type) {
Dake Zhao0a832172015-01-06 11:08:47 -08002498 case VENT_TYPE_NEIGREQ:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002499 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002500 case VENT_TYPE_TRANSMGMT:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002501 break;
2502 }
2503 } break;
2504 case PROG_TYPE_WFD: {
2505 wfdFrame_t* wfd = &sf->frameType.wfd;
2506 switch (wfd->eframe) {
2507 case WFD_FRAME_PRBREQ: {
2508 /* send probe req */
2509 } break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002510
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002511 case WFD_FRAME_PRBREQ_TDLS_REQ: {
2512 /* send tunneled tdls probe req */
2513 } break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002514
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002515 case WFD_FRAME_11V_TIMING_MSR_REQ: {
2516 /* send 11v timing mearurement request */
2517 } break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002518
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002519 case WFD_FRAME_RTSP: {
2520 /* send WFD RTSP messages*/
2521 // fetch the type of RTSP message and send it.
2522 switch (wfd->eRtspMsgType) {
Dake Zhao0a832172015-01-06 11:08:47 -08002523 case WFD_RTSP_PAUSE:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002524 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002525 case WFD_RTSP_PLAY:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002526 //send RTSP PLAY
2527 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002528 case WFD_RTSP_TEARDOWN:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002529 //send RTSP TEARDOWN
2530 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002531 case WFD_RTSP_TRIG_PAUSE:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002532 //send RTSP TRIGGER PAUSE
2533 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002534 case WFD_RTSP_TRIG_PLAY:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002535 //send RTSP TRIGGER PLAY
2536 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002537 case WFD_RTSP_TRIG_TEARDOWN:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002538 //send RTSP TRIGGER TEARDOWN
2539 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002540 case WFD_RTSP_SET_PARAMETER:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002541 //send RTSP SET PARAMETER
2542 if (wfd->eSetParams == WFD_CAP_UIBC_KEYBOARD) {
2543 //send RTSP SET PARAMETER message for UIBC keyboard
2544 }
2545 if (wfd->eSetParams == WFD_CAP_UIBC_MOUSE) {
2546 //send RTSP SET PARAMETER message for UIBC Mouse
2547 } else if (wfd->eSetParams == WFD_CAP_RE_NEGO) {
2548 //send RTSP SET PARAMETER message Capability re-negotiation
2549 } else if (wfd->eSetParams == WFD_STANDBY) {
2550 //send RTSP SET PARAMETER message for standby
2551 } else if (wfd->eSetParams == WFD_UIBC_SETTINGS_ENABLE) {
2552 //send RTSP SET PARAMETER message for UIBC settings enable
2553 } else if (wfd->eSetParams == WFD_UIBC_SETTINGS_DISABLE) {
2554 //send RTSP SET PARAMETER message for UIBC settings disable
2555 } else if (wfd->eSetParams == WFD_ROUTE_AUDIO) {
2556 //send RTSP SET PARAMETER message for route audio
2557 } else if (wfd->eSetParams == WFD_3D_VIDEOPARAM) {
2558 //send RTSP SET PARAMETER message for 3D video parameters
2559 } else if (wfd->eSetParams == WFD_2D_VIDEOPARAM) {
2560 //send RTSP SET PARAMETER message for 2D video parameters
2561 }
2562 break;
2563 }
2564 } break;
2565 }
2566 } break;
Dake Zhao0a832172015-01-06 11:08:47 -08002567 /* not need to support HS2 release 1, due to very short time period */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002568 case PROG_TYPE_HS2_R2: {
2569 /* type of frames */
2570 hs2Frame_t* hs2 = &sf->frameType.hs2_r2;
2571 switch (hs2->eframe) {
2572 case HS2_FRAME_ANQPQuery: {
2573 } break;
2574 case HS2_FRAME_DLSRequest: {
2575 } break;
2576 case HS2_FRAME_GARPReq: {
2577 } break;
2578 case HS2_FRAME_GARPRes: {
2579 } break;
2580 case HS2_FRAME_NeighAdv: {
2581 }
2582 case HS2_FRAME_ARPProbe: {
2583 }
2584 case HS2_FRAME_ARPAnnounce: {
2585 } break;
2586 case HS2_FRAME_NeighSolicitReq: {
2587 } break;
2588 case HS2_FRAME_ARPReply: {
2589 } break;
2590 }
Dake Zhao97708202014-11-26 13:59:04 -08002591
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002592 } /* PROG_TYPE_HS2-R2 */
2593 case PROG_TYPE_GEN: {
2594 /* General frames */
Dake Zhao0a832172015-01-06 11:08:47 -08002595 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002596 }
2597 devSendResp->status = STATUS_COMPLETE;
2598 wfaEncodeTLV(WFA_STA_DEV_SEND_FRAME_RESP_TLV, 4, (BYTE*)devSendResp, respBuf);
2599 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -08002600
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002601 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002602}
2603
2604/*
2605 * This is used to set a temporary MAC address of an interface
2606 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002607int wfaStaSetMacAddr(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2608 // Uncomment it if needed
2609 //dutCommand_t *cmd = (dutCommand_t *)caCmdBuf;
2610 // char *ifname = cmd->intf;
2611 dutCmdResponse_t* staCmdResp = &gGenericResp;
2612 // Uncomment it if needed
2613 //char *macaddr = &cmd->cmdsu.macaddr[0];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002614
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002615 wfaEncodeTLV(WFA_STA_SET_MAC_ADDRESS_RESP_TLV, 4, (BYTE*)staCmdResp, respBuf);
2616 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002617
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002618 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002619}
2620
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002621int wfaStaDisconnect(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +02002622 dutCommand_t* cmd = (dutCommand_t*)caCmdBuf;
2623 char* ifname = cmd->intf;
2624 char string[64];
2625 char* token;
2626 FILE* tmpfd;
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002627 dutCmdResponse_t* staDiscResp = &gGenericResp;
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +02002628 uint32_t networkId;
2629 const char* tmpfile = "/tmp/.wfaStaDisconnectTmp";
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002630
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +02002631 DPRINT_INFO(WFA_OUT, "Entering wfaStaDisconnect ...\n");
2632 // Retrieve the network id.
2633 sprintf(gCmdStr, "wpa_cli.sh status > %s", tmpfile);
2634 sret = systemWithLog(gCmdStr);
2635 if (sret != 0) {
2636 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR,
2637 "error getting wpa_supplicant status: %d\n", sret);
2638 }
2639
2640 tmpfd = fopen(tmpfile, "r+");
2641 if (tmpfd == NULL) {
2642 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR, "temp file open failed\n");
2643 }
2644
2645 networkId = -1;
2646 for (;;) {
2647 if (fgets(string, sizeof(string), tmpfd) == NULL) {
2648 break;
2649 }
2650
2651 if (strncmp(string, "id", 2) == 0) {
2652 token = strtok(string, "=");
2653 token = strtok(NULL, "=");
2654 if (token != NULL) {
2655 networkId = atoi(token);
2656 break;
2657 }
2658 }
2659 }
2660 fclose(tmpfd);
2661
2662 if (networkId == -1) {
2663 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR, "no network connected\n");
2664 }
2665
2666 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network %d > %s", ifname,
2667 networkId, tmpfile);
2668 sret = systemWithLog(gCmdStr);
2669 if (sret != 0) {
2670 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR,
2671 "error disabling network: %d\n", sret);
2672 }
2673
2674 if (!readLine(tmpfile, string, sizeof(string))) {
2675 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR,
2676 "unable to read command output\n");
2677 }
2678
2679 if (strcmp(string, "OK") != 0) {
2680 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR,
2681 "disable network failed, error: %s\n", string);
2682 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002683
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002684 staDiscResp->status = STATUS_COMPLETE;
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +02002685 wfaEncodeTLV(WFA_STA_DISCONNECT_RESP_TLV, sizeof(dutCmdResponse_t),
2686 (BYTE*)staDiscResp, respBuf);
2687 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002688
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002689 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002690}
2691
2692/* Execute CLI, read the status from Environment variable */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002693int wfaExecuteCLI(char* CLI) {
2694 char* retstr;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002695
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002696 sret = systemWithLog(CLI);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002697
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002698 retstr = getenv("WFA_CLI_STATUS");
2699 printf("cli status %s\n", retstr);
2700 return atoi(retstr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002701}
2702
2703/* Supporting Functions */
2704
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002705void wfaSendPing(tgPingStart_t* staPing, float* interval, int streamid) {
2706 int totalpkts, tos = -1;
2707 char cmdStr[256];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002708// char *addr = staPing->dipaddr;
2709#ifdef WFA_PC_CONSOLE
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002710 char addr[40];
2711 char bflag[] = "-b";
2712 char* tmpstr;
2713 int inum = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002714#else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002715 char bflag[] = " ";
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002716#endif
Dake Zhao0a832172015-01-06 11:08:47 -08002717
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002718 totalpkts = (int)(staPing->duration * staPing->frameRate);
Dake Zhao0a832172015-01-06 11:08:47 -08002719
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002720#ifdef WFA_PC_CONSOLE
2721
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002722 printf("\nwfa_cs.c wfaSendPing CS : The Stream ID is %d", streamid);
2723
2724 strcpy(addr, staPing->dipaddr);
2725 printf("\nCS :the addr is %s ", addr);
2726 printf("\nCS :Inside the WFA_PC_CONSLE BLOCK");
2727 printf("\nCS :the addr is %s ", addr);
2728 if (staPing->iptype == 2) {
2729 memset(bflag, 0, strlen(bflag));
2730 } else {
2731 tmpstr = strtok(addr, ".");
2732 inum = atoi(tmpstr);
2733
2734 printf("interval %f\n", *interval);
2735
2736 if (inum >= 224 && inum <= 239) // multicast
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002737 {
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002738 } else // if not MC, check if it is BC address
2739 {
2740 printf("\nCS :Inside the BC address BLOCK");
2741 printf("\nCS :the inum %d", inum);
2742 strtok(NULL, ".");
2743 //strtok(NULL, ".");
2744 tmpstr = strtok(NULL, ".");
2745 printf("tmpstr %s\n", tmpstr);
2746 inum = atoi(tmpstr);
2747 printf("\nCS : The string is %s", tmpstr);
2748 if (inum != 255)
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002749 memset(bflag, 0, strlen(bflag));
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002750 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002751 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002752#endif
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002753 if (staPing->dscp >= 0) {
2754 tos = convertDscpToTos(staPing->dscp);
2755 if (tos < 0)
2756 printf("\nwfaSendPing invalid tos converted, dscp=%d", staPing->dscp);
2757 }
2758 printf("\nwfa_cs.c wfaSendPing : The Stream ID=%d IPtype=%i\n", streamid,
2759 staPing->iptype);
2760 printf("IPtype : %i tos=%d", staPing->iptype, tos);
Dake Zhao0a832172015-01-06 11:08:47 -08002761
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002762 if (staPing->iptype == 2) {
2763 if (tos > 0)
2764 sprintf(cmdStr,
2765 "echo streamid=%i > /tmp/spout_%d.txt;wfaping6.sh %s %s -i %f -c "
2766 "%i -Q %d -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2767 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2768 tos, staPing->frameSize, streamid);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002769 else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002770 sprintf(cmdStr,
2771 "echo streamid=%i > /tmp/spout_%d.txt;wfaping6.sh %s %s -i %f -c "
2772 "%i -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2773 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2774 staPing->frameSize, streamid);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02002775 sret = systemWithLog(cmdStr);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002776 printf("\nCS : The command string is %s", cmdStr);
2777 } else {
2778 if (tos > 0)
2779 sprintf(cmdStr,
2780 "echo streamid=%i > /tmp/spout_%d.txt;wfaping.sh %s %s -i %f -c "
2781 "%i -Q %d -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2782 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2783 tos, staPing->frameSize, streamid);
2784 else
2785 sprintf(cmdStr,
2786 "echo streamid=%i > /tmp/spout_%d.txt;wfaping.sh %s %s -i %f -c "
2787 "%i -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2788 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2789 staPing->frameSize, streamid);
2790 sret = systemWithLog(cmdStr);
2791 printf("\nCS : The command string is %s", cmdStr);
2792 }
2793 sprintf(cmdStr, "updatepid.sh /tmp/spout_%d.txt", streamid);
2794 sret = systemWithLog(cmdStr);
2795 printf("\nCS : The command string is %s", cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002796}
2797
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002798int wfaStopPing(dutCmdResponse_t* stpResp, int streamid) {
2799 char strout[256];
2800 FILE* tmpfile = NULL;
2801 char cmdStr[128];
2802 printf("\nwfa_cs.c wfaStopPing:: stream id=%d\n", streamid);
2803 sprintf(cmdStr, "getpid.sh /tmp/spout_%d.txt /tmp/pid.txt", streamid);
2804 sret = systemWithLog(cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002805
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002806 printf("\nCS : The command string is %s", cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002807
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002808 sret = systemWithLog("stoping.sh /tmp/pid.txt ; sleep 2");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002809
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002810 sprintf(cmdStr, "getpstats.sh /tmp/spout_%d.txt", streamid);
2811 sret = systemWithLog(cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002812
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002813 printf("\nCS : The command string is %s", cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002814
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002815 tmpfile = fopen("/tmp/stpsta.txt", "r+");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002816
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002817 if (tmpfile == NULL) {
2818 return WFA_FAILURE;
2819 }
2820
2821 if (fscanf(tmpfile, "%s", strout) != EOF) {
2822 if (*strout == '\0') {
2823 stpResp->cmdru.pingStp.sendCnt = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002824 }
2825
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002826 else
2827 stpResp->cmdru.pingStp.sendCnt = atoi(strout);
2828 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002829
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002830 printf("\nwfaStopPing after scan sent count %i\n",
2831 stpResp->cmdru.pingStp.sendCnt);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002832
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002833 if (fscanf(tmpfile, "%s", strout) != EOF) {
2834 if (*strout == '\0') {
2835 stpResp->cmdru.pingStp.repliedCnt = 0;
2836 } else
2837 stpResp->cmdru.pingStp.repliedCnt = atoi(strout);
2838 }
2839 printf("wfaStopPing after scan replied count %i\n",
2840 stpResp->cmdru.pingStp.repliedCnt);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002841
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002842 fclose(tmpfile);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002843
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002844 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002845}
2846
Ankur Vachhanic485b712012-02-15 23:29:49 +00002847/*
Dake Zhao0a832172015-01-06 11:08:47 -08002848 * wfaStaGetP2pDevAddress():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002849 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002850int wfaStaGetP2pDevAddress(int len,
2851 BYTE* caCmdBuf,
2852 int* respLen,
2853 BYTE* respBuf) {
2854 dutCmdResponse_t infoResp;
2855 /* dutCommand_t *getInfo = (dutCommand_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002856
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002857 printf("\n Entry wfaStaGetP2pDevAddress... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002858
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002859 // Fetch the device ID and store into infoResp->cmdru.devid
2860 //strcpy(infoResp->cmdru.devid, str);
2861 strcpy(&infoResp.cmdru.devid[0], "ABCDEFGH");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002862
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002863 infoResp.status = STATUS_COMPLETE;
2864 wfaEncodeTLV(WFA_STA_P2P_GET_DEV_ADDRESS_RESP_TLV, sizeof(infoResp),
2865 (BYTE*)&infoResp, respBuf);
2866 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002867
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002868 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002869}
2870
Ankur Vachhanic485b712012-02-15 23:29:49 +00002871/*
Dake Zhao0a832172015-01-06 11:08:47 -08002872 * wfaStaSetP2p():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002873 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002874int wfaStaSetP2p(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2875 dutCmdResponse_t infoResp;
2876 /* caStaSetP2p_t *getStaSetP2p = (caStaSetP2p_t *)caCmdBuf; uncomment and use it*/
Ankur Vachhanic485b712012-02-15 23:29:49 +00002877
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002878 printf("\n Entry wfaStaSetP2p... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002879
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002880 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002881
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002882 infoResp.status = STATUS_COMPLETE;
2883 wfaEncodeTLV(WFA_STA_P2P_SETP2P_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
2884 respBuf);
2885 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002886
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002887 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002888}
2889/*
Dake Zhao0a832172015-01-06 11:08:47 -08002890 * wfaStaP2pConnect():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002891 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002892int wfaStaP2pConnect(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2893 dutCmdResponse_t infoResp;
2894 /* caStaP2pConnect_t *getStaP2pConnect = (caStaP2pConnect_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002895
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002896 printf("\n Entry wfaStaP2pConnect... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002897
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002898 // Implement the function and does not return anything.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002899
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002900 infoResp.status = STATUS_COMPLETE;
2901 wfaEncodeTLV(WFA_STA_P2P_CONNECT_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
2902 respBuf);
2903 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00002904
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002905 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002906}
2907
2908/*
Dake Zhao0a832172015-01-06 11:08:47 -08002909 * wfaStaStartAutoGo():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002910 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002911int wfaStaStartAutoGo(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2912 dutCmdResponse_t infoResp;
2913 //caStaStartAutoGo_t *getStaStartAutoGo = (caStaStartAutoGo_t *)caCmdBuf;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002914
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002915 printf("\n Entry wfaStaStartAutoGo... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002916
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002917 // Fetch the group ID and store into infoResp->cmdru.grpid
2918 strcpy(&infoResp.cmdru.grpid[0], "ABCDEFGH");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002919
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002920 infoResp.status = STATUS_COMPLETE;
2921 wfaEncodeTLV(WFA_STA_P2P_START_AUTO_GO_RESP_TLV, sizeof(infoResp),
2922 (BYTE*)&infoResp, respBuf);
2923 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002924
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002925 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002926}
2927
Ankur Vachhanic485b712012-02-15 23:29:49 +00002928/*
Dake Zhao0a832172015-01-06 11:08:47 -08002929 * wfaStaP2pStartGrpFormation():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002930 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002931int wfaStaP2pStartGrpFormation(int len,
2932 BYTE* caCmdBuf,
2933 int* respLen,
2934 BYTE* respBuf) {
2935 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002936
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002937 printf("\n Entry wfaStaP2pStartGrpFormation... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002938
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002939 strcpy(infoResp.cmdru.grpFormInfo.result, "CLIENT");
2940 strcpy(infoResp.cmdru.grpFormInfo.grpId, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002941
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002942 infoResp.status = STATUS_COMPLETE;
2943 wfaEncodeTLV(WFA_STA_P2P_START_GRP_FORMATION_RESP_TLV, sizeof(infoResp),
2944 (BYTE*)&infoResp, respBuf);
2945 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00002946
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002947 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002948}
2949
Ankur Vachhanic485b712012-02-15 23:29:49 +00002950/*
Dake Zhao0a832172015-01-06 11:08:47 -08002951 * wfaStaP2pDissolve():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002952 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002953int wfaStaP2pDissolve(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2954 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002955
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002956 printf("\n Entry wfaStaP2pDissolve... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002957
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002958 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002959
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002960 infoResp.status = STATUS_COMPLETE;
2961 wfaEncodeTLV(WFA_STA_P2P_DISSOLVE_RESP_TLV, sizeof(infoResp),
2962 (BYTE*)&infoResp, respBuf);
2963 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002964
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002965 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002966}
2967
2968/*
Dake Zhao0a832172015-01-06 11:08:47 -08002969 * wfaStaSendP2pInvReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002970 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002971int wfaStaSendP2pInvReq(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2972 dutCmdResponse_t infoResp;
2973 /* caStaSendP2pInvReq_t *getStaP2pInvReq= (caStaSendP2pInvReq_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002974
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002975 printf("\n Entry wfaStaSendP2pInvReq... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002976
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002977 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002978
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002979 infoResp.status = STATUS_COMPLETE;
2980 wfaEncodeTLV(WFA_STA_P2P_SEND_INV_REQ_RESP_TLV, sizeof(infoResp),
2981 (BYTE*)&infoResp, respBuf);
2982 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002983
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002984 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002985}
2986
Ankur Vachhanic485b712012-02-15 23:29:49 +00002987/*
Dake Zhao0a832172015-01-06 11:08:47 -08002988 * wfaStaAcceptP2pInvReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002989 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002990int wfaStaAcceptP2pInvReq(int len,
2991 BYTE* caCmdBuf,
2992 int* respLen,
2993 BYTE* respBuf) {
2994 dutCmdResponse_t infoResp;
2995 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08002996 * caStaAcceptP2pInvReq_t *getStaP2pInvReq= (caStaAcceptP2pInvReq_t *)caCmdBuf;
2997 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002998
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002999 printf("\n Entry wfaStaAcceptP2pInvReq... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003000
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003001 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003002
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003003 infoResp.status = STATUS_COMPLETE;
3004 wfaEncodeTLV(WFA_STA_P2P_ACCEPT_INV_REQ_RESP_TLV, sizeof(infoResp),
3005 (BYTE*)&infoResp, respBuf);
3006 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003007
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003008 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003009}
3010
Ankur Vachhanic485b712012-02-15 23:29:49 +00003011/*
Dake Zhao0a832172015-01-06 11:08:47 -08003012 * wfaStaSendP2pProvDisReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003013 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003014int wfaStaSendP2pProvDisReq(int len,
3015 BYTE* caCmdBuf,
3016 int* respLen,
3017 BYTE* respBuf) {
3018 dutCmdResponse_t infoResp;
3019 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003020 * caStaSendP2pProvDisReq_t *getStaP2pProvDisReq= (caStaSendP2pProvDisReq_t *)caCmdBuf;
3021 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003022
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003023 printf("\n Entry wfaStaSendP2pProvDisReq... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003024
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003025 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003026
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003027 infoResp.status = STATUS_COMPLETE;
3028 wfaEncodeTLV(WFA_STA_P2P_SEND_PROV_DIS_REQ_RESP_TLV, sizeof(infoResp),
3029 (BYTE*)&infoResp, respBuf);
3030 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003031
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003032 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003033}
3034
3035/*
Dake Zhao0a832172015-01-06 11:08:47 -08003036 * wfaStaSetWpsPbc():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003037 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003038int wfaStaSetWpsPbc(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3039 dutCmdResponse_t infoResp;
3040 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003041 * caStaSetWpsPbc_t *getStaSetWpsPbc= (caStaSetWpsPbc_t *)caCmdBuf;
3042 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003043
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003044 printf("\n Entry wfaStaSetWpsPbc... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003045
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003046 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003047
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003048 infoResp.status = STATUS_COMPLETE;
3049 wfaEncodeTLV(WFA_STA_WPS_SETWPS_PBC_RESP_TLV, sizeof(infoResp),
3050 (BYTE*)&infoResp, respBuf);
3051 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003052
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003053 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003054}
3055
3056/*
Dake Zhao0a832172015-01-06 11:08:47 -08003057 * wfaStaWpsReadPin():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003058 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003059int wfaStaWpsReadPin(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3060 dutCmdResponse_t infoResp;
3061 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003062 * caStaWpsReadPin_t *getStaWpsReadPin= (caStaWpsReadPin_t *)caCmdBuf;
3063 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003064
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003065 printf("\n Entry wfaStaWpsReadPin... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003066
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003067 // Fetch the device PIN and put in infoResp->cmdru.wpsPin
3068 //strcpy(infoResp->cmdru.wpsPin, "12345678");
3069 strcpy(&infoResp.cmdru.wpsPin[0], "1234456");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003070
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003071 infoResp.status = STATUS_COMPLETE;
3072 wfaEncodeTLV(WFA_STA_WPS_READ_PIN_RESP_TLV, sizeof(infoResp),
3073 (BYTE*)&infoResp, respBuf);
3074 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003075
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003076 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003077}
3078
Ankur Vachhanic485b712012-02-15 23:29:49 +00003079/*
Dake Zhao0a832172015-01-06 11:08:47 -08003080 * wfaStaWpsReadLabel():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003081 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003082int wfaStaWpsReadLabel(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3083 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003084
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003085 printf("\n Entry wfaStaWpsReadLabel... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003086
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003087 // Fetch the device Label and put in infoResp->cmdru.wpsPin
3088 //strcpy(infoResp->cmdru.wpsPin, "12345678");
3089 strcpy(&infoResp.cmdru.wpsPin[0], "1234456");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003090
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003091 infoResp.status = STATUS_COMPLETE;
3092 wfaEncodeTLV(WFA_STA_WPS_READ_PIN_RESP_TLV, sizeof(infoResp),
3093 (BYTE*)&infoResp, respBuf);
3094 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003095
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003096 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003097}
3098
Ankur Vachhanic485b712012-02-15 23:29:49 +00003099/*
Dake Zhao0a832172015-01-06 11:08:47 -08003100 * wfaStaWpsEnterPin():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003101 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003102int wfaStaWpsEnterPin(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3103 dutCmdResponse_t infoResp;
3104 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003105 * caStaWpsEnterPin_t *getStaWpsEnterPin= (caStaWpsEnterPin_t *)caCmdBuf;
3106 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003107
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003108 printf("\n Entry wfaStaWpsEnterPin... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003109
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003110 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003111
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003112 infoResp.status = STATUS_COMPLETE;
3113 wfaEncodeTLV(WFA_STA_WPS_ENTER_PIN_RESP_TLV, sizeof(infoResp),
3114 (BYTE*)&infoResp, respBuf);
3115 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003116
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003117 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003118}
3119
Ankur Vachhanic485b712012-02-15 23:29:49 +00003120/*
Dake Zhao0a832172015-01-06 11:08:47 -08003121 * wfaStaGetPsk():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003122 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003123int wfaStaGetPsk(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3124 dutCmdResponse_t infoResp;
3125 /* caStaGetPsk_t *getStaGetPsk= (caStaGetPsk_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003126
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003127 printf("\n Entry wfaStaGetPsk... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003128
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003129 // Fetch the device PP and SSID and put in infoResp->cmdru.pskInfo
3130 strcpy(&infoResp.cmdru.pskInfo.passPhrase[0], "1234456");
3131 strcpy(&infoResp.cmdru.pskInfo.ssid[0], "WIFI_DIRECT");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003132
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003133 infoResp.status = STATUS_COMPLETE;
3134 wfaEncodeTLV(WFA_STA_P2P_GET_PSK_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3135 respBuf);
3136 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003137
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003138 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003139}
3140
3141/*
Dake Zhao0a832172015-01-06 11:08:47 -08003142 * wfaStaP2pReset():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003143 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003144int wfaStaP2pReset(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3145 dutCmdResponse_t infoResp;
3146 /* dutCommand_t *getStaP2pReset= (dutCommand_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003147
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003148 printf("\n Entry wfaStaP2pReset... ");
3149 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003150
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003151 infoResp.status = STATUS_COMPLETE;
3152 wfaEncodeTLV(WFA_STA_P2P_RESET_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3153 respBuf);
3154 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003155
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003156 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003157}
3158
Ankur Vachhanic485b712012-02-15 23:29:49 +00003159/*
Dake Zhao0a832172015-01-06 11:08:47 -08003160 * wfaStaGetP2pIpConfig():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003161 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003162int wfaStaGetP2pIpConfig(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3163 dutCmdResponse_t infoResp;
3164 /* caStaGetP2pIpConfig_t *staGetP2pIpConfig= (caStaGetP2pIpConfig_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003165
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003166 caStaGetIpConfigResp_t* ifinfo = &(infoResp.cmdru.getIfconfig);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003167
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003168 printf("\n Entry wfaStaGetP2pIpConfig... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003169
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003170 ifinfo->isDhcp = 0;
3171 strcpy(&(ifinfo->ipaddr[0]), "192.165.100.111");
3172 strcpy(&(ifinfo->mask[0]), "255.255.255.0");
3173 strcpy(&(ifinfo->dns[0][0]), "192.165.100.1");
3174 strcpy(&(ifinfo->mac[0]), "ba:ba:ba:ba:ba:ba");
Dake Zhao0a832172015-01-06 11:08:47 -08003175
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003176 infoResp.status = STATUS_COMPLETE;
3177 wfaEncodeTLV(WFA_STA_P2P_GET_IP_CONFIG_RESP_TLV, sizeof(infoResp),
3178 (BYTE*)&infoResp, respBuf);
3179 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003180
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003181 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003182}
3183
Ankur Vachhanic485b712012-02-15 23:29:49 +00003184/*
Dake Zhao0a832172015-01-06 11:08:47 -08003185 * wfaStaSendServiceDiscoveryReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003186 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003187int wfaStaSendServiceDiscoveryReq(int len,
3188 BYTE* caCmdBuf,
3189 int* respLen,
3190 BYTE* respBuf) {
3191 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003192
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003193 printf("\n Entry wfaStaSendServiceDiscoveryReq... ");
3194 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003195
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003196 infoResp.status = STATUS_COMPLETE;
3197 wfaEncodeTLV(WFA_STA_P2P_SEND_SERVICE_DISCOVERY_REQ_RESP_TLV,
3198 sizeof(infoResp), (BYTE*)&infoResp, respBuf);
3199 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003200
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003201 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003202}
3203
Ankur Vachhanic485b712012-02-15 23:29:49 +00003204/*
Dake Zhao0a832172015-01-06 11:08:47 -08003205 * wfaStaSendP2pPresenceReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003206 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003207int wfaStaSendP2pPresenceReq(int len,
3208 BYTE* caCmdBuf,
3209 int* respLen,
3210 BYTE* respBuf) {
3211 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003212
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003213 infoResp.status = STATUS_COMPLETE;
3214 wfaEncodeTLV(WFA_STA_P2P_SEND_PRESENCE_REQ_RESP_TLV, sizeof(infoResp),
3215 (BYTE*)&infoResp, respBuf);
3216 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003217
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003218 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003219}
3220
3221/*
Dake Zhao0a832172015-01-06 11:08:47 -08003222 * wfaStaSetSleepReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003223 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003224int wfaStaSetSleepReq(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3225 dutCmdResponse_t infoResp;
3226 /* caStaSetSleep_t *staSetSleepReq= (caStaSetSleep_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003227
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003228 printf("\n Entry wfaStaSetSleepReq... ");
3229 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003230
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003231 infoResp.status = STATUS_COMPLETE;
3232 wfaEncodeTLV(WFA_STA_P2P_SET_SLEEP_RESP_TLV, sizeof(infoResp),
3233 (BYTE*)&infoResp, respBuf);
3234 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -08003235
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003236 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003237}
3238
3239/*
Dake Zhao0a832172015-01-06 11:08:47 -08003240 * wfaStaSetOpportunisticPsReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003241 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003242int wfaStaSetOpportunisticPsReq(int len,
3243 BYTE* caCmdBuf,
3244 int* respLen,
3245 BYTE* respBuf) {
3246 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003247
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003248 printf("\n Entry wfaStaSetOpportunisticPsReq... ");
3249 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003250
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003251 infoResp.status = STATUS_COMPLETE;
3252 wfaEncodeTLV(WFA_STA_P2P_SET_OPPORTUNISTIC_PS_RESP_TLV, sizeof(infoResp),
3253 (BYTE*)&infoResp, respBuf);
3254 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -08003255
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003256 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003257}
3258#ifndef WFA_STA_TB
3259/*
Dake Zhao0a832172015-01-06 11:08:47 -08003260 * wfaStaPresetParams():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003261 */
3262
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003263int wfaStaPresetParams(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3264 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003265
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003266 DPRINT_INFO(WFA_OUT, "Inside wfaStaPresetParameters function ...\n");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003267
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003268 // Implement the function and its sub commands
3269 infoResp.status = STATUS_COMPLETE;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003270
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003271 wfaEncodeTLV(WFA_STA_PRESET_PARAMETERS_RESP_TLV, 4, (BYTE*)&infoResp,
3272 respBuf);
3273 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003274
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003275 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003276}
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003277int wfaStaSet11n(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3278 dutCmdResponse_t infoResp;
3279 dutCmdResponse_t* v11nParamsResp = &infoResp;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003280
3281#ifdef WFA_11N_SUPPORT_ONLY
Dake Zhao0a832172015-01-06 11:08:47 -08003282
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003283 caSta11n_t* v11nParams = (caSta11n_t*)caCmdBuf;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003284
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003285 int st = 0; // SUCCESS
Dake Zhao0a832172015-01-06 11:08:47 -08003286
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003287 DPRINT_INFO(WFA_OUT, "Inside wfaStaSet11n function....\n");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003288
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003289 if (v11nParams->addba_reject != 0xFF && v11nParams->addba_reject < 2) {
3290 // implement the funciton
3291 if (st != 0) {
3292 v11nParamsResp->status = STATUS_ERROR;
3293 strcpy(v11nParamsResp->cmdru.info, "set_addba_reject failed");
3294 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3295 (BYTE*)v11nParamsResp, respBuf);
3296 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3297 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003298 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003299 }
Dake Zhao0a832172015-01-06 11:08:47 -08003300
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003301 if (v11nParams->ampdu != 0xFF && v11nParams->ampdu < 2) {
3302 // implement the funciton
Ankur Vachhanic485b712012-02-15 23:29:49 +00003303
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003304 if (st != 0) {
3305 v11nParamsResp->status = STATUS_ERROR;
3306 strcpy(v11nParamsResp->cmdru.info, "set_ampdu failed");
3307 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3308 (BYTE*)v11nParamsResp, respBuf);
3309 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3310 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003311 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003312 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003313
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003314 if (v11nParams->amsdu != 0xFF && v11nParams->amsdu < 2) {
3315 // implement the funciton
3316 if (st != 0) {
3317 v11nParamsResp->status = STATUS_ERROR;
3318 strcpy(v11nParamsResp->cmdru.info, "set_amsdu failed");
3319 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3320 (BYTE*)v11nParamsResp, respBuf);
3321 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3322 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003323 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003324 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003325
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003326 if (v11nParams->greenfield != 0xFF && v11nParams->greenfield < 2) {
3327 // implement the funciton
3328 if (st != 0) {
3329 v11nParamsResp->status = STATUS_ERROR;
3330 strcpy(v11nParamsResp->cmdru.info, "_set_greenfield failed");
3331 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3332 (BYTE*)v11nParamsResp, respBuf);
3333 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3334 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003335 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003336 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003337
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003338 if (v11nParams->mcs32 != 0xFF && v11nParams->mcs32 < 2 &&
3339 v11nParams->mcs_fixedrate[0] != '\0') {
3340 // implement the funciton
3341 //st = wfaExecuteCLI(gCmdStr);
3342 if (st != 0) {
3343 v11nParamsResp->status = STATUS_ERROR;
3344 strcpy(v11nParamsResp->cmdru.info, "set_mcs failed");
3345 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3346 (BYTE*)v11nParamsResp, respBuf);
3347 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3348 return FALSE;
Dake Zhao0a832172015-01-06 11:08:47 -08003349 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003350 } else if (v11nParams->mcs32 != 0xFF && v11nParams->mcs32 < 2 &&
3351 v11nParams->mcs_fixedrate[0] == '\0') {
3352 // implement the funciton
3353 //st = wfaExecuteCLI(gCmdStr);
3354 if (st != 0) {
3355 v11nParamsResp->status = STATUS_ERROR;
3356 strcpy(v11nParamsResp->cmdru.info, "set_mcs32 failed");
3357 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3358 (BYTE*)v11nParamsResp, respBuf);
3359 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3360 return FALSE;
Dake Zhao0a832172015-01-06 11:08:47 -08003361 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003362 } else if (v11nParams->mcs32 == 0xFF &&
3363 v11nParams->mcs_fixedrate[0] != '\0') {
3364 // implement the funciton
3365 //st = wfaExecuteCLI(gCmdStr);
3366 if (st != 0) {
3367 v11nParamsResp->status = STATUS_ERROR;
3368 strcpy(v11nParamsResp->cmdru.info, "set_mcs32 failed");
3369 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3370 (BYTE*)v11nParamsResp, respBuf);
3371 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3372 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003373 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003374 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003375
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003376 if (v11nParams->rifs_test != 0xFF && v11nParams->rifs_test < 2) {
3377 // implement the funciton
3378 //st = wfaExecuteCLI(gCmdStr);
3379 if (st != 0) {
3380 v11nParamsResp->status = STATUS_ERROR;
3381 strcpy(v11nParamsResp->cmdru.info, "set_rifs_test failed");
3382 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3383 (BYTE*)v11nParamsResp, respBuf);
3384 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3385 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003386 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003387 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003388
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003389 if (v11nParams->sgi20 != 0xFF && v11nParams->sgi20 < 2) {
3390 // implement the funciton
3391 //st = wfaExecuteCLI(gCmdStr);
3392 if (st != 0) {
3393 v11nParamsResp->status = STATUS_ERROR;
3394 strcpy(v11nParamsResp->cmdru.info, "set_sgi20 failed");
3395 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3396 (BYTE*)v11nParamsResp, respBuf);
3397 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3398 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003399 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003400 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003401
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003402 if (v11nParams->smps != 0xFFFF) {
3403 if (v11nParams->smps == 0) {
3404 // implement the funciton
3405 //st = wfaExecuteCLI(gCmdStr);
3406 } else if (v11nParams->smps == 1) {
3407 // implement the funciton
3408 //st = wfaExecuteCLI(gCmdStr);
3409 ;
3410 } else if (v11nParams->smps == 2) {
3411 // implement the funciton
3412 //st = wfaExecuteCLI(gCmdStr);
3413 ;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003414 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003415 if (st != 0) {
3416 v11nParamsResp->status = STATUS_ERROR;
3417 strcpy(v11nParamsResp->cmdru.info, "set_smps failed");
3418 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3419 (BYTE*)v11nParamsResp, respBuf);
3420 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3421 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003422 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003423 }
Dake Zhao0a832172015-01-06 11:08:47 -08003424
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003425 if (v11nParams->stbc_rx != 0xFFFF) {
3426 // implement the funciton
3427 //st = wfaExecuteCLI(gCmdStr);
3428 if (st != 0) {
3429 v11nParamsResp->status = STATUS_ERROR;
3430 strcpy(v11nParamsResp->cmdru.info, "set_stbc_rx failed");
3431 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3432 (BYTE*)v11nParamsResp, respBuf);
3433 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3434 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003435 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003436 }
Dake Zhao0a832172015-01-06 11:08:47 -08003437
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003438 if (v11nParams->width[0] != '\0') {
3439 // implement the funciton
3440 //st = wfaExecuteCLI(gCmdStr);
3441 if (st != 0) {
3442 v11nParamsResp->status = STATUS_ERROR;
3443 strcpy(v11nParamsResp->cmdru.info, "set_11n_channel_width failed");
3444 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3445 (BYTE*)v11nParamsResp, respBuf);
3446 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3447 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003448 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003449 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003450
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003451 if (v11nParams->_40_intolerant != 0xFF && v11nParams->_40_intolerant < 2) {
3452 // implement the funciton
3453 //st = wfaExecuteCLI(gCmdStr);
3454 if (st != 0) {
3455 v11nParamsResp->status = STATUS_ERROR;
3456 strcpy(v11nParamsResp->cmdru.info, "set_40_intolerant failed");
3457 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3458 (BYTE*)v11nParamsResp, respBuf);
3459 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3460 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003461 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003462 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003463
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003464 if (v11nParams->txsp_stream != 0 && v11nParams->txsp_stream < 4) {
3465 // implement the funciton
3466 //st = wfaExecuteCLI(gCmdStr);
3467 if (st != 0) {
3468 v11nParamsResp->status = STATUS_ERROR;
3469 strcpy(v11nParamsResp->cmdru.info, "set_txsp_stream failed");
3470 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3471 (BYTE*)v11nParamsResp, respBuf);
3472 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3473 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003474 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003475 }
3476
3477 if (v11nParams->rxsp_stream != 0 && v11nParams->rxsp_stream < 4) {
3478 // implement the funciton
3479 //st = wfaExecuteCLI(gCmdStr);
3480 if (st != 0) {
3481 v11nParamsResp->status = STATUS_ERROR;
3482 strcpy(v11nParamsResp->cmdru.info, "set_rxsp_stream failed");
3483 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3484 (BYTE*)v11nParamsResp, respBuf);
3485 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3486 return FALSE;
3487 }
3488 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003489
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003490#endif
Ankur Vachhanic485b712012-02-15 23:29:49 +00003491
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003492 v11nParamsResp->status = STATUS_COMPLETE;
3493 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, 4, (BYTE*)v11nParamsResp, respBuf);
3494 *respLen = WFA_TLV_HDR_LEN + 4;
3495 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003496}
3497#endif
3498/*
Dake Zhao0a832172015-01-06 11:08:47 -08003499 * wfaStaAddArpTableEntry():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003500 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003501int wfaStaAddArpTableEntry(int len,
3502 BYTE* caCmdBuf,
3503 int* respLen,
3504 BYTE* respBuf) {
3505 dutCmdResponse_t infoResp;
3506 /* caStaAddARPTableEntry_t *staAddARPTableEntry= (caStaAddARPTableEntry_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003507
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003508 printf("\n Entry wfastaAddARPTableEntry... ");
3509 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003510
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003511 infoResp.status = STATUS_COMPLETE;
3512 wfaEncodeTLV(WFA_STA_P2P_ADD_ARP_TABLE_ENTRY_RESP_TLV, sizeof(infoResp),
3513 (BYTE*)&infoResp, respBuf);
3514 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003515
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003516 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003517}
3518
3519/*
Dake Zhao0a832172015-01-06 11:08:47 -08003520 * wfaStaBlockICMPResponse():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003521 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003522int wfaStaBlockICMPResponse(int len,
3523 BYTE* caCmdBuf,
3524 int* respLen,
3525 BYTE* respBuf) {
3526 dutCmdResponse_t infoResp;
3527 /* caStaBlockICMPResponse_t *staAddARPTableEntry= (caStaBlockICMPResponse_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003528
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003529 printf("\n Entry wfaStaBlockICMPResponse... ");
3530 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003531
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003532 infoResp.status = STATUS_COMPLETE;
3533 wfaEncodeTLV(WFA_STA_P2P_BLOCK_ICMP_RESPONSE_RESP_TLV, sizeof(infoResp),
3534 (BYTE*)&infoResp, respBuf);
3535 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003536
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003537 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003538}
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003539
3540/*
Dake Zhao0a832172015-01-06 11:08:47 -08003541 * wfaStaSetRadio():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003542 */
3543
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003544int wfaStaSetRadio(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3545 dutCommand_t* setRadio = (dutCommand_t*)caCmdBuf;
3546 dutCmdResponse_t* staCmdResp = &gGenericResp;
3547 caStaSetRadio_t* sr = &setRadio->cmdsu.sr;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003548
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003549 if (sr->mode == WFA_OFF) {
3550 // turn radio off
3551 } else {
3552 // always turn the radio on
3553 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003554
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003555 staCmdResp->status = STATUS_COMPLETE;
3556 wfaEncodeTLV(WFA_STA_SET_RADIO_RESP_TLV, 4, (BYTE*)staCmdResp, respBuf);
3557 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003558
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003559 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003560}
3561
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003562/*
Dake Zhao0a832172015-01-06 11:08:47 -08003563 * wfaStaSetRFeature():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003564 */
3565
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003566int wfaStaSetRFeature(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3567 dutCommand_t* dutCmd = (dutCommand_t*)caCmdBuf;
3568 caStaRFeat_t* rfeat = &dutCmd->cmdsu.rfeat;
3569 dutCmdResponse_t* caResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003570
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003571 if (strcasecmp(rfeat->prog, "tdls") == 0) {
3572 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003573
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003574 caResp->status = STATUS_COMPLETE;
3575 wfaEncodeTLV(WFA_STA_SET_RFEATURE_RESP_TLV, 4, (BYTE*)caResp, respBuf);
3576 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003577
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003578 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003579}
3580
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003581/*
Dake Zhao0a832172015-01-06 11:08:47 -08003582 * wfaStaStartWfdConnection():
3583 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003584int wfaStaStartWfdConnection(int len,
3585 BYTE* caCmdBuf,
3586 int* respLen,
3587 BYTE* respBuf) {
3588 dutCmdResponse_t infoResp;
3589 //caStaStartWfdConn_t *staStartWfdConn= (caStaStartWfdConn_t *)caCmdBuf; //uncomment and use it
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003590
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003591 printf("\n Entry wfaStaStartWfdConnection... ");
Dake Zhao0a832172015-01-06 11:08:47 -08003592
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003593 // Fetch the GrpId and WFD session and return
3594 strcpy(&infoResp.cmdru.wfdConnInfo.wfdSessionId[0], "1234567890");
3595 strcpy(&infoResp.cmdru.wfdConnInfo.p2pGrpId[0], "WIFI_DISPLAY");
3596 strcpy(&infoResp.cmdru.wfdConnInfo.result[0], "GO");
Dake Zhao0a832172015-01-06 11:08:47 -08003597
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003598 infoResp.status = STATUS_COMPLETE;
3599 wfaEncodeTLV(WFA_STA_START_WFD_CONNECTION_RESP_TLV, sizeof(infoResp),
3600 (BYTE*)&infoResp, respBuf);
3601 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003602
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003603 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003604}
3605/*
Dake Zhao0a832172015-01-06 11:08:47 -08003606 * wfaStaCliCommand():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003607 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003608
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003609int wfaStaCliCommand(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3610 char cmdName[32];
3611 char *pcmdStr = NULL, *str;
3612 int st = 1;
3613 char CmdStr[WFA_CMD_STR_SZ];
3614 FILE* wfaCliFd;
3615 char wfaCliBuff[64];
3616 char retstr[256];
3617 int CmdReturnFlag = 0;
3618 char tmp[256];
3619 FILE* sh_pipe = NULL;
3620 caStaCliCmdResp_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003621
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003622 printf("\nEntry wfaStaCliCommand; command Received: %s\n", caCmdBuf);
3623 memcpy(cmdName, strtok_r((char*)caCmdBuf, ",", (char**)&pcmdStr), 32);
3624 sprintf(CmdStr, "%s", cmdName);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003625
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003626 for (;;) {
3627 // construct CLI standard cmd string
3628 str = strtok_r(NULL, ",", &pcmdStr);
3629 if (str == NULL || str[0] == '\0')
3630 break;
3631 else {
3632 strcat(strcat(CmdStr, " /"), str);
3633 str = strtok_r(NULL, ",", &pcmdStr);
3634 strcat(strcat(CmdStr, " "), str);
Dake Zhao0a832172015-01-06 11:08:47 -08003635 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003636 }
3637 // check the return process
3638 wfaCliFd = fopen("/etc/WfaEndpoint/wfa_cli.txt", "r");
3639 if (wfaCliFd != NULL) {
3640 while (fgets(wfaCliBuff, 64, wfaCliFd) != NULL) {
3641 //printf("\nLine read from CLI file : %s",wfaCliBuff);
3642 if (ferror(wfaCliFd))
3643 break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003644
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003645 str = strtok(wfaCliBuff, "-");
3646 if (strcmp(str, cmdName) == 0) {
3647 str = strtok(NULL, ",");
3648 if (str != NULL) {
3649 if (strcmp(str, "TRUE") == 0)
3650 CmdReturnFlag = 1;
3651 } else
3652 printf(
3653 "ERR wfa_cli.txt, inside line format not end with , or missing "
3654 "TRUE/FALSE\n");
3655 break;
3656 }
Dake Zhao0a832172015-01-06 11:08:47 -08003657 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003658 fclose(wfaCliFd);
3659 } else {
3660 printf("/etc/WfaEndpoint/wfa_cli.txt is not exist\n");
3661 goto cleanup;
3662 }
3663
3664 //printf("\n Command Return Flag : %d",CmdReturnFlag);
3665 memset(&retstr[0], '\0', 255);
3666 memset(&tmp[0], '\0', 255);
3667 sprintf(gCmdStr, "%s", CmdStr);
3668 printf("\nCLI Command -- %s\n", gCmdStr);
3669
3670 sh_pipe = popen(gCmdStr, "r");
3671 if (!sh_pipe) {
3672 printf("Error in opening pipe\n");
3673 goto cleanup;
3674 }
3675
3676 sleep(5);
3677 //tmp_val=getdelim(&retstr,255,"\n",sh_pipe);
3678 if (fgets(&retstr[0], 255, sh_pipe) == NULL) {
3679 printf("Getting NULL string in popen return\n");
3680 goto cleanup;
3681 } else
3682 printf("popen return str=%s\n", retstr);
3683
3684 sleep(2);
3685 if (pclose(sh_pipe) == -1) {
3686 printf("Error in closing shell cmd pipe\n");
3687 goto cleanup;
3688 }
3689 sh_pipe = NULL;
3690 sleep(2);
3691
3692 // find status first in output
3693 str = strtok_r((char*)retstr, "-", (char**)&pcmdStr);
3694 if (str != NULL) {
3695 memset(tmp, 0, 10);
3696 memcpy(tmp, str, 2);
3697 printf("cli status=%s\n", tmp);
3698 if (strlen(tmp) > 0)
3699 st = atoi(tmp);
Dake Zhao0a832172015-01-06 11:08:47 -08003700 else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003701 printf("Missing status code\n");
3702 } else {
3703 printf("wfaStaCliCommand no return code found\n");
3704 }
3705 infoResp.resFlag = CmdReturnFlag;
Dake Zhao0a832172015-01-06 11:08:47 -08003706
Dake Zhao97708202014-11-26 13:59:04 -08003707cleanup:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003708 if (sh_pipe)
3709 pclose(sh_pipe);
Dake Zhao0a832172015-01-06 11:08:47 -08003710
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003711 switch (st) {
Dake Zhao0a832172015-01-06 11:08:47 -08003712 case 0:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003713 infoResp.status = STATUS_COMPLETE;
3714 if (CmdReturnFlag) {
3715 if ((pcmdStr != NULL) && (strlen(pcmdStr) > 0)) {
3716 memset(&(infoResp.result[0]), '\0', WFA_CLI_CMD_RESP_LEN - 1);
3717 strncpy(&infoResp.result[0], pcmdStr,
3718 (strlen(pcmdStr) < WFA_CLI_CMD_RESP_LEN)
3719 ? strlen(pcmdStr)
3720 : (WFA_CLI_CMD_RESP_LEN - 2));
3721 printf("Return CLI result string to CA=%s\n", &(infoResp.result[0]));
3722 } else {
3723 strcpy(&infoResp.result[0], "No return string found\n");
Dake Zhao0a832172015-01-06 11:08:47 -08003724 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003725 }
3726 break;
Dake Zhao0a832172015-01-06 11:08:47 -08003727 case 1:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003728 infoResp.status = STATUS_ERROR;
3729 break;
Dake Zhao0a832172015-01-06 11:08:47 -08003730 case 2:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003731 infoResp.status = STATUS_INVALID;
3732 break;
3733 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003734
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003735 wfaEncodeTLV(WFA_STA_CLI_CMD_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3736 respBuf);
3737 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003738
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003739 printf("Exit from wfaStaCliCommand\n");
3740 return TRUE;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003741}
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003742/*
Dake Zhao0a832172015-01-06 11:08:47 -08003743 * wfaStaConnectGoStartWfd():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003744 */
3745
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003746int wfaStaConnectGoStartWfd(int len,
3747 BYTE* caCmdBuf,
3748 int* respLen,
3749 BYTE* respBuf) {
3750 dutCmdResponse_t infoResp;
3751 // caStaConnectGoStartWfd_t *staConnecGoStartWfd= (caStaConnectGoStartWfd_t *)caCmdBuf; //uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003752
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003753 printf("\n Entry wfaStaConnectGoStartWfd... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003754
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003755 // connect the specified GO and then establish the wfd session
Dake Zhao0a832172015-01-06 11:08:47 -08003756
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003757 // Fetch WFD session and return
3758 strcpy(&infoResp.cmdru.wfdConnInfo.wfdSessionId[0], "1234567890");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003759
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003760 infoResp.status = STATUS_COMPLETE;
3761 wfaEncodeTLV(WFA_STA_CONNECT_GO_START_WFD_RESP_TLV, sizeof(infoResp),
3762 (BYTE*)&infoResp, respBuf);
3763 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003764
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003765 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003766}
3767
3768/*
Dake Zhao0a832172015-01-06 11:08:47 -08003769 * wfaStaGenerateEvent():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003770 */
3771
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003772int wfaStaGenerateEvent(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3773 dutCmdResponse_t infoResp;
3774 caStaGenEvent_t* staGenerateEvent =
3775 (caStaGenEvent_t*)caCmdBuf; //uncomment and use it
3776 caWfdStaGenEvent_t* wfdGenEvent;
Dake Zhao0a832172015-01-06 11:08:47 -08003777
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003778 printf("\n Entry wfaStaGenerateEvent... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003779
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003780 // Geneate the specified action and return with complete/error.
3781 if (staGenerateEvent->program == PROG_TYPE_WFD) {
3782 wfdGenEvent = &staGenerateEvent->wfdEvent;
3783 if (wfdGenEvent->type == eUibcGen) {
3784 } else if (wfdGenEvent->type == eUibcHid) {
3785 } else if (wfdGenEvent->type == eFrameSkip) {
3786 } else if (wfdGenEvent->type == eI2cRead) {
3787 } else if (wfdGenEvent->type == eI2cWrite) {
3788 } else if (wfdGenEvent->type == eInputContent) {
3789 } else if (wfdGenEvent->type == eIdrReq) {
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003790 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003791 }
Dake Zhao0a832172015-01-06 11:08:47 -08003792
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003793 infoResp.status = STATUS_COMPLETE;
3794 wfaEncodeTLV(WFA_STA_GENERATE_EVENT_RESP_TLV, sizeof(infoResp),
3795 (BYTE*)&infoResp, respBuf);
3796 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003797
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003798 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003799}
3800
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003801/*
Dake Zhao0a832172015-01-06 11:08:47 -08003802 * wfaStaReinvokeWfdSession():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003803 */
3804
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003805int wfaStaReinvokeWfdSession(int len,
3806 BYTE* caCmdBuf,
3807 int* respLen,
3808 BYTE* respBuf) {
3809 dutCmdResponse_t infoResp;
3810 // caStaReinvokeWfdSession_t *staReinvokeSession= (caStaReinvokeWfdSession_t *)caCmdBuf; //uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003811
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003812 printf("\n Entry wfaStaReinvokeWfdSession... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003813
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003814 // Reinvoke the WFD session by accepting the p2p invitation or sending p2p invitation
Dake Zhao0a832172015-01-06 11:08:47 -08003815
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003816 infoResp.status = STATUS_COMPLETE;
3817 wfaEncodeTLV(WFA_STA_REINVOKE_WFD_SESSION_RESP_TLV, sizeof(infoResp),
3818 (BYTE*)&infoResp, respBuf);
3819 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003820
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003821 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003822}
3823
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003824int wfaStaGetParameter(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3825 dutCmdResponse_t infoResp;
3826 caStaGetParameter_t* staGetParam =
3827 (caStaGetParameter_t*)caCmdBuf; //uncomment and use it
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003828
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003829 caStaGetParameterResp_t* paramList = &infoResp.cmdru.getParamValue;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003830
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003831 printf("\n Entry wfaStaGetParameter... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003832
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003833 // Check the program type
3834 if (staGetParam->program == PROG_TYPE_WFD) {
3835 if (staGetParam->getParamValue == eDiscoveredDevList) {
3836 // Get the discovered devices, make space seperated list and return, check list is not bigger than 128 bytes.
3837 paramList->getParamType = eDiscoveredDevList;
3838 strcpy((char*)&paramList->devList,
3839 "11:22:33:44:55:66 22:33:44:55:66:77 33:44:55:66:77:88");
Dake Zhao0a832172015-01-06 11:08:47 -08003840 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003841 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003842
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003843 if (staGetParam->program == PROG_TYPE_WFDS) {
3844 if (staGetParam->getParamValue == eDiscoveredDevList) {
3845 // Get the discovered devices, make space seperated list and return, check list is not bigger than 128 bytes.
3846 paramList->getParamType = eDiscoveredDevList;
3847 strcpy((char*)&paramList->devList,
3848 "11:22:33:44:55:66 22:33:44:55:66:77 33:44:55:66:77:88");
Dake Zhaocda4a1d2015-06-11 10:14:15 -07003849 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003850 if (staGetParam->getParamValue == eOpenPorts) {
3851 // Run the port checker tool
3852 // Get all the open ports and make space seperated list and return, check list is not bigger than 128 bytes.
3853 paramList->getParamType = eOpenPorts;
3854 strcpy((char*)&paramList->devList, "22 139 445 68 9700");
3855 }
3856 }
3857 if (staGetParam->program == PROG_TYPE_NAN) {
3858 if (staGetParam->getParamValue == eMasterPref) {
3859 // Get the master preference of the device and return the value
3860 paramList->getParamType = eMasterPref;
3861 strcpy((char*)&paramList->masterPref, "0xff");
3862 }
3863 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003864
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003865 infoResp.status = STATUS_COMPLETE;
3866 wfaEncodeTLV(WFA_STA_GET_PARAMETER_RESP_TLV, sizeof(infoResp),
3867 (BYTE*)&infoResp, respBuf);
3868 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
3869
3870 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003871}
3872
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003873int wfaStaNfcAction(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3874 dutCmdResponse_t infoResp;
3875 caStaNfcAction_t* getStaNfcAction =
3876 (caStaNfcAction_t*)caCmdBuf; //uncomment and use it
Ankur Vachhanic485b712012-02-15 23:29:49 +00003877
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003878 printf("\n Entry wfaStaNfcAction... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003879
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003880 if (getStaNfcAction->nfcOperation == eNfcHandOver) {
3881 printf("\n NfcAction - HandOver... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003882
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003883 } else if (getStaNfcAction->nfcOperation == eNfcReadTag) {
3884 printf("\n NfcAction - Read Tag... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003885
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003886 } else if (getStaNfcAction->nfcOperation == eNfcWriteSelect) {
3887 printf("\n NfcAction - Write Select... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003888
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003889 } else if (getStaNfcAction->nfcOperation == eNfcWriteConfig) {
3890 printf("\n NfcAction - Write Config... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003891
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003892 } else if (getStaNfcAction->nfcOperation == eNfcWritePasswd) {
3893 printf("\n NfcAction - Write Password... ");
3894
3895 } else if (getStaNfcAction->nfcOperation == eNfcWpsHandOver) {
3896 printf("\n NfcAction - WPS Handover... ");
3897 }
3898
3899 // Fetch the device mode and put in infoResp->cmdru.p2presult
3900 //strcpy(infoResp->cmdru.p2presult, "GO");
3901
3902 // Fetch the device grp id and put in infoResp->cmdru.grpid
3903 //strcpy(infoResp->cmdru.grpid, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
3904
3905 strcpy(infoResp.cmdru.staNfcAction.result, "CLIENT");
3906 strcpy(infoResp.cmdru.staNfcAction.grpId, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
3907 infoResp.cmdru.staNfcAction.peerRole = 1;
3908
3909 infoResp.status = STATUS_COMPLETE;
3910 wfaEncodeTLV(WFA_STA_NFC_ACTION_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3911 respBuf);
3912 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
3913
3914 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07003915}
3916
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003917int wfaStaExecAction(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3918 dutCmdResponse_t infoResp;
3919 caStaExecAction_t* staExecAction =
3920 (caStaExecAction_t*)caCmdBuf; //comment if not used
Dake Zhaocda4a1d2015-06-11 10:14:15 -07003921
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003922 printf("\n Entry wfaStaExecAction... ");
Dake Zhaocda4a1d2015-06-11 10:14:15 -07003923
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003924 if (staExecAction->prog == PROG_TYPE_NAN) {
3925 // Perform necessary configurations and actions
3926 // return the MAC address conditionally as per CAPI specification
3927 }
3928
3929 infoResp.status = STATUS_COMPLETE;
3930 wfaEncodeTLV(WFA_STA_EXEC_ACTION_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3931 respBuf);
3932 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
3933
3934 return WFA_SUCCESS;
Dake Zhaocda4a1d2015-06-11 10:14:15 -07003935}
3936
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003937int wfaStaInvokeCommand(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3938 dutCmdResponse_t infoResp;
3939 caStaInvokeCmd_t* staInvokeCmd =
3940 (caStaInvokeCmd_t*)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07003941
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003942 printf("\n Entry wfaStaInvokeCommand... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003943
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003944 // based on the command type , invoke API or complete the required procedures
3945 // return the defined parameters based on the command that is received ( example response below)
Dake Zhao655efed2015-03-11 17:39:13 -07003946
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003947 if (staInvokeCmd->cmdType == ePrimitiveCmdType &&
3948 staInvokeCmd->InvokeCmds.primtiveType.PrimType == eCmdPrimTypeAdvt) {
3949 infoResp.cmdru.staInvokeCmd.invokeCmdRspType = eCmdPrimTypeAdvt;
3950 infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.numServInfo = 1;
3951 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.servAdvInfo[0]
3952 .servName,
3953 "org.wi-fi.wfds.send.rx");
3954 infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.servAdvInfo[0].advtID =
3955 0x0000f;
3956 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.servAdvInfo[0]
3957 .serviceMac,
3958 "ab:cd:ef:gh:ij:kl");
3959 } else if (staInvokeCmd->cmdType == ePrimitiveCmdType &&
3960 staInvokeCmd->InvokeCmds.primtiveType.PrimType ==
3961 eCmdPrimTypeSeek) {
3962 infoResp.cmdru.staInvokeCmd.invokeCmdRspType = eCmdPrimTypeSeek;
3963 infoResp.cmdru.staInvokeCmd.invokeCmdResp.seekRsp.searchID = 0x000ff;
3964 } else if (staInvokeCmd->cmdType == ePrimitiveCmdType &&
3965 staInvokeCmd->InvokeCmds.primtiveType.PrimType ==
3966 eCmdPrimTypeConnSession) {
3967 infoResp.cmdru.staInvokeCmd.invokeCmdRspType = eCmdPrimTypeConnSession;
3968 infoResp.cmdru.staInvokeCmd.invokeCmdResp.connSessResp.sessionID = 0x000ff;
3969 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.connSessResp.result, "GO");
3970 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.connSessResp.grpId,
3971 "DIRECT-AB WFADUT");
3972 }
3973 infoResp.status = STATUS_COMPLETE;
3974 wfaEncodeTLV(WFA_STA_INVOKE_CMD_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3975 respBuf);
3976 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao655efed2015-03-11 17:39:13 -07003977
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003978 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07003979}
3980
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003981int wfaStaManageService(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3982 dutCmdResponse_t infoResp;
3983 //caStaMngServ_t *staMngServ = (caStaMngServ_t *)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07003984
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003985 printf("\n Entry wfaStaManageService... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003986
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003987 // based on the manage service type , invoke API's or complete the required procedures
3988 // return the defined parameters based on the command that is received ( example response below)
3989 strcpy(infoResp.cmdru.staManageServ.result, "CLIENT");
3990 strcpy(infoResp.cmdru.staManageServ.grpId, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
3991 infoResp.cmdru.staManageServ.sessionID = 0x000ff;
Dake Zhao655efed2015-03-11 17:39:13 -07003992
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003993 infoResp.status = STATUS_COMPLETE;
3994 wfaEncodeTLV(WFA_STA_MANAGE_SERVICE_RESP_TLV, sizeof(infoResp),
3995 (BYTE*)&infoResp, respBuf);
3996 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao655efed2015-03-11 17:39:13 -07003997
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003998 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07003999}
4000
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004001int wfaStaGetEvents(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
4002 dutCmdResponse_t infoResp;
4003 caStaGetEvents_t* staGetEvents =
4004 (caStaGetEvents_t*)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07004005
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004006 printf("\n Entry wfaStaGetEvents... ");
Dake Zhao655efed2015-03-11 17:39:13 -07004007
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004008 if (staGetEvents->program == PROG_TYPE_NAN) {
4009 // Get all the events from the Log file or stored events
4010 // return the received/recorded event details - eventName, remoteInstanceID, localInstanceID, mac
4011 }
Dake Zhao655efed2015-03-11 17:39:13 -07004012
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004013 // Get all the event from the Log file or stored events
4014 // return the received/recorded events as space seperated list ( example response below)
4015 strcpy(infoResp.cmdru.staGetEvents.result,
4016 "SearchResult SearchTerminated AdvertiseStatus SessionRequest "
4017 "ConnectStatus SessionStatus PortStatus");
4018
4019 infoResp.status = STATUS_COMPLETE;
4020 wfaEncodeTLV(WFA_STA_GET_EVENTS_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
4021 respBuf);
4022 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
4023
4024 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07004025}
4026
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004027int wfaStaGetEventDetails(int len,
4028 BYTE* caCmdBuf,
4029 int* respLen,
4030 BYTE* respBuf) {
4031 dutCmdResponse_t infoResp;
4032 caStaGetEventDetails_t* getStaGetEventDetails =
4033 (caStaGetEventDetails_t*)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07004034
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004035 printf("\n Entry wfaStaGetEventDetails... ");
Dake Zhao655efed2015-03-11 17:39:13 -07004036
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004037 // based on the Requested Event type
4038 // return the latest corresponding evnet detailed parameters ( example response below)
Dake Zhao655efed2015-03-11 17:39:13 -07004039
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004040 if (getStaGetEventDetails->eventId == eSearchResult) {
4041 // fetch from log file or event history for the search result event and return the parameters
4042 infoResp.cmdru.staGetEventDetails.eventID = eSearchResult;
Dake Zhao655efed2015-03-11 17:39:13 -07004043
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004044 infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult.searchID =
4045 0x00abcd;
4046 strcpy(infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult
4047 .serviceMac,
4048 "ab:cd:ef:gh:ij:kl");
4049 infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult.advID =
4050 0x00dcba;
4051 strcpy(infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult
4052 .serviceName,
4053 "org.wi-fi.wfds.send.rx");
Dake Zhao655efed2015-03-11 17:39:13 -07004054
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004055 infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult
4056 .serviceStatus = eServiceAvilable;
4057 } else if (
4058 getStaGetEventDetails->eventId ==
4059 eSearchTerminated) { // fetch from log file or event history for the search terminated event and return the parameters
4060 infoResp.cmdru.staGetEventDetails.eventID = eSearchTerminated;
4061 infoResp.cmdru.staGetEventDetails.getEventDetails.searchTerminated
4062 .searchID = 0x00abcd;
4063 } else if (
4064 getStaGetEventDetails->eventId ==
4065 eAdvertiseStatus) { // fetch from log file or event history for the Advertise Status event and return the parameters
4066 infoResp.cmdru.staGetEventDetails.eventID = eAdvertiseStatus;
4067 infoResp.cmdru.staGetEventDetails.getEventDetails.advStatus.advID =
4068 0x00dcba;
Dake Zhao655efed2015-03-11 17:39:13 -07004069
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004070 infoResp.cmdru.staGetEventDetails.getEventDetails.advStatus.status =
4071 eAdvertised;
4072 } else if (
4073 getStaGetEventDetails->eventId ==
4074 eSessionRequest) { // fetch from log file or event history for the session request event and return the parameters
4075 infoResp.cmdru.staGetEventDetails.eventID = eSessionRequest;
4076 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionReq.advID =
4077 0x00dcba;
4078 strcpy(
4079 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionReq.sessionMac,
4080 "ab:cd:ef:gh:ij:kl");
4081 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionReq.sessionID =
4082 0x00baba;
4083 } else if (
4084 getStaGetEventDetails->eventId ==
4085 eSessionStatus) { // fetch from log file or event history for the session status event and return the parameters
4086 infoResp.cmdru.staGetEventDetails.eventID = eSessionStatus;
4087 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionStatus.sessionID =
4088 0x00baba;
4089 strcpy(infoResp.cmdru.staGetEventDetails.getEventDetails.sessionStatus
4090 .sessionMac,
4091 "ab:cd:ef:gh:ij:kl");
4092 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionStatus.state =
4093 eSessionStateOpen;
4094 } else if (getStaGetEventDetails->eventId == eConnectStatus) {
4095 infoResp.cmdru.staGetEventDetails.eventID = eConnectStatus;
4096 infoResp.cmdru.staGetEventDetails.getEventDetails.connStatus.sessionID =
4097 0x00baba;
4098 strcpy(
4099 infoResp.cmdru.staGetEventDetails.getEventDetails.connStatus.sessionMac,
4100 "ab:cd:ef:gh:ij:kl");
4101 infoResp.cmdru.staGetEventDetails.getEventDetails.connStatus.status =
4102 eGroupFormationComplete;
Dake Zhao655efed2015-03-11 17:39:13 -07004103
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004104 } else if (getStaGetEventDetails->eventId == ePortStatus) {
4105 infoResp.cmdru.staGetEventDetails.eventID = ePortStatus;
4106 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.sessionID =
4107 0x00baba;
4108 strcpy(
4109 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.sessionMac,
4110 "ab:cd:ef:gh:ij:kl");
4111 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.port = 1009;
4112 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.status =
4113 eLocalPortAllowed;
4114 }
Dake Zhao655efed2015-03-11 17:39:13 -07004115
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004116 infoResp.status = STATUS_COMPLETE;
4117 wfaEncodeTLV(WFA_STA_GET_EVENT_DETAILS_RESP_TLV, sizeof(infoResp),
4118 (BYTE*)&infoResp, respBuf);
4119 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao655efed2015-03-11 17:39:13 -07004120
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004121 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07004122}