xref: /wlan-dirver/utils/sigma-dut/dev.c (revision 2052daa2460562cbb912f647630cc320b64d2d28)
1cd4e3c3eSJouni Malinen /*
2cd4e3c3eSJouni Malinen  * Sigma Control API DUT (station/AP/sniffer)
39c381f59SAmarnath Hullur Subramanyam  * Copyright (c) 2011-2013, 2017, Qualcomm Atheros, Inc.
4a7ac56ebSPeng Xu  * Copyright (c) 2018, The Linux Foundation
5cd4e3c3eSJouni Malinen  * All Rights Reserved.
6cd4e3c3eSJouni Malinen  * Licensed under the Clear BSD license. See README for more details.
7cd4e3c3eSJouni Malinen  */
8cd4e3c3eSJouni Malinen 
9cd4e3c3eSJouni Malinen #include "sigma_dut.h"
109c381f59SAmarnath Hullur Subramanyam #include "miracast.h"
11*2052daa2SAnurag Das #include <sys/wait.h>
12*2052daa2SAnurag Das #include "wpa_ctrl.h"
13*2052daa2SAnurag Das #include "wpa_helpers.h"
14cd4e3c3eSJouni Malinen 
15cd4e3c3eSJouni Malinen 
16cd4e3c3eSJouni Malinen static int cmd_dev_send_frame(struct sigma_dut *dut, struct sigma_conn *conn,
17cd4e3c3eSJouni Malinen 			      struct sigma_cmd *cmd)
18cd4e3c3eSJouni Malinen {
199c381f59SAmarnath Hullur Subramanyam #ifdef MIRACAST
209c381f59SAmarnath Hullur Subramanyam 	const char *program = get_param(cmd, "Program");
219c381f59SAmarnath Hullur Subramanyam 
229c381f59SAmarnath Hullur Subramanyam 	if (program && (strcasecmp(program, "WFD") == 0 ||
239c381f59SAmarnath Hullur Subramanyam 			strcasecmp(program, "DisplayR2") == 0))
249c381f59SAmarnath Hullur Subramanyam 		return miracast_dev_send_frame(dut, conn, cmd);
259c381f59SAmarnath Hullur Subramanyam #endif /* MIRACAST */
269c381f59SAmarnath Hullur Subramanyam 
27cd4e3c3eSJouni Malinen 	if (dut->mode == SIGMA_MODE_STATION ||
28cd4e3c3eSJouni Malinen 	    dut->mode == SIGMA_MODE_UNKNOWN) {
29cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert "
30cd4e3c3eSJouni Malinen 				"dev_send_frame to sta_send_frame");
31cd4e3c3eSJouni Malinen 		return cmd_sta_send_frame(dut, conn, cmd);
32cd4e3c3eSJouni Malinen 	}
33cd4e3c3eSJouni Malinen 
34cd4e3c3eSJouni Malinen 	if (dut->mode == SIGMA_MODE_AP) {
35cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert "
36cd4e3c3eSJouni Malinen 				"dev_send_frame to ap_send_frame");
37cd4e3c3eSJouni Malinen 		return cmd_ap_send_frame(dut, conn, cmd);
38cd4e3c3eSJouni Malinen 	}
39cd4e3c3eSJouni Malinen 
40cd4e3c3eSJouni Malinen #ifdef CONFIG_WLANTEST
41cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert dev_send_frame to "
42cd4e3c3eSJouni Malinen 			"wlantest_send_frame");
43cd4e3c3eSJouni Malinen 	return cmd_wlantest_send_frame(dut, conn, cmd);
44cd4e3c3eSJouni Malinen #else /* CONFIG_WLANTEST */
45cd4e3c3eSJouni Malinen 	send_resp(dut, conn, SIGMA_ERROR,
46cd4e3c3eSJouni Malinen 		  "errorCode,Unsupported dev_send_frame");
47cd4e3c3eSJouni Malinen 	return 0;
48cd4e3c3eSJouni Malinen #endif /* CONFIG_WLANTEST */
49cd4e3c3eSJouni Malinen }
50cd4e3c3eSJouni Malinen 
51cd4e3c3eSJouni Malinen 
52cd4e3c3eSJouni Malinen static int cmd_dev_set_parameter(struct sigma_dut *dut, struct sigma_conn *conn,
53cd4e3c3eSJouni Malinen 				 struct sigma_cmd *cmd)
54cd4e3c3eSJouni Malinen {
55cd4e3c3eSJouni Malinen 	const char *device = get_param(cmd, "Device");
56cd4e3c3eSJouni Malinen 
57cd4e3c3eSJouni Malinen 	if (device && strcasecmp(device, "STA") == 0) {
58cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert "
59cd4e3c3eSJouni Malinen 				"dev_set_parameter to sta_set_parameter");
60cd4e3c3eSJouni Malinen 		return cmd_sta_set_parameter(dut, conn, cmd);
61cd4e3c3eSJouni Malinen 	}
62cd4e3c3eSJouni Malinen 
63cd4e3c3eSJouni Malinen 	return -1;
64cd4e3c3eSJouni Malinen }
65cd4e3c3eSJouni Malinen 
66cd4e3c3eSJouni Malinen 
679c381f59SAmarnath Hullur Subramanyam static int cmd_dev_exec_action(struct sigma_dut *dut, struct sigma_conn *conn,
689c381f59SAmarnath Hullur Subramanyam 			       struct sigma_cmd *cmd)
699c381f59SAmarnath Hullur Subramanyam {
709c381f59SAmarnath Hullur Subramanyam 	const char *program = get_param(cmd, "Program");
719c381f59SAmarnath Hullur Subramanyam 
72d86e5828SJouni Malinen #ifdef MIRACAST
739c381f59SAmarnath Hullur Subramanyam 	if (program && (strcasecmp(program, "WFD") == 0 ||
74d86e5828SJouni Malinen 			strcasecmp(program, "DisplayR2") == 0)) {
75d86e5828SJouni Malinen 		if (get_param(cmd, "interface") == NULL)
76d86e5828SJouni Malinen 			return -1;
779c381f59SAmarnath Hullur Subramanyam 		return miracast_dev_exec_action(dut, conn, cmd);
78d86e5828SJouni Malinen 	}
799c381f59SAmarnath Hullur Subramanyam #endif /* MIRACAST */
809c381f59SAmarnath Hullur Subramanyam 
81d86e5828SJouni Malinen 	if (program && strcasecmp(program, "DPP") == 0)
82d86e5828SJouni Malinen 		return dpp_dev_exec_action(dut, conn, cmd);
83d86e5828SJouni Malinen 
849c381f59SAmarnath Hullur Subramanyam 	return -2;
859c381f59SAmarnath Hullur Subramanyam }
869c381f59SAmarnath Hullur Subramanyam 
879c381f59SAmarnath Hullur Subramanyam 
883c367e8dSJouni Malinen static int cmd_dev_configure_ie(struct sigma_dut *dut, struct sigma_conn *conn,
893c367e8dSJouni Malinen 				struct sigma_cmd *cmd)
903c367e8dSJouni Malinen {
913c367e8dSJouni Malinen 	const char *ie_name = get_param(cmd, "IE_Name");
923c367e8dSJouni Malinen 	const char *contents = get_param(cmd, "Contents");
933c367e8dSJouni Malinen 
943c367e8dSJouni Malinen 	if (!ie_name || !contents)
953c367e8dSJouni Malinen 		return -1;
963c367e8dSJouni Malinen 
973c367e8dSJouni Malinen 	if (strcasecmp(ie_name, "RSNE") != 0) {
983c367e8dSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
993c367e8dSJouni Malinen 			  "errorCode,Unsupported IE_Name value");
1003c367e8dSJouni Malinen 		return 0;
1013c367e8dSJouni Malinen 	}
1023c367e8dSJouni Malinen 
1033c367e8dSJouni Malinen 	free(dut->rsne_override);
1043c367e8dSJouni Malinen 	dut->rsne_override = strdup(contents);
1053c367e8dSJouni Malinen 
1063c367e8dSJouni Malinen 	return dut->rsne_override ? 1 : -1;
1073c367e8dSJouni Malinen }
1083c367e8dSJouni Malinen 
1093c367e8dSJouni Malinen 
110*2052daa2SAnurag Das static int cmd_dev_ble_action(struct sigma_dut *dut, struct sigma_conn *conn,
111*2052daa2SAnurag Das 			      struct sigma_cmd *cmd)
112*2052daa2SAnurag Das {
113*2052daa2SAnurag Das #ifdef ANDROID
114*2052daa2SAnurag Das 	char buf[200];
115*2052daa2SAnurag Das 	const char *ble_op = get_param(cmd, "BLEOp");
116*2052daa2SAnurag Das 	const char *prog = get_param(cmd, "Prog");
117*2052daa2SAnurag Das 	const char *service_name = get_param(cmd, "ServiceName");
118*2052daa2SAnurag Das 	const char *ble_role = get_param(cmd, "BLERole");
119*2052daa2SAnurag Das 	const char *discovery_type = get_param(cmd, "DiscoveryType");
120*2052daa2SAnurag Das 	const char *msg_type = get_param(cmd, "messagetype");
121*2052daa2SAnurag Das 	const char *action = get_param(cmd, "action");
122*2052daa2SAnurag Das 	const char *M2Transmit = get_param(cmd, "M2Transmit");
123*2052daa2SAnurag Das 	char *argv[17];
124*2052daa2SAnurag Das 	pid_t pid;
125*2052daa2SAnurag Das 
126*2052daa2SAnurag Das 	if (prog && ble_role && action && msg_type) {
127*2052daa2SAnurag Das 		send_resp(dut, conn, SIGMA_COMPLETE,
128*2052daa2SAnurag Das 			  "OrgID,0x00,TransDataHeader,0x00,BloomFilterElement,NULL");
129*2052daa2SAnurag Das 		return 0;
130*2052daa2SAnurag Das 	}
131*2052daa2SAnurag Das 	if (!ble_op || !prog || !service_name || !ble_role || !discovery_type) {
132*2052daa2SAnurag Das 		sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid arguments");
133*2052daa2SAnurag Das 		return -1;
134*2052daa2SAnurag Das 	}
135*2052daa2SAnurag Das 
136*2052daa2SAnurag Das 	if ((strcasecmp(prog, "NAN") != 0)) {
137*2052daa2SAnurag Das 		sigma_dut_print(dut, DUT_MSG_ERROR, "Program %s not supported",
138*2052daa2SAnurag Das 				prog);
139*2052daa2SAnurag Das 		return -1;
140*2052daa2SAnurag Das 	}
141*2052daa2SAnurag Das 
142*2052daa2SAnurag Das 	if (strcasecmp(ble_role, "seeker") != 0 &&
143*2052daa2SAnurag Das 	    strcasecmp(ble_role, "provider") != 0 &&
144*2052daa2SAnurag Das 	    strcasecmp(ble_role, "browser") != 0) {
145*2052daa2SAnurag Das 		sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid BLERole: %s",
146*2052daa2SAnurag Das 				ble_role);
147*2052daa2SAnurag Das 		return -1;
148*2052daa2SAnurag Das 	}
149*2052daa2SAnurag Das 
150*2052daa2SAnurag Das 	if (strcasecmp(discovery_type, "active") != 0 &&
151*2052daa2SAnurag Das 	    strcasecmp(discovery_type, "passive") != 0) {
152*2052daa2SAnurag Das 		sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid DiscoveryType: %s",
153*2052daa2SAnurag Das 				discovery_type);
154*2052daa2SAnurag Das 		return -1;
155*2052daa2SAnurag Das 	}
156*2052daa2SAnurag Das 
157*2052daa2SAnurag Das 	if (!M2Transmit)
158*2052daa2SAnurag Das 		M2Transmit = "disable";
159*2052daa2SAnurag Das 
160*2052daa2SAnurag Das 	argv[0] = "am";
161*2052daa2SAnurag Das 	argv[1] = "start";
162*2052daa2SAnurag Das 	argv[2] = "-n";
163*2052daa2SAnurag Das 	argv[3] = "org.codeaurora.nanservicediscovery/org.codeaurora.nanservicediscovery.MainActivity";
164*2052daa2SAnurag Das 	argv[4] = "--es";
165*2052daa2SAnurag Das 	argv[5] = "service";
166*2052daa2SAnurag Das 	argv[6] = (char *) service_name;
167*2052daa2SAnurag Das 	argv[7] = "--es";
168*2052daa2SAnurag Das 	argv[8] = "role";
169*2052daa2SAnurag Das 	argv[9] = (char *) ble_role;
170*2052daa2SAnurag Das 	argv[10] = "--es";
171*2052daa2SAnurag Das 	argv[11] = "scantype";
172*2052daa2SAnurag Das 	argv[12] = (char *) discovery_type;
173*2052daa2SAnurag Das 	argv[13] = "--es";
174*2052daa2SAnurag Das 	argv[14] = "M2Transmit";
175*2052daa2SAnurag Das 	argv[15] = (char *) M2Transmit;
176*2052daa2SAnurag Das 	argv[16] = NULL;
177*2052daa2SAnurag Das 
178*2052daa2SAnurag Das 	pid = fork();
179*2052daa2SAnurag Das 	if (pid == -1) {
180*2052daa2SAnurag Das 		sigma_dut_print(dut, DUT_MSG_ERROR, "fork: %s",
181*2052daa2SAnurag Das 				strerror(errno));
182*2052daa2SAnurag Das 		return -1;
183*2052daa2SAnurag Das 	}
184*2052daa2SAnurag Das 
185*2052daa2SAnurag Das 	if (pid == 0) {
186*2052daa2SAnurag Das 		execv("/system/bin/am", argv);
187*2052daa2SAnurag Das 		sigma_dut_print(dut, DUT_MSG_ERROR, "execv: %s",
188*2052daa2SAnurag Das 				strerror(errno));
189*2052daa2SAnurag Das 		exit(0);
190*2052daa2SAnurag Das 		return -1;
191*2052daa2SAnurag Das 	}
192*2052daa2SAnurag Das 
193*2052daa2SAnurag Das 	dut->nanservicediscoveryinprogress = 1;
194*2052daa2SAnurag Das #endif /* ANDROID */
195*2052daa2SAnurag Das 
196*2052daa2SAnurag Das 	return 1;
197*2052daa2SAnurag Das }
198*2052daa2SAnurag Das 
199*2052daa2SAnurag Das 
200*2052daa2SAnurag Das 
201a7ac56ebSPeng Xu static int cmd_dev_start_test(struct sigma_dut *dut, struct sigma_conn *conn,
202a7ac56ebSPeng Xu 			      struct sigma_cmd *cmd)
203a7ac56ebSPeng Xu {
204a7ac56ebSPeng Xu 	return 1;
205a7ac56ebSPeng Xu }
206a7ac56ebSPeng Xu 
207a7ac56ebSPeng Xu 
208a7ac56ebSPeng Xu static int cmd_dev_stop_test(struct sigma_dut *dut, struct sigma_conn *conn,
209a7ac56ebSPeng Xu 			     struct sigma_cmd *cmd)
210a7ac56ebSPeng Xu {
211a7ac56ebSPeng Xu 	return 1;
212a7ac56ebSPeng Xu }
213a7ac56ebSPeng Xu 
214a7ac56ebSPeng Xu 
215a7ac56ebSPeng Xu static int cmd_dev_get_log(struct sigma_dut *dut, struct sigma_conn *conn,
216a7ac56ebSPeng Xu 			   struct sigma_cmd *cmd)
217a7ac56ebSPeng Xu {
218a7ac56ebSPeng Xu 	return 1;
219a7ac56ebSPeng Xu }
220a7ac56ebSPeng Xu 
221a7ac56ebSPeng Xu 
2223c367e8dSJouni Malinen static int req_intf(struct sigma_cmd *cmd)
2233c367e8dSJouni Malinen {
2243c367e8dSJouni Malinen 	return get_param(cmd, "interface") == NULL ? -1 : 0;
2253c367e8dSJouni Malinen }
2263c367e8dSJouni Malinen 
2273c367e8dSJouni Malinen 
228*2052daa2SAnurag Das static int req_role_svcname(struct sigma_cmd *cmd)
229*2052daa2SAnurag Das {
230*2052daa2SAnurag Das 	if (!get_param(cmd, "BLERole"))
231*2052daa2SAnurag Das 		 return -1;
232*2052daa2SAnurag Das 	if (get_param(cmd, "BLEOp") && !get_param(cmd, "ServiceName"))
233*2052daa2SAnurag Das 		return -1;
234*2052daa2SAnurag Das 	return 0;
235*2052daa2SAnurag Das }
236*2052daa2SAnurag Das 
237*2052daa2SAnurag Das 
238cd4e3c3eSJouni Malinen static int req_intf_prog(struct sigma_cmd *cmd)
239cd4e3c3eSJouni Malinen {
240cd4e3c3eSJouni Malinen 	if (get_param(cmd, "interface") == NULL)
241cd4e3c3eSJouni Malinen 		return -1;
242cd4e3c3eSJouni Malinen 	if (get_param(cmd, "program") == NULL)
243cd4e3c3eSJouni Malinen 		return -1;
244cd4e3c3eSJouni Malinen 	return 0;
245cd4e3c3eSJouni Malinen }
246cd4e3c3eSJouni Malinen 
247cd4e3c3eSJouni Malinen 
248d86e5828SJouni Malinen static int req_prog(struct sigma_cmd *cmd)
249d86e5828SJouni Malinen {
250d86e5828SJouni Malinen 	if (get_param(cmd, "program") == NULL)
251d86e5828SJouni Malinen 		return -1;
252d86e5828SJouni Malinen 	return 0;
253d86e5828SJouni Malinen }
254d86e5828SJouni Malinen 
255d86e5828SJouni Malinen 
256cd4e3c3eSJouni Malinen void dev_register_cmds(void)
257cd4e3c3eSJouni Malinen {
258cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("dev_send_frame", req_intf_prog, cmd_dev_send_frame);
259cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("dev_set_parameter", req_intf_prog,
260cd4e3c3eSJouni Malinen 			  cmd_dev_set_parameter);
261d86e5828SJouni Malinen 	sigma_dut_reg_cmd("dev_exec_action", req_prog,
2629c381f59SAmarnath Hullur Subramanyam 			  cmd_dev_exec_action);
2633c367e8dSJouni Malinen 	sigma_dut_reg_cmd("dev_configure_ie", req_intf, cmd_dev_configure_ie);
264a7ac56ebSPeng Xu 	sigma_dut_reg_cmd("dev_start_test", NULL, cmd_dev_start_test);
265a7ac56ebSPeng Xu 	sigma_dut_reg_cmd("dev_stop_test", NULL, cmd_dev_stop_test);
266a7ac56ebSPeng Xu 	sigma_dut_reg_cmd("dev_get_log", NULL, cmd_dev_get_log);
267*2052daa2SAnurag Das 	sigma_dut_reg_cmd("dev_ble_action", req_role_svcname,
268*2052daa2SAnurag Das 			  cmd_dev_ble_action);
269cd4e3c3eSJouni Malinen }
270