xref: /wlan-dirver/utils/sigma-dut/sniffer.c (revision 69b367b932f3e8e6f908f0c88bac10014c487f1e)
1cd4e3c3eSJouni Malinen /*
2cd4e3c3eSJouni Malinen  * Sigma Control API DUT (sniffer)
3cd4e3c3eSJouni Malinen  * Copyright (c) 2013-2014, Qualcomm Atheros, Inc.
4*69b367b9SJouni Malinen  * Copyright (c) 2019, 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"
10cd4e3c3eSJouni Malinen #include <signal.h>
11cd4e3c3eSJouni Malinen #include <sys/stat.h>
12cd4e3c3eSJouni Malinen #include <sys/wait.h>
13cd4e3c3eSJouni Malinen 
14cd4e3c3eSJouni Malinen 
capture_process(const char * ifname,const char * filename)15cd4e3c3eSJouni Malinen static void capture_process(const char *ifname, const char *filename)
16cd4e3c3eSJouni Malinen {
17cd4e3c3eSJouni Malinen 	char *env[] = { NULL };
18cd4e3c3eSJouni Malinen 	char *argv[] = { "sigma_dut[capture]", "-i", strdup(ifname),
19cd4e3c3eSJouni Malinen 			 "-w", strdup(filename), NULL };
20cd4e3c3eSJouni Malinen 	execve("/usr/bin/dumpcap", argv, env);
21cd4e3c3eSJouni Malinen 	perror("execve");
22cd4e3c3eSJouni Malinen 	exit(EXIT_FAILURE);
23cd4e3c3eSJouni Malinen }
24cd4e3c3eSJouni Malinen 
25cd4e3c3eSJouni Malinen 
cmd_sniffer_control_start(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)26*69b367b9SJouni Malinen static enum sigma_cmd_result cmd_sniffer_control_start(struct sigma_dut *dut,
27cd4e3c3eSJouni Malinen 						       struct sigma_conn *conn,
28cd4e3c3eSJouni Malinen 						       struct sigma_cmd *cmd)
29cd4e3c3eSJouni Malinen {
30cd4e3c3eSJouni Malinen 	const char *filename = get_param(cmd, "filename");
31*69b367b9SJouni Malinen 	enum sigma_cmd_result res;
32cd4e3c3eSJouni Malinen 	pid_t pid;
33cd4e3c3eSJouni Malinen 
34cd4e3c3eSJouni Malinen 	if (dut->sniffer_pid) {
35cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "Sniffer was already capturing - restart based on new parameters");
36cd4e3c3eSJouni Malinen 		sniffer_close(dut);
37cd4e3c3eSJouni Malinen 	}
38cd4e3c3eSJouni Malinen 
39cd4e3c3eSJouni Malinen 	if (filename == NULL) {
40cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
41cd4e3c3eSJouni Malinen 			  "errorCode,Missing filename argument");
42*69b367b9SJouni Malinen 		return STATUS_SENT;
43cd4e3c3eSJouni Malinen 	}
44cd4e3c3eSJouni Malinen 	if (strchr(filename, '/')) {
45cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR, "errorCode,Invalid filename");
46*69b367b9SJouni Malinen 		return STATUS_SENT;
47cd4e3c3eSJouni Malinen 	}
48cd4e3c3eSJouni Malinen 
49cd4e3c3eSJouni Malinen 	res = cmd_wlantest_set_channel(dut, conn, cmd);
50*69b367b9SJouni Malinen 	if (res != SUCCESS_SEND_STATUS)
51cd4e3c3eSJouni Malinen 		return res;
52cd4e3c3eSJouni Malinen 
53cd4e3c3eSJouni Malinen 	mkdir("Captures", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
54cd4e3c3eSJouni Malinen 
55cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "Starting sniffer process");
56cd4e3c3eSJouni Malinen 	snprintf(dut->sniffer_filename, sizeof(dut->sniffer_filename),
57cd4e3c3eSJouni Malinen 		 "Captures/%s", filename);
58cd4e3c3eSJouni Malinen 	pid = fork();
59cd4e3c3eSJouni Malinen 	if (pid < 0) {
60cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
61cd4e3c3eSJouni Malinen 			  "errorCode,Failed to fork sniffer process");
62*69b367b9SJouni Malinen 		return STATUS_SENT;
63cd4e3c3eSJouni Malinen 	}
64cd4e3c3eSJouni Malinen 
65cd4e3c3eSJouni Malinen 	if (pid == 0) {
66cd4e3c3eSJouni Malinen 		capture_process(dut->sniffer_ifname, dut->sniffer_filename);
67*69b367b9SJouni Malinen 		return SUCCESS_SEND_STATUS;
68cd4e3c3eSJouni Malinen 	}
69cd4e3c3eSJouni Malinen 
70cd4e3c3eSJouni Malinen 	dut->sniffer_pid = pid;
71cd4e3c3eSJouni Malinen 
72*69b367b9SJouni Malinen 	return SUCCESS_SEND_STATUS;
73cd4e3c3eSJouni Malinen }
74cd4e3c3eSJouni Malinen 
75cd4e3c3eSJouni Malinen 
sniffer_close(struct sigma_dut * dut)76cd4e3c3eSJouni Malinen void sniffer_close(struct sigma_dut *dut)
77cd4e3c3eSJouni Malinen {
78cd4e3c3eSJouni Malinen 	if (!dut->sniffer_pid)
79cd4e3c3eSJouni Malinen 		return;
80cd4e3c3eSJouni Malinen 
81cd4e3c3eSJouni Malinen 	if (kill(dut->sniffer_pid, SIGTERM) < 0) {
82cd4e3c3eSJouni Malinen 		printf("Failed to kill sniffer process: %s\n", strerror(errno));
83cd4e3c3eSJouni Malinen 		dut->sniffer_pid = 0;
84cd4e3c3eSJouni Malinen 		return;
85cd4e3c3eSJouni Malinen 	}
86cd4e3c3eSJouni Malinen 	waitpid(dut->sniffer_pid, NULL, 0);
87cd4e3c3eSJouni Malinen 
88cd4e3c3eSJouni Malinen 	if (dut->sniffer_filename[0]) {
89cd4e3c3eSJouni Malinen 		chmod(dut->sniffer_filename,
90cd4e3c3eSJouni Malinen 		      S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
91cd4e3c3eSJouni Malinen 		dut->sniffer_filename[0] = '\0';
92cd4e3c3eSJouni Malinen 	}
93cd4e3c3eSJouni Malinen 
94cd4e3c3eSJouni Malinen 	dut->sniffer_pid = 0;
95cd4e3c3eSJouni Malinen }
96cd4e3c3eSJouni Malinen 
97cd4e3c3eSJouni Malinen 
cmd_sniffer_control_stop(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)98*69b367b9SJouni Malinen static enum sigma_cmd_result cmd_sniffer_control_stop(struct sigma_dut *dut,
99cd4e3c3eSJouni Malinen 						      struct sigma_conn *conn,
100cd4e3c3eSJouni Malinen 						      struct sigma_cmd *cmd)
101cd4e3c3eSJouni Malinen {
102cd4e3c3eSJouni Malinen 	if (!dut->sniffer_pid) {
103cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
104cd4e3c3eSJouni Malinen 			  "errorCode,Sniffer was not capturing");
105*69b367b9SJouni Malinen 		return STATUS_SENT;
106cd4e3c3eSJouni Malinen 	}
107cd4e3c3eSJouni Malinen 
108cd4e3c3eSJouni Malinen 	sniffer_close(dut);
109*69b367b9SJouni Malinen 	return SUCCESS_SEND_STATUS;
110cd4e3c3eSJouni Malinen }
111cd4e3c3eSJouni Malinen 
112cd4e3c3eSJouni Malinen 
113*69b367b9SJouni Malinen static enum sigma_cmd_result
cmd_sniffer_control_field_check(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)114*69b367b9SJouni Malinen cmd_sniffer_control_field_check(struct sigma_dut *dut, struct sigma_conn *conn,
115cd4e3c3eSJouni Malinen 				struct sigma_cmd *cmd)
116cd4e3c3eSJouni Malinen {
117cd4e3c3eSJouni Malinen 	const char *filename = get_param(cmd, "filename");
118cd4e3c3eSJouni Malinen 	const char *framename = get_param(cmd, "framename");
119cd4e3c3eSJouni Malinen 	const char *srcmac = get_param(cmd, "srcmac");
120cd4e3c3eSJouni Malinen 	const char *wsc_state = get_param(cmd, "WSC_State");
121cd4e3c3eSJouni Malinen 	const char *pvb_bit = get_param(cmd, "pvb_bit");
122cd4e3c3eSJouni Malinen 	const char *moredata_bit = get_param(cmd, "MoreData_bit");
123cd4e3c3eSJouni Malinen 	const char *eosp_bit = get_param(cmd, "EOSP_bit");
124cd4e3c3eSJouni Malinen 	char buf[2000], *pos;
125cd4e3c3eSJouni Malinen 	FILE *f;
126cd4e3c3eSJouni Malinen 
127cd4e3c3eSJouni Malinen 	if (filename == NULL || srcmac == NULL)
128*69b367b9SJouni Malinen 		return INVALID_SEND_STATUS;
129cd4e3c3eSJouni Malinen 
130cd4e3c3eSJouni Malinen 	if (strchr(filename, '/')) {
131cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR, "errorCode,Invalid filename");
132*69b367b9SJouni Malinen 		return STATUS_SENT;
133cd4e3c3eSJouni Malinen 	}
134cd4e3c3eSJouni Malinen 
135cd4e3c3eSJouni Malinen 	if (!file_exists("sniffer-control-field-check.py")) {
136cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR, "errorCode,sniffer-control-field-check.py not found");
137*69b367b9SJouni Malinen 		return STATUS_SENT;
138cd4e3c3eSJouni Malinen 	}
139cd4e3c3eSJouni Malinen 
140cd4e3c3eSJouni Malinen 	snprintf(buf, sizeof(buf),
141cd4e3c3eSJouni Malinen 		 "./sniffer-control-field-check.py FileName=Captures/%s SrcMac=%s%s%s%s%s%s%s%s%s%s%s",
142cd4e3c3eSJouni Malinen 		 filename, srcmac,
143cd4e3c3eSJouni Malinen 		 framename ? " FrameName=" : "", framename ? framename : "",
144cd4e3c3eSJouni Malinen 		 wsc_state ? " WSC_State=" : "", wsc_state ? wsc_state : "",
145cd4e3c3eSJouni Malinen 		 moredata_bit ? " MoreData_bit=" : "",
146cd4e3c3eSJouni Malinen 		 moredata_bit ? moredata_bit : "",
147cd4e3c3eSJouni Malinen 		 eosp_bit ? " EOSP_bit=" : "", eosp_bit ? eosp_bit : "",
148cd4e3c3eSJouni Malinen 		 pvb_bit ? " pvb_bit=" : "", pvb_bit ? pvb_bit : "");
149cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "Run: %s", buf);
150cd4e3c3eSJouni Malinen 	f = popen(buf, "r");
151cd4e3c3eSJouni Malinen 	if (f == NULL) {
152cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
153cd4e3c3eSJouni Malinen 			  "errorCode,Failed to run sniffer helper");
154*69b367b9SJouni Malinen 		return STATUS_SENT;
155cd4e3c3eSJouni Malinen 	}
156cd4e3c3eSJouni Malinen 
157cd4e3c3eSJouni Malinen 	if (!fgets(buf, sizeof(buf), f)) {
158cd4e3c3eSJouni Malinen 		pclose(f);
159cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
160cd4e3c3eSJouni Malinen 			  "errorCode,Failed extract response from sniffer helper");
161*69b367b9SJouni Malinen 		return STATUS_SENT;
162cd4e3c3eSJouni Malinen 	}
163cd4e3c3eSJouni Malinen 	pos = strchr(buf, '\n');
164cd4e3c3eSJouni Malinen 	if (pos)
165cd4e3c3eSJouni Malinen 		*pos = '\0';
166cd4e3c3eSJouni Malinen 
167cd4e3c3eSJouni Malinen 	pclose(f);
168cd4e3c3eSJouni Malinen 
169cd4e3c3eSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, buf);
170*69b367b9SJouni Malinen 	return STATUS_SENT;
171cd4e3c3eSJouni Malinen }
172cd4e3c3eSJouni Malinen 
173cd4e3c3eSJouni Malinen 
cmd_sniffer_get_info(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)174*69b367b9SJouni Malinen static enum sigma_cmd_result cmd_sniffer_get_info(struct sigma_dut *dut,
175*69b367b9SJouni Malinen 						  struct sigma_conn *conn,
176cd4e3c3eSJouni Malinen 						  struct sigma_cmd *cmd)
177cd4e3c3eSJouni Malinen {
178cd4e3c3eSJouni Malinen 	char buf[200];
179cd4e3c3eSJouni Malinen 
180cd4e3c3eSJouni Malinen 	snprintf(buf, sizeof(buf), "WfaSnifferVersion,SigmaSniffer-foo,SnifferSTA,foo,DeviceSwInfo,foo,WiresharkVersion,foo");
181cd4e3c3eSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, buf);
182*69b367b9SJouni Malinen 	return STATUS_SENT;
183cd4e3c3eSJouni Malinen }
184cd4e3c3eSJouni Malinen 
185cd4e3c3eSJouni Malinen 
186*69b367b9SJouni Malinen static enum sigma_cmd_result
cmd_sniffer_control_filter_capture(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)187*69b367b9SJouni Malinen cmd_sniffer_control_filter_capture(struct sigma_dut *dut,
188cd4e3c3eSJouni Malinen 				   struct sigma_conn *conn,
189cd4e3c3eSJouni Malinen 				   struct sigma_cmd *cmd)
190cd4e3c3eSJouni Malinen {
191cd4e3c3eSJouni Malinen 	const char *infile = get_param(cmd, "InFile");
192cd4e3c3eSJouni Malinen 	const char *outfile = get_param(cmd, "OutFile");
193cd4e3c3eSJouni Malinen 	const char *srcmac = get_param(cmd, "SrcMac");
194cd4e3c3eSJouni Malinen 	const char *framename = get_param(cmd, "FrameName");
195cd4e3c3eSJouni Malinen 	const char *nframes = get_param(cmd, "Nframes");
196cd4e3c3eSJouni Malinen 	const char *hasfield = get_param(cmd, "HasField");
197cd4e3c3eSJouni Malinen 	const char *datalen = get_param(cmd, "Datalen");
198cd4e3c3eSJouni Malinen 	char buf[500], *pos;
199cd4e3c3eSJouni Malinen 	FILE *f;
200cd4e3c3eSJouni Malinen 
201cd4e3c3eSJouni Malinen 	if (infile == NULL || outfile == NULL || srcmac == NULL ||
202cd4e3c3eSJouni Malinen 	    nframes == NULL)
203*69b367b9SJouni Malinen 		return INVALID_SEND_STATUS;
204cd4e3c3eSJouni Malinen 
205cd4e3c3eSJouni Malinen 	if (strchr(infile, '/') || strchr(outfile, '/'))
206*69b367b9SJouni Malinen 		return INVALID_SEND_STATUS;
207cd4e3c3eSJouni Malinen 
208cd4e3c3eSJouni Malinen 	if (!file_exists("sniffer-control-filter-capture.py")) {
209cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR, "errorCode,sniffer-control-filter-capture.py not found");
210*69b367b9SJouni Malinen 		return STATUS_SENT;
211cd4e3c3eSJouni Malinen 	}
212cd4e3c3eSJouni Malinen 
213cd4e3c3eSJouni Malinen 	snprintf(buf, sizeof(buf),
214cd4e3c3eSJouni Malinen 		 "./sniffer-control-filter-capture.py InFile=Captures/%s OutFile=Captures/%s SrcMac=%s%s%s Nframes=%s%s%s%s%s",
215cd4e3c3eSJouni Malinen 		 infile, outfile, srcmac,
216cd4e3c3eSJouni Malinen 		 framename ? " FrameName=" : "", framename ? framename : "",
217cd4e3c3eSJouni Malinen 		 nframes,
218cd4e3c3eSJouni Malinen 		 hasfield ? " HasField=" : "", hasfield ? hasfield : "",
219cd4e3c3eSJouni Malinen 		 datalen ? " Datalen=" : "", datalen ? datalen : "");
220cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "Run: %s", buf);
221cd4e3c3eSJouni Malinen 	f = popen(buf, "r");
222cd4e3c3eSJouni Malinen 	if (f == NULL) {
223cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
224cd4e3c3eSJouni Malinen 			  "errorCode,Failed to run sniffer helper");
225*69b367b9SJouni Malinen 		return STATUS_SENT;
226cd4e3c3eSJouni Malinen 	}
227cd4e3c3eSJouni Malinen 
228cd4e3c3eSJouni Malinen 	if (!fgets(buf, sizeof(buf), f)) {
229cd4e3c3eSJouni Malinen 		pclose(f);
230cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
231cd4e3c3eSJouni Malinen 			  "errorCode,Failed extract response from sniffer helper");
232*69b367b9SJouni Malinen 		return STATUS_SENT;
233cd4e3c3eSJouni Malinen 	}
234cd4e3c3eSJouni Malinen 	pos = strchr(buf, '\n');
235cd4e3c3eSJouni Malinen 	if (pos)
236cd4e3c3eSJouni Malinen 		*pos = '\0';
237cd4e3c3eSJouni Malinen 
238cd4e3c3eSJouni Malinen 	pclose(f);
239cd4e3c3eSJouni Malinen 
240cd4e3c3eSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, buf);
241*69b367b9SJouni Malinen 	return STATUS_SENT;
242cd4e3c3eSJouni Malinen }
243cd4e3c3eSJouni Malinen 
244cd4e3c3eSJouni Malinen 
245*69b367b9SJouni Malinen static enum sigma_cmd_result
cmd_sniffer_get_field_value(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)246*69b367b9SJouni Malinen cmd_sniffer_get_field_value(struct sigma_dut *dut, struct sigma_conn *conn,
247cd4e3c3eSJouni Malinen 			    struct sigma_cmd *cmd)
248cd4e3c3eSJouni Malinen {
249cd4e3c3eSJouni Malinen 	const char *infile = get_param(cmd, "FileName");
250cd4e3c3eSJouni Malinen 	const char *srcmac = get_param(cmd, "SrcMac");
251cd4e3c3eSJouni Malinen 	const char *framename = get_param(cmd, "FrameName");
252cd4e3c3eSJouni Malinen 	const char *fieldname = get_param(cmd, "FieldName");
253cd4e3c3eSJouni Malinen 	char buf[500], *pos;
254cd4e3c3eSJouni Malinen 	FILE *f;
255cd4e3c3eSJouni Malinen 
256cd4e3c3eSJouni Malinen 	if (infile == NULL || srcmac == NULL || framename == NULL ||
257cd4e3c3eSJouni Malinen 	    fieldname == NULL)
258*69b367b9SJouni Malinen 		return INVALID_SEND_STATUS;
259cd4e3c3eSJouni Malinen 
260cd4e3c3eSJouni Malinen 	if (!file_exists("sniffer-get-field-value.py")) {
261cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR, "errorCode,sniffer-get-field-value.py not found");
262*69b367b9SJouni Malinen 		return STATUS_SENT;
263cd4e3c3eSJouni Malinen 	}
264cd4e3c3eSJouni Malinen 
265cd4e3c3eSJouni Malinen 	snprintf(buf, sizeof(buf),
266cd4e3c3eSJouni Malinen 		 "./sniffer-get-field-value.py FileName=Captures/%s SrcMac=%s FrameName=%s FieldName=%s",
267cd4e3c3eSJouni Malinen 		 infile, srcmac, framename, fieldname);
268cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "Run: %s", buf);
269cd4e3c3eSJouni Malinen 	f = popen(buf, "r");
270cd4e3c3eSJouni Malinen 	if (f == NULL) {
271cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
272cd4e3c3eSJouni Malinen 			  "errorCode,Failed to run sniffer helper");
273*69b367b9SJouni Malinen 		return STATUS_SENT;
274cd4e3c3eSJouni Malinen 	}
275cd4e3c3eSJouni Malinen 
276cd4e3c3eSJouni Malinen 	if (!fgets(buf, sizeof(buf), f)) {
277cd4e3c3eSJouni Malinen 		pclose(f);
278cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
279cd4e3c3eSJouni Malinen 			  "errorCode,Failed extract response from sniffer helper");
280*69b367b9SJouni Malinen 		return STATUS_SENT;
281cd4e3c3eSJouni Malinen 	}
282cd4e3c3eSJouni Malinen 	pos = strchr(buf, '\n');
283cd4e3c3eSJouni Malinen 	if (pos)
284cd4e3c3eSJouni Malinen 		*pos = '\0';
285cd4e3c3eSJouni Malinen 
286cd4e3c3eSJouni Malinen 	pclose(f);
287cd4e3c3eSJouni Malinen 
288cd4e3c3eSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, buf);
289*69b367b9SJouni Malinen 	return STATUS_SENT;
290cd4e3c3eSJouni Malinen }
291cd4e3c3eSJouni Malinen 
292cd4e3c3eSJouni Malinen 
293*69b367b9SJouni Malinen static enum sigma_cmd_result
cmd_sniffer_check_p2p_noa_duration(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)294*69b367b9SJouni Malinen cmd_sniffer_check_p2p_noa_duration(struct sigma_dut *dut,
295cd4e3c3eSJouni Malinen 				   struct sigma_conn *conn,
296cd4e3c3eSJouni Malinen 				   struct sigma_cmd *cmd)
297cd4e3c3eSJouni Malinen {
298cd4e3c3eSJouni Malinen 	FILE *f;
299cd4e3c3eSJouni Malinen 	char buf[200], *pos;
300cd4e3c3eSJouni Malinen 	const char *infile = get_param(cmd, "FileName");
301cd4e3c3eSJouni Malinen 	const char *bssid = get_param(cmd, "bssid");
302cd4e3c3eSJouni Malinen 	const char *srcmac = get_param(cmd, "srcmac");
303cd4e3c3eSJouni Malinen 	const char *destmac = get_param(cmd, "destmac");
304cd4e3c3eSJouni Malinen 
305cd4e3c3eSJouni Malinen 	if (infile == NULL || bssid == NULL || srcmac == NULL ||
306cd4e3c3eSJouni Malinen 	    destmac == NULL)
307*69b367b9SJouni Malinen 		return INVALID_SEND_STATUS;
308cd4e3c3eSJouni Malinen 
309cd4e3c3eSJouni Malinen 	if (!file_exists("sniffer-check-p2p-noa-duration.py")) {
310cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR, "errorCode,sniffer-check-p2p-noa-duration.py not found");
311*69b367b9SJouni Malinen 		return STATUS_SENT;
312cd4e3c3eSJouni Malinen 	}
313cd4e3c3eSJouni Malinen 
314cd4e3c3eSJouni Malinen 	snprintf(buf, sizeof(buf),
315cd4e3c3eSJouni Malinen 		 "./sniffer-check-p2p-noa-duration.py Captures/%s %s %s %s",
316cd4e3c3eSJouni Malinen 		 infile, bssid, srcmac, destmac);
317cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "Run: %s", buf);
318cd4e3c3eSJouni Malinen 	f = popen(buf, "r");
319cd4e3c3eSJouni Malinen 	if (f == NULL) {
320cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
321cd4e3c3eSJouni Malinen 			  "errorCode,Failed to run sniffer check");
322*69b367b9SJouni Malinen 		return STATUS_SENT;
323cd4e3c3eSJouni Malinen 	}
324cd4e3c3eSJouni Malinen 
325cd4e3c3eSJouni Malinen 	if (!fgets(buf, sizeof(buf), f)) {
326cd4e3c3eSJouni Malinen 		pclose(f);
327cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
328cd4e3c3eSJouni Malinen 			  "errorCode,Failed extract response from sniffer check");
329*69b367b9SJouni Malinen 		return STATUS_SENT;
330cd4e3c3eSJouni Malinen 	}
331cd4e3c3eSJouni Malinen 	pos = strchr(buf, '\n');
332cd4e3c3eSJouni Malinen 	if (pos)
333cd4e3c3eSJouni Malinen 		*pos = '\0';
334cd4e3c3eSJouni Malinen 
335cd4e3c3eSJouni Malinen 	pclose(f);
336cd4e3c3eSJouni Malinen 
337cd4e3c3eSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, buf);
338*69b367b9SJouni Malinen 	return STATUS_SENT;
339cd4e3c3eSJouni Malinen }
340cd4e3c3eSJouni Malinen 
341cd4e3c3eSJouni Malinen 
342*69b367b9SJouni Malinen static enum sigma_cmd_result
cmd_sniffer_check_p2p_opps_client(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)343*69b367b9SJouni Malinen cmd_sniffer_check_p2p_opps_client(struct sigma_dut *dut,
344cd4e3c3eSJouni Malinen 				  struct sigma_conn *conn,
345cd4e3c3eSJouni Malinen 				  struct sigma_cmd *cmd)
346cd4e3c3eSJouni Malinen {
347cd4e3c3eSJouni Malinen 	char buf[200];
348cd4e3c3eSJouni Malinen 
349cd4e3c3eSJouni Malinen 	/* TODO */
350cd4e3c3eSJouni Malinen 	snprintf(buf, sizeof(buf), "FilterStatus,SUCCESS");
351cd4e3c3eSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, buf);
352*69b367b9SJouni Malinen 	return STATUS_SENT;
353cd4e3c3eSJouni Malinen }
354cd4e3c3eSJouni Malinen 
355cd4e3c3eSJouni Malinen 
356*69b367b9SJouni Malinen static enum sigma_cmd_result
cmd_sniffer_check_frame_field(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)357*69b367b9SJouni Malinen cmd_sniffer_check_frame_field(struct sigma_dut *dut,
358cd4e3c3eSJouni Malinen 			      struct sigma_conn *conn,
359cd4e3c3eSJouni Malinen 			      struct sigma_cmd *cmd)
360cd4e3c3eSJouni Malinen {
361cd4e3c3eSJouni Malinen 	char buf[200];
362cd4e3c3eSJouni Malinen 
363cd4e3c3eSJouni Malinen 	/* TODO */
364cd4e3c3eSJouni Malinen 	snprintf(buf, sizeof(buf), "FilterStatus,SUCCESS");
365cd4e3c3eSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, buf);
366*69b367b9SJouni Malinen 	return STATUS_SENT;
367cd4e3c3eSJouni Malinen }
368cd4e3c3eSJouni Malinen 
369cd4e3c3eSJouni Malinen 
sniffer_register_cmds(void)370cd4e3c3eSJouni Malinen void sniffer_register_cmds(void)
371cd4e3c3eSJouni Malinen {
372cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("sniffer_control_start", NULL,
373cd4e3c3eSJouni Malinen 			  cmd_sniffer_control_start);
374cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("sniffer_control_stop", NULL,
375cd4e3c3eSJouni Malinen 			  cmd_sniffer_control_stop);
376cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("sniffer_control_field_check", NULL,
377cd4e3c3eSJouni Malinen 			  cmd_sniffer_control_field_check);
378cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("sniffer_get_info", NULL, cmd_sniffer_get_info);
379cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("sniffer_control_filter_capture", NULL,
380cd4e3c3eSJouni Malinen 			  cmd_sniffer_control_filter_capture);
381cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("wfa_sniffer_control_filter_capture", NULL,
382cd4e3c3eSJouni Malinen 			  cmd_sniffer_control_filter_capture);
383cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("sniffer_get_field_value", NULL,
384cd4e3c3eSJouni Malinen 			  cmd_sniffer_get_field_value);
385cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("sniffer_check_p2p_NoA_duration", NULL,
386cd4e3c3eSJouni Malinen 			  cmd_sniffer_check_p2p_noa_duration);
387cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("sniffer_check_p2p_opps_client", NULL,
388cd4e3c3eSJouni Malinen 			  cmd_sniffer_check_p2p_opps_client);
389cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("sniffer_check_frame_field", NULL,
390cd4e3c3eSJouni Malinen 			  cmd_sniffer_check_frame_field);
391cd4e3c3eSJouni Malinen }
392