xref: /wlan-dirver/utils/sigma-dut/ftm.c (revision 5fc02a04429aaf8fb11075c31f8176b6569b8653)
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 
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 	 * channel 36
77d66913acSpriyadharshini gowthaman 	 * center frequency of 5210
78d66913acSpriyadharshini gowthaman 	 */
79d66913acSpriyadharshini gowthaman 	band = 1;
80d66913acSpriyadharshini gowthaman 	primary_ch = 36;
81d66913acSpriyadharshini gowthaman 	center_freq = 5210;
82d66913acSpriyadharshini gowthaman 
83d66913acSpriyadharshini gowthaman #define FMT_BW_NO_PREF 0
84d66913acSpriyadharshini gowthaman #define FMT_BW_HT_20 9
85d66913acSpriyadharshini gowthaman #define FMT_BW_VHT_20 10
86d66913acSpriyadharshini gowthaman #define FMT_BW_HT_40 11
87d66913acSpriyadharshini gowthaman #define FMT_BW_VHT_40 12
88d66913acSpriyadharshini gowthaman #define FMT_BW_VHT_80 13
89d66913acSpriyadharshini gowthaman 
90d66913acSpriyadharshini gowthaman #define LOC_BW_20 0
91d66913acSpriyadharshini gowthaman #define LOC_BW_40 1
92d66913acSpriyadharshini gowthaman #define LOC_BW_80 2
93d66913acSpriyadharshini gowthaman #define LOC_PREAMBLE_HT 1
94d66913acSpriyadharshini gowthaman #define LOC_PREAMBLE_VHT 2
95d66913acSpriyadharshini gowthaman 	switch (loc_cmd->fmtbw) {
96d66913acSpriyadharshini gowthaman 	case FMT_BW_NO_PREF:
97d66913acSpriyadharshini gowthaman 	case FMT_BW_HT_20:
98d66913acSpriyadharshini gowthaman 		bw = LOC_BW_20;
99d66913acSpriyadharshini gowthaman 		preamble = LOC_PREAMBLE_HT;
100d66913acSpriyadharshini gowthaman 		primary_ch = 36;
101d66913acSpriyadharshini gowthaman 		center_freq = 5180;
102d66913acSpriyadharshini gowthaman 		break;
103d66913acSpriyadharshini gowthaman 	case FMT_BW_VHT_20:
104d66913acSpriyadharshini gowthaman 		bw = LOC_BW_20;
105d66913acSpriyadharshini gowthaman 		preamble = LOC_PREAMBLE_VHT;
106d66913acSpriyadharshini gowthaman 		primary_ch = 36;
107d66913acSpriyadharshini gowthaman 		center_freq = 5180;
108d66913acSpriyadharshini gowthaman 		break;
109d66913acSpriyadharshini gowthaman 	case FMT_BW_HT_40:
110d66913acSpriyadharshini gowthaman 		bw = LOC_BW_40;
111d66913acSpriyadharshini gowthaman 		preamble = LOC_PREAMBLE_HT;
112d66913acSpriyadharshini gowthaman 		primary_ch = 36;
113d66913acSpriyadharshini gowthaman 		center_freq = 5190;
114d66913acSpriyadharshini gowthaman 		break;
115d66913acSpriyadharshini gowthaman 	case FMT_BW_VHT_40:
116d66913acSpriyadharshini gowthaman 		bw = LOC_BW_40;
117d66913acSpriyadharshini gowthaman 		preamble = LOC_PREAMBLE_VHT;
118d66913acSpriyadharshini gowthaman 		primary_ch = 36;
119d66913acSpriyadharshini gowthaman 		center_freq = 5190;
120d66913acSpriyadharshini gowthaman 		break;
121d66913acSpriyadharshini gowthaman 	case FMT_BW_VHT_80:
122d66913acSpriyadharshini gowthaman 		bw = LOC_BW_80;
123d66913acSpriyadharshini gowthaman 		preamble = LOC_PREAMBLE_VHT;
124d66913acSpriyadharshini gowthaman 		primary_ch = 36;
125d66913acSpriyadharshini gowthaman 		center_freq = 5210;
126d66913acSpriyadharshini gowthaman 		break;
127d66913acSpriyadharshini gowthaman 	default:
128d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
129d66913acSpriyadharshini gowthaman 				"%s - Bad Format/BW received", __func__);
130*5fc02a04SSrikanth Marepalli 		fclose(xml);
131d66913acSpriyadharshini gowthaman 		return -1;
132d66913acSpriyadharshini gowthaman 	}
133d66913acSpriyadharshini gowthaman 
134d66913acSpriyadharshini gowthaman #define LOC_CAPI_DEFAULT_FTMS_PER_BURST 5
135d66913acSpriyadharshini gowthaman #define LOC_CAPI_DEFAULT_BURST_DUR 10
136d66913acSpriyadharshini gowthaman 	fprintf(xml, "<body>\n");
137d66913acSpriyadharshini gowthaman 	fprintf(xml, "  <ranging>\n");
138d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <ap>\n");
139d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <band>%u</band>\n", band);
140d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <rttType>3</rttType>\n");
141d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <numFrames>%u</numFrames>\n",
142d66913acSpriyadharshini gowthaman 		LOC_CAPI_DEFAULT_FTMS_PER_BURST);
143d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <bw>%u</bw>\n", bw);
144d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <preamble>%u</preamble>\n", preamble);
145d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <asap>%u</asap>\n", loc_cmd->asap);
146d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <lci>%u</lci>\n", loc_cmd->lci);
147d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <civic>%u</civic>\n", loc_cmd->locCivic);
148d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <burstsexp>%u</burstsexp>\n", loc_cmd->burstExp);
149d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <burstduration>%u</burstduration>\n",
150d66913acSpriyadharshini gowthaman 		LOC_CAPI_DEFAULT_BURST_DUR);
151d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <burstperiod>%u</burstperiod>\n", 0);
152d66913acSpriyadharshini gowthaman 	/* Use parameters from LOWI cache */
153d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <paramControl>%u</paramControl>\n", 0);
15426357a04Spriyadharshini gowthaman 	fprintf(xml, "    <ptsftimer>%u</ptsftimer>\n", 0);
155d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <center_freq1>%u</center_freq1>\n", center_freq);
156d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <center_freq2>0</center_freq2>\n");
157d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <ch>%u</ch>\n", primary_ch);
158d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <mac>%s</mac>\n", dst_mac_str);
159d66913acSpriyadharshini gowthaman 	fprintf(xml, "    </ap>\n");
160d66913acSpriyadharshini gowthaman 	fprintf(xml, "  </ranging>\n");
161d66913acSpriyadharshini gowthaman 	fprintf(xml, "  <summary>\n");
162d66913acSpriyadharshini gowthaman 	fprintf(xml, "    <mac>%s</mac>\n", dst_mac_str);
163d66913acSpriyadharshini gowthaman 	fprintf(xml, "  </summary>\n");
164d66913acSpriyadharshini gowthaman 	fprintf(xml, "</body>\n");
165d66913acSpriyadharshini gowthaman 
166d66913acSpriyadharshini gowthaman 	fclose(xml);
167d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO,
168d66913acSpriyadharshini gowthaman 			"%s - Successfully created XML file", __func__);
169d66913acSpriyadharshini gowthaman 	return 0;
170d66913acSpriyadharshini gowthaman }
171d66913acSpriyadharshini gowthaman 
172d66913acSpriyadharshini gowthaman 
173d66913acSpriyadharshini gowthaman static int pass_request_to_ltest(struct sigma_dut *dut, enum lowi_tst_cmd cmd,
174d66913acSpriyadharshini gowthaman 				 const char *params)
175d66913acSpriyadharshini gowthaman {
176d66913acSpriyadharshini gowthaman #define MAX_ANQP_CMND_SIZE 256
177d66913acSpriyadharshini gowthaman 	int ret;
178d66913acSpriyadharshini gowthaman 	const char *cmd_str;
179d66913acSpriyadharshini gowthaman 	char lowi_anqp_query[MAX_ANQP_CMND_SIZE];
180d66913acSpriyadharshini gowthaman 
181d66913acSpriyadharshini gowthaman 	switch (cmd) {
182d66913acSpriyadharshini gowthaman 	case LOWI_TST_RANGING:
183d66913acSpriyadharshini gowthaman 		cmd_str = LOC_LOWI_TEST_RANGING;
184d66913acSpriyadharshini gowthaman 		break;
185d66913acSpriyadharshini gowthaman 	case LOWI_TST_NEIGHBOR_REPORT_REQ:
186d66913acSpriyadharshini gowthaman 		cmd_str = LOC_LOWI_TEST_NEIGHBOR_RPT_REQ;
187d66913acSpriyadharshini gowthaman 		break;
188d66913acSpriyadharshini gowthaman 	case LOWI_TST_ANQP_REQ:
189d66913acSpriyadharshini gowthaman 		if (!params) {
190d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_ERROR,
191d66913acSpriyadharshini gowthaman 					"%s - No Destination Mac provided for ANQP Query",
192d66913acSpriyadharshini gowthaman 					__func__);
193d66913acSpriyadharshini gowthaman 			return -1;
194d66913acSpriyadharshini gowthaman 		}
195d66913acSpriyadharshini gowthaman 
196d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO,
197d66913acSpriyadharshini gowthaman 				"%s - Destination Mac provided for ANQP Query: %s",
198d66913acSpriyadharshini gowthaman 				__func__, params);
199d66913acSpriyadharshini gowthaman 
200d66913acSpriyadharshini gowthaman 		snprintf(lowi_anqp_query, MAX_ANQP_CMND_SIZE, "%s%s",
201d66913acSpriyadharshini gowthaman 			 LOC_LOWI_TEST_ANQP_REQ, params);
202d66913acSpriyadharshini gowthaman 		cmd_str = lowi_anqp_query;
203d66913acSpriyadharshini gowthaman 		break;
204d66913acSpriyadharshini gowthaman 	default:
205d66913acSpriyadharshini gowthaman 		cmd_str = LOC_LOWI_TEST_DISCOVERY;
206d66913acSpriyadharshini gowthaman 		break;
207d66913acSpriyadharshini gowthaman 	}
208d66913acSpriyadharshini gowthaman 
209d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO, "%s - 1 - Running command: %s",
210d66913acSpriyadharshini gowthaman 			__func__, LOC_LOWI_TEST_DISCOVERY);
211d66913acSpriyadharshini gowthaman 	ret = system(LOC_LOWI_TEST_DISCOVERY);
212d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO,
213d66913acSpriyadharshini gowthaman 			"%s - Finished Performing Discovery Scan through LOWI_test: ret: %d",
214d66913acSpriyadharshini gowthaman 			__func__, ret);
215d66913acSpriyadharshini gowthaman 	sleep(1);
216d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO, "%s - 2 - Running command: %s",
217d66913acSpriyadharshini gowthaman 			__func__, cmd_str);
218d66913acSpriyadharshini gowthaman 	ret = system(cmd_str);
219d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO,
220d66913acSpriyadharshini gowthaman 			"%s - Finished Performing command: %s, got ret: %d",
221d66913acSpriyadharshini gowthaman 			__func__, cmd_str, ret);
222d66913acSpriyadharshini gowthaman 
223d66913acSpriyadharshini gowthaman 	return ret;
224d66913acSpriyadharshini gowthaman }
225d66913acSpriyadharshini gowthaman 
226d66913acSpriyadharshini gowthaman 
227d66913acSpriyadharshini gowthaman int loc_cmd_sta_exec_action(struct sigma_dut *dut, struct sigma_conn *conn,
228d66913acSpriyadharshini gowthaman 			    struct sigma_cmd *cmd)
229d66913acSpriyadharshini gowthaman {
230d66913acSpriyadharshini gowthaman 	const char *params = NULL;
231d66913acSpriyadharshini gowthaman 	enum lowi_tst_cmd cmnd = LOWI_TST_RANGING;
232e7df6d86Svamsi krishna 	const char *program = get_param(cmd, "prog");
233e7df6d86Svamsi krishna 	const char *loc_op = get_param(cmd, "Trigger");
234e7df6d86Svamsi krishna 	const char *interface = get_param(cmd, "interface");
235d66913acSpriyadharshini gowthaman 
236e7df6d86Svamsi krishna 	const char *destMacStr = get_param(cmd, "destmac");
237e7df6d86Svamsi krishna 	const char *burstExp = get_param(cmd, "burstsexponent");
238e7df6d86Svamsi krishna 	const char *asap = get_param(cmd, "ASAP");
239e7df6d86Svamsi krishna 	const char *fmtbw = get_param(cmd, "formatbwftm");
240e7df6d86Svamsi krishna 	const char *locCivic = get_param(cmd, "askforloccivic");
241e7df6d86Svamsi krishna 	const char *lci = get_param(cmd, "askforlci");
242d66913acSpriyadharshini gowthaman 	struct capi_loc_cmd loc_cmd;
243d66913acSpriyadharshini gowthaman 
244d66913acSpriyadharshini gowthaman 	memset(&loc_cmd, 0, sizeof(loc_cmd));
245d66913acSpriyadharshini gowthaman 
246d66913acSpriyadharshini gowthaman 	if (!loc_op) {
247d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
248d66913acSpriyadharshini gowthaman 				"%s - No Operation! - Aborting", __func__);
249d66913acSpriyadharshini gowthaman 		return -1;
250d66913acSpriyadharshini gowthaman 	}
251d66913acSpriyadharshini gowthaman 
252e7df6d86Svamsi krishna 	cmnd = strcasecmp(loc_op, "ANQPQuery") == 0 ?
253d66913acSpriyadharshini gowthaman 		LOWI_TST_ANQP_REQ : LOWI_TST_RANGING;
254d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO, "%s - Going to perform: %s",
255d66913acSpriyadharshini gowthaman 			__func__, loc_op);
256d66913acSpriyadharshini gowthaman 
257d66913acSpriyadharshini gowthaman 	if (!program) {
258d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
259d66913acSpriyadharshini gowthaman 				"%s - No Program in Command! - Aborting",
260d66913acSpriyadharshini gowthaman 				__func__);
261d66913acSpriyadharshini gowthaman 		return -1;
262d66913acSpriyadharshini gowthaman 	}
263d66913acSpriyadharshini gowthaman 
264d66913acSpriyadharshini gowthaman 	if (!interface) {
265d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
266d66913acSpriyadharshini gowthaman 				"%s - Incomplete command in LOC CAPI request",
267d66913acSpriyadharshini gowthaman 				__func__);
268d66913acSpriyadharshini gowthaman 		send_resp(dut, conn, SIGMA_ERROR,
269d66913acSpriyadharshini gowthaman 			  "ErrMsg,Incomplete Loc CAPI command - missing interface");
270d66913acSpriyadharshini gowthaman 		return 0;
271d66913acSpriyadharshini gowthaman 	}
272d66913acSpriyadharshini gowthaman 
273d66913acSpriyadharshini gowthaman 	if (!destMacStr) {
274d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
275d66913acSpriyadharshini gowthaman 				"%s - Incomplete command in LOC CAPI request",
276d66913acSpriyadharshini gowthaman 				__func__);
277d66913acSpriyadharshini gowthaman 		send_resp(dut, conn, SIGMA_ERROR,
278d66913acSpriyadharshini gowthaman 			  "ErrMsg,Incomplete Loc CAPI command - missing MAC");
279d66913acSpriyadharshini gowthaman 		return 0;
280d66913acSpriyadharshini gowthaman 	}
281d66913acSpriyadharshini gowthaman 
282d66913acSpriyadharshini gowthaman 	if (cmnd == LOWI_TST_RANGING) {
283d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO, "%s - LOWI_TST_RANGING",
284d66913acSpriyadharshini gowthaman 				__func__);
285d66913acSpriyadharshini gowthaman 		if (!burstExp) {
286d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_ERROR,
287d66913acSpriyadharshini gowthaman 					"%s - Incomplete command in LOC CAPI request",
288d66913acSpriyadharshini gowthaman 					__func__);
289d66913acSpriyadharshini gowthaman 			send_resp(dut, conn, SIGMA_ERROR,
290d66913acSpriyadharshini gowthaman 				  "ErrMsg,Incomplete Loc CAPI command - missing Burst Exp");
291d66913acSpriyadharshini gowthaman 			return 0;
292d66913acSpriyadharshini gowthaman 		}
293d66913acSpriyadharshini gowthaman 
294d66913acSpriyadharshini gowthaman 		if (!asap) {
295d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_INFO,
296d66913acSpriyadharshini gowthaman 					"%s - Incomplete command in LOC CAPI request",
297d66913acSpriyadharshini gowthaman 					__func__);
298d66913acSpriyadharshini gowthaman 			send_resp(dut, conn, SIGMA_ERROR,
299d66913acSpriyadharshini gowthaman 				  "ErrMsg,Incomplete Loc CAPI command - missing ASAP");
300d66913acSpriyadharshini gowthaman 			return 0;
301d66913acSpriyadharshini gowthaman 		}
302d66913acSpriyadharshini gowthaman 
303d66913acSpriyadharshini gowthaman 		if (!fmtbw) {
304d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_ERROR,
305d66913acSpriyadharshini gowthaman 					"%s - Incomplete command in LOC CAPI request",
306d66913acSpriyadharshini gowthaman 					__func__);
307d66913acSpriyadharshini gowthaman 			send_resp(dut, conn, SIGMA_ERROR,
308d66913acSpriyadharshini gowthaman 				  "ErrMsg,Incomplete Loc CAPI command - missing Format & BW");
309d66913acSpriyadharshini gowthaman 			return 0;
310d66913acSpriyadharshini gowthaman 		}
311d66913acSpriyadharshini gowthaman 
312d66913acSpriyadharshini gowthaman 		if (!locCivic) {
313d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_ERROR,
314d66913acSpriyadharshini gowthaman 					"%s - Incomplete command in LOC CAPI request",
315d66913acSpriyadharshini gowthaman 					__func__);
316d66913acSpriyadharshini gowthaman 			send_resp(dut, conn, SIGMA_ERROR,
317d66913acSpriyadharshini gowthaman 				  "ErrMsg,Incomplete Loc CAPI command - missing Location Civic");
318d66913acSpriyadharshini gowthaman 			return 0;
319d66913acSpriyadharshini gowthaman 		}
320d66913acSpriyadharshini gowthaman 
321d66913acSpriyadharshini gowthaman 		if (!lci) {
322d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_ERROR,
323d66913acSpriyadharshini gowthaman 					"%s - Incomplete command in LOC CAPI request",
324d66913acSpriyadharshini gowthaman 					__func__);
325d66913acSpriyadharshini gowthaman 			send_resp(dut, conn, SIGMA_ERROR,
326d66913acSpriyadharshini gowthaman 				  "ErrMsg,Incomplete Loc CAPI command - missing LCI");
327d66913acSpriyadharshini gowthaman 			return 0;
328d66913acSpriyadharshini gowthaman 		}
329d66913acSpriyadharshini gowthaman 
330e7df6d86Svamsi krishna 		if (strcasecmp(program, "loc") != 0) {
331d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_ERROR,
332d66913acSpriyadharshini gowthaman 					"%s - Unsupported Program: %s",
333d66913acSpriyadharshini gowthaman 					__func__, program);
334d66913acSpriyadharshini gowthaman 			send_resp(dut, conn, SIGMA_ERROR,
335d66913acSpriyadharshini gowthaman 				  "ErrMsg,Unsupported program");
336d66913acSpriyadharshini gowthaman 			return 0;
337d66913acSpriyadharshini gowthaman 		}
338d66913acSpriyadharshini gowthaman 
339e7df6d86Svamsi krishna 		if (strcasecmp(interface, "wlan0") != 0) {
340d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_INFO,
341d66913acSpriyadharshini gowthaman 					"%s - Unsupported Interface Type: %s",
342d66913acSpriyadharshini gowthaman 					__func__, interface);
343d66913acSpriyadharshini gowthaman 			send_resp(dut, conn, SIGMA_ERROR,
344d66913acSpriyadharshini gowthaman 				  "ErrMsg,Unsupported Interface Type");
345d66913acSpriyadharshini gowthaman 			return 0;
346d66913acSpriyadharshini gowthaman 		}
347d66913acSpriyadharshini gowthaman 
348d66913acSpriyadharshini gowthaman 		sscanf(burstExp, "%u", &loc_cmd.burstExp);
349d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO, "%s - burstExp: %u",
350d66913acSpriyadharshini gowthaman 				__func__, loc_cmd.burstExp);
351d66913acSpriyadharshini gowthaman 		sscanf(asap, "%u", &loc_cmd.asap);
352d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO, "%s - asap: %u",
353d66913acSpriyadharshini gowthaman 				__func__, loc_cmd.asap);
354d66913acSpriyadharshini gowthaman 		sscanf(fmtbw, "%u", &loc_cmd.fmtbw);
355d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO, "%s - fmtbw: %u",
356d66913acSpriyadharshini gowthaman 				__func__, loc_cmd.fmtbw);
357d66913acSpriyadharshini gowthaman 		sscanf(locCivic, "%u", &loc_cmd.locCivic);
358d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO, "%s - locCivic: %u",
359d66913acSpriyadharshini gowthaman 				__func__, loc_cmd.locCivic);
360d66913acSpriyadharshini gowthaman 		sscanf(lci, "%u", &loc_cmd.lci);
361d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO, "%s - lci: %u",
362d66913acSpriyadharshini gowthaman 				__func__, loc_cmd.lci);
363d66913acSpriyadharshini gowthaman 
364d66913acSpriyadharshini gowthaman 		if (loc_write_xml_file(dut, destMacStr, &loc_cmd) < 0) {
365d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_ERROR,
366d66913acSpriyadharshini gowthaman 					"%s - Failed to write to XML file because of bad command",
367d66913acSpriyadharshini gowthaman 					__func__);
368d66913acSpriyadharshini gowthaman 			send_resp(dut, conn, SIGMA_ERROR,
369d66913acSpriyadharshini gowthaman 				  "ErrMsg,Bad CAPI command");
370d66913acSpriyadharshini gowthaman 			return 0;
371d66913acSpriyadharshini gowthaman 		}
372d66913acSpriyadharshini gowthaman 	} else {
373d66913acSpriyadharshini gowthaman 		/* ANQP Query */
374d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO,
375d66913acSpriyadharshini gowthaman 				"%s - LOWI_TST_ANQP_REQ", __func__);
376d66913acSpriyadharshini gowthaman 		params = destMacStr;
377d66913acSpriyadharshini gowthaman 	}
378d66913acSpriyadharshini gowthaman 
379d66913acSpriyadharshini gowthaman 	if (pass_request_to_ltest(dut, cmnd, params) < 0) {
380d66913acSpriyadharshini gowthaman 		/* Loc operation been failed. */
381d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
382d66913acSpriyadharshini gowthaman 				"%s - Failed to initiate Loc command",
383d66913acSpriyadharshini gowthaman 				__func__);
384d66913acSpriyadharshini gowthaman 		send_resp(dut, conn, SIGMA_ERROR,
385d66913acSpriyadharshini gowthaman 			  "ErrMsg,Failed to initiate Loc command");
386d66913acSpriyadharshini gowthaman 		return 0;
387d66913acSpriyadharshini gowthaman 	}
388d66913acSpriyadharshini gowthaman 
389d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO,
390d66913acSpriyadharshini gowthaman 			"%s - Succeeded to initiate Loc command", __func__);
391d66913acSpriyadharshini gowthaman 	send_resp(dut, conn, SIGMA_COMPLETE, NULL);
392d66913acSpriyadharshini gowthaman 	return 0;
393d66913acSpriyadharshini gowthaman }
394d66913acSpriyadharshini gowthaman 
395d66913acSpriyadharshini gowthaman 
396d66913acSpriyadharshini gowthaman int loc_cmd_sta_send_frame(struct sigma_dut *dut, struct sigma_conn *conn,
397d66913acSpriyadharshini gowthaman 			   struct sigma_cmd *cmd)
398d66913acSpriyadharshini gowthaman {
3990dd682a8Spriyadharshini gowthaman 	const char *address3Cmnd = WPA_ADDRESS_3_DISABLE;
400d66913acSpriyadharshini gowthaman 	enum lowi_tst_cmd cmnd = LOWI_TST_NEIGHBOR_REPORT_REQ; /* Default */
401d66913acSpriyadharshini gowthaman 	/* Mandatory arguments */
402e7df6d86Svamsi krishna 	const char *interface = get_param(cmd, "interface");
403e7df6d86Svamsi krishna 	const char *program = get_param(cmd, "program");
404e7df6d86Svamsi krishna 	const char *destMacStr = get_param(cmd, "destmac");
405e7df6d86Svamsi krishna 	const char *frameName = get_param(cmd, "FrameName");
406d66913acSpriyadharshini gowthaman 
407d66913acSpriyadharshini gowthaman 	/* Optional Arguments */
408e7df6d86Svamsi krishna 	const char *locCivic = get_param(cmd, "askforloccivic");
409e7df6d86Svamsi krishna 	const char *lci = get_param(cmd, "askforlci");
410e7df6d86Svamsi krishna 	const char *fqdn = get_param(cmd, "AskForPublicIdentifierURI-FQDN");
411e7df6d86Svamsi krishna 	const char *address3 = get_param(cmd, "address3");
412d66913acSpriyadharshini gowthaman 
413d66913acSpriyadharshini gowthaman 	const char *params = NULL;
414d66913acSpriyadharshini gowthaman 
415d66913acSpriyadharshini gowthaman 	if (!program) {
416d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
417d66913acSpriyadharshini gowthaman 				"%s - No Program in Command! - Aborting",
418d66913acSpriyadharshini gowthaman 				__func__);
419d66913acSpriyadharshini gowthaman 		return -1;
420d66913acSpriyadharshini gowthaman 	}
421d66913acSpriyadharshini gowthaman 
422d66913acSpriyadharshini gowthaman 	if (!interface) {
423d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
424d66913acSpriyadharshini gowthaman 				"%s - Incomplete command in LOC CAPI request",
425d66913acSpriyadharshini gowthaman 				__func__);
426d66913acSpriyadharshini gowthaman 		send_resp(dut, conn, SIGMA_ERROR, NULL);
427d66913acSpriyadharshini gowthaman 		return 0;
428d66913acSpriyadharshini gowthaman 	}
429d66913acSpriyadharshini gowthaman 
430d66913acSpriyadharshini gowthaman 	if (!frameName) {
431d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
432d66913acSpriyadharshini gowthaman 				"%s - Incomplete command in LOC CAPI request",
433d66913acSpriyadharshini gowthaman 				__func__);
434d66913acSpriyadharshini gowthaman 		send_resp(dut, conn, SIGMA_ERROR, NULL);
435d66913acSpriyadharshini gowthaman 		return 0;
436d66913acSpriyadharshini gowthaman 	}
437d66913acSpriyadharshini gowthaman 
438e7df6d86Svamsi krishna 	if (strcasecmp(frameName, "AnqpQuery") == 0 && !destMacStr) {
439d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
440d66913acSpriyadharshini gowthaman 				"%s - Incomplete command in LOC CAPI request",
441d66913acSpriyadharshini gowthaman 				__func__);
442d66913acSpriyadharshini gowthaman 		send_resp(dut, conn, SIGMA_ERROR, NULL);
443d66913acSpriyadharshini gowthaman 		return 0;
444d66913acSpriyadharshini gowthaman 	}
445d66913acSpriyadharshini gowthaman 
446d66913acSpriyadharshini gowthaman 	if (!locCivic)
447d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
448d66913acSpriyadharshini gowthaman 				"%s - Command missing LocCivic", __func__);
449d66913acSpriyadharshini gowthaman 	if (!lci)
450d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
451d66913acSpriyadharshini gowthaman 				"%s - Command missing LCI", __func__);
452d66913acSpriyadharshini gowthaman 	if (!fqdn)
453d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
454d66913acSpriyadharshini gowthaman 				"%s - Command missing FQDN", __func__);
4550dd682a8Spriyadharshini gowthaman 	if (!address3) {
4560dd682a8Spriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
4570dd682a8Spriyadharshini gowthaman 				"%s - Command missing address3", __func__);
4580dd682a8Spriyadharshini gowthaman 	} else {
4590dd682a8Spriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_DEBUG, "%s - address3: %s",
4600dd682a8Spriyadharshini gowthaman 				__func__, address3);
461e7df6d86Svamsi krishna 		if (strcasecmp(address3, "FF:FF:FF:FF:FF:FF") == 0)
4620dd682a8Spriyadharshini gowthaman 			address3Cmnd = WPA_ADDRESS_3_ENABLE;
4630dd682a8Spriyadharshini gowthaman 		else
4640dd682a8Spriyadharshini gowthaman 			address3Cmnd = WPA_ADDRESS_3_DISABLE;
4650dd682a8Spriyadharshini gowthaman 	}
466d66913acSpriyadharshini gowthaman 
467e7df6d86Svamsi krishna 	if (strcasecmp(program, "loc") != 0) {
468d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
469d66913acSpriyadharshini gowthaman 				"%s - Unsupported Program: %s", __func__,
470d66913acSpriyadharshini gowthaman 				program);
471d66913acSpriyadharshini gowthaman 		send_resp(dut, conn, SIGMA_ERROR, NULL);
472d66913acSpriyadharshini gowthaman 		return 0;
473d66913acSpriyadharshini gowthaman 	}
474d66913acSpriyadharshini gowthaman 
475d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO, "%s - Triggering Frame: %s",
476d66913acSpriyadharshini gowthaman 			__func__, frameName);
477e7df6d86Svamsi krishna 	if (strcasecmp(frameName, "AnqpQuery") == 0) {
478d66913acSpriyadharshini gowthaman 		cmnd = LOWI_TST_ANQP_REQ;
479d66913acSpriyadharshini gowthaman 		params = destMacStr;
480d66913acSpriyadharshini gowthaman 	} else {
481d66913acSpriyadharshini gowthaman 		cmnd = LOWI_TST_NEIGHBOR_REPORT_REQ;
482d66913acSpriyadharshini gowthaman 	}
483d66913acSpriyadharshini gowthaman 
4840dd682a8Spriyadharshini gowthaman 	if (cmnd == LOWI_TST_ANQP_REQ) {
4850dd682a8Spriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_DEBUG, "%s - Executing command %s",
4860dd682a8Spriyadharshini gowthaman 				__func__, address3Cmnd);
4870dd682a8Spriyadharshini gowthaman 		if (wpa_command(get_station_ifname(), address3Cmnd) < 0) {
4880dd682a8Spriyadharshini gowthaman 			send_resp(dut, conn, SIGMA_ERROR, NULL);
4890dd682a8Spriyadharshini gowthaman 			return -1;
4900dd682a8Spriyadharshini gowthaman 		}
4910dd682a8Spriyadharshini gowthaman 	}
492d66913acSpriyadharshini gowthaman 	if (pass_request_to_ltest(dut, cmnd, params) < 0) {
493d66913acSpriyadharshini gowthaman 		/* Loc operation has failed. */
494d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
495d66913acSpriyadharshini gowthaman 				"%s - Failed to initiate Loc command",
496d66913acSpriyadharshini gowthaman 				__func__);
497d66913acSpriyadharshini gowthaman 		send_resp(dut, conn, SIGMA_ERROR, NULL);
498d66913acSpriyadharshini gowthaman 		return 0;
499d66913acSpriyadharshini gowthaman 	}
500d66913acSpriyadharshini gowthaman 
501d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO,
502d66913acSpriyadharshini gowthaman 			"%s - Succeeded to initiate Loc command", __func__);
503d66913acSpriyadharshini gowthaman 	send_resp(dut, conn, SIGMA_COMPLETE, NULL);
504d66913acSpriyadharshini gowthaman 	return 0;
505d66913acSpriyadharshini gowthaman }
506d66913acSpriyadharshini gowthaman 
507d66913acSpriyadharshini gowthaman 
508d66913acSpriyadharshini gowthaman enum e_rm_parse_states {
509d66913acSpriyadharshini gowthaman 	LOC_LOOKING_FOR_BIT = 0,
510d66913acSpriyadharshini gowthaman 	LOC_LOOKING_FOR_VAL,
511d66913acSpriyadharshini gowthaman 	LOC_MAX
512d66913acSpriyadharshini gowthaman };
513d66913acSpriyadharshini gowthaman 
514d66913acSpriyadharshini gowthaman 
515d66913acSpriyadharshini gowthaman void parse_rm_bits(struct sigma_dut *dut, const char *rmFlags,
516d66913acSpriyadharshini gowthaman 		   char rmBitFlags[LOC_MAX_RM_FLAGS][LOC_RM_FLAG_VAL_ARRAY])
517d66913acSpriyadharshini gowthaman {
518d66913acSpriyadharshini gowthaman 
519d66913acSpriyadharshini gowthaman 	unsigned int bitPos = 0;
520d66913acSpriyadharshini gowthaman 	unsigned int bitVal = 0;
521d66913acSpriyadharshini gowthaman 	unsigned int idx = 0;
522d66913acSpriyadharshini gowthaman 	unsigned int i = 0;
523d66913acSpriyadharshini gowthaman 	enum e_rm_parse_states rmParseStates = LOC_LOOKING_FOR_BIT;
524d66913acSpriyadharshini gowthaman 	char temp = '\0';
525d66913acSpriyadharshini gowthaman 
526d66913acSpriyadharshini gowthaman 	if (!rmFlags) {
527d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR,
528d66913acSpriyadharshini gowthaman 				"%s - NULL pointer for rmFlags - Aborting", __func__);
529d66913acSpriyadharshini gowthaman 		return;
530d66913acSpriyadharshini gowthaman 	}
531d66913acSpriyadharshini gowthaman 
532d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO, "%s - rmFlags: %s",
533d66913acSpriyadharshini gowthaman 			__func__, rmFlags);
534d66913acSpriyadharshini gowthaman 	while (*rmFlags != '\0' && idx < LOC_MAX_RM_FLAGS) {
535d66913acSpriyadharshini gowthaman 		temp = *rmFlags;
536d66913acSpriyadharshini gowthaman 		rmFlags++;
537d66913acSpriyadharshini gowthaman 		switch (rmParseStates) {
538d66913acSpriyadharshini gowthaman 		case LOC_LOOKING_FOR_BIT:
539d66913acSpriyadharshini gowthaman 			if (temp >= '0' && temp <= '9') {
540d66913acSpriyadharshini gowthaman 				/* Parse Digit for bit Position */
541d66913acSpriyadharshini gowthaman 				bitPos = (bitPos * 10) + (temp - '0');
542d66913acSpriyadharshini gowthaman 				sigma_dut_print(dut, DUT_MSG_INFO,
543d66913acSpriyadharshini gowthaman 						"%s - LOC_LOOKING_FOR_BIT - parsing: %c, bitPos: %u",
544d66913acSpriyadharshini gowthaman 						__func__, temp, bitPos);
545d66913acSpriyadharshini gowthaman 			} else if (temp == ':') {
546d66913acSpriyadharshini gowthaman 				/* move to Parsing Bit Value */
547d66913acSpriyadharshini gowthaman 				sigma_dut_print(dut, DUT_MSG_INFO,
548d66913acSpriyadharshini gowthaman 						"%s - LOC_LOOKING_FOR_BIT - processing: %c, bitPos: %u",
549d66913acSpriyadharshini gowthaman 						__func__, temp, bitPos);
550d66913acSpriyadharshini gowthaman 				rmBitFlags[idx][0] = bitPos;
551d66913acSpriyadharshini gowthaman 				rmParseStates = LOC_LOOKING_FOR_VAL;
552d66913acSpriyadharshini gowthaman 			} else if (temp == ';') {
553d66913acSpriyadharshini gowthaman 				/* End of Bit-Value Pair, reset and look for New Bit Position */
554d66913acSpriyadharshini gowthaman 				sigma_dut_print(dut, DUT_MSG_INFO,
555d66913acSpriyadharshini gowthaman 						"%s - LOC_LOOKING_FOR_BIT - processing: %c",
556d66913acSpriyadharshini gowthaman 						__func__, temp);
557d66913acSpriyadharshini gowthaman 				rmBitFlags[idx][0] = bitPos;
558d66913acSpriyadharshini gowthaman 				/* rmBitFlags[idx][1] = bitVal; */
559d66913acSpriyadharshini gowthaman 				bitPos = 0;
560d66913acSpriyadharshini gowthaman 				bitVal = 0;
561d66913acSpriyadharshini gowthaman 				idx++;
562d66913acSpriyadharshini gowthaman 			} else { /* Ignore */
563d66913acSpriyadharshini gowthaman 				sigma_dut_print(dut, DUT_MSG_INFO,
564d66913acSpriyadharshini gowthaman 						"%s - LOC_LOOKING_FOR_BIT - ignoring: %c",
565d66913acSpriyadharshini gowthaman 						__func__, temp);
566d66913acSpriyadharshini gowthaman 			}
567d66913acSpriyadharshini gowthaman 			break;
568d66913acSpriyadharshini gowthaman 		case LOC_LOOKING_FOR_VAL:
569d66913acSpriyadharshini gowthaman 			if (temp == '0' || temp == '1') {
570d66913acSpriyadharshini gowthaman 				sigma_dut_print(dut, DUT_MSG_INFO,
571d66913acSpriyadharshini gowthaman 						"%s - LOC_LOOKING_FOR_VAL - processing: %c",
572d66913acSpriyadharshini gowthaman 						__func__, temp);
573d66913acSpriyadharshini gowthaman 				bitVal = temp - '0';
574d66913acSpriyadharshini gowthaman 				rmBitFlags[idx][1] = bitVal;
575d66913acSpriyadharshini gowthaman 			} else if (temp == ';') {
576d66913acSpriyadharshini gowthaman 				sigma_dut_print(dut, DUT_MSG_INFO,
577d66913acSpriyadharshini gowthaman 						"%s - LOC_LOOKING_FOR_VAL - processing: %c, bitPos: %u, bitVal: %u",
578d66913acSpriyadharshini gowthaman 						__func__, temp, bitPos, bitVal);
579d66913acSpriyadharshini gowthaman 				/* rmBitFlags[idx][0] = bitPos; */
580d66913acSpriyadharshini gowthaman 				/* rmBitFlags[idx][1] = bitVal; */
581d66913acSpriyadharshini gowthaman 				bitPos = 0;
582d66913acSpriyadharshini gowthaman 				bitVal = 0;
583d66913acSpriyadharshini gowthaman 				idx++;
584d66913acSpriyadharshini gowthaman 				rmParseStates = LOC_LOOKING_FOR_BIT;
585d66913acSpriyadharshini gowthaman 			} else { /* Ignore */
586d66913acSpriyadharshini gowthaman 				sigma_dut_print(dut, DUT_MSG_INFO,
587d66913acSpriyadharshini gowthaman 						"%s - LOC_LOOKING_FOR_VAL - ignoring: %c",
588d66913acSpriyadharshini gowthaman 						__func__, temp);
589d66913acSpriyadharshini gowthaman 			}
590d66913acSpriyadharshini gowthaman 			break;
591d66913acSpriyadharshini gowthaman 		default: /* Ignore */
592d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_INFO,
593d66913acSpriyadharshini gowthaman 					"%s - default - ignoring: %c",
594d66913acSpriyadharshini gowthaman 					__func__, temp);
595d66913acSpriyadharshini gowthaman 			break;
596d66913acSpriyadharshini gowthaman 		}
597d66913acSpriyadharshini gowthaman 	}
598d66913acSpriyadharshini gowthaman 
599d66913acSpriyadharshini gowthaman 	for (i = 0; i < LOC_MAX_RM_FLAGS; i++) {
600d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO,
601d66913acSpriyadharshini gowthaman 				"%s - Bit Pos: %u : Bit Val: %u",
602d66913acSpriyadharshini gowthaman 				__func__, rmBitFlags[i][0],
603d66913acSpriyadharshini gowthaman 				rmBitFlags[i][1]);
604d66913acSpriyadharshini gowthaman 	}
605d66913acSpriyadharshini gowthaman }
606d66913acSpriyadharshini gowthaman 
607d66913acSpriyadharshini gowthaman 
608d66913acSpriyadharshini gowthaman int loc_cmd_sta_preset_testparameters(struct sigma_dut *dut,
609d66913acSpriyadharshini gowthaman 				      struct sigma_conn *conn,
610d66913acSpriyadharshini gowthaman 				      struct sigma_cmd *cmd)
611d66913acSpriyadharshini gowthaman {
612e7df6d86Svamsi krishna 	const char *rmFTMRFlagStr = get_param(cmd, "RMEnabledCapBitmap");
613e7df6d86Svamsi krishna 	const char *interworkingEn = get_param(cmd, "Interworking");
614d66913acSpriyadharshini gowthaman 	unsigned int rmFTMRFlag = 0;
6150dd682a8Spriyadharshini gowthaman 	unsigned int i, interworking = 0;
616d66913acSpriyadharshini gowthaman 	char rmBitFlags[LOC_MAX_RM_FLAGS][LOC_RM_FLAG_VAL_ARRAY];
617d66913acSpriyadharshini gowthaman 
618d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO, "%s", __func__);
619d66913acSpriyadharshini gowthaman 
620d66913acSpriyadharshini gowthaman 	memset(rmBitFlags, 0, sizeof(rmBitFlags));
621d66913acSpriyadharshini gowthaman 
622d66913acSpriyadharshini gowthaman 	sigma_dut_print(dut, DUT_MSG_INFO, "%s - 1", __func__);
623d66913acSpriyadharshini gowthaman 	/*
6240dd682a8Spriyadharshini gowthaman 	 * This function is used to configure the RM capability bits and
6250dd682a8Spriyadharshini gowthaman 	 * the Interworking bit only.
6260dd682a8Spriyadharshini gowthaman 	 * If these parameters are not present just returning COMPLETE
627d66913acSpriyadharshini gowthaman 	 * because all other parameters are ignored.
628d66913acSpriyadharshini gowthaman 	 */
6290dd682a8Spriyadharshini gowthaman 	if (!rmFTMRFlagStr && !interworkingEn) {
630d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO, "%s - 2", __func__);
631d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_ERROR, "%s - Did not get %s",
632e7df6d86Svamsi krishna 				__func__, "RMEnabledCapBitmap");
633d66913acSpriyadharshini gowthaman 		send_resp(dut, conn, SIGMA_COMPLETE, NULL);
634d66913acSpriyadharshini gowthaman 		return 0;
635d66913acSpriyadharshini gowthaman 	}
636d66913acSpriyadharshini gowthaman 
6370dd682a8Spriyadharshini gowthaman 	if (rmFTMRFlagStr) {
638d66913acSpriyadharshini gowthaman 		rmFTMRFlag = 25; /* Default invalid */
639d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO, "%s - rmFTMRFlagStr: %s",
640d66913acSpriyadharshini gowthaman 				__func__, rmFTMRFlagStr);
641d66913acSpriyadharshini gowthaman 		parse_rm_bits(dut, rmFTMRFlagStr, rmBitFlags);
642d66913acSpriyadharshini gowthaman 		for (i = 0; i < LOC_MAX_RM_FLAGS; i++) {
643d66913acSpriyadharshini gowthaman 			if (rmBitFlags[i][0] == 34)
644d66913acSpriyadharshini gowthaman 				rmFTMRFlag = rmBitFlags[i][1];
645d66913acSpriyadharshini gowthaman 		}
646d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO, "%s - rmFTMRFlag %u",
647d66913acSpriyadharshini gowthaman 				__func__, rmFTMRFlag);
648d66913acSpriyadharshini gowthaman 		if (rmFTMRFlag == 0) { /* Disable RM - FTMRR capability */
6490dd682a8Spriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_INFO,
6500dd682a8Spriyadharshini gowthaman 					"%s - Disabling RM - FTMRR",
651d66913acSpriyadharshini gowthaman 					__func__);
6520dd682a8Spriyadharshini gowthaman 			if (wpa_command(get_station_ifname(), WPA_RM_DISABLE) <
6530dd682a8Spriyadharshini gowthaman 			    0) {
654d66913acSpriyadharshini gowthaman 				send_resp(dut, conn, SIGMA_ERROR, NULL);
655d66913acSpriyadharshini gowthaman 				return -1;
656d66913acSpriyadharshini gowthaman 			}
657d66913acSpriyadharshini gowthaman 		} else if (rmFTMRFlag == 1) { /* Enable RM - FTMRR capability */
6580dd682a8Spriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_INFO,
6590dd682a8Spriyadharshini gowthaman 					"%s - Enabling RM - FTMRR",
660d66913acSpriyadharshini gowthaman 					__func__);
6610dd682a8Spriyadharshini gowthaman 			if (wpa_command(get_station_ifname(), WPA_RM_ENABLE) <
6620dd682a8Spriyadharshini gowthaman 			    0) {
663d66913acSpriyadharshini gowthaman 				send_resp(dut, conn, SIGMA_ERROR, NULL);
664d66913acSpriyadharshini gowthaman 				return 0;
665d66913acSpriyadharshini gowthaman 			}
666d66913acSpriyadharshini gowthaman 		} else {
667d66913acSpriyadharshini gowthaman 			sigma_dut_print(dut, DUT_MSG_ERROR,
6680dd682a8Spriyadharshini gowthaman 					"%s - No Setting for - FTMRR",
6690dd682a8Spriyadharshini gowthaman 					__func__);
670d66913acSpriyadharshini gowthaman 		}
671d66913acSpriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO,
672d66913acSpriyadharshini gowthaman 				"%s - Succeeded in Enabling/Disabling RM Capability for FTMRR",
673d66913acSpriyadharshini gowthaman 				__func__);
6740dd682a8Spriyadharshini gowthaman 	}
6750dd682a8Spriyadharshini gowthaman 
6760dd682a8Spriyadharshini gowthaman 	if (interworkingEn) {
6770dd682a8Spriyadharshini gowthaman 		sscanf(interworkingEn, "%u", &interworking);
6780dd682a8Spriyadharshini gowthaman 		sigma_dut_print(dut, DUT_MSG_INFO, "%s - interworking: %u",
6790dd682a8Spriyadharshini gowthaman 				__func__, interworking);
6800dd682a8Spriyadharshini gowthaman 		if (interworking)
6810dd682a8Spriyadharshini gowthaman 			wpa_command(get_station_ifname(),
6820dd682a8Spriyadharshini gowthaman 				    WPA_INTERWORKING_ENABLE);
6830dd682a8Spriyadharshini gowthaman 		else
6840dd682a8Spriyadharshini gowthaman 			wpa_command(get_station_ifname(),
6850dd682a8Spriyadharshini gowthaman 				    WPA_INTERWORKING_DISABLE);
6860dd682a8Spriyadharshini gowthaman 	}
6870dd682a8Spriyadharshini gowthaman 
688d66913acSpriyadharshini gowthaman 	send_resp(dut, conn, SIGMA_COMPLETE, NULL);
689d66913acSpriyadharshini gowthaman 	return 0;
690d66913acSpriyadharshini gowthaman }
691