blob: 09fda170f826b39fdc3e44ec1763f3574924564a [file] [log] [blame]
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001/*
2 * Sigma Control API DUT (station/AP)
Jouni Malinen9d7e31d2017-12-22 18:55:04 +02003 * Copyright (c) 2014-2017, Qualcomm Atheros, Inc.
Jouni Malinencd4e3c32015-10-29 12:39:56 +02004 * All Rights Reserved.
5 * Licensed under the Clear BSD license. See README for more details.
6 */
7
8/*
9 * This implementation in this file is based on source code released by
10 * Wi-Fi Alliance under the following terms:
11 *
12* Copyright (c) 2014 Wi-Fi Alliance
13*
14* Permission to use, copy, modify, and/or distribute this software for any
15* purpose with or without fee is hereby granted, provided that the above
16* copyright notice and this permission notice appear in all copies.
17*
18* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
19* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
20* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
21* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
22* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
23* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
24* USE OR PERFORMANCE OF THIS SOFTWARE.
25 */
26
27#include "sigma_dut.h"
28
29static void sigma_uapsd_reset(struct sigma_stream *s);
30static void sigma_uapsd_stop(struct sigma_stream *s);
31static void create_apts_hello_pkt(int msg, unsigned int *txbuf,
Jouni Malinen947fdf62017-05-14 22:29:32 +030032 size_t txbuf_len, int tx_hello_cnt);
Jouni Malinencd4e3c32015-10-29 12:39:56 +020033
34
35/* WMM-PS Test Case IDs */
36#define B_D 1
37#define B_H 2
38#define B_B 3
39#define B_M 4
40#define M_D 5
41#define B_Z 6
42#define M_Y 7
43#define L_1 8
44#define A_Y 9
45#define B_W 10
46#define A_J 11
47#define M_V 12
48#define M_U 13
49#define A_U 14
50#define M_L 15
51#define B_K 16
52#define M_B 17
53#define M_K 18
54#define M_W 19
55
56/* WMM-PS APTS Msg IDs */
57#define APTS_DEFAULT (M_W + 0x01)
58#define APTS_HELLO (APTS_DEFAULT + 0x01)
59#define APTS_BCST (APTS_HELLO + 0x01)
60#define APTS_CONFIRM (APTS_BCST + 0x01)
61#define APTS_STOP (APTS_CONFIRM + 0x01)
62#define APTS_CK_BE (APTS_STOP + 0x01)
63#define APTS_CK_BK (APTS_CK_BE + 0x01)
64#define APTS_CK_VI (APTS_CK_BK + 0x01)
65#define APTS_CK_VO (APTS_CK_VI + 0x01)
66#define APTS_RESET (APTS_CK_VO + 0x01)
67#define APTS_RESET_RESP (APTS_RESET + 0x01)
68#define APTS_RESET_STOP (APTS_RESET_RESP + 0x01)
69#define APTS_LAST 99
70
71/* WMM-AC Test Case IDs */
72extern int sigma_wmm_ac;
73#ifdef CONFIG_WFA_WMM_AC
74#define WMMAC_422_T02B 20
75#define WMMAC_422_T03A 21
76#define WMMAC_422_T04B 22
77#define WMMAC_422_T05B 23
78#define WMMAC_422_T06B 24
79#define WMMAC_422_T07B 25
80#define WMMAC_422_T08B 26
81
82#define WMMAC_423_T04 27
83#define WMMAC_424_T07t14 28
84#define WMMAC_425_T04t06 29
85
86#define WMMAC_521_T03 30
87#define WMMAC_521_T05 31
88
89#define WMMAC_522_T04 32
90#define WMMAC_522_T06 33
91#define WMMAC_522_T06o 34
92#define WMMAC_524_T03 35
93#define WMMAC_524_T03i 36
94#define WMMAC_525_T07t10 37
95#endif /* CONFIG_WFA_WMM_AC */
96
97/* WMM-AC APTS Msg IDs */
98/* WMMAC_APTS_DEFAULT Msg Id would be WMM-AC last test case
99 * (WMMAC_525_T07t10) + 1 */
100#define WMMAC_APTS_DEFAULT 38
101#define WMMAC_APTS_HELLO (WMMAC_APTS_DEFAULT + 0x01)
102#define WMMAC_APTS_BCST (WMMAC_APTS_HELLO + 0x01)
103#define WMMAC_APTS_CONFIRM (WMMAC_APTS_BCST + 0x01)
104#define WMMAC_APTS_STOP (WMMAC_APTS_CONFIRM + 0x01)
105#define WMMAC_APTS_CK_BE (WMMAC_APTS_STOP + 0x01)
106#define WMMAC_APTS_CK_BK (WMMAC_APTS_CK_BE + 0x01)
107#define WMMAC_APTS_CK_VI (WMMAC_APTS_CK_BK + 0x01)
108#define WMMAC_APTS_CK_VO (WMMAC_APTS_CK_VI + 0x01)
109#define WMMAC_APTS_RESET (WMMAC_APTS_CK_VO + 0x01)
110#define WMMAC_APTS_RESET_RESP (WMMAC_APTS_RESET + 0x01)
111#define WMMAC_APTS_RESET_STOP (WMMAC_APTS_RESET_RESP + 0x01)
112#define WMMAC_APTS_LAST 99
113
114#ifdef CONFIG_WFA_WMM_AC
115#define LAST_TC WMMAC_525_T07t10
116#else /* CONFIG_WFA_WMM_AC */
117#define LAST_TC M_W
118#endif /* CONFIG_WFA_WMM_AC */
119
120struct apts_pkt {
121 char *name; /* name of test */
122 int cmd; /* msg num */
123 int param0; /* number of packet exchanges */
124 int param1; /* number of uplink frames */
125 int param2; /* number of downlink frames */
126 int param3;
127};
128
129/* WMM-PS APTS messages */
130struct apts_pkt apts_pkts[] = {
131 {0, -1, 0, 0, 0, 0},
132 {"B.D", B_D, 0, 0, 0, 0},
133 {"B.H", B_H, 0, 0, 0, 0},
134 {"B.B", B_B, 0, 0, 0, 0},
135 {"B.M", B_M, 0, 0, 0, 0},
136 {"M.D", M_D, 0, 0, 0, 0},
137 {"B.Z", B_Z, 0, 0, 0, 0},
138 {"M.Y", M_Y, 0, 0, 0, 0},
139 {"L.1", L_1, 0, 0, 0, 0},
140 {"A.Y", A_Y, 0, 0, 0, 0},
141 {"B.W", B_W, 0, 0, 0, 0},
142 {"A.J", A_J, 0, 0, 0, 0},
143 {"M.V", M_V, 0, 0, 0, 0},
144 {"M.U", M_U, 0, 0, 0, 0},
145 {"A.U", A_U, 0, 0, 0, 0},
146 {"M.L", M_L, 0, 0, 0, 0},
147 {"B.K", B_K, 0, 0, 0, 0},
148 {"M.B", M_B, 0, 0, 0, 0},
149 {"M.K", M_K, 0, 0, 0, 0},
150 {"M.W", M_W, 0, 0, 0, 0},
151
152 {"APTS TX ", APTS_DEFAULT, 0, 0, 0, 0},
153 {"APTS Hello ", APTS_HELLO, 0, 0, 0, 0},
154 {"APTS Broadcast ", APTS_BCST, 0, 0, 0, 0},
155 {"APTS Confirm ", APTS_CONFIRM, 0, 0, 0, 0},
156 {"APTS STOP ", APTS_STOP, 0, 0, 0, 0},
157 {"APTS CK BE ", APTS_CK_BE, 0, 0, 0, 0},
158 {"APTS CK BK ", APTS_CK_BK, 0, 0, 0, 0},
159 {"APTS CK VI ", APTS_CK_VI, 0, 0, 0, 0},
160 {"APTS CK VO ", APTS_CK_VO, 0, 0, 0, 0},
161 {"APTS RESET ", APTS_RESET, 0, 0, 0, 0},
162 {"APTS RESET RESP ", APTS_RESET_RESP, 0, 0, 0, 0},
163 {"APTS RESET STOP ", APTS_RESET_STOP, 0, 0, 0, 0},
164 {0, 0, 0, 0, 0, 0} /* APTS_LAST */
165};
166
167/* WMM-AC APTS messages */
168struct apts_pkt wmm_ac_apts_pkts[] = {
169 {0, -1, 0, 0, 0, 0},
170 {"B.D", B_D, 0, 0, 0, 0},
171 {"B.H", B_H, 0, 0, 0, 0},
172 {"B.B", B_B, 0, 0, 0, 0},
173 {"B.M", B_M, 0, 0, 0, 0},
174 {"M.D", M_D, 0, 0, 0, 0},
175 {"B.Z", B_Z, 0, 0, 0, 0},
176 {"M.Y", M_Y, 0, 0, 0, 0},
177 {"L.1", L_1, 0, 0, 0, 0},
178 {"A.Y", A_Y, 0, 0, 0, 0},
179 {"B.W", B_W, 0, 0, 0, 0},
180 {"A.J", A_J, 0, 0, 0, 0},
181 {"M.V", M_V, 0, 0, 0, 0},
182 {"M.U", M_U, 0, 0, 0, 0},
183 {"A.U", A_U, 0, 0, 0, 0},
184 {"M.L", M_L, 0, 0, 0, 0},
185 {"B.K", B_K, 0, 0, 0, 0},
186 {"M.B", M_B, 0, 0, 0, 0},
187 {"M.K", M_K, 0, 0, 0, 0},
188 {"M.W", M_W, 0, 0, 0, 0},
189#ifdef CONFIG_WFA_WMM_AC
190 {"422.T02B", WMMAC_422_T02B, 0, 0, 0, 0},
191 {"422.T03A", WMMAC_422_T03A, 0, 0, 0, 0},
192 {"422.T04A", WMMAC_422_T04B, 0, 0, 0, 0},
193 {"422.T05B", WMMAC_422_T05B, 0, 0, 0, 0},
194 {"422.T06B", WMMAC_422_T06B, 0, 0, 0, 0},
195 {"422.T07B", WMMAC_422_T07B, 0, 0, 0, 0},
196 {"422.T08B", WMMAC_422_T08B, 0, 0, 0, 0},
197 {"423.T04", WMMAC_423_T04, 0, 0, 0, 0},
198 {"424.T07", WMMAC_424_T07t14, 0, 0, 0, 0},
199 {"425.T04", WMMAC_425_T04t06, 0, 0, 0, 0},
200 {"521.T03", WMMAC_521_T03, 0, 0, 0, 0},
201 {"521.T05", WMMAC_521_T05, 0, 0, 0, 0},
202 {"522.T04", WMMAC_522_T04, 0, 0, 0, 0},
203 {"522.T06", WMMAC_522_T06, 0, 0, 0, 0},
204 {"522.T06o", WMMAC_522_T06o, 0, 0, 0, 0},
205 {"524.T03", WMMAC_524_T03, 0, 0, 0, 0},
206 {"524.T03i", WMMAC_524_T03i, 0, 0, 0, 0},
207 {"525.T07", WMMAC_525_T07t10, 0, 0, 0, 0},
208#endif /* CONFIG_WFA_WMM_AC */
209 {"APTS TX ", WMMAC_APTS_DEFAULT, 0, 0, 0, 0},
210 {"APTS Hello ", WMMAC_APTS_HELLO, 0, 0, 0, 0},
211 {"APTS Broadcast ", WMMAC_APTS_BCST, 0, 0, 0, 0},
212 {"APTS Confirm ", WMMAC_APTS_CONFIRM, 0, 0, 0, 0},
213 {"APTS STOP ", WMMAC_APTS_STOP, 0, 0, 0, 0},
214 {"APTS CK BE ", WMMAC_APTS_CK_BE, 0, 0, 0, 0},
215 {"APTS CK BK ", WMMAC_APTS_CK_BK, 0, 0, 0, 0},
216 {"APTS CK VI ", WMMAC_APTS_CK_VI, 0, 0, 0, 0},
217 {"APTS CK VO ", WMMAC_APTS_CK_VO, 0, 0, 0, 0},
218 {"APTS RESET ", WMMAC_APTS_RESET, 0, 0, 0, 0},
219 {"APTS RESET RESP ", WMMAC_APTS_RESET_RESP, 0, 0, 0, 0},
220 {"APTS RESET STOP ", WMMAC_APTS_RESET_STOP, 0, 0, 0, 0},
221 {0, 0, 0, 0, 0, 0} /* WMMAC_APTS_LAST */
222};
223
224/* WMM definitions */
225/* Atheros Madwifi use 0x88 for UPSD/Voice */
226#define TOS_VO7 0xE0 /* 111 0 0000 (7) AC_VO tos/dscp values default */
227#define TOS_VO 0xD0 /* AC_VO */
228#define TOS_VO6 0xC0 /* 110 0 0000 */
229/* console */
230#define TOS_VO2 0xB8 /* 101 1 1000 */
231/* DUT can set VO */
232
233#define TOS_VI 0xA0 /* 101 0 0000 (5) AC_VI */
234#define TOS_VI4 0x80 /* 100 0 0000 (4) AC_VI */
235/* console */
236#define TOS_VI5 0x88 /* 100 0 1000 */
237
238#define TOS_BE 0x00 /* 000 0 0000 (0) AC_BE */
239#define TOS_EE 0x60 /* 011 0 0000 (3) AC_BE */
240
241#define TOS_BK 0x20 /* 001 0 0000 (1) AC_BK */
242#define TOS_LE 0x40 /* 010 0 0000 (2) AC_BK */
243
244#define MAX_RETRY 3
245#define MAX_HELLO 20
246#define MAX_STOP 10
247#define LI_INT 2000000
248
249enum uapsd_psave {
250 PS_OFF = 0,
251 PS_ON = 1
252};
253
254typedef int (*uapsd_tx_state_func_ptr)(struct sigma_stream *,
255 u32, enum uapsd_psave, u32);
256
257struct uapsd_tx_state_table {
258 uapsd_tx_state_func_ptr state_func;
259 u32 usr_priority;
260 enum uapsd_psave ps;
261 u32 sleep_dur;
262};
263
264static int uapsd_tx_start(struct sigma_stream *s,
265 u32 usr_priority, enum uapsd_psave ps,
266 u32 sleep_duration);
267static int uapsd_tx_confirm(struct sigma_stream *s,
268 u32 usr_priority, enum uapsd_psave ps,
269 u32 sleep_duration);
270static int uapsd_tx_data(struct sigma_stream *s,
271 u32 usr_priority, enum uapsd_psave ps,
272 u32 sleep_duration);
273static int uapsd_tx_stop(struct sigma_stream *s,
274 u32 usr_priority, enum uapsd_psave ps,
275 u32 sleep_duration);
276static int uapsd_tx_cyclic(struct sigma_stream *s,
277 u32 usr_priority, enum uapsd_psave ps,
278 u32 sleep_duration);
279static int uapsd_tx_data_twice(struct sigma_stream *s,
280 u32 usr_priority, enum uapsd_psave ps,
281 u32 sleep_duration);
282
283/* The DUT WMM send table for each of the test cases */
284struct uapsd_tx_state_table sta_uapsd_tx_tbl[LAST_TC + 1][11] = {
285 /* B.D */
286 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
287 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
288 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
289 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
290 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
291 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
292 {NULL, 0, 0, 0}},
293
294 /* B.H */
295 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
296 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
297 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
298 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
299 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
300 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
301 {NULL, 0, 0, 0}},
302
303 /* B.B */
304 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
305 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
306 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
307 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
308 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
309 {uapsd_tx_data, TOS_BK, PS_ON, LI_INT / 2},
310 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
311 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
312
313 /* B.M */
314 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
315 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
316 {uapsd_tx_data, TOS_VI, PS_ON, 30000000},
317 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
318 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
319 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
320
321 /* M.D */
322 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
323 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
324 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
325 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
326 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
327 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
328 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
329 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
330
331 /* B.Z */
332 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
333 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
334 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT /2},
335 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
336 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
337 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
338
339 /* M.Y */
340 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
341 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
342 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
343 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
344 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
345 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
346 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
347 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
348
349 /* L.1 */
350 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
351 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
352 {uapsd_tx_cyclic, TOS_VO7, PS_ON, 20000},
353 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
354 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
355 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
356
357 /* A.Y */
358 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
359 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
360 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
361 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
362 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
363 {uapsd_tx_data, TOS_BE, PS_OFF, LI_INT / 2},
364 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
365 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
366 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
367
368 /* B.W */
369 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
370 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
371 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
372 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
373 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
374 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
375 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
376
377 /* A.J */
378 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
379 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
380 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
381 {uapsd_tx_data, TOS_VO7, PS_OFF, LI_INT / 2},
382 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
383 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
384 {NULL, 0, 0, 0}},
385
386 /* M.V */
387 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
388 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
389 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
390 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
391 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
392 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
393 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
394
395 /* M.U */
396 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
397 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
398 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
399 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
400 {uapsd_tx_data_twice, TOS_VO7, PS_ON, LI_INT / 2},
401 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
402 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
403
404 /* A.U */
405 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
406 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
407 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
408 {uapsd_tx_data, TOS_BE, PS_OFF, LI_INT / 2},
409 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
410 {uapsd_tx_data, TOS_BE, PS_OFF, LI_INT / 2},
411 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
412 {uapsd_tx_data, TOS_VO7, PS_OFF, LI_INT / 2},
413 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
414 {NULL, 0, 0, 0}},
415
416 /* M.L */
417 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
418 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
419 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT /2},
420 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
421 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
422 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
423
424 /* B.K */
425 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
426 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
427 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
428 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
429 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
430 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
431 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
432
433 /* M.B */
434 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
435 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
436 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
437 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
438 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
439 {uapsd_tx_data, TOS_BK, PS_ON, LI_INT / 2},
440 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
441 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
442
443 /* M.K */
444 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
445 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
446 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
447 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
448 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
449 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
450 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
451
452 /* M.W */
453 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
454 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
455 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
456 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
457 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
458 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
459 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
460
461#ifdef CONFIG_WFA_WMM_AC
462 /* WMMAC_422_T02B */
463 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
464 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
465 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
466 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
467 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
468 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
469 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
470
471 /* WMMAC_422_T03B or WMMAC_422_T03A */
472 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
473 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
474 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
475 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
476 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
477 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 20},
478 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
479 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
480
481 /* WMMAC_422_T04B/ATC7 */
482 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
483 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
484 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
485 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
486 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
487 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 20},
488 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
489 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
490
491 /* WMMAC_422_T05B/ATC8 */
492 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
493 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
494 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
495 {uapsd_tx_data, TOS_VI, PS_ON, 700000},
496 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
497 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
498 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
499
500 /* WMMAC_422_T06B/ATC9 */
501 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
502 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
503 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
504 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
505 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
506 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
507 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
508 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
509
510 /* WMMAC_422_T07B/ATC10 */
511 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
512 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
513 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
514 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 4},
515 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
516 {uapsd_tx_data, TOS_BK, PS_ON, LI_INT / 20},
517 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
518 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
519
520 /* WMMAC_422_T08B/ATC11 */
521 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
522 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
523 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
524 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 4},
525 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
526 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
527 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
528 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
529
530 /* WMMAC_423_T04 */
531 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
532 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
533 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
534 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
535 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
536 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
537
538 /* WMMAC_424_T07t14 */
539 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
540 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
541 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
542 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
543 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 20},
544 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
545 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
546
547 /* WMMAC_425_T04t06 */
548 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
549 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
550 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
551 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
552 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
553 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
554
555 /* WMMAC_521_T03 */
556 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
557 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
558 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
559 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
560 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
561 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
562 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
563
564 /* WMMAC_521_T05 */
565 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
566 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
567 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
568 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
569 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
570 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
571 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
572
573 /* WMMAC_522_T04 */
574 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
575 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
576 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
577 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
578 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
579 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
580 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
581
582 /* WMMAC_522_T06 */
583 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
584 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
585 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
586 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
587 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
588 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
589 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
590 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
591
592 /* WMMAC_522_T06o */
593 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
594 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
595 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
596 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
597 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
598 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
599 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
600 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
601
602 /* WMMAC_524_T03 */
603 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
604 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
605 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
606 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
607 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
608 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
609 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
610
611 /* WMMAC_524_T03i */
612 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
613 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
614 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
615 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
616 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
617 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
618 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
619
620 /* WMMAC_525_T07t10 */
621 {{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
622 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
623 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
624 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
625 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
626 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
627#endif /* CONFIG_WFA_WMM_AC */
628};
629
630typedef int (*uapsd_recv_state_func_ptr)(struct sigma_stream *s,
631 unsigned int *, int);
632
633struct uapsd_rcv_state_table {
634 uapsd_recv_state_func_ptr state_func;
635};
636
637static int uapsd_rx_start(struct sigma_stream *s,
638 unsigned int *rxpkt, int rxpkt_len);
639static int uapsd_rx_data(struct sigma_stream *s,
640 unsigned int *rxpkt, int rxpkt_len);
641static int uapsd_rx_stop(struct sigma_stream *s,
642 unsigned int *rxpkt, int rxpkt_len);
643static int uapsd_rx_cyclic_vo(struct sigma_stream *s,
644 unsigned int *rxpkt, int rxpkt_len);
645
646/* The DUT WMM send table for each of the test cases */
647struct uapsd_rcv_state_table sta_uapsd_recv_tbl[LAST_TC + 10][6] = {
648 /* B.D */
649 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL}, {NULL},
650 {NULL}},
651 /* B.H */
652 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
653 {NULL}, {NULL}},
654 /* B.B */
655 {{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
656 /* B.M */
657 {{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
658 /* M.D */
659 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
660 {uapsd_rx_data}, {uapsd_rx_stop}},
661 /* B.Z */
662 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
663 {NULL}, {NULL}},
664 /* M.Y */
665 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
666 {uapsd_rx_stop}, {NULL}},
667 /* L.1 */
668 {{uapsd_rx_start}, {uapsd_rx_cyclic_vo}, {NULL}, {NULL}, {NULL},
669 {NULL}},
670 /* A.Y */
671 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
672 {uapsd_rx_stop}, {NULL}},
673 /* B.W */
674 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
675 {uapsd_rx_data}, {uapsd_rx_stop}},
676 /* A.J */
677 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
678 {uapsd_rx_data}, {uapsd_rx_stop}},
679 /* M.V */
680 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
681 {uapsd_rx_stop}, {NULL}},
682 /* M.U */
683 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
684 {uapsd_rx_data}, {uapsd_rx_stop}},
685 /* A.U */
686 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
687 {uapsd_rx_stop}, {NULL}},
688 /* M.L */
689 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL}, {NULL},
690 {NULL}},
691 /* B.K */
692 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
693 {NULL}, {NULL}},
694 /* M.B */
695 {{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
696 /* M.K */
697 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
698 {NULL}, {NULL}},
699 /* M.W */
700 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
701 {uapsd_rx_data}, {uapsd_rx_stop}},
702
703#ifdef CONFIG_WFA_WMM_AC
704 /* WMMAC_422_T02B */
705 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
706 {uapsd_rx_data}, {uapsd_rx_stop}},
707 /* WMMAC_422_T03B or WMMAC_422_T03A */
708 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
709 {uapsd_rx_stop}, {NULL}},
710 /* WMMAC_422_T04B */
711 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
712 {uapsd_rx_data}, {uapsd_rx_stop}},
713 /* WMMAC_422_T05B */
714 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
715 {uapsd_rx_stop}, {NULL}},
716 /* WMMAC_422_T06B */
717 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
718 {uapsd_rx_data}, {uapsd_rx_stop}},
719 /* WMMAC_422_T07B */
720 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
721 {uapsd_rx_data}, {uapsd_rx_stop}},
722 /* WMMAC_422_T08B */
723 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
724 {uapsd_rx_data}, {uapsd_rx_stop}},
725 /* WMMAC_423_T04 */
726 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL}, {NULL},
727 {NULL}},
728 /* WMMAC_424_T07t14 */
729 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
730 {NULL}, {NULL}},
731 /* WMMAC_425_T04t06 */
732 {{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
733 /* WMMAC_521_T03 */
734 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
735 {NULL}, {NULL}},
736 /* WMMAC_521_T05 */
737 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
738 {NULL}, {NULL}},
739 /* WMMAC_522_T04 */
740 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
741 {NULL}, {NULL}},
742 /* WMMAC_522_T06 */
743 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
744 {uapsd_rx_data}, {uapsd_rx_stop}},
745 /* WMMAC_522_T06o */
746 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
747 {uapsd_rx_data}, {uapsd_rx_stop}},
748 /* WMMAC_524_T03 */
749 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
750 {NULL}, {NULL}},
751 /* WMMAC_524_T03i */
752 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
753 {NULL}, {NULL}},
754 /* WMMAC_525_T07t10 */
755 {{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL},
756 {NULL}, {NULL}},
757#endif /* CONFIG_WFA_WMM_AC */
758};
759
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +0530760/* U-APSD console data */
761#define NETWORK_CLASS_C 0x00ffffff
762#define UAPSD_CONSOLE_TIMER 200
763
764typedef int (*uapsd_console_state_func_ptr)(struct sigma_stream *s,
765 unsigned int *rx_msg_buf, int len);
766struct uapsd_console_state_table {
767 uapsd_console_state_func_ptr state_func;
768};
769
770static int console_rx_hello(struct sigma_stream *, unsigned int *, int);
771static int console_rx_confirm(struct sigma_stream *, unsigned int *, int);
772static int console_rx_confirm_tx_vi(struct sigma_stream *, unsigned int *, int);
773static int console_rx_tx_stop(struct sigma_stream *, unsigned int *, int);
774static int console_rx_vo_tx_stop(struct sigma_stream *, unsigned int *, int);
775static int console_rx_vi_tx_stop(struct sigma_stream *, unsigned int *, int);
776static int console_rx_vi_tx_vi(struct sigma_stream *, unsigned int *, int);
777static int console_rx_vi_tx_bcst(struct sigma_stream *, unsigned int *, int);
778static int console_rx_be_tx_bcst(struct sigma_stream *, unsigned int *, int);
779static int console_rx_be_tx_be(struct sigma_stream *, unsigned int *, int);
780static int console_rx_be_tx_be_tx_stop(struct sigma_stream *, unsigned int *,
781 int);
782static int console_rx_bk_tx_stop(struct sigma_stream *, unsigned int *, int);
783static int console_rx_vi_tx_vo_tx_stop(struct sigma_stream *, unsigned int *,
784 int);
785static int console_rx_vo_tx_bcst_tx_stop(struct sigma_stream *, unsigned int *,
786 int);
787static int console_rx_vi_tx_be(struct sigma_stream *, unsigned int *, int);
788static int console_rx_vi_tx_bk(struct sigma_stream *, unsigned int *, int);
789static int console_rx_vo_tx_vo_cyclic(struct sigma_stream *, unsigned int *,
790 int);
791static int console_rx_vo_tx_vo(struct sigma_stream *, unsigned int *, int);
792static int console_rx_vo_tx_vo_tx_stop(struct sigma_stream *, unsigned int *,
793 int);
794static int console_rx_vo_tx_2vo(struct sigma_stream *, unsigned int *, int);
795static int console_rx_be_tx_bcst_tx_stop(struct sigma_stream *, unsigned int *,
796 int);
797static int console_rx_vo(struct sigma_stream *, unsigned int *, int);
798static int console_rx_vi(struct sigma_stream *, unsigned int *, int);
799static int console_rx_be(struct sigma_stream *, unsigned int *, int);
800static int console_rx_vo_tx_all_tx_stop(struct sigma_stream *, unsigned int *,
801 int);
802static int console_rx_vi_tx_vi_tx_stop(struct sigma_stream *, unsigned int *,
803 int);
804
805/* U-APSD console process table for each of the test cases */
806struct uapsd_console_state_table uapsd_console_state_tbl[LAST_TC + 1][10] = {
807 /* Ini */
808 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_vo},
809 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},
810
811 /* B.D */
812 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_vo},
813 {console_rx_vo_tx_stop}, {console_rx_tx_stop}, {console_rx_tx_stop},
814 {NULL}, {NULL}, {NULL}, {NULL}},
815
816 /* B.H */
817 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_2vo},
818 {console_rx_vo_tx_stop}, {console_rx_tx_stop}, {console_rx_tx_stop},
819 {NULL}, {NULL}, {NULL}, {NULL}},
820
821 /* B.B */
822 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vo},
823 {console_rx_vi}, {console_rx_be}, {console_rx_bk_tx_stop},
824 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}},
825
826 /* B.M */
827 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_stop},
828 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},
829
830 /* M.D */
831 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_be},
832 {console_rx_vi_tx_bk}, {console_rx_vi_tx_vi},
833 {console_rx_vi_tx_vo_tx_stop}, {console_rx_tx_stop},
834 {NULL}, {NULL}, {NULL}},
835
836 /* B.Z */
837 {{console_rx_hello}, {console_rx_confirm_tx_vi},
838 {console_rx_vo_tx_bcst_tx_stop}, {console_rx_tx_stop},
839 {NULL}, {NULL}, {NULL}, {NULL}},
840
841 /* M.Y */
842 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
843 {console_rx_vo}, {console_rx_be_tx_be},
844 {console_rx_be_tx_bcst_tx_stop}, {console_rx_tx_stop},
845 {NULL}, {NULL}, {NULL}},
846
847 /* L.1 */
848 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_vo_cyclic},
849 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},
850
851 /* A.Y */
852 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
853 {console_rx_vo}, {console_rx_be_tx_be}, {console_rx_be},
854 {console_rx_be_tx_bcst_tx_stop}, {console_rx_tx_stop}, {NULL}, {NULL}},
855
856 /* B.W */
857 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_bcst},
858 {console_rx_vi_tx_bcst}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
859 {NULL}, {NULL}, {NULL}, {NULL}},
860
861 /* A.J */
862 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vo},
863 {console_rx_vo_tx_all_tx_stop}, {console_rx_tx_stop},
864 {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},
865
866 /* M.V */
867 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
868 {console_rx_be_tx_be}, {console_rx_vi_tx_vi_tx_stop},
869 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
870
871 /* M.U */
872 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
873 {console_rx_be_tx_be}, {console_rx_vo_tx_vo},
874 {console_rx_vo_tx_vo_tx_stop}, {console_rx_tx_stop},
875 {NULL}, {NULL}, {NULL}},
876
877 /* A.U */
878 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
879 {console_rx_be}, {console_rx_be_tx_be}, {console_rx_be},
880 {console_rx_vo_tx_vo}, {console_rx_vo_tx_stop}, {console_rx_tx_stop},
881 {NULL}},
882
883 /* M.L */
884 {{console_rx_hello}, {console_rx_confirm},
885 {console_rx_be_tx_be_tx_stop}, {console_rx_tx_stop},
886 {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},
887
888 /* B.K */
889 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
890 {console_rx_be_tx_be}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
891 {NULL}, {NULL}, {NULL}, {NULL}},
892
893 /* M.B */
894 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vo},
895 {console_rx_vi}, {console_rx_be}, {console_rx_bk_tx_stop},
896 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}},
897
898 /* M.K */
899 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
900 {console_rx_be_tx_be}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
901 {NULL}, {NULL}, {NULL}, {NULL}},
902
903 /* M.W */
904 {{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_bcst},
905 {console_rx_be_tx_bcst}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
906 {NULL}, {NULL}, {NULL}, {NULL}}
907};
908
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200909
Jouni Malinen947fdf62017-05-14 22:29:32 +0300910static void create_apts_pkt(int msg, unsigned int txbuf[], size_t txbuf_len,
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200911 u32 uapsd_dscp, struct sigma_stream *s)
912{
913 struct apts_pkt *t;
914
915 if (!sigma_wmm_ac)
916 t = &apts_pkts[msg];
917 else
918 t = &wmm_ac_apts_pkts[msg];
919
920 txbuf[0] = s->rx_cookie;
921 txbuf[1] = uapsd_dscp;
922 txbuf[2] = 0;
923 txbuf[3] = 0;
924 txbuf[4] = 0;
925 txbuf[5] = 0;
926 txbuf[9] = s->sta_id;
927 txbuf[10] = t->cmd;
Jouni Malinen947fdf62017-05-14 22:29:32 +0300928 strlcpy((char *) &txbuf[11], t->name,
929 txbuf_len - sizeof(txbuf[0]) * 11);
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200930}
931
932
933static int uapsd_tx_start(struct sigma_stream *s,
934 u32 usr_priority, enum uapsd_psave ps,
935 u32 sleep_duration)
936{
937 unsigned int *tpkt;
938 int pktlen = 256;
939 struct sigma_dut *dut = s->dut;
940 u32 msgid;
941
942 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_start");
943 tpkt = malloc(s->payload_size);
944 if (tpkt == NULL) {
945 sigma_dut_print(dut, DUT_MSG_ERROR,
946 "send_uapsd: Send buffer allocation failed");
947 return -1;
948 }
949
950 /* check whether a test case is received */
951 if (s->uapsd_rx_state > 0) {
952 s->uapsd_tx_state++;
953 } else {
954 set_ps(s->ifname, dut, 0);
955 if (s->tx_hello_cnt <= MAX_HELLO) {
956 memset(tpkt, 0, s->payload_size);
957 /* if test is for WMM-AC set APTS HELLO to 39 */
958 msgid = sigma_wmm_ac ? WMMAC_APTS_HELLO : APTS_HELLO;
Jouni Malinen947fdf62017-05-14 22:29:32 +0300959 create_apts_hello_pkt(msgid, tpkt, s->payload_size,
960 s->tx_hello_cnt);
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200961 if (send(s->sock, tpkt, pktlen, 0) <= 0) {
962 sigma_dut_print(dut, DUT_MSG_ERROR,
963 "send_uapsd: Send failed");
964 }
965 s->tx_hello_cnt++;
966 sigma_dut_print(dut, DUT_MSG_INFO,
967 "send_uapsd: Hello Sent cnt %d",
968 s->tx_hello_cnt);
969 sleep(1);
970 } else {
971 printf("\n send_uapsd: Too many Hellos Sent... \n");
972 sigma_dut_print(dut, DUT_MSG_ERROR,
973 "send_uapsd: Too many Hellos sent... ");
974 s->stop = 1;
975 }
976 }
977
978 free(tpkt);
979 sigma_dut_print(dut, DUT_MSG_INFO,
980 "Exit uapsd_tx_start uapsd_sta_tc %d uapsd_tx_state %d",
981 s->uapsd_sta_tc, s->uapsd_tx_state);
982
983 return 0;
984}
985
986
987static int uapsd_tx_confirm(struct sigma_stream *s,
988 u32 usr_priority, enum uapsd_psave ps,
989 u32 sleep_duration)
990{
991 unsigned int *tpkt;
992 int pktlen = 256;
993 struct sigma_dut *dut = s->dut;
994 u32 msgid;
995
996 sigma_dut_print(dut, DUT_MSG_INFO,
997 "send_uapsd: Enter uapsd_tx_confirm");
998 tpkt = malloc(s->payload_size);
999 if (tpkt == NULL) {
1000 sigma_dut_print(dut, DUT_MSG_ERROR,
1001 "send_uapsd: Send buffer allocation failed");
1002 return -1;
1003 }
1004
1005 usleep(sleep_duration);
1006 set_ps(s->ifname, dut, ps);
1007 memset(tpkt, 0, s->payload_size);
1008 /* if test is for WMM-AC set APTS CONFIRM to 41 */
1009 msgid = sigma_wmm_ac ? WMMAC_APTS_CONFIRM : APTS_CONFIRM;
Jouni Malinen947fdf62017-05-14 22:29:32 +03001010 create_apts_pkt(msgid, tpkt, s->payload_size, usr_priority, s);
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001011 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1012 sizeof(usr_priority));
1013 if (send(s->sock, tpkt, pktlen, 0) > 0) {
1014 s->uapsd_tx_state++;
1015 } else {
1016 sigma_dut_print(dut, DUT_MSG_ERROR,
1017 "send_uapsd: Send failed");
1018 }
1019 free(tpkt);
1020 sigma_dut_print(dut, DUT_MSG_INFO,
1021 "Exit uapsd_tx_confirm uapsd_sta_tc %d uapsd_tx_state %d",
1022 s->uapsd_sta_tc, s->uapsd_tx_state);
1023
1024 return 0;
1025}
1026
1027
1028static int uapsd_tx_data(struct sigma_stream *s,
1029 u32 usr_priority, enum uapsd_psave ps,
1030 u32 sleep_duration)
1031{
1032 unsigned int *tpkt;
1033 int pktlen = 256;
1034 struct sigma_dut *dut = s->dut;
1035 u32 msgid;
1036
1037 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_data");
1038
1039 tpkt = malloc(s->payload_size);
1040 if (tpkt == NULL) {
1041 sigma_dut_print(dut, DUT_MSG_ERROR,
1042 "send_uapsd: Send buffer allocation failed");
1043 return -1;
1044 }
1045 usleep(sleep_duration);
1046 set_ps(s->ifname, dut, ps);
1047 memset(tpkt, 0, s->payload_size);
1048 /* if test is for WMM-AC set APTS DEFAULT to 38 */
1049 msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
Jouni Malinen947fdf62017-05-14 22:29:32 +03001050 create_apts_pkt(msgid, tpkt, s->payload_size, usr_priority, s);
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001051 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1052 sizeof(usr_priority));
1053 if (send(s->sock, tpkt, pktlen, 0) > 0) {
1054 s->uapsd_tx_state++;
1055 } else {
1056 sigma_dut_print(dut, DUT_MSG_ERROR,
1057 "send_uapsd: Send failed");
1058 }
1059
1060 free(tpkt);
1061 sigma_dut_print(dut, DUT_MSG_INFO,
1062 "Exit uapsd_tx_data uapsd_sta_tc %d uapsd_tx_state %d",
1063 s->uapsd_sta_tc, s->uapsd_tx_state);
1064
1065 return 0;
1066}
1067
1068
1069static int uapsd_tx_data_twice(struct sigma_stream *s,
1070 u32 usr_priority, enum uapsd_psave ps,
1071 u32 sleep_duration)
1072{
1073 unsigned int *tpkt;
1074 int pktlen = 256, i = 0, tx_status = 0;
1075 struct sigma_dut *dut = s->dut;
1076 u32 msgid;
1077
1078 sigma_dut_print(dut, DUT_MSG_INFO,
1079 "send_uapsd: Enter uapsd_tx_data_twice");
1080 tpkt = malloc(s->payload_size);
1081 if (tpkt == NULL) {
1082 sigma_dut_print(dut, DUT_MSG_ERROR,
1083 "send_uapsd: Send buffer allocation failed");
1084 return -1;
1085 }
1086 usleep(sleep_duration);
1087 set_ps(s->ifname, dut, ps);
1088 memset(tpkt, 0, s->payload_size);
1089 /* if test is for WMM-AC set APTS DEFAULT to 38 */
1090 msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
Jouni Malinen947fdf62017-05-14 22:29:32 +03001091 create_apts_pkt(msgid, tpkt, s->payload_size, usr_priority, s);
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001092 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1093 sizeof(usr_priority));
1094 for(i = 0; i < 2; i++) {
1095 if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1096 sigma_dut_print(dut, DUT_MSG_ERROR,
1097 "send_uapsd: Send failed");
1098 tx_status = -1;
1099 }
1100 }
1101 if (tx_status == 0)
1102 s->uapsd_tx_state++;
1103 free(tpkt);
1104 sigma_dut_print(dut, DUT_MSG_INFO,
1105 "Exit uapsd_tx_data_twice uapsd_sta_tc %d uapsd_tx_state %d",
1106 s->uapsd_sta_tc, s->uapsd_tx_state);
1107
1108 return 0;
1109}
1110
1111
1112static int uapsd_tx_cyclic(struct sigma_stream *s,
1113 u32 usr_priority, enum uapsd_psave ps,
1114 u32 sleep_duration)
1115{
1116 unsigned int *tpkt;
1117 int pktlen = 256, i = 0, tx_status = 0;
1118 struct sigma_dut *dut = s->dut;
1119 u32 msgid;
1120
1121 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_cyclic");
1122 tpkt = malloc(s->payload_size);
1123 if (tpkt == NULL) {
1124 sigma_dut_print(dut, DUT_MSG_ERROR,
1125 "send_uapsd: Send buffer allocation failed");
1126 return -1;
1127 }
1128
1129 set_ps(s->ifname, dut, ps);
1130 for (i = 0; i < 3000; i++) {
1131 usleep(sleep_duration);
1132 memset(tpkt, 0, s->payload_size);
1133 /* if test is for WMM-AC set APTS DEFAULT to 38 */
1134 msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
Jouni Malinen947fdf62017-05-14 22:29:32 +03001135 create_apts_pkt(msgid, tpkt, s->payload_size, usr_priority, s);
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001136 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1137 sizeof(usr_priority));
1138 if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1139 sigma_dut_print(dut, DUT_MSG_ERROR,
1140 "send_uapsd: Send failed");
1141 tx_status = -1;
1142 }
1143 }
1144 if (tx_status == 0)
1145 s->uapsd_tx_state++;
1146 free(tpkt);
1147 sigma_dut_print(dut, DUT_MSG_INFO,
1148 "Exit uapsd_tx_cyclic uapsd_sta_tc %d uapsd_tx_state %d",
1149 s->uapsd_sta_tc, s->uapsd_tx_state);
1150
1151 return 0;
1152}
1153
1154
1155static int uapsd_tx_stop(struct sigma_stream *s,
1156 u32 usr_priority, enum uapsd_psave ps,
1157 u32 sleep_duration)
1158{
1159 unsigned int *tpkt;
1160 int pktlen = 256;
1161 struct sigma_dut *dut = s->dut;
1162 u32 msgid;
1163
1164 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_stop");
1165 tpkt = malloc(s->payload_size);
1166 if (tpkt == NULL) {
1167 sigma_dut_print(dut, DUT_MSG_ERROR,
1168 "send_uapsd: Send buffer allocation failed");
1169 return -1;
1170 }
1171 usleep(sleep_duration);
1172 if(!s->tx_stop_cnt)
1173 set_ps(s->ifname, dut, ps);
1174 s->tx_stop_cnt++;
1175 memset(tpkt, 0, s->payload_size);
1176 /* if test is for WMM-AC set APTS STOP to 42 */
1177 msgid = sigma_wmm_ac ? WMMAC_APTS_STOP : APTS_STOP;
Jouni Malinen947fdf62017-05-14 22:29:32 +03001178 create_apts_pkt(msgid, tpkt, s->payload_size, usr_priority, s);
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001179 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1180 sizeof(usr_priority));
1181 if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1182 sigma_dut_print(dut, DUT_MSG_ERROR,
1183 "send_uapsd: Send failed");
1184 }
1185 pthread_mutex_lock(&s->tx_thr_mutex);
1186 pthread_cond_signal(&s->tx_thr_cond);
1187 pthread_mutex_unlock(&s->tx_thr_mutex);
1188 if (s->tx_stop_cnt > MAX_STOP) {
1189 sigma_dut_print(dut, DUT_MSG_ERROR,
1190 "send_uapsd: Enter TX_STOP Max Stop sent %d",
1191 s->tx_stop_cnt);
1192 s->stop = 1;
1193 }
1194 free(tpkt);
1195 sigma_dut_print(dut, DUT_MSG_INFO,
1196 "Exit uapsd_tx_stop uapsd_sta_tc %d uapsd_tx_state %d",
1197 s->uapsd_sta_tc, s->uapsd_tx_state);
1198
1199 return 0;
1200}
1201
1202
1203static int uapsd_rx_start(struct sigma_stream *s,
1204 unsigned int *rxpkt, int rxpkt_len)
1205{
1206 int test_num = 0;
1207 struct sigma_dut *dut = s->dut;
1208 int msgid;
1209
1210 test_num = rxpkt[10];
1211
1212 sigma_dut_print(dut, DUT_MSG_INFO,
1213 "receive_uapsd: Enter uapsd_rx_start");
1214 /* if test is for WMM-AC set LAST_TC to 37 */
1215 msgid = sigma_wmm_ac ? LAST_TC : M_W;
1216
1217 if (!((test_num >= B_D) && (test_num <= msgid)))
1218 return -1;
1219
1220 /*
1221 * Test numbers start from 1. Hence decrement by 1
1222 * to match the array index.
1223 */
1224 s->uapsd_sta_tc = (rxpkt[10] - 1);
1225 s->sta_id = rxpkt[9];
1226 (s->uapsd_rx_state)++;
1227
1228 return 0;
1229}
1230
1231
1232static int uapsd_rx_data(struct sigma_stream *s,
1233 unsigned int *rxpkt, int rxpkt_len)
1234{
1235 struct sigma_dut *dut = s->dut;
1236 u32 msgid;
1237
1238 sigma_dut_print(dut, DUT_MSG_INFO,
1239 "receive_uapsd: Enter uapsd_rx_data");
1240 /* if test is for WMM-AC set APTS DEFAULT to 38 */
1241 msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1242
1243 if ((rxpkt[10] == msgid) &&
1244 ((rxpkt[1] == TOS_BE) ||
1245 (rxpkt[1] == TOS_BK) ||
1246 (rxpkt[1] == TOS_VI) ||
1247 (rxpkt[1] == TOS_VO) ||
1248 (rxpkt[1] == TOS_VO7) ||
1249 (rxpkt[1] == TOS_VO6))) {
1250 s->rx_cookie = rxpkt[0];
1251 (s->uapsd_rx_state)++;
1252 sigma_dut_print(dut, DUT_MSG_INFO,
1253 "receive_uapsd: Recv in uapsd_rx_data uapsd_rx_state %d",
1254 s->uapsd_rx_state);
1255 } else {
1256 sigma_dut_print(dut, DUT_MSG_ERROR,
1257 "receive_uapsd: BAD Pkt recv in uapsd_rx_data");
1258 sigma_uapsd_reset(s);
1259 }
1260
1261 sigma_dut_print(dut, DUT_MSG_INFO,
1262 "receive_uapsd: Exit uapsd_rx_data");
1263
1264 return 0;
1265}
1266
1267
1268static int uapsd_rx_stop(struct sigma_stream *s,
1269 unsigned int *rxpkt, int rxpkt_len)
1270{
1271 struct sigma_dut *dut = s->dut;
1272 u32 msgid;
1273
1274 sigma_dut_print(dut, DUT_MSG_INFO,
1275 "receive_uapsd: Enter uapsd_rx_stop");
1276 /* if test is for WMM-AC set APTS STOP to 42 */
1277 msgid = sigma_wmm_ac ? WMMAC_APTS_STOP : APTS_STOP;
1278
1279 if (rxpkt[10] != msgid) {
1280 sigma_dut_print(dut, DUT_MSG_ERROR,
1281 "receive_uapsd: BAD Pkt recv in uapsd_rx_stop");
1282 } else {
1283 sigma_uapsd_stop(s);
1284 }
1285 sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Exit uapsd_rx_stop");
1286
1287 return 0;
1288}
1289
1290
1291static int uapsd_rx_cyclic_vo(struct sigma_stream *s,
1292 unsigned int *rxpkt, int rxpkt_len)
1293{
1294 struct sigma_dut *dut = s->dut;
1295 u32 msgid, msgid2;
1296
1297 sigma_dut_print(dut, DUT_MSG_INFO,
1298 "receive_uapsd: Enter uapsd_rx_cyclic_vo");
1299 /* if test is for WMM-AC set
1300 * APTS STOP to 42 and
1301 * APTS DEFAULT to 38 */
1302 if (!sigma_wmm_ac) {
1303 msgid = APTS_STOP;
1304 msgid2 = APTS_DEFAULT;
1305 } else {
1306 msgid = WMMAC_APTS_STOP;
1307 msgid2 = WMMAC_APTS_DEFAULT;
1308 }
1309
1310 if (rxpkt[10] != msgid) {
1311 if ((rxpkt[10] == msgid2) &&
1312 ((rxpkt[1] == TOS_VO) ||
1313 (rxpkt[1] == TOS_VO7) ||
1314 (rxpkt[1] == TOS_VO6))) {
1315 /* ; 5.7 */
1316 s->rx_cookie = rxpkt[0];
1317 } else {
1318 sigma_dut_print(dut, DUT_MSG_ERROR,
1319 "receive_uapsd: BAD Pkt recv in uapsd_rx_cyclic_vo");
1320 }
1321 } else {
1322 sigma_uapsd_stop(s);
1323 }
1324 sigma_dut_print(dut, DUT_MSG_INFO,
1325 "receive_uapsd: Exit uapsd_rx_cyclic_vo");
1326
1327 return 0;
1328}
1329
1330
1331static void create_apts_hello_pkt(int msg, unsigned int *txbuf,
Jouni Malinen947fdf62017-05-14 22:29:32 +03001332 size_t txbuf_len, int tx_hello_cnt)
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001333{
1334 struct apts_pkt *t;
1335
1336 if (!sigma_wmm_ac)
1337 t = &apts_pkts[msg];
1338 else
1339 t = &wmm_ac_apts_pkts[msg];
1340
1341 txbuf[0] = tx_hello_cnt;
1342 txbuf[1] = 0;
1343 txbuf[2] = 0;
1344 txbuf[3] = 0;
1345 txbuf[4] = 0;
1346 txbuf[5] = 0;
1347 txbuf[6] = t->param0;
1348 txbuf[7] = t->param1;
1349 txbuf[8] = t->param2;
1350 txbuf[9] = t->param3;
1351 txbuf[10] = t->cmd;
Jouni Malinen947fdf62017-05-14 22:29:32 +03001352 strlcpy((char *) &txbuf[11], t->name,
1353 txbuf_len - sizeof(txbuf[0]) * 11);
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001354 printf("create_apts_hello_pkt (%s) %d\n", t->name, t->cmd);
1355}
1356
1357
1358static void sigma_uapsd_init(struct sigma_stream *s)
1359{
1360 s->uapsd_sta_tc = 0; /* Test Case to execute or row to select */
1361 /* in a test case row, next column or next state function to execute */
1362 s->uapsd_rx_state = 0;
1363 s->uapsd_tx_state = 0;
1364
1365 s->sta_id = 0;
1366 s->uapsd_send_thr = 0;
1367
1368 s->reset_rx = 0;
1369 s->num_retry = 0;
1370 s->tx_stop_cnt = 0;
1371 s->tx_hello_cnt = 0;
1372}
1373
1374
1375static void sigma_uapsd_stop(struct sigma_stream *s)
1376{
1377 pthread_mutex_lock(&s->tx_thr_mutex);
1378 pthread_cond_wait(&s->tx_thr_cond, &s->tx_thr_mutex);
1379 pthread_mutex_unlock(&s->tx_thr_mutex);
1380 s->stop = 1;
1381 sleep(1);
1382}
1383
1384
1385static void sigma_uapsd_reset(struct sigma_stream *s)
1386{
1387 int tos = TOS_BE;
1388 unsigned int *reset_pkt;
1389 struct sigma_dut *dut = s->dut;
1390 u32 msgid;
1391
1392 s->num_retry++;
1393
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05301394 /* if reset is called from U-APSD console set it */
1395 s->reset = 1;
1396
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001397 reset_pkt = malloc(s->payload_size);
1398 if (reset_pkt == NULL)
1399 return;
1400
1401 if (s->num_retry > MAX_RETRY) {
1402 /* if test is for WMM-AC set APTS RESET STOP to 49 */
1403 msgid = sigma_wmm_ac ? WMMAC_APTS_RESET_STOP : APTS_RESET_STOP;
Jouni Malinen947fdf62017-05-14 22:29:32 +03001404 create_apts_pkt(msgid, reset_pkt, s->payload_size, tos, s);
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001405 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1406 send(s->sock, reset_pkt, s->payload_size, 0);
1407 sigma_dut_print(dut, DUT_MSG_ERROR,
1408 "sigma_uapsd_reset: Too many Reset retries");
1409 s->stop = 1;
1410 }
1411
1412 if (!(s->reset_rx)) {
1413 /* if test is for WMM-AC set APTS RESET to 47 */
1414 msgid = sigma_wmm_ac ? WMMAC_APTS_RESET : APTS_RESET;
Jouni Malinen947fdf62017-05-14 22:29:32 +03001415 create_apts_pkt(msgid, reset_pkt, s->payload_size, tos, s);
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001416 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1417 send(s->sock, reset_pkt, s->payload_size, 0);
1418 } else {
1419 /* if test is for WMM-AC set APTS RESET RESP to 48 */
1420 msgid = sigma_wmm_ac ? WMMAC_APTS_RESET_RESP : APTS_RESET_RESP;
Jouni Malinen947fdf62017-05-14 22:29:32 +03001421 create_apts_pkt(msgid, reset_pkt, s->payload_size, tos, s);
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001422 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1423 send(s->sock, reset_pkt, s->payload_size, 0);
1424 s->reset_rx = 0;
1425 }
1426 free(reset_pkt);
1427}
1428
1429
1430static void * send_uapsd(void *data)
1431{
1432 struct sigma_stream *s = data;
1433 struct sigma_dut *dut = s->dut;
1434 uapsd_tx_state_func_ptr tx_state_func;
1435 u32 usr_priority, sleep_duration;
1436 enum uapsd_psave ps;
1437
1438 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Uapsd TX Start");
1439
1440 s->payload_size = 512;
1441
1442 while (!s->stop) {
1443 sigma_dut_print(dut, DUT_MSG_INFO,
1444 "send_uapsd: running while uapsd_rx_state %d",
1445 s->uapsd_rx_state);
1446
1447 tx_state_func = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1448 [s->uapsd_tx_state].state_func;
1449 usr_priority = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1450 [s->uapsd_tx_state].usr_priority;
1451 sleep_duration = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1452 [s->uapsd_tx_state].sleep_dur;
1453 ps = sta_uapsd_tx_tbl[s->uapsd_sta_tc][s->uapsd_tx_state].ps;
1454
1455 sigma_dut_print(dut, DUT_MSG_INFO,
1456 "send_uapsd: uapsd_sta_tc %d uapsd_tx_state %d",
1457 s->uapsd_sta_tc, s->uapsd_tx_state);
1458 if (tx_state_func) {
1459 tx_state_func(s, usr_priority, ps, sleep_duration);
1460 } else {
1461 sigma_dut_print(dut, DUT_MSG_INFO,
1462 "send_uapsd: Null Function Detected for TC : %d in uapsd_tx_state : %d",
1463 s->uapsd_sta_tc, s->uapsd_tx_state);
1464 }
1465 }
1466
1467 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Uapsd TX End");
1468 pthread_join(s->uapsd_send_thr, NULL);
1469
1470 return NULL;
1471}
1472
1473
1474void receive_uapsd(struct sigma_stream *s)
1475{
1476 struct timeval tv;
1477 fd_set rfds;
1478 int res = 0, ret = 0, rxpkt_len = 0;
1479 unsigned int *rxpkt;
1480 uapsd_recv_state_func_ptr recv_state_func;
1481 struct sigma_dut *dut = s->dut;
1482 u32 msgid;
1483
1484 sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Uapsd RX Start");
1485 sigma_uapsd_init(s);
1486
1487 ret = pthread_mutex_init(&s->tx_thr_mutex, NULL);
1488 if (ret != 0) {
1489 sigma_dut_print(dut, DUT_MSG_INFO,
1490 "receive_uapsd: pthread_mutex_init failed");
1491 return;
1492 }
1493
1494 ret = pthread_cond_init(&s->tx_thr_cond, NULL);
1495 if (ret != 0) {
1496 sigma_dut_print(dut, DUT_MSG_INFO,
1497 "receive_uapsd: pthread_cond_init failed");
1498 pthread_mutex_destroy(&s->tx_thr_mutex);
1499 return;
1500 }
1501
1502 if (pthread_create(&s->uapsd_send_thr, NULL, send_uapsd, s)) {
1503 sigma_dut_print(dut, DUT_MSG_ERROR,
1504 "receive_uapsd: send_uapsd tx thread creation failed");
1505 pthread_cond_destroy(&s->tx_thr_cond);
1506 pthread_mutex_destroy(&s->tx_thr_mutex);
1507 return;
1508 }
1509
1510 s->payload_size = 512;
1511 rxpkt = malloc(s->payload_size);
1512 if (rxpkt == NULL) {
1513 sigma_dut_print(dut, DUT_MSG_ERROR,
1514 "receive_uapsd: Receive buffer allocation failed");
1515 s->stop = 1;
1516 }
1517
1518 while (!s->stop) {
1519 FD_ZERO(&rfds);
1520 FD_SET(s->sock, &rfds);
1521 tv.tv_sec = 0;
1522 tv.tv_usec = 100000;
1523 res = select(s->sock + 1, &rfds, NULL, NULL, &tv);
1524 if (res < 0) {
1525 perror("select");
1526 usleep(10000);
1527 continue;
1528 }
1529
1530 if (!FD_ISSET(s->sock, &rfds))
1531 continue;
1532
1533 memset(rxpkt, 0, s->payload_size);
1534 rxpkt_len = recv(s->sock, rxpkt, s->payload_size, 0);
1535 sigma_dut_print(dut, DUT_MSG_INFO,
1536 "receive_uapsd: running res %d cookie %d dscp %d apts-pkt %d sta-id %d",
1537 res, rxpkt[0], rxpkt[1], rxpkt[10],
1538 rxpkt[9]);
1539
1540 if (rxpkt_len > 0) {
1541 s->rx_frames++;
1542 s->rx_payload_bytes += res;
1543
1544 /* if test is for WMM-AC set APTS RESET to 47 */
1545 msgid = sigma_wmm_ac ? WMMAC_APTS_RESET : APTS_RESET;
1546 if (msgid == rxpkt[10]) {
1547 sigma_dut_print(dut, DUT_MSG_ERROR,
1548 "receive_uapsd: RESET Pkt recv");
1549 s->reset_rx = 1;
1550 sigma_uapsd_reset(s);
1551 continue;
1552 }
1553
1554 recv_state_func = sta_uapsd_recv_tbl[s->uapsd_sta_tc]
1555 [s->uapsd_rx_state].state_func;
1556 sigma_dut_print(dut, DUT_MSG_INFO,
1557 "receive_uapsd: running s->uapsd_sta_tc %d uapsd_rx_state %d",
1558 s->uapsd_sta_tc, s->uapsd_rx_state);
1559 if (recv_state_func) {
1560 recv_state_func(s, rxpkt, rxpkt_len);
1561 } else {
1562 sigma_dut_print(dut, DUT_MSG_INFO,
1563 "receive_uapsd: Null Function Detected for TC : %d in uapsd_rx_state : %d",
1564 s->uapsd_sta_tc,
1565 s->uapsd_rx_state);
1566 }
1567 } else if (res < 0) {
1568 perror("recv");
1569 break;
1570 }
1571 }
1572
1573 if (rxpkt)
1574 free(rxpkt);
1575 sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Uapsd RX End");
1576 if (s->sock >= 0) {
1577 pthread_join(s->thr, NULL);
1578 close(s->sock);
1579 s->sock = -1;
1580 }
1581 pthread_cond_destroy(&s->tx_thr_cond);
1582 pthread_mutex_destroy(&s->tx_thr_mutex);
1583}
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05301584
1585
1586/* U-APSD apts console code implementation */
1587static int packet_expected(struct sigma_stream *s, unsigned int *rpkt,
1588 unsigned int type, u32 tos)
1589{
1590 u8 type_ok = 0;
1591 u8 tos_ok = 0;
1592 int res = 0;
1593 struct sigma_dut *dut = s->dut;
1594
1595 type_ok = (rpkt[10] == type) ? 1 : 0;
1596
1597 switch (tos) {
1598 case TOS_VO7:
1599 case TOS_VO:
1600 case TOS_VO6:
1601 case TOS_VO2:
1602 if (rpkt[1] == TOS_VO7 || rpkt[1] == TOS_VO ||
1603 rpkt[1] == TOS_VO6 || rpkt[1] == TOS_VO2)
1604 tos_ok = 1;
1605 break;
1606 case TOS_VI:
1607 case TOS_VI4:
1608 case TOS_VI5:
1609 if (rpkt[1] == TOS_VI || rpkt[1] == TOS_VI4 ||
1610 rpkt[1] == TOS_VI5)
1611 tos_ok = 1;
1612 break;
1613 case TOS_BE:
1614 case TOS_EE:
1615 if (rpkt[1] == TOS_BE || rpkt[1] == TOS_EE)
1616 tos_ok = 1;
1617 break;
1618 case TOS_BK:
1619 case TOS_LE:
1620 if (rpkt[1] == TOS_BK || rpkt[1] == TOS_LE)
1621 tos_ok = 1;
1622 break;
1623 default:
1624 sigma_dut_print(dut, DUT_MSG_ERROR,
1625 "packet_expected: recv not known tos=0x%x",
1626 tos);
1627 break;
1628 }
1629
1630 res = type_ok && tos_ok;
1631 if (!res) {
1632 sigma_dut_print(dut, DUT_MSG_ERROR,
1633 "packet_expected: No match: received pkt_type %u expected type %u, received dscp 0x%x expected dscp 0x%x",
1634 rpkt[10], type, rpkt[1], tos);
1635 }
1636
1637 return res;
1638}
1639
1640
1641static int console_send(struct sigma_stream *s, u32 pkt_type, u32 tos)
1642{
1643 u32 *tpkt;
1644 int res = 0;
1645 struct sigma_dut *dut = s->dut;
1646
1647 tpkt = malloc(s->payload_size);
1648 if (tpkt == NULL) {
1649 sigma_dut_print(dut, DUT_MSG_ERROR,
1650 "console_send: Send buffer allocation failed");
1651 return 0;
1652 }
1653 memset(tpkt, 0, s->payload_size);
Jouni Malinen947fdf62017-05-14 22:29:32 +03001654 create_apts_pkt(pkt_type, tpkt, s->payload_size, tos, s);
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05301655 if (pkt_type == APTS_DEFAULT || pkt_type == APTS_STOP)
1656 tpkt[0] = ++(s->rx_cookie);
1657 tpkt[1] = tos;
1658 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1659 res = send(s->sock, tpkt, s->payload_size / 2, 0);
1660 if (res >= 0) {
1661 s->tx_frames++;
1662 s->tx_payload_bytes += res;
1663 }
1664 s->uapsd_rx_state++;
1665 sigma_dut_print(dut, DUT_MSG_INFO,
1666 "console_send: Sent packet return %d Type %d Tos %d",
1667 res, tpkt[10], tpkt[1]);
1668 free(tpkt);
1669
1670 return 0;
1671}
1672
1673
1674static int console_rx_hello(struct sigma_stream *s, unsigned int *rpkt, int len)
1675{
1676 struct sigma_dut *dut = s->dut;
1677
1678 if (!packet_expected(s, rpkt, APTS_HELLO, TOS_BE)) {
1679 sigma_dut_print(dut, DUT_MSG_ERROR,
1680 "console_rx_hello: Hello not Recv or Bad TOS");
1681 return 0;
1682 }
1683
1684 s->rx_cookie = 0;
1685 sigma_dut_print(dut, DUT_MSG_INFO,
1686 "console_rx_hello: Recv Hello, Sent Test Case");
1687 console_send(s, s->uapsd_sta_tc, TOS_BE);
1688
1689 return 0;
1690}
1691
1692
1693static int console_rx_confirm(struct sigma_stream *s, unsigned int *rpkt,
1694 int len)
1695{
1696 struct sigma_dut *dut = s->dut;
1697
1698 if (!packet_expected(s, rpkt, APTS_CONFIRM, TOS_BE)) {
1699 sigma_dut_print(dut, DUT_MSG_ERROR,
1700 "console_rx_confirm: Confirm not Recv or Bad TOS");
1701 return 0;
1702 }
1703
1704 s->rx_cookie = 0;
1705 s->uapsd_rx_state++;
1706 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_confirm: Recv Confirm");
1707
1708 return 0;
1709}
1710
1711
1712static int console_rx_confirm_tx_vi(struct sigma_stream *s, unsigned int *rpkt,
1713 int len)
1714{
1715 struct sigma_dut *dut = s->dut;
1716
1717 if (!packet_expected(s, rpkt, APTS_CONFIRM, TOS_BE)) {
1718 sigma_dut_print(dut, DUT_MSG_ERROR,
1719 "console_rx_confirm_tx_vi: Confirm not Recv or Bad TOS");
1720 return 0;
1721 }
1722
1723 s->rx_cookie = 0;
1724 console_send(s, APTS_DEFAULT, TOS_VI);
1725 sigma_dut_print(dut, DUT_MSG_INFO,
1726 "console_rx_confirm_tx_vi: Recv Confirm, Sent VI");
1727
1728 return 0;
1729
1730}
1731
1732
1733static int console_rx_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
1734 int len)
1735{
1736 struct sigma_dut *dut = s->dut;
1737
1738 sigma_dut_print(dut, DUT_MSG_INFO,
1739 "console_rx_tx_stop: Send stop to STA again quit %d stop %d",
1740 s->can_quit, s->stop);
1741
1742 console_send(s, APTS_STOP, TOS_BE);
1743
1744 if (packet_expected(s, rpkt, APTS_STOP, TOS_BE)) {
1745 if (s->can_quit) {
1746 s->stop = 1;
1747 sigma_dut_print(dut, DUT_MSG_INFO,
1748 "console_rx_tx_stop: Send stop to STA again quit %d stop %d",
1749 s->can_quit, s->stop);
1750 } else {
1751 s->can_quit = 1;
1752 }
1753 } else {
1754 sigma_dut_print(dut, DUT_MSG_ERROR,
1755 "console_rx_tx_stop: STOP not Recv or Bad TOS");
1756 }
1757
1758 return 0;
1759}
1760
1761
1762static int console_rx_vo_tx_vo(struct sigma_stream *s, unsigned int *rpkt,
1763 int len)
1764{
1765 struct sigma_dut *dut = s->dut;
1766 unsigned int tos = TOS_VO7;
1767 int res;
1768
1769 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
1770 sigma_dut_print(dut, DUT_MSG_ERROR,
1771 "console_rx_vo_tx_vo: Expected Pkt not Recv or Bad TOS");
1772 return 0;
1773 }
1774
1775 rpkt[0] = ++(s->rx_cookie);
1776 rpkt[1] = TOS_VO;
1777 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1778 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1779 if (res >= 0) {
1780 s->tx_frames++;
1781 s->tx_payload_bytes += res;
1782 }
1783 s->uapsd_rx_state++;
1784 sigma_dut_print(dut, DUT_MSG_INFO,
1785 "console_rx_vo_tx_vo: Recv VO, Sent VO");
1786
1787 return 0;
1788}
1789
1790
1791static int console_rx_vo_tx_vo_tx_stop(struct sigma_stream *s,
1792 unsigned int *rpkt, int len)
1793{
1794 struct sigma_dut *dut = s->dut;
1795 unsigned int tos = TOS_VO7;
1796 int res;
1797
1798 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
1799 sigma_dut_print(dut, DUT_MSG_ERROR,
1800 "console_rx_vo_tx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
1801 return 0;
1802 }
1803
1804 rpkt[0] = ++(s->rx_cookie);
1805 rpkt[1] = TOS_VO;
1806 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1807 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1808 if (res >= 0) {
1809 s->tx_frames++;
1810 s->tx_payload_bytes += res;
1811 }
1812 sigma_dut_print(dut, DUT_MSG_INFO,
1813 "console_rx_vo_tx_vo_tx_stop: Recv VO, Sent VO");
1814 usleep(500000);
1815 console_send(s, APTS_STOP, TOS_BE);
1816
1817 return 0;
1818}
1819
1820
1821static int console_rx_vo_tx_all_tx_stop(struct sigma_stream *s,
1822 unsigned int *rpkt, int len)
1823{
1824 struct sigma_dut *dut = s->dut;
1825 u32 tos = TOS_VO7;
1826 int res;
1827
1828 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
1829 sigma_dut_print(dut, DUT_MSG_ERROR,
1830 "console_rx_vo_tx_all_tx_stop: Expected Pkt not Recv or Bad TOS");
1831 return 0;
1832 }
1833
1834 rpkt[0] = ++(s->rx_cookie);
1835 rpkt[1] = TOS_VO;
1836 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1837 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1838 if (res >= 0) {
1839 s->tx_frames++;
1840 s->tx_payload_bytes += res;
1841 }
1842 sigma_dut_print(dut, DUT_MSG_INFO,
1843 "console_rx_vo_tx_all_tx_stop: Recv VO, Sent VO");
1844 rpkt[0] = ++(s->rx_cookie);
1845 tos = TOS_VI;
1846 rpkt[1] = tos;
1847 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1848 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1849 if (res >= 0) {
1850 s->tx_frames++;
1851 s->tx_payload_bytes += res;
1852 }
1853 sigma_dut_print(dut, DUT_MSG_INFO,
1854 "console_rx_vo_tx_all_tx_stop: Sent VI");
1855 rpkt[0] = ++(s->rx_cookie);
1856 tos = TOS_BE;
1857 rpkt[1] = tos;
1858 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1859 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1860 if (res >= 0) {
1861 s->tx_frames++;
1862 s->tx_payload_bytes += res;
1863 }
1864 sigma_dut_print(dut, DUT_MSG_INFO,
1865 "console_rx_vo_tx_all_tx_stop: Sent BE");
1866 rpkt[0] = ++(s->rx_cookie);
1867 tos = TOS_BK;
1868 rpkt[1] = tos;
1869 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1870 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1871 if (res >= 0) {
1872 s->tx_frames++;
1873 s->tx_payload_bytes += res;
1874 }
1875 sigma_dut_print(dut, DUT_MSG_INFO,
1876 "console_rx_vo_tx_all_tx_stop: Sent BK");
1877 usleep(500000);
1878 console_send(s, APTS_STOP, TOS_BE);
1879
1880 return 0;
1881}
1882
1883
1884static int console_rx_be_tx_be(struct sigma_stream *s, unsigned int *rpkt,
1885 int len)
1886{
1887 struct sigma_dut *dut = s->dut;
1888 u32 tos = TOS_BE;
1889 int res;
1890
1891 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
1892 sigma_dut_print(dut, DUT_MSG_ERROR,
1893 "console_rx_be_tx_be: Expected Pkt not Recv or Bad TOS");
1894 return 0;
1895 }
1896
1897 rpkt[0] = ++(s->rx_cookie);
1898 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1899 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1900 if (res >= 0) {
1901 s->tx_frames++;
1902 s->tx_payload_bytes += res;
1903 }
1904 s->uapsd_rx_state++;
1905 sigma_dut_print(dut, DUT_MSG_INFO,
1906 "console_rx_be_tx_be: Recv BE, Sent BE");
1907
1908 return 0;
1909}
1910
1911
1912static int console_rx_be_tx_be_tx_stop(struct sigma_stream *s,
1913 unsigned int *rpkt, int len)
1914{
1915 struct sigma_dut *dut = s->dut;
1916 u32 tos = TOS_BE;
1917 int res;
1918
1919 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
1920 sigma_dut_print(dut, DUT_MSG_ERROR,
1921 "console_rx_be_tx_be_tx_stop: Expected Pkt not Recv or Bad TOS");
1922 return 0;
1923 }
1924
1925 rpkt[0] = ++(s->rx_cookie);
1926 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1927 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1928 if (res >= 0) {
1929 s->tx_frames++;
1930 s->tx_payload_bytes += res;
1931 }
1932 sigma_dut_print(dut, DUT_MSG_INFO,
1933 "console_rx_be_tx_be_tx_stop: Recv BE, Sent BE");
1934 console_send(s, APTS_STOP, TOS_BE);
1935
1936 return 0;
1937}
1938
1939
1940static int console_rx_vi_tx_be(struct sigma_stream *s, unsigned int *rpkt,
1941 int len)
1942{
1943 struct sigma_dut *dut = s->dut;
1944 u32 tos = TOS_BE;
1945 int res;
1946
1947 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
1948 sigma_dut_print(dut, DUT_MSG_ERROR,
1949 "console_rx_vi_tx_be: Expected Pkt not Recv or Bad TOS");
1950 return 0;
1951 }
1952
1953 rpkt[0] = ++(s->rx_cookie);
1954 rpkt[1] = tos;
1955 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1956 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1957 if (res >= 0) {
1958 s->tx_frames++;
1959 s->tx_payload_bytes += res;
1960 }
1961 s->uapsd_rx_state++;
1962 sigma_dut_print(dut, DUT_MSG_INFO,
1963 "console_rx_vi_tx_be: Recv VI, Sent BE");
1964
1965 return 0;
1966}
1967
1968
1969static int console_rx_vi_tx_bk(struct sigma_stream *s, unsigned int *rpkt,
1970 int len)
1971{
1972 struct sigma_dut *dut = s->dut;
1973 u32 tos = TOS_BK;
1974 int res;
1975
1976 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
1977 sigma_dut_print(dut, DUT_MSG_ERROR,
1978 "console_rx_vi_tx_bk: Expected Pkt not Recv or Bad TOS");
1979 return 0;
1980 }
1981
1982 rpkt[0] = ++(s->rx_cookie);
1983 rpkt[1] = tos;
1984 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1985 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1986 if (res >= 0) {
1987 s->tx_frames++;
1988 s->tx_payload_bytes += res;
1989 }
1990 s->uapsd_rx_state++;
1991 sigma_dut_print(dut, DUT_MSG_INFO,
1992 "console_rx_vi_tx_bk: Recv VI, Sent BK");
1993
1994 return 0;
1995}
1996
1997
1998static int console_rx_vo_tx_bcst_tx_stop(struct sigma_stream *s,
1999 unsigned int *rpkt, int len)
2000{
2001 struct sigma_dut *dut = s->dut;
2002 u32 tos = TOS_BE;
2003 int res;
2004 int broadcast = 1;
2005 struct sockaddr_in bcst_addr;
2006
2007 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
2008 sigma_dut_print(dut, DUT_MSG_ERROR,
2009 "console_rx_vo_tx_bcst_tx_stop: Expected Pkt not Recv or Bad TOS");
2010 return 0;
2011 }
2012
2013 memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
2014 bcst_addr.sin_family = AF_INET;
2015 bcst_addr.sin_port = htons(s->dst_port);
2016 bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
2017
2018 usleep(300000);
2019 rpkt[0] = ++(s->rx_cookie);
2020 rpkt[1] = tos;
2021 setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
2022 sizeof(broadcast));
2023 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2024 res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
2025 (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
2026 if (res >= 0) {
2027 s->tx_frames++;
2028 s->tx_payload_bytes += res;
2029 }
2030 sigma_dut_print(dut, DUT_MSG_INFO,
2031 "console_rx_vo_tx_bcst_tx_stop: Recv VO, Sent Broadcast res = %d",
2032 res);
2033 console_send(s, APTS_STOP, TOS_BE);
2034
2035 return 0;
2036}
2037
2038
2039static int console_rx_vi_tx_bcst(struct sigma_stream *s, unsigned int *rpkt,
2040 int len)
2041{
2042 struct sigma_dut *dut = s->dut;
2043 u32 tos = TOS_VI;
2044 int res;
2045 int broadcast = 1;
2046 struct sockaddr_in bcst_addr;
2047
2048 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2049 sigma_dut_print(dut, DUT_MSG_ERROR,
2050 "console_rx_vi_tx_bcst: Expected Pkt not Recv or Bad TOS");
2051 return 0;
2052 }
2053
2054 memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
2055 bcst_addr.sin_family = AF_INET;
2056 bcst_addr.sin_port = htons(s->dst_port);
2057 bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
2058
2059 rpkt[0] = ++(s->rx_cookie);
2060 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2061 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2062 if (res >= 0) {
2063 s->tx_frames++;
2064 s->tx_payload_bytes += res;
2065 }
2066 tos = TOS_BE;
2067 rpkt[0] = ++(s->rx_cookie);
2068 rpkt[1] = tos;
2069 setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
2070 sizeof(broadcast));
2071 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2072 res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
2073 (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
2074 if (res >= 0) {
2075 s->tx_frames++;
2076 s->tx_payload_bytes += res;
2077 }
2078 sigma_dut_print(dut, DUT_MSG_INFO,
2079 "console_rx_vi_tx_bcst: Recv/Sent VI, Sent Broadcast res = %d",
2080 res);
2081 s->uapsd_rx_state++;
2082
2083 return 0;
2084}
2085
2086
2087static int console_rx_be_tx_bcst(struct sigma_stream *s, unsigned int *rpkt,
2088 int len)
2089{
2090 struct sigma_dut *dut = s->dut;
2091 u32 tos = TOS_BE;
2092 int res;
2093 int broadcast = 1;
2094 struct sockaddr_in bcst_addr;
2095
2096 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
2097 sigma_dut_print(dut, DUT_MSG_ERROR,
2098 "console_rx_be_tx_bcst: Expected Pkt not Recv or Bad TOS");
2099 return 0;
2100 }
2101
2102 memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
2103 bcst_addr.sin_family = AF_INET;
2104 bcst_addr.sin_port = htons(s->dst_port);
2105 bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
2106
2107 rpkt[0] = ++(s->rx_cookie);
2108 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2109 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2110 if (res >= 0) {
2111 s->tx_frames++;
2112 s->tx_payload_bytes += res;
2113 }
2114 rpkt[0] = ++(s->rx_cookie);
2115 rpkt[1] = tos;
2116 setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
2117 sizeof(broadcast));
2118 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2119 res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
2120 (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
2121 if (res >= 0) {
2122 s->tx_frames++;
2123 s->tx_payload_bytes += res;
2124 }
2125 sigma_dut_print(dut, DUT_MSG_INFO,
2126 "console_rx_be_tx_bcst: Recv/Sent BE, Sent Broadcast res = %d",
2127 res);
2128 s->uapsd_rx_state++;
2129
2130 return 0;
2131}
2132
2133
2134static int console_rx_be_tx_bcst_tx_stop(struct sigma_stream *s,
2135 unsigned int *rpkt, int len)
2136{
2137 struct sigma_dut *dut = s->dut;
2138 u32 tos = TOS_BE;
2139 int res;
2140 int broadcast = 1;
2141 struct sockaddr_in bcst_addr;
2142
2143 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
2144 sigma_dut_print(dut, DUT_MSG_ERROR,
2145 "console_rx_be_tx_bcst_tx_stop: Expected Pkt not Recv or Bad TOS");
2146 return 0;
2147 }
2148
2149 memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
2150 bcst_addr.sin_family = AF_INET;
2151 bcst_addr.sin_port = htons(s->dst_port);
2152 bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
2153
2154 rpkt[0] = ++(s->rx_cookie);
2155 setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
2156 sizeof(broadcast));
2157 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2158 res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
2159 (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
2160 if (res >= 0) {
2161 s->tx_frames++;
2162 s->tx_payload_bytes += res;
2163 }
2164 sigma_dut_print(dut, DUT_MSG_INFO,
2165 "console_rx_be_tx_bcst_tx_stop: Recv BE, Sent Broadcast res = %d",
2166 res);
2167 console_send(s, APTS_STOP, TOS_BE);
2168
2169 return 0;
2170}
2171
2172
2173static int console_rx_vi_tx_vi(struct sigma_stream *s, unsigned int *rpkt,
2174 int len)
2175{
2176 struct sigma_dut *dut = s->dut;
2177 u32 tos = TOS_VI;
2178 int res;
2179
2180 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2181 sigma_dut_print(dut, DUT_MSG_ERROR,
2182 "console_rx_vi_tx_vi: Expected Pkt not Recv or Bad TOS");
2183 return 0;
2184 }
2185
2186 rpkt[0] = ++(s->rx_cookie);
2187 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2188 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2189 if (res >= 0) {
2190 s->tx_frames++;
2191 s->tx_payload_bytes += res;
2192 }
2193 s->uapsd_rx_state++;
2194 sigma_dut_print(dut, DUT_MSG_INFO,
2195 "console_rx_vi_tx_vi: Recv VI, Sent VI");
2196
2197 return 0;
2198}
2199
2200
2201static int console_rx_vi_tx_vi_tx_stop(struct sigma_stream *s,
2202 unsigned int *rpkt, int len)
2203{
2204 struct sigma_dut *dut = s->dut;
2205 u32 tos = TOS_VI;
2206 int res;
2207
2208 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2209 sigma_dut_print(dut, DUT_MSG_ERROR,
2210 "console_rx_vi_tx_vi_tx_stop: Expected Pkt not Recv or Bad TOS");
2211 return 0;
2212 }
2213
2214 rpkt[0] = ++(s->rx_cookie);
2215 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2216 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2217 if (res >= 0) {
2218 s->tx_frames++;
2219 s->tx_payload_bytes += res;
2220 }
2221 sigma_dut_print(dut, DUT_MSG_INFO,
2222 "console_rx_vi_tx_vi_tx_stop: Recv VI, Sent VI");
2223 console_send(s, APTS_STOP, TOS_BE);
2224
2225 return 0;
2226}
2227
2228
2229static int console_rx_vi_tx_vo_tx_stop(struct sigma_stream *s,
2230 unsigned int *rpkt, int len)
2231{
2232 struct sigma_dut *dut = s->dut;
2233 u32 tos = TOS_VO7;
2234 int res;
2235
2236 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2237 sigma_dut_print(dut, DUT_MSG_ERROR,
2238 "console_rx_vi_tx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
2239 return 0;
2240 }
2241
2242 rpkt[0] = ++(s->rx_cookie);
2243 rpkt[1] = TOS_VO;
2244 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2245 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2246 if (res >= 0) {
2247 s->tx_frames++;
2248 s->tx_payload_bytes += res;
2249 }
2250 sigma_dut_print(dut, DUT_MSG_INFO,
2251 "console_rx_vi_tx_vo_tx_stop: Recv VI, Sent VO");
2252 console_send(s, APTS_STOP, TOS_BE);
2253
2254 return 0;
2255}
2256
2257
2258static int console_rx_vo_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
2259 int len)
2260{
2261 struct sigma_dut *dut = s->dut;
2262
2263 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
2264 sigma_dut_print(dut, DUT_MSG_ERROR,
2265 "console_rx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
2266 return 0;
2267 }
2268
2269 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vo_tx_stop: Recv VO");
2270 sleep(1);
2271 console_send(s, APTS_STOP, TOS_BE);
2272
2273 return 0;
2274}
2275
2276
2277static int console_rx_vi_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
2278 int len)
2279{
2280 struct sigma_dut *dut = s->dut;
2281
2282 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2283 sigma_dut_print(dut, DUT_MSG_ERROR,
2284 "console_rx_vi_tx_stop: Expected Pkt not Recv or Bad TOS");
2285 return 0;
2286 }
2287
2288 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vi_tx_stop: Recv VI");
2289 console_send(s, APTS_STOP, TOS_BE);
2290
2291 return 0;
2292}
2293
2294
2295static int console_rx_bk_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
2296 int len)
2297{
2298 struct sigma_dut *dut = s->dut;
2299
2300 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BK)) {
2301 sigma_dut_print(dut, DUT_MSG_ERROR,
2302 "console_rx_bk_tx_stop: Expected Pkt not Recv or Bad TOS");
2303 return 0;
2304 }
2305
2306 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_bk_tx_stop: Recv BK");
2307 console_send(s, APTS_STOP, TOS_BE);
2308
2309 return 0;
2310}
2311
2312
2313static int console_rx_vo_tx_2vo(struct sigma_stream *s, unsigned int *rpkt,
2314 int len)
2315{
2316 struct sigma_dut *dut = s->dut;
2317 u32 tos = TOS_VO7;
2318 int res;
2319
2320 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
2321 sigma_dut_print(dut, DUT_MSG_ERROR,
2322 "console_rx_vo_tx_2vo: Expected Pkt not Recv or Bad TOS");
2323 return 0;
2324 }
2325
2326 rpkt[0] = ++(s->rx_cookie);
2327 rpkt[1] = TOS_VO;
2328 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2329 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2330 if (res >= 0) {
2331 s->tx_frames++;
2332 s->tx_payload_bytes += res;
2333 }
2334 rpkt[0] = ++(s->rx_cookie);
2335 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2336 if (res >= 0) {
2337 s->tx_frames++;
2338 s->tx_payload_bytes += res;
2339 }
2340 s->uapsd_rx_state++;
2341 sigma_dut_print(dut, DUT_MSG_INFO,
2342 "console_rx_vo_tx_2vo: Recv VO, Sent 2 VO");
2343
2344 return 0;
2345}
2346
2347
2348static int console_rx_be(struct sigma_stream *s, unsigned int *rpkt, int len)
2349{
2350 struct sigma_dut *dut = s->dut;
2351
2352 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
2353 sigma_dut_print(dut, DUT_MSG_ERROR,
2354 "console_rx_be: Expected Pkt not Recv or Bad TOS");
2355 return 0;
2356 }
2357
2358 s->uapsd_rx_state++;
2359 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_be: Recv BE");
2360
2361 return 0;
2362}
2363
2364
2365static int console_rx_vi(struct sigma_stream *s, unsigned int *rpkt, int len)
2366{
2367 struct sigma_dut *dut = s->dut;
2368
2369 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2370 sigma_dut_print(dut, DUT_MSG_ERROR,
2371 "console_rx_vi: Expected Pkt not Recv or Bad TOS");
2372 return 0;
2373 }
2374
2375 s->uapsd_rx_state++;
2376 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vi: Recv VI");
2377
2378 return 0;
2379}
2380
2381
2382static int console_rx_vo(struct sigma_stream *s, unsigned int *rpkt, int len)
2383{
2384 struct sigma_dut *dut = s->dut;
2385
2386 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
2387 sigma_dut_print(dut, DUT_MSG_ERROR,
2388 "console_rx_vo : Expected Pkt not Recv or Bad TOS");
2389 return 0;
2390 }
2391
2392 s->uapsd_rx_state++;
2393 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vo: Recv VO");
2394
2395 return 0;
2396
2397}
2398
2399
2400static int console_rx_vo_tx_vo_cyclic(struct sigma_stream *s,
2401 unsigned int *rpkt, int len)
2402{
2403 int res = 0;
2404 unsigned int tos = 0;
2405 unsigned int *tpkt;
2406 struct sigma_dut *dut = s->dut;
2407
2408 tpkt = malloc(s->payload_size);
2409 if (tpkt == NULL)
2410 return -1;
2411
2412 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
2413 if (rpkt[10] != APTS_STOP)
2414 sigma_uapsd_reset(s);
2415
2416 if (!packet_expected(s, rpkt, APTS_STOP, TOS_BE)) {
2417 sigma_dut_print(dut, DUT_MSG_ERROR,
2418 "console_rx_vo_tx_vo_cyclic: Expected STOP Pkt not Recv or Bad TOS");
2419 free(tpkt);
2420 return 0;
2421 }
2422
Pradeep Reddy POTTETI1977e0d2016-03-10 17:10:55 +05302423 memset(tpkt, 0, s->payload_size);
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05302424 tpkt[0] = s->rx_cookie;
2425 tos = TOS_BE;
2426 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
Jouni Malinen947fdf62017-05-14 22:29:32 +03002427 create_apts_pkt(APTS_STOP, tpkt, s->payload_size, tos, s);
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05302428 tpkt[1] = tos;
2429 if (s->can_quit) {
Pradeep Reddy POTTETI1977e0d2016-03-10 17:10:55 +05302430 const char *stop_cmd = "APTSL1 STOP";
2431 size_t stop_cmd_len = strlen(stop_cmd);
2432
2433 if (s->payload_size > 11 * sizeof(int) + stop_cmd_len)
2434 memcpy(&tpkt[11], stop_cmd, stop_cmd_len + 1);
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05302435 res = send(s->sock, tpkt, s->payload_size / 2, 0);
2436 if (res >= 0) {
2437 s->tx_frames++;
2438 s->tx_payload_bytes += res;
2439 }
2440 sigma_dut_print(dut, DUT_MSG_INFO,
2441 "console_rx_vo_tx_vo_cyclic: Sent STOP");
2442 sleep(5);
2443 s->stop = 1;
2444 } else {
2445 res = send(s->sock, tpkt, s->payload_size / 2, 0);
2446 if (res >= 0) {
2447 s->tx_frames++;
2448 s->tx_payload_bytes += res;
2449 }
2450 s->can_quit = 1;
2451 }
2452 } else {
2453 sigma_dut_print(dut, DUT_MSG_INFO,
2454 "console_rx_vo_tx_vo_cyclic: Recv Pkt: %d Cookie: %d Sta-id %d",
2455 rpkt[0], s->rx_cookie, s->sta_id);
2456 rpkt[0] = ++(s->rx_cookie);
2457 tos = TOS_VO7;
2458 rpkt[1] = TOS_VO;
2459 res = setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos,
2460 sizeof(tos));
2461 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2462 if (res >= 0) {
2463 s->tx_frames++;
2464 s->tx_payload_bytes += res;
2465 }
2466
2467 if (s->rx_cookie >= 3000) {
2468 /* No state change for L.1 */
2469 }
2470 }
2471
2472 free(tpkt);
2473
2474 return 0;
2475}
2476
2477
2478static struct apts_pkt * apts_lookup(const char *s)
2479{
2480 struct apts_pkt *t;
2481
2482 for (t = &apts_pkts[1]; s && t->cmd; t++) {
Pradeep Reddy POTTETIe104a5b2016-03-09 18:40:04 +05302483 if (strcmp(s, "L.1AP") == 0)
2484 s = "L.1";
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05302485 if (t->name && strcmp(t->name, s) == 0)
2486 return t;
2487 }
2488
2489 return NULL;
2490}
2491
2492
2493void send_uapsd_console(struct sigma_stream *s)
2494{
2495 struct timeval tv;
2496 fd_set rfds;
2497 int res;
2498 unsigned int *rpkt;
2499 uapsd_console_state_func_ptr console_state_func;
2500 struct apts_pkt *testcase;
2501 struct sigma_dut *dut = s->dut;
2502 /* start timer for self exit */
2503 int uapsd_timer = UAPSD_CONSOLE_TIMER;
2504
2505 s->can_quit = 0;
2506 s->reset = 0;
2507 s->reset_rx = 0;
2508 s->uapsd_sta_tc = 0;
2509
2510 testcase = apts_lookup(s->test_name);
2511 if (testcase == NULL) {
2512 sigma_dut_print(dut, DUT_MSG_ERROR,
2513 "send_uapsd_console: no testcase found");
2514 return;
2515 }
2516
2517 /* send test case number to be executed */
2518 s->uapsd_sta_tc = testcase->cmd;
2519 if (s->uapsd_sta_tc < B_D || s->uapsd_sta_tc > LAST_TC) {
2520 sigma_dut_print(dut, DUT_MSG_ERROR,
2521 "send_uapsd_console: Test Case: %s Unknown",
2522 s->test_name);
2523 return;
2524 }
2525
2526 s->payload_size = 512;
2527 rpkt = malloc(s->payload_size);
2528 if (rpkt == NULL) {
2529 sigma_dut_print(dut, DUT_MSG_ERROR,
2530 "send_uapsd_console: buffer allocation failed");
2531 return;
2532 }
2533
2534 sigma_dut_print(dut, DUT_MSG_INFO,
2535 "send_uapsd_console: Uapsd Console Start");
2536
2537 while (!s->stop) {
2538 uapsd_timer--;
2539 FD_ZERO(&rfds);
2540 FD_SET(s->sock, &rfds);
2541 tv.tv_sec = 0;
2542 tv.tv_usec = 300000;
2543 res = select(s->sock + 1, &rfds, NULL, NULL, &tv);
2544 if (res < 0) {
2545 perror("select");
2546 usleep(10000);
2547 } else if (FD_ISSET(s->sock, &rfds)) {
2548 memset(rpkt, 0, s->payload_size);
2549 res = recv(s->sock, rpkt, s->payload_size, 0);
2550 if (res < 0) {
2551 perror("recv");
2552 break;
2553 }
2554
2555 sigma_dut_print(dut, DUT_MSG_INFO,
2556 "send_uapsd_console: running res %d cookie %d dscp %d apts-pkt %d sta-id %d",
2557 res, rpkt[0], rpkt[1], rpkt[10],
2558 rpkt[9]);
2559 if (res == 0)
2560 continue;
2561
2562 s->rx_frames++;
2563 s->rx_payload_bytes += res;
2564 /*
2565 * Reset the timer as packet is received
2566 * within steps.
2567 */
2568 uapsd_timer = UAPSD_CONSOLE_TIMER;
2569
2570 if (rpkt[10] == APTS_HELLO) {
2571 if (s->reset)
2572 s->reset = 0;
2573 s->rx_cookie = 0;
Pradeep Reddy POTTETI83d62cb2016-02-04 13:07:49 +05302574 /* assign a unique id to this sta */
2575 s->sta_id = s->stream_id;
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05302576 /* uapsd console process table state */
2577 s->uapsd_rx_state = 0;
2578 s->can_quit = 1;
2579 } else {
2580 if (s->reset)
2581 continue;
2582 }
2583
2584 if (rpkt[10] == APTS_RESET) {
2585 sigma_dut_print(dut, DUT_MSG_ERROR,
2586 "send_uapsd_console: RESET Pkt recv");
2587 s->reset_rx = 1;
2588 sigma_uapsd_reset(s);
2589 }
2590
2591 if (rpkt[10] == APTS_RESET_STOP) {
2592 sigma_dut_print(dut, DUT_MSG_ERROR,
2593 "send_uapsd_console: RESET STOP Pkt recv");
2594 s->stop = 1;
2595 }
2596
2597 if (rpkt[10] == APTS_BCST) {
2598 sigma_dut_print(dut, DUT_MSG_INFO,
2599 "send_uapsd_console: Broadcast Pkt recv");
2600 continue;
2601 }
2602
2603 console_state_func =
2604 uapsd_console_state_tbl[s->uapsd_sta_tc]
2605 [s->uapsd_rx_state].state_func;
2606 if (console_state_func) {
2607 console_state_func(s, rpkt, res);
2608 } else {
2609 sigma_dut_print(dut, DUT_MSG_INFO,
2610 "send_uapsd_console: Null function detected for TC: %d in uapsd_rx_state: %d",
2611 s->uapsd_sta_tc,
2612 s->uapsd_rx_state);
2613 }
2614 }
2615
2616 /* Stop the thread. No transactions for the set time */
2617 if (uapsd_timer == 0) {
2618 sigma_dut_print(dut, DUT_MSG_INFO,
2619 "send_uapsd_console: Timer Expired");
2620 s->stop = 1;
2621 }
2622 }
2623
2624 free(rpkt);
2625 sigma_dut_print(dut, DUT_MSG_INFO,
2626 "send_uapsd_console: Uapsd Console End");
2627}