1d66913acSpriyadharshini gowthaman /*
2d66913acSpriyadharshini gowthaman * Sigma Control API DUT (FTM LOC functionality)
3d66913acSpriyadharshini gowthaman * Copyright (c) 2016, Qualcomm Atheros, Inc.
4d66913acSpriyadharshini gowthaman * All Rights Reserved.
5d66913acSpriyadharshini gowthaman * Licensed under the Clear BSD license. See README for more details.
6d66913acSpriyadharshini gowthaman */
7d66913acSpriyadharshini gowthaman
8d66913acSpriyadharshini gowthaman #include "sigma_dut.h"
9d66913acSpriyadharshini gowthaman #include <sys/stat.h>
10d66913acSpriyadharshini gowthaman #include <regex.h>
110dd682a8Spriyadharshini gowthaman #include "wpa_helpers.h"
12d66913acSpriyadharshini gowthaman
13d66913acSpriyadharshini gowthaman static const char LOC_XML_FILE_PATH[] = "./data/sigma-dut-target.xml";
14d66913acSpriyadharshini gowthaman
15d66913acSpriyadharshini gowthaman static const char LOC_LOWI_TEST_DISCOVERY[] = "lowi_test -a -b 2 -n 1";
16d66913acSpriyadharshini gowthaman static const char LOC_LOWI_TEST_RANGING[] =
17d66913acSpriyadharshini gowthaman "lowi_test -r ./data/sigma-dut-target.xml -n 1";
18d66913acSpriyadharshini gowthaman static const char LOC_LOWI_TEST_NEIGHBOR_RPT_REQ[] = "lowi_test -nrr";
19d66913acSpriyadharshini gowthaman static const char LOC_LOWI_TEST_ANQP_REQ[] = "lowi_test -anqp -mac ";
200dd682a8Spriyadharshini gowthaman static const char WPA_INTERWORKING_ENABLE[] =
210dd682a8Spriyadharshini gowthaman "SET interworking 1";
220dd682a8Spriyadharshini gowthaman static const char WPA_INTERWORKING_DISABLE[] =
230dd682a8Spriyadharshini gowthaman "SET interworking 0";
240dd682a8Spriyadharshini gowthaman static const char WPA_RM_ENABLE[] =
250dd682a8Spriyadharshini gowthaman "VENDOR 1374 74 08000400BD000000";
260dd682a8Spriyadharshini gowthaman static const char WPA_RM_DISABLE[] =
270dd682a8Spriyadharshini gowthaman "VENDOR 1374 74 0800040000000000";
280dd682a8Spriyadharshini gowthaman static const char WPA_ADDRESS_3_ENABLE[] =
290dd682a8Spriyadharshini gowthaman "SET gas_address3 1";
300dd682a8Spriyadharshini gowthaman static const char WPA_ADDRESS_3_DISABLE[] =
310dd682a8Spriyadharshini gowthaman "SET gas_address3 0";
32d66913acSpriyadharshini gowthaman
33d66913acSpriyadharshini gowthaman #ifndef ETH_ALEN
34d66913acSpriyadharshini gowthaman #define ETH_ALEN 6
35d66913acSpriyadharshini gowthaman #endif
36d66913acSpriyadharshini gowthaman
37d66913acSpriyadharshini gowthaman #define LOC_MAX_RM_FLAGS 10
38d66913acSpriyadharshini gowthaman #define LOC_RM_FLAG_VAL_ARRAY 2
39d66913acSpriyadharshini gowthaman
40d66913acSpriyadharshini gowthaman enum lowi_tst_cmd {
41d66913acSpriyadharshini gowthaman LOWI_TST_RANGING = 0,
42d66913acSpriyadharshini gowthaman LOWI_TST_NEIGHBOR_REPORT_REQ = 1,
43d66913acSpriyadharshini gowthaman LOWI_TST_ANQP_REQ = 2,
44d66913acSpriyadharshini gowthaman };
45d66913acSpriyadharshini gowthaman
46d66913acSpriyadharshini gowthaman struct capi_loc_cmd {
47d66913acSpriyadharshini gowthaman unsigned int chan;
48d66913acSpriyadharshini gowthaman unsigned int burstExp;
49d66913acSpriyadharshini gowthaman unsigned int burstDur;
50d66913acSpriyadharshini gowthaman unsigned int minDeltaFtm;
51d66913acSpriyadharshini gowthaman unsigned int ptsf;
52d66913acSpriyadharshini gowthaman unsigned int asap;
53d66913acSpriyadharshini gowthaman unsigned int ftmsPerBurst;
54d66913acSpriyadharshini gowthaman unsigned int fmtbw;
55d66913acSpriyadharshini gowthaman unsigned int burstPeriod;
56d66913acSpriyadharshini gowthaman unsigned int locCivic;
57d66913acSpriyadharshini gowthaman unsigned int lci;
58d66913acSpriyadharshini gowthaman };
59d66913acSpriyadharshini gowthaman
60d66913acSpriyadharshini gowthaman
loc_write_xml_file(struct sigma_dut * dut,const char * dst_mac_str,struct capi_loc_cmd * loc_cmd)61d66913acSpriyadharshini gowthaman static int loc_write_xml_file(struct sigma_dut *dut, const char *dst_mac_str,
62d66913acSpriyadharshini gowthaman struct capi_loc_cmd *loc_cmd)
63d66913acSpriyadharshini gowthaman {
64d66913acSpriyadharshini gowthaman FILE *xml;
65d66913acSpriyadharshini gowthaman unsigned int band, bw, preamble, primary_ch, center_freq;
66d66913acSpriyadharshini gowthaman
67d66913acSpriyadharshini gowthaman xml = fopen(LOC_XML_FILE_PATH, "w");
68d66913acSpriyadharshini gowthaman if (!xml) {
69d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
70d66913acSpriyadharshini gowthaman "%s - Unable to create the XML file", __func__);
71d66913acSpriyadharshini gowthaman return -1;
72d66913acSpriyadharshini gowthaman }
73d66913acSpriyadharshini gowthaman
74d66913acSpriyadharshini gowthaman /* Using this following defaults:
75d66913acSpriyadharshini gowthaman * default value of band 1
76d66913acSpriyadharshini gowthaman */
77d66913acSpriyadharshini gowthaman band = 1;
78d66913acSpriyadharshini gowthaman
79d66913acSpriyadharshini gowthaman #define FMT_BW_NO_PREF 0
80d66913acSpriyadharshini gowthaman #define FMT_BW_HT_20 9
81d66913acSpriyadharshini gowthaman #define FMT_BW_VHT_20 10
82d66913acSpriyadharshini gowthaman #define FMT_BW_HT_40 11
83d66913acSpriyadharshini gowthaman #define FMT_BW_VHT_40 12
84d66913acSpriyadharshini gowthaman #define FMT_BW_VHT_80 13
85d66913acSpriyadharshini gowthaman
86d66913acSpriyadharshini gowthaman #define LOC_BW_20 0
87d66913acSpriyadharshini gowthaman #define LOC_BW_40 1
88d66913acSpriyadharshini gowthaman #define LOC_BW_80 2
89d66913acSpriyadharshini gowthaman #define LOC_PREAMBLE_HT 1
90d66913acSpriyadharshini gowthaman #define LOC_PREAMBLE_VHT 2
91d66913acSpriyadharshini gowthaman switch (loc_cmd->fmtbw) {
92d66913acSpriyadharshini gowthaman case FMT_BW_NO_PREF:
93d66913acSpriyadharshini gowthaman case FMT_BW_HT_20:
94d66913acSpriyadharshini gowthaman bw = LOC_BW_20;
95d66913acSpriyadharshini gowthaman preamble = LOC_PREAMBLE_HT;
96d66913acSpriyadharshini gowthaman primary_ch = 36;
97d66913acSpriyadharshini gowthaman center_freq = 5180;
98d66913acSpriyadharshini gowthaman break;
99d66913acSpriyadharshini gowthaman case FMT_BW_VHT_20:
100d66913acSpriyadharshini gowthaman bw = LOC_BW_20;
101d66913acSpriyadharshini gowthaman preamble = LOC_PREAMBLE_VHT;
102d66913acSpriyadharshini gowthaman primary_ch = 36;
103d66913acSpriyadharshini gowthaman center_freq = 5180;
104d66913acSpriyadharshini gowthaman break;
105d66913acSpriyadharshini gowthaman case FMT_BW_HT_40:
106d66913acSpriyadharshini gowthaman bw = LOC_BW_40;
107d66913acSpriyadharshini gowthaman preamble = LOC_PREAMBLE_HT;
108d66913acSpriyadharshini gowthaman primary_ch = 36;
109d66913acSpriyadharshini gowthaman center_freq = 5190;
110d66913acSpriyadharshini gowthaman break;
111d66913acSpriyadharshini gowthaman case FMT_BW_VHT_40:
112d66913acSpriyadharshini gowthaman bw = LOC_BW_40;
113d66913acSpriyadharshini gowthaman preamble = LOC_PREAMBLE_VHT;
114d66913acSpriyadharshini gowthaman primary_ch = 36;
115d66913acSpriyadharshini gowthaman center_freq = 5190;
116d66913acSpriyadharshini gowthaman break;
117d66913acSpriyadharshini gowthaman case FMT_BW_VHT_80:
118d66913acSpriyadharshini gowthaman bw = LOC_BW_80;
119d66913acSpriyadharshini gowthaman preamble = LOC_PREAMBLE_VHT;
120d66913acSpriyadharshini gowthaman primary_ch = 36;
121d66913acSpriyadharshini gowthaman center_freq = 5210;
122d66913acSpriyadharshini gowthaman break;
123d66913acSpriyadharshini gowthaman default:
124d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
125d66913acSpriyadharshini gowthaman "%s - Bad Format/BW received", __func__);
1265fc02a04SSrikanth Marepalli fclose(xml);
127d66913acSpriyadharshini gowthaman return -1;
128d66913acSpriyadharshini gowthaman }
129d66913acSpriyadharshini gowthaman
130d66913acSpriyadharshini gowthaman #define LOC_CAPI_DEFAULT_FTMS_PER_BURST 5
131d66913acSpriyadharshini gowthaman #define LOC_CAPI_DEFAULT_BURST_DUR 10
132d66913acSpriyadharshini gowthaman fprintf(xml, "<body>\n");
133d66913acSpriyadharshini gowthaman fprintf(xml, " <ranging>\n");
134d66913acSpriyadharshini gowthaman fprintf(xml, " <ap>\n");
135d66913acSpriyadharshini gowthaman fprintf(xml, " <band>%u</band>\n", band);
136d66913acSpriyadharshini gowthaman fprintf(xml, " <rttType>3</rttType>\n");
137d66913acSpriyadharshini gowthaman fprintf(xml, " <numFrames>%u</numFrames>\n",
138d66913acSpriyadharshini gowthaman LOC_CAPI_DEFAULT_FTMS_PER_BURST);
139d66913acSpriyadharshini gowthaman fprintf(xml, " <bw>%u</bw>\n", bw);
140d66913acSpriyadharshini gowthaman fprintf(xml, " <preamble>%u</preamble>\n", preamble);
141d66913acSpriyadharshini gowthaman fprintf(xml, " <asap>%u</asap>\n", loc_cmd->asap);
142d66913acSpriyadharshini gowthaman fprintf(xml, " <lci>%u</lci>\n", loc_cmd->lci);
143d66913acSpriyadharshini gowthaman fprintf(xml, " <civic>%u</civic>\n", loc_cmd->locCivic);
144d66913acSpriyadharshini gowthaman fprintf(xml, " <burstsexp>%u</burstsexp>\n", loc_cmd->burstExp);
145d66913acSpriyadharshini gowthaman fprintf(xml, " <burstduration>%u</burstduration>\n",
146d66913acSpriyadharshini gowthaman LOC_CAPI_DEFAULT_BURST_DUR);
147d66913acSpriyadharshini gowthaman fprintf(xml, " <burstperiod>%u</burstperiod>\n", 0);
148d66913acSpriyadharshini gowthaman /* Use parameters from LOWI cache */
149d66913acSpriyadharshini gowthaman fprintf(xml, " <paramControl>%u</paramControl>\n", 0);
15026357a04Spriyadharshini gowthaman fprintf(xml, " <ptsftimer>%u</ptsftimer>\n", 0);
151d66913acSpriyadharshini gowthaman fprintf(xml, " <center_freq1>%u</center_freq1>\n", center_freq);
152d66913acSpriyadharshini gowthaman fprintf(xml, " <center_freq2>0</center_freq2>\n");
153d66913acSpriyadharshini gowthaman fprintf(xml, " <ch>%u</ch>\n", primary_ch);
154d66913acSpriyadharshini gowthaman fprintf(xml, " <mac>%s</mac>\n", dst_mac_str);
155d66913acSpriyadharshini gowthaman fprintf(xml, " </ap>\n");
156d66913acSpriyadharshini gowthaman fprintf(xml, " </ranging>\n");
157d66913acSpriyadharshini gowthaman fprintf(xml, " <summary>\n");
158d66913acSpriyadharshini gowthaman fprintf(xml, " <mac>%s</mac>\n", dst_mac_str);
159d66913acSpriyadharshini gowthaman fprintf(xml, " </summary>\n");
160d66913acSpriyadharshini gowthaman fprintf(xml, "</body>\n");
161d66913acSpriyadharshini gowthaman
162d66913acSpriyadharshini gowthaman fclose(xml);
163d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
164d66913acSpriyadharshini gowthaman "%s - Successfully created XML file", __func__);
165d66913acSpriyadharshini gowthaman return 0;
166d66913acSpriyadharshini gowthaman }
167d66913acSpriyadharshini gowthaman
168d66913acSpriyadharshini gowthaman
pass_request_to_ltest(struct sigma_dut * dut,enum lowi_tst_cmd cmd,const char * params)169d66913acSpriyadharshini gowthaman static int pass_request_to_ltest(struct sigma_dut *dut, enum lowi_tst_cmd cmd,
170d66913acSpriyadharshini gowthaman const char *params)
171d66913acSpriyadharshini gowthaman {
172d66913acSpriyadharshini gowthaman #define MAX_ANQP_CMND_SIZE 256
173d66913acSpriyadharshini gowthaman int ret;
174d66913acSpriyadharshini gowthaman const char *cmd_str;
175d66913acSpriyadharshini gowthaman char lowi_anqp_query[MAX_ANQP_CMND_SIZE];
176d66913acSpriyadharshini gowthaman
177d66913acSpriyadharshini gowthaman switch (cmd) {
178d66913acSpriyadharshini gowthaman case LOWI_TST_RANGING:
179d66913acSpriyadharshini gowthaman cmd_str = LOC_LOWI_TEST_RANGING;
180d66913acSpriyadharshini gowthaman break;
181d66913acSpriyadharshini gowthaman case LOWI_TST_NEIGHBOR_REPORT_REQ:
182d66913acSpriyadharshini gowthaman cmd_str = LOC_LOWI_TEST_NEIGHBOR_RPT_REQ;
183d66913acSpriyadharshini gowthaman break;
184d66913acSpriyadharshini gowthaman case LOWI_TST_ANQP_REQ:
185d66913acSpriyadharshini gowthaman if (!params) {
186d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
187d66913acSpriyadharshini gowthaman "%s - No Destination Mac provided for ANQP Query",
188d66913acSpriyadharshini gowthaman __func__);
189d66913acSpriyadharshini gowthaman return -1;
190d66913acSpriyadharshini gowthaman }
191d66913acSpriyadharshini gowthaman
192d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
193d66913acSpriyadharshini gowthaman "%s - Destination Mac provided for ANQP Query: %s",
194d66913acSpriyadharshini gowthaman __func__, params);
195d66913acSpriyadharshini gowthaman
196d66913acSpriyadharshini gowthaman snprintf(lowi_anqp_query, MAX_ANQP_CMND_SIZE, "%s%s",
197d66913acSpriyadharshini gowthaman LOC_LOWI_TEST_ANQP_REQ, params);
198d66913acSpriyadharshini gowthaman cmd_str = lowi_anqp_query;
199d66913acSpriyadharshini gowthaman break;
200d66913acSpriyadharshini gowthaman default:
201d66913acSpriyadharshini gowthaman cmd_str = LOC_LOWI_TEST_DISCOVERY;
202d66913acSpriyadharshini gowthaman break;
203d66913acSpriyadharshini gowthaman }
204d66913acSpriyadharshini gowthaman
205d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - 1 - Running command: %s",
206d66913acSpriyadharshini gowthaman __func__, LOC_LOWI_TEST_DISCOVERY);
207d66913acSpriyadharshini gowthaman ret = system(LOC_LOWI_TEST_DISCOVERY);
208d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
209d66913acSpriyadharshini gowthaman "%s - Finished Performing Discovery Scan through LOWI_test: ret: %d",
210d66913acSpriyadharshini gowthaman __func__, ret);
211d66913acSpriyadharshini gowthaman sleep(1);
212d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - 2 - Running command: %s",
213d66913acSpriyadharshini gowthaman __func__, cmd_str);
214d66913acSpriyadharshini gowthaman ret = system(cmd_str);
215d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
216d66913acSpriyadharshini gowthaman "%s - Finished Performing command: %s, got ret: %d",
217d66913acSpriyadharshini gowthaman __func__, cmd_str, ret);
218d66913acSpriyadharshini gowthaman
219d66913acSpriyadharshini gowthaman return ret;
220d66913acSpriyadharshini gowthaman }
221d66913acSpriyadharshini gowthaman
222d66913acSpriyadharshini gowthaman
loc_cmd_sta_exec_action(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)223d66913acSpriyadharshini gowthaman int loc_cmd_sta_exec_action(struct sigma_dut *dut, struct sigma_conn *conn,
224d66913acSpriyadharshini gowthaman struct sigma_cmd *cmd)
225d66913acSpriyadharshini gowthaman {
226d66913acSpriyadharshini gowthaman const char *params = NULL;
227d66913acSpriyadharshini gowthaman enum lowi_tst_cmd cmnd = LOWI_TST_RANGING;
228e7df6d86Svamsi krishna const char *program = get_param(cmd, "prog");
229e7df6d86Svamsi krishna const char *loc_op = get_param(cmd, "Trigger");
230e7df6d86Svamsi krishna const char *interface = get_param(cmd, "interface");
231d66913acSpriyadharshini gowthaman
232e7df6d86Svamsi krishna const char *destMacStr = get_param(cmd, "destmac");
233e7df6d86Svamsi krishna const char *burstExp = get_param(cmd, "burstsexponent");
234e7df6d86Svamsi krishna const char *asap = get_param(cmd, "ASAP");
235e7df6d86Svamsi krishna const char *fmtbw = get_param(cmd, "formatbwftm");
236e7df6d86Svamsi krishna const char *locCivic = get_param(cmd, "askforloccivic");
237e7df6d86Svamsi krishna const char *lci = get_param(cmd, "askforlci");
238d66913acSpriyadharshini gowthaman struct capi_loc_cmd loc_cmd;
239d66913acSpriyadharshini gowthaman
240d66913acSpriyadharshini gowthaman memset(&loc_cmd, 0, sizeof(loc_cmd));
241d66913acSpriyadharshini gowthaman
242d66913acSpriyadharshini gowthaman if (!loc_op) {
243d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
244d66913acSpriyadharshini gowthaman "%s - No Operation! - Aborting", __func__);
245d66913acSpriyadharshini gowthaman return -1;
246d66913acSpriyadharshini gowthaman }
247d66913acSpriyadharshini gowthaman
248e7df6d86Svamsi krishna cmnd = strcasecmp(loc_op, "ANQPQuery") == 0 ?
249d66913acSpriyadharshini gowthaman LOWI_TST_ANQP_REQ : LOWI_TST_RANGING;
250d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - Going to perform: %s",
251d66913acSpriyadharshini gowthaman __func__, loc_op);
252d66913acSpriyadharshini gowthaman
253d66913acSpriyadharshini gowthaman if (!program) {
254d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
255d66913acSpriyadharshini gowthaman "%s - No Program in Command! - Aborting",
256d66913acSpriyadharshini gowthaman __func__);
257d66913acSpriyadharshini gowthaman return -1;
258d66913acSpriyadharshini gowthaman }
259d66913acSpriyadharshini gowthaman
260d66913acSpriyadharshini gowthaman if (!interface) {
261d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
262d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request",
263d66913acSpriyadharshini gowthaman __func__);
264d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
265d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing interface");
266d66913acSpriyadharshini gowthaman return 0;
267d66913acSpriyadharshini gowthaman }
268d66913acSpriyadharshini gowthaman
269d66913acSpriyadharshini gowthaman if (!destMacStr) {
270d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
271d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request",
272d66913acSpriyadharshini gowthaman __func__);
273d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
274d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing MAC");
275d66913acSpriyadharshini gowthaman return 0;
276d66913acSpriyadharshini gowthaman }
277d66913acSpriyadharshini gowthaman
278d66913acSpriyadharshini gowthaman if (cmnd == LOWI_TST_RANGING) {
279d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - LOWI_TST_RANGING",
280d66913acSpriyadharshini gowthaman __func__);
281d66913acSpriyadharshini gowthaman if (!burstExp) {
282d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
283d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request",
284d66913acSpriyadharshini gowthaman __func__);
285d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
286d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing Burst Exp");
287d66913acSpriyadharshini gowthaman return 0;
288d66913acSpriyadharshini gowthaman }
289d66913acSpriyadharshini gowthaman
290d66913acSpriyadharshini gowthaman if (!asap) {
291d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
292d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request",
293d66913acSpriyadharshini gowthaman __func__);
294d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
295d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing ASAP");
296d66913acSpriyadharshini gowthaman return 0;
297d66913acSpriyadharshini gowthaman }
298d66913acSpriyadharshini gowthaman
299d66913acSpriyadharshini gowthaman if (!fmtbw) {
300d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
301d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request",
302d66913acSpriyadharshini gowthaman __func__);
303d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
304d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing Format & BW");
305d66913acSpriyadharshini gowthaman return 0;
306d66913acSpriyadharshini gowthaman }
307d66913acSpriyadharshini gowthaman
308d66913acSpriyadharshini gowthaman if (!locCivic) {
309d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
310d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request",
311d66913acSpriyadharshini gowthaman __func__);
312d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
313d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing Location Civic");
314d66913acSpriyadharshini gowthaman return 0;
315d66913acSpriyadharshini gowthaman }
316d66913acSpriyadharshini gowthaman
317d66913acSpriyadharshini gowthaman if (!lci) {
318d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
319d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request",
320d66913acSpriyadharshini gowthaman __func__);
321d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
322d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing LCI");
323d66913acSpriyadharshini gowthaman return 0;
324d66913acSpriyadharshini gowthaman }
325d66913acSpriyadharshini gowthaman
326e7df6d86Svamsi krishna if (strcasecmp(program, "loc") != 0) {
327d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
328d66913acSpriyadharshini gowthaman "%s - Unsupported Program: %s",
329d66913acSpriyadharshini gowthaman __func__, program);
330d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
331d66913acSpriyadharshini gowthaman "ErrMsg,Unsupported program");
332d66913acSpriyadharshini gowthaman return 0;
333d66913acSpriyadharshini gowthaman }
334d66913acSpriyadharshini gowthaman
335e7df6d86Svamsi krishna if (strcasecmp(interface, "wlan0") != 0) {
336d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
337d66913acSpriyadharshini gowthaman "%s - Unsupported Interface Type: %s",
338d66913acSpriyadharshini gowthaman __func__, interface);
339d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
340d66913acSpriyadharshini gowthaman "ErrMsg,Unsupported Interface Type");
341d66913acSpriyadharshini gowthaman return 0;
342d66913acSpriyadharshini gowthaman }
343d66913acSpriyadharshini gowthaman
344d66913acSpriyadharshini gowthaman sscanf(burstExp, "%u", &loc_cmd.burstExp);
345d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - burstExp: %u",
346d66913acSpriyadharshini gowthaman __func__, loc_cmd.burstExp);
347d66913acSpriyadharshini gowthaman sscanf(asap, "%u", &loc_cmd.asap);
348d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - asap: %u",
349d66913acSpriyadharshini gowthaman __func__, loc_cmd.asap);
350d66913acSpriyadharshini gowthaman sscanf(fmtbw, "%u", &loc_cmd.fmtbw);
351d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - fmtbw: %u",
352d66913acSpriyadharshini gowthaman __func__, loc_cmd.fmtbw);
353d66913acSpriyadharshini gowthaman sscanf(locCivic, "%u", &loc_cmd.locCivic);
354d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - locCivic: %u",
355d66913acSpriyadharshini gowthaman __func__, loc_cmd.locCivic);
356d66913acSpriyadharshini gowthaman sscanf(lci, "%u", &loc_cmd.lci);
357d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - lci: %u",
358d66913acSpriyadharshini gowthaman __func__, loc_cmd.lci);
359d66913acSpriyadharshini gowthaman
360d66913acSpriyadharshini gowthaman if (loc_write_xml_file(dut, destMacStr, &loc_cmd) < 0) {
361d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
362d66913acSpriyadharshini gowthaman "%s - Failed to write to XML file because of bad command",
363d66913acSpriyadharshini gowthaman __func__);
364d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
365d66913acSpriyadharshini gowthaman "ErrMsg,Bad CAPI command");
366d66913acSpriyadharshini gowthaman return 0;
367d66913acSpriyadharshini gowthaman }
368d66913acSpriyadharshini gowthaman } else {
369d66913acSpriyadharshini gowthaman /* ANQP Query */
370d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
371d66913acSpriyadharshini gowthaman "%s - LOWI_TST_ANQP_REQ", __func__);
372d66913acSpriyadharshini gowthaman params = destMacStr;
373d66913acSpriyadharshini gowthaman }
374d66913acSpriyadharshini gowthaman
375d66913acSpriyadharshini gowthaman if (pass_request_to_ltest(dut, cmnd, params) < 0) {
376d66913acSpriyadharshini gowthaman /* Loc operation been failed. */
377d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
378d66913acSpriyadharshini gowthaman "%s - Failed to initiate Loc command",
379d66913acSpriyadharshini gowthaman __func__);
380d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR,
381d66913acSpriyadharshini gowthaman "ErrMsg,Failed to initiate Loc command");
382d66913acSpriyadharshini gowthaman return 0;
383d66913acSpriyadharshini gowthaman }
384d66913acSpriyadharshini gowthaman
385d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
386d66913acSpriyadharshini gowthaman "%s - Succeeded to initiate Loc command", __func__);
387d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_COMPLETE, NULL);
388d66913acSpriyadharshini gowthaman return 0;
389d66913acSpriyadharshini gowthaman }
390d66913acSpriyadharshini gowthaman
391d66913acSpriyadharshini gowthaman
loc_cmd_sta_send_frame(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)392d66913acSpriyadharshini gowthaman int loc_cmd_sta_send_frame(struct sigma_dut *dut, struct sigma_conn *conn,
393d66913acSpriyadharshini gowthaman struct sigma_cmd *cmd)
394d66913acSpriyadharshini gowthaman {
3950dd682a8Spriyadharshini gowthaman const char *address3Cmnd = WPA_ADDRESS_3_DISABLE;
396d66913acSpriyadharshini gowthaman enum lowi_tst_cmd cmnd = LOWI_TST_NEIGHBOR_REPORT_REQ; /* Default */
397d66913acSpriyadharshini gowthaman /* Mandatory arguments */
398e7df6d86Svamsi krishna const char *interface = get_param(cmd, "interface");
399e7df6d86Svamsi krishna const char *program = get_param(cmd, "program");
400e7df6d86Svamsi krishna const char *destMacStr = get_param(cmd, "destmac");
401e7df6d86Svamsi krishna const char *frameName = get_param(cmd, "FrameName");
402d66913acSpriyadharshini gowthaman
403d66913acSpriyadharshini gowthaman /* Optional Arguments */
404e7df6d86Svamsi krishna const char *locCivic = get_param(cmd, "askforloccivic");
405e7df6d86Svamsi krishna const char *lci = get_param(cmd, "askforlci");
406e7df6d86Svamsi krishna const char *fqdn = get_param(cmd, "AskForPublicIdentifierURI-FQDN");
407e7df6d86Svamsi krishna const char *address3 = get_param(cmd, "address3");
408d66913acSpriyadharshini gowthaman
409d66913acSpriyadharshini gowthaman const char *params = NULL;
410d66913acSpriyadharshini gowthaman
411d66913acSpriyadharshini gowthaman if (!program) {
412d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
413d66913acSpriyadharshini gowthaman "%s - No Program in Command! - Aborting",
414d66913acSpriyadharshini gowthaman __func__);
415d66913acSpriyadharshini gowthaman return -1;
416d66913acSpriyadharshini gowthaman }
417d66913acSpriyadharshini gowthaman
418d66913acSpriyadharshini gowthaman if (!interface) {
419d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
420d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request",
421d66913acSpriyadharshini gowthaman __func__);
422d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL);
423d66913acSpriyadharshini gowthaman return 0;
424d66913acSpriyadharshini gowthaman }
425d66913acSpriyadharshini gowthaman
426d66913acSpriyadharshini gowthaman if (!frameName) {
427d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
428d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request",
429d66913acSpriyadharshini gowthaman __func__);
430d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL);
431d66913acSpriyadharshini gowthaman return 0;
432d66913acSpriyadharshini gowthaman }
433d66913acSpriyadharshini gowthaman
434e7df6d86Svamsi krishna if (strcasecmp(frameName, "AnqpQuery") == 0 && !destMacStr) {
435d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
436d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request",
437d66913acSpriyadharshini gowthaman __func__);
438d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL);
439d66913acSpriyadharshini gowthaman return 0;
440d66913acSpriyadharshini gowthaman }
441d66913acSpriyadharshini gowthaman
442d66913acSpriyadharshini gowthaman if (!locCivic)
443d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
444d66913acSpriyadharshini gowthaman "%s - Command missing LocCivic", __func__);
445d66913acSpriyadharshini gowthaman if (!lci)
446d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
447d66913acSpriyadharshini gowthaman "%s - Command missing LCI", __func__);
448d66913acSpriyadharshini gowthaman if (!fqdn)
449d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
450d66913acSpriyadharshini gowthaman "%s - Command missing FQDN", __func__);
4510dd682a8Spriyadharshini gowthaman if (!address3) {
4520dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
4530dd682a8Spriyadharshini gowthaman "%s - Command missing address3", __func__);
4540dd682a8Spriyadharshini gowthaman } else {
4550dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_DEBUG, "%s - address3: %s",
4560dd682a8Spriyadharshini gowthaman __func__, address3);
457e7df6d86Svamsi krishna if (strcasecmp(address3, "FF:FF:FF:FF:FF:FF") == 0)
4580dd682a8Spriyadharshini gowthaman address3Cmnd = WPA_ADDRESS_3_ENABLE;
4590dd682a8Spriyadharshini gowthaman else
4600dd682a8Spriyadharshini gowthaman address3Cmnd = WPA_ADDRESS_3_DISABLE;
4610dd682a8Spriyadharshini gowthaman }
462d66913acSpriyadharshini gowthaman
463e7df6d86Svamsi krishna if (strcasecmp(program, "loc") != 0) {
464d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
465d66913acSpriyadharshini gowthaman "%s - Unsupported Program: %s", __func__,
466d66913acSpriyadharshini gowthaman program);
467d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL);
468d66913acSpriyadharshini gowthaman return 0;
469d66913acSpriyadharshini gowthaman }
470d66913acSpriyadharshini gowthaman
471d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - Triggering Frame: %s",
472d66913acSpriyadharshini gowthaman __func__, frameName);
473e7df6d86Svamsi krishna if (strcasecmp(frameName, "AnqpQuery") == 0) {
474d66913acSpriyadharshini gowthaman cmnd = LOWI_TST_ANQP_REQ;
475d66913acSpriyadharshini gowthaman params = destMacStr;
476d66913acSpriyadharshini gowthaman } else {
477d66913acSpriyadharshini gowthaman cmnd = LOWI_TST_NEIGHBOR_REPORT_REQ;
478d66913acSpriyadharshini gowthaman }
479d66913acSpriyadharshini gowthaman
4800dd682a8Spriyadharshini gowthaman if (cmnd == LOWI_TST_ANQP_REQ) {
4810dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_DEBUG, "%s - Executing command %s",
4820dd682a8Spriyadharshini gowthaman __func__, address3Cmnd);
483*016ae6c8SJouni Malinen if (wpa_command(get_station_ifname(dut), address3Cmnd) < 0) {
4840dd682a8Spriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL);
4850dd682a8Spriyadharshini gowthaman return -1;
4860dd682a8Spriyadharshini gowthaman }
4870dd682a8Spriyadharshini gowthaman }
488d66913acSpriyadharshini gowthaman if (pass_request_to_ltest(dut, cmnd, params) < 0) {
489d66913acSpriyadharshini gowthaman /* Loc operation has failed. */
490d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
491d66913acSpriyadharshini gowthaman "%s - Failed to initiate Loc command",
492d66913acSpriyadharshini gowthaman __func__);
493d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL);
494d66913acSpriyadharshini gowthaman return 0;
495d66913acSpriyadharshini gowthaman }
496d66913acSpriyadharshini gowthaman
497d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
498d66913acSpriyadharshini gowthaman "%s - Succeeded to initiate Loc command", __func__);
499d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_COMPLETE, NULL);
500d66913acSpriyadharshini gowthaman return 0;
501d66913acSpriyadharshini gowthaman }
502d66913acSpriyadharshini gowthaman
503d66913acSpriyadharshini gowthaman
504d66913acSpriyadharshini gowthaman enum e_rm_parse_states {
505d66913acSpriyadharshini gowthaman LOC_LOOKING_FOR_BIT = 0,
506d66913acSpriyadharshini gowthaman LOC_LOOKING_FOR_VAL,
507d66913acSpriyadharshini gowthaman LOC_MAX
508d66913acSpriyadharshini gowthaman };
509d66913acSpriyadharshini gowthaman
510d66913acSpriyadharshini gowthaman
parse_rm_bits(struct sigma_dut * dut,const char * rmFlags,char rmBitFlags[LOC_MAX_RM_FLAGS][LOC_RM_FLAG_VAL_ARRAY])511d66913acSpriyadharshini gowthaman void parse_rm_bits(struct sigma_dut *dut, const char *rmFlags,
512d66913acSpriyadharshini gowthaman char rmBitFlags[LOC_MAX_RM_FLAGS][LOC_RM_FLAG_VAL_ARRAY])
513d66913acSpriyadharshini gowthaman {
514d66913acSpriyadharshini gowthaman
515d66913acSpriyadharshini gowthaman unsigned int bitPos = 0;
516d66913acSpriyadharshini gowthaman unsigned int bitVal = 0;
517d66913acSpriyadharshini gowthaman unsigned int idx = 0;
518d66913acSpriyadharshini gowthaman unsigned int i = 0;
519d66913acSpriyadharshini gowthaman enum e_rm_parse_states rmParseStates = LOC_LOOKING_FOR_BIT;
520d66913acSpriyadharshini gowthaman char temp = '\0';
521d66913acSpriyadharshini gowthaman
522d66913acSpriyadharshini gowthaman if (!rmFlags) {
523d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
524d66913acSpriyadharshini gowthaman "%s - NULL pointer for rmFlags - Aborting", __func__);
525d66913acSpriyadharshini gowthaman return;
526d66913acSpriyadharshini gowthaman }
527d66913acSpriyadharshini gowthaman
528d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - rmFlags: %s",
529d66913acSpriyadharshini gowthaman __func__, rmFlags);
530d66913acSpriyadharshini gowthaman while (*rmFlags != '\0' && idx < LOC_MAX_RM_FLAGS) {
531d66913acSpriyadharshini gowthaman temp = *rmFlags;
532d66913acSpriyadharshini gowthaman rmFlags++;
533d66913acSpriyadharshini gowthaman switch (rmParseStates) {
534d66913acSpriyadharshini gowthaman case LOC_LOOKING_FOR_BIT:
535d66913acSpriyadharshini gowthaman if (temp >= '0' && temp <= '9') {
536d66913acSpriyadharshini gowthaman /* Parse Digit for bit Position */
537d66913acSpriyadharshini gowthaman bitPos = (bitPos * 10) + (temp - '0');
538d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
539d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_BIT - parsing: %c, bitPos: %u",
540d66913acSpriyadharshini gowthaman __func__, temp, bitPos);
541d66913acSpriyadharshini gowthaman } else if (temp == ':') {
542d66913acSpriyadharshini gowthaman /* move to Parsing Bit Value */
543d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
544d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_BIT - processing: %c, bitPos: %u",
545d66913acSpriyadharshini gowthaman __func__, temp, bitPos);
546d66913acSpriyadharshini gowthaman rmBitFlags[idx][0] = bitPos;
547d66913acSpriyadharshini gowthaman rmParseStates = LOC_LOOKING_FOR_VAL;
548d66913acSpriyadharshini gowthaman } else if (temp == ';') {
549d66913acSpriyadharshini gowthaman /* End of Bit-Value Pair, reset and look for New Bit Position */
550d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
551d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_BIT - processing: %c",
552d66913acSpriyadharshini gowthaman __func__, temp);
553d66913acSpriyadharshini gowthaman rmBitFlags[idx][0] = bitPos;
554d66913acSpriyadharshini gowthaman /* rmBitFlags[idx][1] = bitVal; */
555d66913acSpriyadharshini gowthaman bitPos = 0;
556d66913acSpriyadharshini gowthaman bitVal = 0;
557d66913acSpriyadharshini gowthaman idx++;
558d66913acSpriyadharshini gowthaman } else { /* Ignore */
559d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
560d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_BIT - ignoring: %c",
561d66913acSpriyadharshini gowthaman __func__, temp);
562d66913acSpriyadharshini gowthaman }
563d66913acSpriyadharshini gowthaman break;
564d66913acSpriyadharshini gowthaman case LOC_LOOKING_FOR_VAL:
565d66913acSpriyadharshini gowthaman if (temp == '0' || temp == '1') {
566d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
567d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_VAL - processing: %c",
568d66913acSpriyadharshini gowthaman __func__, temp);
569d66913acSpriyadharshini gowthaman bitVal = temp - '0';
570d66913acSpriyadharshini gowthaman rmBitFlags[idx][1] = bitVal;
571d66913acSpriyadharshini gowthaman } else if (temp == ';') {
572d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
573d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_VAL - processing: %c, bitPos: %u, bitVal: %u",
574d66913acSpriyadharshini gowthaman __func__, temp, bitPos, bitVal);
575d66913acSpriyadharshini gowthaman /* rmBitFlags[idx][0] = bitPos; */
576d66913acSpriyadharshini gowthaman /* rmBitFlags[idx][1] = bitVal; */
577d66913acSpriyadharshini gowthaman bitPos = 0;
578d66913acSpriyadharshini gowthaman bitVal = 0;
579d66913acSpriyadharshini gowthaman idx++;
580d66913acSpriyadharshini gowthaman rmParseStates = LOC_LOOKING_FOR_BIT;
581d66913acSpriyadharshini gowthaman } else { /* Ignore */
582d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
583d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_VAL - ignoring: %c",
584d66913acSpriyadharshini gowthaman __func__, temp);
585d66913acSpriyadharshini gowthaman }
586d66913acSpriyadharshini gowthaman break;
587d66913acSpriyadharshini gowthaman default: /* Ignore */
588d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
589d66913acSpriyadharshini gowthaman "%s - default - ignoring: %c",
590d66913acSpriyadharshini gowthaman __func__, temp);
591d66913acSpriyadharshini gowthaman break;
592d66913acSpriyadharshini gowthaman }
593d66913acSpriyadharshini gowthaman }
594d66913acSpriyadharshini gowthaman
595d66913acSpriyadharshini gowthaman for (i = 0; i < LOC_MAX_RM_FLAGS; i++) {
596d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
597d66913acSpriyadharshini gowthaman "%s - Bit Pos: %u : Bit Val: %u",
598d66913acSpriyadharshini gowthaman __func__, rmBitFlags[i][0],
599d66913acSpriyadharshini gowthaman rmBitFlags[i][1]);
600d66913acSpriyadharshini gowthaman }
601d66913acSpriyadharshini gowthaman }
602d66913acSpriyadharshini gowthaman
603d66913acSpriyadharshini gowthaman
loc_cmd_sta_preset_testparameters(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)604d66913acSpriyadharshini gowthaman int loc_cmd_sta_preset_testparameters(struct sigma_dut *dut,
605d66913acSpriyadharshini gowthaman struct sigma_conn *conn,
606d66913acSpriyadharshini gowthaman struct sigma_cmd *cmd)
607d66913acSpriyadharshini gowthaman {
608e7df6d86Svamsi krishna const char *rmFTMRFlagStr = get_param(cmd, "RMEnabledCapBitmap");
609e7df6d86Svamsi krishna const char *interworkingEn = get_param(cmd, "Interworking");
610d66913acSpriyadharshini gowthaman unsigned int rmFTMRFlag = 0;
6110dd682a8Spriyadharshini gowthaman unsigned int i, interworking = 0;
612d66913acSpriyadharshini gowthaman char rmBitFlags[LOC_MAX_RM_FLAGS][LOC_RM_FLAG_VAL_ARRAY];
613d66913acSpriyadharshini gowthaman
614d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s", __func__);
615d66913acSpriyadharshini gowthaman
616d66913acSpriyadharshini gowthaman memset(rmBitFlags, 0, sizeof(rmBitFlags));
617d66913acSpriyadharshini gowthaman
618d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - 1", __func__);
619d66913acSpriyadharshini gowthaman /*
6200dd682a8Spriyadharshini gowthaman * This function is used to configure the RM capability bits and
6210dd682a8Spriyadharshini gowthaman * the Interworking bit only.
6220dd682a8Spriyadharshini gowthaman * If these parameters are not present just returning COMPLETE
623d66913acSpriyadharshini gowthaman * because all other parameters are ignored.
624d66913acSpriyadharshini gowthaman */
6250dd682a8Spriyadharshini gowthaman if (!rmFTMRFlagStr && !interworkingEn) {
626d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - 2", __func__);
627d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, "%s - Did not get %s",
628e7df6d86Svamsi krishna __func__, "RMEnabledCapBitmap");
629d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_COMPLETE, NULL);
630d66913acSpriyadharshini gowthaman return 0;
631d66913acSpriyadharshini gowthaman }
632d66913acSpriyadharshini gowthaman
6330dd682a8Spriyadharshini gowthaman if (rmFTMRFlagStr) {
634d66913acSpriyadharshini gowthaman rmFTMRFlag = 25; /* Default invalid */
635d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - rmFTMRFlagStr: %s",
636d66913acSpriyadharshini gowthaman __func__, rmFTMRFlagStr);
637d66913acSpriyadharshini gowthaman parse_rm_bits(dut, rmFTMRFlagStr, rmBitFlags);
638d66913acSpriyadharshini gowthaman for (i = 0; i < LOC_MAX_RM_FLAGS; i++) {
639d66913acSpriyadharshini gowthaman if (rmBitFlags[i][0] == 34)
640d66913acSpriyadharshini gowthaman rmFTMRFlag = rmBitFlags[i][1];
641d66913acSpriyadharshini gowthaman }
642d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - rmFTMRFlag %u",
643d66913acSpriyadharshini gowthaman __func__, rmFTMRFlag);
644d66913acSpriyadharshini gowthaman if (rmFTMRFlag == 0) { /* Disable RM - FTMRR capability */
6450dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
6460dd682a8Spriyadharshini gowthaman "%s - Disabling RM - FTMRR",
647d66913acSpriyadharshini gowthaman __func__);
648*016ae6c8SJouni Malinen if (wpa_command(get_station_ifname(dut),
649*016ae6c8SJouni Malinen WPA_RM_DISABLE) < 0) {
650d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL);
651d66913acSpriyadharshini gowthaman return -1;
652d66913acSpriyadharshini gowthaman }
653d66913acSpriyadharshini gowthaman } else if (rmFTMRFlag == 1) { /* Enable RM - FTMRR capability */
6540dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
6550dd682a8Spriyadharshini gowthaman "%s - Enabling RM - FTMRR",
656d66913acSpriyadharshini gowthaman __func__);
657*016ae6c8SJouni Malinen if (wpa_command(get_station_ifname(dut),
658*016ae6c8SJouni Malinen WPA_RM_ENABLE) < 0) {
659d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL);
660d66913acSpriyadharshini gowthaman return 0;
661d66913acSpriyadharshini gowthaman }
662d66913acSpriyadharshini gowthaman } else {
663d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR,
6640dd682a8Spriyadharshini gowthaman "%s - No Setting for - FTMRR",
6650dd682a8Spriyadharshini gowthaman __func__);
666d66913acSpriyadharshini gowthaman }
667d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO,
668d66913acSpriyadharshini gowthaman "%s - Succeeded in Enabling/Disabling RM Capability for FTMRR",
669d66913acSpriyadharshini gowthaman __func__);
6700dd682a8Spriyadharshini gowthaman }
6710dd682a8Spriyadharshini gowthaman
6720dd682a8Spriyadharshini gowthaman if (interworkingEn) {
6730dd682a8Spriyadharshini gowthaman sscanf(interworkingEn, "%u", &interworking);
6740dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - interworking: %u",
6750dd682a8Spriyadharshini gowthaman __func__, interworking);
6760dd682a8Spriyadharshini gowthaman if (interworking)
677*016ae6c8SJouni Malinen wpa_command(get_station_ifname(dut),
6780dd682a8Spriyadharshini gowthaman WPA_INTERWORKING_ENABLE);
6790dd682a8Spriyadharshini gowthaman else
680*016ae6c8SJouni Malinen wpa_command(get_station_ifname(dut),
6810dd682a8Spriyadharshini gowthaman WPA_INTERWORKING_DISABLE);
6820dd682a8Spriyadharshini gowthaman }
6830dd682a8Spriyadharshini gowthaman
684d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_COMPLETE, NULL);
685d66913acSpriyadharshini gowthaman return 0;
686d66913acSpriyadharshini gowthaman }
6873b9fdd38SVinay Gannevaram
6883b9fdd38SVinay Gannevaram
lowi_cmd_sta_reset_default(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)6893b9fdd38SVinay Gannevaram int lowi_cmd_sta_reset_default(struct sigma_dut *dut, struct sigma_conn *conn,
6903b9fdd38SVinay Gannevaram struct sigma_cmd *cmd)
6913b9fdd38SVinay Gannevaram {
6923b9fdd38SVinay Gannevaram #ifdef ANDROID_WIFI_HAL
6933b9fdd38SVinay Gannevaram if (wifi_hal_initialize(dut)) {
6943b9fdd38SVinay Gannevaram sigma_dut_print(dut, DUT_MSG_ERROR,
6953b9fdd38SVinay Gannevaram "%s - wifihal init failed for - LOC",
6963b9fdd38SVinay Gannevaram __func__);
6973b9fdd38SVinay Gannevaram return -1;
6983b9fdd38SVinay Gannevaram }
6993b9fdd38SVinay Gannevaram #endif /* ANDROID_WIFI_HAL */
7003b9fdd38SVinay Gannevaram
7013b9fdd38SVinay Gannevaram return 0;
7023b9fdd38SVinay Gannevaram }
703