blob: fef2ffa277f1c96d7ffaa1614d007d4a6ba96ae0 [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 }
536 sprintf(gCmdStr, "echo nameserv %s > /etc/resolv.conf", ipconfig->pri_dns);
537 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) {
543 sprintf(gCmdStr, "echo nameserv %s >> /etc/resolv.conf", ipconfig->sec_dns);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200544 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +0200545 sret = systemWithLog(gCmdStr);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200546 if (sret != 0) {
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800547 DPRINT_INFO(WFA_OUT, "exit code %d writing resolv.conf\n", sret);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200548 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800549 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000550
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800551 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800552 * report status
553 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800554 staSetIpResp->status = STATUS_COMPLETE;
555 wfaEncodeTLV(WFA_STA_SET_IP_CONFIG_RESP_TLV, 4, (BYTE*)staSetIpResp, respBuf);
556 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000557
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800558 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000559}
560
561/*
562 * wfaStaVerifyIpConnection():
563 * The function is to verify if the station has IP connection with an AP by
564 * send ICMP/pings to the AP.
Dake Zhao0a832172015-01-06 11:08:47 -0800565 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800566int wfaStaVerifyIpConnection(int len,
567 BYTE* caCmdBuf,
568 int* respLen,
569 BYTE* respBuf) {
570 dutCommand_t* verip = (dutCommand_t*)caCmdBuf;
571 dutCmdResponse_t* verifyIpResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000572
573#ifndef WFA_PING_UDP_ECHO_ONLY
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800574 char strout[64], *pcnt;
575 FILE* tmpfile;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000576
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800577 DPRINT_INFO(WFA_OUT, "Entering wfaStaVerifyIpConnection ...\n");
Dake Zhao0a832172015-01-06 11:08:47 -0800578
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800579 /* set timeout value in case not set */
580 if (verip->cmdsu.verifyIp.timeout <= 0) {
581 verip->cmdsu.verifyIp.timeout = 10;
582 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000583
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800584 /* execute the ping command and pipe the result to a tmp file */
585 sprintf(gCmdStr,
586 "ping %s -c 3 -W %u | grep loss | cut -f3 -d, 1>& /tmp/pingout.txt",
587 verip->cmdsu.verifyIp.dipaddr, verip->cmdsu.verifyIp.timeout);
588 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000589
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800590 /* scan/check the output */
591 tmpfile = fopen("/tmp/pingout.txt", "r+");
592 if (tmpfile == NULL) {
593 verifyIpResp->status = STATUS_ERROR;
594 wfaEncodeTLV(WFA_STA_VERIFY_IP_CONNECTION_RESP_TLV, 4, (BYTE*)verifyIpResp,
595 respBuf);
596 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000597
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800598 DPRINT_ERR(WFA_ERR, "file open failed\n");
599 return WFA_FAILURE;
600 }
Dake Zhao0a832172015-01-06 11:08:47 -0800601
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800602 verifyIpResp->status = STATUS_COMPLETE;
603 if (fscanf(tmpfile, "%s", strout) == EOF)
Dake Zhao0a832172015-01-06 11:08:47 -0800604 verifyIpResp->cmdru.connected = 0;
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800605 else {
606 pcnt = strtok(strout, "%");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000607
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800608 /* if the loss rate is 100%, not able to connect */
609 if (atoi(pcnt) == 100)
610 verifyIpResp->cmdru.connected = 0;
611 else
612 verifyIpResp->cmdru.connected = 1;
613 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000614
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800615 fclose(tmpfile);
616#else
617 int btSockfd;
618 struct pollfd fds[2];
619 int timeout = 2000;
620 char anyBuf[64];
621 struct sockaddr_in toAddr;
622 int done = 1, cnt = 0, ret, nbytes;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000623
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800624 verifyIpResp->status = STATUS_COMPLETE;
625 verifyIpResp->cmdru.connected = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000626
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800627 btSockfd = wfaCreateUDPSock("127.0.0.1", WFA_UDP_ECHO_PORT);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000628
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800629 if (btSockfd == -1) {
630 verifyIpResp->status = STATUS_ERROR;
631 wfaEncodeTLV(WFA_STA_VERIFY_IP_CONNECTION_RESP_TLV, 4, (BYTE*)verifyIpResp,
632 respBuf);
633 *respLen = WFA_TLV_HDR_LEN + 4;
634 return WFA_FAILURE;
635 ;
636 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000637
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800638 toAddr.sin_family = AF_INET;
639 toAddr.sin_addr.s_addr = inet_addr(verip->cmdsu.verifyIp.dipaddr);
640 toAddr.sin_port = htons(WFA_UDP_ECHO_PORT);
641
642 while (done) {
643 wfaTrafficSendTo(btSockfd, (char*)anyBuf, 64, (struct sockaddr*)&toAddr);
644 cnt++;
645
646 fds[0].fd = btSockfd;
647 fds[0].events = POLLIN | POLLOUT;
648
649 ret = poll(fds, 1, timeout);
650 switch (ret) {
651 case 0:
652 /* it is time out, count a packet lost*/
653 break;
654 case -1:
655 /* it is an error */
656 default: {
657 switch (fds[0].revents) {
658 case POLLIN:
659 case POLLPRI:
660 case POLLOUT:
661 nbytes = wfaTrafficRecv(btSockfd, (char*)anyBuf,
662 (struct sockaddr*)&toAddr);
663 if (nbytes != 0)
664 verifyIpResp->cmdru.connected = 1;
Dake Zhao0a832172015-01-06 11:08:47 -0800665 done = 0;
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800666 break;
667 default:
668 /* errors but not care */
669 ;
Dake Zhao0a832172015-01-06 11:08:47 -0800670 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800671 }
Dake Zhao0a832172015-01-06 11:08:47 -0800672 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800673 if (cnt == 3) {
674 done = 0;
675 }
676 }
Dake Zhao0a832172015-01-06 11:08:47 -0800677
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000678#endif
679
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800680 wfaEncodeTLV(WFA_STA_VERIFY_IP_CONNECTION_RESP_TLV, sizeof(dutCmdResponse_t),
681 (BYTE*)verifyIpResp, respBuf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000682
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800683 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -0800684
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800685 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000686}
687
688/*
689 * wfaStaGetMacAddress()
690 * This function is to retrieve the MAC address of a wireless I/F.
691 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800692int wfaStaGetMacAddress(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
693 dutCommand_t* getMac = (dutCommand_t*)caCmdBuf;
694 dutCmdResponse_t* getmacResp = &gGenericResp;
695 char* str;
696 char* ifname = getMac->intf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000697
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800698 FILE* tmpfd;
699 char string[257];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000700
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800701 DPRINT_INFO(WFA_OUT, "Entering wfaStaGetMacAddress ...\n");
702 /*
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000703 * run the script "getipconfig.sh" to find out the mac
704 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800705 sprintf(gCmdStr, "ifconfig %s > /tmp/ipconfig.txt ", ifname);
706 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000707
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800708 tmpfd = fopen("/tmp/ipconfig.txt", "r+");
709 if (tmpfd == NULL) {
710 getmacResp->status = STATUS_ERROR;
711 wfaEncodeTLV(WFA_STA_GET_MAC_ADDRESS_RESP_TLV, 4, (BYTE*)getmacResp,
712 respBuf);
713 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000714
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800715 DPRINT_ERR(WFA_ERR, "file open failed\n");
716 return WFA_FAILURE;
717 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000718
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800719 if (fgets((char*)&string[0], 256, tmpfd) == NULL) {
720 getmacResp->status = STATUS_ERROR;
721 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -0800722
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800723 str = strtok(string, " ");
724 while (str && ((strcmp(str, "HWaddr")) != 0)) {
725 str = strtok(NULL, " ");
726 }
Dake Zhao0a832172015-01-06 11:08:47 -0800727
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800728 /* get mac */
729 if (str) {
730 str = strtok(NULL, " ");
731 strcpy(getmacResp->cmdru.mac, str);
732 getmacResp->status = STATUS_COMPLETE;
733 }
Dake Zhao0a832172015-01-06 11:08:47 -0800734
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800735 wfaEncodeTLV(WFA_STA_GET_MAC_ADDRESS_RESP_TLV, sizeof(dutCmdResponse_t),
736 (BYTE*)getmacResp, respBuf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000737
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800738 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000739
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800740 fclose(tmpfd);
741 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000742}
743
744/*
745 * wfaStaGetStats():
Dake Zhao0a832172015-01-06 11:08:47 -0800746 * The function is to retrieve the statistics of the I/F's layer 2 txFrames,
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000747 * rxFrames, txMulticast, rxMulticast, fcsErrors/crc, and txRetries.
Dake Zhao0a832172015-01-06 11:08:47 -0800748 * Currently there is not definition how to use these info.
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000749 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800750int wfaStaGetStats(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
751 dutCmdResponse_t* statsResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000752
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800753 /* this is never used, you can skip this call */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000754
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800755 statsResp->status = STATUS_ERROR;
756 wfaEncodeTLV(WFA_STA_GET_STATS_RESP_TLV, sizeof(dutCmdResponse_t),
757 (BYTE*)statsResp, respBuf);
758 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000759
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800760 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000761}
762
763/*
764 * wfaSetEncryption():
765 * The function is to set the wireless interface with WEP or none.
766 *
Dake Zhao0a832172015-01-06 11:08:47 -0800767 * Since WEP is optional test, current function is only used for
768 * resetting the Security to NONE/Plaintext (OPEN). To test WEP,
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000769 * this function should be replaced by the next one (wfaSetEncryption1())
770 *
Dake Zhao0a832172015-01-06 11:08:47 -0800771 * Input parameters:
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000772 * 1. I/F
773 * 2. ssid
774 * 3. encpType - wep or none
775 * Optional:
776 * 4. key1
777 * 5. key2
778 * 6. key3
779 * 7. key4
780 * 8. activeKey Index
781 */
782
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800783int wfaSetEncryption1(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
784 caStaSetEncryption_t* setEncryp = (caStaSetEncryption_t*)caCmdBuf;
785 dutCmdResponse_t* setEncrypResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000786
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800787 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800788 * disable the network first
789 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800790 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", setEncryp->intf);
791 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000792
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800793 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800794 * set SSID
795 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800796 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'",
797 setEncryp->intf, setEncryp->ssid);
798 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000799
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800800 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800801 * Tell the supplicant for infrastructure mode (1)
802 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800803 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 mode 0", setEncryp->intf);
804 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000805
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800806 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800807 * set Key management to NONE (NO WPA) for plaintext or WEP
808 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800809 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt NONE",
810 setEncryp->intf);
811 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000812
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800813 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setEncryp->intf);
814 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000815
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800816 setEncrypResp->status = STATUS_COMPLETE;
817 wfaEncodeTLV(WFA_STA_SET_ENCRYPTION_RESP_TLV, 4, (BYTE*)setEncrypResp,
818 respBuf);
819 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -0800820
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800821 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000822}
823
824/*
825 * Since WEP is optional, this function could be used to replace
Dake Zhao0a832172015-01-06 11:08:47 -0800826 * wfaSetEncryption() if necessary.
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000827 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800828int wfaSetEncryption(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
829 caStaSetEncryption_t* setEncryp = (caStaSetEncryption_t*)caCmdBuf;
830 dutCmdResponse_t* setEncrypResp = &gGenericResp;
831 int i;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000832
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800833 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800834 * disable the network first
835 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800836 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", setEncryp->intf);
837 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000838
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800839 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800840 * set SSID
841 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800842 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'",
843 setEncryp->intf, setEncryp->ssid);
844 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000845
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800846 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800847 * Tell the supplicant for infrastructure mode (1)
848 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800849 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 mode 0", setEncryp->intf);
850 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000851
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800852 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800853 * set Key management to NONE (NO WPA) for plaintext or WEP
854 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800855 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt NONE",
856 setEncryp->intf);
857 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000858
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800859 /* set keys */
860 if (setEncryp->encpType == 1) {
861 for (i = 0; i < 4; i++) {
862 if (setEncryp->keys[i][0] != '\0') {
863 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_key%i %s",
864 setEncryp->intf, i, setEncryp->keys[i]);
865 systemWithLog(gCmdStr);
866 }
Dake Zhao0a832172015-01-06 11:08:47 -0800867 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000868
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800869 /* set active key */
870 i = setEncryp->activeKeyIdx;
871 if (setEncryp->keys[i][0] != '\0') {
872 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_tx_keyidx %i",
873 setEncryp->intf, setEncryp->activeKeyIdx);
874 systemWithLog(gCmdStr);
875 }
876 } else /* clearly remove the keys -- reported by p.schwann */
877 {
878 for (i = 0; i < 4; i++) {
879 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_key%i \"\"",
880 setEncryp->intf, i);
881 systemWithLog(gCmdStr);
882 }
883 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000884
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800885 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setEncryp->intf);
886 systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -0800887
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800888 setEncrypResp->status = STATUS_COMPLETE;
889 wfaEncodeTLV(WFA_STA_SET_ENCRYPTION_RESP_TLV, sizeof(setEncrypResp->status),
890 (BYTE*)setEncrypResp, respBuf);
891 *respLen = WFA_TLV_HDR_LEN + sizeof(setEncrypResp->status);
892
893 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000894}
895
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800896int wfaStaSetSecurity(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
897 int ret = WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000898
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800899 return ret;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000900}
901
902/*
903 * wfaStaSetEapTLS():
904 * This is to set
905 * 1. ssid
906 * 2. encrypType - tkip or aes-ccmp
907 * 3. keyManagementType - wpa or wpa2
908 * 4. trustedRootCA
909 * 5. clientCertificate
910 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800911int wfaStaSetEapTLS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
912 caStaSetEapTLS_t* setTLS = (caStaSetEapTLS_t*)caCmdBuf;
913 char* ifname = setTLS->intf;
914 dutCmdResponse_t* setEapTlsResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000915
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800916 DPRINT_INFO(WFA_OUT, "Entering wfaStaSetEapTLS ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000917
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800918 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800919 * need to store the trustedROOTCA and clientCertificate into a file first.
920 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000921#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800922 sprintf(gCmdStr, "wfa_set_eaptls -i %s %s %s %s", ifname, setTLS->ssid,
923 setTLS->trustedRootCA, setTLS->clientCertificate);
924 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000925#else
926
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800927 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
928 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000929
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800930 /* ssid */
931 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
932 setTLS->ssid);
933 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000934
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800935 /* key management */
936 if (strcasecmp(setTLS->keyMgmtType, "wpa2-sha256") == 0) {
937 } else if (strcasecmp(setTLS->keyMgmtType, "wpa2-eap") == 0) {
938 } else if (strcasecmp(setTLS->keyMgmtType, "wpa2-ft") == 0) {
939 } else if (strcasecmp(setTLS->keyMgmtType, "wpa") == 0) {
940 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
941 } else if (strcasecmp(setTLS->keyMgmtType, "wpa2") == 0) {
942 // to take all and device to pick any one supported.
943 } else {
944 // ??
945 }
946 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000947
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800948 /* protocol WPA */
949 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA", ifname);
950 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000951
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800952 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap TLS", ifname);
953 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000954
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800955 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ca_cert '\"%s\"'", ifname,
956 setTLS->trustedRootCA);
957 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000958
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800959 sprintf(
960 gCmdStr,
961 "wpa_cli.sh -i %s set_network 0 identity '\"wifi-user@wifilabs.local\"'",
962 ifname);
963 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000964
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800965 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 private_key '\"%s/%s\"'",
966 ifname, CERTIFICATES_PATH, setTLS->clientCertificate);
967 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000968
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800969 sprintf(gCmdStr,
970 "wpa_cli.sh -i %s set_network 0 private_key_passwd '\"wifi\"'",
971 ifname);
972 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000973
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800974 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
975 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000976#endif
977
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800978 setEapTlsResp->status = STATUS_COMPLETE;
979 wfaEncodeTLV(WFA_STA_SET_EAPTLS_RESP_TLV, 4, (BYTE*)setEapTlsResp, respBuf);
980 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000981
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800982 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000983}
984
985/*
Dake Zhao0a832172015-01-06 11:08:47 -0800986 * The function is to set
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000987 * 1. ssid
988 * 2. passPhrase
989 * 3. keyMangementType - wpa/wpa2
990 * 4. encrypType - tkip or aes-ccmp
991 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800992int wfaStaSetPSK(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
993 /*Incompleted function*/
994 dutCmdResponse_t* setPskResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000995
Dake Zhaob7ed41a2014-12-04 11:24:58 -0800996#ifndef WFA_PC_CONSOLE
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800997 caStaSetPSK_t* setPSK = (caStaSetPSK_t*)caCmdBuf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000998#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800999 sprintf(gCmdStr, "wfa_set_psk %s %s %s", setPSK->intf, setPSK->ssid,
1000 setPSK->passphrase);
1001 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001002#else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001003 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", setPSK->intf,
1004 setPSK->ssid);
1005 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001006
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001007 if (strcasecmp(setPSK->keyMgmtType, "wpa2-sha256") == 0)
1008 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA2-SHA256",
1009 setPSK->intf);
1010 else if (strcasecmp(setPSK->keyMgmtType, "wpa2") == 0) {
1011 // take all and device to pick it supported.
1012 } else if (strcasecmp(setPSK->keyMgmtType, "wpa2-psk") == 0) {
1013 } else if (strcasecmp(setPSK->keyMgmtType, "wpa2-ft") == 0) {
1014 } else if (strcasecmp(setPSK->keyMgmtType, "wpa2-wpa-psk") == 0) {
1015 } else
1016 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-PSK",
1017 setPSK->intf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001018
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001019 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001020
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001021 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 psk '\"%s\"'", setPSK->intf,
1022 setPSK->passphrase);
1023 sret = systemWithLog(gCmdStr);
Ray Wang9c508692014-04-01 17:04:59 -07001024
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001025 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setPSK->intf);
1026 sret = systemWithLog(gCmdStr);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08001027
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001028 /* if PMF enable */
1029 if (setPSK->pmf == WFA_ENABLED || setPSK->pmf == WFA_OPTIONAL) {
1030 } else if (setPSK->pmf == WFA_REQUIRED) {
1031 } else if (setPSK->pmf == WFA_F_REQUIRED) {
1032 } else if (setPSK->pmf == WFA_F_DISABLED) {
1033 } else {
1034 /* Disable PMF */
1035 }
Dake Zhao0a832172015-01-06 11:08:47 -08001036
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001037#endif
1038
Dake Zhaob7ed41a2014-12-04 11:24:58 -08001039#endif
1040
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001041 setPskResp->status = STATUS_COMPLETE;
1042 wfaEncodeTLV(WFA_STA_SET_PSK_RESP_TLV, 4, (BYTE*)setPskResp, respBuf);
1043 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001044
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001045 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001046}
1047
1048/*
Dake Zhao0a832172015-01-06 11:08:47 -08001049 * wfaStaGetInfo():
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001050 * Get vendor specific information in name/value pair by a wireless I/F.
1051 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001052int wfaStaGetInfo(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1053 dutCmdResponse_t infoResp;
1054 dutCommand_t* getInfo = (dutCommand_t*)caCmdBuf;
1055 FILE* tmpfd;
1056 char vendor[256];
1057 const char* vendorFileName = "/tmp/ifvendor.txt";
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001058
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001059 sprintf(gCmdStr, "getifvendor.sh %s %s\n", getInfo->intf, vendorFileName);
Wojciech Jakobczykb8af9922020-08-25 14:49:44 +02001060
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001061 if (systemWithLog(gCmdStr) == -1) {
1062 infoResp.status = STATUS_ERROR;
1063 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(infoResp.status),
1064 (BYTE*)&infoResp, respBuf);
Wojciech Jakobczykb8af9922020-08-25 14:49:44 +02001065 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp.status);
Dake Zhao0a832172015-01-06 11:08:47 -08001066
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001067 DPRINT_ERR(WFA_ERR, "script %s failed\n", vendorFileName);
1068 return WFA_FAILURE;
1069 }
1070
1071 /* open the output result and scan/retrieve the info */
1072 tmpfd = fopen(vendorFileName, "r+");
1073
1074 if (tmpfd == NULL || fgets(vendor, 256, tmpfd) == NULL) {
1075 infoResp.status = STATUS_ERROR;
1076 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(infoResp.status),
1077 (BYTE*)&infoResp, respBuf);
1078 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp.status);
1079
1080 DPRINT_ERR(WFA_ERR, "file read failed\n");
1081
1082 if (tmpfd != NULL) {
1083 fclose(tmpfd);
1084 remove(vendorFileName);
1085 }
1086
1087 return WFA_FAILURE;
1088 }
1089
1090 snprintf(infoResp.cmdru.info, sizeof(infoResp.cmdru.info),
1091 "interface,%s,description,%s", getInfo->intf, vendor);
1092
1093 infoResp.status = STATUS_COMPLETE;
1094 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(infoResp.status),
1095 (BYTE*)&infoResp, respBuf);
1096 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp.status);
1097
1098 fclose(tmpfd);
1099 remove(vendorFileName);
1100
1101 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001102}
1103
1104/*
1105 * wfaStaSetEapTTLS():
1106 * This is to set
1107 * 1. ssid
1108 * 2. username
1109 * 3. passwd
1110 * 4. encrypType - tkip or aes-ccmp
1111 * 5. keyManagementType - wpa or wpa2
1112 * 6. trustedRootCA
1113 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001114int wfaStaSetEapTTLS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1115 caStaSetEapTTLS_t* setTTLS = (caStaSetEapTTLS_t*)caCmdBuf;
1116 char* ifname = setTTLS->intf;
1117 dutCmdResponse_t* setEapTtlsResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001118
1119#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001120 sprintf(gCmdStr, "wfa_set_eapttls %s %s %s %s %s", ifname, setTTLS->ssid,
1121 setTTLS->username, setTTLS->passwd, setTTLS->trustedRootCA);
1122 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001123#else
1124
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001125 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1126 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001127
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001128 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1129 setTTLS->ssid);
1130 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001131
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001132 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1133 setTTLS->username);
1134 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001135
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001136 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
1137 setTTLS->passwd);
1138 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001139
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001140 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1141 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001142
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001143 /* This may not need to set. if it is not set, default to take all */
1144 // sprintf(cmdStr, "wpa_cli.sh -i %s set_network 0 pairwise '\"%s\"", ifname, setTTLS->encrptype);
1145 if (strcasecmp(setTTLS->keyMgmtType, "wpa2-sha256") == 0) {
1146 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa2-eap") == 0) {
1147 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa2-ft") == 0) {
1148 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa") == 0) {
1149 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa2") == 0) {
1150 // to take all and device to pick one it supported
1151 } else {
1152 // ??
1153 }
1154 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001155
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001156 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap TTLS", ifname);
1157 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001158
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001159 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ca_cert '\"%s/%s\"'", ifname,
1160 CERTIFICATES_PATH, setTTLS->trustedRootCA);
1161 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001162
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001163 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA", ifname);
1164 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001165
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001166 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase2 '\"auth=MSCHAPV2\"'",
1167 ifname);
1168 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001169
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001170 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
1171 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001172#endif
1173
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001174 setEapTtlsResp->status = STATUS_COMPLETE;
1175 wfaEncodeTLV(WFA_STA_SET_EAPTTLS_RESP_TLV, 4, (BYTE*)setEapTtlsResp, respBuf);
1176 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001177
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001178 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001179}
1180
1181/*
1182 * wfaStaSetEapSIM():
1183 * This is to set
1184 * 1. ssid
1185 * 2. user name
1186 * 3. passwd
1187 * 4. encrypType - tkip or aes-ccmp
1188 * 5. keyMangementType - wpa or wpa2
1189 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001190int wfaStaSetEapSIM(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1191 caStaSetEapSIM_t* setSIM = (caStaSetEapSIM_t*)caCmdBuf;
1192 char* ifname = setSIM->intf;
1193 dutCmdResponse_t* setEapSimResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001194
1195#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001196 sprintf(gCmdStr, "wfa_set_eapsim %s %s %s %s", ifname, setSIM->ssid,
1197 setSIM->username, setSIM->encrptype);
1198 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001199#else
1200
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001201 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1202 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001203
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001204 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1205 setSIM->ssid);
1206 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001207
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001208 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1209 setSIM->username);
1210 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001211
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001212 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 pairwise '\"%s\"'", ifname,
1213 setSIM->encrptype);
1214 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001215
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001216 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap SIM", ifname);
1217 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001218
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001219 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA", ifname);
1220 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001221
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001222 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
1223 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001224
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001225 if (strcasecmp(setSIM->keyMgmtType, "wpa2-sha256") == 0) {
1226 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-SHA256",
1227 ifname);
1228 } else if (strcasecmp(setSIM->keyMgmtType, "wpa2-eap") == 0) {
1229 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1230 } else if (strcasecmp(setSIM->keyMgmtType, "wpa2-ft") == 0) {
1231 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-FT", ifname);
1232 } else if (strcasecmp(setSIM->keyMgmtType, "wpa") == 0) {
1233 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1234 } else if (strcasecmp(setSIM->keyMgmtType, "wpa2") == 0) {
1235 // take all and device to pick one which is supported.
1236 } else {
1237 // ??
1238 }
1239 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001240
1241#endif
1242
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001243 setEapSimResp->status = STATUS_COMPLETE;
1244 wfaEncodeTLV(WFA_STA_SET_EAPSIM_RESP_TLV, 4, (BYTE*)setEapSimResp, respBuf);
1245 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001246
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001247 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001248}
1249
1250/*
1251 * wfaStaSetPEAP()
1252 * This is to set
1253 * 1. ssid
1254 * 2. user name
1255 * 3. passwd
1256 * 4. encryType - tkip or aes-ccmp
1257 * 5. keyMgmtType - wpa or wpa2
1258 * 6. trustedRootCA
1259 * 7. innerEAP
1260 * 8. peapVersion
1261 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001262int wfaStaSetPEAP(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1263 caStaSetEapPEAP_t* setPEAP = (caStaSetEapPEAP_t*)caCmdBuf;
1264 char* ifname = setPEAP->intf;
1265 dutCmdResponse_t* setPeapResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001266
1267#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001268 sprintf(gCmdStr, "wfa_set_peap %s %s %s %s %s %s %i %s", ifname,
1269 setPEAP->ssid, setPEAP->username, setPEAP->passwd,
1270 setPEAP->trustedRootCA, setPEAP->encrptype, setPEAP->peapVersion,
1271 setPEAP->innerEAP);
1272 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001273#else
1274
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001275 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1276 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001277
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001278 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1279 setPEAP->ssid);
1280 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001281
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001282 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap PEAP", ifname);
1283 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001284
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001285 sprintf(gCmdStr,
1286 "wpa_cli.sh -i %s set_network 0 anonymous_identity '\"anonymous\"' ",
1287 ifname);
1288 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001289
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001290 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1291 setPEAP->username);
1292 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001293
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001294 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
1295 setPEAP->passwd);
1296 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001297
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001298 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ca_cert '\"%s/%s\"'", ifname,
1299 CERTIFICATES_PATH, setPEAP->trustedRootCA);
1300 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001301
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001302 if (strcasecmp(setPEAP->keyMgmtType, "wpa2-sha256") == 0) {
1303 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-SHA256",
1304 ifname);
1305 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa2-eap") == 0) {
1306 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1307 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa2-ft") == 0) {
1308 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-FT", ifname);
1309 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa") == 0) {
1310 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1311 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa2") == 0) {
1312 // take all and device to pick one which is supported.
1313 } else {
1314 // ??
1315 }
1316 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001317
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001318 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase1 '\"peaplabel=%i\"'",
1319 ifname, setPEAP->peapVersion);
1320 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001321
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001322 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase2 '\"auth=%s\"'",
1323 ifname, setPEAP->innerEAP);
1324 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001325
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001326 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
1327 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001328#endif
1329
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001330 setPeapResp->status = STATUS_COMPLETE;
1331 wfaEncodeTLV(WFA_STA_SET_PEAP_RESP_TLV, 4, (BYTE*)setPeapResp, respBuf);
1332 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001333
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001334 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001335}
1336
1337/*
1338 * wfaStaSetUAPSD()
1339 * This is to set
1340 * 1. acBE
1341 * 2. acBK
1342 * 3. acVI
1343 * 4. acVO
1344 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001345int wfaStaSetUAPSD(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1346 dutCmdResponse_t* setUAPSDResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001347#if 0 /* used for only one specific device, need to update to reflect yours */
Dake Zhao0a832172015-01-06 11:08:47 -08001348 caStaSetUAPSD_t *setUAPSD = (caStaSetUAPSD_t *)caCmdBuf;
1349 char *ifname = setUAPSD->intf;
1350 char tmpStr[10];
1351 char line[100];
1352 char *pathl="/etc/Wireless/RT61STA";
1353 BYTE acBE=1;
1354 BYTE acBK=1;
1355 BYTE acVO=1;
1356 BYTE acVI=1;
1357 BYTE APSDCapable;
1358 FILE *pipe;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001359
Dake Zhao0a832172015-01-06 11:08:47 -08001360 /*
1361 * A series of setting need to be done before doing WMM-PS
1362 * Additional steps of configuration may be needed.
1363 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001364
Dake Zhao0a832172015-01-06 11:08:47 -08001365 /*
1366 * bring down the interface
1367 */
1368 sprintf(gCmdStr, "ifconfig %s down",ifname);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001369 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001370 /*
1371 * Unload the Driver
1372 */
1373 sprintf(gCmdStr, "rmmod rt61");
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001374 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001375#ifndef WFA_WMM_AC
Dake Zhao0a832172015-01-06 11:08:47 -08001376 if(setUAPSD->acBE != 1)
1377 acBE=setUAPSD->acBE = 0;
1378 if(setUAPSD->acBK != 1)
1379 acBK=setUAPSD->acBK = 0;
1380 if(setUAPSD->acVO != 1)
1381 acVO=setUAPSD->acVO = 0;
1382 if(setUAPSD->acVI != 1)
1383 acVI=setUAPSD->acVI = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001384#else
Dake Zhao0a832172015-01-06 11:08:47 -08001385 acBE=setUAPSD->acBE;
1386 acBK=setUAPSD->acBK;
1387 acVO=setUAPSD->acVO;
1388 acVI=setUAPSD->acVI;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001389#endif
1390
Dake Zhao0a832172015-01-06 11:08:47 -08001391 APSDCapable = acBE||acBK||acVO||acVI;
1392 /*
1393 * set other AC parameters
1394 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001395
Dake Zhao0a832172015-01-06 11:08:47 -08001396 sprintf(tmpStr,"%d;%d;%d;%d",setUAPSD->acBE,setUAPSD->acBK,setUAPSD->acVI,setUAPSD->acVO);
1397 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 +02001398 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001399
Dake Zhao0a832172015-01-06 11:08:47 -08001400 sprintf(gCmdStr, "mv /tmp/wfa_tmp %s/rt61sta.dat",pathl);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001401 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001402 pipe = popen("uname -r", "r");
1403 /* Read into line the output of uname*/
1404 fscanf(pipe,"%s",line);
1405 pclose(pipe);
1406
1407 /*
1408 * load the Driver
1409 */
1410 sprintf(gCmdStr, "insmod /lib/modules/%s/extra/rt61.ko",line);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001411 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001412
1413 sprintf(gCmdStr, "ifconfig %s up",ifname);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001414 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001415#endif
1416
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001417 setUAPSDResp->status = STATUS_COMPLETE;
1418 wfaEncodeTLV(WFA_STA_SET_UAPSD_RESP_TLV, 4, (BYTE*)setUAPSDResp, respBuf);
1419 *respLen = WFA_TLV_HDR_LEN + 4;
1420 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001421}
1422
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001423int wfaDeviceGetInfo(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1424 dutCommand_t* dutCmd = (dutCommand_t*)caCmdBuf;
1425 caDevInfo_t* devInfo = &dutCmd->cmdsu.dev;
1426 dutCmdResponse_t* infoResp = &gGenericResp;
1427 /*a vendor can fill in the proper info or anything non-disclosure */
1428 caDeviceGetInfoResp_t dinfo = {"WFA Lab", "DemoUnit", WFA_SYSTEM_VER};
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001429
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001430 DPRINT_INFO(WFA_OUT, "Entering wfaDeviceGetInfo ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001431
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001432 if (devInfo->fw == 0)
1433 memcpy(&infoResp->cmdru.devInfo, &dinfo, sizeof(caDeviceGetInfoResp_t));
1434 else {
1435 // Call internal API to pull the version ID */
1436 strncpy(infoResp->cmdru.devInfo.firmware, "NOVERSION", 15);
1437 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001438
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001439 infoResp->status = STATUS_COMPLETE;
1440 wfaEncodeTLV(WFA_DEVICE_GET_INFO_RESP_TLV, sizeof(dutCmdResponse_t),
1441 (BYTE*)infoResp, respBuf);
1442 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001443
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001444 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001445}
1446
1447/*
1448 * This funciton is to retrieve a list of interfaces and return
1449 * the list back to Agent control.
1450 * ********************************************************************
1451 * Note: We intend to make this WLAN interface name as a hardcode name.
1452 * Therefore, for a particular device, you should know and change the name
Dake Zhao0a832172015-01-06 11:08:47 -08001453 * for that device while doing porting. The MACRO "WFA_STAUT_IF" is defined in
1454 * the file "inc/wfa_ca.h". If the device OS is not linux-like, this most
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001455 * likely is hardcoded just for CAPI command responses.
1456 * *******************************************************************
Dake Zhao0a832172015-01-06 11:08:47 -08001457 *
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001458 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001459int wfaDeviceListIF(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1460 dutCmdResponse_t* infoResp = &gGenericResp;
1461 dutCommand_t* ifList = (dutCommand_t*)caCmdBuf;
1462 caDeviceListIFResp_t* ifListResp = &infoResp->cmdru.ifList;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001463
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001464 DPRINT_INFO(WFA_OUT, "Entering wfaDeviceListIF ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001465
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001466 switch (ifList->cmdsu.iftype) {
Dake Zhao0a832172015-01-06 11:08:47 -08001467 case IF_80211:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001468 infoResp->status = STATUS_COMPLETE;
1469 ifListResp->iftype = IF_80211;
1470 strcpy(ifListResp->ifs[0], WFA_STAUT_IF);
1471 strcpy(ifListResp->ifs[1], "NULL");
1472 strcpy(ifListResp->ifs[2], "NULL");
1473 break;
Dake Zhao0a832172015-01-06 11:08:47 -08001474 case IF_ETH:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001475 infoResp->status = STATUS_COMPLETE;
1476 ifListResp->iftype = IF_ETH;
1477 strcpy(ifListResp->ifs[0], "eth0");
1478 strcpy(ifListResp->ifs[1], "NULL");
1479 strcpy(ifListResp->ifs[2], "NULL");
1480 break;
1481 default: {
1482 infoResp->status = STATUS_ERROR;
1483 wfaEncodeTLV(WFA_DEVICE_LIST_IF_RESP_TLV, 4, (BYTE*)infoResp, respBuf);
1484 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001485
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001486 return WFA_SUCCESS;
Dake Zhao0a832172015-01-06 11:08:47 -08001487 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001488 }
Dake Zhao0a832172015-01-06 11:08:47 -08001489
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001490 wfaEncodeTLV(WFA_DEVICE_LIST_IF_RESP_TLV, sizeof(dutCmdResponse_t),
1491 (BYTE*)infoResp, respBuf);
1492 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -08001493
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001494 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001495}
1496
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001497int wfaStaDebugSet(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1498 dutCmdResponse_t* debugResp = &gGenericResp;
1499 dutCommand_t* debugSet = (dutCommand_t*)caCmdBuf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001500
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001501 DPRINT_INFO(WFA_OUT, "Entering wfaStaDebugSet ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001502
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001503 if (debugSet->cmdsu.dbg.state == 1) /* enable */
1504 wfa_defined_debug |= debugSet->cmdsu.dbg.level;
1505 else
1506 wfa_defined_debug = (~debugSet->cmdsu.dbg.level & wfa_defined_debug);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001507
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001508 debugResp->status = STATUS_COMPLETE;
1509 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(dutCmdResponse_t),
1510 (BYTE*)debugResp, respBuf);
1511 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001512
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001513 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001514}
1515
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001516/*
1517 * wfaStaGetBSSID():
1518 * This function is to retrieve BSSID of a specific wireless I/F.
Dake Zhao0a832172015-01-06 11:08:47 -08001519 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001520int wfaStaGetBSSID(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1521 char string[64];
1522 char* str;
1523 FILE* tmpfd;
1524 dutCmdResponse_t* bssidResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001525
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001526 DPRINT_INFO(WFA_OUT, "Entering wfaStaGetBSSID ...\n");
1527 /* retrieve the BSSID */
1528 sprintf(gCmdStr, "wpa_cli.sh status > /tmp/bssid.txt");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001529
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001530 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001531
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001532 tmpfd = fopen("/tmp/bssid.txt", "r+");
1533 if (tmpfd == NULL) {
1534 bssidResp->status = STATUS_ERROR;
1535 wfaEncodeTLV(WFA_STA_GET_BSSID_RESP_TLV, 4, (BYTE*)bssidResp, respBuf);
1536 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001537
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001538 DPRINT_ERR(WFA_ERR, "file open failed\n");
1539 return WFA_FAILURE;
1540 }
1541
1542 for (;;) {
1543 if (fscanf(tmpfd, "%s", string) == EOF) {
1544 bssidResp->status = STATUS_COMPLETE;
1545 strcpy(bssidResp->cmdru.bssid, "00:00:00:00:00:00");
1546 break;
Dake Zhao0a832172015-01-06 11:08:47 -08001547 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001548
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001549 if (strncmp(string, "bssid", 5) == 0) {
1550 str = strtok(string, "=");
1551 str = strtok(NULL, "=");
1552 if (str != NULL) {
1553 strcpy(bssidResp->cmdru.bssid, str);
1554 bssidResp->status = STATUS_COMPLETE;
1555 break;
1556 }
Dake Zhao0a832172015-01-06 11:08:47 -08001557 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001558 }
Dake Zhao0a832172015-01-06 11:08:47 -08001559
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001560 wfaEncodeTLV(WFA_STA_GET_BSSID_RESP_TLV, sizeof(dutCmdResponse_t),
1561 (BYTE*)bssidResp, respBuf);
1562 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -08001563
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001564 fclose(tmpfd);
1565 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001566}
1567
1568/*
1569 * wfaStaSetIBSS()
1570 * This is to set
1571 * 1. ssid
1572 * 2. channel
1573 * 3. encrypType - none or wep
1574 * optional
1575 * 4. key1
1576 * 5. key2
1577 * 6. key3
1578 * 7. key4
1579 * 8. activeIndex - 1, 2, 3, or 4
1580 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001581int wfaStaSetIBSS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1582 caStaSetIBSS_t* setIBSS = (caStaSetIBSS_t*)caCmdBuf;
1583 dutCmdResponse_t* setIbssResp = &gGenericResp;
1584 int i;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001585
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001586 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001587 * disable the network first
1588 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001589 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", setIBSS->intf);
1590 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001591
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001592 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001593 * set SSID
1594 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001595 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'",
1596 setIBSS->intf, setIBSS->ssid);
1597 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001598
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001599 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001600 * Set channel for IBSS
1601 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001602 sprintf(gCmdStr, "iwconfig %s channel %i", setIBSS->intf, setIBSS->channel);
1603 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001604
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001605 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001606 * Tell the supplicant for IBSS mode (1)
1607 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001608 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 mode 1", setIBSS->intf);
1609 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001610
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001611 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001612 * set Key management to NONE (NO WPA) for plaintext or WEP
1613 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001614 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt NONE",
1615 setIBSS->intf);
1616 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001617
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001618 if (setIBSS->encpType == 1) {
1619 for (i = 0; i < 4; i++) {
1620 if (strlen(setIBSS->keys[i]) == 5 || strlen(setIBSS->keys[i]) == 13) {
1621 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_key%i \"%s\"",
1622 setIBSS->intf, i, setIBSS->keys[i]);
1623 sret = systemWithLog(gCmdStr);
1624 }
Dake Zhao0a832172015-01-06 11:08:47 -08001625 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001626
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001627 i = setIBSS->activeKeyIdx;
1628 if (strlen(setIBSS->keys[i]) == 5 || strlen(setIBSS->keys[i]) == 13) {
1629 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_tx_keyidx %i",
1630 setIBSS->intf, setIBSS->activeKeyIdx);
1631 sret = systemWithLog(gCmdStr);
1632 }
1633 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001634
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001635 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setIBSS->intf);
1636 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001637
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001638 setIbssResp->status = STATUS_COMPLETE;
1639 wfaEncodeTLV(WFA_STA_SET_IBSS_RESP_TLV, 4, (BYTE*)setIbssResp, respBuf);
1640 *respLen = WFA_TLV_HDR_LEN + 4;
1641
1642 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001643}
1644
1645/*
1646 * wfaSetMode():
Dake Zhao0a832172015-01-06 11:08:47 -08001647 * The function is to set the wireless interface with a given mode (possible
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001648 * adhoc)
1649 * Input parameters:
1650 * 1. I/F
1651 * 2. ssid
1652 * 3. mode adhoc or managed
1653 * 4. encType
1654 * 5. channel
1655 * 6. key(s)
1656 * 7. active key
Dake Zhao0a832172015-01-06 11:08:47 -08001657 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001658int wfaStaSetMode(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1659 caStaSetMode_t* setmode = (caStaSetMode_t*)caCmdBuf;
1660 dutCmdResponse_t* SetModeResp = &gGenericResp;
1661 int i;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001662
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001663 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001664 * bring down the interface
1665 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001666 sprintf(gCmdStr, "ifconfig %s down", setmode->intf);
1667 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001668
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001669 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001670 * distroy the interface
1671 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001672 sprintf(gCmdStr, "wlanconfig %s destroy", setmode->intf);
1673 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001674
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001675 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001676 * re-create the interface with the given mode
1677 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001678 if (setmode->mode == 1)
1679 sprintf(gCmdStr, "wlanconfig %s create wlandev wifi0 wlanmode adhoc",
1680 setmode->intf);
1681 else
1682 sprintf(gCmdStr, "wlanconfig %s create wlandev wifi0 wlanmode managed",
1683 setmode->intf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001684
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001685 sret = systemWithLog(gCmdStr);
1686 if (setmode->encpType == ENCRYPT_WEP) {
1687 int j = setmode->activeKeyIdx;
1688 for (i = 0; i < 4; i++) {
1689 if (setmode->keys[i][0] != '\0') {
1690 sprintf(gCmdStr, "iwconfig %s key s:%s", setmode->intf,
1691 setmode->keys[i]);
1692 sret = systemWithLog(gCmdStr);
1693 }
1694 /* set active key */
1695 if (setmode->keys[j][0] != '\0')
1696 sprintf(gCmdStr, "iwconfig %s key s:%s", setmode->intf,
1697 setmode->keys[j]);
1698 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001699 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001700 }
1701 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001702 * Set channel for IBSS
1703 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001704 if (setmode->channel) {
1705 sprintf(gCmdStr, "iwconfig %s channel %i", setmode->intf, setmode->channel);
1706 sret = systemWithLog(gCmdStr);
1707 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001708
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001709 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001710 * set SSID
1711 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001712 sprintf(gCmdStr, "iwconfig %s essid %s", setmode->intf, setmode->ssid);
1713 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001714
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001715 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001716 * bring up the interface
1717 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001718 sprintf(gCmdStr, "ifconfig %s up", setmode->intf);
1719 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001720
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001721 SetModeResp->status = STATUS_COMPLETE;
1722 wfaEncodeTLV(WFA_STA_SET_MODE_RESP_TLV, 4, (BYTE*)SetModeResp, respBuf);
1723 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001724
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001725 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001726}
1727
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001728int wfaStaSetPwrSave(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1729 caStaSetPwrSave_t* setps = (caStaSetPwrSave_t*)caCmdBuf;
1730 dutCmdResponse_t* SetPSResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001731
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001732 sprintf(gCmdStr, "iwconfig %s power %s", setps->intf, setps->mode);
1733 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001734
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001735 SetPSResp->status = STATUS_COMPLETE;
1736 wfaEncodeTLV(WFA_STA_SET_PWRSAVE_RESP_TLV, 4, (BYTE*)SetPSResp, respBuf);
1737 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001738
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001739 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001740}
1741
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001742int wfaStaUpload(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1743 caStaUpload_t* upload = &((dutCommand_t*)caCmdBuf)->cmdsu.upload;
1744 dutCmdResponse_t* upLoadResp = &gGenericResp;
1745 caStaUploadResp_t* upld = &upLoadResp->cmdru.uld;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001746
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001747 if (upload->type == WFA_UPLOAD_VHSO_RPT) {
1748 int rbytes;
1749 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001750 * if asked for the first packet, always to open the file
1751 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001752 if (upload->next == 1) {
1753 if (e2efp != NULL) {
1754 fclose(e2efp);
1755 e2efp = NULL;
1756 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001757
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001758 e2efp = fopen(e2eResults, "r");
1759 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001760
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001761 if (e2efp == NULL) {
1762 upLoadResp->status = STATUS_ERROR;
1763 wfaEncodeTLV(WFA_STA_UPLOAD_RESP_TLV, 4, (BYTE*)upLoadResp, respBuf);
1764 *respLen = WFA_TLV_HDR_LEN + 4;
1765 return WFA_FAILURE;
1766 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001767
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001768 rbytes = fread(upld->bytes, 1, 256, e2efp);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001769
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001770 if (rbytes < 256) {
1771 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001772 * this means no more bytes after this read
1773 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001774 upld->seqnum = 0;
1775 fclose(e2efp);
1776 e2efp = NULL;
1777 } else {
1778 upld->seqnum = upload->next;
Dake Zhao0a832172015-01-06 11:08:47 -08001779 }
1780
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001781 upld->nbytes = rbytes;
1782
1783 upLoadResp->status = STATUS_COMPLETE;
1784 wfaEncodeTLV(WFA_STA_UPLOAD_RESP_TLV, sizeof(dutCmdResponse_t),
1785 (BYTE*)upLoadResp, respBuf);
1786 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
1787 } else {
1788 upLoadResp->status = STATUS_ERROR;
1789 wfaEncodeTLV(WFA_STA_UPLOAD_RESP_TLV, 4, (BYTE*)upLoadResp, respBuf);
1790 *respLen = WFA_TLV_HDR_LEN + 4;
1791 }
1792
1793 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001794}
1795/*
1796 * wfaStaSetWMM()
1797 * TO be ported on a specific plaform for the DUT
1798 * This is to set the WMM related parameters at the DUT.
1799 * Currently the function is used for GROUPS WMM-AC and WMM general configuration for setting RTS Threshhold, Fragmentation threshold and wmm (ON/OFF)
1800 * It is expected that this function will set all the WMM related parametrs for a particular GROUP .
1801 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001802int wfaStaSetWMM(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001803#ifdef WFA_WMM_AC
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001804 caStaSetWMM_t* setwmm = (caStaSetWMM_t*)caCmdBuf;
1805 char* ifname = setwmm->intf;
1806 dutCmdResponse_t* setwmmResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001807
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001808 switch (setwmm->group) {
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001809 case GROUP_WMMAC:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001810 if (setwmm->send_trig) {
1811 int Sockfd;
1812 struct sockaddr_in psToAddr;
1813 unsigned int TxMsg[512];
Dake Zhao0a832172015-01-06 11:08:47 -08001814
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001815 Sockfd = wfaCreateUDPSock(setwmm->dipaddr, 12346);
1816 memset(&psToAddr, 0, sizeof(psToAddr));
1817 psToAddr.sin_family = AF_INET;
1818 psToAddr.sin_addr.s_addr = inet_addr(setwmm->dipaddr);
1819 psToAddr.sin_port = htons(12346);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001820
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001821 switch (setwmm->trig_ac) {
1822 case WMMAC_AC_VO:
1823 wfaTGSetPrio(Sockfd, 7);
1824 create_apts_msg(APTS_CK_VO, TxMsg, 0);
1825 printf("\r\nSending AC_VO trigger packet\n");
1826 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001827
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001828 case WMMAC_AC_VI:
1829 wfaTGSetPrio(Sockfd, 5);
1830 create_apts_msg(APTS_CK_VI, TxMsg, 0);
1831 printf("\r\nSending AC_VI trigger packet\n");
1832 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001833
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001834 case WMMAC_AC_BK:
1835 wfaTGSetPrio(Sockfd, 2);
1836 create_apts_msg(APTS_CK_BK, TxMsg, 0);
1837 printf("\r\nSending AC_BK trigger packet\n");
1838 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001839
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001840 default:
1841 case WMMAC_AC_BE:
1842 wfaTGSetPrio(Sockfd, 0);
1843 create_apts_msg(APTS_CK_BE, TxMsg, 0);
1844 printf("\r\nSending AC_BE trigger packet\n");
1845 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001846 }
1847
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001848 sendto(Sockfd, TxMsg, 256, 0, (struct sockaddr*)&psToAddr,
1849 sizeof(struct sockaddr));
1850 close(Sockfd);
1851 usleep(1000000);
1852 } else if (setwmm->action == WMMAC_ADDTS) {
1853 printf(
1854 "ADDTS AC PARAMS: dialog id: %d, TID: %d, "
1855 "DIRECTION: %d, PSB: %d, UP: %d, INFOACK: %d BURST SIZE DEF: %d"
1856 "Fixed %d, MSDU Size: %d, Max MSDU Size %d, "
1857 "MIN SERVICE INTERVAL: %d, MAX SERVICE INTERVAL: %d, "
1858 "INACTIVITY: %d, SUSPENSION %d, SERVICE START TIME: %d, "
1859 "MIN DATARATE: %d, MEAN DATA RATE: %d, PEAK DATA RATE: %d, "
1860 "BURSTSIZE or MSDU Aggreg: %d, DELAY BOUND: %d, PHYRATE: %d, "
1861 "SPLUSBW: %f, "
1862 "MEDIUM TIME: %d, ACCESSCAT: %d\n",
1863 setwmm->actions.addts.dialog_token,
1864 setwmm->actions.addts.tspec.tsinfo.TID,
1865 setwmm->actions.addts.tspec.tsinfo.direction,
1866 setwmm->actions.addts.tspec.tsinfo.PSB,
1867 setwmm->actions.addts.tspec.tsinfo.UP,
1868 setwmm->actions.addts.tspec.tsinfo.infoAck,
1869 setwmm->actions.addts.tspec.tsinfo.bstSzDef,
1870 setwmm->actions.addts.tspec.Fixed, setwmm->actions.addts.tspec.size,
1871 setwmm->actions.addts.tspec.maxsize,
1872 setwmm->actions.addts.tspec.min_srvc,
1873 setwmm->actions.addts.tspec.max_srvc,
1874 setwmm->actions.addts.tspec.inactivity,
1875 setwmm->actions.addts.tspec.suspension,
1876 setwmm->actions.addts.tspec.srvc_strt_tim,
1877 setwmm->actions.addts.tspec.mindatarate,
1878 setwmm->actions.addts.tspec.meandatarate,
1879 setwmm->actions.addts.tspec.peakdatarate,
1880 setwmm->actions.addts.tspec.burstsize,
1881 setwmm->actions.addts.tspec.delaybound,
1882 setwmm->actions.addts.tspec.PHYrate,
1883 setwmm->actions.addts.tspec.sba,
1884 setwmm->actions.addts.tspec.medium_time,
1885 setwmm->actions.addts.accesscat);
1886
1887 //tspec should be set here.
1888
1889 sret = systemWithLog(gCmdStr);
1890 } else if (setwmm->action == WMMAC_DELTS) {
1891 // send del tspec
1892 }
1893
1894 setwmmResp->status = STATUS_COMPLETE;
1895 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001896
1897 case GROUP_WMMCONF:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001898 sprintf(gCmdStr, "iwconfig %s rts %d", ifname,
1899 setwmm->actions.config.rts_thr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001900
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001901 sret = systemWithLog(gCmdStr);
1902 sprintf(gCmdStr, "iwconfig %s frag %d", ifname,
1903 setwmm->actions.config.frag_thr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001904
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001905 sret = systemWithLog(gCmdStr);
1906 sprintf(gCmdStr, "iwpriv %s wmmcfg %d", ifname,
1907 setwmm->actions.config.wmm);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001908
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001909 sret = systemWithLog(gCmdStr);
1910 setwmmResp->status = STATUS_COMPLETE;
1911 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001912
1913 default:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001914 DPRINT_ERR(WFA_ERR, "The group %d is not supported\n", setwmm->group);
1915 setwmmResp->status = STATUS_ERROR;
1916 break;
1917 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001918
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001919 wfaEncodeTLV(WFA_STA_SET_WMM_RESP_TLV, 4, (BYTE*)setwmmResp, respBuf);
1920 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001921#endif
1922
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001923 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001924}
1925
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001926int wfaStaSendNeigReq(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1927 dutCmdResponse_t* sendNeigReqResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001928
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001929 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001930 * run your device to send NEIGREQ
1931 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001932
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001933 sendNeigReqResp->status = STATUS_COMPLETE;
1934 wfaEncodeTLV(WFA_STA_SEND_NEIGREQ_RESP_TLV, 4, (BYTE*)sendNeigReqResp,
1935 respBuf);
1936 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001937
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001938 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001939}
1940
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001941int wfaStaSetEapFAST(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1942 caStaSetEapFAST_t* setFAST = (caStaSetEapFAST_t*)caCmdBuf;
1943 char* ifname = setFAST->intf;
1944 dutCmdResponse_t* setEapFastResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001945
1946#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001947 sprintf(gCmdStr, "wfa_set_eapfast %s %s %s %s %s %s", ifname, setFAST->ssid,
1948 setFAST->username, setFAST->passwd, setFAST->pacFileName,
1949 setFAST->innerEAP);
1950 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001951#else
1952
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001953 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1954 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001955
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001956 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1957 setFAST->ssid);
1958 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001959
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001960 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1961 setFAST->username);
1962 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001963
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001964 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
1965 setFAST->passwd);
1966 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001967
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001968 if (strcasecmp(setFAST->keyMgmtType, "wpa2-sha256") == 0) {
1969 } else if (strcasecmp(setFAST->keyMgmtType, "wpa2-eap") == 0) {
1970 } else if (strcasecmp(setFAST->keyMgmtType, "wpa2-ft") == 0) {
1971 } else if (strcasecmp(setFAST->keyMgmtType, "wpa") == 0) {
1972 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1973 } else if (strcasecmp(setFAST->keyMgmtType, "wpa2") == 0) {
1974 // take all and device to pick one which is supported.
1975 } else {
1976 // ??
1977 }
1978 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001979
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001980 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap FAST", ifname);
1981 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001982
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001983 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 pac_file '\"%s/%s\"'",
1984 ifname, CERTIFICATES_PATH, setFAST->pacFileName);
1985 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001986
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001987 sprintf(gCmdStr,
1988 "wpa_cli.sh -i %s set_network 0 anonymous_identity '\"anonymous\"'",
1989 ifname);
1990 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001991
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001992 sprintf(gCmdStr,
1993 "wpa_cli.sh -i %s set_network 0 phase1 '\"fast_provisioning=1\"'",
1994 ifname);
1995 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001996
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001997 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase2 '\"auth=%s\"'",
1998 ifname, setFAST->innerEAP);
1999 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002000
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002001 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
2002 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002003#endif
2004
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002005 setEapFastResp->status = STATUS_COMPLETE;
2006 wfaEncodeTLV(WFA_STA_SET_EAPFAST_RESP_TLV, 4, (BYTE*)setEapFastResp, respBuf);
2007 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002008
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002009 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002010}
2011
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002012int wfaStaSetEapAKA(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2013 caStaSetEapAKA_t* setAKA = (caStaSetEapAKA_t*)caCmdBuf;
2014 char* ifname = setAKA->intf;
2015 dutCmdResponse_t* setEapAkaResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002016
2017#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002018 sprintf(gCmdStr, "wfa_set_eapaka %s %s %s %s", ifname, setAKA->ssid,
2019 setAKA->username, setAKA->passwd);
2020 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002021#else
2022
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002023 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
2024 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002025
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002026 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
2027 setAKA->ssid);
2028 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002029
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002030 if (strcasecmp(setAKA->keyMgmtType, "wpa2-sha256") == 0) {
2031 } else if (strcasecmp(setAKA->keyMgmtType, "wpa2-eap") == 0) {
2032 } else if (strcasecmp(setAKA->keyMgmtType, "wpa2-ft") == 0) {
2033 } else if (strcasecmp(setAKA->keyMgmtType, "wpa") == 0) {
2034 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
2035 } else if (strcasecmp(setAKA->keyMgmtType, "wpa2") == 0) {
2036 // take all and device to pick one which is supported.
2037 } else {
2038 // ??
2039 }
2040 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08002041
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002042 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA2", ifname);
2043 sret = systemWithLog(gCmdStr);
2044 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto CCMP", ifname);
2045 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002046
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002047 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap AKA", ifname);
2048 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002049
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002050 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase1 \"result_ind=1\"",
2051 ifname);
2052 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002053
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002054 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
2055 setAKA->username);
2056 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002057
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002058 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
2059 setAKA->passwd);
2060 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002061
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002062 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
2063 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002064#endif
2065
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002066 setEapAkaResp->status = STATUS_COMPLETE;
2067 wfaEncodeTLV(WFA_STA_SET_EAPAKA_RESP_TLV, 4, (BYTE*)setEapAkaResp, respBuf);
2068 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002069
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002070 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002071}
2072
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002073int wfaStaSetSystime(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2074 caStaSetSystime_t* systime = (caStaSetSystime_t*)caCmdBuf;
2075 dutCmdResponse_t* setSystimeResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002076
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002077 DPRINT_INFO(WFA_OUT, "Entering wfaStaSetSystime ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002078
Wojciech Jakobczyk569662f2020-09-04 08:41:42 +02002079 sprintf(gCmdStr, "date %02d%02d%02d%02d%04d.%02d", systime->month,
2080 systime->date, systime->hours, systime->minutes, systime->year,
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002081 systime->seconds);
2082 sret = systemWithLog(gCmdStr);
Wojciech Jakobczyk569662f2020-09-04 08:41:42 +02002083 if (sret != 0) {
2084 RETURN_STA_CMD_ERROR(setSystimeResp, STATUS_ERROR,
2085 "error running date command, exit code: %d\n", sret);
2086 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002087
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002088 setSystimeResp->status = STATUS_COMPLETE;
2089 wfaEncodeTLV(WFA_STA_SET_SYSTIME_RESP_TLV, 4, (BYTE*)setSystimeResp, respBuf);
2090 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002091
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002092 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002093}
2094
2095#ifdef WFA_STA_TB
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002096int wfaStaPresetParams(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2097 dutCmdResponse_t* PresetParamsResp = &gGenericResp;
2098 caStaPresetParameters_t* presetParams = (caStaPresetParameters_t*)caCmdBuf;
2099 BYTE presetDone = 1;
2100 int st = 0;
2101 char cmdStr[128];
2102 char string[256];
2103 FILE* tmpfd = NULL;
2104 long val;
2105 char* endptr;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002106
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002107 DPRINT_INFO(WFA_OUT, "Inside wfaStaPresetParameters function ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002108
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002109 if (presetParams->supplicant == eWpaSupplicant) {
2110 st = access("/tmp/processid.txt", F_OK);
2111 if (st != -1) {
2112 st = remove("/tmp/processid.txt");
Dake Zhao0a832172015-01-06 11:08:47 -08002113 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002114
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002115 sprintf(cmdStr, "/usr/local/sbin/findprocess.sh %s /tmp/processid.txt\n",
2116 "wpa_supplicant");
2117 st = systemWithLog(cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002118
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002119 tmpfd = fopen("/tmp/processid.txt", "r+");
2120 if (tmpfd == NULL) {
2121 DPRINT_ERR(WFA_ERR, "process id file not exist\n");
2122 return WFA_FAILURE;
Dake Zhao0a832172015-01-06 11:08:47 -08002123 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002124
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002125 for (;;) {
2126 if (fgets(string, 256, tmpfd) == NULL)
2127 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002128
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002129 errno = 0;
2130 val = strtol(string, &endptr, 10);
2131 if (errno != 0 && val == 0) {
2132 DPRINT_ERR(WFA_ERR, "strtol error\n");
2133 return WFA_FAILURE;
2134 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002135
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002136 if (endptr == string) {
2137 DPRINT_ERR(WFA_ERR, "No wpa_supplicant instance was found\n");
2138 }
2139
2140 presetDone = 1;
2141 }
2142 }
2143
2144 if (presetParams->wmmFlag) {
2145 st = wfaExecuteCLI(gCmdStr);
2146 switch (st) {
2147 case 0:
2148 presetDone = 1;
2149 break;
2150 case 1:
2151 presetDone = 0;
2152 break;
2153 case 2:
2154 presetDone = 0;
2155 break;
2156 }
2157 }
2158
2159 if (presetParams->modeFlag != 0) {
2160 switch (presetParams->wirelessMode) {
2161 default:
2162 printf("other mode does not need to support\n");
Dake Zhao0a832172015-01-06 11:08:47 -08002163 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002164
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002165 st = wfaExecuteCLI(gCmdStr);
2166 switch (st) {
2167 case 0:
2168 presetDone = 1;
2169 break;
2170 case 1:
2171 presetDone = 0;
2172 case 2:
2173 presetDone = 0;
2174 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002175 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002176 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002177
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002178 if (presetParams->psFlag) {
2179 printf("%s\n", gCmdStr);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02002180 sret = systemWithLog(gCmdStr);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002181 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002182
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002183 /************the followings are used for Voice Enterprise **************/
2184 if (presetParams->program == PROG_TYPE_VENT) {
2185 if (presetParams->ftoa == eEnable) {
2186 // enable Fast BSS Transition Over the Air
2187 } else {
2188 // disable Fast BSS Transition Over the Air
2189 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002190
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002191 if (presetParams->ftds == eEnable) {
2192 // enable Fast BSS Transition Over the DS
2193 } else {
2194 // disable Fast BSS Transition Over the DS
2195 }
2196
2197 if (presetParams->activescan == eEnable) {
2198 // Enable Active Scan on STA
2199 } else {
2200 // disable Active Scan on STA
2201 }
2202 }
2203
2204 /************the followings are used for Wi-Fi Display *************/
2205 if (presetParams->program == PROG_TYPE_WFD) {
2206 if (presetParams->tdlsFlag) {
2207 // enable / disable tdls based on tdls
2208 }
2209 if (presetParams->wfdDevTypeFlag) {
2210 // set WFD device type to source/sink/dual based on wfdDevType
2211 }
2212 if (presetParams->wfdUibcGenFlag) {
2213 // enable / disable the feature
2214 }
2215 if (presetParams->wfdUibcHidFlag) {
2216 // enable / disable feature
2217 }
2218 if (presetParams->wfdUiInputFlag) {
2219 // set the UI input as mentioned
2220 }
2221 if (presetParams->wfdHdcpFlag) {
2222 // enable / disable feature
2223 }
2224 if (presetParams->wfdFrameSkipFlag) {
2225 // enable / disable feature
2226 }
2227 if (presetParams->wfdAvChangeFlag) {
2228 // enable / disable feature
2229 }
2230 if (presetParams->wfdStandByFlag) {
2231 // enable / disable feature
2232 }
2233 if (presetParams->wfdInVideoFlag) {
2234 // select the input vide as protecteed or non-protetcted or protected audio
2235 // or unprotected audio etc.
2236 }
2237
2238 if (presetParams->wfdVideoFmatFlag) {
2239 // set the video format as requested
2240
2241 //switch(presetParams->wfdVideoFmt )
2242 //{
2243 // case e640x480p60:
2244 // ;
2245 // default:
2246 // set the mandatory
2247 // }
2248 }
2249 if (presetParams->wfdAudioFmatFlag) {
2250 // set the Audio format as requested
2251
2252 //switch(presetParams->wfdAudioFmt )
2253 //{
2254 // case eMandatoryAudioMode:
2255 // ;
2256 // case eDefaultAudioMode:
2257 // ;
2258
2259 // default:
2260 // set the mandatory
2261 // }
2262 }
2263
2264 if (presetParams->wfdI2cFlag) {
2265 // enable / disable feature
2266 }
2267 if (presetParams->wfdVideoRecoveryFlag) {
2268 // enable / disable feature
2269 }
2270 if (presetParams->wfdPrefDisplayFlag) {
2271 // enable / disable feature
2272 }
2273 if (presetParams->wfdServiceDiscoveryFlag) {
2274 // enable / disable feature
2275 }
2276 if (presetParams->wfd3dVideoFlag) {
2277 // enable / disable feature
2278 }
2279 if (presetParams->wfdMultiTxStreamFlag) {
2280 // enable / disable feature
2281 }
2282 if (presetParams->wfdTimeSyncFlag) {
2283 // enable / disable feature
2284 }
2285 if (presetParams->wfdEDIDFlag) {
2286 // enable / disable feature
2287 }
2288 if (presetParams->wfdUIBCPrepareFlag) {
2289 // Provdes information to start valid WFD session to check UIBC operation.
2290 }
2291 if (presetParams->wfdCoupledCapFlag) {
2292 // enable / disable feature
2293 }
2294 if (presetParams->wfdOptionalFeatureFlag) {
2295 // disable all program specific optional features
2296 }
2297 if (presetParams->wfdSessionAvailFlag) {
2298 // enable / disable session available bit
2299 }
2300 if (presetParams->wfdDeviceDiscoverabilityFlag) {
2301 // enable / disable feature
2302 }
2303 }
2304
2305 if (presetParams->program == PROG_TYPE_WFDS) {
2306 if (presetParams->wfdsType == eAcceptPD) {
2307 // preset to accept PD request
2308 if (presetParams->wfdsConnectionCapabilityFlag == 1) {
2309 // use presetParams->wfdsConnectionCapability and set role accordingly
2310 }
2311 }
2312 if (presetParams->wfdsType == eRejectPD) {
2313 // preset to Reject PD request
2314 }
2315 if (presetParams->wfdsType == eIgnorePD) {
2316 // preset to Ignore PD request
2317 }
2318 if (presetParams->wfdsType == eRejectSession) {
2319 // preset to reject Session request
2320 }
2321 }
2322
2323 if (presetDone) {
2324 PresetParamsResp->status = STATUS_COMPLETE;
2325 } else {
2326 PresetParamsResp->status = STATUS_INVALID;
2327 }
2328
2329 wfaEncodeTLV(WFA_STA_PRESET_PARAMETERS_RESP_TLV, 4, (BYTE*)PresetParamsResp,
2330 respBuf);
2331 *respLen = WFA_TLV_HDR_LEN + 4;
2332
2333 return WFA_SUCCESS;
2334}
2335
2336int wfaStaSet11n(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2337 dutCmdResponse_t* v11nParamsResp = &gGenericResp;
2338
2339 v11nParamsResp->status = STATUS_COMPLETE;
2340 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, 4, (BYTE*)v11nParamsResp, respBuf);
2341 *respLen = WFA_TLV_HDR_LEN + 4;
2342 return WFA_SUCCESS;
2343}
2344int wfaStaSetWireless(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2345 dutCmdResponse_t* staWirelessResp = &gGenericResp;
2346
2347 staWirelessResp->status = STATUS_COMPLETE;
2348 wfaEncodeTLV(WFA_STA_SET_WIRELESS_RESP_TLV, 4, (BYTE*)staWirelessResp,
2349 respBuf);
2350 *respLen = WFA_TLV_HDR_LEN + 4;
2351 return WFA_SUCCESS;
2352}
2353
2354int wfaStaSendADDBA(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2355 dutCmdResponse_t* staSendADDBAResp = &gGenericResp;
2356
2357 wfaEncodeTLV(WFA_STA_SET_SEND_ADDBA_RESP_TLV, 4, (BYTE*)staSendADDBAResp,
2358 respBuf);
2359 *respLen = WFA_TLV_HDR_LEN + 4;
2360 return WFA_SUCCESS;
2361}
2362
2363int wfaStaSetRIFS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2364 dutCmdResponse_t* staSetRIFSResp = &gGenericResp;
2365
2366 wfaEncodeTLV(WFA_STA_SET_RIFS_TEST_RESP_TLV, 4, (BYTE*)staSetRIFSResp,
2367 respBuf);
2368 *respLen = WFA_TLV_HDR_LEN + 4;
2369
2370 return WFA_SUCCESS;
2371}
2372
2373int wfaStaSendCoExistMGMT(int len,
2374 BYTE* caCmdBuf,
2375 int* respLen,
2376 BYTE* respBuf) {
2377 dutCmdResponse_t* staSendMGMTResp = &gGenericResp;
2378
2379 wfaEncodeTLV(WFA_STA_SEND_COEXIST_MGMT_RESP_TLV, 4, (BYTE*)staSendMGMTResp,
2380 respBuf);
2381 *respLen = WFA_TLV_HDR_LEN + 4;
2382
2383 return WFA_SUCCESS;
2384}
2385
2386int wfaStaResetDefault(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2387 caStaResetDefault_t* reset = (caStaResetDefault_t*)caCmdBuf;
2388 dutCmdResponse_t* ResetResp = &gGenericResp;
2389
2390 // need to make your own command available for this, here is only an example
2391 sprintf(gCmdStr, "myresetdefault %s program %s", reset->intf, reset->prog);
2392 sret = systemWithLog(gCmdStr);
2393
2394 ResetResp->status = STATUS_COMPLETE;
2395 wfaEncodeTLV(WFA_STA_RESET_DEFAULT_RESP_TLV, 4, (BYTE*)ResetResp, respBuf);
2396 *respLen = WFA_TLV_HDR_LEN + 4;
2397
2398 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002399}
2400
2401#else
2402
Wojciech Jakobczyk01c627a2020-09-02 09:51:21 +02002403int wfaStaSetRIFS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2404 caStaSetRIFS_t* setRifs = (caStaSetRIFS_t*)caCmdBuf;
2405 dutCmdResponse_t* staSetRIFSResp = &gGenericResp;
2406
2407 DPRINT_INFO(WFA_OUT, "entering wfaStaSetRIFS ...\n");
2408 DPRINT_INFO(WFA_OUT, "%s %d\n", setRifs->intf, setRifs->action);
2409
2410 if (setRifs->action) {
2411 DPRINT_INFO(WFA_WNG,
2412 "command sta_set_rifs_test is deprecated and not implemented "
2413 "for action=enable\n");
2414
2415 staSetRIFSResp->status = STATUS_INVALID;
2416 wfaEncodeTLV(WFA_STA_SET_RIFS_TEST_RESP_TLV, sizeof(staSetRIFSResp->status),
2417 (BYTE*)staSetRIFSResp, respBuf);
2418 *respLen = WFA_TLV_HDR_LEN + sizeof(staSetRIFSResp->status);
2419
2420 return WFA_FAILURE;
2421 }
2422
2423 DPRINT_INFO(WFA_WNG,
2424 "command sta_set_rifs_test is deprecated and will be ignored for "
2425 "action=disable\n");
2426
2427 staSetRIFSResp->status = STATUS_COMPLETE;
2428 wfaEncodeTLV(WFA_STA_SET_RIFS_TEST_RESP_TLV, sizeof(staSetRIFSResp->status),
2429 (BYTE*)staSetRIFSResp, respBuf);
2430 *respLen = WFA_TLV_HDR_LEN + sizeof(staSetRIFSResp->status);
2431
2432 return WFA_SUCCESS;
2433}
2434
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002435int wfaStaTestBedCmd(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2436 dutCmdResponse_t* staCmdResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002437
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002438 wfaEncodeTLV(WFA_STA_DISCONNECT_RESP_TLV, 4, (BYTE*)staCmdResp, respBuf);
2439 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002440
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002441 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002442}
2443#endif
2444
2445/*
2446 * This is used to send a frame or action frame
2447 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002448int wfaStaDevSendFrame(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2449 dutCommand_t* cmd = (dutCommand_t*)caCmdBuf;
2450 /* uncomment it if needed */
2451 // char *ifname = cmd->intf;
2452 dutCmdResponse_t* devSendResp = &gGenericResp;
2453 caStaDevSendFrame_t* sf = &cmd->cmdsu.sf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002454
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002455 DPRINT_INFO(WFA_OUT, "Inside wfaStaDevSendFrame function ...\n");
2456 /* processing the frame */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002457
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002458 switch (sf->program) {
2459 case PROG_TYPE_PMF: {
2460 pmfFrame_t* pmf = &sf->frameType.pmf;
2461 switch (pmf->eFrameName) {
2462 case PMF_TYPE_DISASSOC: {
2463 /* use the protected to set what type of key to send */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002464
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002465 } break;
2466 case PMF_TYPE_DEAUTH: {
2467 } break;
2468 case PMF_TYPE_SAQUERY: {
2469 } break;
2470 case PMF_TYPE_AUTH: {
2471 } break;
2472 case PMF_TYPE_ASSOCREQ: {
2473 } break;
2474 case PMF_TYPE_REASSOCREQ: {
2475 } break;
2476 }
2477 } break;
2478 case PROG_TYPE_TDLS: {
2479 tdlsFrame_t* tdls = &sf->frameType.tdls;
2480 switch (tdls->eFrameName) {
Dake Zhao0a832172015-01-06 11:08:47 -08002481 case TDLS_TYPE_DISCOVERY:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002482 /* use the peer mac address to send the frame */
2483 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002484 case TDLS_TYPE_SETUP:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002485 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002486 case TDLS_TYPE_TEARDOWN:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002487 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002488 case TDLS_TYPE_CHANNELSWITCH:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002489 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002490 case TDLS_TYPE_NULLFRAME:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002491 break;
2492 }
2493 } break;
2494 case PROG_TYPE_VENT: {
2495 ventFrame_t* vent = &sf->frameType.vent;
2496 switch (vent->type) {
Dake Zhao0a832172015-01-06 11:08:47 -08002497 case VENT_TYPE_NEIGREQ:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002498 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002499 case VENT_TYPE_TRANSMGMT:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002500 break;
2501 }
2502 } break;
2503 case PROG_TYPE_WFD: {
2504 wfdFrame_t* wfd = &sf->frameType.wfd;
2505 switch (wfd->eframe) {
2506 case WFD_FRAME_PRBREQ: {
2507 /* send probe req */
2508 } break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002509
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002510 case WFD_FRAME_PRBREQ_TDLS_REQ: {
2511 /* send tunneled tdls probe req */
2512 } break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002513
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002514 case WFD_FRAME_11V_TIMING_MSR_REQ: {
2515 /* send 11v timing mearurement request */
2516 } break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002517
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002518 case WFD_FRAME_RTSP: {
2519 /* send WFD RTSP messages*/
2520 // fetch the type of RTSP message and send it.
2521 switch (wfd->eRtspMsgType) {
Dake Zhao0a832172015-01-06 11:08:47 -08002522 case WFD_RTSP_PAUSE:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002523 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002524 case WFD_RTSP_PLAY:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002525 //send RTSP PLAY
2526 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002527 case WFD_RTSP_TEARDOWN:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002528 //send RTSP TEARDOWN
2529 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002530 case WFD_RTSP_TRIG_PAUSE:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002531 //send RTSP TRIGGER PAUSE
2532 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002533 case WFD_RTSP_TRIG_PLAY:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002534 //send RTSP TRIGGER PLAY
2535 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002536 case WFD_RTSP_TRIG_TEARDOWN:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002537 //send RTSP TRIGGER TEARDOWN
2538 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002539 case WFD_RTSP_SET_PARAMETER:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002540 //send RTSP SET PARAMETER
2541 if (wfd->eSetParams == WFD_CAP_UIBC_KEYBOARD) {
2542 //send RTSP SET PARAMETER message for UIBC keyboard
2543 }
2544 if (wfd->eSetParams == WFD_CAP_UIBC_MOUSE) {
2545 //send RTSP SET PARAMETER message for UIBC Mouse
2546 } else if (wfd->eSetParams == WFD_CAP_RE_NEGO) {
2547 //send RTSP SET PARAMETER message Capability re-negotiation
2548 } else if (wfd->eSetParams == WFD_STANDBY) {
2549 //send RTSP SET PARAMETER message for standby
2550 } else if (wfd->eSetParams == WFD_UIBC_SETTINGS_ENABLE) {
2551 //send RTSP SET PARAMETER message for UIBC settings enable
2552 } else if (wfd->eSetParams == WFD_UIBC_SETTINGS_DISABLE) {
2553 //send RTSP SET PARAMETER message for UIBC settings disable
2554 } else if (wfd->eSetParams == WFD_ROUTE_AUDIO) {
2555 //send RTSP SET PARAMETER message for route audio
2556 } else if (wfd->eSetParams == WFD_3D_VIDEOPARAM) {
2557 //send RTSP SET PARAMETER message for 3D video parameters
2558 } else if (wfd->eSetParams == WFD_2D_VIDEOPARAM) {
2559 //send RTSP SET PARAMETER message for 2D video parameters
2560 }
2561 break;
2562 }
2563 } break;
2564 }
2565 } break;
Dake Zhao0a832172015-01-06 11:08:47 -08002566 /* not need to support HS2 release 1, due to very short time period */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002567 case PROG_TYPE_HS2_R2: {
2568 /* type of frames */
2569 hs2Frame_t* hs2 = &sf->frameType.hs2_r2;
2570 switch (hs2->eframe) {
2571 case HS2_FRAME_ANQPQuery: {
2572 } break;
2573 case HS2_FRAME_DLSRequest: {
2574 } break;
2575 case HS2_FRAME_GARPReq: {
2576 } break;
2577 case HS2_FRAME_GARPRes: {
2578 } break;
2579 case HS2_FRAME_NeighAdv: {
2580 }
2581 case HS2_FRAME_ARPProbe: {
2582 }
2583 case HS2_FRAME_ARPAnnounce: {
2584 } break;
2585 case HS2_FRAME_NeighSolicitReq: {
2586 } break;
2587 case HS2_FRAME_ARPReply: {
2588 } break;
2589 }
Dake Zhao97708202014-11-26 13:59:04 -08002590
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002591 } /* PROG_TYPE_HS2-R2 */
2592 case PROG_TYPE_GEN: {
2593 /* General frames */
Dake Zhao0a832172015-01-06 11:08:47 -08002594 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002595 }
2596 devSendResp->status = STATUS_COMPLETE;
2597 wfaEncodeTLV(WFA_STA_DEV_SEND_FRAME_RESP_TLV, 4, (BYTE*)devSendResp, respBuf);
2598 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -08002599
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002600 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002601}
2602
2603/*
2604 * This is used to set a temporary MAC address of an interface
2605 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002606int wfaStaSetMacAddr(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2607 // Uncomment it if needed
2608 //dutCommand_t *cmd = (dutCommand_t *)caCmdBuf;
2609 // char *ifname = cmd->intf;
2610 dutCmdResponse_t* staCmdResp = &gGenericResp;
2611 // Uncomment it if needed
2612 //char *macaddr = &cmd->cmdsu.macaddr[0];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002613
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002614 wfaEncodeTLV(WFA_STA_SET_MAC_ADDRESS_RESP_TLV, 4, (BYTE*)staCmdResp, respBuf);
2615 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002616
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002617 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002618}
2619
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002620int wfaStaDisconnect(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +02002621 dutCommand_t* cmd = (dutCommand_t*)caCmdBuf;
2622 char* ifname = cmd->intf;
2623 char string[64];
2624 char* token;
2625 FILE* tmpfd;
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002626 dutCmdResponse_t* staDiscResp = &gGenericResp;
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +02002627 uint32_t networkId;
2628 const char* tmpfile = "/tmp/.wfaStaDisconnectTmp";
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002629
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +02002630 DPRINT_INFO(WFA_OUT, "Entering wfaStaDisconnect ...\n");
2631 // Retrieve the network id.
2632 sprintf(gCmdStr, "wpa_cli.sh status > %s", tmpfile);
2633 sret = systemWithLog(gCmdStr);
2634 if (sret != 0) {
2635 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR,
2636 "error getting wpa_supplicant status: %d\n", sret);
2637 }
2638
2639 tmpfd = fopen(tmpfile, "r+");
2640 if (tmpfd == NULL) {
2641 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR, "temp file open failed\n");
2642 }
2643
2644 networkId = -1;
2645 for (;;) {
2646 if (fgets(string, sizeof(string), tmpfd) == NULL) {
2647 break;
2648 }
2649
2650 if (strncmp(string, "id", 2) == 0) {
2651 token = strtok(string, "=");
2652 token = strtok(NULL, "=");
2653 if (token != NULL) {
2654 networkId = atoi(token);
2655 break;
2656 }
2657 }
2658 }
2659 fclose(tmpfd);
2660
2661 if (networkId == -1) {
2662 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR, "no network connected\n");
2663 }
2664
2665 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network %d > %s", ifname,
2666 networkId, tmpfile);
2667 sret = systemWithLog(gCmdStr);
2668 if (sret != 0) {
2669 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR,
2670 "error disabling network: %d\n", sret);
2671 }
2672
2673 if (!readLine(tmpfile, string, sizeof(string))) {
2674 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR,
2675 "unable to read command output\n");
2676 }
2677
2678 if (strcmp(string, "OK") != 0) {
2679 RETURN_STA_CMD_ERROR(staDiscResp, STATUS_ERROR,
2680 "disable network failed, error: %s\n", string);
2681 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002682
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002683 staDiscResp->status = STATUS_COMPLETE;
Wojciech Jakobczyk90875a12020-09-03 12:41:03 +02002684 wfaEncodeTLV(WFA_STA_DISCONNECT_RESP_TLV, sizeof(dutCmdResponse_t),
2685 (BYTE*)staDiscResp, respBuf);
2686 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002687
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002688 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002689}
2690
2691/* Execute CLI, read the status from Environment variable */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002692int wfaExecuteCLI(char* CLI) {
2693 char* retstr;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002694
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002695 sret = systemWithLog(CLI);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002696
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002697 retstr = getenv("WFA_CLI_STATUS");
2698 printf("cli status %s\n", retstr);
2699 return atoi(retstr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002700}
2701
2702/* Supporting Functions */
2703
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002704void wfaSendPing(tgPingStart_t* staPing, float* interval, int streamid) {
2705 int totalpkts, tos = -1;
2706 char cmdStr[256];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002707// char *addr = staPing->dipaddr;
2708#ifdef WFA_PC_CONSOLE
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002709 char addr[40];
2710 char bflag[] = "-b";
2711 char* tmpstr;
2712 int inum = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002713#else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002714 char bflag[] = " ";
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002715#endif
Dake Zhao0a832172015-01-06 11:08:47 -08002716
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002717 totalpkts = (int)(staPing->duration * staPing->frameRate);
Dake Zhao0a832172015-01-06 11:08:47 -08002718
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002719#ifdef WFA_PC_CONSOLE
2720
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002721 printf("\nwfa_cs.c wfaSendPing CS : The Stream ID is %d", streamid);
2722
2723 strcpy(addr, staPing->dipaddr);
2724 printf("\nCS :the addr is %s ", addr);
2725 printf("\nCS :Inside the WFA_PC_CONSLE BLOCK");
2726 printf("\nCS :the addr is %s ", addr);
2727 if (staPing->iptype == 2) {
2728 memset(bflag, 0, strlen(bflag));
2729 } else {
2730 tmpstr = strtok(addr, ".");
2731 inum = atoi(tmpstr);
2732
2733 printf("interval %f\n", *interval);
2734
2735 if (inum >= 224 && inum <= 239) // multicast
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002736 {
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002737 } else // if not MC, check if it is BC address
2738 {
2739 printf("\nCS :Inside the BC address BLOCK");
2740 printf("\nCS :the inum %d", inum);
2741 strtok(NULL, ".");
2742 //strtok(NULL, ".");
2743 tmpstr = strtok(NULL, ".");
2744 printf("tmpstr %s\n", tmpstr);
2745 inum = atoi(tmpstr);
2746 printf("\nCS : The string is %s", tmpstr);
2747 if (inum != 255)
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002748 memset(bflag, 0, strlen(bflag));
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002749 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002750 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002751#endif
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002752 if (staPing->dscp >= 0) {
2753 tos = convertDscpToTos(staPing->dscp);
2754 if (tos < 0)
2755 printf("\nwfaSendPing invalid tos converted, dscp=%d", staPing->dscp);
2756 }
2757 printf("\nwfa_cs.c wfaSendPing : The Stream ID=%d IPtype=%i\n", streamid,
2758 staPing->iptype);
2759 printf("IPtype : %i tos=%d", staPing->iptype, tos);
Dake Zhao0a832172015-01-06 11:08:47 -08002760
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002761 if (staPing->iptype == 2) {
2762 if (tos > 0)
2763 sprintf(cmdStr,
2764 "echo streamid=%i > /tmp/spout_%d.txt;wfaping6.sh %s %s -i %f -c "
2765 "%i -Q %d -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2766 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2767 tos, staPing->frameSize, streamid);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002768 else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002769 sprintf(cmdStr,
2770 "echo streamid=%i > /tmp/spout_%d.txt;wfaping6.sh %s %s -i %f -c "
2771 "%i -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2772 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2773 staPing->frameSize, streamid);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02002774 sret = systemWithLog(cmdStr);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002775 printf("\nCS : The command string is %s", cmdStr);
2776 } else {
2777 if (tos > 0)
2778 sprintf(cmdStr,
2779 "echo streamid=%i > /tmp/spout_%d.txt;wfaping.sh %s %s -i %f -c "
2780 "%i -Q %d -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2781 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2782 tos, staPing->frameSize, streamid);
2783 else
2784 sprintf(cmdStr,
2785 "echo streamid=%i > /tmp/spout_%d.txt;wfaping.sh %s %s -i %f -c "
2786 "%i -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2787 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2788 staPing->frameSize, streamid);
2789 sret = systemWithLog(cmdStr);
2790 printf("\nCS : The command string is %s", cmdStr);
2791 }
2792 sprintf(cmdStr, "updatepid.sh /tmp/spout_%d.txt", streamid);
2793 sret = systemWithLog(cmdStr);
2794 printf("\nCS : The command string is %s", cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002795}
2796
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002797int wfaStopPing(dutCmdResponse_t* stpResp, int streamid) {
2798 char strout[256];
2799 FILE* tmpfile = NULL;
2800 char cmdStr[128];
2801 printf("\nwfa_cs.c wfaStopPing:: stream id=%d\n", streamid);
2802 sprintf(cmdStr, "getpid.sh /tmp/spout_%d.txt /tmp/pid.txt", streamid);
2803 sret = systemWithLog(cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002804
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002805 printf("\nCS : The command string is %s", cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002806
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002807 sret = systemWithLog("stoping.sh /tmp/pid.txt ; sleep 2");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002808
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002809 sprintf(cmdStr, "getpstats.sh /tmp/spout_%d.txt", streamid);
2810 sret = systemWithLog(cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002811
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002812 printf("\nCS : The command string is %s", cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002813
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002814 tmpfile = fopen("/tmp/stpsta.txt", "r+");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002815
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002816 if (tmpfile == NULL) {
2817 return WFA_FAILURE;
2818 }
2819
2820 if (fscanf(tmpfile, "%s", strout) != EOF) {
2821 if (*strout == '\0') {
2822 stpResp->cmdru.pingStp.sendCnt = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002823 }
2824
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002825 else
2826 stpResp->cmdru.pingStp.sendCnt = atoi(strout);
2827 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002828
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002829 printf("\nwfaStopPing after scan sent count %i\n",
2830 stpResp->cmdru.pingStp.sendCnt);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002831
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002832 if (fscanf(tmpfile, "%s", strout) != EOF) {
2833 if (*strout == '\0') {
2834 stpResp->cmdru.pingStp.repliedCnt = 0;
2835 } else
2836 stpResp->cmdru.pingStp.repliedCnt = atoi(strout);
2837 }
2838 printf("wfaStopPing after scan replied count %i\n",
2839 stpResp->cmdru.pingStp.repliedCnt);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002840
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002841 fclose(tmpfile);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002842
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002843 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002844}
2845
Ankur Vachhanic485b712012-02-15 23:29:49 +00002846/*
Dake Zhao0a832172015-01-06 11:08:47 -08002847 * wfaStaGetP2pDevAddress():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002848 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002849int wfaStaGetP2pDevAddress(int len,
2850 BYTE* caCmdBuf,
2851 int* respLen,
2852 BYTE* respBuf) {
2853 dutCmdResponse_t infoResp;
2854 /* dutCommand_t *getInfo = (dutCommand_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002855
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002856 printf("\n Entry wfaStaGetP2pDevAddress... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002857
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002858 // Fetch the device ID and store into infoResp->cmdru.devid
2859 //strcpy(infoResp->cmdru.devid, str);
2860 strcpy(&infoResp.cmdru.devid[0], "ABCDEFGH");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002861
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002862 infoResp.status = STATUS_COMPLETE;
2863 wfaEncodeTLV(WFA_STA_P2P_GET_DEV_ADDRESS_RESP_TLV, sizeof(infoResp),
2864 (BYTE*)&infoResp, respBuf);
2865 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002866
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002867 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002868}
2869
Ankur Vachhanic485b712012-02-15 23:29:49 +00002870/*
Dake Zhao0a832172015-01-06 11:08:47 -08002871 * wfaStaSetP2p():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002872 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002873int wfaStaSetP2p(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2874 dutCmdResponse_t infoResp;
2875 /* caStaSetP2p_t *getStaSetP2p = (caStaSetP2p_t *)caCmdBuf; uncomment and use it*/
Ankur Vachhanic485b712012-02-15 23:29:49 +00002876
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002877 printf("\n Entry wfaStaSetP2p... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002878
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002879 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002880
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002881 infoResp.status = STATUS_COMPLETE;
2882 wfaEncodeTLV(WFA_STA_P2P_SETP2P_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
2883 respBuf);
2884 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002885
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002886 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002887}
2888/*
Dake Zhao0a832172015-01-06 11:08:47 -08002889 * wfaStaP2pConnect():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002890 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002891int wfaStaP2pConnect(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2892 dutCmdResponse_t infoResp;
2893 /* caStaP2pConnect_t *getStaP2pConnect = (caStaP2pConnect_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002894
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002895 printf("\n Entry wfaStaP2pConnect... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002896
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002897 // Implement the function and does not return anything.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002898
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002899 infoResp.status = STATUS_COMPLETE;
2900 wfaEncodeTLV(WFA_STA_P2P_CONNECT_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
2901 respBuf);
2902 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00002903
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002904 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002905}
2906
2907/*
Dake Zhao0a832172015-01-06 11:08:47 -08002908 * wfaStaStartAutoGo():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002909 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002910int wfaStaStartAutoGo(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2911 dutCmdResponse_t infoResp;
2912 //caStaStartAutoGo_t *getStaStartAutoGo = (caStaStartAutoGo_t *)caCmdBuf;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002913
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002914 printf("\n Entry wfaStaStartAutoGo... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002915
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002916 // Fetch the group ID and store into infoResp->cmdru.grpid
2917 strcpy(&infoResp.cmdru.grpid[0], "ABCDEFGH");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002918
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002919 infoResp.status = STATUS_COMPLETE;
2920 wfaEncodeTLV(WFA_STA_P2P_START_AUTO_GO_RESP_TLV, sizeof(infoResp),
2921 (BYTE*)&infoResp, respBuf);
2922 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002923
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002924 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002925}
2926
Ankur Vachhanic485b712012-02-15 23:29:49 +00002927/*
Dake Zhao0a832172015-01-06 11:08:47 -08002928 * wfaStaP2pStartGrpFormation():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002929 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002930int wfaStaP2pStartGrpFormation(int len,
2931 BYTE* caCmdBuf,
2932 int* respLen,
2933 BYTE* respBuf) {
2934 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002935
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002936 printf("\n Entry wfaStaP2pStartGrpFormation... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002937
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002938 strcpy(infoResp.cmdru.grpFormInfo.result, "CLIENT");
2939 strcpy(infoResp.cmdru.grpFormInfo.grpId, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002940
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002941 infoResp.status = STATUS_COMPLETE;
2942 wfaEncodeTLV(WFA_STA_P2P_START_GRP_FORMATION_RESP_TLV, sizeof(infoResp),
2943 (BYTE*)&infoResp, respBuf);
2944 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00002945
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002946 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002947}
2948
Ankur Vachhanic485b712012-02-15 23:29:49 +00002949/*
Dake Zhao0a832172015-01-06 11:08:47 -08002950 * wfaStaP2pDissolve():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002951 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002952int wfaStaP2pDissolve(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2953 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002954
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002955 printf("\n Entry wfaStaP2pDissolve... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002956
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002957 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002958
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002959 infoResp.status = STATUS_COMPLETE;
2960 wfaEncodeTLV(WFA_STA_P2P_DISSOLVE_RESP_TLV, sizeof(infoResp),
2961 (BYTE*)&infoResp, respBuf);
2962 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002963
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002964 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002965}
2966
2967/*
Dake Zhao0a832172015-01-06 11:08:47 -08002968 * wfaStaSendP2pInvReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002969 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002970int wfaStaSendP2pInvReq(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2971 dutCmdResponse_t infoResp;
2972 /* caStaSendP2pInvReq_t *getStaP2pInvReq= (caStaSendP2pInvReq_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002973
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002974 printf("\n Entry wfaStaSendP2pInvReq... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002975
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002976 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002977
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002978 infoResp.status = STATUS_COMPLETE;
2979 wfaEncodeTLV(WFA_STA_P2P_SEND_INV_REQ_RESP_TLV, sizeof(infoResp),
2980 (BYTE*)&infoResp, respBuf);
2981 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002982
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002983 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002984}
2985
Ankur Vachhanic485b712012-02-15 23:29:49 +00002986/*
Dake Zhao0a832172015-01-06 11:08:47 -08002987 * wfaStaAcceptP2pInvReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002988 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002989int wfaStaAcceptP2pInvReq(int len,
2990 BYTE* caCmdBuf,
2991 int* respLen,
2992 BYTE* respBuf) {
2993 dutCmdResponse_t infoResp;
2994 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08002995 * caStaAcceptP2pInvReq_t *getStaP2pInvReq= (caStaAcceptP2pInvReq_t *)caCmdBuf;
2996 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002997
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002998 printf("\n Entry wfaStaAcceptP2pInvReq... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002999
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003000 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003001
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003002 infoResp.status = STATUS_COMPLETE;
3003 wfaEncodeTLV(WFA_STA_P2P_ACCEPT_INV_REQ_RESP_TLV, sizeof(infoResp),
3004 (BYTE*)&infoResp, respBuf);
3005 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003006
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003007 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003008}
3009
Ankur Vachhanic485b712012-02-15 23:29:49 +00003010/*
Dake Zhao0a832172015-01-06 11:08:47 -08003011 * wfaStaSendP2pProvDisReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003012 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003013int wfaStaSendP2pProvDisReq(int len,
3014 BYTE* caCmdBuf,
3015 int* respLen,
3016 BYTE* respBuf) {
3017 dutCmdResponse_t infoResp;
3018 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003019 * caStaSendP2pProvDisReq_t *getStaP2pProvDisReq= (caStaSendP2pProvDisReq_t *)caCmdBuf;
3020 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003021
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003022 printf("\n Entry wfaStaSendP2pProvDisReq... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003023
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003024 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003025
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003026 infoResp.status = STATUS_COMPLETE;
3027 wfaEncodeTLV(WFA_STA_P2P_SEND_PROV_DIS_REQ_RESP_TLV, sizeof(infoResp),
3028 (BYTE*)&infoResp, respBuf);
3029 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003030
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003031 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003032}
3033
3034/*
Dake Zhao0a832172015-01-06 11:08:47 -08003035 * wfaStaSetWpsPbc():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003036 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003037int wfaStaSetWpsPbc(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3038 dutCmdResponse_t infoResp;
3039 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003040 * caStaSetWpsPbc_t *getStaSetWpsPbc= (caStaSetWpsPbc_t *)caCmdBuf;
3041 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003042
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003043 printf("\n Entry wfaStaSetWpsPbc... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003044
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003045 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003046
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003047 infoResp.status = STATUS_COMPLETE;
3048 wfaEncodeTLV(WFA_STA_WPS_SETWPS_PBC_RESP_TLV, sizeof(infoResp),
3049 (BYTE*)&infoResp, respBuf);
3050 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003051
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003052 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003053}
3054
3055/*
Dake Zhao0a832172015-01-06 11:08:47 -08003056 * wfaStaWpsReadPin():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003057 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003058int wfaStaWpsReadPin(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3059 dutCmdResponse_t infoResp;
3060 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003061 * caStaWpsReadPin_t *getStaWpsReadPin= (caStaWpsReadPin_t *)caCmdBuf;
3062 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003063
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003064 printf("\n Entry wfaStaWpsReadPin... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003065
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003066 // Fetch the device PIN and put in infoResp->cmdru.wpsPin
3067 //strcpy(infoResp->cmdru.wpsPin, "12345678");
3068 strcpy(&infoResp.cmdru.wpsPin[0], "1234456");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003069
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003070 infoResp.status = STATUS_COMPLETE;
3071 wfaEncodeTLV(WFA_STA_WPS_READ_PIN_RESP_TLV, sizeof(infoResp),
3072 (BYTE*)&infoResp, respBuf);
3073 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003074
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003075 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003076}
3077
Ankur Vachhanic485b712012-02-15 23:29:49 +00003078/*
Dake Zhao0a832172015-01-06 11:08:47 -08003079 * wfaStaWpsReadLabel():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003080 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003081int wfaStaWpsReadLabel(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3082 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003083
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003084 printf("\n Entry wfaStaWpsReadLabel... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003085
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003086 // Fetch the device Label and put in infoResp->cmdru.wpsPin
3087 //strcpy(infoResp->cmdru.wpsPin, "12345678");
3088 strcpy(&infoResp.cmdru.wpsPin[0], "1234456");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003089
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003090 infoResp.status = STATUS_COMPLETE;
3091 wfaEncodeTLV(WFA_STA_WPS_READ_PIN_RESP_TLV, sizeof(infoResp),
3092 (BYTE*)&infoResp, respBuf);
3093 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003094
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003095 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003096}
3097
Ankur Vachhanic485b712012-02-15 23:29:49 +00003098/*
Dake Zhao0a832172015-01-06 11:08:47 -08003099 * wfaStaWpsEnterPin():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003100 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003101int wfaStaWpsEnterPin(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3102 dutCmdResponse_t infoResp;
3103 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003104 * caStaWpsEnterPin_t *getStaWpsEnterPin= (caStaWpsEnterPin_t *)caCmdBuf;
3105 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003106
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003107 printf("\n Entry wfaStaWpsEnterPin... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003108
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003109 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003110
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003111 infoResp.status = STATUS_COMPLETE;
3112 wfaEncodeTLV(WFA_STA_WPS_ENTER_PIN_RESP_TLV, sizeof(infoResp),
3113 (BYTE*)&infoResp, respBuf);
3114 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003115
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003116 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003117}
3118
Ankur Vachhanic485b712012-02-15 23:29:49 +00003119/*
Dake Zhao0a832172015-01-06 11:08:47 -08003120 * wfaStaGetPsk():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003121 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003122int wfaStaGetPsk(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3123 dutCmdResponse_t infoResp;
3124 /* caStaGetPsk_t *getStaGetPsk= (caStaGetPsk_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003125
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003126 printf("\n Entry wfaStaGetPsk... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003127
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003128 // Fetch the device PP and SSID and put in infoResp->cmdru.pskInfo
3129 strcpy(&infoResp.cmdru.pskInfo.passPhrase[0], "1234456");
3130 strcpy(&infoResp.cmdru.pskInfo.ssid[0], "WIFI_DIRECT");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003131
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003132 infoResp.status = STATUS_COMPLETE;
3133 wfaEncodeTLV(WFA_STA_P2P_GET_PSK_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3134 respBuf);
3135 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003136
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003137 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003138}
3139
3140/*
Dake Zhao0a832172015-01-06 11:08:47 -08003141 * wfaStaP2pReset():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003142 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003143int wfaStaP2pReset(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3144 dutCmdResponse_t infoResp;
3145 /* dutCommand_t *getStaP2pReset= (dutCommand_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003146
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003147 printf("\n Entry wfaStaP2pReset... ");
3148 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003149
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003150 infoResp.status = STATUS_COMPLETE;
3151 wfaEncodeTLV(WFA_STA_P2P_RESET_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3152 respBuf);
3153 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003154
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003155 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003156}
3157
Ankur Vachhanic485b712012-02-15 23:29:49 +00003158/*
Dake Zhao0a832172015-01-06 11:08:47 -08003159 * wfaStaGetP2pIpConfig():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003160 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003161int wfaStaGetP2pIpConfig(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3162 dutCmdResponse_t infoResp;
3163 /* caStaGetP2pIpConfig_t *staGetP2pIpConfig= (caStaGetP2pIpConfig_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003164
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003165 caStaGetIpConfigResp_t* ifinfo = &(infoResp.cmdru.getIfconfig);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003166
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003167 printf("\n Entry wfaStaGetP2pIpConfig... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003168
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003169 ifinfo->isDhcp = 0;
3170 strcpy(&(ifinfo->ipaddr[0]), "192.165.100.111");
3171 strcpy(&(ifinfo->mask[0]), "255.255.255.0");
3172 strcpy(&(ifinfo->dns[0][0]), "192.165.100.1");
3173 strcpy(&(ifinfo->mac[0]), "ba:ba:ba:ba:ba:ba");
Dake Zhao0a832172015-01-06 11:08:47 -08003174
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003175 infoResp.status = STATUS_COMPLETE;
3176 wfaEncodeTLV(WFA_STA_P2P_GET_IP_CONFIG_RESP_TLV, sizeof(infoResp),
3177 (BYTE*)&infoResp, respBuf);
3178 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003179
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003180 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003181}
3182
Ankur Vachhanic485b712012-02-15 23:29:49 +00003183/*
Dake Zhao0a832172015-01-06 11:08:47 -08003184 * wfaStaSendServiceDiscoveryReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003185 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003186int wfaStaSendServiceDiscoveryReq(int len,
3187 BYTE* caCmdBuf,
3188 int* respLen,
3189 BYTE* respBuf) {
3190 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003191
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003192 printf("\n Entry wfaStaSendServiceDiscoveryReq... ");
3193 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003194
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003195 infoResp.status = STATUS_COMPLETE;
3196 wfaEncodeTLV(WFA_STA_P2P_SEND_SERVICE_DISCOVERY_REQ_RESP_TLV,
3197 sizeof(infoResp), (BYTE*)&infoResp, respBuf);
3198 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003199
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003200 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003201}
3202
Ankur Vachhanic485b712012-02-15 23:29:49 +00003203/*
Dake Zhao0a832172015-01-06 11:08:47 -08003204 * wfaStaSendP2pPresenceReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003205 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003206int wfaStaSendP2pPresenceReq(int len,
3207 BYTE* caCmdBuf,
3208 int* respLen,
3209 BYTE* respBuf) {
3210 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003211
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003212 infoResp.status = STATUS_COMPLETE;
3213 wfaEncodeTLV(WFA_STA_P2P_SEND_PRESENCE_REQ_RESP_TLV, sizeof(infoResp),
3214 (BYTE*)&infoResp, respBuf);
3215 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003216
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003217 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003218}
3219
3220/*
Dake Zhao0a832172015-01-06 11:08:47 -08003221 * wfaStaSetSleepReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003222 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003223int wfaStaSetSleepReq(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3224 dutCmdResponse_t infoResp;
3225 /* caStaSetSleep_t *staSetSleepReq= (caStaSetSleep_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003226
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003227 printf("\n Entry wfaStaSetSleepReq... ");
3228 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003229
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003230 infoResp.status = STATUS_COMPLETE;
3231 wfaEncodeTLV(WFA_STA_P2P_SET_SLEEP_RESP_TLV, sizeof(infoResp),
3232 (BYTE*)&infoResp, respBuf);
3233 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -08003234
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003235 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003236}
3237
3238/*
Dake Zhao0a832172015-01-06 11:08:47 -08003239 * wfaStaSetOpportunisticPsReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003240 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003241int wfaStaSetOpportunisticPsReq(int len,
3242 BYTE* caCmdBuf,
3243 int* respLen,
3244 BYTE* respBuf) {
3245 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003246
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003247 printf("\n Entry wfaStaSetOpportunisticPsReq... ");
3248 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003249
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003250 infoResp.status = STATUS_COMPLETE;
3251 wfaEncodeTLV(WFA_STA_P2P_SET_OPPORTUNISTIC_PS_RESP_TLV, sizeof(infoResp),
3252 (BYTE*)&infoResp, respBuf);
3253 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -08003254
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003255 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003256}
3257#ifndef WFA_STA_TB
3258/*
Dake Zhao0a832172015-01-06 11:08:47 -08003259 * wfaStaPresetParams():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003260 */
3261
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003262int wfaStaPresetParams(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3263 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003264
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003265 DPRINT_INFO(WFA_OUT, "Inside wfaStaPresetParameters function ...\n");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003266
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003267 // Implement the function and its sub commands
3268 infoResp.status = STATUS_COMPLETE;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003269
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003270 wfaEncodeTLV(WFA_STA_PRESET_PARAMETERS_RESP_TLV, 4, (BYTE*)&infoResp,
3271 respBuf);
3272 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003273
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003274 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003275}
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003276int wfaStaSet11n(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3277 dutCmdResponse_t infoResp;
3278 dutCmdResponse_t* v11nParamsResp = &infoResp;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003279
3280#ifdef WFA_11N_SUPPORT_ONLY
Dake Zhao0a832172015-01-06 11:08:47 -08003281
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003282 caSta11n_t* v11nParams = (caSta11n_t*)caCmdBuf;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003283
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003284 int st = 0; // SUCCESS
Dake Zhao0a832172015-01-06 11:08:47 -08003285
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003286 DPRINT_INFO(WFA_OUT, "Inside wfaStaSet11n function....\n");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003287
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003288 if (v11nParams->addba_reject != 0xFF && v11nParams->addba_reject < 2) {
3289 // implement the funciton
3290 if (st != 0) {
3291 v11nParamsResp->status = STATUS_ERROR;
3292 strcpy(v11nParamsResp->cmdru.info, "set_addba_reject failed");
3293 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3294 (BYTE*)v11nParamsResp, respBuf);
3295 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3296 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003297 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003298 }
Dake Zhao0a832172015-01-06 11:08:47 -08003299
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003300 if (v11nParams->ampdu != 0xFF && v11nParams->ampdu < 2) {
3301 // implement the funciton
Ankur Vachhanic485b712012-02-15 23:29:49 +00003302
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003303 if (st != 0) {
3304 v11nParamsResp->status = STATUS_ERROR;
3305 strcpy(v11nParamsResp->cmdru.info, "set_ampdu failed");
3306 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3307 (BYTE*)v11nParamsResp, respBuf);
3308 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3309 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003310 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003311 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003312
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003313 if (v11nParams->amsdu != 0xFF && v11nParams->amsdu < 2) {
3314 // implement the funciton
3315 if (st != 0) {
3316 v11nParamsResp->status = STATUS_ERROR;
3317 strcpy(v11nParamsResp->cmdru.info, "set_amsdu failed");
3318 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3319 (BYTE*)v11nParamsResp, respBuf);
3320 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3321 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003322 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003323 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003324
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003325 if (v11nParams->greenfield != 0xFF && v11nParams->greenfield < 2) {
3326 // implement the funciton
3327 if (st != 0) {
3328 v11nParamsResp->status = STATUS_ERROR;
3329 strcpy(v11nParamsResp->cmdru.info, "_set_greenfield failed");
3330 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3331 (BYTE*)v11nParamsResp, respBuf);
3332 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3333 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003334 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003335 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003336
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003337 if (v11nParams->mcs32 != 0xFF && v11nParams->mcs32 < 2 &&
3338 v11nParams->mcs_fixedrate[0] != '\0') {
3339 // implement the funciton
3340 //st = wfaExecuteCLI(gCmdStr);
3341 if (st != 0) {
3342 v11nParamsResp->status = STATUS_ERROR;
3343 strcpy(v11nParamsResp->cmdru.info, "set_mcs failed");
3344 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3345 (BYTE*)v11nParamsResp, respBuf);
3346 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3347 return FALSE;
Dake Zhao0a832172015-01-06 11:08:47 -08003348 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003349 } else if (v11nParams->mcs32 != 0xFF && v11nParams->mcs32 < 2 &&
3350 v11nParams->mcs_fixedrate[0] == '\0') {
3351 // implement the funciton
3352 //st = wfaExecuteCLI(gCmdStr);
3353 if (st != 0) {
3354 v11nParamsResp->status = STATUS_ERROR;
3355 strcpy(v11nParamsResp->cmdru.info, "set_mcs32 failed");
3356 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3357 (BYTE*)v11nParamsResp, respBuf);
3358 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3359 return FALSE;
Dake Zhao0a832172015-01-06 11:08:47 -08003360 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003361 } else if (v11nParams->mcs32 == 0xFF &&
3362 v11nParams->mcs_fixedrate[0] != '\0') {
3363 // implement the funciton
3364 //st = wfaExecuteCLI(gCmdStr);
3365 if (st != 0) {
3366 v11nParamsResp->status = STATUS_ERROR;
3367 strcpy(v11nParamsResp->cmdru.info, "set_mcs32 failed");
3368 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3369 (BYTE*)v11nParamsResp, respBuf);
3370 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3371 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003372 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003373 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003374
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003375 if (v11nParams->rifs_test != 0xFF && v11nParams->rifs_test < 2) {
3376 // implement the funciton
3377 //st = wfaExecuteCLI(gCmdStr);
3378 if (st != 0) {
3379 v11nParamsResp->status = STATUS_ERROR;
3380 strcpy(v11nParamsResp->cmdru.info, "set_rifs_test failed");
3381 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3382 (BYTE*)v11nParamsResp, respBuf);
3383 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3384 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003385 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003386 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003387
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003388 if (v11nParams->sgi20 != 0xFF && v11nParams->sgi20 < 2) {
3389 // implement the funciton
3390 //st = wfaExecuteCLI(gCmdStr);
3391 if (st != 0) {
3392 v11nParamsResp->status = STATUS_ERROR;
3393 strcpy(v11nParamsResp->cmdru.info, "set_sgi20 failed");
3394 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3395 (BYTE*)v11nParamsResp, respBuf);
3396 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3397 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003398 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003399 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003400
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003401 if (v11nParams->smps != 0xFFFF) {
3402 if (v11nParams->smps == 0) {
3403 // implement the funciton
3404 //st = wfaExecuteCLI(gCmdStr);
3405 } else if (v11nParams->smps == 1) {
3406 // implement the funciton
3407 //st = wfaExecuteCLI(gCmdStr);
3408 ;
3409 } else if (v11nParams->smps == 2) {
3410 // implement the funciton
3411 //st = wfaExecuteCLI(gCmdStr);
3412 ;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003413 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003414 if (st != 0) {
3415 v11nParamsResp->status = STATUS_ERROR;
3416 strcpy(v11nParamsResp->cmdru.info, "set_smps failed");
3417 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3418 (BYTE*)v11nParamsResp, respBuf);
3419 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3420 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003421 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003422 }
Dake Zhao0a832172015-01-06 11:08:47 -08003423
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003424 if (v11nParams->stbc_rx != 0xFFFF) {
3425 // implement the funciton
3426 //st = wfaExecuteCLI(gCmdStr);
3427 if (st != 0) {
3428 v11nParamsResp->status = STATUS_ERROR;
3429 strcpy(v11nParamsResp->cmdru.info, "set_stbc_rx failed");
3430 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3431 (BYTE*)v11nParamsResp, respBuf);
3432 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3433 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003434 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003435 }
Dake Zhao0a832172015-01-06 11:08:47 -08003436
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003437 if (v11nParams->width[0] != '\0') {
3438 // implement the funciton
3439 //st = wfaExecuteCLI(gCmdStr);
3440 if (st != 0) {
3441 v11nParamsResp->status = STATUS_ERROR;
3442 strcpy(v11nParamsResp->cmdru.info, "set_11n_channel_width failed");
3443 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3444 (BYTE*)v11nParamsResp, respBuf);
3445 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3446 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003447 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003448 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003449
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003450 if (v11nParams->_40_intolerant != 0xFF && v11nParams->_40_intolerant < 2) {
3451 // implement the funciton
3452 //st = wfaExecuteCLI(gCmdStr);
3453 if (st != 0) {
3454 v11nParamsResp->status = STATUS_ERROR;
3455 strcpy(v11nParamsResp->cmdru.info, "set_40_intolerant failed");
3456 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3457 (BYTE*)v11nParamsResp, respBuf);
3458 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3459 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003460 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003461 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003462
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003463 if (v11nParams->txsp_stream != 0 && v11nParams->txsp_stream < 4) {
3464 // implement the funciton
3465 //st = wfaExecuteCLI(gCmdStr);
3466 if (st != 0) {
3467 v11nParamsResp->status = STATUS_ERROR;
3468 strcpy(v11nParamsResp->cmdru.info, "set_txsp_stream failed");
3469 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3470 (BYTE*)v11nParamsResp, respBuf);
3471 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3472 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003473 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003474 }
3475
3476 if (v11nParams->rxsp_stream != 0 && v11nParams->rxsp_stream < 4) {
3477 // implement the funciton
3478 //st = wfaExecuteCLI(gCmdStr);
3479 if (st != 0) {
3480 v11nParamsResp->status = STATUS_ERROR;
3481 strcpy(v11nParamsResp->cmdru.info, "set_rxsp_stream failed");
3482 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3483 (BYTE*)v11nParamsResp, respBuf);
3484 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3485 return FALSE;
3486 }
3487 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003488
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003489#endif
Ankur Vachhanic485b712012-02-15 23:29:49 +00003490
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003491 v11nParamsResp->status = STATUS_COMPLETE;
3492 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, 4, (BYTE*)v11nParamsResp, respBuf);
3493 *respLen = WFA_TLV_HDR_LEN + 4;
3494 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003495}
3496#endif
3497/*
Dake Zhao0a832172015-01-06 11:08:47 -08003498 * wfaStaAddArpTableEntry():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003499 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003500int wfaStaAddArpTableEntry(int len,
3501 BYTE* caCmdBuf,
3502 int* respLen,
3503 BYTE* respBuf) {
3504 dutCmdResponse_t infoResp;
3505 /* caStaAddARPTableEntry_t *staAddARPTableEntry= (caStaAddARPTableEntry_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003506
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003507 printf("\n Entry wfastaAddARPTableEntry... ");
3508 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003509
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003510 infoResp.status = STATUS_COMPLETE;
3511 wfaEncodeTLV(WFA_STA_P2P_ADD_ARP_TABLE_ENTRY_RESP_TLV, sizeof(infoResp),
3512 (BYTE*)&infoResp, respBuf);
3513 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003514
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003515 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003516}
3517
3518/*
Dake Zhao0a832172015-01-06 11:08:47 -08003519 * wfaStaBlockICMPResponse():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003520 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003521int wfaStaBlockICMPResponse(int len,
3522 BYTE* caCmdBuf,
3523 int* respLen,
3524 BYTE* respBuf) {
3525 dutCmdResponse_t infoResp;
3526 /* caStaBlockICMPResponse_t *staAddARPTableEntry= (caStaBlockICMPResponse_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003527
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003528 printf("\n Entry wfaStaBlockICMPResponse... ");
3529 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003530
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003531 infoResp.status = STATUS_COMPLETE;
3532 wfaEncodeTLV(WFA_STA_P2P_BLOCK_ICMP_RESPONSE_RESP_TLV, sizeof(infoResp),
3533 (BYTE*)&infoResp, respBuf);
3534 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003535
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003536 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003537}
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003538
3539/*
Dake Zhao0a832172015-01-06 11:08:47 -08003540 * wfaStaSetRadio():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003541 */
3542
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003543int wfaStaSetRadio(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3544 dutCommand_t* setRadio = (dutCommand_t*)caCmdBuf;
3545 dutCmdResponse_t* staCmdResp = &gGenericResp;
3546 caStaSetRadio_t* sr = &setRadio->cmdsu.sr;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003547
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003548 if (sr->mode == WFA_OFF) {
3549 // turn radio off
3550 } else {
3551 // always turn the radio on
3552 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003553
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003554 staCmdResp->status = STATUS_COMPLETE;
3555 wfaEncodeTLV(WFA_STA_SET_RADIO_RESP_TLV, 4, (BYTE*)staCmdResp, respBuf);
3556 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003557
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003558 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003559}
3560
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003561/*
Dake Zhao0a832172015-01-06 11:08:47 -08003562 * wfaStaSetRFeature():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003563 */
3564
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003565int wfaStaSetRFeature(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3566 dutCommand_t* dutCmd = (dutCommand_t*)caCmdBuf;
3567 caStaRFeat_t* rfeat = &dutCmd->cmdsu.rfeat;
3568 dutCmdResponse_t* caResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003569
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003570 if (strcasecmp(rfeat->prog, "tdls") == 0) {
3571 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003572
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003573 caResp->status = STATUS_COMPLETE;
3574 wfaEncodeTLV(WFA_STA_SET_RFEATURE_RESP_TLV, 4, (BYTE*)caResp, respBuf);
3575 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003576
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003577 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003578}
3579
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003580/*
Dake Zhao0a832172015-01-06 11:08:47 -08003581 * wfaStaStartWfdConnection():
3582 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003583int wfaStaStartWfdConnection(int len,
3584 BYTE* caCmdBuf,
3585 int* respLen,
3586 BYTE* respBuf) {
3587 dutCmdResponse_t infoResp;
3588 //caStaStartWfdConn_t *staStartWfdConn= (caStaStartWfdConn_t *)caCmdBuf; //uncomment and use it
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003589
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003590 printf("\n Entry wfaStaStartWfdConnection... ");
Dake Zhao0a832172015-01-06 11:08:47 -08003591
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003592 // Fetch the GrpId and WFD session and return
3593 strcpy(&infoResp.cmdru.wfdConnInfo.wfdSessionId[0], "1234567890");
3594 strcpy(&infoResp.cmdru.wfdConnInfo.p2pGrpId[0], "WIFI_DISPLAY");
3595 strcpy(&infoResp.cmdru.wfdConnInfo.result[0], "GO");
Dake Zhao0a832172015-01-06 11:08:47 -08003596
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003597 infoResp.status = STATUS_COMPLETE;
3598 wfaEncodeTLV(WFA_STA_START_WFD_CONNECTION_RESP_TLV, sizeof(infoResp),
3599 (BYTE*)&infoResp, respBuf);
3600 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003601
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003602 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003603}
3604/*
Dake Zhao0a832172015-01-06 11:08:47 -08003605 * wfaStaCliCommand():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003606 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003607
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003608int wfaStaCliCommand(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3609 char cmdName[32];
3610 char *pcmdStr = NULL, *str;
3611 int st = 1;
3612 char CmdStr[WFA_CMD_STR_SZ];
3613 FILE* wfaCliFd;
3614 char wfaCliBuff[64];
3615 char retstr[256];
3616 int CmdReturnFlag = 0;
3617 char tmp[256];
3618 FILE* sh_pipe = NULL;
3619 caStaCliCmdResp_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003620
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003621 printf("\nEntry wfaStaCliCommand; command Received: %s\n", caCmdBuf);
3622 memcpy(cmdName, strtok_r((char*)caCmdBuf, ",", (char**)&pcmdStr), 32);
3623 sprintf(CmdStr, "%s", cmdName);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003624
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003625 for (;;) {
3626 // construct CLI standard cmd string
3627 str = strtok_r(NULL, ",", &pcmdStr);
3628 if (str == NULL || str[0] == '\0')
3629 break;
3630 else {
3631 strcat(strcat(CmdStr, " /"), str);
3632 str = strtok_r(NULL, ",", &pcmdStr);
3633 strcat(strcat(CmdStr, " "), str);
Dake Zhao0a832172015-01-06 11:08:47 -08003634 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003635 }
3636 // check the return process
3637 wfaCliFd = fopen("/etc/WfaEndpoint/wfa_cli.txt", "r");
3638 if (wfaCliFd != NULL) {
3639 while (fgets(wfaCliBuff, 64, wfaCliFd) != NULL) {
3640 //printf("\nLine read from CLI file : %s",wfaCliBuff);
3641 if (ferror(wfaCliFd))
3642 break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003643
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003644 str = strtok(wfaCliBuff, "-");
3645 if (strcmp(str, cmdName) == 0) {
3646 str = strtok(NULL, ",");
3647 if (str != NULL) {
3648 if (strcmp(str, "TRUE") == 0)
3649 CmdReturnFlag = 1;
3650 } else
3651 printf(
3652 "ERR wfa_cli.txt, inside line format not end with , or missing "
3653 "TRUE/FALSE\n");
3654 break;
3655 }
Dake Zhao0a832172015-01-06 11:08:47 -08003656 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003657 fclose(wfaCliFd);
3658 } else {
3659 printf("/etc/WfaEndpoint/wfa_cli.txt is not exist\n");
3660 goto cleanup;
3661 }
3662
3663 //printf("\n Command Return Flag : %d",CmdReturnFlag);
3664 memset(&retstr[0], '\0', 255);
3665 memset(&tmp[0], '\0', 255);
3666 sprintf(gCmdStr, "%s", CmdStr);
3667 printf("\nCLI Command -- %s\n", gCmdStr);
3668
3669 sh_pipe = popen(gCmdStr, "r");
3670 if (!sh_pipe) {
3671 printf("Error in opening pipe\n");
3672 goto cleanup;
3673 }
3674
3675 sleep(5);
3676 //tmp_val=getdelim(&retstr,255,"\n",sh_pipe);
3677 if (fgets(&retstr[0], 255, sh_pipe) == NULL) {
3678 printf("Getting NULL string in popen return\n");
3679 goto cleanup;
3680 } else
3681 printf("popen return str=%s\n", retstr);
3682
3683 sleep(2);
3684 if (pclose(sh_pipe) == -1) {
3685 printf("Error in closing shell cmd pipe\n");
3686 goto cleanup;
3687 }
3688 sh_pipe = NULL;
3689 sleep(2);
3690
3691 // find status first in output
3692 str = strtok_r((char*)retstr, "-", (char**)&pcmdStr);
3693 if (str != NULL) {
3694 memset(tmp, 0, 10);
3695 memcpy(tmp, str, 2);
3696 printf("cli status=%s\n", tmp);
3697 if (strlen(tmp) > 0)
3698 st = atoi(tmp);
Dake Zhao0a832172015-01-06 11:08:47 -08003699 else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003700 printf("Missing status code\n");
3701 } else {
3702 printf("wfaStaCliCommand no return code found\n");
3703 }
3704 infoResp.resFlag = CmdReturnFlag;
Dake Zhao0a832172015-01-06 11:08:47 -08003705
Dake Zhao97708202014-11-26 13:59:04 -08003706cleanup:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003707 if (sh_pipe)
3708 pclose(sh_pipe);
Dake Zhao0a832172015-01-06 11:08:47 -08003709
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003710 switch (st) {
Dake Zhao0a832172015-01-06 11:08:47 -08003711 case 0:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003712 infoResp.status = STATUS_COMPLETE;
3713 if (CmdReturnFlag) {
3714 if ((pcmdStr != NULL) && (strlen(pcmdStr) > 0)) {
3715 memset(&(infoResp.result[0]), '\0', WFA_CLI_CMD_RESP_LEN - 1);
3716 strncpy(&infoResp.result[0], pcmdStr,
3717 (strlen(pcmdStr) < WFA_CLI_CMD_RESP_LEN)
3718 ? strlen(pcmdStr)
3719 : (WFA_CLI_CMD_RESP_LEN - 2));
3720 printf("Return CLI result string to CA=%s\n", &(infoResp.result[0]));
3721 } else {
3722 strcpy(&infoResp.result[0], "No return string found\n");
Dake Zhao0a832172015-01-06 11:08:47 -08003723 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003724 }
3725 break;
Dake Zhao0a832172015-01-06 11:08:47 -08003726 case 1:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003727 infoResp.status = STATUS_ERROR;
3728 break;
Dake Zhao0a832172015-01-06 11:08:47 -08003729 case 2:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003730 infoResp.status = STATUS_INVALID;
3731 break;
3732 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003733
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003734 wfaEncodeTLV(WFA_STA_CLI_CMD_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3735 respBuf);
3736 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003737
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003738 printf("Exit from wfaStaCliCommand\n");
3739 return TRUE;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003740}
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003741/*
Dake Zhao0a832172015-01-06 11:08:47 -08003742 * wfaStaConnectGoStartWfd():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003743 */
3744
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003745int wfaStaConnectGoStartWfd(int len,
3746 BYTE* caCmdBuf,
3747 int* respLen,
3748 BYTE* respBuf) {
3749 dutCmdResponse_t infoResp;
3750 // caStaConnectGoStartWfd_t *staConnecGoStartWfd= (caStaConnectGoStartWfd_t *)caCmdBuf; //uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003751
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003752 printf("\n Entry wfaStaConnectGoStartWfd... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003753
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003754 // connect the specified GO and then establish the wfd session
Dake Zhao0a832172015-01-06 11:08:47 -08003755
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003756 // Fetch WFD session and return
3757 strcpy(&infoResp.cmdru.wfdConnInfo.wfdSessionId[0], "1234567890");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003758
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003759 infoResp.status = STATUS_COMPLETE;
3760 wfaEncodeTLV(WFA_STA_CONNECT_GO_START_WFD_RESP_TLV, sizeof(infoResp),
3761 (BYTE*)&infoResp, respBuf);
3762 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003763
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003764 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003765}
3766
3767/*
Dake Zhao0a832172015-01-06 11:08:47 -08003768 * wfaStaGenerateEvent():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003769 */
3770
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003771int wfaStaGenerateEvent(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3772 dutCmdResponse_t infoResp;
3773 caStaGenEvent_t* staGenerateEvent =
3774 (caStaGenEvent_t*)caCmdBuf; //uncomment and use it
3775 caWfdStaGenEvent_t* wfdGenEvent;
Dake Zhao0a832172015-01-06 11:08:47 -08003776
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003777 printf("\n Entry wfaStaGenerateEvent... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003778
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003779 // Geneate the specified action and return with complete/error.
3780 if (staGenerateEvent->program == PROG_TYPE_WFD) {
3781 wfdGenEvent = &staGenerateEvent->wfdEvent;
3782 if (wfdGenEvent->type == eUibcGen) {
3783 } else if (wfdGenEvent->type == eUibcHid) {
3784 } else if (wfdGenEvent->type == eFrameSkip) {
3785 } else if (wfdGenEvent->type == eI2cRead) {
3786 } else if (wfdGenEvent->type == eI2cWrite) {
3787 } else if (wfdGenEvent->type == eInputContent) {
3788 } else if (wfdGenEvent->type == eIdrReq) {
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003789 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003790 }
Dake Zhao0a832172015-01-06 11:08:47 -08003791
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003792 infoResp.status = STATUS_COMPLETE;
3793 wfaEncodeTLV(WFA_STA_GENERATE_EVENT_RESP_TLV, sizeof(infoResp),
3794 (BYTE*)&infoResp, respBuf);
3795 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003796
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003797 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003798}
3799
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003800/*
Dake Zhao0a832172015-01-06 11:08:47 -08003801 * wfaStaReinvokeWfdSession():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003802 */
3803
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003804int wfaStaReinvokeWfdSession(int len,
3805 BYTE* caCmdBuf,
3806 int* respLen,
3807 BYTE* respBuf) {
3808 dutCmdResponse_t infoResp;
3809 // caStaReinvokeWfdSession_t *staReinvokeSession= (caStaReinvokeWfdSession_t *)caCmdBuf; //uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003810
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003811 printf("\n Entry wfaStaReinvokeWfdSession... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003812
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003813 // Reinvoke the WFD session by accepting the p2p invitation or sending p2p invitation
Dake Zhao0a832172015-01-06 11:08:47 -08003814
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003815 infoResp.status = STATUS_COMPLETE;
3816 wfaEncodeTLV(WFA_STA_REINVOKE_WFD_SESSION_RESP_TLV, sizeof(infoResp),
3817 (BYTE*)&infoResp, respBuf);
3818 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003819
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003820 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003821}
3822
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003823int wfaStaGetParameter(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3824 dutCmdResponse_t infoResp;
3825 caStaGetParameter_t* staGetParam =
3826 (caStaGetParameter_t*)caCmdBuf; //uncomment and use it
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003827
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003828 caStaGetParameterResp_t* paramList = &infoResp.cmdru.getParamValue;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003829
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003830 printf("\n Entry wfaStaGetParameter... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003831
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003832 // Check the program type
3833 if (staGetParam->program == PROG_TYPE_WFD) {
3834 if (staGetParam->getParamValue == eDiscoveredDevList) {
3835 // Get the discovered devices, make space seperated list and return, check list is not bigger than 128 bytes.
3836 paramList->getParamType = eDiscoveredDevList;
3837 strcpy((char*)&paramList->devList,
3838 "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 -08003839 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003840 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003841
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003842 if (staGetParam->program == PROG_TYPE_WFDS) {
3843 if (staGetParam->getParamValue == eDiscoveredDevList) {
3844 // Get the discovered devices, make space seperated list and return, check list is not bigger than 128 bytes.
3845 paramList->getParamType = eDiscoveredDevList;
3846 strcpy((char*)&paramList->devList,
3847 "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 -07003848 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003849 if (staGetParam->getParamValue == eOpenPorts) {
3850 // Run the port checker tool
3851 // Get all the open ports and make space seperated list and return, check list is not bigger than 128 bytes.
3852 paramList->getParamType = eOpenPorts;
3853 strcpy((char*)&paramList->devList, "22 139 445 68 9700");
3854 }
3855 }
3856 if (staGetParam->program == PROG_TYPE_NAN) {
3857 if (staGetParam->getParamValue == eMasterPref) {
3858 // Get the master preference of the device and return the value
3859 paramList->getParamType = eMasterPref;
3860 strcpy((char*)&paramList->masterPref, "0xff");
3861 }
3862 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003863
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003864 infoResp.status = STATUS_COMPLETE;
3865 wfaEncodeTLV(WFA_STA_GET_PARAMETER_RESP_TLV, sizeof(infoResp),
3866 (BYTE*)&infoResp, respBuf);
3867 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
3868
3869 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003870}
3871
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003872int wfaStaNfcAction(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3873 dutCmdResponse_t infoResp;
3874 caStaNfcAction_t* getStaNfcAction =
3875 (caStaNfcAction_t*)caCmdBuf; //uncomment and use it
Ankur Vachhanic485b712012-02-15 23:29:49 +00003876
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003877 printf("\n Entry wfaStaNfcAction... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003878
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003879 if (getStaNfcAction->nfcOperation == eNfcHandOver) {
3880 printf("\n NfcAction - HandOver... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003881
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003882 } else if (getStaNfcAction->nfcOperation == eNfcReadTag) {
3883 printf("\n NfcAction - Read Tag... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003884
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003885 } else if (getStaNfcAction->nfcOperation == eNfcWriteSelect) {
3886 printf("\n NfcAction - Write Select... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003887
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003888 } else if (getStaNfcAction->nfcOperation == eNfcWriteConfig) {
3889 printf("\n NfcAction - Write Config... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003890
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003891 } else if (getStaNfcAction->nfcOperation == eNfcWritePasswd) {
3892 printf("\n NfcAction - Write Password... ");
3893
3894 } else if (getStaNfcAction->nfcOperation == eNfcWpsHandOver) {
3895 printf("\n NfcAction - WPS Handover... ");
3896 }
3897
3898 // Fetch the device mode and put in infoResp->cmdru.p2presult
3899 //strcpy(infoResp->cmdru.p2presult, "GO");
3900
3901 // Fetch the device grp id and put in infoResp->cmdru.grpid
3902 //strcpy(infoResp->cmdru.grpid, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
3903
3904 strcpy(infoResp.cmdru.staNfcAction.result, "CLIENT");
3905 strcpy(infoResp.cmdru.staNfcAction.grpId, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
3906 infoResp.cmdru.staNfcAction.peerRole = 1;
3907
3908 infoResp.status = STATUS_COMPLETE;
3909 wfaEncodeTLV(WFA_STA_NFC_ACTION_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3910 respBuf);
3911 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
3912
3913 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07003914}
3915
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003916int wfaStaExecAction(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3917 dutCmdResponse_t infoResp;
3918 caStaExecAction_t* staExecAction =
3919 (caStaExecAction_t*)caCmdBuf; //comment if not used
Dake Zhaocda4a1d2015-06-11 10:14:15 -07003920
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003921 printf("\n Entry wfaStaExecAction... ");
Dake Zhaocda4a1d2015-06-11 10:14:15 -07003922
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003923 if (staExecAction->prog == PROG_TYPE_NAN) {
3924 // Perform necessary configurations and actions
3925 // return the MAC address conditionally as per CAPI specification
3926 }
3927
3928 infoResp.status = STATUS_COMPLETE;
3929 wfaEncodeTLV(WFA_STA_EXEC_ACTION_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3930 respBuf);
3931 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
3932
3933 return WFA_SUCCESS;
Dake Zhaocda4a1d2015-06-11 10:14:15 -07003934}
3935
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003936int wfaStaInvokeCommand(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3937 dutCmdResponse_t infoResp;
3938 caStaInvokeCmd_t* staInvokeCmd =
3939 (caStaInvokeCmd_t*)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07003940
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003941 printf("\n Entry wfaStaInvokeCommand... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003942
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003943 // based on the command type , invoke API or complete the required procedures
3944 // return the defined parameters based on the command that is received ( example response below)
Dake Zhao655efed2015-03-11 17:39:13 -07003945
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003946 if (staInvokeCmd->cmdType == ePrimitiveCmdType &&
3947 staInvokeCmd->InvokeCmds.primtiveType.PrimType == eCmdPrimTypeAdvt) {
3948 infoResp.cmdru.staInvokeCmd.invokeCmdRspType = eCmdPrimTypeAdvt;
3949 infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.numServInfo = 1;
3950 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.servAdvInfo[0]
3951 .servName,
3952 "org.wi-fi.wfds.send.rx");
3953 infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.servAdvInfo[0].advtID =
3954 0x0000f;
3955 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.servAdvInfo[0]
3956 .serviceMac,
3957 "ab:cd:ef:gh:ij:kl");
3958 } else if (staInvokeCmd->cmdType == ePrimitiveCmdType &&
3959 staInvokeCmd->InvokeCmds.primtiveType.PrimType ==
3960 eCmdPrimTypeSeek) {
3961 infoResp.cmdru.staInvokeCmd.invokeCmdRspType = eCmdPrimTypeSeek;
3962 infoResp.cmdru.staInvokeCmd.invokeCmdResp.seekRsp.searchID = 0x000ff;
3963 } else if (staInvokeCmd->cmdType == ePrimitiveCmdType &&
3964 staInvokeCmd->InvokeCmds.primtiveType.PrimType ==
3965 eCmdPrimTypeConnSession) {
3966 infoResp.cmdru.staInvokeCmd.invokeCmdRspType = eCmdPrimTypeConnSession;
3967 infoResp.cmdru.staInvokeCmd.invokeCmdResp.connSessResp.sessionID = 0x000ff;
3968 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.connSessResp.result, "GO");
3969 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.connSessResp.grpId,
3970 "DIRECT-AB WFADUT");
3971 }
3972 infoResp.status = STATUS_COMPLETE;
3973 wfaEncodeTLV(WFA_STA_INVOKE_CMD_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3974 respBuf);
3975 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao655efed2015-03-11 17:39:13 -07003976
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003977 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07003978}
3979
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003980int wfaStaManageService(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3981 dutCmdResponse_t infoResp;
3982 //caStaMngServ_t *staMngServ = (caStaMngServ_t *)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07003983
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003984 printf("\n Entry wfaStaManageService... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003985
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003986 // based on the manage service type , invoke API's or complete the required procedures
3987 // return the defined parameters based on the command that is received ( example response below)
3988 strcpy(infoResp.cmdru.staManageServ.result, "CLIENT");
3989 strcpy(infoResp.cmdru.staManageServ.grpId, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
3990 infoResp.cmdru.staManageServ.sessionID = 0x000ff;
Dake Zhao655efed2015-03-11 17:39:13 -07003991
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003992 infoResp.status = STATUS_COMPLETE;
3993 wfaEncodeTLV(WFA_STA_MANAGE_SERVICE_RESP_TLV, sizeof(infoResp),
3994 (BYTE*)&infoResp, respBuf);
3995 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao655efed2015-03-11 17:39:13 -07003996
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003997 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07003998}
3999
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004000int wfaStaGetEvents(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
4001 dutCmdResponse_t infoResp;
4002 caStaGetEvents_t* staGetEvents =
4003 (caStaGetEvents_t*)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07004004
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004005 printf("\n Entry wfaStaGetEvents... ");
Dake Zhao655efed2015-03-11 17:39:13 -07004006
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004007 if (staGetEvents->program == PROG_TYPE_NAN) {
4008 // Get all the events from the Log file or stored events
4009 // return the received/recorded event details - eventName, remoteInstanceID, localInstanceID, mac
4010 }
Dake Zhao655efed2015-03-11 17:39:13 -07004011
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004012 // Get all the event from the Log file or stored events
4013 // return the received/recorded events as space seperated list ( example response below)
4014 strcpy(infoResp.cmdru.staGetEvents.result,
4015 "SearchResult SearchTerminated AdvertiseStatus SessionRequest "
4016 "ConnectStatus SessionStatus PortStatus");
4017
4018 infoResp.status = STATUS_COMPLETE;
4019 wfaEncodeTLV(WFA_STA_GET_EVENTS_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
4020 respBuf);
4021 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
4022
4023 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07004024}
4025
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004026int wfaStaGetEventDetails(int len,
4027 BYTE* caCmdBuf,
4028 int* respLen,
4029 BYTE* respBuf) {
4030 dutCmdResponse_t infoResp;
4031 caStaGetEventDetails_t* getStaGetEventDetails =
4032 (caStaGetEventDetails_t*)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07004033
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004034 printf("\n Entry wfaStaGetEventDetails... ");
Dake Zhao655efed2015-03-11 17:39:13 -07004035
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004036 // based on the Requested Event type
4037 // return the latest corresponding evnet detailed parameters ( example response below)
Dake Zhao655efed2015-03-11 17:39:13 -07004038
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004039 if (getStaGetEventDetails->eventId == eSearchResult) {
4040 // fetch from log file or event history for the search result event and return the parameters
4041 infoResp.cmdru.staGetEventDetails.eventID = eSearchResult;
Dake Zhao655efed2015-03-11 17:39:13 -07004042
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004043 infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult.searchID =
4044 0x00abcd;
4045 strcpy(infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult
4046 .serviceMac,
4047 "ab:cd:ef:gh:ij:kl");
4048 infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult.advID =
4049 0x00dcba;
4050 strcpy(infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult
4051 .serviceName,
4052 "org.wi-fi.wfds.send.rx");
Dake Zhao655efed2015-03-11 17:39:13 -07004053
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004054 infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult
4055 .serviceStatus = eServiceAvilable;
4056 } else if (
4057 getStaGetEventDetails->eventId ==
4058 eSearchTerminated) { // fetch from log file or event history for the search terminated event and return the parameters
4059 infoResp.cmdru.staGetEventDetails.eventID = eSearchTerminated;
4060 infoResp.cmdru.staGetEventDetails.getEventDetails.searchTerminated
4061 .searchID = 0x00abcd;
4062 } else if (
4063 getStaGetEventDetails->eventId ==
4064 eAdvertiseStatus) { // fetch from log file or event history for the Advertise Status event and return the parameters
4065 infoResp.cmdru.staGetEventDetails.eventID = eAdvertiseStatus;
4066 infoResp.cmdru.staGetEventDetails.getEventDetails.advStatus.advID =
4067 0x00dcba;
Dake Zhao655efed2015-03-11 17:39:13 -07004068
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004069 infoResp.cmdru.staGetEventDetails.getEventDetails.advStatus.status =
4070 eAdvertised;
4071 } else if (
4072 getStaGetEventDetails->eventId ==
4073 eSessionRequest) { // fetch from log file or event history for the session request event and return the parameters
4074 infoResp.cmdru.staGetEventDetails.eventID = eSessionRequest;
4075 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionReq.advID =
4076 0x00dcba;
4077 strcpy(
4078 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionReq.sessionMac,
4079 "ab:cd:ef:gh:ij:kl");
4080 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionReq.sessionID =
4081 0x00baba;
4082 } else if (
4083 getStaGetEventDetails->eventId ==
4084 eSessionStatus) { // fetch from log file or event history for the session status event and return the parameters
4085 infoResp.cmdru.staGetEventDetails.eventID = eSessionStatus;
4086 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionStatus.sessionID =
4087 0x00baba;
4088 strcpy(infoResp.cmdru.staGetEventDetails.getEventDetails.sessionStatus
4089 .sessionMac,
4090 "ab:cd:ef:gh:ij:kl");
4091 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionStatus.state =
4092 eSessionStateOpen;
4093 } else if (getStaGetEventDetails->eventId == eConnectStatus) {
4094 infoResp.cmdru.staGetEventDetails.eventID = eConnectStatus;
4095 infoResp.cmdru.staGetEventDetails.getEventDetails.connStatus.sessionID =
4096 0x00baba;
4097 strcpy(
4098 infoResp.cmdru.staGetEventDetails.getEventDetails.connStatus.sessionMac,
4099 "ab:cd:ef:gh:ij:kl");
4100 infoResp.cmdru.staGetEventDetails.getEventDetails.connStatus.status =
4101 eGroupFormationComplete;
Dake Zhao655efed2015-03-11 17:39:13 -07004102
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004103 } else if (getStaGetEventDetails->eventId == ePortStatus) {
4104 infoResp.cmdru.staGetEventDetails.eventID = ePortStatus;
4105 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.sessionID =
4106 0x00baba;
4107 strcpy(
4108 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.sessionMac,
4109 "ab:cd:ef:gh:ij:kl");
4110 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.port = 1009;
4111 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.status =
4112 eLocalPortAllowed;
4113 }
Dake Zhao655efed2015-03-11 17:39:13 -07004114
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004115 infoResp.status = STATUS_COMPLETE;
4116 wfaEncodeTLV(WFA_STA_GET_EVENT_DETAILS_RESP_TLV, sizeof(infoResp),
4117 (BYTE*)&infoResp, respBuf);
4118 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao655efed2015-03-11 17:39:13 -07004119
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004120 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07004121}