blob: 9f946aa53c60dad0ac248f8146cb2a8c86f41efc [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
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +080084FILE* e2efp = NULL;
85int chk_ret_status() {
86 char* ret = getenv(WFA_RET_ENV);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000087
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +080088 if (*ret == '1')
89 return WFA_SUCCESS;
90 else
91 return WFA_FAILURE;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +000092}
93
Wojciech Jakobczyk249c1a02020-08-27 12:38:28 +020094static int systemWithLog(char* command) {
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +080095 DPRINT_INFO(WFA_OUT, "exec: %s\n", command);
96 int ret = system(command);
97 if (ret != 0) {
98 DPRINT_INFO(WFA_OUT, "exit code %d\n", ret);
99 }
100 return ret;
Wojciech Jakobczyk249c1a02020-08-27 12:38:28 +0200101}
102
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200103// Read a line from a file.
104// It reads at most bufSize-1 bytes to buf.
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800105bool readLine(const char* filename, char* buf, const int bufSize) {
106 FILE* fp = NULL;
107 fp = fopen(filename, "r+");
108 if (fp == NULL) {
109 return false;
110 }
111 char* ret = fgets(buf, bufSize, fp);
112 fclose(fp);
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200113
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800114 if (ret == NULL) {
115 return false;
116 }
117
118 if (buf[strlen(buf) - 1] == '\n') {
119 buf[strlen(buf) - 1] = 0;
120 }
121 return true;
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200122}
Wojciech Jakobczyk249c1a02020-08-27 12:38:28 +0200123
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000124/*
125 * agtCmdProcGetVersion(): response "ca_get_version" command to controller
126 * input: cmd --- not used
127 * valLen -- not used
128 * output: parms -- a buffer to store the version info response.
129 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800130int agtCmdProcGetVersion(int len, BYTE* parms, int* respLen, BYTE* respBuf) {
131 dutCmdResponse_t* getverResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000132
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800133 DPRINT_INFO(WFA_OUT, "entering agtCmdProcGetVersion ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000134
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800135 getverResp->status = STATUS_COMPLETE;
136 wSTRNCPY(getverResp->cmdru.version, WFA_SYSTEM_VER, WFA_VERNAM_LEN);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000137
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800138 wfaEncodeTLV(WFA_GET_VERSION_RESP_TLV, sizeof(dutCmdResponse_t),
139 (BYTE*)getverResp, respBuf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000140
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800141 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000142
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800143 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000144}
145
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800146#define RETURN_STA_ASSOCIATE_ERROR(statusCode, ...) \
147 staAssocResp->status = statusCode; \
148 wfaEncodeTLV(WFA_STA_ASSOCIATE_RESP_TLV, sizeof(staAssocResp->status), \
149 (BYTE*)staAssocResp, respBuf); \
150 *respLen = WFA_TLV_HDR_LEN + sizeof(staAssocResp->status); \
151 DPRINT_ERR(WFA_ERR, __VA_ARGS__); \
152 return WFA_FAILURE;
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200153
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000154/*
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) {
170 RETURN_STA_ASSOCIATE_ERROR(STATUS_INVALID,
171 "unsupported command parameter\n");
172 }
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) {
183 RETURN_STA_ASSOCIATE_ERROR(
184 STATUS_ERROR, "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))) {
188 RETURN_STA_ASSOCIATE_ERROR(
189 STATUS_ERROR,
190 "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) {
195 RETURN_STA_ASSOCIATE_ERROR(STATUS_ERROR, "network not configured\n");
196 } else {
197 // enable the network and disable all others
198 sprintf(gCmdStr, "wpa_cli.sh -i %s select_network %d > %s", ifname,
199 networkid, tmpfile);
200 sret = systemWithLog(gCmdStr);
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200201 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800202 } else {
203 // reassociate to current connected network
204 sprintf(gCmdStr, "wpa_cli.sh -i%s reassociate > %s", ifname, tmpfile);
205 sret = systemWithLog(gCmdStr);
206 }
Wojciech Jakobczyk1084b012020-08-27 14:59:58 +0200207
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800208 // check wpa_cli response
209 if (!readLine(tmpfile, cmdResult, sizeof(cmdResult))) {
210 RETURN_STA_ASSOCIATE_ERROR(STATUS_ERROR, "unable to read command output\n");
211 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000212
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800213 if (strcmp(cmdResult, "OK") != 0) {
214 RETURN_STA_ASSOCIATE_ERROR(
215 STATUS_ERROR, "associate network failed, error: %s\n", cmdResult);
216 }
217
218 staAssocResp->status = STATUS_COMPLETE;
219 wfaEncodeTLV(WFA_STA_ASSOCIATE_RESP_TLV, 4, (BYTE*)staAssocResp, respBuf);
220 *respLen = WFA_TLV_HDR_LEN + 4;
221
222 return WFA_SUCCESS;
Dake Zhao0a832172015-01-06 11:08:47 -0800223}
224
225/*
226 * wfaStaReAssociate():
227 * The function is to force the station wireless I/F to re/associate
228 * with the AP.
229 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800230int wfaStaReAssociate(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
231 dutCommand_t* assoc = (dutCommand_t*)caCmdBuf;
232 char* ifname = assoc->intf;
233 dutCmdResponse_t* staAssocResp = &gGenericResp;
Dake Zhao0a832172015-01-06 11:08:47 -0800234
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800235 DPRINT_INFO(WFA_OUT, "entering wfaStaAssociate ...\n");
236 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800237 * if bssid appears, station should associate with the specific
238 * BSSID AP at its initial association.
239 * If it is different to the current associating AP, it will be forced to
240 * roam the new AP
241 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800242 if (assoc->cmdsu.assoc.bssid[0] != '\0') {
243 /* if (the first association) */
244 /* just do initial association to the BSSID */
Dake Zhao0a832172015-01-06 11:08:47 -0800245
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800246 /* else (station already associate to an AP) */
247 /* Do forced roaming */
Dake Zhao0a832172015-01-06 11:08:47 -0800248
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800249 } else {
250 /* use 'ifconfig' command to bring down the interface (linux specific) */
251 sprintf(gCmdStr, "ifconfig %s down", ifname);
252 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -0800253
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800254 /* use 'ifconfig' command to bring up the interface (linux specific) */
255 sprintf(gCmdStr, "ifconfig %s up", ifname);
Dake Zhao0a832172015-01-06 11:08:47 -0800256
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800257 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800258 * use 'wpa_cli' command to force a 802.11 re/associate
259 * (wpa_supplicant specific)
260 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800261 sprintf(gCmdStr, "wpa_cli.sh -i%s reassociate", ifname);
262 sret = systemWithLog(gCmdStr);
263 }
Dake Zhao0a832172015-01-06 11:08:47 -0800264
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800265 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800266 * Then report back to control PC for completion.
267 * This does not have failed/error status. The result only tells
268 * a completion.
269 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800270 staAssocResp->status = STATUS_COMPLETE;
271 wfaEncodeTLV(WFA_STA_ASSOCIATE_RESP_TLV, 4, (BYTE*)staAssocResp, respBuf);
272 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -0800273
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800274 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000275}
276
277/*
278 * wfaStaIsConnected():
Dake Zhao0a832172015-01-06 11:08:47 -0800279 * The function is to check whether the station's wireless I/F has
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000280 * already connected to an AP.
281 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800282int wfaStaIsConnected(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
283 dutCommand_t* connStat = (dutCommand_t*)caCmdBuf;
284 dutCmdResponse_t* staConnectResp = &gGenericResp;
285 char* ifname = connStat->intf;
286 FILE* tmpfile = NULL;
287 char result[32];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000288
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800289 DPRINT_INFO(WFA_OUT, "Entering isConnected ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000290
291#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800292 sprintf(gCmdStr, "wfa_chkconnect %s\n", ifname);
293 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000294
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800295 if (chk_ret_status() == WFA_SUCCESS)
296 staConnectResp->cmdru.connected = 1;
297 else
298 staConnectResp->cmdru.connected = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000299#else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800300 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800301 * use 'wpa_cli' command to check the interface status
302 * none, scanning or complete (wpa_supplicant specific)
303 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800304 sprintf(gCmdStr,
305 "wpa_cli.sh -i%s status | grep ^wpa_state= | cut -f2- -d= > "
306 "/tmp/.isConnected",
307 ifname);
308 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000309
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800310 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800311 * the status is saved in a file. Open the file and check it.
312 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800313 tmpfile = fopen("/tmp/.isConnected", "r+");
314 if (tmpfile == NULL) {
315 staConnectResp->status = STATUS_ERROR;
316 wfaEncodeTLV(WFA_STA_IS_CONNECTED_RESP_TLV, 4, (BYTE*)staConnectResp,
317 respBuf);
318 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000319
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800320 DPRINT_ERR(WFA_ERR, "file open failed\n");
321 return WFA_FAILURE;
322 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000323
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800324 sret = fscanf(tmpfile, "%s", (char*)result);
325 fclose(tmpfile);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000326
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800327 if (strncmp(result, "COMPLETED", 9) == 0)
328 staConnectResp->cmdru.connected = 1;
329 else
330 staConnectResp->cmdru.connected = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000331#endif
332
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800333 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800334 * Report back the status: Complete or Failed.
335 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800336 staConnectResp->status = STATUS_COMPLETE;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000337
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800338 wfaEncodeTLV(WFA_STA_IS_CONNECTED_RESP_TLV, sizeof(dutCmdResponse_t),
339 (BYTE*)staConnectResp, respBuf);
340 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -0800341
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800342 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000343}
344
345/*
346 * wfaStaGetIpConfig():
347 * This function is to retriev the ip info including
348 * 1. dhcp enable
349 * 2. ip address
Dake Zhao0a832172015-01-06 11:08:47 -0800350 * 3. mask
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000351 * 4. primary-dns
352 * 5. secondary-dns
353 *
354 * The current implementation is to use a script to find these information
Dake Zhao0a832172015-01-06 11:08:47 -0800355 * and store them in a file.
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000356 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800357int wfaStaGetIpConfig(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
358 int slen, i = 0;
359 dutCommand_t* getIpConf = (dutCommand_t*)caCmdBuf;
360 dutCmdResponse_t* ipconfigResp = &gGenericResp;
361 char* ifname = getIpConf->intf;
362 caStaGetIpConfigResp_t* ifinfo = &ipconfigResp->cmdru.getIfconfig;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000363
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800364 FILE* tmpfd;
365 char string[256];
366 char* str;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000367
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800368 strcpy(ifinfo->dns[0], "0");
369 strcpy(ifinfo->dns[1], "0");
Dake Zhao0a832172015-01-06 11:08:47 -0800370
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800371 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800372 * Run the script file "getipconfig.sh" to check the ip status
373 * (current implementation specific).
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000374 * note: "getipconfig.sh" is only defined for the current implementation
Wojciech Jakobczyk71542532020-08-28 10:52:00 +0200375 *
376 * Example output:
377 * dhcpcli=/sbin/dhcpcd
378 *
379 * mac=50:e0:85:5f:e9:93
380 * ipaddr=192.168.0.116
381 * bcast=192.168.0.255
382 * mask=255.255.255.0
383 * nameserver 192.168.0.1
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000384 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800385 sprintf(gCmdStr, "getipconfig.sh /tmp/ipconfig.txt %s\n", ifname);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000386
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800387 sret = systemWithLog(gCmdStr);
388 if (sret != 0) {
389 ipconfigResp->status = STATUS_ERROR;
390 wfaEncodeTLV(WFA_STA_GET_IP_CONFIG_RESP_TLV, 4, (BYTE*)ipconfigResp,
391 respBuf);
392 *respLen = WFA_TLV_HDR_LEN + 4;
Wojciech Jakobczyk71542532020-08-28 10:52:00 +0200393
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800394 DPRINT_ERR(WFA_ERR, "error from getipconfig exec: %d\n", sret);
395 return WFA_FAILURE;
396 }
397
398 /* open the output result and scan/retrieve the info */
399 tmpfd = fopen("/tmp/ipconfig.txt", "r+");
400
401 if (tmpfd == NULL) {
402 ipconfigResp->status = STATUS_ERROR;
403 wfaEncodeTLV(WFA_STA_GET_IP_CONFIG_RESP_TLV, 4, (BYTE*)ipconfigResp,
404 respBuf);
405 *respLen = WFA_TLV_HDR_LEN + 4;
406
407 DPRINT_ERR(WFA_ERR, "file open failed\n");
408 return WFA_FAILURE;
409 }
410
411 for (;;) {
412 if (fgets(string, 256, tmpfd) == NULL)
413 break;
414
415 /* check dhcp enabled */
416 if (strncmp(string, "dhcpcli", 7) == 0) {
417 str = strtok(string, "=");
418 str = strtok(NULL, "=");
419 if (str != NULL)
420 ifinfo->isDhcp = 1;
421 else
422 ifinfo->isDhcp = 0;
Wojciech Jakobczyk71542532020-08-28 10:52:00 +0200423 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000424
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800425 if (strncmp(string, "ipaddr", 6) == 0) {
426 str = strchr(string, '=');
427 if (str != NULL) {
428 strcpy(ifinfo->ipaddr, str + 1);
429 slen = strlen(ifinfo->ipaddr);
430 ifinfo->ipaddr[slen - 1] = '\0';
431 } else
432 strcpy(ifinfo->ipaddr, "none");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000433 }
434
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800435 /* check the mask */
436 if (strncmp(string, "mask", 4) == 0) {
437 str = strchr(string, '=');
438 if (str != NULL) {
439 strcpy(ifinfo->mask, str + 1);
440 slen = strlen(ifinfo->mask);
441 ifinfo->mask[slen - 1] = '\0';
442 } else
443 strcpy(ifinfo->mask, "none");
Dake Zhao0a832172015-01-06 11:08:47 -0800444 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000445
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800446 /* find out the dns server ip address */
447 if (strncmp(string, "nameserv", 8) == 0) {
448 str = strchr(string, ' ');
449 if (str != NULL && i < 2) {
450 strcpy(ifinfo->dns[i], str + 1);
451 slen = strlen(ifinfo->dns[i]);
452 ifinfo->dns[i][slen - 1] = '\0';
453 } else
454 strcpy(ifinfo->dns[i], "none");
455
456 i++;
457 }
458 }
459
460 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800461 * Report back the results
462 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800463 ipconfigResp->status = STATUS_COMPLETE;
464 wfaEncodeTLV(WFA_STA_GET_IP_CONFIG_RESP_TLV, sizeof(dutCmdResponse_t),
465 (BYTE*)ipconfigResp, respBuf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000466
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800467 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000468
469#if 0
Dake Zhao0a832172015-01-06 11:08:47 -0800470 DPRINT_INFO(WFA_OUT, "%i %i %s %s %s %s %i\n", ipconfigResp->status,
471 ifinfo->isDhcp, ifinfo->ipaddr, ifinfo->mask,
472 ifinfo->dns[0], ifinfo->dns[1], *respLen);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000473#endif
474
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800475 fclose(tmpfd);
476 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000477}
478
479/*
480 * wfaStaSetIpConfig():
481 * The function is to set the ip configuration to a wireless I/F.
482 * 1. IP address
483 * 2. Mac address
484 * 3. default gateway
Dake Zhao0a832172015-01-06 11:08:47 -0800485 * 4. dns nameserver (pri and sec).
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000486 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800487int wfaStaSetIpConfig(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
488 dutCommand_t* setIpConf = (dutCommand_t*)caCmdBuf;
489 caStaSetIpConfig_t* ipconfig = &setIpConf->cmdsu.ipconfig;
490 dutCmdResponse_t* staSetIpResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000491
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800492 DPRINT_INFO(WFA_OUT, "entering wfaStaSetIpConfig ...\n");
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200493
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800494 if (ipconfig->isDhcp) {
495 DPRINT_INFO(WFA_OUT, "error: dhcp not supported\n");
496 staSetIpResp->status = STATUS_INVALID;
497 wfaEncodeTLV(WFA_STA_SET_IP_CONFIG_RESP_TLV, 4, (BYTE*)staSetIpResp,
498 respBuf);
499 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000500
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800501 return WFA_FAILURE;
502 }
503
504 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800505 * Use command 'ifconfig' to configure the interface ip address, mask.
506 * (Linux specific).
507 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800508 sprintf(gCmdStr, "ifconfig %s %s netmask %s >/tmp/ifconfig.log 2>&1",
509 ipconfig->intf, ipconfig->ipaddr, ipconfig->mask);
510 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
511 sret = systemWithLog(gCmdStr);
512 if (sret != 0) {
513 DPRINT_INFO(WFA_OUT, "exit code %d\n", sret);
514 }
515
516 /* use command 'route add' to set set gatewway (linux specific) */
517 if (ipconfig->defGateway[0] != '\0') {
518 sprintf(gCmdStr, "route add default gw %s >/tmp/route.log 2>&1",
519 ipconfig->defGateway);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200520 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +0200521 sret = systemWithLog(gCmdStr);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200522 if (sret != 0) {
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800523 DPRINT_INFO(WFA_OUT, "exit code %d\n", sret);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200524 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800525 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000526
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800527 /* set dns (linux specific) */
528 sprintf(gCmdStr, "cp /etc/resolv.conf /tmp/resolv.conf.bk");
529 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
530 sret = systemWithLog(gCmdStr);
531 if (sret != 0) {
532 DPRINT_INFO(WFA_OUT, "exit code %d backing up resolv.conf\n", sret);
533 }
534 sprintf(gCmdStr, "echo nameserv %s > /etc/resolv.conf", ipconfig->pri_dns);
535 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
536 sret = systemWithLog(gCmdStr);
537 if (sret != 0) {
538 DPRINT_INFO(WFA_OUT, "exit code %d writing resolv.conf\n", sret);
539 }
540 if (strlen(ipconfig->sec_dns) > 0) {
541 sprintf(gCmdStr, "echo nameserv %s >> /etc/resolv.conf", ipconfig->sec_dns);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200542 DPRINT_INFO(WFA_OUT, "exec: %s\n", gCmdStr);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +0200543 sret = systemWithLog(gCmdStr);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200544 if (sret != 0) {
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800545 DPRINT_INFO(WFA_OUT, "exit code %d writing resolv.conf\n", sret);
Wojciech Jakobczykfc3b0112020-08-26 11:30:55 +0200546 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800547 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000548
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800549 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800550 * report status
551 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800552 staSetIpResp->status = STATUS_COMPLETE;
553 wfaEncodeTLV(WFA_STA_SET_IP_CONFIG_RESP_TLV, 4, (BYTE*)staSetIpResp, respBuf);
554 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000555
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800556 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000557}
558
559/*
560 * wfaStaVerifyIpConnection():
561 * The function is to verify if the station has IP connection with an AP by
562 * send ICMP/pings to the AP.
Dake Zhao0a832172015-01-06 11:08:47 -0800563 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800564int wfaStaVerifyIpConnection(int len,
565 BYTE* caCmdBuf,
566 int* respLen,
567 BYTE* respBuf) {
568 dutCommand_t* verip = (dutCommand_t*)caCmdBuf;
569 dutCmdResponse_t* verifyIpResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000570
571#ifndef WFA_PING_UDP_ECHO_ONLY
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800572 char strout[64], *pcnt;
573 FILE* tmpfile;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000574
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800575 DPRINT_INFO(WFA_OUT, "Entering wfaStaVerifyIpConnection ...\n");
Dake Zhao0a832172015-01-06 11:08:47 -0800576
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800577 /* set timeout value in case not set */
578 if (verip->cmdsu.verifyIp.timeout <= 0) {
579 verip->cmdsu.verifyIp.timeout = 10;
580 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000581
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800582 /* execute the ping command and pipe the result to a tmp file */
583 sprintf(gCmdStr,
584 "ping %s -c 3 -W %u | grep loss | cut -f3 -d, 1>& /tmp/pingout.txt",
585 verip->cmdsu.verifyIp.dipaddr, verip->cmdsu.verifyIp.timeout);
586 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000587
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800588 /* scan/check the output */
589 tmpfile = fopen("/tmp/pingout.txt", "r+");
590 if (tmpfile == NULL) {
591 verifyIpResp->status = STATUS_ERROR;
592 wfaEncodeTLV(WFA_STA_VERIFY_IP_CONNECTION_RESP_TLV, 4, (BYTE*)verifyIpResp,
593 respBuf);
594 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000595
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800596 DPRINT_ERR(WFA_ERR, "file open failed\n");
597 return WFA_FAILURE;
598 }
Dake Zhao0a832172015-01-06 11:08:47 -0800599
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800600 verifyIpResp->status = STATUS_COMPLETE;
601 if (fscanf(tmpfile, "%s", strout) == EOF)
Dake Zhao0a832172015-01-06 11:08:47 -0800602 verifyIpResp->cmdru.connected = 0;
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800603 else {
604 pcnt = strtok(strout, "%");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000605
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800606 /* if the loss rate is 100%, not able to connect */
607 if (atoi(pcnt) == 100)
608 verifyIpResp->cmdru.connected = 0;
609 else
610 verifyIpResp->cmdru.connected = 1;
611 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000612
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800613 fclose(tmpfile);
614#else
615 int btSockfd;
616 struct pollfd fds[2];
617 int timeout = 2000;
618 char anyBuf[64];
619 struct sockaddr_in toAddr;
620 int done = 1, cnt = 0, ret, nbytes;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000621
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800622 verifyIpResp->status = STATUS_COMPLETE;
623 verifyIpResp->cmdru.connected = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000624
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800625 btSockfd = wfaCreateUDPSock("127.0.0.1", WFA_UDP_ECHO_PORT);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000626
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800627 if (btSockfd == -1) {
628 verifyIpResp->status = STATUS_ERROR;
629 wfaEncodeTLV(WFA_STA_VERIFY_IP_CONNECTION_RESP_TLV, 4, (BYTE*)verifyIpResp,
630 respBuf);
631 *respLen = WFA_TLV_HDR_LEN + 4;
632 return WFA_FAILURE;
633 ;
634 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000635
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800636 toAddr.sin_family = AF_INET;
637 toAddr.sin_addr.s_addr = inet_addr(verip->cmdsu.verifyIp.dipaddr);
638 toAddr.sin_port = htons(WFA_UDP_ECHO_PORT);
639
640 while (done) {
641 wfaTrafficSendTo(btSockfd, (char*)anyBuf, 64, (struct sockaddr*)&toAddr);
642 cnt++;
643
644 fds[0].fd = btSockfd;
645 fds[0].events = POLLIN | POLLOUT;
646
647 ret = poll(fds, 1, timeout);
648 switch (ret) {
649 case 0:
650 /* it is time out, count a packet lost*/
651 break;
652 case -1:
653 /* it is an error */
654 default: {
655 switch (fds[0].revents) {
656 case POLLIN:
657 case POLLPRI:
658 case POLLOUT:
659 nbytes = wfaTrafficRecv(btSockfd, (char*)anyBuf,
660 (struct sockaddr*)&toAddr);
661 if (nbytes != 0)
662 verifyIpResp->cmdru.connected = 1;
Dake Zhao0a832172015-01-06 11:08:47 -0800663 done = 0;
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800664 break;
665 default:
666 /* errors but not care */
667 ;
Dake Zhao0a832172015-01-06 11:08:47 -0800668 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800669 }
Dake Zhao0a832172015-01-06 11:08:47 -0800670 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800671 if (cnt == 3) {
672 done = 0;
673 }
674 }
Dake Zhao0a832172015-01-06 11:08:47 -0800675
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000676#endif
677
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800678 wfaEncodeTLV(WFA_STA_VERIFY_IP_CONNECTION_RESP_TLV, sizeof(dutCmdResponse_t),
679 (BYTE*)verifyIpResp, respBuf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000680
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800681 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -0800682
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800683 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000684}
685
686/*
687 * wfaStaGetMacAddress()
688 * This function is to retrieve the MAC address of a wireless I/F.
689 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800690int wfaStaGetMacAddress(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
691 dutCommand_t* getMac = (dutCommand_t*)caCmdBuf;
692 dutCmdResponse_t* getmacResp = &gGenericResp;
693 char* str;
694 char* ifname = getMac->intf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000695
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800696 FILE* tmpfd;
697 char string[257];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000698
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800699 DPRINT_INFO(WFA_OUT, "Entering wfaStaGetMacAddress ...\n");
700 /*
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000701 * run the script "getipconfig.sh" to find out the mac
702 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800703 sprintf(gCmdStr, "ifconfig %s > /tmp/ipconfig.txt ", ifname);
704 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000705
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800706 tmpfd = fopen("/tmp/ipconfig.txt", "r+");
707 if (tmpfd == NULL) {
708 getmacResp->status = STATUS_ERROR;
709 wfaEncodeTLV(WFA_STA_GET_MAC_ADDRESS_RESP_TLV, 4, (BYTE*)getmacResp,
710 respBuf);
711 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000712
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800713 DPRINT_ERR(WFA_ERR, "file open failed\n");
714 return WFA_FAILURE;
715 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000716
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800717 if (fgets((char*)&string[0], 256, tmpfd) == NULL) {
718 getmacResp->status = STATUS_ERROR;
719 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -0800720
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800721 str = strtok(string, " ");
722 while (str && ((strcmp(str, "HWaddr")) != 0)) {
723 str = strtok(NULL, " ");
724 }
Dake Zhao0a832172015-01-06 11:08:47 -0800725
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800726 /* get mac */
727 if (str) {
728 str = strtok(NULL, " ");
729 strcpy(getmacResp->cmdru.mac, str);
730 getmacResp->status = STATUS_COMPLETE;
731 }
Dake Zhao0a832172015-01-06 11:08:47 -0800732
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800733 wfaEncodeTLV(WFA_STA_GET_MAC_ADDRESS_RESP_TLV, sizeof(dutCmdResponse_t),
734 (BYTE*)getmacResp, respBuf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000735
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800736 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000737
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800738 fclose(tmpfd);
739 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000740}
741
742/*
743 * wfaStaGetStats():
Dake Zhao0a832172015-01-06 11:08:47 -0800744 * The function is to retrieve the statistics of the I/F's layer 2 txFrames,
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000745 * rxFrames, txMulticast, rxMulticast, fcsErrors/crc, and txRetries.
Dake Zhao0a832172015-01-06 11:08:47 -0800746 * Currently there is not definition how to use these info.
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000747 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800748int wfaStaGetStats(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
749 dutCmdResponse_t* statsResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000750
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800751 /* this is never used, you can skip this call */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000752
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800753 statsResp->status = STATUS_ERROR;
754 wfaEncodeTLV(WFA_STA_GET_STATS_RESP_TLV, sizeof(dutCmdResponse_t),
755 (BYTE*)statsResp, respBuf);
756 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000757
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800758 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000759}
760
761/*
762 * wfaSetEncryption():
763 * The function is to set the wireless interface with WEP or none.
764 *
Dake Zhao0a832172015-01-06 11:08:47 -0800765 * Since WEP is optional test, current function is only used for
766 * resetting the Security to NONE/Plaintext (OPEN). To test WEP,
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000767 * this function should be replaced by the next one (wfaSetEncryption1())
768 *
Dake Zhao0a832172015-01-06 11:08:47 -0800769 * Input parameters:
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000770 * 1. I/F
771 * 2. ssid
772 * 3. encpType - wep or none
773 * Optional:
774 * 4. key1
775 * 5. key2
776 * 6. key3
777 * 7. key4
778 * 8. activeKey Index
779 */
780
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800781int wfaSetEncryption1(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
782 caStaSetEncryption_t* setEncryp = (caStaSetEncryption_t*)caCmdBuf;
783 dutCmdResponse_t* setEncrypResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000784
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800785 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800786 * disable the network first
787 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800788 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", setEncryp->intf);
789 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000790
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800791 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800792 * set SSID
793 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800794 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'",
795 setEncryp->intf, setEncryp->ssid);
796 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000797
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800798 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800799 * Tell the supplicant for infrastructure mode (1)
800 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800801 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 mode 0", setEncryp->intf);
802 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000803
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800804 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800805 * set Key management to NONE (NO WPA) for plaintext or WEP
806 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800807 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt NONE",
808 setEncryp->intf);
809 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000810
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800811 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setEncryp->intf);
812 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000813
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800814 setEncrypResp->status = STATUS_COMPLETE;
815 wfaEncodeTLV(WFA_STA_SET_ENCRYPTION_RESP_TLV, 4, (BYTE*)setEncrypResp,
816 respBuf);
817 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -0800818
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800819 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000820}
821
822/*
823 * Since WEP is optional, this function could be used to replace
Dake Zhao0a832172015-01-06 11:08:47 -0800824 * wfaSetEncryption() if necessary.
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000825 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800826int wfaSetEncryption(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
827 caStaSetEncryption_t* setEncryp = (caStaSetEncryption_t*)caCmdBuf;
828 dutCmdResponse_t* setEncrypResp = &gGenericResp;
829 int i;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000830
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800831 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800832 * disable the network first
833 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800834 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", setEncryp->intf);
835 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000836
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800837 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800838 * set SSID
839 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800840 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'",
841 setEncryp->intf, setEncryp->ssid);
842 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000843
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800844 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800845 * Tell the supplicant for infrastructure mode (1)
846 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800847 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 mode 0", setEncryp->intf);
848 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000849
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800850 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800851 * set Key management to NONE (NO WPA) for plaintext or WEP
852 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800853 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt NONE",
854 setEncryp->intf);
855 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000856
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800857 /* set keys */
858 if (setEncryp->encpType == 1) {
859 for (i = 0; i < 4; i++) {
860 if (setEncryp->keys[i][0] != '\0') {
861 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_key%i %s",
862 setEncryp->intf, i, setEncryp->keys[i]);
863 systemWithLog(gCmdStr);
864 }
Dake Zhao0a832172015-01-06 11:08:47 -0800865 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000866
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800867 /* set active key */
868 i = setEncryp->activeKeyIdx;
869 if (setEncryp->keys[i][0] != '\0') {
870 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_tx_keyidx %i",
871 setEncryp->intf, setEncryp->activeKeyIdx);
872 systemWithLog(gCmdStr);
873 }
874 } else /* clearly remove the keys -- reported by p.schwann */
875 {
876 for (i = 0; i < 4; i++) {
877 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_key%i \"\"",
878 setEncryp->intf, i);
879 systemWithLog(gCmdStr);
880 }
881 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000882
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800883 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setEncryp->intf);
884 systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -0800885
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800886 setEncrypResp->status = STATUS_COMPLETE;
887 wfaEncodeTLV(WFA_STA_SET_ENCRYPTION_RESP_TLV, sizeof(setEncrypResp->status),
888 (BYTE*)setEncrypResp, respBuf);
889 *respLen = WFA_TLV_HDR_LEN + sizeof(setEncrypResp->status);
890
891 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000892}
893
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800894int wfaStaSetSecurity(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
895 int ret = WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000896
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800897 return ret;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000898}
899
900/*
901 * wfaStaSetEapTLS():
902 * This is to set
903 * 1. ssid
904 * 2. encrypType - tkip or aes-ccmp
905 * 3. keyManagementType - wpa or wpa2
906 * 4. trustedRootCA
907 * 5. clientCertificate
908 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800909int wfaStaSetEapTLS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
910 caStaSetEapTLS_t* setTLS = (caStaSetEapTLS_t*)caCmdBuf;
911 char* ifname = setTLS->intf;
912 dutCmdResponse_t* setEapTlsResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000913
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800914 DPRINT_INFO(WFA_OUT, "Entering wfaStaSetEapTLS ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000915
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800916 /*
Dake Zhao0a832172015-01-06 11:08:47 -0800917 * need to store the trustedROOTCA and clientCertificate into a file first.
918 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000919#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800920 sprintf(gCmdStr, "wfa_set_eaptls -i %s %s %s %s", ifname, setTLS->ssid,
921 setTLS->trustedRootCA, setTLS->clientCertificate);
922 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000923#else
924
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800925 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
926 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000927
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800928 /* ssid */
929 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
930 setTLS->ssid);
931 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000932
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800933 /* key management */
934 if (strcasecmp(setTLS->keyMgmtType, "wpa2-sha256") == 0) {
935 } else if (strcasecmp(setTLS->keyMgmtType, "wpa2-eap") == 0) {
936 } else if (strcasecmp(setTLS->keyMgmtType, "wpa2-ft") == 0) {
937 } else if (strcasecmp(setTLS->keyMgmtType, "wpa") == 0) {
938 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
939 } else if (strcasecmp(setTLS->keyMgmtType, "wpa2") == 0) {
940 // to take all and device to pick any one supported.
941 } else {
942 // ??
943 }
944 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000945
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800946 /* protocol WPA */
947 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA", ifname);
948 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000949
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800950 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap TLS", ifname);
951 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000952
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800953 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ca_cert '\"%s\"'", ifname,
954 setTLS->trustedRootCA);
955 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000956
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800957 sprintf(
958 gCmdStr,
959 "wpa_cli.sh -i %s set_network 0 identity '\"wifi-user@wifilabs.local\"'",
960 ifname);
961 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000962
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800963 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 private_key '\"%s/%s\"'",
964 ifname, CERTIFICATES_PATH, setTLS->clientCertificate);
965 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000966
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800967 sprintf(gCmdStr,
968 "wpa_cli.sh -i %s set_network 0 private_key_passwd '\"wifi\"'",
969 ifname);
970 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000971
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800972 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
973 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000974#endif
975
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800976 setEapTlsResp->status = STATUS_COMPLETE;
977 wfaEncodeTLV(WFA_STA_SET_EAPTLS_RESP_TLV, 4, (BYTE*)setEapTlsResp, respBuf);
978 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000979
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800980 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000981}
982
983/*
Dake Zhao0a832172015-01-06 11:08:47 -0800984 * The function is to set
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000985 * 1. ssid
986 * 2. passPhrase
987 * 3. keyMangementType - wpa/wpa2
988 * 4. encrypType - tkip or aes-ccmp
989 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800990int wfaStaSetPSK(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
991 /*Incompleted function*/
992 dutCmdResponse_t* setPskResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000993
Dake Zhaob7ed41a2014-12-04 11:24:58 -0800994#ifndef WFA_PC_CONSOLE
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800995 caStaSetPSK_t* setPSK = (caStaSetPSK_t*)caCmdBuf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +0000996#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +0800997 sprintf(gCmdStr, "wfa_set_psk %s %s %s", setPSK->intf, setPSK->ssid,
998 setPSK->passphrase);
999 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001000#else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001001 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", setPSK->intf,
1002 setPSK->ssid);
1003 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001004
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001005 if (strcasecmp(setPSK->keyMgmtType, "wpa2-sha256") == 0)
1006 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA2-SHA256",
1007 setPSK->intf);
1008 else if (strcasecmp(setPSK->keyMgmtType, "wpa2") == 0) {
1009 // take all and device to pick it supported.
1010 } else if (strcasecmp(setPSK->keyMgmtType, "wpa2-psk") == 0) {
1011 } else if (strcasecmp(setPSK->keyMgmtType, "wpa2-ft") == 0) {
1012 } else if (strcasecmp(setPSK->keyMgmtType, "wpa2-wpa-psk") == 0) {
1013 } else
1014 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-PSK",
1015 setPSK->intf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001016
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001017 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001018
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001019 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 psk '\"%s\"'", setPSK->intf,
1020 setPSK->passphrase);
1021 sret = systemWithLog(gCmdStr);
Ray Wang9c508692014-04-01 17:04:59 -07001022
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001023 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setPSK->intf);
1024 sret = systemWithLog(gCmdStr);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08001025
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001026 /* if PMF enable */
1027 if (setPSK->pmf == WFA_ENABLED || setPSK->pmf == WFA_OPTIONAL) {
1028 } else if (setPSK->pmf == WFA_REQUIRED) {
1029 } else if (setPSK->pmf == WFA_F_REQUIRED) {
1030 } else if (setPSK->pmf == WFA_F_DISABLED) {
1031 } else {
1032 /* Disable PMF */
1033 }
Dake Zhao0a832172015-01-06 11:08:47 -08001034
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001035#endif
1036
Dake Zhaob7ed41a2014-12-04 11:24:58 -08001037#endif
1038
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001039 setPskResp->status = STATUS_COMPLETE;
1040 wfaEncodeTLV(WFA_STA_SET_PSK_RESP_TLV, 4, (BYTE*)setPskResp, respBuf);
1041 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001042
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001043 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001044}
1045
1046/*
Dake Zhao0a832172015-01-06 11:08:47 -08001047 * wfaStaGetInfo():
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001048 * Get vendor specific information in name/value pair by a wireless I/F.
1049 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001050int wfaStaGetInfo(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1051 dutCmdResponse_t infoResp;
1052 dutCommand_t* getInfo = (dutCommand_t*)caCmdBuf;
1053 FILE* tmpfd;
1054 char vendor[256];
1055 const char* vendorFileName = "/tmp/ifvendor.txt";
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001056
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001057 sprintf(gCmdStr, "getifvendor.sh %s %s\n", getInfo->intf, vendorFileName);
Wojciech Jakobczykb8af9922020-08-25 14:49:44 +02001058
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001059 if (systemWithLog(gCmdStr) == -1) {
1060 infoResp.status = STATUS_ERROR;
1061 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(infoResp.status),
1062 (BYTE*)&infoResp, respBuf);
Wojciech Jakobczykb8af9922020-08-25 14:49:44 +02001063 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp.status);
Dake Zhao0a832172015-01-06 11:08:47 -08001064
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001065 DPRINT_ERR(WFA_ERR, "script %s failed\n", vendorFileName);
1066 return WFA_FAILURE;
1067 }
1068
1069 /* open the output result and scan/retrieve the info */
1070 tmpfd = fopen(vendorFileName, "r+");
1071
1072 if (tmpfd == NULL || fgets(vendor, 256, tmpfd) == NULL) {
1073 infoResp.status = STATUS_ERROR;
1074 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(infoResp.status),
1075 (BYTE*)&infoResp, respBuf);
1076 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp.status);
1077
1078 DPRINT_ERR(WFA_ERR, "file read failed\n");
1079
1080 if (tmpfd != NULL) {
1081 fclose(tmpfd);
1082 remove(vendorFileName);
1083 }
1084
1085 return WFA_FAILURE;
1086 }
1087
1088 snprintf(infoResp.cmdru.info, sizeof(infoResp.cmdru.info),
1089 "interface,%s,description,%s", getInfo->intf, vendor);
1090
1091 infoResp.status = STATUS_COMPLETE;
1092 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(infoResp.status),
1093 (BYTE*)&infoResp, respBuf);
1094 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp.status);
1095
1096 fclose(tmpfd);
1097 remove(vendorFileName);
1098
1099 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001100}
1101
1102/*
1103 * wfaStaSetEapTTLS():
1104 * This is to set
1105 * 1. ssid
1106 * 2. username
1107 * 3. passwd
1108 * 4. encrypType - tkip or aes-ccmp
1109 * 5. keyManagementType - wpa or wpa2
1110 * 6. trustedRootCA
1111 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001112int wfaStaSetEapTTLS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1113 caStaSetEapTTLS_t* setTTLS = (caStaSetEapTTLS_t*)caCmdBuf;
1114 char* ifname = setTTLS->intf;
1115 dutCmdResponse_t* setEapTtlsResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001116
1117#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001118 sprintf(gCmdStr, "wfa_set_eapttls %s %s %s %s %s", ifname, setTTLS->ssid,
1119 setTTLS->username, setTTLS->passwd, setTTLS->trustedRootCA);
1120 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001121#else
1122
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001123 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1124 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001125
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001126 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1127 setTTLS->ssid);
1128 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001129
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001130 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1131 setTTLS->username);
1132 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001133
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001134 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
1135 setTTLS->passwd);
1136 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001137
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001138 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1139 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001140
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001141 /* This may not need to set. if it is not set, default to take all */
1142 // sprintf(cmdStr, "wpa_cli.sh -i %s set_network 0 pairwise '\"%s\"", ifname, setTTLS->encrptype);
1143 if (strcasecmp(setTTLS->keyMgmtType, "wpa2-sha256") == 0) {
1144 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa2-eap") == 0) {
1145 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa2-ft") == 0) {
1146 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa") == 0) {
1147 } else if (strcasecmp(setTTLS->keyMgmtType, "wpa2") == 0) {
1148 // to take all and device to pick one it supported
1149 } else {
1150 // ??
1151 }
1152 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001153
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001154 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap TTLS", ifname);
1155 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001156
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001157 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ca_cert '\"%s/%s\"'", ifname,
1158 CERTIFICATES_PATH, setTTLS->trustedRootCA);
1159 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001160
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001161 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA", ifname);
1162 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001163
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001164 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase2 '\"auth=MSCHAPV2\"'",
1165 ifname);
1166 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001167
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001168 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
1169 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001170#endif
1171
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001172 setEapTtlsResp->status = STATUS_COMPLETE;
1173 wfaEncodeTLV(WFA_STA_SET_EAPTTLS_RESP_TLV, 4, (BYTE*)setEapTtlsResp, respBuf);
1174 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001175
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001176 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001177}
1178
1179/*
1180 * wfaStaSetEapSIM():
1181 * This is to set
1182 * 1. ssid
1183 * 2. user name
1184 * 3. passwd
1185 * 4. encrypType - tkip or aes-ccmp
1186 * 5. keyMangementType - wpa or wpa2
1187 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001188int wfaStaSetEapSIM(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1189 caStaSetEapSIM_t* setSIM = (caStaSetEapSIM_t*)caCmdBuf;
1190 char* ifname = setSIM->intf;
1191 dutCmdResponse_t* setEapSimResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001192
1193#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001194 sprintf(gCmdStr, "wfa_set_eapsim %s %s %s %s", ifname, setSIM->ssid,
1195 setSIM->username, setSIM->encrptype);
1196 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001197#else
1198
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001199 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1200 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001201
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001202 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1203 setSIM->ssid);
1204 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001205
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001206 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1207 setSIM->username);
1208 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001209
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001210 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 pairwise '\"%s\"'", ifname,
1211 setSIM->encrptype);
1212 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001213
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001214 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap SIM", ifname);
1215 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001216
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001217 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA", ifname);
1218 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001219
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001220 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
1221 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001222
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001223 if (strcasecmp(setSIM->keyMgmtType, "wpa2-sha256") == 0) {
1224 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-SHA256",
1225 ifname);
1226 } else if (strcasecmp(setSIM->keyMgmtType, "wpa2-eap") == 0) {
1227 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1228 } else if (strcasecmp(setSIM->keyMgmtType, "wpa2-ft") == 0) {
1229 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-FT", ifname);
1230 } else if (strcasecmp(setSIM->keyMgmtType, "wpa") == 0) {
1231 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1232 } else if (strcasecmp(setSIM->keyMgmtType, "wpa2") == 0) {
1233 // take all and device to pick one which is supported.
1234 } else {
1235 // ??
1236 }
1237 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001238
1239#endif
1240
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001241 setEapSimResp->status = STATUS_COMPLETE;
1242 wfaEncodeTLV(WFA_STA_SET_EAPSIM_RESP_TLV, 4, (BYTE*)setEapSimResp, respBuf);
1243 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001244
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001245 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001246}
1247
1248/*
1249 * wfaStaSetPEAP()
1250 * This is to set
1251 * 1. ssid
1252 * 2. user name
1253 * 3. passwd
1254 * 4. encryType - tkip or aes-ccmp
1255 * 5. keyMgmtType - wpa or wpa2
1256 * 6. trustedRootCA
1257 * 7. innerEAP
1258 * 8. peapVersion
1259 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001260int wfaStaSetPEAP(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1261 caStaSetEapPEAP_t* setPEAP = (caStaSetEapPEAP_t*)caCmdBuf;
1262 char* ifname = setPEAP->intf;
1263 dutCmdResponse_t* setPeapResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001264
1265#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001266 sprintf(gCmdStr, "wfa_set_peap %s %s %s %s %s %s %i %s", ifname,
1267 setPEAP->ssid, setPEAP->username, setPEAP->passwd,
1268 setPEAP->trustedRootCA, setPEAP->encrptype, setPEAP->peapVersion,
1269 setPEAP->innerEAP);
1270 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001271#else
1272
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001273 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1274 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001275
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001276 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1277 setPEAP->ssid);
1278 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001279
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001280 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap PEAP", ifname);
1281 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001282
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001283 sprintf(gCmdStr,
1284 "wpa_cli.sh -i %s set_network 0 anonymous_identity '\"anonymous\"' ",
1285 ifname);
1286 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001287
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001288 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1289 setPEAP->username);
1290 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001291
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001292 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
1293 setPEAP->passwd);
1294 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001295
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001296 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ca_cert '\"%s/%s\"'", ifname,
1297 CERTIFICATES_PATH, setPEAP->trustedRootCA);
1298 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001299
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001300 if (strcasecmp(setPEAP->keyMgmtType, "wpa2-sha256") == 0) {
1301 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-SHA256",
1302 ifname);
1303 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa2-eap") == 0) {
1304 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1305 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa2-ft") == 0) {
1306 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-FT", ifname);
1307 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa") == 0) {
1308 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1309 } else if (strcasecmp(setPEAP->keyMgmtType, "wpa2") == 0) {
1310 // take all and device to pick one which is supported.
1311 } else {
1312 // ??
1313 }
1314 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001315
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001316 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase1 '\"peaplabel=%i\"'",
1317 ifname, setPEAP->peapVersion);
1318 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001319
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001320 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase2 '\"auth=%s\"'",
1321 ifname, setPEAP->innerEAP);
1322 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001323
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001324 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
1325 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001326#endif
1327
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001328 setPeapResp->status = STATUS_COMPLETE;
1329 wfaEncodeTLV(WFA_STA_SET_PEAP_RESP_TLV, 4, (BYTE*)setPeapResp, respBuf);
1330 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001331
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001332 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001333}
1334
1335/*
1336 * wfaStaSetUAPSD()
1337 * This is to set
1338 * 1. acBE
1339 * 2. acBK
1340 * 3. acVI
1341 * 4. acVO
1342 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001343int wfaStaSetUAPSD(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1344 dutCmdResponse_t* setUAPSDResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001345#if 0 /* used for only one specific device, need to update to reflect yours */
Dake Zhao0a832172015-01-06 11:08:47 -08001346 caStaSetUAPSD_t *setUAPSD = (caStaSetUAPSD_t *)caCmdBuf;
1347 char *ifname = setUAPSD->intf;
1348 char tmpStr[10];
1349 char line[100];
1350 char *pathl="/etc/Wireless/RT61STA";
1351 BYTE acBE=1;
1352 BYTE acBK=1;
1353 BYTE acVO=1;
1354 BYTE acVI=1;
1355 BYTE APSDCapable;
1356 FILE *pipe;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001357
Dake Zhao0a832172015-01-06 11:08:47 -08001358 /*
1359 * A series of setting need to be done before doing WMM-PS
1360 * Additional steps of configuration may be needed.
1361 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001362
Dake Zhao0a832172015-01-06 11:08:47 -08001363 /*
1364 * bring down the interface
1365 */
1366 sprintf(gCmdStr, "ifconfig %s down",ifname);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001367 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001368 /*
1369 * Unload the Driver
1370 */
1371 sprintf(gCmdStr, "rmmod rt61");
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001372 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001373#ifndef WFA_WMM_AC
Dake Zhao0a832172015-01-06 11:08:47 -08001374 if(setUAPSD->acBE != 1)
1375 acBE=setUAPSD->acBE = 0;
1376 if(setUAPSD->acBK != 1)
1377 acBK=setUAPSD->acBK = 0;
1378 if(setUAPSD->acVO != 1)
1379 acVO=setUAPSD->acVO = 0;
1380 if(setUAPSD->acVI != 1)
1381 acVI=setUAPSD->acVI = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001382#else
Dake Zhao0a832172015-01-06 11:08:47 -08001383 acBE=setUAPSD->acBE;
1384 acBK=setUAPSD->acBK;
1385 acVO=setUAPSD->acVO;
1386 acVI=setUAPSD->acVI;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001387#endif
1388
Dake Zhao0a832172015-01-06 11:08:47 -08001389 APSDCapable = acBE||acBK||acVO||acVI;
1390 /*
1391 * set other AC parameters
1392 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001393
Dake Zhao0a832172015-01-06 11:08:47 -08001394 sprintf(tmpStr,"%d;%d;%d;%d",setUAPSD->acBE,setUAPSD->acBK,setUAPSD->acVI,setUAPSD->acVO);
1395 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 +02001396 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001397
Dake Zhao0a832172015-01-06 11:08:47 -08001398 sprintf(gCmdStr, "mv /tmp/wfa_tmp %s/rt61sta.dat",pathl);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001399 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001400 pipe = popen("uname -r", "r");
1401 /* Read into line the output of uname*/
1402 fscanf(pipe,"%s",line);
1403 pclose(pipe);
1404
1405 /*
1406 * load the Driver
1407 */
1408 sprintf(gCmdStr, "insmod /lib/modules/%s/extra/rt61.ko",line);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001409 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001410
1411 sprintf(gCmdStr, "ifconfig %s up",ifname);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02001412 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001413#endif
1414
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001415 setUAPSDResp->status = STATUS_COMPLETE;
1416 wfaEncodeTLV(WFA_STA_SET_UAPSD_RESP_TLV, 4, (BYTE*)setUAPSDResp, respBuf);
1417 *respLen = WFA_TLV_HDR_LEN + 4;
1418 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001419}
1420
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001421int wfaDeviceGetInfo(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1422 dutCommand_t* dutCmd = (dutCommand_t*)caCmdBuf;
1423 caDevInfo_t* devInfo = &dutCmd->cmdsu.dev;
1424 dutCmdResponse_t* infoResp = &gGenericResp;
1425 /*a vendor can fill in the proper info or anything non-disclosure */
1426 caDeviceGetInfoResp_t dinfo = {"WFA Lab", "DemoUnit", WFA_SYSTEM_VER};
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001427
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001428 DPRINT_INFO(WFA_OUT, "Entering wfaDeviceGetInfo ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001429
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001430 if (devInfo->fw == 0)
1431 memcpy(&infoResp->cmdru.devInfo, &dinfo, sizeof(caDeviceGetInfoResp_t));
1432 else {
1433 // Call internal API to pull the version ID */
1434 strncpy(infoResp->cmdru.devInfo.firmware, "NOVERSION", 15);
1435 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001436
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001437 infoResp->status = STATUS_COMPLETE;
1438 wfaEncodeTLV(WFA_DEVICE_GET_INFO_RESP_TLV, sizeof(dutCmdResponse_t),
1439 (BYTE*)infoResp, respBuf);
1440 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001441
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001442 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001443}
1444
1445/*
1446 * This funciton is to retrieve a list of interfaces and return
1447 * the list back to Agent control.
1448 * ********************************************************************
1449 * Note: We intend to make this WLAN interface name as a hardcode name.
1450 * Therefore, for a particular device, you should know and change the name
Dake Zhao0a832172015-01-06 11:08:47 -08001451 * for that device while doing porting. The MACRO "WFA_STAUT_IF" is defined in
1452 * the file "inc/wfa_ca.h". If the device OS is not linux-like, this most
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001453 * likely is hardcoded just for CAPI command responses.
1454 * *******************************************************************
Dake Zhao0a832172015-01-06 11:08:47 -08001455 *
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001456 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001457int wfaDeviceListIF(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1458 dutCmdResponse_t* infoResp = &gGenericResp;
1459 dutCommand_t* ifList = (dutCommand_t*)caCmdBuf;
1460 caDeviceListIFResp_t* ifListResp = &infoResp->cmdru.ifList;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001461
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001462 DPRINT_INFO(WFA_OUT, "Entering wfaDeviceListIF ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001463
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001464 switch (ifList->cmdsu.iftype) {
Dake Zhao0a832172015-01-06 11:08:47 -08001465 case IF_80211:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001466 infoResp->status = STATUS_COMPLETE;
1467 ifListResp->iftype = IF_80211;
1468 strcpy(ifListResp->ifs[0], WFA_STAUT_IF);
1469 strcpy(ifListResp->ifs[1], "NULL");
1470 strcpy(ifListResp->ifs[2], "NULL");
1471 break;
Dake Zhao0a832172015-01-06 11:08:47 -08001472 case IF_ETH:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001473 infoResp->status = STATUS_COMPLETE;
1474 ifListResp->iftype = IF_ETH;
1475 strcpy(ifListResp->ifs[0], "eth0");
1476 strcpy(ifListResp->ifs[1], "NULL");
1477 strcpy(ifListResp->ifs[2], "NULL");
1478 break;
1479 default: {
1480 infoResp->status = STATUS_ERROR;
1481 wfaEncodeTLV(WFA_DEVICE_LIST_IF_RESP_TLV, 4, (BYTE*)infoResp, respBuf);
1482 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001483
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001484 return WFA_SUCCESS;
Dake Zhao0a832172015-01-06 11:08:47 -08001485 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001486 }
Dake Zhao0a832172015-01-06 11:08:47 -08001487
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001488 wfaEncodeTLV(WFA_DEVICE_LIST_IF_RESP_TLV, sizeof(dutCmdResponse_t),
1489 (BYTE*)infoResp, respBuf);
1490 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -08001491
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001492 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001493}
1494
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001495int wfaStaDebugSet(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1496 dutCmdResponse_t* debugResp = &gGenericResp;
1497 dutCommand_t* debugSet = (dutCommand_t*)caCmdBuf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001498
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001499 DPRINT_INFO(WFA_OUT, "Entering wfaStaDebugSet ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001500
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001501 if (debugSet->cmdsu.dbg.state == 1) /* enable */
1502 wfa_defined_debug |= debugSet->cmdsu.dbg.level;
1503 else
1504 wfa_defined_debug = (~debugSet->cmdsu.dbg.level & wfa_defined_debug);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001505
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001506 debugResp->status = STATUS_COMPLETE;
1507 wfaEncodeTLV(WFA_STA_GET_INFO_RESP_TLV, sizeof(dutCmdResponse_t),
1508 (BYTE*)debugResp, respBuf);
1509 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001510
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001511 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001512}
1513
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001514/*
1515 * wfaStaGetBSSID():
1516 * This function is to retrieve BSSID of a specific wireless I/F.
Dake Zhao0a832172015-01-06 11:08:47 -08001517 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001518int wfaStaGetBSSID(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1519 char string[64];
1520 char* str;
1521 FILE* tmpfd;
1522 dutCmdResponse_t* bssidResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001523
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001524 DPRINT_INFO(WFA_OUT, "Entering wfaStaGetBSSID ...\n");
1525 /* retrieve the BSSID */
1526 sprintf(gCmdStr, "wpa_cli.sh status > /tmp/bssid.txt");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001527
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001528 systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001529
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001530 tmpfd = fopen("/tmp/bssid.txt", "r+");
1531 if (tmpfd == NULL) {
1532 bssidResp->status = STATUS_ERROR;
1533 wfaEncodeTLV(WFA_STA_GET_BSSID_RESP_TLV, 4, (BYTE*)bssidResp, respBuf);
1534 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001535
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001536 DPRINT_ERR(WFA_ERR, "file open failed\n");
1537 return WFA_FAILURE;
1538 }
1539
1540 for (;;) {
1541 if (fscanf(tmpfd, "%s", string) == EOF) {
1542 bssidResp->status = STATUS_COMPLETE;
1543 strcpy(bssidResp->cmdru.bssid, "00:00:00:00:00:00");
1544 break;
Dake Zhao0a832172015-01-06 11:08:47 -08001545 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001546
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001547 if (strncmp(string, "bssid", 5) == 0) {
1548 str = strtok(string, "=");
1549 str = strtok(NULL, "=");
1550 if (str != NULL) {
1551 strcpy(bssidResp->cmdru.bssid, str);
1552 bssidResp->status = STATUS_COMPLETE;
1553 break;
1554 }
Dake Zhao0a832172015-01-06 11:08:47 -08001555 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001556 }
Dake Zhao0a832172015-01-06 11:08:47 -08001557
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001558 wfaEncodeTLV(WFA_STA_GET_BSSID_RESP_TLV, sizeof(dutCmdResponse_t),
1559 (BYTE*)bssidResp, respBuf);
1560 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
Dake Zhao0a832172015-01-06 11:08:47 -08001561
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001562 fclose(tmpfd);
1563 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001564}
1565
1566/*
1567 * wfaStaSetIBSS()
1568 * This is to set
1569 * 1. ssid
1570 * 2. channel
1571 * 3. encrypType - none or wep
1572 * optional
1573 * 4. key1
1574 * 5. key2
1575 * 6. key3
1576 * 7. key4
1577 * 8. activeIndex - 1, 2, 3, or 4
1578 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001579int wfaStaSetIBSS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1580 caStaSetIBSS_t* setIBSS = (caStaSetIBSS_t*)caCmdBuf;
1581 dutCmdResponse_t* setIbssResp = &gGenericResp;
1582 int i;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001583
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001584 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001585 * disable the network first
1586 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001587 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", setIBSS->intf);
1588 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001589
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001590 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001591 * set SSID
1592 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001593 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'",
1594 setIBSS->intf, setIBSS->ssid);
1595 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001596
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001597 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001598 * Set channel for IBSS
1599 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001600 sprintf(gCmdStr, "iwconfig %s channel %i", setIBSS->intf, setIBSS->channel);
1601 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001602
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001603 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001604 * Tell the supplicant for IBSS mode (1)
1605 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001606 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 mode 1", setIBSS->intf);
1607 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001608
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001609 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001610 * set Key management to NONE (NO WPA) for plaintext or WEP
1611 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001612 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt NONE",
1613 setIBSS->intf);
1614 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001615
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001616 if (setIBSS->encpType == 1) {
1617 for (i = 0; i < 4; i++) {
1618 if (strlen(setIBSS->keys[i]) == 5 || strlen(setIBSS->keys[i]) == 13) {
1619 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_key%i \"%s\"",
1620 setIBSS->intf, i, setIBSS->keys[i]);
1621 sret = systemWithLog(gCmdStr);
1622 }
Dake Zhao0a832172015-01-06 11:08:47 -08001623 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001624
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001625 i = setIBSS->activeKeyIdx;
1626 if (strlen(setIBSS->keys[i]) == 5 || strlen(setIBSS->keys[i]) == 13) {
1627 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 wep_tx_keyidx %i",
1628 setIBSS->intf, setIBSS->activeKeyIdx);
1629 sret = systemWithLog(gCmdStr);
1630 }
1631 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001632
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001633 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", setIBSS->intf);
1634 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001635
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001636 setIbssResp->status = STATUS_COMPLETE;
1637 wfaEncodeTLV(WFA_STA_SET_IBSS_RESP_TLV, 4, (BYTE*)setIbssResp, respBuf);
1638 *respLen = WFA_TLV_HDR_LEN + 4;
1639
1640 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001641}
1642
1643/*
1644 * wfaSetMode():
Dake Zhao0a832172015-01-06 11:08:47 -08001645 * The function is to set the wireless interface with a given mode (possible
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001646 * adhoc)
1647 * Input parameters:
1648 * 1. I/F
1649 * 2. ssid
1650 * 3. mode adhoc or managed
1651 * 4. encType
1652 * 5. channel
1653 * 6. key(s)
1654 * 7. active key
Dake Zhao0a832172015-01-06 11:08:47 -08001655 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001656int wfaStaSetMode(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1657 caStaSetMode_t* setmode = (caStaSetMode_t*)caCmdBuf;
1658 dutCmdResponse_t* SetModeResp = &gGenericResp;
1659 int i;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001660
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001661 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001662 * bring down the interface
1663 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001664 sprintf(gCmdStr, "ifconfig %s down", setmode->intf);
1665 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001666
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001667 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001668 * distroy the interface
1669 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001670 sprintf(gCmdStr, "wlanconfig %s destroy", setmode->intf);
1671 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001672
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001673 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001674 * re-create the interface with the given mode
1675 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001676 if (setmode->mode == 1)
1677 sprintf(gCmdStr, "wlanconfig %s create wlandev wifi0 wlanmode adhoc",
1678 setmode->intf);
1679 else
1680 sprintf(gCmdStr, "wlanconfig %s create wlandev wifi0 wlanmode managed",
1681 setmode->intf);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001682
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001683 sret = systemWithLog(gCmdStr);
1684 if (setmode->encpType == ENCRYPT_WEP) {
1685 int j = setmode->activeKeyIdx;
1686 for (i = 0; i < 4; i++) {
1687 if (setmode->keys[i][0] != '\0') {
1688 sprintf(gCmdStr, "iwconfig %s key s:%s", setmode->intf,
1689 setmode->keys[i]);
1690 sret = systemWithLog(gCmdStr);
1691 }
1692 /* set active key */
1693 if (setmode->keys[j][0] != '\0')
1694 sprintf(gCmdStr, "iwconfig %s key s:%s", setmode->intf,
1695 setmode->keys[j]);
1696 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001697 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001698 }
1699 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001700 * Set channel for IBSS
1701 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001702 if (setmode->channel) {
1703 sprintf(gCmdStr, "iwconfig %s channel %i", setmode->intf, setmode->channel);
1704 sret = systemWithLog(gCmdStr);
1705 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001706
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001707 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001708 * set SSID
1709 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001710 sprintf(gCmdStr, "iwconfig %s essid %s", setmode->intf, setmode->ssid);
1711 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001712
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001713 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001714 * bring up the interface
1715 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001716 sprintf(gCmdStr, "ifconfig %s up", setmode->intf);
1717 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001718
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001719 SetModeResp->status = STATUS_COMPLETE;
1720 wfaEncodeTLV(WFA_STA_SET_MODE_RESP_TLV, 4, (BYTE*)SetModeResp, respBuf);
1721 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001722
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001723 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001724}
1725
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001726int wfaStaSetPwrSave(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1727 caStaSetPwrSave_t* setps = (caStaSetPwrSave_t*)caCmdBuf;
1728 dutCmdResponse_t* SetPSResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001729
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001730 sprintf(gCmdStr, "iwconfig %s power %s", setps->intf, setps->mode);
1731 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001732
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001733 SetPSResp->status = STATUS_COMPLETE;
1734 wfaEncodeTLV(WFA_STA_SET_PWRSAVE_RESP_TLV, 4, (BYTE*)SetPSResp, respBuf);
1735 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001736
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001737 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001738}
1739
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001740int wfaStaUpload(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1741 caStaUpload_t* upload = &((dutCommand_t*)caCmdBuf)->cmdsu.upload;
1742 dutCmdResponse_t* upLoadResp = &gGenericResp;
1743 caStaUploadResp_t* upld = &upLoadResp->cmdru.uld;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001744
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001745 if (upload->type == WFA_UPLOAD_VHSO_RPT) {
1746 int rbytes;
1747 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001748 * if asked for the first packet, always to open the file
1749 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001750 if (upload->next == 1) {
1751 if (e2efp != NULL) {
1752 fclose(e2efp);
1753 e2efp = NULL;
1754 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001755
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001756 e2efp = fopen(e2eResults, "r");
1757 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001758
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001759 if (e2efp == NULL) {
1760 upLoadResp->status = STATUS_ERROR;
1761 wfaEncodeTLV(WFA_STA_UPLOAD_RESP_TLV, 4, (BYTE*)upLoadResp, respBuf);
1762 *respLen = WFA_TLV_HDR_LEN + 4;
1763 return WFA_FAILURE;
1764 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001765
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001766 rbytes = fread(upld->bytes, 1, 256, e2efp);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001767
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001768 if (rbytes < 256) {
1769 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001770 * this means no more bytes after this read
1771 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001772 upld->seqnum = 0;
1773 fclose(e2efp);
1774 e2efp = NULL;
1775 } else {
1776 upld->seqnum = upload->next;
Dake Zhao0a832172015-01-06 11:08:47 -08001777 }
1778
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001779 upld->nbytes = rbytes;
1780
1781 upLoadResp->status = STATUS_COMPLETE;
1782 wfaEncodeTLV(WFA_STA_UPLOAD_RESP_TLV, sizeof(dutCmdResponse_t),
1783 (BYTE*)upLoadResp, respBuf);
1784 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
1785 } else {
1786 upLoadResp->status = STATUS_ERROR;
1787 wfaEncodeTLV(WFA_STA_UPLOAD_RESP_TLV, 4, (BYTE*)upLoadResp, respBuf);
1788 *respLen = WFA_TLV_HDR_LEN + 4;
1789 }
1790
1791 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001792}
1793/*
1794 * wfaStaSetWMM()
1795 * TO be ported on a specific plaform for the DUT
1796 * This is to set the WMM related parameters at the DUT.
1797 * Currently the function is used for GROUPS WMM-AC and WMM general configuration for setting RTS Threshhold, Fragmentation threshold and wmm (ON/OFF)
1798 * It is expected that this function will set all the WMM related parametrs for a particular GROUP .
1799 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001800int wfaStaSetWMM(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001801#ifdef WFA_WMM_AC
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001802 caStaSetWMM_t* setwmm = (caStaSetWMM_t*)caCmdBuf;
1803 char* ifname = setwmm->intf;
1804 dutCmdResponse_t* setwmmResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001805
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001806 switch (setwmm->group) {
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001807 case GROUP_WMMAC:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001808 if (setwmm->send_trig) {
1809 int Sockfd;
1810 struct sockaddr_in psToAddr;
1811 unsigned int TxMsg[512];
Dake Zhao0a832172015-01-06 11:08:47 -08001812
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001813 Sockfd = wfaCreateUDPSock(setwmm->dipaddr, 12346);
1814 memset(&psToAddr, 0, sizeof(psToAddr));
1815 psToAddr.sin_family = AF_INET;
1816 psToAddr.sin_addr.s_addr = inet_addr(setwmm->dipaddr);
1817 psToAddr.sin_port = htons(12346);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001818
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001819 switch (setwmm->trig_ac) {
1820 case WMMAC_AC_VO:
1821 wfaTGSetPrio(Sockfd, 7);
1822 create_apts_msg(APTS_CK_VO, TxMsg, 0);
1823 printf("\r\nSending AC_VO trigger packet\n");
1824 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001825
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001826 case WMMAC_AC_VI:
1827 wfaTGSetPrio(Sockfd, 5);
1828 create_apts_msg(APTS_CK_VI, TxMsg, 0);
1829 printf("\r\nSending AC_VI trigger packet\n");
1830 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001831
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001832 case WMMAC_AC_BK:
1833 wfaTGSetPrio(Sockfd, 2);
1834 create_apts_msg(APTS_CK_BK, TxMsg, 0);
1835 printf("\r\nSending AC_BK trigger packet\n");
1836 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001837
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001838 default:
1839 case WMMAC_AC_BE:
1840 wfaTGSetPrio(Sockfd, 0);
1841 create_apts_msg(APTS_CK_BE, TxMsg, 0);
1842 printf("\r\nSending AC_BE trigger packet\n");
1843 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001844 }
1845
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001846 sendto(Sockfd, TxMsg, 256, 0, (struct sockaddr*)&psToAddr,
1847 sizeof(struct sockaddr));
1848 close(Sockfd);
1849 usleep(1000000);
1850 } else if (setwmm->action == WMMAC_ADDTS) {
1851 printf(
1852 "ADDTS AC PARAMS: dialog id: %d, TID: %d, "
1853 "DIRECTION: %d, PSB: %d, UP: %d, INFOACK: %d BURST SIZE DEF: %d"
1854 "Fixed %d, MSDU Size: %d, Max MSDU Size %d, "
1855 "MIN SERVICE INTERVAL: %d, MAX SERVICE INTERVAL: %d, "
1856 "INACTIVITY: %d, SUSPENSION %d, SERVICE START TIME: %d, "
1857 "MIN DATARATE: %d, MEAN DATA RATE: %d, PEAK DATA RATE: %d, "
1858 "BURSTSIZE or MSDU Aggreg: %d, DELAY BOUND: %d, PHYRATE: %d, "
1859 "SPLUSBW: %f, "
1860 "MEDIUM TIME: %d, ACCESSCAT: %d\n",
1861 setwmm->actions.addts.dialog_token,
1862 setwmm->actions.addts.tspec.tsinfo.TID,
1863 setwmm->actions.addts.tspec.tsinfo.direction,
1864 setwmm->actions.addts.tspec.tsinfo.PSB,
1865 setwmm->actions.addts.tspec.tsinfo.UP,
1866 setwmm->actions.addts.tspec.tsinfo.infoAck,
1867 setwmm->actions.addts.tspec.tsinfo.bstSzDef,
1868 setwmm->actions.addts.tspec.Fixed, setwmm->actions.addts.tspec.size,
1869 setwmm->actions.addts.tspec.maxsize,
1870 setwmm->actions.addts.tspec.min_srvc,
1871 setwmm->actions.addts.tspec.max_srvc,
1872 setwmm->actions.addts.tspec.inactivity,
1873 setwmm->actions.addts.tspec.suspension,
1874 setwmm->actions.addts.tspec.srvc_strt_tim,
1875 setwmm->actions.addts.tspec.mindatarate,
1876 setwmm->actions.addts.tspec.meandatarate,
1877 setwmm->actions.addts.tspec.peakdatarate,
1878 setwmm->actions.addts.tspec.burstsize,
1879 setwmm->actions.addts.tspec.delaybound,
1880 setwmm->actions.addts.tspec.PHYrate,
1881 setwmm->actions.addts.tspec.sba,
1882 setwmm->actions.addts.tspec.medium_time,
1883 setwmm->actions.addts.accesscat);
1884
1885 //tspec should be set here.
1886
1887 sret = systemWithLog(gCmdStr);
1888 } else if (setwmm->action == WMMAC_DELTS) {
1889 // send del tspec
1890 }
1891
1892 setwmmResp->status = STATUS_COMPLETE;
1893 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001894
1895 case GROUP_WMMCONF:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001896 sprintf(gCmdStr, "iwconfig %s rts %d", ifname,
1897 setwmm->actions.config.rts_thr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001898
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001899 sret = systemWithLog(gCmdStr);
1900 sprintf(gCmdStr, "iwconfig %s frag %d", ifname,
1901 setwmm->actions.config.frag_thr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001902
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001903 sret = systemWithLog(gCmdStr);
1904 sprintf(gCmdStr, "iwpriv %s wmmcfg %d", ifname,
1905 setwmm->actions.config.wmm);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001906
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001907 sret = systemWithLog(gCmdStr);
1908 setwmmResp->status = STATUS_COMPLETE;
1909 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001910
1911 default:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001912 DPRINT_ERR(WFA_ERR, "The group %d is not supported\n", setwmm->group);
1913 setwmmResp->status = STATUS_ERROR;
1914 break;
1915 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001916
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001917 wfaEncodeTLV(WFA_STA_SET_WMM_RESP_TLV, 4, (BYTE*)setwmmResp, respBuf);
1918 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001919#endif
1920
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001921 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001922}
1923
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001924int wfaStaSendNeigReq(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1925 dutCmdResponse_t* sendNeigReqResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001926
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001927 /*
Dake Zhao0a832172015-01-06 11:08:47 -08001928 * run your device to send NEIGREQ
1929 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001930
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001931 sendNeigReqResp->status = STATUS_COMPLETE;
1932 wfaEncodeTLV(WFA_STA_SEND_NEIGREQ_RESP_TLV, 4, (BYTE*)sendNeigReqResp,
1933 respBuf);
1934 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001935
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001936 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001937}
1938
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001939int wfaStaSetEapFAST(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
1940 caStaSetEapFAST_t* setFAST = (caStaSetEapFAST_t*)caCmdBuf;
1941 char* ifname = setFAST->intf;
1942 dutCmdResponse_t* setEapFastResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001943
1944#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001945 sprintf(gCmdStr, "wfa_set_eapfast %s %s %s %s %s %s", ifname, setFAST->ssid,
1946 setFAST->username, setFAST->passwd, setFAST->pacFileName,
1947 setFAST->innerEAP);
1948 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001949#else
1950
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001951 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
1952 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001953
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001954 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
1955 setFAST->ssid);
1956 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001957
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001958 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
1959 setFAST->username);
1960 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001961
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001962 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
1963 setFAST->passwd);
1964 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001965
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001966 if (strcasecmp(setFAST->keyMgmtType, "wpa2-sha256") == 0) {
1967 } else if (strcasecmp(setFAST->keyMgmtType, "wpa2-eap") == 0) {
1968 } else if (strcasecmp(setFAST->keyMgmtType, "wpa2-ft") == 0) {
1969 } else if (strcasecmp(setFAST->keyMgmtType, "wpa") == 0) {
1970 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
1971 } else if (strcasecmp(setFAST->keyMgmtType, "wpa2") == 0) {
1972 // take all and device to pick one which is supported.
1973 } else {
1974 // ??
1975 }
1976 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08001977
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001978 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap FAST", ifname);
1979 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001980
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001981 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 pac_file '\"%s/%s\"'",
1982 ifname, CERTIFICATES_PATH, setFAST->pacFileName);
1983 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001984
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001985 sprintf(gCmdStr,
1986 "wpa_cli.sh -i %s set_network 0 anonymous_identity '\"anonymous\"'",
1987 ifname);
1988 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001989
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001990 sprintf(gCmdStr,
1991 "wpa_cli.sh -i %s set_network 0 phase1 '\"fast_provisioning=1\"'",
1992 ifname);
1993 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001994
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001995 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase2 '\"auth=%s\"'",
1996 ifname, setFAST->innerEAP);
1997 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00001998
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08001999 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
2000 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002001#endif
2002
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002003 setEapFastResp->status = STATUS_COMPLETE;
2004 wfaEncodeTLV(WFA_STA_SET_EAPFAST_RESP_TLV, 4, (BYTE*)setEapFastResp, respBuf);
2005 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002006
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002007 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002008}
2009
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002010int wfaStaSetEapAKA(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2011 caStaSetEapAKA_t* setAKA = (caStaSetEapAKA_t*)caCmdBuf;
2012 char* ifname = setAKA->intf;
2013 dutCmdResponse_t* setEapAkaResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002014
2015#ifdef WFA_NEW_CLI_FORMAT
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002016 sprintf(gCmdStr, "wfa_set_eapaka %s %s %s %s", ifname, setAKA->ssid,
2017 setAKA->username, setAKA->passwd);
2018 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002019#else
2020
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002021 sprintf(gCmdStr, "wpa_cli.sh -i %s disable_network 0", ifname);
2022 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002023
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002024 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 ssid '\"%s\"'", ifname,
2025 setAKA->ssid);
2026 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002027
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002028 if (strcasecmp(setAKA->keyMgmtType, "wpa2-sha256") == 0) {
2029 } else if (strcasecmp(setAKA->keyMgmtType, "wpa2-eap") == 0) {
2030 } else if (strcasecmp(setAKA->keyMgmtType, "wpa2-ft") == 0) {
2031 } else if (strcasecmp(setAKA->keyMgmtType, "wpa") == 0) {
2032 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 key_mgmt WPA-EAP", ifname);
2033 } else if (strcasecmp(setAKA->keyMgmtType, "wpa2") == 0) {
2034 // take all and device to pick one which is supported.
2035 } else {
2036 // ??
2037 }
2038 sret = systemWithLog(gCmdStr);
Dake Zhao0a832172015-01-06 11:08:47 -08002039
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002040 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto WPA2", ifname);
2041 sret = systemWithLog(gCmdStr);
2042 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 proto CCMP", ifname);
2043 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002044
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002045 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 eap AKA", ifname);
2046 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002047
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002048 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 phase1 \"result_ind=1\"",
2049 ifname);
2050 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002051
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002052 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 identity '\"%s\"'", ifname,
2053 setAKA->username);
2054 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002055
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002056 sprintf(gCmdStr, "wpa_cli.sh -i %s set_network 0 password '\"%s\"'", ifname,
2057 setAKA->passwd);
2058 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002059
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002060 sprintf(gCmdStr, "wpa_cli.sh -i %s enable_network 0", ifname);
2061 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002062#endif
2063
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002064 setEapAkaResp->status = STATUS_COMPLETE;
2065 wfaEncodeTLV(WFA_STA_SET_EAPAKA_RESP_TLV, 4, (BYTE*)setEapAkaResp, respBuf);
2066 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002067
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002068 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002069}
2070
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002071int wfaStaSetSystime(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2072 caStaSetSystime_t* systime = (caStaSetSystime_t*)caCmdBuf;
2073 dutCmdResponse_t* setSystimeResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002074
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002075 DPRINT_INFO(WFA_OUT, "Entering wfaStaSetSystime ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002076
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002077 sprintf(gCmdStr, "date %d-%d-%d", systime->month, systime->date,
2078 systime->year);
2079 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002080
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002081 sprintf(gCmdStr, "time %d:%d:%d", systime->hours, systime->minutes,
2082 systime->seconds);
2083 sret = systemWithLog(gCmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002084
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002085 setSystimeResp->status = STATUS_COMPLETE;
2086 wfaEncodeTLV(WFA_STA_SET_SYSTIME_RESP_TLV, 4, (BYTE*)setSystimeResp, respBuf);
2087 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002088
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002089 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002090}
2091
2092#ifdef WFA_STA_TB
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002093int wfaStaPresetParams(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2094 dutCmdResponse_t* PresetParamsResp = &gGenericResp;
2095 caStaPresetParameters_t* presetParams = (caStaPresetParameters_t*)caCmdBuf;
2096 BYTE presetDone = 1;
2097 int st = 0;
2098 char cmdStr[128];
2099 char string[256];
2100 FILE* tmpfd = NULL;
2101 long val;
2102 char* endptr;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002103
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002104 DPRINT_INFO(WFA_OUT, "Inside wfaStaPresetParameters function ...\n");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002105
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002106 if (presetParams->supplicant == eWpaSupplicant) {
2107 st = access("/tmp/processid.txt", F_OK);
2108 if (st != -1) {
2109 st = remove("/tmp/processid.txt");
Dake Zhao0a832172015-01-06 11:08:47 -08002110 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002111
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002112 sprintf(cmdStr, "/usr/local/sbin/findprocess.sh %s /tmp/processid.txt\n",
2113 "wpa_supplicant");
2114 st = systemWithLog(cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002115
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002116 tmpfd = fopen("/tmp/processid.txt", "r+");
2117 if (tmpfd == NULL) {
2118 DPRINT_ERR(WFA_ERR, "process id file not exist\n");
2119 return WFA_FAILURE;
Dake Zhao0a832172015-01-06 11:08:47 -08002120 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002121
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002122 for (;;) {
2123 if (fgets(string, 256, tmpfd) == NULL)
2124 break;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002125
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002126 errno = 0;
2127 val = strtol(string, &endptr, 10);
2128 if (errno != 0 && val == 0) {
2129 DPRINT_ERR(WFA_ERR, "strtol error\n");
2130 return WFA_FAILURE;
2131 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002132
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002133 if (endptr == string) {
2134 DPRINT_ERR(WFA_ERR, "No wpa_supplicant instance was found\n");
2135 }
2136
2137 presetDone = 1;
2138 }
2139 }
2140
2141 if (presetParams->wmmFlag) {
2142 st = wfaExecuteCLI(gCmdStr);
2143 switch (st) {
2144 case 0:
2145 presetDone = 1;
2146 break;
2147 case 1:
2148 presetDone = 0;
2149 break;
2150 case 2:
2151 presetDone = 0;
2152 break;
2153 }
2154 }
2155
2156 if (presetParams->modeFlag != 0) {
2157 switch (presetParams->wirelessMode) {
2158 default:
2159 printf("other mode does not need to support\n");
Dake Zhao0a832172015-01-06 11:08:47 -08002160 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002161
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002162 st = wfaExecuteCLI(gCmdStr);
2163 switch (st) {
2164 case 0:
2165 presetDone = 1;
2166 break;
2167 case 1:
2168 presetDone = 0;
2169 case 2:
2170 presetDone = 0;
2171 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002172 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002173 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002174
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002175 if (presetParams->psFlag) {
2176 printf("%s\n", gCmdStr);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02002177 sret = systemWithLog(gCmdStr);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002178 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002179
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002180 /************the followings are used for Voice Enterprise **************/
2181 if (presetParams->program == PROG_TYPE_VENT) {
2182 if (presetParams->ftoa == eEnable) {
2183 // enable Fast BSS Transition Over the Air
2184 } else {
2185 // disable Fast BSS Transition Over the Air
2186 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002187
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002188 if (presetParams->ftds == eEnable) {
2189 // enable Fast BSS Transition Over the DS
2190 } else {
2191 // disable Fast BSS Transition Over the DS
2192 }
2193
2194 if (presetParams->activescan == eEnable) {
2195 // Enable Active Scan on STA
2196 } else {
2197 // disable Active Scan on STA
2198 }
2199 }
2200
2201 /************the followings are used for Wi-Fi Display *************/
2202 if (presetParams->program == PROG_TYPE_WFD) {
2203 if (presetParams->tdlsFlag) {
2204 // enable / disable tdls based on tdls
2205 }
2206 if (presetParams->wfdDevTypeFlag) {
2207 // set WFD device type to source/sink/dual based on wfdDevType
2208 }
2209 if (presetParams->wfdUibcGenFlag) {
2210 // enable / disable the feature
2211 }
2212 if (presetParams->wfdUibcHidFlag) {
2213 // enable / disable feature
2214 }
2215 if (presetParams->wfdUiInputFlag) {
2216 // set the UI input as mentioned
2217 }
2218 if (presetParams->wfdHdcpFlag) {
2219 // enable / disable feature
2220 }
2221 if (presetParams->wfdFrameSkipFlag) {
2222 // enable / disable feature
2223 }
2224 if (presetParams->wfdAvChangeFlag) {
2225 // enable / disable feature
2226 }
2227 if (presetParams->wfdStandByFlag) {
2228 // enable / disable feature
2229 }
2230 if (presetParams->wfdInVideoFlag) {
2231 // select the input vide as protecteed or non-protetcted or protected audio
2232 // or unprotected audio etc.
2233 }
2234
2235 if (presetParams->wfdVideoFmatFlag) {
2236 // set the video format as requested
2237
2238 //switch(presetParams->wfdVideoFmt )
2239 //{
2240 // case e640x480p60:
2241 // ;
2242 // default:
2243 // set the mandatory
2244 // }
2245 }
2246 if (presetParams->wfdAudioFmatFlag) {
2247 // set the Audio format as requested
2248
2249 //switch(presetParams->wfdAudioFmt )
2250 //{
2251 // case eMandatoryAudioMode:
2252 // ;
2253 // case eDefaultAudioMode:
2254 // ;
2255
2256 // default:
2257 // set the mandatory
2258 // }
2259 }
2260
2261 if (presetParams->wfdI2cFlag) {
2262 // enable / disable feature
2263 }
2264 if (presetParams->wfdVideoRecoveryFlag) {
2265 // enable / disable feature
2266 }
2267 if (presetParams->wfdPrefDisplayFlag) {
2268 // enable / disable feature
2269 }
2270 if (presetParams->wfdServiceDiscoveryFlag) {
2271 // enable / disable feature
2272 }
2273 if (presetParams->wfd3dVideoFlag) {
2274 // enable / disable feature
2275 }
2276 if (presetParams->wfdMultiTxStreamFlag) {
2277 // enable / disable feature
2278 }
2279 if (presetParams->wfdTimeSyncFlag) {
2280 // enable / disable feature
2281 }
2282 if (presetParams->wfdEDIDFlag) {
2283 // enable / disable feature
2284 }
2285 if (presetParams->wfdUIBCPrepareFlag) {
2286 // Provdes information to start valid WFD session to check UIBC operation.
2287 }
2288 if (presetParams->wfdCoupledCapFlag) {
2289 // enable / disable feature
2290 }
2291 if (presetParams->wfdOptionalFeatureFlag) {
2292 // disable all program specific optional features
2293 }
2294 if (presetParams->wfdSessionAvailFlag) {
2295 // enable / disable session available bit
2296 }
2297 if (presetParams->wfdDeviceDiscoverabilityFlag) {
2298 // enable / disable feature
2299 }
2300 }
2301
2302 if (presetParams->program == PROG_TYPE_WFDS) {
2303 if (presetParams->wfdsType == eAcceptPD) {
2304 // preset to accept PD request
2305 if (presetParams->wfdsConnectionCapabilityFlag == 1) {
2306 // use presetParams->wfdsConnectionCapability and set role accordingly
2307 }
2308 }
2309 if (presetParams->wfdsType == eRejectPD) {
2310 // preset to Reject PD request
2311 }
2312 if (presetParams->wfdsType == eIgnorePD) {
2313 // preset to Ignore PD request
2314 }
2315 if (presetParams->wfdsType == eRejectSession) {
2316 // preset to reject Session request
2317 }
2318 }
2319
2320 if (presetDone) {
2321 PresetParamsResp->status = STATUS_COMPLETE;
2322 } else {
2323 PresetParamsResp->status = STATUS_INVALID;
2324 }
2325
2326 wfaEncodeTLV(WFA_STA_PRESET_PARAMETERS_RESP_TLV, 4, (BYTE*)PresetParamsResp,
2327 respBuf);
2328 *respLen = WFA_TLV_HDR_LEN + 4;
2329
2330 return WFA_SUCCESS;
2331}
2332
2333int wfaStaSet11n(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2334 dutCmdResponse_t* v11nParamsResp = &gGenericResp;
2335
2336 v11nParamsResp->status = STATUS_COMPLETE;
2337 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, 4, (BYTE*)v11nParamsResp, respBuf);
2338 *respLen = WFA_TLV_HDR_LEN + 4;
2339 return WFA_SUCCESS;
2340}
2341int wfaStaSetWireless(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2342 dutCmdResponse_t* staWirelessResp = &gGenericResp;
2343
2344 staWirelessResp->status = STATUS_COMPLETE;
2345 wfaEncodeTLV(WFA_STA_SET_WIRELESS_RESP_TLV, 4, (BYTE*)staWirelessResp,
2346 respBuf);
2347 *respLen = WFA_TLV_HDR_LEN + 4;
2348 return WFA_SUCCESS;
2349}
2350
2351int wfaStaSendADDBA(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2352 dutCmdResponse_t* staSendADDBAResp = &gGenericResp;
2353
2354 wfaEncodeTLV(WFA_STA_SET_SEND_ADDBA_RESP_TLV, 4, (BYTE*)staSendADDBAResp,
2355 respBuf);
2356 *respLen = WFA_TLV_HDR_LEN + 4;
2357 return WFA_SUCCESS;
2358}
2359
2360int wfaStaSetRIFS(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2361 dutCmdResponse_t* staSetRIFSResp = &gGenericResp;
2362
2363 wfaEncodeTLV(WFA_STA_SET_RIFS_TEST_RESP_TLV, 4, (BYTE*)staSetRIFSResp,
2364 respBuf);
2365 *respLen = WFA_TLV_HDR_LEN + 4;
2366
2367 return WFA_SUCCESS;
2368}
2369
2370int wfaStaSendCoExistMGMT(int len,
2371 BYTE* caCmdBuf,
2372 int* respLen,
2373 BYTE* respBuf) {
2374 dutCmdResponse_t* staSendMGMTResp = &gGenericResp;
2375
2376 wfaEncodeTLV(WFA_STA_SEND_COEXIST_MGMT_RESP_TLV, 4, (BYTE*)staSendMGMTResp,
2377 respBuf);
2378 *respLen = WFA_TLV_HDR_LEN + 4;
2379
2380 return WFA_SUCCESS;
2381}
2382
2383int wfaStaResetDefault(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2384 caStaResetDefault_t* reset = (caStaResetDefault_t*)caCmdBuf;
2385 dutCmdResponse_t* ResetResp = &gGenericResp;
2386
2387 // need to make your own command available for this, here is only an example
2388 sprintf(gCmdStr, "myresetdefault %s program %s", reset->intf, reset->prog);
2389 sret = systemWithLog(gCmdStr);
2390
2391 ResetResp->status = STATUS_COMPLETE;
2392 wfaEncodeTLV(WFA_STA_RESET_DEFAULT_RESP_TLV, 4, (BYTE*)ResetResp, respBuf);
2393 *respLen = WFA_TLV_HDR_LEN + 4;
2394
2395 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002396}
2397
2398#else
2399
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002400int wfaStaTestBedCmd(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2401 dutCmdResponse_t* staCmdResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002402
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002403 wfaEncodeTLV(WFA_STA_DISCONNECT_RESP_TLV, 4, (BYTE*)staCmdResp, respBuf);
2404 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002405
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002406 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002407}
2408#endif
2409
2410/*
2411 * This is used to send a frame or action frame
2412 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002413int wfaStaDevSendFrame(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2414 dutCommand_t* cmd = (dutCommand_t*)caCmdBuf;
2415 /* uncomment it if needed */
2416 // char *ifname = cmd->intf;
2417 dutCmdResponse_t* devSendResp = &gGenericResp;
2418 caStaDevSendFrame_t* sf = &cmd->cmdsu.sf;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002419
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002420 DPRINT_INFO(WFA_OUT, "Inside wfaStaDevSendFrame function ...\n");
2421 /* processing the frame */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002422
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002423 switch (sf->program) {
2424 case PROG_TYPE_PMF: {
2425 pmfFrame_t* pmf = &sf->frameType.pmf;
2426 switch (pmf->eFrameName) {
2427 case PMF_TYPE_DISASSOC: {
2428 /* use the protected to set what type of key to send */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002429
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002430 } break;
2431 case PMF_TYPE_DEAUTH: {
2432 } break;
2433 case PMF_TYPE_SAQUERY: {
2434 } break;
2435 case PMF_TYPE_AUTH: {
2436 } break;
2437 case PMF_TYPE_ASSOCREQ: {
2438 } break;
2439 case PMF_TYPE_REASSOCREQ: {
2440 } break;
2441 }
2442 } break;
2443 case PROG_TYPE_TDLS: {
2444 tdlsFrame_t* tdls = &sf->frameType.tdls;
2445 switch (tdls->eFrameName) {
Dake Zhao0a832172015-01-06 11:08:47 -08002446 case TDLS_TYPE_DISCOVERY:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002447 /* use the peer mac address to send the frame */
2448 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002449 case TDLS_TYPE_SETUP:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002450 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002451 case TDLS_TYPE_TEARDOWN:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002452 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002453 case TDLS_TYPE_CHANNELSWITCH:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002454 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002455 case TDLS_TYPE_NULLFRAME:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002456 break;
2457 }
2458 } break;
2459 case PROG_TYPE_VENT: {
2460 ventFrame_t* vent = &sf->frameType.vent;
2461 switch (vent->type) {
Dake Zhao0a832172015-01-06 11:08:47 -08002462 case VENT_TYPE_NEIGREQ:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002463 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002464 case VENT_TYPE_TRANSMGMT:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002465 break;
2466 }
2467 } break;
2468 case PROG_TYPE_WFD: {
2469 wfdFrame_t* wfd = &sf->frameType.wfd;
2470 switch (wfd->eframe) {
2471 case WFD_FRAME_PRBREQ: {
2472 /* send probe req */
2473 } break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002474
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002475 case WFD_FRAME_PRBREQ_TDLS_REQ: {
2476 /* send tunneled tdls probe req */
2477 } break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002478
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002479 case WFD_FRAME_11V_TIMING_MSR_REQ: {
2480 /* send 11v timing mearurement request */
2481 } break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002482
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002483 case WFD_FRAME_RTSP: {
2484 /* send WFD RTSP messages*/
2485 // fetch the type of RTSP message and send it.
2486 switch (wfd->eRtspMsgType) {
Dake Zhao0a832172015-01-06 11:08:47 -08002487 case WFD_RTSP_PAUSE:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002488 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002489 case WFD_RTSP_PLAY:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002490 //send RTSP PLAY
2491 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002492 case WFD_RTSP_TEARDOWN:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002493 //send RTSP TEARDOWN
2494 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002495 case WFD_RTSP_TRIG_PAUSE:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002496 //send RTSP TRIGGER PAUSE
2497 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002498 case WFD_RTSP_TRIG_PLAY:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002499 //send RTSP TRIGGER PLAY
2500 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002501 case WFD_RTSP_TRIG_TEARDOWN:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002502 //send RTSP TRIGGER TEARDOWN
2503 break;
Dake Zhao0a832172015-01-06 11:08:47 -08002504 case WFD_RTSP_SET_PARAMETER:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002505 //send RTSP SET PARAMETER
2506 if (wfd->eSetParams == WFD_CAP_UIBC_KEYBOARD) {
2507 //send RTSP SET PARAMETER message for UIBC keyboard
2508 }
2509 if (wfd->eSetParams == WFD_CAP_UIBC_MOUSE) {
2510 //send RTSP SET PARAMETER message for UIBC Mouse
2511 } else if (wfd->eSetParams == WFD_CAP_RE_NEGO) {
2512 //send RTSP SET PARAMETER message Capability re-negotiation
2513 } else if (wfd->eSetParams == WFD_STANDBY) {
2514 //send RTSP SET PARAMETER message for standby
2515 } else if (wfd->eSetParams == WFD_UIBC_SETTINGS_ENABLE) {
2516 //send RTSP SET PARAMETER message for UIBC settings enable
2517 } else if (wfd->eSetParams == WFD_UIBC_SETTINGS_DISABLE) {
2518 //send RTSP SET PARAMETER message for UIBC settings disable
2519 } else if (wfd->eSetParams == WFD_ROUTE_AUDIO) {
2520 //send RTSP SET PARAMETER message for route audio
2521 } else if (wfd->eSetParams == WFD_3D_VIDEOPARAM) {
2522 //send RTSP SET PARAMETER message for 3D video parameters
2523 } else if (wfd->eSetParams == WFD_2D_VIDEOPARAM) {
2524 //send RTSP SET PARAMETER message for 2D video parameters
2525 }
2526 break;
2527 }
2528 } break;
2529 }
2530 } break;
Dake Zhao0a832172015-01-06 11:08:47 -08002531 /* not need to support HS2 release 1, due to very short time period */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002532 case PROG_TYPE_HS2_R2: {
2533 /* type of frames */
2534 hs2Frame_t* hs2 = &sf->frameType.hs2_r2;
2535 switch (hs2->eframe) {
2536 case HS2_FRAME_ANQPQuery: {
2537 } break;
2538 case HS2_FRAME_DLSRequest: {
2539 } break;
2540 case HS2_FRAME_GARPReq: {
2541 } break;
2542 case HS2_FRAME_GARPRes: {
2543 } break;
2544 case HS2_FRAME_NeighAdv: {
2545 }
2546 case HS2_FRAME_ARPProbe: {
2547 }
2548 case HS2_FRAME_ARPAnnounce: {
2549 } break;
2550 case HS2_FRAME_NeighSolicitReq: {
2551 } break;
2552 case HS2_FRAME_ARPReply: {
2553 } break;
2554 }
Dake Zhao97708202014-11-26 13:59:04 -08002555
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002556 } /* PROG_TYPE_HS2-R2 */
2557 case PROG_TYPE_GEN: {
2558 /* General frames */
Dake Zhao0a832172015-01-06 11:08:47 -08002559 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002560 }
2561 devSendResp->status = STATUS_COMPLETE;
2562 wfaEncodeTLV(WFA_STA_DEV_SEND_FRAME_RESP_TLV, 4, (BYTE*)devSendResp, respBuf);
2563 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -08002564
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002565 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002566}
2567
2568/*
2569 * This is used to set a temporary MAC address of an interface
2570 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002571int wfaStaSetMacAddr(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2572 // Uncomment it if needed
2573 //dutCommand_t *cmd = (dutCommand_t *)caCmdBuf;
2574 // char *ifname = cmd->intf;
2575 dutCmdResponse_t* staCmdResp = &gGenericResp;
2576 // Uncomment it if needed
2577 //char *macaddr = &cmd->cmdsu.macaddr[0];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002578
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002579 wfaEncodeTLV(WFA_STA_SET_MAC_ADDRESS_RESP_TLV, 4, (BYTE*)staCmdResp, respBuf);
2580 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002581
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002582 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002583}
2584
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002585int wfaStaDisconnect(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2586 //dutCommand_t *disc = (dutCommand_t *)caCmdBuf;
2587 //char *intf = disc->intf;
2588 dutCmdResponse_t* staDiscResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002589
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002590 // stop the supplicant
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002591
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002592 staDiscResp->status = STATUS_COMPLETE;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002593
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002594 wfaEncodeTLV(WFA_STA_DISCONNECT_RESP_TLV, 4, (BYTE*)staDiscResp, respBuf);
2595 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002596
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002597 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002598}
2599
2600/* Execute CLI, read the status from Environment variable */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002601int wfaExecuteCLI(char* CLI) {
2602 char* retstr;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002603
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002604 sret = systemWithLog(CLI);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002605
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002606 retstr = getenv("WFA_CLI_STATUS");
2607 printf("cli status %s\n", retstr);
2608 return atoi(retstr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002609}
2610
2611/* Supporting Functions */
2612
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002613void wfaSendPing(tgPingStart_t* staPing, float* interval, int streamid) {
2614 int totalpkts, tos = -1;
2615 char cmdStr[256];
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002616// char *addr = staPing->dipaddr;
2617#ifdef WFA_PC_CONSOLE
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002618 char addr[40];
2619 char bflag[] = "-b";
2620 char* tmpstr;
2621 int inum = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002622#else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002623 char bflag[] = " ";
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002624#endif
Dake Zhao0a832172015-01-06 11:08:47 -08002625
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002626 totalpkts = (int)(staPing->duration * staPing->frameRate);
Dake Zhao0a832172015-01-06 11:08:47 -08002627
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002628#ifdef WFA_PC_CONSOLE
2629
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002630 printf("\nwfa_cs.c wfaSendPing CS : The Stream ID is %d", streamid);
2631
2632 strcpy(addr, staPing->dipaddr);
2633 printf("\nCS :the addr is %s ", addr);
2634 printf("\nCS :Inside the WFA_PC_CONSLE BLOCK");
2635 printf("\nCS :the addr is %s ", addr);
2636 if (staPing->iptype == 2) {
2637 memset(bflag, 0, strlen(bflag));
2638 } else {
2639 tmpstr = strtok(addr, ".");
2640 inum = atoi(tmpstr);
2641
2642 printf("interval %f\n", *interval);
2643
2644 if (inum >= 224 && inum <= 239) // multicast
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002645 {
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002646 } else // if not MC, check if it is BC address
2647 {
2648 printf("\nCS :Inside the BC address BLOCK");
2649 printf("\nCS :the inum %d", inum);
2650 strtok(NULL, ".");
2651 //strtok(NULL, ".");
2652 tmpstr = strtok(NULL, ".");
2653 printf("tmpstr %s\n", tmpstr);
2654 inum = atoi(tmpstr);
2655 printf("\nCS : The string is %s", tmpstr);
2656 if (inum != 255)
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002657 memset(bflag, 0, strlen(bflag));
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002658 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002659 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002660#endif
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002661 if (staPing->dscp >= 0) {
2662 tos = convertDscpToTos(staPing->dscp);
2663 if (tos < 0)
2664 printf("\nwfaSendPing invalid tos converted, dscp=%d", staPing->dscp);
2665 }
2666 printf("\nwfa_cs.c wfaSendPing : The Stream ID=%d IPtype=%i\n", streamid,
2667 staPing->iptype);
2668 printf("IPtype : %i tos=%d", staPing->iptype, tos);
Dake Zhao0a832172015-01-06 11:08:47 -08002669
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002670 if (staPing->iptype == 2) {
2671 if (tos > 0)
2672 sprintf(cmdStr,
2673 "echo streamid=%i > /tmp/spout_%d.txt;wfaping6.sh %s %s -i %f -c "
2674 "%i -Q %d -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2675 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2676 tos, staPing->frameSize, streamid);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08002677 else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002678 sprintf(cmdStr,
2679 "echo streamid=%i > /tmp/spout_%d.txt;wfaping6.sh %s %s -i %f -c "
2680 "%i -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2681 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2682 staPing->frameSize, streamid);
Wojciech Jakobczyk317dc712020-08-27 12:46:16 +02002683 sret = systemWithLog(cmdStr);
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002684 printf("\nCS : The command string is %s", cmdStr);
2685 } else {
2686 if (tos > 0)
2687 sprintf(cmdStr,
2688 "echo streamid=%i > /tmp/spout_%d.txt;wfaping.sh %s %s -i %f -c "
2689 "%i -Q %d -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2690 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2691 tos, staPing->frameSize, streamid);
2692 else
2693 sprintf(cmdStr,
2694 "echo streamid=%i > /tmp/spout_%d.txt;wfaping.sh %s %s -i %f -c "
2695 "%i -s %i -q >> /tmp/spout_%d.txt 2>/dev/null",
2696 streamid, streamid, bflag, staPing->dipaddr, *interval, totalpkts,
2697 staPing->frameSize, streamid);
2698 sret = systemWithLog(cmdStr);
2699 printf("\nCS : The command string is %s", cmdStr);
2700 }
2701 sprintf(cmdStr, "updatepid.sh /tmp/spout_%d.txt", streamid);
2702 sret = systemWithLog(cmdStr);
2703 printf("\nCS : The command string is %s", cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002704}
2705
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002706int wfaStopPing(dutCmdResponse_t* stpResp, int streamid) {
2707 char strout[256];
2708 FILE* tmpfile = NULL;
2709 char cmdStr[128];
2710 printf("\nwfa_cs.c wfaStopPing:: stream id=%d\n", streamid);
2711 sprintf(cmdStr, "getpid.sh /tmp/spout_%d.txt /tmp/pid.txt", streamid);
2712 sret = systemWithLog(cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002713
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002714 printf("\nCS : The command string is %s", cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002715
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002716 sret = systemWithLog("stoping.sh /tmp/pid.txt ; sleep 2");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002717
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002718 sprintf(cmdStr, "getpstats.sh /tmp/spout_%d.txt", streamid);
2719 sret = systemWithLog(cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002720
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002721 printf("\nCS : The command string is %s", cmdStr);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002722
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002723 tmpfile = fopen("/tmp/stpsta.txt", "r+");
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002724
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002725 if (tmpfile == NULL) {
2726 return WFA_FAILURE;
2727 }
2728
2729 if (fscanf(tmpfile, "%s", strout) != EOF) {
2730 if (*strout == '\0') {
2731 stpResp->cmdru.pingStp.sendCnt = 0;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002732 }
2733
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002734 else
2735 stpResp->cmdru.pingStp.sendCnt = atoi(strout);
2736 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002737
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002738 printf("\nwfaStopPing after scan sent count %i\n",
2739 stpResp->cmdru.pingStp.sendCnt);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002740
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002741 if (fscanf(tmpfile, "%s", strout) != EOF) {
2742 if (*strout == '\0') {
2743 stpResp->cmdru.pingStp.repliedCnt = 0;
2744 } else
2745 stpResp->cmdru.pingStp.repliedCnt = atoi(strout);
2746 }
2747 printf("wfaStopPing after scan replied count %i\n",
2748 stpResp->cmdru.pingStp.repliedCnt);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002749
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002750 fclose(tmpfile);
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002751
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002752 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00002753}
2754
Ankur Vachhanic485b712012-02-15 23:29:49 +00002755/*
Dake Zhao0a832172015-01-06 11:08:47 -08002756 * wfaStaGetP2pDevAddress():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002757 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002758int wfaStaGetP2pDevAddress(int len,
2759 BYTE* caCmdBuf,
2760 int* respLen,
2761 BYTE* respBuf) {
2762 dutCmdResponse_t infoResp;
2763 /* dutCommand_t *getInfo = (dutCommand_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002764
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002765 printf("\n Entry wfaStaGetP2pDevAddress... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002766
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002767 // Fetch the device ID and store into infoResp->cmdru.devid
2768 //strcpy(infoResp->cmdru.devid, str);
2769 strcpy(&infoResp.cmdru.devid[0], "ABCDEFGH");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002770
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002771 infoResp.status = STATUS_COMPLETE;
2772 wfaEncodeTLV(WFA_STA_P2P_GET_DEV_ADDRESS_RESP_TLV, sizeof(infoResp),
2773 (BYTE*)&infoResp, respBuf);
2774 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002775
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002776 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002777}
2778
Ankur Vachhanic485b712012-02-15 23:29:49 +00002779/*
Dake Zhao0a832172015-01-06 11:08:47 -08002780 * wfaStaSetP2p():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002781 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002782int wfaStaSetP2p(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2783 dutCmdResponse_t infoResp;
2784 /* caStaSetP2p_t *getStaSetP2p = (caStaSetP2p_t *)caCmdBuf; uncomment and use it*/
Ankur Vachhanic485b712012-02-15 23:29:49 +00002785
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002786 printf("\n Entry wfaStaSetP2p... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002787
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002788 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002789
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002790 infoResp.status = STATUS_COMPLETE;
2791 wfaEncodeTLV(WFA_STA_P2P_SETP2P_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
2792 respBuf);
2793 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002794
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002795 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002796}
2797/*
Dake Zhao0a832172015-01-06 11:08:47 -08002798 * wfaStaP2pConnect():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002799 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002800int wfaStaP2pConnect(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2801 dutCmdResponse_t infoResp;
2802 /* caStaP2pConnect_t *getStaP2pConnect = (caStaP2pConnect_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002803
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002804 printf("\n Entry wfaStaP2pConnect... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002805
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002806 // Implement the function and does not return anything.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002807
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002808 infoResp.status = STATUS_COMPLETE;
2809 wfaEncodeTLV(WFA_STA_P2P_CONNECT_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
2810 respBuf);
2811 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00002812
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002813 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002814}
2815
2816/*
Dake Zhao0a832172015-01-06 11:08:47 -08002817 * wfaStaStartAutoGo():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002818 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002819int wfaStaStartAutoGo(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2820 dutCmdResponse_t infoResp;
2821 //caStaStartAutoGo_t *getStaStartAutoGo = (caStaStartAutoGo_t *)caCmdBuf;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002822
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002823 printf("\n Entry wfaStaStartAutoGo... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002824
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002825 // Fetch the group ID and store into infoResp->cmdru.grpid
2826 strcpy(&infoResp.cmdru.grpid[0], "ABCDEFGH");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002827
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002828 infoResp.status = STATUS_COMPLETE;
2829 wfaEncodeTLV(WFA_STA_P2P_START_AUTO_GO_RESP_TLV, sizeof(infoResp),
2830 (BYTE*)&infoResp, respBuf);
2831 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002832
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002833 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002834}
2835
Ankur Vachhanic485b712012-02-15 23:29:49 +00002836/*
Dake Zhao0a832172015-01-06 11:08:47 -08002837 * wfaStaP2pStartGrpFormation():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002838 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002839int wfaStaP2pStartGrpFormation(int len,
2840 BYTE* caCmdBuf,
2841 int* respLen,
2842 BYTE* respBuf) {
2843 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002844
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002845 printf("\n Entry wfaStaP2pStartGrpFormation... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002846
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002847 strcpy(infoResp.cmdru.grpFormInfo.result, "CLIENT");
2848 strcpy(infoResp.cmdru.grpFormInfo.grpId, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002849
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002850 infoResp.status = STATUS_COMPLETE;
2851 wfaEncodeTLV(WFA_STA_P2P_START_GRP_FORMATION_RESP_TLV, sizeof(infoResp),
2852 (BYTE*)&infoResp, respBuf);
2853 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00002854
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002855 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002856}
2857
Ankur Vachhanic485b712012-02-15 23:29:49 +00002858/*
Dake Zhao0a832172015-01-06 11:08:47 -08002859 * wfaStaP2pDissolve():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002860 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002861int wfaStaP2pDissolve(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2862 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002863
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002864 printf("\n Entry wfaStaP2pDissolve... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002865
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002866 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002867
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002868 infoResp.status = STATUS_COMPLETE;
2869 wfaEncodeTLV(WFA_STA_P2P_DISSOLVE_RESP_TLV, sizeof(infoResp),
2870 (BYTE*)&infoResp, respBuf);
2871 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002872
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002873 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002874}
2875
2876/*
Dake Zhao0a832172015-01-06 11:08:47 -08002877 * wfaStaSendP2pInvReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002878 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002879int wfaStaSendP2pInvReq(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2880 dutCmdResponse_t infoResp;
2881 /* caStaSendP2pInvReq_t *getStaP2pInvReq= (caStaSendP2pInvReq_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002882
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002883 printf("\n Entry wfaStaSendP2pInvReq... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002884
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002885 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002886
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002887 infoResp.status = STATUS_COMPLETE;
2888 wfaEncodeTLV(WFA_STA_P2P_SEND_INV_REQ_RESP_TLV, sizeof(infoResp),
2889 (BYTE*)&infoResp, respBuf);
2890 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002891
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002892 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002893}
2894
Ankur Vachhanic485b712012-02-15 23:29:49 +00002895/*
Dake Zhao0a832172015-01-06 11:08:47 -08002896 * wfaStaAcceptP2pInvReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002897 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002898int wfaStaAcceptP2pInvReq(int len,
2899 BYTE* caCmdBuf,
2900 int* respLen,
2901 BYTE* respBuf) {
2902 dutCmdResponse_t infoResp;
2903 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08002904 * caStaAcceptP2pInvReq_t *getStaP2pInvReq= (caStaAcceptP2pInvReq_t *)caCmdBuf;
2905 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002906
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002907 printf("\n Entry wfaStaAcceptP2pInvReq... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002908
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002909 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002910
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002911 infoResp.status = STATUS_COMPLETE;
2912 wfaEncodeTLV(WFA_STA_P2P_ACCEPT_INV_REQ_RESP_TLV, sizeof(infoResp),
2913 (BYTE*)&infoResp, respBuf);
2914 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002915
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002916 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002917}
2918
Ankur Vachhanic485b712012-02-15 23:29:49 +00002919/*
Dake Zhao0a832172015-01-06 11:08:47 -08002920 * wfaStaSendP2pProvDisReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002921 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002922int wfaStaSendP2pProvDisReq(int len,
2923 BYTE* caCmdBuf,
2924 int* respLen,
2925 BYTE* respBuf) {
2926 dutCmdResponse_t infoResp;
2927 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08002928 * caStaSendP2pProvDisReq_t *getStaP2pProvDisReq= (caStaSendP2pProvDisReq_t *)caCmdBuf;
2929 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002930
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002931 printf("\n Entry wfaStaSendP2pProvDisReq... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002932
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002933 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002934
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002935 infoResp.status = STATUS_COMPLETE;
2936 wfaEncodeTLV(WFA_STA_P2P_SEND_PROV_DIS_REQ_RESP_TLV, sizeof(infoResp),
2937 (BYTE*)&infoResp, respBuf);
2938 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002939
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002940 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002941}
2942
2943/*
Dake Zhao0a832172015-01-06 11:08:47 -08002944 * wfaStaSetWpsPbc():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002945 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002946int wfaStaSetWpsPbc(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2947 dutCmdResponse_t infoResp;
2948 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08002949 * caStaSetWpsPbc_t *getStaSetWpsPbc= (caStaSetWpsPbc_t *)caCmdBuf;
2950 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002951
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002952 printf("\n Entry wfaStaSetWpsPbc... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002953
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002954 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00002955
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002956 infoResp.status = STATUS_COMPLETE;
2957 wfaEncodeTLV(WFA_STA_WPS_SETWPS_PBC_RESP_TLV, sizeof(infoResp),
2958 (BYTE*)&infoResp, respBuf);
2959 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08002960
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002961 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002962}
2963
2964/*
Dake Zhao0a832172015-01-06 11:08:47 -08002965 * wfaStaWpsReadPin():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002966 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002967int wfaStaWpsReadPin(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2968 dutCmdResponse_t infoResp;
2969 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08002970 * caStaWpsReadPin_t *getStaWpsReadPin= (caStaWpsReadPin_t *)caCmdBuf;
2971 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00002972
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002973 printf("\n Entry wfaStaWpsReadPin... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002974
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002975 // Fetch the device PIN and put in infoResp->cmdru.wpsPin
2976 //strcpy(infoResp->cmdru.wpsPin, "12345678");
2977 strcpy(&infoResp.cmdru.wpsPin[0], "1234456");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002978
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002979 infoResp.status = STATUS_COMPLETE;
2980 wfaEncodeTLV(WFA_STA_WPS_READ_PIN_RESP_TLV, sizeof(infoResp),
2981 (BYTE*)&infoResp, respBuf);
2982 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00002983
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002984 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002985}
2986
Ankur Vachhanic485b712012-02-15 23:29:49 +00002987/*
Dake Zhao0a832172015-01-06 11:08:47 -08002988 * wfaStaWpsReadLabel():
Ankur Vachhanic485b712012-02-15 23:29:49 +00002989 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002990int wfaStaWpsReadLabel(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
2991 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00002992
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002993 printf("\n Entry wfaStaWpsReadLabel... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002994
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002995 // Fetch the device Label and put in infoResp->cmdru.wpsPin
2996 //strcpy(infoResp->cmdru.wpsPin, "12345678");
2997 strcpy(&infoResp.cmdru.wpsPin[0], "1234456");
Ankur Vachhanic485b712012-02-15 23:29:49 +00002998
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08002999 infoResp.status = STATUS_COMPLETE;
3000 wfaEncodeTLV(WFA_STA_WPS_READ_PIN_RESP_TLV, sizeof(infoResp),
3001 (BYTE*)&infoResp, respBuf);
3002 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003003
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003004 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003005}
3006
Ankur Vachhanic485b712012-02-15 23:29:49 +00003007/*
Dake Zhao0a832172015-01-06 11:08:47 -08003008 * wfaStaWpsEnterPin():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003009 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003010int wfaStaWpsEnterPin(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3011 dutCmdResponse_t infoResp;
3012 /* uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003013 * caStaWpsEnterPin_t *getStaWpsEnterPin= (caStaWpsEnterPin_t *)caCmdBuf;
3014 */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003015
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003016 printf("\n Entry wfaStaWpsEnterPin... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003017
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003018 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003019
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003020 infoResp.status = STATUS_COMPLETE;
3021 wfaEncodeTLV(WFA_STA_WPS_ENTER_PIN_RESP_TLV, sizeof(infoResp),
3022 (BYTE*)&infoResp, respBuf);
3023 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003024
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003025 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003026}
3027
Ankur Vachhanic485b712012-02-15 23:29:49 +00003028/*
Dake Zhao0a832172015-01-06 11:08:47 -08003029 * wfaStaGetPsk():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003030 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003031int wfaStaGetPsk(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3032 dutCmdResponse_t infoResp;
3033 /* caStaGetPsk_t *getStaGetPsk= (caStaGetPsk_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003034
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003035 printf("\n Entry wfaStaGetPsk... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003036
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003037 // Fetch the device PP and SSID and put in infoResp->cmdru.pskInfo
3038 strcpy(&infoResp.cmdru.pskInfo.passPhrase[0], "1234456");
3039 strcpy(&infoResp.cmdru.pskInfo.ssid[0], "WIFI_DIRECT");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003040
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003041 infoResp.status = STATUS_COMPLETE;
3042 wfaEncodeTLV(WFA_STA_P2P_GET_PSK_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3043 respBuf);
3044 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003045
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003046 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003047}
3048
3049/*
Dake Zhao0a832172015-01-06 11:08:47 -08003050 * wfaStaP2pReset():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003051 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003052int wfaStaP2pReset(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3053 dutCmdResponse_t infoResp;
3054 /* dutCommand_t *getStaP2pReset= (dutCommand_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003055
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003056 printf("\n Entry wfaStaP2pReset... ");
3057 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003058
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003059 infoResp.status = STATUS_COMPLETE;
3060 wfaEncodeTLV(WFA_STA_P2P_RESET_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3061 respBuf);
3062 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003063
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003064 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003065}
3066
Ankur Vachhanic485b712012-02-15 23:29:49 +00003067/*
Dake Zhao0a832172015-01-06 11:08:47 -08003068 * wfaStaGetP2pIpConfig():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003069 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003070int wfaStaGetP2pIpConfig(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3071 dutCmdResponse_t infoResp;
3072 /* caStaGetP2pIpConfig_t *staGetP2pIpConfig= (caStaGetP2pIpConfig_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003073
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003074 caStaGetIpConfigResp_t* ifinfo = &(infoResp.cmdru.getIfconfig);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003075
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003076 printf("\n Entry wfaStaGetP2pIpConfig... ");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003077
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003078 ifinfo->isDhcp = 0;
3079 strcpy(&(ifinfo->ipaddr[0]), "192.165.100.111");
3080 strcpy(&(ifinfo->mask[0]), "255.255.255.0");
3081 strcpy(&(ifinfo->dns[0][0]), "192.165.100.1");
3082 strcpy(&(ifinfo->mac[0]), "ba:ba:ba:ba:ba:ba");
Dake Zhao0a832172015-01-06 11:08:47 -08003083
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003084 infoResp.status = STATUS_COMPLETE;
3085 wfaEncodeTLV(WFA_STA_P2P_GET_IP_CONFIG_RESP_TLV, sizeof(infoResp),
3086 (BYTE*)&infoResp, respBuf);
3087 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003088
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003089 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003090}
3091
Ankur Vachhanic485b712012-02-15 23:29:49 +00003092/*
Dake Zhao0a832172015-01-06 11:08:47 -08003093 * wfaStaSendServiceDiscoveryReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003094 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003095int wfaStaSendServiceDiscoveryReq(int len,
3096 BYTE* caCmdBuf,
3097 int* respLen,
3098 BYTE* respBuf) {
3099 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003100
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003101 printf("\n Entry wfaStaSendServiceDiscoveryReq... ");
3102 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003103
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003104 infoResp.status = STATUS_COMPLETE;
3105 wfaEncodeTLV(WFA_STA_P2P_SEND_SERVICE_DISCOVERY_REQ_RESP_TLV,
3106 sizeof(infoResp), (BYTE*)&infoResp, respBuf);
3107 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003108
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003109 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003110}
3111
Ankur Vachhanic485b712012-02-15 23:29:49 +00003112/*
Dake Zhao0a832172015-01-06 11:08:47 -08003113 * wfaStaSendP2pPresenceReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003114 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003115int wfaStaSendP2pPresenceReq(int len,
3116 BYTE* caCmdBuf,
3117 int* respLen,
3118 BYTE* respBuf) {
3119 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003120
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003121 infoResp.status = STATUS_COMPLETE;
3122 wfaEncodeTLV(WFA_STA_P2P_SEND_PRESENCE_REQ_RESP_TLV, sizeof(infoResp),
3123 (BYTE*)&infoResp, respBuf);
3124 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003125
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003126 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003127}
3128
3129/*
Dake Zhao0a832172015-01-06 11:08:47 -08003130 * wfaStaSetSleepReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003131 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003132int wfaStaSetSleepReq(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3133 dutCmdResponse_t infoResp;
3134 /* caStaSetSleep_t *staSetSleepReq= (caStaSetSleep_t *)caCmdBuf; */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003135
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003136 printf("\n Entry wfaStaSetSleepReq... ");
3137 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003138
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003139 infoResp.status = STATUS_COMPLETE;
3140 wfaEncodeTLV(WFA_STA_P2P_SET_SLEEP_RESP_TLV, sizeof(infoResp),
3141 (BYTE*)&infoResp, respBuf);
3142 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -08003143
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003144 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003145}
3146
3147/*
Dake Zhao0a832172015-01-06 11:08:47 -08003148 * wfaStaSetOpportunisticPsReq():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003149 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003150int wfaStaSetOpportunisticPsReq(int len,
3151 BYTE* caCmdBuf,
3152 int* respLen,
3153 BYTE* respBuf) {
3154 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003155
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003156 printf("\n Entry wfaStaSetOpportunisticPsReq... ");
3157 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003158
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003159 infoResp.status = STATUS_COMPLETE;
3160 wfaEncodeTLV(WFA_STA_P2P_SET_OPPORTUNISTIC_PS_RESP_TLV, sizeof(infoResp),
3161 (BYTE*)&infoResp, respBuf);
3162 *respLen = WFA_TLV_HDR_LEN + 4;
Dake Zhao0a832172015-01-06 11:08:47 -08003163
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003164 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003165}
3166#ifndef WFA_STA_TB
3167/*
Dake Zhao0a832172015-01-06 11:08:47 -08003168 * wfaStaPresetParams():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003169 */
3170
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003171int wfaStaPresetParams(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3172 dutCmdResponse_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003173
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003174 DPRINT_INFO(WFA_OUT, "Inside wfaStaPresetParameters function ...\n");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003175
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003176 // Implement the function and its sub commands
3177 infoResp.status = STATUS_COMPLETE;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003178
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003179 wfaEncodeTLV(WFA_STA_PRESET_PARAMETERS_RESP_TLV, 4, (BYTE*)&infoResp,
3180 respBuf);
3181 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003182
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003183 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003184}
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003185int wfaStaSet11n(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3186 dutCmdResponse_t infoResp;
3187 dutCmdResponse_t* v11nParamsResp = &infoResp;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003188
3189#ifdef WFA_11N_SUPPORT_ONLY
Dake Zhao0a832172015-01-06 11:08:47 -08003190
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003191 caSta11n_t* v11nParams = (caSta11n_t*)caCmdBuf;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003192
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003193 int st = 0; // SUCCESS
Dake Zhao0a832172015-01-06 11:08:47 -08003194
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003195 DPRINT_INFO(WFA_OUT, "Inside wfaStaSet11n function....\n");
Ankur Vachhanic485b712012-02-15 23:29:49 +00003196
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003197 if (v11nParams->addba_reject != 0xFF && v11nParams->addba_reject < 2) {
3198 // implement the funciton
3199 if (st != 0) {
3200 v11nParamsResp->status = STATUS_ERROR;
3201 strcpy(v11nParamsResp->cmdru.info, "set_addba_reject failed");
3202 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3203 (BYTE*)v11nParamsResp, respBuf);
3204 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3205 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003206 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003207 }
Dake Zhao0a832172015-01-06 11:08:47 -08003208
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003209 if (v11nParams->ampdu != 0xFF && v11nParams->ampdu < 2) {
3210 // implement the funciton
Ankur Vachhanic485b712012-02-15 23:29:49 +00003211
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003212 if (st != 0) {
3213 v11nParamsResp->status = STATUS_ERROR;
3214 strcpy(v11nParamsResp->cmdru.info, "set_ampdu failed");
3215 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3216 (BYTE*)v11nParamsResp, respBuf);
3217 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3218 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003219 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003220 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003221
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003222 if (v11nParams->amsdu != 0xFF && v11nParams->amsdu < 2) {
3223 // implement the funciton
3224 if (st != 0) {
3225 v11nParamsResp->status = STATUS_ERROR;
3226 strcpy(v11nParamsResp->cmdru.info, "set_amsdu failed");
3227 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3228 (BYTE*)v11nParamsResp, respBuf);
3229 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3230 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003231 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003232 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003233
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003234 if (v11nParams->greenfield != 0xFF && v11nParams->greenfield < 2) {
3235 // implement the funciton
3236 if (st != 0) {
3237 v11nParamsResp->status = STATUS_ERROR;
3238 strcpy(v11nParamsResp->cmdru.info, "_set_greenfield failed");
3239 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3240 (BYTE*)v11nParamsResp, respBuf);
3241 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3242 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003243 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003244 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003245
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003246 if (v11nParams->mcs32 != 0xFF && v11nParams->mcs32 < 2 &&
3247 v11nParams->mcs_fixedrate[0] != '\0') {
3248 // implement the funciton
3249 //st = wfaExecuteCLI(gCmdStr);
3250 if (st != 0) {
3251 v11nParamsResp->status = STATUS_ERROR;
3252 strcpy(v11nParamsResp->cmdru.info, "set_mcs failed");
3253 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3254 (BYTE*)v11nParamsResp, respBuf);
3255 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3256 return FALSE;
Dake Zhao0a832172015-01-06 11:08:47 -08003257 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003258 } else if (v11nParams->mcs32 != 0xFF && v11nParams->mcs32 < 2 &&
3259 v11nParams->mcs_fixedrate[0] == '\0') {
3260 // implement the funciton
3261 //st = wfaExecuteCLI(gCmdStr);
3262 if (st != 0) {
3263 v11nParamsResp->status = STATUS_ERROR;
3264 strcpy(v11nParamsResp->cmdru.info, "set_mcs32 failed");
3265 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3266 (BYTE*)v11nParamsResp, respBuf);
3267 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3268 return FALSE;
Dake Zhao0a832172015-01-06 11:08:47 -08003269 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003270 } else if (v11nParams->mcs32 == 0xFF &&
3271 v11nParams->mcs_fixedrate[0] != '\0') {
3272 // implement the funciton
3273 //st = wfaExecuteCLI(gCmdStr);
3274 if (st != 0) {
3275 v11nParamsResp->status = STATUS_ERROR;
3276 strcpy(v11nParamsResp->cmdru.info, "set_mcs32 failed");
3277 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3278 (BYTE*)v11nParamsResp, respBuf);
3279 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3280 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003281 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003282 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003283
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003284 if (v11nParams->rifs_test != 0xFF && v11nParams->rifs_test < 2) {
3285 // implement the funciton
3286 //st = wfaExecuteCLI(gCmdStr);
3287 if (st != 0) {
3288 v11nParamsResp->status = STATUS_ERROR;
3289 strcpy(v11nParamsResp->cmdru.info, "set_rifs_test failed");
3290 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3291 (BYTE*)v11nParamsResp, respBuf);
3292 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3293 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003294 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003295 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003296
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003297 if (v11nParams->sgi20 != 0xFF && v11nParams->sgi20 < 2) {
3298 // implement the funciton
3299 //st = wfaExecuteCLI(gCmdStr);
3300 if (st != 0) {
3301 v11nParamsResp->status = STATUS_ERROR;
3302 strcpy(v11nParamsResp->cmdru.info, "set_sgi20 failed");
3303 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3304 (BYTE*)v11nParamsResp, respBuf);
3305 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3306 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003307 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003308 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003309
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003310 if (v11nParams->smps != 0xFFFF) {
3311 if (v11nParams->smps == 0) {
3312 // implement the funciton
3313 //st = wfaExecuteCLI(gCmdStr);
3314 } else if (v11nParams->smps == 1) {
3315 // implement the funciton
3316 //st = wfaExecuteCLI(gCmdStr);
3317 ;
3318 } else if (v11nParams->smps == 2) {
3319 // implement the funciton
3320 //st = wfaExecuteCLI(gCmdStr);
3321 ;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003322 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003323 if (st != 0) {
3324 v11nParamsResp->status = STATUS_ERROR;
3325 strcpy(v11nParamsResp->cmdru.info, "set_smps failed");
3326 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3327 (BYTE*)v11nParamsResp, respBuf);
3328 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3329 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003330 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003331 }
Dake Zhao0a832172015-01-06 11:08:47 -08003332
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003333 if (v11nParams->stbc_rx != 0xFFFF) {
3334 // implement the funciton
3335 //st = wfaExecuteCLI(gCmdStr);
3336 if (st != 0) {
3337 v11nParamsResp->status = STATUS_ERROR;
3338 strcpy(v11nParamsResp->cmdru.info, "set_stbc_rx failed");
3339 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3340 (BYTE*)v11nParamsResp, respBuf);
3341 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3342 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003343 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003344 }
Dake Zhao0a832172015-01-06 11:08:47 -08003345
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003346 if (v11nParams->width[0] != '\0') {
3347 // implement the funciton
3348 //st = wfaExecuteCLI(gCmdStr);
3349 if (st != 0) {
3350 v11nParamsResp->status = STATUS_ERROR;
3351 strcpy(v11nParamsResp->cmdru.info, "set_11n_channel_width failed");
3352 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3353 (BYTE*)v11nParamsResp, respBuf);
3354 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3355 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003356 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003357 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003358
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003359 if (v11nParams->_40_intolerant != 0xFF && v11nParams->_40_intolerant < 2) {
3360 // implement the funciton
3361 //st = wfaExecuteCLI(gCmdStr);
3362 if (st != 0) {
3363 v11nParamsResp->status = STATUS_ERROR;
3364 strcpy(v11nParamsResp->cmdru.info, "set_40_intolerant failed");
3365 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3366 (BYTE*)v11nParamsResp, respBuf);
3367 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3368 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003369 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003370 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003371
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003372 if (v11nParams->txsp_stream != 0 && v11nParams->txsp_stream < 4) {
3373 // implement the funciton
3374 //st = wfaExecuteCLI(gCmdStr);
3375 if (st != 0) {
3376 v11nParamsResp->status = STATUS_ERROR;
3377 strcpy(v11nParamsResp->cmdru.info, "set_txsp_stream failed");
3378 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3379 (BYTE*)v11nParamsResp, respBuf);
3380 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3381 return FALSE;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003382 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003383 }
3384
3385 if (v11nParams->rxsp_stream != 0 && v11nParams->rxsp_stream < 4) {
3386 // implement the funciton
3387 //st = wfaExecuteCLI(gCmdStr);
3388 if (st != 0) {
3389 v11nParamsResp->status = STATUS_ERROR;
3390 strcpy(v11nParamsResp->cmdru.info, "set_rxsp_stream failed");
3391 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, sizeof(dutCmdResponse_t),
3392 (BYTE*)v11nParamsResp, respBuf);
3393 *respLen = WFA_TLV_HDR_LEN + sizeof(dutCmdResponse_t);
3394 return FALSE;
3395 }
3396 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003397
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003398#endif
Ankur Vachhanic485b712012-02-15 23:29:49 +00003399
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003400 v11nParamsResp->status = STATUS_COMPLETE;
3401 wfaEncodeTLV(WFA_STA_SET_11N_RESP_TLV, 4, (BYTE*)v11nParamsResp, respBuf);
3402 *respLen = WFA_TLV_HDR_LEN + 4;
3403 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003404}
3405#endif
3406/*
Dake Zhao0a832172015-01-06 11:08:47 -08003407 * wfaStaAddArpTableEntry():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003408 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003409int wfaStaAddArpTableEntry(int len,
3410 BYTE* caCmdBuf,
3411 int* respLen,
3412 BYTE* respBuf) {
3413 dutCmdResponse_t infoResp;
3414 /* caStaAddARPTableEntry_t *staAddARPTableEntry= (caStaAddARPTableEntry_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003415
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003416 printf("\n Entry wfastaAddARPTableEntry... ");
3417 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003418
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003419 infoResp.status = STATUS_COMPLETE;
3420 wfaEncodeTLV(WFA_STA_P2P_ADD_ARP_TABLE_ENTRY_RESP_TLV, sizeof(infoResp),
3421 (BYTE*)&infoResp, respBuf);
3422 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003423
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003424 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003425}
3426
3427/*
Dake Zhao0a832172015-01-06 11:08:47 -08003428 * wfaStaBlockICMPResponse():
Ankur Vachhanic485b712012-02-15 23:29:49 +00003429 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003430int wfaStaBlockICMPResponse(int len,
3431 BYTE* caCmdBuf,
3432 int* respLen,
3433 BYTE* respBuf) {
3434 dutCmdResponse_t infoResp;
3435 /* caStaBlockICMPResponse_t *staAddARPTableEntry= (caStaBlockICMPResponse_t *)caCmdBuf; uncomment and use it */
Ankur Vachhanic485b712012-02-15 23:29:49 +00003436
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003437 printf("\n Entry wfaStaBlockICMPResponse... ");
3438 // Implement the function and this does not return any thing back.
Ankur Vachhanic485b712012-02-15 23:29:49 +00003439
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003440 infoResp.status = STATUS_COMPLETE;
3441 wfaEncodeTLV(WFA_STA_P2P_BLOCK_ICMP_RESPONSE_RESP_TLV, sizeof(infoResp),
3442 (BYTE*)&infoResp, respBuf);
3443 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003444
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003445 return WFA_SUCCESS;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003446}
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003447
3448/*
Dake Zhao0a832172015-01-06 11:08:47 -08003449 * wfaStaSetRadio():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003450 */
3451
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003452int wfaStaSetRadio(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3453 dutCommand_t* setRadio = (dutCommand_t*)caCmdBuf;
3454 dutCmdResponse_t* staCmdResp = &gGenericResp;
3455 caStaSetRadio_t* sr = &setRadio->cmdsu.sr;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003456
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003457 if (sr->mode == WFA_OFF) {
3458 // turn radio off
3459 } else {
3460 // always turn the radio on
3461 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003462
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003463 staCmdResp->status = STATUS_COMPLETE;
3464 wfaEncodeTLV(WFA_STA_SET_RADIO_RESP_TLV, 4, (BYTE*)staCmdResp, respBuf);
3465 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003466
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003467 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003468}
3469
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003470/*
Dake Zhao0a832172015-01-06 11:08:47 -08003471 * wfaStaSetRFeature():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003472 */
3473
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003474int wfaStaSetRFeature(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3475 dutCommand_t* dutCmd = (dutCommand_t*)caCmdBuf;
3476 caStaRFeat_t* rfeat = &dutCmd->cmdsu.rfeat;
3477 dutCmdResponse_t* caResp = &gGenericResp;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003478
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003479 if (strcasecmp(rfeat->prog, "tdls") == 0) {
3480 }
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003481
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003482 caResp->status = STATUS_COMPLETE;
3483 wfaEncodeTLV(WFA_STA_SET_RFEATURE_RESP_TLV, 4, (BYTE*)caResp, respBuf);
3484 *respLen = WFA_TLV_HDR_LEN + 4;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003485
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003486 return WFA_SUCCESS;
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003487}
3488
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003489/*
Dake Zhao0a832172015-01-06 11:08:47 -08003490 * wfaStaStartWfdConnection():
3491 */
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003492int wfaStaStartWfdConnection(int len,
3493 BYTE* caCmdBuf,
3494 int* respLen,
3495 BYTE* respBuf) {
3496 dutCmdResponse_t infoResp;
3497 //caStaStartWfdConn_t *staStartWfdConn= (caStaStartWfdConn_t *)caCmdBuf; //uncomment and use it
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003498
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003499 printf("\n Entry wfaStaStartWfdConnection... ");
Dake Zhao0a832172015-01-06 11:08:47 -08003500
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003501 // Fetch the GrpId and WFD session and return
3502 strcpy(&infoResp.cmdru.wfdConnInfo.wfdSessionId[0], "1234567890");
3503 strcpy(&infoResp.cmdru.wfdConnInfo.p2pGrpId[0], "WIFI_DISPLAY");
3504 strcpy(&infoResp.cmdru.wfdConnInfo.result[0], "GO");
Dake Zhao0a832172015-01-06 11:08:47 -08003505
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003506 infoResp.status = STATUS_COMPLETE;
3507 wfaEncodeTLV(WFA_STA_START_WFD_CONNECTION_RESP_TLV, sizeof(infoResp),
3508 (BYTE*)&infoResp, respBuf);
3509 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003510
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003511 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003512}
3513/*
Dake Zhao0a832172015-01-06 11:08:47 -08003514 * wfaStaCliCommand():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003515 */
Ankur Vachhanie1b4fbc2011-12-26 09:40:02 +00003516
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003517int wfaStaCliCommand(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3518 char cmdName[32];
3519 char *pcmdStr = NULL, *str;
3520 int st = 1;
3521 char CmdStr[WFA_CMD_STR_SZ];
3522 FILE* wfaCliFd;
3523 char wfaCliBuff[64];
3524 char retstr[256];
3525 int CmdReturnFlag = 0;
3526 char tmp[256];
3527 FILE* sh_pipe = NULL;
3528 caStaCliCmdResp_t infoResp;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003529
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003530 printf("\nEntry wfaStaCliCommand; command Received: %s\n", caCmdBuf);
3531 memcpy(cmdName, strtok_r((char*)caCmdBuf, ",", (char**)&pcmdStr), 32);
3532 sprintf(CmdStr, "%s", cmdName);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003533
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003534 for (;;) {
3535 // construct CLI standard cmd string
3536 str = strtok_r(NULL, ",", &pcmdStr);
3537 if (str == NULL || str[0] == '\0')
3538 break;
3539 else {
3540 strcat(strcat(CmdStr, " /"), str);
3541 str = strtok_r(NULL, ",", &pcmdStr);
3542 strcat(strcat(CmdStr, " "), str);
Dake Zhao0a832172015-01-06 11:08:47 -08003543 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003544 }
3545 // check the return process
3546 wfaCliFd = fopen("/etc/WfaEndpoint/wfa_cli.txt", "r");
3547 if (wfaCliFd != NULL) {
3548 while (fgets(wfaCliBuff, 64, wfaCliFd) != NULL) {
3549 //printf("\nLine read from CLI file : %s",wfaCliBuff);
3550 if (ferror(wfaCliFd))
3551 break;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003552
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003553 str = strtok(wfaCliBuff, "-");
3554 if (strcmp(str, cmdName) == 0) {
3555 str = strtok(NULL, ",");
3556 if (str != NULL) {
3557 if (strcmp(str, "TRUE") == 0)
3558 CmdReturnFlag = 1;
3559 } else
3560 printf(
3561 "ERR wfa_cli.txt, inside line format not end with , or missing "
3562 "TRUE/FALSE\n");
3563 break;
3564 }
Dake Zhao0a832172015-01-06 11:08:47 -08003565 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003566 fclose(wfaCliFd);
3567 } else {
3568 printf("/etc/WfaEndpoint/wfa_cli.txt is not exist\n");
3569 goto cleanup;
3570 }
3571
3572 //printf("\n Command Return Flag : %d",CmdReturnFlag);
3573 memset(&retstr[0], '\0', 255);
3574 memset(&tmp[0], '\0', 255);
3575 sprintf(gCmdStr, "%s", CmdStr);
3576 printf("\nCLI Command -- %s\n", gCmdStr);
3577
3578 sh_pipe = popen(gCmdStr, "r");
3579 if (!sh_pipe) {
3580 printf("Error in opening pipe\n");
3581 goto cleanup;
3582 }
3583
3584 sleep(5);
3585 //tmp_val=getdelim(&retstr,255,"\n",sh_pipe);
3586 if (fgets(&retstr[0], 255, sh_pipe) == NULL) {
3587 printf("Getting NULL string in popen return\n");
3588 goto cleanup;
3589 } else
3590 printf("popen return str=%s\n", retstr);
3591
3592 sleep(2);
3593 if (pclose(sh_pipe) == -1) {
3594 printf("Error in closing shell cmd pipe\n");
3595 goto cleanup;
3596 }
3597 sh_pipe = NULL;
3598 sleep(2);
3599
3600 // find status first in output
3601 str = strtok_r((char*)retstr, "-", (char**)&pcmdStr);
3602 if (str != NULL) {
3603 memset(tmp, 0, 10);
3604 memcpy(tmp, str, 2);
3605 printf("cli status=%s\n", tmp);
3606 if (strlen(tmp) > 0)
3607 st = atoi(tmp);
Dake Zhao0a832172015-01-06 11:08:47 -08003608 else
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003609 printf("Missing status code\n");
3610 } else {
3611 printf("wfaStaCliCommand no return code found\n");
3612 }
3613 infoResp.resFlag = CmdReturnFlag;
Dake Zhao0a832172015-01-06 11:08:47 -08003614
Dake Zhao97708202014-11-26 13:59:04 -08003615cleanup:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003616 if (sh_pipe)
3617 pclose(sh_pipe);
Dake Zhao0a832172015-01-06 11:08:47 -08003618
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003619 switch (st) {
Dake Zhao0a832172015-01-06 11:08:47 -08003620 case 0:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003621 infoResp.status = STATUS_COMPLETE;
3622 if (CmdReturnFlag) {
3623 if ((pcmdStr != NULL) && (strlen(pcmdStr) > 0)) {
3624 memset(&(infoResp.result[0]), '\0', WFA_CLI_CMD_RESP_LEN - 1);
3625 strncpy(&infoResp.result[0], pcmdStr,
3626 (strlen(pcmdStr) < WFA_CLI_CMD_RESP_LEN)
3627 ? strlen(pcmdStr)
3628 : (WFA_CLI_CMD_RESP_LEN - 2));
3629 printf("Return CLI result string to CA=%s\n", &(infoResp.result[0]));
3630 } else {
3631 strcpy(&infoResp.result[0], "No return string found\n");
Dake Zhao0a832172015-01-06 11:08:47 -08003632 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003633 }
3634 break;
Dake Zhao0a832172015-01-06 11:08:47 -08003635 case 1:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003636 infoResp.status = STATUS_ERROR;
3637 break;
Dake Zhao0a832172015-01-06 11:08:47 -08003638 case 2:
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003639 infoResp.status = STATUS_INVALID;
3640 break;
3641 }
Ankur Vachhanic485b712012-02-15 23:29:49 +00003642
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003643 wfaEncodeTLV(WFA_STA_CLI_CMD_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3644 respBuf);
3645 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Ankur Vachhanic485b712012-02-15 23:29:49 +00003646
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003647 printf("Exit from wfaStaCliCommand\n");
3648 return TRUE;
Ankur Vachhanic485b712012-02-15 23:29:49 +00003649}
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003650/*
Dake Zhao0a832172015-01-06 11:08:47 -08003651 * wfaStaConnectGoStartWfd():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003652 */
3653
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003654int wfaStaConnectGoStartWfd(int len,
3655 BYTE* caCmdBuf,
3656 int* respLen,
3657 BYTE* respBuf) {
3658 dutCmdResponse_t infoResp;
3659 // caStaConnectGoStartWfd_t *staConnecGoStartWfd= (caStaConnectGoStartWfd_t *)caCmdBuf; //uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003660
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003661 printf("\n Entry wfaStaConnectGoStartWfd... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003662
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003663 // connect the specified GO and then establish the wfd session
Dake Zhao0a832172015-01-06 11:08:47 -08003664
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003665 // Fetch WFD session and return
3666 strcpy(&infoResp.cmdru.wfdConnInfo.wfdSessionId[0], "1234567890");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003667
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003668 infoResp.status = STATUS_COMPLETE;
3669 wfaEncodeTLV(WFA_STA_CONNECT_GO_START_WFD_RESP_TLV, sizeof(infoResp),
3670 (BYTE*)&infoResp, respBuf);
3671 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003672
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003673 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003674}
3675
3676/*
Dake Zhao0a832172015-01-06 11:08:47 -08003677 * wfaStaGenerateEvent():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003678 */
3679
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003680int wfaStaGenerateEvent(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3681 dutCmdResponse_t infoResp;
3682 caStaGenEvent_t* staGenerateEvent =
3683 (caStaGenEvent_t*)caCmdBuf; //uncomment and use it
3684 caWfdStaGenEvent_t* wfdGenEvent;
Dake Zhao0a832172015-01-06 11:08:47 -08003685
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003686 printf("\n Entry wfaStaGenerateEvent... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003687
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003688 // Geneate the specified action and return with complete/error.
3689 if (staGenerateEvent->program == PROG_TYPE_WFD) {
3690 wfdGenEvent = &staGenerateEvent->wfdEvent;
3691 if (wfdGenEvent->type == eUibcGen) {
3692 } else if (wfdGenEvent->type == eUibcHid) {
3693 } else if (wfdGenEvent->type == eFrameSkip) {
3694 } else if (wfdGenEvent->type == eI2cRead) {
3695 } else if (wfdGenEvent->type == eI2cWrite) {
3696 } else if (wfdGenEvent->type == eInputContent) {
3697 } else if (wfdGenEvent->type == eIdrReq) {
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003698 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003699 }
Dake Zhao0a832172015-01-06 11:08:47 -08003700
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003701 infoResp.status = STATUS_COMPLETE;
3702 wfaEncodeTLV(WFA_STA_GENERATE_EVENT_RESP_TLV, sizeof(infoResp),
3703 (BYTE*)&infoResp, respBuf);
3704 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao0a832172015-01-06 11:08:47 -08003705
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003706 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003707}
3708
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003709/*
Dake Zhao0a832172015-01-06 11:08:47 -08003710 * wfaStaReinvokeWfdSession():
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003711 */
3712
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003713int wfaStaReinvokeWfdSession(int len,
3714 BYTE* caCmdBuf,
3715 int* respLen,
3716 BYTE* respBuf) {
3717 dutCmdResponse_t infoResp;
3718 // caStaReinvokeWfdSession_t *staReinvokeSession= (caStaReinvokeWfdSession_t *)caCmdBuf; //uncomment and use it
Dake Zhao0a832172015-01-06 11:08:47 -08003719
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003720 printf("\n Entry wfaStaReinvokeWfdSession... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003721
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003722 // Reinvoke the WFD session by accepting the p2p invitation or sending p2p invitation
Dake Zhao0a832172015-01-06 11:08:47 -08003723
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003724 infoResp.status = STATUS_COMPLETE;
3725 wfaEncodeTLV(WFA_STA_REINVOKE_WFD_SESSION_RESP_TLV, sizeof(infoResp),
3726 (BYTE*)&infoResp, respBuf);
3727 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003728
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003729 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003730}
3731
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003732int wfaStaGetParameter(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3733 dutCmdResponse_t infoResp;
3734 caStaGetParameter_t* staGetParam =
3735 (caStaGetParameter_t*)caCmdBuf; //uncomment and use it
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003736
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003737 caStaGetParameterResp_t* paramList = &infoResp.cmdru.getParamValue;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003738
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003739 printf("\n Entry wfaStaGetParameter... ");
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003740
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003741 // Check the program type
3742 if (staGetParam->program == PROG_TYPE_WFD) {
3743 if (staGetParam->getParamValue == eDiscoveredDevList) {
3744 // Get the discovered devices, make space seperated list and return, check list is not bigger than 128 bytes.
3745 paramList->getParamType = eDiscoveredDevList;
3746 strcpy((char*)&paramList->devList,
3747 "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 -08003748 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003749 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003750
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003751 if (staGetParam->program == PROG_TYPE_WFDS) {
3752 if (staGetParam->getParamValue == eDiscoveredDevList) {
3753 // Get the discovered devices, make space seperated list and return, check list is not bigger than 128 bytes.
3754 paramList->getParamType = eDiscoveredDevList;
3755 strcpy((char*)&paramList->devList,
3756 "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 -07003757 }
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003758 if (staGetParam->getParamValue == eOpenPorts) {
3759 // Run the port checker tool
3760 // Get all the open ports and make space seperated list and return, check list is not bigger than 128 bytes.
3761 paramList->getParamType = eOpenPorts;
3762 strcpy((char*)&paramList->devList, "22 139 445 68 9700");
3763 }
3764 }
3765 if (staGetParam->program == PROG_TYPE_NAN) {
3766 if (staGetParam->getParamValue == eMasterPref) {
3767 // Get the master preference of the device and return the value
3768 paramList->getParamType = eMasterPref;
3769 strcpy((char*)&paramList->masterPref, "0xff");
3770 }
3771 }
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003772
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003773 infoResp.status = STATUS_COMPLETE;
3774 wfaEncodeTLV(WFA_STA_GET_PARAMETER_RESP_TLV, sizeof(infoResp),
3775 (BYTE*)&infoResp, respBuf);
3776 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
3777
3778 return WFA_SUCCESS;
Harsh Madhiwalla8e496e02014-02-25 14:54:53 -08003779}
3780
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003781int wfaStaNfcAction(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3782 dutCmdResponse_t infoResp;
3783 caStaNfcAction_t* getStaNfcAction =
3784 (caStaNfcAction_t*)caCmdBuf; //uncomment and use it
Ankur Vachhanic485b712012-02-15 23:29:49 +00003785
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003786 printf("\n Entry wfaStaNfcAction... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003787
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003788 if (getStaNfcAction->nfcOperation == eNfcHandOver) {
3789 printf("\n NfcAction - HandOver... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003790
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003791 } else if (getStaNfcAction->nfcOperation == eNfcReadTag) {
3792 printf("\n NfcAction - Read Tag... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003793
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003794 } else if (getStaNfcAction->nfcOperation == eNfcWriteSelect) {
3795 printf("\n NfcAction - Write Select... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003796
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003797 } else if (getStaNfcAction->nfcOperation == eNfcWriteConfig) {
3798 printf("\n NfcAction - Write Config... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003799
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003800 } else if (getStaNfcAction->nfcOperation == eNfcWritePasswd) {
3801 printf("\n NfcAction - Write Password... ");
3802
3803 } else if (getStaNfcAction->nfcOperation == eNfcWpsHandOver) {
3804 printf("\n NfcAction - WPS Handover... ");
3805 }
3806
3807 // Fetch the device mode and put in infoResp->cmdru.p2presult
3808 //strcpy(infoResp->cmdru.p2presult, "GO");
3809
3810 // Fetch the device grp id and put in infoResp->cmdru.grpid
3811 //strcpy(infoResp->cmdru.grpid, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
3812
3813 strcpy(infoResp.cmdru.staNfcAction.result, "CLIENT");
3814 strcpy(infoResp.cmdru.staNfcAction.grpId, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
3815 infoResp.cmdru.staNfcAction.peerRole = 1;
3816
3817 infoResp.status = STATUS_COMPLETE;
3818 wfaEncodeTLV(WFA_STA_NFC_ACTION_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3819 respBuf);
3820 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
3821
3822 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07003823}
3824
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003825int wfaStaExecAction(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3826 dutCmdResponse_t infoResp;
3827 caStaExecAction_t* staExecAction =
3828 (caStaExecAction_t*)caCmdBuf; //comment if not used
Dake Zhaocda4a1d2015-06-11 10:14:15 -07003829
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003830 printf("\n Entry wfaStaExecAction... ");
Dake Zhaocda4a1d2015-06-11 10:14:15 -07003831
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003832 if (staExecAction->prog == PROG_TYPE_NAN) {
3833 // Perform necessary configurations and actions
3834 // return the MAC address conditionally as per CAPI specification
3835 }
3836
3837 infoResp.status = STATUS_COMPLETE;
3838 wfaEncodeTLV(WFA_STA_EXEC_ACTION_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3839 respBuf);
3840 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
3841
3842 return WFA_SUCCESS;
Dake Zhaocda4a1d2015-06-11 10:14:15 -07003843}
3844
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003845int wfaStaInvokeCommand(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3846 dutCmdResponse_t infoResp;
3847 caStaInvokeCmd_t* staInvokeCmd =
3848 (caStaInvokeCmd_t*)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07003849
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003850 printf("\n Entry wfaStaInvokeCommand... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003851
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003852 // based on the command type , invoke API or complete the required procedures
3853 // return the defined parameters based on the command that is received ( example response below)
Dake Zhao655efed2015-03-11 17:39:13 -07003854
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003855 if (staInvokeCmd->cmdType == ePrimitiveCmdType &&
3856 staInvokeCmd->InvokeCmds.primtiveType.PrimType == eCmdPrimTypeAdvt) {
3857 infoResp.cmdru.staInvokeCmd.invokeCmdRspType = eCmdPrimTypeAdvt;
3858 infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.numServInfo = 1;
3859 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.servAdvInfo[0]
3860 .servName,
3861 "org.wi-fi.wfds.send.rx");
3862 infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.servAdvInfo[0].advtID =
3863 0x0000f;
3864 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.advRsp.servAdvInfo[0]
3865 .serviceMac,
3866 "ab:cd:ef:gh:ij:kl");
3867 } else if (staInvokeCmd->cmdType == ePrimitiveCmdType &&
3868 staInvokeCmd->InvokeCmds.primtiveType.PrimType ==
3869 eCmdPrimTypeSeek) {
3870 infoResp.cmdru.staInvokeCmd.invokeCmdRspType = eCmdPrimTypeSeek;
3871 infoResp.cmdru.staInvokeCmd.invokeCmdResp.seekRsp.searchID = 0x000ff;
3872 } else if (staInvokeCmd->cmdType == ePrimitiveCmdType &&
3873 staInvokeCmd->InvokeCmds.primtiveType.PrimType ==
3874 eCmdPrimTypeConnSession) {
3875 infoResp.cmdru.staInvokeCmd.invokeCmdRspType = eCmdPrimTypeConnSession;
3876 infoResp.cmdru.staInvokeCmd.invokeCmdResp.connSessResp.sessionID = 0x000ff;
3877 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.connSessResp.result, "GO");
3878 strcpy(infoResp.cmdru.staInvokeCmd.invokeCmdResp.connSessResp.grpId,
3879 "DIRECT-AB WFADUT");
3880 }
3881 infoResp.status = STATUS_COMPLETE;
3882 wfaEncodeTLV(WFA_STA_INVOKE_CMD_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3883 respBuf);
3884 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao655efed2015-03-11 17:39:13 -07003885
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003886 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07003887}
3888
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003889int wfaStaManageService(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3890 dutCmdResponse_t infoResp;
3891 //caStaMngServ_t *staMngServ = (caStaMngServ_t *)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07003892
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003893 printf("\n Entry wfaStaManageService... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003894
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003895 // based on the manage service type , invoke API's or complete the required procedures
3896 // return the defined parameters based on the command that is received ( example response below)
3897 strcpy(infoResp.cmdru.staManageServ.result, "CLIENT");
3898 strcpy(infoResp.cmdru.staManageServ.grpId, "AA:BB:CC:DD:EE:FF_DIRECT-SSID");
3899 infoResp.cmdru.staManageServ.sessionID = 0x000ff;
Dake Zhao655efed2015-03-11 17:39:13 -07003900
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003901 infoResp.status = STATUS_COMPLETE;
3902 wfaEncodeTLV(WFA_STA_MANAGE_SERVICE_RESP_TLV, sizeof(infoResp),
3903 (BYTE*)&infoResp, respBuf);
3904 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao655efed2015-03-11 17:39:13 -07003905
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003906 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07003907}
3908
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003909int wfaStaGetEvents(int len, BYTE* caCmdBuf, int* respLen, BYTE* respBuf) {
3910 dutCmdResponse_t infoResp;
3911 caStaGetEvents_t* staGetEvents =
3912 (caStaGetEvents_t*)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07003913
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003914 printf("\n Entry wfaStaGetEvents... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003915
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003916 if (staGetEvents->program == PROG_TYPE_NAN) {
3917 // Get all the events from the Log file or stored events
3918 // return the received/recorded event details - eventName, remoteInstanceID, localInstanceID, mac
3919 }
Dake Zhao655efed2015-03-11 17:39:13 -07003920
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003921 // Get all the event from the Log file or stored events
3922 // return the received/recorded events as space seperated list ( example response below)
3923 strcpy(infoResp.cmdru.staGetEvents.result,
3924 "SearchResult SearchTerminated AdvertiseStatus SessionRequest "
3925 "ConnectStatus SessionStatus PortStatus");
3926
3927 infoResp.status = STATUS_COMPLETE;
3928 wfaEncodeTLV(WFA_STA_GET_EVENTS_RESP_TLV, sizeof(infoResp), (BYTE*)&infoResp,
3929 respBuf);
3930 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
3931
3932 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07003933}
3934
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003935int wfaStaGetEventDetails(int len,
3936 BYTE* caCmdBuf,
3937 int* respLen,
3938 BYTE* respBuf) {
3939 dutCmdResponse_t infoResp;
3940 caStaGetEventDetails_t* getStaGetEventDetails =
3941 (caStaGetEventDetails_t*)caCmdBuf; //uncomment and use it
Dake Zhao655efed2015-03-11 17:39:13 -07003942
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003943 printf("\n Entry wfaStaGetEventDetails... ");
Dake Zhao655efed2015-03-11 17:39:13 -07003944
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003945 // based on the Requested Event type
3946 // return the latest corresponding evnet detailed parameters ( example response below)
Dake Zhao655efed2015-03-11 17:39:13 -07003947
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003948 if (getStaGetEventDetails->eventId == eSearchResult) {
3949 // fetch from log file or event history for the search result event and return the parameters
3950 infoResp.cmdru.staGetEventDetails.eventID = eSearchResult;
Dake Zhao655efed2015-03-11 17:39:13 -07003951
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003952 infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult.searchID =
3953 0x00abcd;
3954 strcpy(infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult
3955 .serviceMac,
3956 "ab:cd:ef:gh:ij:kl");
3957 infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult.advID =
3958 0x00dcba;
3959 strcpy(infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult
3960 .serviceName,
3961 "org.wi-fi.wfds.send.rx");
Dake Zhao655efed2015-03-11 17:39:13 -07003962
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003963 infoResp.cmdru.staGetEventDetails.getEventDetails.searchResult
3964 .serviceStatus = eServiceAvilable;
3965 } else if (
3966 getStaGetEventDetails->eventId ==
3967 eSearchTerminated) { // fetch from log file or event history for the search terminated event and return the parameters
3968 infoResp.cmdru.staGetEventDetails.eventID = eSearchTerminated;
3969 infoResp.cmdru.staGetEventDetails.getEventDetails.searchTerminated
3970 .searchID = 0x00abcd;
3971 } else if (
3972 getStaGetEventDetails->eventId ==
3973 eAdvertiseStatus) { // fetch from log file or event history for the Advertise Status event and return the parameters
3974 infoResp.cmdru.staGetEventDetails.eventID = eAdvertiseStatus;
3975 infoResp.cmdru.staGetEventDetails.getEventDetails.advStatus.advID =
3976 0x00dcba;
Dake Zhao655efed2015-03-11 17:39:13 -07003977
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08003978 infoResp.cmdru.staGetEventDetails.getEventDetails.advStatus.status =
3979 eAdvertised;
3980 } else if (
3981 getStaGetEventDetails->eventId ==
3982 eSessionRequest) { // fetch from log file or event history for the session request event and return the parameters
3983 infoResp.cmdru.staGetEventDetails.eventID = eSessionRequest;
3984 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionReq.advID =
3985 0x00dcba;
3986 strcpy(
3987 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionReq.sessionMac,
3988 "ab:cd:ef:gh:ij:kl");
3989 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionReq.sessionID =
3990 0x00baba;
3991 } else if (
3992 getStaGetEventDetails->eventId ==
3993 eSessionStatus) { // fetch from log file or event history for the session status event and return the parameters
3994 infoResp.cmdru.staGetEventDetails.eventID = eSessionStatus;
3995 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionStatus.sessionID =
3996 0x00baba;
3997 strcpy(infoResp.cmdru.staGetEventDetails.getEventDetails.sessionStatus
3998 .sessionMac,
3999 "ab:cd:ef:gh:ij:kl");
4000 infoResp.cmdru.staGetEventDetails.getEventDetails.sessionStatus.state =
4001 eSessionStateOpen;
4002 } else if (getStaGetEventDetails->eventId == eConnectStatus) {
4003 infoResp.cmdru.staGetEventDetails.eventID = eConnectStatus;
4004 infoResp.cmdru.staGetEventDetails.getEventDetails.connStatus.sessionID =
4005 0x00baba;
4006 strcpy(
4007 infoResp.cmdru.staGetEventDetails.getEventDetails.connStatus.sessionMac,
4008 "ab:cd:ef:gh:ij:kl");
4009 infoResp.cmdru.staGetEventDetails.getEventDetails.connStatus.status =
4010 eGroupFormationComplete;
Dake Zhao655efed2015-03-11 17:39:13 -07004011
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004012 } else if (getStaGetEventDetails->eventId == ePortStatus) {
4013 infoResp.cmdru.staGetEventDetails.eventID = ePortStatus;
4014 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.sessionID =
4015 0x00baba;
4016 strcpy(
4017 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.sessionMac,
4018 "ab:cd:ef:gh:ij:kl");
4019 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.port = 1009;
4020 infoResp.cmdru.staGetEventDetails.getEventDetails.portStatus.status =
4021 eLocalPortAllowed;
4022 }
Dake Zhao655efed2015-03-11 17:39:13 -07004023
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004024 infoResp.status = STATUS_COMPLETE;
4025 wfaEncodeTLV(WFA_STA_GET_EVENT_DETAILS_RESP_TLV, sizeof(infoResp),
4026 (BYTE*)&infoResp, respBuf);
4027 *respLen = WFA_TLV_HDR_LEN + sizeof(infoResp);
Dake Zhao655efed2015-03-11 17:39:13 -07004028
Shuo-Peng Liao0ca23a32020-09-03 13:12:58 +08004029 return WFA_SUCCESS;
Dake Zhao655efed2015-03-11 17:39:13 -07004030}