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