blob: b01a65588a76c0939eb8a9c6933c6e755dff1ae6 [file] [log] [blame]
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001/*
2 * Sigma Control API DUT (station/AP)
3 * Copyright (c) 2014, Qualcomm Atheros, Inc.
4 * 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,
32 int tx_hello_cnt);
33
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
910static void create_apts_pkt(int msg, unsigned int txbuf[],
911 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;
928 strcpy((char *) &txbuf[11], t->name);
929}
930
931
932static int uapsd_tx_start(struct sigma_stream *s,
933 u32 usr_priority, enum uapsd_psave ps,
934 u32 sleep_duration)
935{
936 unsigned int *tpkt;
937 int pktlen = 256;
938 struct sigma_dut *dut = s->dut;
939 u32 msgid;
940
941 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_start");
942 tpkt = malloc(s->payload_size);
943 if (tpkt == NULL) {
944 sigma_dut_print(dut, DUT_MSG_ERROR,
945 "send_uapsd: Send buffer allocation failed");
946 return -1;
947 }
948
949 /* check whether a test case is received */
950 if (s->uapsd_rx_state > 0) {
951 s->uapsd_tx_state++;
952 } else {
953 set_ps(s->ifname, dut, 0);
954 if (s->tx_hello_cnt <= MAX_HELLO) {
955 memset(tpkt, 0, s->payload_size);
956 /* if test is for WMM-AC set APTS HELLO to 39 */
957 msgid = sigma_wmm_ac ? WMMAC_APTS_HELLO : APTS_HELLO;
958 create_apts_hello_pkt(msgid, tpkt, s->tx_hello_cnt);
959 if (send(s->sock, tpkt, pktlen, 0) <= 0) {
960 sigma_dut_print(dut, DUT_MSG_ERROR,
961 "send_uapsd: Send failed");
962 }
963 s->tx_hello_cnt++;
964 sigma_dut_print(dut, DUT_MSG_INFO,
965 "send_uapsd: Hello Sent cnt %d",
966 s->tx_hello_cnt);
967 sleep(1);
968 } else {
969 printf("\n send_uapsd: Too many Hellos Sent... \n");
970 sigma_dut_print(dut, DUT_MSG_ERROR,
971 "send_uapsd: Too many Hellos sent... ");
972 s->stop = 1;
973 }
974 }
975
976 free(tpkt);
977 sigma_dut_print(dut, DUT_MSG_INFO,
978 "Exit uapsd_tx_start uapsd_sta_tc %d uapsd_tx_state %d",
979 s->uapsd_sta_tc, s->uapsd_tx_state);
980
981 return 0;
982}
983
984
985static int uapsd_tx_confirm(struct sigma_stream *s,
986 u32 usr_priority, enum uapsd_psave ps,
987 u32 sleep_duration)
988{
989 unsigned int *tpkt;
990 int pktlen = 256;
991 struct sigma_dut *dut = s->dut;
992 u32 msgid;
993
994 sigma_dut_print(dut, DUT_MSG_INFO,
995 "send_uapsd: Enter uapsd_tx_confirm");
996 tpkt = malloc(s->payload_size);
997 if (tpkt == NULL) {
998 sigma_dut_print(dut, DUT_MSG_ERROR,
999 "send_uapsd: Send buffer allocation failed");
1000 return -1;
1001 }
1002
1003 usleep(sleep_duration);
1004 set_ps(s->ifname, dut, ps);
1005 memset(tpkt, 0, s->payload_size);
1006 /* if test is for WMM-AC set APTS CONFIRM to 41 */
1007 msgid = sigma_wmm_ac ? WMMAC_APTS_CONFIRM : APTS_CONFIRM;
1008 create_apts_pkt(msgid, tpkt, usr_priority, s);
1009 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1010 sizeof(usr_priority));
1011 if (send(s->sock, tpkt, pktlen, 0) > 0) {
1012 s->uapsd_tx_state++;
1013 } else {
1014 sigma_dut_print(dut, DUT_MSG_ERROR,
1015 "send_uapsd: Send failed");
1016 }
1017 free(tpkt);
1018 sigma_dut_print(dut, DUT_MSG_INFO,
1019 "Exit uapsd_tx_confirm uapsd_sta_tc %d uapsd_tx_state %d",
1020 s->uapsd_sta_tc, s->uapsd_tx_state);
1021
1022 return 0;
1023}
1024
1025
1026static int uapsd_tx_data(struct sigma_stream *s,
1027 u32 usr_priority, enum uapsd_psave ps,
1028 u32 sleep_duration)
1029{
1030 unsigned int *tpkt;
1031 int pktlen = 256;
1032 struct sigma_dut *dut = s->dut;
1033 u32 msgid;
1034
1035 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_data");
1036
1037 tpkt = malloc(s->payload_size);
1038 if (tpkt == NULL) {
1039 sigma_dut_print(dut, DUT_MSG_ERROR,
1040 "send_uapsd: Send buffer allocation failed");
1041 return -1;
1042 }
1043 usleep(sleep_duration);
1044 set_ps(s->ifname, dut, ps);
1045 memset(tpkt, 0, s->payload_size);
1046 /* if test is for WMM-AC set APTS DEFAULT to 38 */
1047 msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1048 create_apts_pkt(msgid, tpkt, usr_priority, s);
1049 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1050 sizeof(usr_priority));
1051 if (send(s->sock, tpkt, pktlen, 0) > 0) {
1052 s->uapsd_tx_state++;
1053 } else {
1054 sigma_dut_print(dut, DUT_MSG_ERROR,
1055 "send_uapsd: Send failed");
1056 }
1057
1058 free(tpkt);
1059 sigma_dut_print(dut, DUT_MSG_INFO,
1060 "Exit uapsd_tx_data uapsd_sta_tc %d uapsd_tx_state %d",
1061 s->uapsd_sta_tc, s->uapsd_tx_state);
1062
1063 return 0;
1064}
1065
1066
1067static int uapsd_tx_data_twice(struct sigma_stream *s,
1068 u32 usr_priority, enum uapsd_psave ps,
1069 u32 sleep_duration)
1070{
1071 unsigned int *tpkt;
1072 int pktlen = 256, i = 0, tx_status = 0;
1073 struct sigma_dut *dut = s->dut;
1074 u32 msgid;
1075
1076 sigma_dut_print(dut, DUT_MSG_INFO,
1077 "send_uapsd: Enter uapsd_tx_data_twice");
1078 tpkt = malloc(s->payload_size);
1079 if (tpkt == NULL) {
1080 sigma_dut_print(dut, DUT_MSG_ERROR,
1081 "send_uapsd: Send buffer allocation failed");
1082 return -1;
1083 }
1084 usleep(sleep_duration);
1085 set_ps(s->ifname, dut, ps);
1086 memset(tpkt, 0, s->payload_size);
1087 /* if test is for WMM-AC set APTS DEFAULT to 38 */
1088 msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1089 create_apts_pkt(msgid, tpkt, usr_priority, s);
1090 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1091 sizeof(usr_priority));
1092 for(i = 0; i < 2; i++) {
1093 if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1094 sigma_dut_print(dut, DUT_MSG_ERROR,
1095 "send_uapsd: Send failed");
1096 tx_status = -1;
1097 }
1098 }
1099 if (tx_status == 0)
1100 s->uapsd_tx_state++;
1101 free(tpkt);
1102 sigma_dut_print(dut, DUT_MSG_INFO,
1103 "Exit uapsd_tx_data_twice uapsd_sta_tc %d uapsd_tx_state %d",
1104 s->uapsd_sta_tc, s->uapsd_tx_state);
1105
1106 return 0;
1107}
1108
1109
1110static int uapsd_tx_cyclic(struct sigma_stream *s,
1111 u32 usr_priority, enum uapsd_psave ps,
1112 u32 sleep_duration)
1113{
1114 unsigned int *tpkt;
1115 int pktlen = 256, i = 0, tx_status = 0;
1116 struct sigma_dut *dut = s->dut;
1117 u32 msgid;
1118
1119 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_cyclic");
1120 tpkt = malloc(s->payload_size);
1121 if (tpkt == NULL) {
1122 sigma_dut_print(dut, DUT_MSG_ERROR,
1123 "send_uapsd: Send buffer allocation failed");
1124 return -1;
1125 }
1126
1127 set_ps(s->ifname, dut, ps);
1128 for (i = 0; i < 3000; i++) {
1129 usleep(sleep_duration);
1130 memset(tpkt, 0, s->payload_size);
1131 /* if test is for WMM-AC set APTS DEFAULT to 38 */
1132 msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1133 create_apts_pkt(msgid, tpkt, usr_priority, s);
1134 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1135 sizeof(usr_priority));
1136 if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1137 sigma_dut_print(dut, DUT_MSG_ERROR,
1138 "send_uapsd: Send failed");
1139 tx_status = -1;
1140 }
1141 }
1142 if (tx_status == 0)
1143 s->uapsd_tx_state++;
1144 free(tpkt);
1145 sigma_dut_print(dut, DUT_MSG_INFO,
1146 "Exit uapsd_tx_cyclic uapsd_sta_tc %d uapsd_tx_state %d",
1147 s->uapsd_sta_tc, s->uapsd_tx_state);
1148
1149 return 0;
1150}
1151
1152
1153static int uapsd_tx_stop(struct sigma_stream *s,
1154 u32 usr_priority, enum uapsd_psave ps,
1155 u32 sleep_duration)
1156{
1157 unsigned int *tpkt;
1158 int pktlen = 256;
1159 struct sigma_dut *dut = s->dut;
1160 u32 msgid;
1161
1162 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_stop");
1163 tpkt = malloc(s->payload_size);
1164 if (tpkt == NULL) {
1165 sigma_dut_print(dut, DUT_MSG_ERROR,
1166 "send_uapsd: Send buffer allocation failed");
1167 return -1;
1168 }
1169 usleep(sleep_duration);
1170 if(!s->tx_stop_cnt)
1171 set_ps(s->ifname, dut, ps);
1172 s->tx_stop_cnt++;
1173 memset(tpkt, 0, s->payload_size);
1174 /* if test is for WMM-AC set APTS STOP to 42 */
1175 msgid = sigma_wmm_ac ? WMMAC_APTS_STOP : APTS_STOP;
1176 create_apts_pkt(msgid, tpkt, usr_priority, s);
1177 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1178 sizeof(usr_priority));
1179 if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1180 sigma_dut_print(dut, DUT_MSG_ERROR,
1181 "send_uapsd: Send failed");
1182 }
1183 pthread_mutex_lock(&s->tx_thr_mutex);
1184 pthread_cond_signal(&s->tx_thr_cond);
1185 pthread_mutex_unlock(&s->tx_thr_mutex);
1186 if (s->tx_stop_cnt > MAX_STOP) {
1187 sigma_dut_print(dut, DUT_MSG_ERROR,
1188 "send_uapsd: Enter TX_STOP Max Stop sent %d",
1189 s->tx_stop_cnt);
1190 s->stop = 1;
1191 }
1192 free(tpkt);
1193 sigma_dut_print(dut, DUT_MSG_INFO,
1194 "Exit uapsd_tx_stop uapsd_sta_tc %d uapsd_tx_state %d",
1195 s->uapsd_sta_tc, s->uapsd_tx_state);
1196
1197 return 0;
1198}
1199
1200
1201static int uapsd_rx_start(struct sigma_stream *s,
1202 unsigned int *rxpkt, int rxpkt_len)
1203{
1204 int test_num = 0;
1205 struct sigma_dut *dut = s->dut;
1206 int msgid;
1207
1208 test_num = rxpkt[10];
1209
1210 sigma_dut_print(dut, DUT_MSG_INFO,
1211 "receive_uapsd: Enter uapsd_rx_start");
1212 /* if test is for WMM-AC set LAST_TC to 37 */
1213 msgid = sigma_wmm_ac ? LAST_TC : M_W;
1214
1215 if (!((test_num >= B_D) && (test_num <= msgid)))
1216 return -1;
1217
1218 /*
1219 * Test numbers start from 1. Hence decrement by 1
1220 * to match the array index.
1221 */
1222 s->uapsd_sta_tc = (rxpkt[10] - 1);
1223 s->sta_id = rxpkt[9];
1224 (s->uapsd_rx_state)++;
1225
1226 return 0;
1227}
1228
1229
1230static int uapsd_rx_data(struct sigma_stream *s,
1231 unsigned int *rxpkt, int rxpkt_len)
1232{
1233 struct sigma_dut *dut = s->dut;
1234 u32 msgid;
1235
1236 sigma_dut_print(dut, DUT_MSG_INFO,
1237 "receive_uapsd: Enter uapsd_rx_data");
1238 /* if test is for WMM-AC set APTS DEFAULT to 38 */
1239 msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1240
1241 if ((rxpkt[10] == msgid) &&
1242 ((rxpkt[1] == TOS_BE) ||
1243 (rxpkt[1] == TOS_BK) ||
1244 (rxpkt[1] == TOS_VI) ||
1245 (rxpkt[1] == TOS_VO) ||
1246 (rxpkt[1] == TOS_VO7) ||
1247 (rxpkt[1] == TOS_VO6))) {
1248 s->rx_cookie = rxpkt[0];
1249 (s->uapsd_rx_state)++;
1250 sigma_dut_print(dut, DUT_MSG_INFO,
1251 "receive_uapsd: Recv in uapsd_rx_data uapsd_rx_state %d",
1252 s->uapsd_rx_state);
1253 } else {
1254 sigma_dut_print(dut, DUT_MSG_ERROR,
1255 "receive_uapsd: BAD Pkt recv in uapsd_rx_data");
1256 sigma_uapsd_reset(s);
1257 }
1258
1259 sigma_dut_print(dut, DUT_MSG_INFO,
1260 "receive_uapsd: Exit uapsd_rx_data");
1261
1262 return 0;
1263}
1264
1265
1266static int uapsd_rx_stop(struct sigma_stream *s,
1267 unsigned int *rxpkt, int rxpkt_len)
1268{
1269 struct sigma_dut *dut = s->dut;
1270 u32 msgid;
1271
1272 sigma_dut_print(dut, DUT_MSG_INFO,
1273 "receive_uapsd: Enter uapsd_rx_stop");
1274 /* if test is for WMM-AC set APTS STOP to 42 */
1275 msgid = sigma_wmm_ac ? WMMAC_APTS_STOP : APTS_STOP;
1276
1277 if (rxpkt[10] != msgid) {
1278 sigma_dut_print(dut, DUT_MSG_ERROR,
1279 "receive_uapsd: BAD Pkt recv in uapsd_rx_stop");
1280 } else {
1281 sigma_uapsd_stop(s);
1282 }
1283 sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Exit uapsd_rx_stop");
1284
1285 return 0;
1286}
1287
1288
1289static int uapsd_rx_cyclic_vo(struct sigma_stream *s,
1290 unsigned int *rxpkt, int rxpkt_len)
1291{
1292 struct sigma_dut *dut = s->dut;
1293 u32 msgid, msgid2;
1294
1295 sigma_dut_print(dut, DUT_MSG_INFO,
1296 "receive_uapsd: Enter uapsd_rx_cyclic_vo");
1297 /* if test is for WMM-AC set
1298 * APTS STOP to 42 and
1299 * APTS DEFAULT to 38 */
1300 if (!sigma_wmm_ac) {
1301 msgid = APTS_STOP;
1302 msgid2 = APTS_DEFAULT;
1303 } else {
1304 msgid = WMMAC_APTS_STOP;
1305 msgid2 = WMMAC_APTS_DEFAULT;
1306 }
1307
1308 if (rxpkt[10] != msgid) {
1309 if ((rxpkt[10] == msgid2) &&
1310 ((rxpkt[1] == TOS_VO) ||
1311 (rxpkt[1] == TOS_VO7) ||
1312 (rxpkt[1] == TOS_VO6))) {
1313 /* ; 5.7 */
1314 s->rx_cookie = rxpkt[0];
1315 } else {
1316 sigma_dut_print(dut, DUT_MSG_ERROR,
1317 "receive_uapsd: BAD Pkt recv in uapsd_rx_cyclic_vo");
1318 }
1319 } else {
1320 sigma_uapsd_stop(s);
1321 }
1322 sigma_dut_print(dut, DUT_MSG_INFO,
1323 "receive_uapsd: Exit uapsd_rx_cyclic_vo");
1324
1325 return 0;
1326}
1327
1328
1329static void create_apts_hello_pkt(int msg, unsigned int *txbuf,
1330 int tx_hello_cnt)
1331{
1332 struct apts_pkt *t;
1333
1334 if (!sigma_wmm_ac)
1335 t = &apts_pkts[msg];
1336 else
1337 t = &wmm_ac_apts_pkts[msg];
1338
1339 txbuf[0] = tx_hello_cnt;
1340 txbuf[1] = 0;
1341 txbuf[2] = 0;
1342 txbuf[3] = 0;
1343 txbuf[4] = 0;
1344 txbuf[5] = 0;
1345 txbuf[6] = t->param0;
1346 txbuf[7] = t->param1;
1347 txbuf[8] = t->param2;
1348 txbuf[9] = t->param3;
1349 txbuf[10] = t->cmd;
1350 strcpy((char *) &txbuf[11], t->name);
1351 printf("create_apts_hello_pkt (%s) %d\n", t->name, t->cmd);
1352}
1353
1354
1355static void sigma_uapsd_init(struct sigma_stream *s)
1356{
1357 s->uapsd_sta_tc = 0; /* Test Case to execute or row to select */
1358 /* in a test case row, next column or next state function to execute */
1359 s->uapsd_rx_state = 0;
1360 s->uapsd_tx_state = 0;
1361
1362 s->sta_id = 0;
1363 s->uapsd_send_thr = 0;
1364
1365 s->reset_rx = 0;
1366 s->num_retry = 0;
1367 s->tx_stop_cnt = 0;
1368 s->tx_hello_cnt = 0;
1369}
1370
1371
1372static void sigma_uapsd_stop(struct sigma_stream *s)
1373{
1374 pthread_mutex_lock(&s->tx_thr_mutex);
1375 pthread_cond_wait(&s->tx_thr_cond, &s->tx_thr_mutex);
1376 pthread_mutex_unlock(&s->tx_thr_mutex);
1377 s->stop = 1;
1378 sleep(1);
1379}
1380
1381
1382static void sigma_uapsd_reset(struct sigma_stream *s)
1383{
1384 int tos = TOS_BE;
1385 unsigned int *reset_pkt;
1386 struct sigma_dut *dut = s->dut;
1387 u32 msgid;
1388
1389 s->num_retry++;
1390
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05301391 /* if reset is called from U-APSD console set it */
1392 s->reset = 1;
1393
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001394 reset_pkt = malloc(s->payload_size);
1395 if (reset_pkt == NULL)
1396 return;
1397
1398 if (s->num_retry > MAX_RETRY) {
1399 /* if test is for WMM-AC set APTS RESET STOP to 49 */
1400 msgid = sigma_wmm_ac ? WMMAC_APTS_RESET_STOP : APTS_RESET_STOP;
1401 create_apts_pkt(msgid, reset_pkt, tos, s);
1402 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1403 send(s->sock, reset_pkt, s->payload_size, 0);
1404 sigma_dut_print(dut, DUT_MSG_ERROR,
1405 "sigma_uapsd_reset: Too many Reset retries");
1406 s->stop = 1;
1407 }
1408
1409 if (!(s->reset_rx)) {
1410 /* if test is for WMM-AC set APTS RESET to 47 */
1411 msgid = sigma_wmm_ac ? WMMAC_APTS_RESET : APTS_RESET;
1412 create_apts_pkt(msgid, reset_pkt, tos, s);
1413 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1414 send(s->sock, reset_pkt, s->payload_size, 0);
1415 } else {
1416 /* if test is for WMM-AC set APTS RESET RESP to 48 */
1417 msgid = sigma_wmm_ac ? WMMAC_APTS_RESET_RESP : APTS_RESET_RESP;
1418 create_apts_pkt(msgid, reset_pkt, tos, s);
1419 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1420 send(s->sock, reset_pkt, s->payload_size, 0);
1421 s->reset_rx = 0;
1422 }
1423 free(reset_pkt);
1424}
1425
1426
1427static void * send_uapsd(void *data)
1428{
1429 struct sigma_stream *s = data;
1430 struct sigma_dut *dut = s->dut;
1431 uapsd_tx_state_func_ptr tx_state_func;
1432 u32 usr_priority, sleep_duration;
1433 enum uapsd_psave ps;
1434
1435 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Uapsd TX Start");
1436
1437 s->payload_size = 512;
1438
1439 while (!s->stop) {
1440 sigma_dut_print(dut, DUT_MSG_INFO,
1441 "send_uapsd: running while uapsd_rx_state %d",
1442 s->uapsd_rx_state);
1443
1444 tx_state_func = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1445 [s->uapsd_tx_state].state_func;
1446 usr_priority = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1447 [s->uapsd_tx_state].usr_priority;
1448 sleep_duration = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1449 [s->uapsd_tx_state].sleep_dur;
1450 ps = sta_uapsd_tx_tbl[s->uapsd_sta_tc][s->uapsd_tx_state].ps;
1451
1452 sigma_dut_print(dut, DUT_MSG_INFO,
1453 "send_uapsd: uapsd_sta_tc %d uapsd_tx_state %d",
1454 s->uapsd_sta_tc, s->uapsd_tx_state);
1455 if (tx_state_func) {
1456 tx_state_func(s, usr_priority, ps, sleep_duration);
1457 } else {
1458 sigma_dut_print(dut, DUT_MSG_INFO,
1459 "send_uapsd: Null Function Detected for TC : %d in uapsd_tx_state : %d",
1460 s->uapsd_sta_tc, s->uapsd_tx_state);
1461 }
1462 }
1463
1464 sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Uapsd TX End");
1465 pthread_join(s->uapsd_send_thr, NULL);
1466
1467 return NULL;
1468}
1469
1470
1471void receive_uapsd(struct sigma_stream *s)
1472{
1473 struct timeval tv;
1474 fd_set rfds;
1475 int res = 0, ret = 0, rxpkt_len = 0;
1476 unsigned int *rxpkt;
1477 uapsd_recv_state_func_ptr recv_state_func;
1478 struct sigma_dut *dut = s->dut;
1479 u32 msgid;
1480
1481 sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Uapsd RX Start");
1482 sigma_uapsd_init(s);
1483
1484 ret = pthread_mutex_init(&s->tx_thr_mutex, NULL);
1485 if (ret != 0) {
1486 sigma_dut_print(dut, DUT_MSG_INFO,
1487 "receive_uapsd: pthread_mutex_init failed");
1488 return;
1489 }
1490
1491 ret = pthread_cond_init(&s->tx_thr_cond, NULL);
1492 if (ret != 0) {
1493 sigma_dut_print(dut, DUT_MSG_INFO,
1494 "receive_uapsd: pthread_cond_init failed");
1495 pthread_mutex_destroy(&s->tx_thr_mutex);
1496 return;
1497 }
1498
1499 if (pthread_create(&s->uapsd_send_thr, NULL, send_uapsd, s)) {
1500 sigma_dut_print(dut, DUT_MSG_ERROR,
1501 "receive_uapsd: send_uapsd tx thread creation failed");
1502 pthread_cond_destroy(&s->tx_thr_cond);
1503 pthread_mutex_destroy(&s->tx_thr_mutex);
1504 return;
1505 }
1506
1507 s->payload_size = 512;
1508 rxpkt = malloc(s->payload_size);
1509 if (rxpkt == NULL) {
1510 sigma_dut_print(dut, DUT_MSG_ERROR,
1511 "receive_uapsd: Receive buffer allocation failed");
1512 s->stop = 1;
1513 }
1514
1515 while (!s->stop) {
1516 FD_ZERO(&rfds);
1517 FD_SET(s->sock, &rfds);
1518 tv.tv_sec = 0;
1519 tv.tv_usec = 100000;
1520 res = select(s->sock + 1, &rfds, NULL, NULL, &tv);
1521 if (res < 0) {
1522 perror("select");
1523 usleep(10000);
1524 continue;
1525 }
1526
1527 if (!FD_ISSET(s->sock, &rfds))
1528 continue;
1529
1530 memset(rxpkt, 0, s->payload_size);
1531 rxpkt_len = recv(s->sock, rxpkt, s->payload_size, 0);
1532 sigma_dut_print(dut, DUT_MSG_INFO,
1533 "receive_uapsd: running res %d cookie %d dscp %d apts-pkt %d sta-id %d",
1534 res, rxpkt[0], rxpkt[1], rxpkt[10],
1535 rxpkt[9]);
1536
1537 if (rxpkt_len > 0) {
1538 s->rx_frames++;
1539 s->rx_payload_bytes += res;
1540
1541 /* if test is for WMM-AC set APTS RESET to 47 */
1542 msgid = sigma_wmm_ac ? WMMAC_APTS_RESET : APTS_RESET;
1543 if (msgid == rxpkt[10]) {
1544 sigma_dut_print(dut, DUT_MSG_ERROR,
1545 "receive_uapsd: RESET Pkt recv");
1546 s->reset_rx = 1;
1547 sigma_uapsd_reset(s);
1548 continue;
1549 }
1550
1551 recv_state_func = sta_uapsd_recv_tbl[s->uapsd_sta_tc]
1552 [s->uapsd_rx_state].state_func;
1553 sigma_dut_print(dut, DUT_MSG_INFO,
1554 "receive_uapsd: running s->uapsd_sta_tc %d uapsd_rx_state %d",
1555 s->uapsd_sta_tc, s->uapsd_rx_state);
1556 if (recv_state_func) {
1557 recv_state_func(s, rxpkt, rxpkt_len);
1558 } else {
1559 sigma_dut_print(dut, DUT_MSG_INFO,
1560 "receive_uapsd: Null Function Detected for TC : %d in uapsd_rx_state : %d",
1561 s->uapsd_sta_tc,
1562 s->uapsd_rx_state);
1563 }
1564 } else if (res < 0) {
1565 perror("recv");
1566 break;
1567 }
1568 }
1569
1570 if (rxpkt)
1571 free(rxpkt);
1572 sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Uapsd RX End");
1573 if (s->sock >= 0) {
1574 pthread_join(s->thr, NULL);
1575 close(s->sock);
1576 s->sock = -1;
1577 }
1578 pthread_cond_destroy(&s->tx_thr_cond);
1579 pthread_mutex_destroy(&s->tx_thr_mutex);
1580}
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05301581
1582
1583/* U-APSD apts console code implementation */
1584static int packet_expected(struct sigma_stream *s, unsigned int *rpkt,
1585 unsigned int type, u32 tos)
1586{
1587 u8 type_ok = 0;
1588 u8 tos_ok = 0;
1589 int res = 0;
1590 struct sigma_dut *dut = s->dut;
1591
1592 type_ok = (rpkt[10] == type) ? 1 : 0;
1593
1594 switch (tos) {
1595 case TOS_VO7:
1596 case TOS_VO:
1597 case TOS_VO6:
1598 case TOS_VO2:
1599 if (rpkt[1] == TOS_VO7 || rpkt[1] == TOS_VO ||
1600 rpkt[1] == TOS_VO6 || rpkt[1] == TOS_VO2)
1601 tos_ok = 1;
1602 break;
1603 case TOS_VI:
1604 case TOS_VI4:
1605 case TOS_VI5:
1606 if (rpkt[1] == TOS_VI || rpkt[1] == TOS_VI4 ||
1607 rpkt[1] == TOS_VI5)
1608 tos_ok = 1;
1609 break;
1610 case TOS_BE:
1611 case TOS_EE:
1612 if (rpkt[1] == TOS_BE || rpkt[1] == TOS_EE)
1613 tos_ok = 1;
1614 break;
1615 case TOS_BK:
1616 case TOS_LE:
1617 if (rpkt[1] == TOS_BK || rpkt[1] == TOS_LE)
1618 tos_ok = 1;
1619 break;
1620 default:
1621 sigma_dut_print(dut, DUT_MSG_ERROR,
1622 "packet_expected: recv not known tos=0x%x",
1623 tos);
1624 break;
1625 }
1626
1627 res = type_ok && tos_ok;
1628 if (!res) {
1629 sigma_dut_print(dut, DUT_MSG_ERROR,
1630 "packet_expected: No match: received pkt_type %u expected type %u, received dscp 0x%x expected dscp 0x%x",
1631 rpkt[10], type, rpkt[1], tos);
1632 }
1633
1634 return res;
1635}
1636
1637
1638static int console_send(struct sigma_stream *s, u32 pkt_type, u32 tos)
1639{
1640 u32 *tpkt;
1641 int res = 0;
1642 struct sigma_dut *dut = s->dut;
1643
1644 tpkt = malloc(s->payload_size);
1645 if (tpkt == NULL) {
1646 sigma_dut_print(dut, DUT_MSG_ERROR,
1647 "console_send: Send buffer allocation failed");
1648 return 0;
1649 }
1650 memset(tpkt, 0, s->payload_size);
1651 create_apts_pkt(pkt_type, tpkt, tos, s);
1652 if (pkt_type == APTS_DEFAULT || pkt_type == APTS_STOP)
1653 tpkt[0] = ++(s->rx_cookie);
1654 tpkt[1] = tos;
1655 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1656 res = send(s->sock, tpkt, s->payload_size / 2, 0);
1657 if (res >= 0) {
1658 s->tx_frames++;
1659 s->tx_payload_bytes += res;
1660 }
1661 s->uapsd_rx_state++;
1662 sigma_dut_print(dut, DUT_MSG_INFO,
1663 "console_send: Sent packet return %d Type %d Tos %d",
1664 res, tpkt[10], tpkt[1]);
1665 free(tpkt);
1666
1667 return 0;
1668}
1669
1670
1671static int console_rx_hello(struct sigma_stream *s, unsigned int *rpkt, int len)
1672{
1673 struct sigma_dut *dut = s->dut;
1674
1675 if (!packet_expected(s, rpkt, APTS_HELLO, TOS_BE)) {
1676 sigma_dut_print(dut, DUT_MSG_ERROR,
1677 "console_rx_hello: Hello not Recv or Bad TOS");
1678 return 0;
1679 }
1680
1681 s->rx_cookie = 0;
1682 sigma_dut_print(dut, DUT_MSG_INFO,
1683 "console_rx_hello: Recv Hello, Sent Test Case");
1684 console_send(s, s->uapsd_sta_tc, TOS_BE);
1685
1686 return 0;
1687}
1688
1689
1690static int console_rx_confirm(struct sigma_stream *s, unsigned int *rpkt,
1691 int len)
1692{
1693 struct sigma_dut *dut = s->dut;
1694
1695 if (!packet_expected(s, rpkt, APTS_CONFIRM, TOS_BE)) {
1696 sigma_dut_print(dut, DUT_MSG_ERROR,
1697 "console_rx_confirm: Confirm not Recv or Bad TOS");
1698 return 0;
1699 }
1700
1701 s->rx_cookie = 0;
1702 s->uapsd_rx_state++;
1703 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_confirm: Recv Confirm");
1704
1705 return 0;
1706}
1707
1708
1709static int console_rx_confirm_tx_vi(struct sigma_stream *s, unsigned int *rpkt,
1710 int len)
1711{
1712 struct sigma_dut *dut = s->dut;
1713
1714 if (!packet_expected(s, rpkt, APTS_CONFIRM, TOS_BE)) {
1715 sigma_dut_print(dut, DUT_MSG_ERROR,
1716 "console_rx_confirm_tx_vi: Confirm not Recv or Bad TOS");
1717 return 0;
1718 }
1719
1720 s->rx_cookie = 0;
1721 console_send(s, APTS_DEFAULT, TOS_VI);
1722 sigma_dut_print(dut, DUT_MSG_INFO,
1723 "console_rx_confirm_tx_vi: Recv Confirm, Sent VI");
1724
1725 return 0;
1726
1727}
1728
1729
1730static int console_rx_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
1731 int len)
1732{
1733 struct sigma_dut *dut = s->dut;
1734
1735 sigma_dut_print(dut, DUT_MSG_INFO,
1736 "console_rx_tx_stop: Send stop to STA again quit %d stop %d",
1737 s->can_quit, s->stop);
1738
1739 console_send(s, APTS_STOP, TOS_BE);
1740
1741 if (packet_expected(s, rpkt, APTS_STOP, TOS_BE)) {
1742 if (s->can_quit) {
1743 s->stop = 1;
1744 sigma_dut_print(dut, DUT_MSG_INFO,
1745 "console_rx_tx_stop: Send stop to STA again quit %d stop %d",
1746 s->can_quit, s->stop);
1747 } else {
1748 s->can_quit = 1;
1749 }
1750 } else {
1751 sigma_dut_print(dut, DUT_MSG_ERROR,
1752 "console_rx_tx_stop: STOP not Recv or Bad TOS");
1753 }
1754
1755 return 0;
1756}
1757
1758
1759static int console_rx_vo_tx_vo(struct sigma_stream *s, unsigned int *rpkt,
1760 int len)
1761{
1762 struct sigma_dut *dut = s->dut;
1763 unsigned int tos = TOS_VO7;
1764 int res;
1765
1766 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
1767 sigma_dut_print(dut, DUT_MSG_ERROR,
1768 "console_rx_vo_tx_vo: Expected Pkt not Recv or Bad TOS");
1769 return 0;
1770 }
1771
1772 rpkt[0] = ++(s->rx_cookie);
1773 rpkt[1] = TOS_VO;
1774 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1775 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1776 if (res >= 0) {
1777 s->tx_frames++;
1778 s->tx_payload_bytes += res;
1779 }
1780 s->uapsd_rx_state++;
1781 sigma_dut_print(dut, DUT_MSG_INFO,
1782 "console_rx_vo_tx_vo: Recv VO, Sent VO");
1783
1784 return 0;
1785}
1786
1787
1788static int console_rx_vo_tx_vo_tx_stop(struct sigma_stream *s,
1789 unsigned int *rpkt, int len)
1790{
1791 struct sigma_dut *dut = s->dut;
1792 unsigned int tos = TOS_VO7;
1793 int res;
1794
1795 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
1796 sigma_dut_print(dut, DUT_MSG_ERROR,
1797 "console_rx_vo_tx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
1798 return 0;
1799 }
1800
1801 rpkt[0] = ++(s->rx_cookie);
1802 rpkt[1] = TOS_VO;
1803 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1804 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1805 if (res >= 0) {
1806 s->tx_frames++;
1807 s->tx_payload_bytes += res;
1808 }
1809 sigma_dut_print(dut, DUT_MSG_INFO,
1810 "console_rx_vo_tx_vo_tx_stop: Recv VO, Sent VO");
1811 usleep(500000);
1812 console_send(s, APTS_STOP, TOS_BE);
1813
1814 return 0;
1815}
1816
1817
1818static int console_rx_vo_tx_all_tx_stop(struct sigma_stream *s,
1819 unsigned int *rpkt, int len)
1820{
1821 struct sigma_dut *dut = s->dut;
1822 u32 tos = TOS_VO7;
1823 int res;
1824
1825 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
1826 sigma_dut_print(dut, DUT_MSG_ERROR,
1827 "console_rx_vo_tx_all_tx_stop: Expected Pkt not Recv or Bad TOS");
1828 return 0;
1829 }
1830
1831 rpkt[0] = ++(s->rx_cookie);
1832 rpkt[1] = TOS_VO;
1833 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1834 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1835 if (res >= 0) {
1836 s->tx_frames++;
1837 s->tx_payload_bytes += res;
1838 }
1839 sigma_dut_print(dut, DUT_MSG_INFO,
1840 "console_rx_vo_tx_all_tx_stop: Recv VO, Sent VO");
1841 rpkt[0] = ++(s->rx_cookie);
1842 tos = TOS_VI;
1843 rpkt[1] = tos;
1844 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1845 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1846 if (res >= 0) {
1847 s->tx_frames++;
1848 s->tx_payload_bytes += res;
1849 }
1850 sigma_dut_print(dut, DUT_MSG_INFO,
1851 "console_rx_vo_tx_all_tx_stop: Sent VI");
1852 rpkt[0] = ++(s->rx_cookie);
1853 tos = TOS_BE;
1854 rpkt[1] = tos;
1855 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1856 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1857 if (res >= 0) {
1858 s->tx_frames++;
1859 s->tx_payload_bytes += res;
1860 }
1861 sigma_dut_print(dut, DUT_MSG_INFO,
1862 "console_rx_vo_tx_all_tx_stop: Sent BE");
1863 rpkt[0] = ++(s->rx_cookie);
1864 tos = TOS_BK;
1865 rpkt[1] = tos;
1866 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1867 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1868 if (res >= 0) {
1869 s->tx_frames++;
1870 s->tx_payload_bytes += res;
1871 }
1872 sigma_dut_print(dut, DUT_MSG_INFO,
1873 "console_rx_vo_tx_all_tx_stop: Sent BK");
1874 usleep(500000);
1875 console_send(s, APTS_STOP, TOS_BE);
1876
1877 return 0;
1878}
1879
1880
1881static int console_rx_be_tx_be(struct sigma_stream *s, unsigned int *rpkt,
1882 int len)
1883{
1884 struct sigma_dut *dut = s->dut;
1885 u32 tos = TOS_BE;
1886 int res;
1887
1888 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
1889 sigma_dut_print(dut, DUT_MSG_ERROR,
1890 "console_rx_be_tx_be: Expected Pkt not Recv or Bad TOS");
1891 return 0;
1892 }
1893
1894 rpkt[0] = ++(s->rx_cookie);
1895 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1896 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1897 if (res >= 0) {
1898 s->tx_frames++;
1899 s->tx_payload_bytes += res;
1900 }
1901 s->uapsd_rx_state++;
1902 sigma_dut_print(dut, DUT_MSG_INFO,
1903 "console_rx_be_tx_be: Recv BE, Sent BE");
1904
1905 return 0;
1906}
1907
1908
1909static int console_rx_be_tx_be_tx_stop(struct sigma_stream *s,
1910 unsigned int *rpkt, int len)
1911{
1912 struct sigma_dut *dut = s->dut;
1913 u32 tos = TOS_BE;
1914 int res;
1915
1916 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
1917 sigma_dut_print(dut, DUT_MSG_ERROR,
1918 "console_rx_be_tx_be_tx_stop: Expected Pkt not Recv or Bad TOS");
1919 return 0;
1920 }
1921
1922 rpkt[0] = ++(s->rx_cookie);
1923 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1924 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1925 if (res >= 0) {
1926 s->tx_frames++;
1927 s->tx_payload_bytes += res;
1928 }
1929 sigma_dut_print(dut, DUT_MSG_INFO,
1930 "console_rx_be_tx_be_tx_stop: Recv BE, Sent BE");
1931 console_send(s, APTS_STOP, TOS_BE);
1932
1933 return 0;
1934}
1935
1936
1937static int console_rx_vi_tx_be(struct sigma_stream *s, unsigned int *rpkt,
1938 int len)
1939{
1940 struct sigma_dut *dut = s->dut;
1941 u32 tos = TOS_BE;
1942 int res;
1943
1944 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
1945 sigma_dut_print(dut, DUT_MSG_ERROR,
1946 "console_rx_vi_tx_be: Expected Pkt not Recv or Bad TOS");
1947 return 0;
1948 }
1949
1950 rpkt[0] = ++(s->rx_cookie);
1951 rpkt[1] = tos;
1952 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1953 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1954 if (res >= 0) {
1955 s->tx_frames++;
1956 s->tx_payload_bytes += res;
1957 }
1958 s->uapsd_rx_state++;
1959 sigma_dut_print(dut, DUT_MSG_INFO,
1960 "console_rx_vi_tx_be: Recv VI, Sent BE");
1961
1962 return 0;
1963}
1964
1965
1966static int console_rx_vi_tx_bk(struct sigma_stream *s, unsigned int *rpkt,
1967 int len)
1968{
1969 struct sigma_dut *dut = s->dut;
1970 u32 tos = TOS_BK;
1971 int res;
1972
1973 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
1974 sigma_dut_print(dut, DUT_MSG_ERROR,
1975 "console_rx_vi_tx_bk: Expected Pkt not Recv or Bad TOS");
1976 return 0;
1977 }
1978
1979 rpkt[0] = ++(s->rx_cookie);
1980 rpkt[1] = tos;
1981 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1982 res = send(s->sock, rpkt, s->payload_size / 2, 0);
1983 if (res >= 0) {
1984 s->tx_frames++;
1985 s->tx_payload_bytes += res;
1986 }
1987 s->uapsd_rx_state++;
1988 sigma_dut_print(dut, DUT_MSG_INFO,
1989 "console_rx_vi_tx_bk: Recv VI, Sent BK");
1990
1991 return 0;
1992}
1993
1994
1995static int console_rx_vo_tx_bcst_tx_stop(struct sigma_stream *s,
1996 unsigned int *rpkt, int len)
1997{
1998 struct sigma_dut *dut = s->dut;
1999 u32 tos = TOS_BE;
2000 int res;
2001 int broadcast = 1;
2002 struct sockaddr_in bcst_addr;
2003
2004 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
2005 sigma_dut_print(dut, DUT_MSG_ERROR,
2006 "console_rx_vo_tx_bcst_tx_stop: Expected Pkt not Recv or Bad TOS");
2007 return 0;
2008 }
2009
2010 memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
2011 bcst_addr.sin_family = AF_INET;
2012 bcst_addr.sin_port = htons(s->dst_port);
2013 bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
2014
2015 usleep(300000);
2016 rpkt[0] = ++(s->rx_cookie);
2017 rpkt[1] = tos;
2018 setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
2019 sizeof(broadcast));
2020 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2021 res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
2022 (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
2023 if (res >= 0) {
2024 s->tx_frames++;
2025 s->tx_payload_bytes += res;
2026 }
2027 sigma_dut_print(dut, DUT_MSG_INFO,
2028 "console_rx_vo_tx_bcst_tx_stop: Recv VO, Sent Broadcast res = %d",
2029 res);
2030 console_send(s, APTS_STOP, TOS_BE);
2031
2032 return 0;
2033}
2034
2035
2036static int console_rx_vi_tx_bcst(struct sigma_stream *s, unsigned int *rpkt,
2037 int len)
2038{
2039 struct sigma_dut *dut = s->dut;
2040 u32 tos = TOS_VI;
2041 int res;
2042 int broadcast = 1;
2043 struct sockaddr_in bcst_addr;
2044
2045 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2046 sigma_dut_print(dut, DUT_MSG_ERROR,
2047 "console_rx_vi_tx_bcst: Expected Pkt not Recv or Bad TOS");
2048 return 0;
2049 }
2050
2051 memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
2052 bcst_addr.sin_family = AF_INET;
2053 bcst_addr.sin_port = htons(s->dst_port);
2054 bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
2055
2056 rpkt[0] = ++(s->rx_cookie);
2057 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2058 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2059 if (res >= 0) {
2060 s->tx_frames++;
2061 s->tx_payload_bytes += res;
2062 }
2063 tos = TOS_BE;
2064 rpkt[0] = ++(s->rx_cookie);
2065 rpkt[1] = tos;
2066 setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
2067 sizeof(broadcast));
2068 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2069 res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
2070 (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
2071 if (res >= 0) {
2072 s->tx_frames++;
2073 s->tx_payload_bytes += res;
2074 }
2075 sigma_dut_print(dut, DUT_MSG_INFO,
2076 "console_rx_vi_tx_bcst: Recv/Sent VI, Sent Broadcast res = %d",
2077 res);
2078 s->uapsd_rx_state++;
2079
2080 return 0;
2081}
2082
2083
2084static int console_rx_be_tx_bcst(struct sigma_stream *s, unsigned int *rpkt,
2085 int len)
2086{
2087 struct sigma_dut *dut = s->dut;
2088 u32 tos = TOS_BE;
2089 int res;
2090 int broadcast = 1;
2091 struct sockaddr_in bcst_addr;
2092
2093 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
2094 sigma_dut_print(dut, DUT_MSG_ERROR,
2095 "console_rx_be_tx_bcst: Expected Pkt not Recv or Bad TOS");
2096 return 0;
2097 }
2098
2099 memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
2100 bcst_addr.sin_family = AF_INET;
2101 bcst_addr.sin_port = htons(s->dst_port);
2102 bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
2103
2104 rpkt[0] = ++(s->rx_cookie);
2105 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2106 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2107 if (res >= 0) {
2108 s->tx_frames++;
2109 s->tx_payload_bytes += res;
2110 }
2111 rpkt[0] = ++(s->rx_cookie);
2112 rpkt[1] = tos;
2113 setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
2114 sizeof(broadcast));
2115 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2116 res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
2117 (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
2118 if (res >= 0) {
2119 s->tx_frames++;
2120 s->tx_payload_bytes += res;
2121 }
2122 sigma_dut_print(dut, DUT_MSG_INFO,
2123 "console_rx_be_tx_bcst: Recv/Sent BE, Sent Broadcast res = %d",
2124 res);
2125 s->uapsd_rx_state++;
2126
2127 return 0;
2128}
2129
2130
2131static int console_rx_be_tx_bcst_tx_stop(struct sigma_stream *s,
2132 unsigned int *rpkt, int len)
2133{
2134 struct sigma_dut *dut = s->dut;
2135 u32 tos = TOS_BE;
2136 int res;
2137 int broadcast = 1;
2138 struct sockaddr_in bcst_addr;
2139
2140 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
2141 sigma_dut_print(dut, DUT_MSG_ERROR,
2142 "console_rx_be_tx_bcst_tx_stop: Expected Pkt not Recv or Bad TOS");
2143 return 0;
2144 }
2145
2146 memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
2147 bcst_addr.sin_family = AF_INET;
2148 bcst_addr.sin_port = htons(s->dst_port);
2149 bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
2150
2151 rpkt[0] = ++(s->rx_cookie);
2152 setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
2153 sizeof(broadcast));
2154 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2155 res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
2156 (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
2157 if (res >= 0) {
2158 s->tx_frames++;
2159 s->tx_payload_bytes += res;
2160 }
2161 sigma_dut_print(dut, DUT_MSG_INFO,
2162 "console_rx_be_tx_bcst_tx_stop: Recv BE, Sent Broadcast res = %d",
2163 res);
2164 console_send(s, APTS_STOP, TOS_BE);
2165
2166 return 0;
2167}
2168
2169
2170static int console_rx_vi_tx_vi(struct sigma_stream *s, unsigned int *rpkt,
2171 int len)
2172{
2173 struct sigma_dut *dut = s->dut;
2174 u32 tos = TOS_VI;
2175 int res;
2176
2177 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2178 sigma_dut_print(dut, DUT_MSG_ERROR,
2179 "console_rx_vi_tx_vi: Expected Pkt not Recv or Bad TOS");
2180 return 0;
2181 }
2182
2183 rpkt[0] = ++(s->rx_cookie);
2184 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2185 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2186 if (res >= 0) {
2187 s->tx_frames++;
2188 s->tx_payload_bytes += res;
2189 }
2190 s->uapsd_rx_state++;
2191 sigma_dut_print(dut, DUT_MSG_INFO,
2192 "console_rx_vi_tx_vi: Recv VI, Sent VI");
2193
2194 return 0;
2195}
2196
2197
2198static int console_rx_vi_tx_vi_tx_stop(struct sigma_stream *s,
2199 unsigned int *rpkt, int len)
2200{
2201 struct sigma_dut *dut = s->dut;
2202 u32 tos = TOS_VI;
2203 int res;
2204
2205 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2206 sigma_dut_print(dut, DUT_MSG_ERROR,
2207 "console_rx_vi_tx_vi_tx_stop: Expected Pkt not Recv or Bad TOS");
2208 return 0;
2209 }
2210
2211 rpkt[0] = ++(s->rx_cookie);
2212 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2213 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2214 if (res >= 0) {
2215 s->tx_frames++;
2216 s->tx_payload_bytes += res;
2217 }
2218 sigma_dut_print(dut, DUT_MSG_INFO,
2219 "console_rx_vi_tx_vi_tx_stop: Recv VI, Sent VI");
2220 console_send(s, APTS_STOP, TOS_BE);
2221
2222 return 0;
2223}
2224
2225
2226static int console_rx_vi_tx_vo_tx_stop(struct sigma_stream *s,
2227 unsigned int *rpkt, int len)
2228{
2229 struct sigma_dut *dut = s->dut;
2230 u32 tos = TOS_VO7;
2231 int res;
2232
2233 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2234 sigma_dut_print(dut, DUT_MSG_ERROR,
2235 "console_rx_vi_tx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
2236 return 0;
2237 }
2238
2239 rpkt[0] = ++(s->rx_cookie);
2240 rpkt[1] = TOS_VO;
2241 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2242 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2243 if (res >= 0) {
2244 s->tx_frames++;
2245 s->tx_payload_bytes += res;
2246 }
2247 sigma_dut_print(dut, DUT_MSG_INFO,
2248 "console_rx_vi_tx_vo_tx_stop: Recv VI, Sent VO");
2249 console_send(s, APTS_STOP, TOS_BE);
2250
2251 return 0;
2252}
2253
2254
2255static int console_rx_vo_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
2256 int len)
2257{
2258 struct sigma_dut *dut = s->dut;
2259
2260 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
2261 sigma_dut_print(dut, DUT_MSG_ERROR,
2262 "console_rx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
2263 return 0;
2264 }
2265
2266 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vo_tx_stop: Recv VO");
2267 sleep(1);
2268 console_send(s, APTS_STOP, TOS_BE);
2269
2270 return 0;
2271}
2272
2273
2274static int console_rx_vi_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
2275 int len)
2276{
2277 struct sigma_dut *dut = s->dut;
2278
2279 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2280 sigma_dut_print(dut, DUT_MSG_ERROR,
2281 "console_rx_vi_tx_stop: Expected Pkt not Recv or Bad TOS");
2282 return 0;
2283 }
2284
2285 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vi_tx_stop: Recv VI");
2286 console_send(s, APTS_STOP, TOS_BE);
2287
2288 return 0;
2289}
2290
2291
2292static int console_rx_bk_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
2293 int len)
2294{
2295 struct sigma_dut *dut = s->dut;
2296
2297 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BK)) {
2298 sigma_dut_print(dut, DUT_MSG_ERROR,
2299 "console_rx_bk_tx_stop: Expected Pkt not Recv or Bad TOS");
2300 return 0;
2301 }
2302
2303 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_bk_tx_stop: Recv BK");
2304 console_send(s, APTS_STOP, TOS_BE);
2305
2306 return 0;
2307}
2308
2309
2310static int console_rx_vo_tx_2vo(struct sigma_stream *s, unsigned int *rpkt,
2311 int len)
2312{
2313 struct sigma_dut *dut = s->dut;
2314 u32 tos = TOS_VO7;
2315 int res;
2316
2317 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
2318 sigma_dut_print(dut, DUT_MSG_ERROR,
2319 "console_rx_vo_tx_2vo: Expected Pkt not Recv or Bad TOS");
2320 return 0;
2321 }
2322
2323 rpkt[0] = ++(s->rx_cookie);
2324 rpkt[1] = TOS_VO;
2325 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2326 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2327 if (res >= 0) {
2328 s->tx_frames++;
2329 s->tx_payload_bytes += res;
2330 }
2331 rpkt[0] = ++(s->rx_cookie);
2332 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2333 if (res >= 0) {
2334 s->tx_frames++;
2335 s->tx_payload_bytes += res;
2336 }
2337 s->uapsd_rx_state++;
2338 sigma_dut_print(dut, DUT_MSG_INFO,
2339 "console_rx_vo_tx_2vo: Recv VO, Sent 2 VO");
2340
2341 return 0;
2342}
2343
2344
2345static int console_rx_be(struct sigma_stream *s, unsigned int *rpkt, int len)
2346{
2347 struct sigma_dut *dut = s->dut;
2348
2349 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
2350 sigma_dut_print(dut, DUT_MSG_ERROR,
2351 "console_rx_be: Expected Pkt not Recv or Bad TOS");
2352 return 0;
2353 }
2354
2355 s->uapsd_rx_state++;
2356 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_be: Recv BE");
2357
2358 return 0;
2359}
2360
2361
2362static int console_rx_vi(struct sigma_stream *s, unsigned int *rpkt, int len)
2363{
2364 struct sigma_dut *dut = s->dut;
2365
2366 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
2367 sigma_dut_print(dut, DUT_MSG_ERROR,
2368 "console_rx_vi: Expected Pkt not Recv or Bad TOS");
2369 return 0;
2370 }
2371
2372 s->uapsd_rx_state++;
2373 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vi: Recv VI");
2374
2375 return 0;
2376}
2377
2378
2379static int console_rx_vo(struct sigma_stream *s, unsigned int *rpkt, int len)
2380{
2381 struct sigma_dut *dut = s->dut;
2382
2383 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
2384 sigma_dut_print(dut, DUT_MSG_ERROR,
2385 "console_rx_vo : Expected Pkt not Recv or Bad TOS");
2386 return 0;
2387 }
2388
2389 s->uapsd_rx_state++;
2390 sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vo: Recv VO");
2391
2392 return 0;
2393
2394}
2395
2396
2397static int console_rx_vo_tx_vo_cyclic(struct sigma_stream *s,
2398 unsigned int *rpkt, int len)
2399{
2400 int res = 0;
2401 unsigned int tos = 0;
2402 unsigned int *tpkt;
2403 struct sigma_dut *dut = s->dut;
2404
2405 tpkt = malloc(s->payload_size);
2406 if (tpkt == NULL)
2407 return -1;
2408
2409 if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
2410 if (rpkt[10] != APTS_STOP)
2411 sigma_uapsd_reset(s);
2412
2413 if (!packet_expected(s, rpkt, APTS_STOP, TOS_BE)) {
2414 sigma_dut_print(dut, DUT_MSG_ERROR,
2415 "console_rx_vo_tx_vo_cyclic: Expected STOP Pkt not Recv or Bad TOS");
2416 free(tpkt);
2417 return 0;
2418 }
2419
Pradeep Reddy POTTETI1977e0d2016-03-10 17:10:55 +05302420 memset(tpkt, 0, s->payload_size);
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05302421 tpkt[0] = s->rx_cookie;
2422 tos = TOS_BE;
2423 setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2424 create_apts_pkt(APTS_STOP, tpkt, tos, s);
2425 tpkt[1] = tos;
2426 if (s->can_quit) {
Pradeep Reddy POTTETI1977e0d2016-03-10 17:10:55 +05302427 const char *stop_cmd = "APTSL1 STOP";
2428 size_t stop_cmd_len = strlen(stop_cmd);
2429
2430 if (s->payload_size > 11 * sizeof(int) + stop_cmd_len)
2431 memcpy(&tpkt[11], stop_cmd, stop_cmd_len + 1);
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05302432 res = send(s->sock, tpkt, s->payload_size / 2, 0);
2433 if (res >= 0) {
2434 s->tx_frames++;
2435 s->tx_payload_bytes += res;
2436 }
2437 sigma_dut_print(dut, DUT_MSG_INFO,
2438 "console_rx_vo_tx_vo_cyclic: Sent STOP");
2439 sleep(5);
2440 s->stop = 1;
2441 } else {
2442 res = send(s->sock, tpkt, s->payload_size / 2, 0);
2443 if (res >= 0) {
2444 s->tx_frames++;
2445 s->tx_payload_bytes += res;
2446 }
2447 s->can_quit = 1;
2448 }
2449 } else {
2450 sigma_dut_print(dut, DUT_MSG_INFO,
2451 "console_rx_vo_tx_vo_cyclic: Recv Pkt: %d Cookie: %d Sta-id %d",
2452 rpkt[0], s->rx_cookie, s->sta_id);
2453 rpkt[0] = ++(s->rx_cookie);
2454 tos = TOS_VO7;
2455 rpkt[1] = TOS_VO;
2456 res = setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos,
2457 sizeof(tos));
2458 res = send(s->sock, rpkt, s->payload_size / 2, 0);
2459 if (res >= 0) {
2460 s->tx_frames++;
2461 s->tx_payload_bytes += res;
2462 }
2463
2464 if (s->rx_cookie >= 3000) {
2465 /* No state change for L.1 */
2466 }
2467 }
2468
2469 free(tpkt);
2470
2471 return 0;
2472}
2473
2474
2475static struct apts_pkt * apts_lookup(const char *s)
2476{
2477 struct apts_pkt *t;
2478
2479 for (t = &apts_pkts[1]; s && t->cmd; t++) {
Pradeep Reddy POTTETIe104a5b2016-03-09 18:40:04 +05302480 if (strcmp(s, "L.1AP") == 0)
2481 s = "L.1";
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05302482 if (t->name && strcmp(t->name, s) == 0)
2483 return t;
2484 }
2485
2486 return NULL;
2487}
2488
2489
2490void send_uapsd_console(struct sigma_stream *s)
2491{
2492 struct timeval tv;
2493 fd_set rfds;
2494 int res;
2495 unsigned int *rpkt;
2496 uapsd_console_state_func_ptr console_state_func;
2497 struct apts_pkt *testcase;
2498 struct sigma_dut *dut = s->dut;
2499 /* start timer for self exit */
2500 int uapsd_timer = UAPSD_CONSOLE_TIMER;
2501
2502 s->can_quit = 0;
2503 s->reset = 0;
2504 s->reset_rx = 0;
2505 s->uapsd_sta_tc = 0;
2506
2507 testcase = apts_lookup(s->test_name);
2508 if (testcase == NULL) {
2509 sigma_dut_print(dut, DUT_MSG_ERROR,
2510 "send_uapsd_console: no testcase found");
2511 return;
2512 }
2513
2514 /* send test case number to be executed */
2515 s->uapsd_sta_tc = testcase->cmd;
2516 if (s->uapsd_sta_tc < B_D || s->uapsd_sta_tc > LAST_TC) {
2517 sigma_dut_print(dut, DUT_MSG_ERROR,
2518 "send_uapsd_console: Test Case: %s Unknown",
2519 s->test_name);
2520 return;
2521 }
2522
2523 s->payload_size = 512;
2524 rpkt = malloc(s->payload_size);
2525 if (rpkt == NULL) {
2526 sigma_dut_print(dut, DUT_MSG_ERROR,
2527 "send_uapsd_console: buffer allocation failed");
2528 return;
2529 }
2530
2531 sigma_dut_print(dut, DUT_MSG_INFO,
2532 "send_uapsd_console: Uapsd Console Start");
2533
2534 while (!s->stop) {
2535 uapsd_timer--;
2536 FD_ZERO(&rfds);
2537 FD_SET(s->sock, &rfds);
2538 tv.tv_sec = 0;
2539 tv.tv_usec = 300000;
2540 res = select(s->sock + 1, &rfds, NULL, NULL, &tv);
2541 if (res < 0) {
2542 perror("select");
2543 usleep(10000);
2544 } else if (FD_ISSET(s->sock, &rfds)) {
2545 memset(rpkt, 0, s->payload_size);
2546 res = recv(s->sock, rpkt, s->payload_size, 0);
2547 if (res < 0) {
2548 perror("recv");
2549 break;
2550 }
2551
2552 sigma_dut_print(dut, DUT_MSG_INFO,
2553 "send_uapsd_console: running res %d cookie %d dscp %d apts-pkt %d sta-id %d",
2554 res, rpkt[0], rpkt[1], rpkt[10],
2555 rpkt[9]);
2556 if (res == 0)
2557 continue;
2558
2559 s->rx_frames++;
2560 s->rx_payload_bytes += res;
2561 /*
2562 * Reset the timer as packet is received
2563 * within steps.
2564 */
2565 uapsd_timer = UAPSD_CONSOLE_TIMER;
2566
2567 if (rpkt[10] == APTS_HELLO) {
2568 if (s->reset)
2569 s->reset = 0;
2570 s->rx_cookie = 0;
Pradeep Reddy POTTETI83d62cb2016-02-04 13:07:49 +05302571 /* assign a unique id to this sta */
2572 s->sta_id = s->stream_id;
Pradeep Reddy POTTETI79594042015-11-23 12:59:12 +05302573 /* uapsd console process table state */
2574 s->uapsd_rx_state = 0;
2575 s->can_quit = 1;
2576 } else {
2577 if (s->reset)
2578 continue;
2579 }
2580
2581 if (rpkt[10] == APTS_RESET) {
2582 sigma_dut_print(dut, DUT_MSG_ERROR,
2583 "send_uapsd_console: RESET Pkt recv");
2584 s->reset_rx = 1;
2585 sigma_uapsd_reset(s);
2586 }
2587
2588 if (rpkt[10] == APTS_RESET_STOP) {
2589 sigma_dut_print(dut, DUT_MSG_ERROR,
2590 "send_uapsd_console: RESET STOP Pkt recv");
2591 s->stop = 1;
2592 }
2593
2594 if (rpkt[10] == APTS_BCST) {
2595 sigma_dut_print(dut, DUT_MSG_INFO,
2596 "send_uapsd_console: Broadcast Pkt recv");
2597 continue;
2598 }
2599
2600 console_state_func =
2601 uapsd_console_state_tbl[s->uapsd_sta_tc]
2602 [s->uapsd_rx_state].state_func;
2603 if (console_state_func) {
2604 console_state_func(s, rpkt, res);
2605 } else {
2606 sigma_dut_print(dut, DUT_MSG_INFO,
2607 "send_uapsd_console: Null function detected for TC: %d in uapsd_rx_state: %d",
2608 s->uapsd_sta_tc,
2609 s->uapsd_rx_state);
2610 }
2611 }
2612
2613 /* Stop the thread. No transactions for the set time */
2614 if (uapsd_timer == 0) {
2615 sigma_dut_print(dut, DUT_MSG_INFO,
2616 "send_uapsd_console: Timer Expired");
2617 s->stop = 1;
2618 }
2619 }
2620
2621 free(rpkt);
2622 sigma_dut_print(dut, DUT_MSG_INFO,
2623 "send_uapsd_console: Uapsd Console End");
2624}