blob: 008c5f4223ca6b08d08f51d4ae1db2046cc6f773 [file] [log] [blame]
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001/*
2 * Sigma Control API DUT (station/AP/sniffer)
Amarnath Hullur Subramanyam9c381f52017-03-17 00:04:41 -07003 * Copyright (c) 2011-2013, 2017, Qualcomm Atheros, Inc.
Jouni Malinena0bf2442019-02-19 12:03:26 +02004 * Copyright (c) 2018-2019, The Linux Foundation
Jouni Malinencd4e3c32015-10-29 12:39:56 +02005 * All Rights Reserved.
6 * Licensed under the Clear BSD license. See README for more details.
7 */
8
9#include "sigma_dut.h"
Amarnath Hullur Subramanyam9c381f52017-03-17 00:04:41 -070010#include "miracast.h"
Anurag Das2052daa2018-08-31 14:35:25 +053011#include <sys/wait.h>
12#include "wpa_ctrl.h"
13#include "wpa_helpers.h"
Jouni Malinencd4e3c32015-10-29 12:39:56 +020014
15
Jouni Malinena0bf2442019-02-19 12:03:26 +020016static enum sigma_cmd_result cmd_dev_send_frame(struct sigma_dut *dut,
17 struct sigma_conn *conn,
18 struct sigma_cmd *cmd)
Jouni Malinencd4e3c32015-10-29 12:39:56 +020019{
Amarnath Hullur Subramanyam9c381f52017-03-17 00:04:41 -070020#ifdef MIRACAST
21 const char *program = get_param(cmd, "Program");
22
23 if (program && (strcasecmp(program, "WFD") == 0 ||
24 strcasecmp(program, "DisplayR2") == 0))
25 return miracast_dev_send_frame(dut, conn, cmd);
26#endif /* MIRACAST */
27
Jouni Malinencd4e3c32015-10-29 12:39:56 +020028 if (dut->mode == SIGMA_MODE_STATION ||
29 dut->mode == SIGMA_MODE_UNKNOWN) {
30 sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert "
31 "dev_send_frame to sta_send_frame");
32 return cmd_sta_send_frame(dut, conn, cmd);
33 }
34
35 if (dut->mode == SIGMA_MODE_AP) {
36 sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert "
37 "dev_send_frame to ap_send_frame");
38 return cmd_ap_send_frame(dut, conn, cmd);
39 }
40
41#ifdef CONFIG_WLANTEST
42 sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert dev_send_frame to "
43 "wlantest_send_frame");
44 return cmd_wlantest_send_frame(dut, conn, cmd);
45#else /* CONFIG_WLANTEST */
46 send_resp(dut, conn, SIGMA_ERROR,
47 "errorCode,Unsupported dev_send_frame");
Jouni Malinena0bf2442019-02-19 12:03:26 +020048 return STATUS_SENT;
Jouni Malinencd4e3c32015-10-29 12:39:56 +020049#endif /* CONFIG_WLANTEST */
50}
51
52
Jouni Malinena0bf2442019-02-19 12:03:26 +020053static enum sigma_cmd_result cmd_dev_set_parameter(struct sigma_dut *dut,
54 struct sigma_conn *conn,
55 struct sigma_cmd *cmd)
Jouni Malinencd4e3c32015-10-29 12:39:56 +020056{
57 const char *device = get_param(cmd, "Device");
58
59 if (device && strcasecmp(device, "STA") == 0) {
60 sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert "
61 "dev_set_parameter to sta_set_parameter");
62 return cmd_sta_set_parameter(dut, conn, cmd);
63 }
64
Jouni Malinena0bf2442019-02-19 12:03:26 +020065 return INVALID_SEND_STATUS;
Jouni Malinencd4e3c32015-10-29 12:39:56 +020066}
67
68
Jouni Malinena0bf2442019-02-19 12:03:26 +020069static enum sigma_cmd_result cmd_dev_exec_action(struct sigma_dut *dut,
70 struct sigma_conn *conn,
71 struct sigma_cmd *cmd)
Amarnath Hullur Subramanyam9c381f52017-03-17 00:04:41 -070072{
Amarnath Hullur Subramanyam9c381f52017-03-17 00:04:41 -070073 const char *program = get_param(cmd, "Program");
74
Jouni Malinend86e5822017-08-29 03:55:32 +030075#ifdef MIRACAST
Amarnath Hullur Subramanyam9c381f52017-03-17 00:04:41 -070076 if (program && (strcasecmp(program, "WFD") == 0 ||
Jouni Malinend86e5822017-08-29 03:55:32 +030077 strcasecmp(program, "DisplayR2") == 0)) {
78 if (get_param(cmd, "interface") == NULL)
Jouni Malinena0bf2442019-02-19 12:03:26 +020079 return INVALID_SEND_STATUS;
Amarnath Hullur Subramanyam9c381f52017-03-17 00:04:41 -070080 return miracast_dev_exec_action(dut, conn, cmd);
Jouni Malinend86e5822017-08-29 03:55:32 +030081 }
Amarnath Hullur Subramanyam9c381f52017-03-17 00:04:41 -070082#endif /* MIRACAST */
83
Jouni Malinend86e5822017-08-29 03:55:32 +030084 if (program && strcasecmp(program, "DPP") == 0)
85 return dpp_dev_exec_action(dut, conn, cmd);
86
Jouni Malinena0bf2442019-02-19 12:03:26 +020087 return ERROR_SEND_STATUS;
Amarnath Hullur Subramanyam9c381f52017-03-17 00:04:41 -070088}
89
90
Jouni Malinena0bf2442019-02-19 12:03:26 +020091static enum sigma_cmd_result cmd_dev_configure_ie(struct sigma_dut *dut,
92 struct sigma_conn *conn,
93 struct sigma_cmd *cmd)
Jouni Malinen3c367e82017-06-23 17:01:47 +030094{
95 const char *ie_name = get_param(cmd, "IE_Name");
96 const char *contents = get_param(cmd, "Contents");
97
98 if (!ie_name || !contents)
Jouni Malinena0bf2442019-02-19 12:03:26 +020099 return INVALID_SEND_STATUS;
Jouni Malinen3c367e82017-06-23 17:01:47 +0300100
101 if (strcasecmp(ie_name, "RSNE") != 0) {
102 send_resp(dut, conn, SIGMA_ERROR,
103 "errorCode,Unsupported IE_Name value");
Jouni Malinena0bf2442019-02-19 12:03:26 +0200104 return STATUS_SENT;
Jouni Malinen3c367e82017-06-23 17:01:47 +0300105 }
106
107 free(dut->rsne_override);
108 dut->rsne_override = strdup(contents);
109
Jouni Malinena0bf2442019-02-19 12:03:26 +0200110 return dut->rsne_override ? SUCCESS_SEND_STATUS : ERROR_SEND_STATUS;
Jouni Malinen3c367e82017-06-23 17:01:47 +0300111}
112
113
Jouni Malinena0bf2442019-02-19 12:03:26 +0200114static enum sigma_cmd_result cmd_dev_ble_action(struct sigma_dut *dut,
115 struct sigma_conn *conn,
116 struct sigma_cmd *cmd)
Anurag Das2052daa2018-08-31 14:35:25 +0530117{
118#ifdef ANDROID
119 char buf[200];
120 const char *ble_op = get_param(cmd, "BLEOp");
121 const char *prog = get_param(cmd, "Prog");
122 const char *service_name = get_param(cmd, "ServiceName");
123 const char *ble_role = get_param(cmd, "BLERole");
124 const char *discovery_type = get_param(cmd, "DiscoveryType");
125 const char *msg_type = get_param(cmd, "messagetype");
126 const char *action = get_param(cmd, "action");
127 const char *M2Transmit = get_param(cmd, "M2Transmit");
128 char *argv[17];
129 pid_t pid;
130
131 if (prog && ble_role && action && msg_type) {
132 send_resp(dut, conn, SIGMA_COMPLETE,
133 "OrgID,0x00,TransDataHeader,0x00,BloomFilterElement,NULL");
Jouni Malinena0bf2442019-02-19 12:03:26 +0200134 return STATUS_SENT;
Anurag Das2052daa2018-08-31 14:35:25 +0530135 }
136 if (!ble_op || !prog || !service_name || !ble_role || !discovery_type) {
137 sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid arguments");
Jouni Malinena0bf2442019-02-19 12:03:26 +0200138 return INVALID_SEND_STATUS;
Anurag Das2052daa2018-08-31 14:35:25 +0530139 }
140
141 if ((strcasecmp(prog, "NAN") != 0)) {
142 sigma_dut_print(dut, DUT_MSG_ERROR, "Program %s not supported",
143 prog);
Jouni Malinena0bf2442019-02-19 12:03:26 +0200144 return INVALID_SEND_STATUS;
Anurag Das2052daa2018-08-31 14:35:25 +0530145 }
146
147 if (strcasecmp(ble_role, "seeker") != 0 &&
148 strcasecmp(ble_role, "provider") != 0 &&
149 strcasecmp(ble_role, "browser") != 0) {
150 sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid BLERole: %s",
151 ble_role);
Jouni Malinena0bf2442019-02-19 12:03:26 +0200152 return INVALID_SEND_STATUS;
Anurag Das2052daa2018-08-31 14:35:25 +0530153 }
154
155 if (strcasecmp(discovery_type, "active") != 0 &&
156 strcasecmp(discovery_type, "passive") != 0) {
157 sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid DiscoveryType: %s",
158 discovery_type);
Jouni Malinena0bf2442019-02-19 12:03:26 +0200159 return INVALID_SEND_STATUS;
Anurag Das2052daa2018-08-31 14:35:25 +0530160 }
161
162 if (!M2Transmit)
163 M2Transmit = "disable";
164
165 argv[0] = "am";
166 argv[1] = "start";
167 argv[2] = "-n";
168 argv[3] = "org.codeaurora.nanservicediscovery/org.codeaurora.nanservicediscovery.MainActivity";
169 argv[4] = "--es";
170 argv[5] = "service";
171 argv[6] = (char *) service_name;
172 argv[7] = "--es";
173 argv[8] = "role";
174 argv[9] = (char *) ble_role;
175 argv[10] = "--es";
176 argv[11] = "scantype";
177 argv[12] = (char *) discovery_type;
178 argv[13] = "--es";
179 argv[14] = "M2Transmit";
180 argv[15] = (char *) M2Transmit;
181 argv[16] = NULL;
182
183 pid = fork();
184 if (pid == -1) {
185 sigma_dut_print(dut, DUT_MSG_ERROR, "fork: %s",
186 strerror(errno));
Jouni Malinena0bf2442019-02-19 12:03:26 +0200187 return ERROR_SEND_STATUS;
Anurag Das2052daa2018-08-31 14:35:25 +0530188 }
189
190 if (pid == 0) {
191 execv("/system/bin/am", argv);
192 sigma_dut_print(dut, DUT_MSG_ERROR, "execv: %s",
193 strerror(errno));
194 exit(0);
Jouni Malinena0bf2442019-02-19 12:03:26 +0200195 return ERROR_SEND_STATUS;
Anurag Das2052daa2018-08-31 14:35:25 +0530196 }
197
198 dut->nanservicediscoveryinprogress = 1;
199#endif /* ANDROID */
200
Jouni Malinena0bf2442019-02-19 12:03:26 +0200201 return SUCCESS_SEND_STATUS;
Anurag Das2052daa2018-08-31 14:35:25 +0530202}
203
204
205
Jouni Malinena0bf2442019-02-19 12:03:26 +0200206static enum sigma_cmd_result cmd_dev_start_test(struct sigma_dut *dut,
207 struct sigma_conn *conn,
208 struct sigma_cmd *cmd)
Peng Xua7ac56e2018-06-26 16:07:19 -0700209{
Jouni Malinena0bf2442019-02-19 12:03:26 +0200210 return SUCCESS_SEND_STATUS;
Peng Xua7ac56e2018-06-26 16:07:19 -0700211}
212
213
Jouni Malinena0bf2442019-02-19 12:03:26 +0200214static enum sigma_cmd_result cmd_dev_stop_test(struct sigma_dut *dut,
215 struct sigma_conn *conn,
216 struct sigma_cmd *cmd)
Peng Xua7ac56e2018-06-26 16:07:19 -0700217{
Jouni Malinena0bf2442019-02-19 12:03:26 +0200218 return SUCCESS_SEND_STATUS;
Peng Xua7ac56e2018-06-26 16:07:19 -0700219}
220
221
Jouni Malinena0bf2442019-02-19 12:03:26 +0200222static enum sigma_cmd_result cmd_dev_get_log(struct sigma_dut *dut,
223 struct sigma_conn *conn,
224 struct sigma_cmd *cmd)
Peng Xua7ac56e2018-06-26 16:07:19 -0700225{
Jouni Malinena0bf2442019-02-19 12:03:26 +0200226 return SUCCESS_SEND_STATUS;
Peng Xua7ac56e2018-06-26 16:07:19 -0700227}
228
229
Jouni Malinen3c367e82017-06-23 17:01:47 +0300230static int req_intf(struct sigma_cmd *cmd)
231{
232 return get_param(cmd, "interface") == NULL ? -1 : 0;
233}
234
235
Anurag Das2052daa2018-08-31 14:35:25 +0530236static int req_role_svcname(struct sigma_cmd *cmd)
237{
238 if (!get_param(cmd, "BLERole"))
239 return -1;
240 if (get_param(cmd, "BLEOp") && !get_param(cmd, "ServiceName"))
241 return -1;
242 return 0;
243}
244
245
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200246static int req_intf_prog(struct sigma_cmd *cmd)
247{
248 if (get_param(cmd, "interface") == NULL)
249 return -1;
250 if (get_param(cmd, "program") == NULL)
251 return -1;
252 return 0;
253}
254
255
Jouni Malinend86e5822017-08-29 03:55:32 +0300256static int req_prog(struct sigma_cmd *cmd)
257{
258 if (get_param(cmd, "program") == NULL)
259 return -1;
260 return 0;
261}
262
263
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200264void dev_register_cmds(void)
265{
266 sigma_dut_reg_cmd("dev_send_frame", req_intf_prog, cmd_dev_send_frame);
267 sigma_dut_reg_cmd("dev_set_parameter", req_intf_prog,
268 cmd_dev_set_parameter);
Jouni Malinend86e5822017-08-29 03:55:32 +0300269 sigma_dut_reg_cmd("dev_exec_action", req_prog,
Amarnath Hullur Subramanyam9c381f52017-03-17 00:04:41 -0700270 cmd_dev_exec_action);
Jouni Malinen3c367e82017-06-23 17:01:47 +0300271 sigma_dut_reg_cmd("dev_configure_ie", req_intf, cmd_dev_configure_ie);
Peng Xua7ac56e2018-06-26 16:07:19 -0700272 sigma_dut_reg_cmd("dev_start_test", NULL, cmd_dev_start_test);
273 sigma_dut_reg_cmd("dev_stop_test", NULL, cmd_dev_stop_test);
274 sigma_dut_reg_cmd("dev_get_log", NULL, cmd_dev_get_log);
Anurag Das2052daa2018-08-31 14:35:25 +0530275 sigma_dut_reg_cmd("dev_ble_action", req_role_svcname,
276 cmd_dev_ble_action);
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200277}