xref: /wlan-dirver/utils/sigma-dut/uapsd_stream.c (revision 1977e0d02c61108121085f27a7b8f396bd43a096)
1cd4e3c3eSJouni Malinen /*
2cd4e3c3eSJouni Malinen  * Sigma Control API DUT (station/AP)
3cd4e3c3eSJouni Malinen  * Copyright (c) 2014, Qualcomm Atheros, Inc.
4cd4e3c3eSJouni Malinen  * All Rights Reserved.
5cd4e3c3eSJouni Malinen  * Licensed under the Clear BSD license. See README for more details.
6cd4e3c3eSJouni Malinen  */
7cd4e3c3eSJouni Malinen 
8cd4e3c3eSJouni Malinen /*
9cd4e3c3eSJouni Malinen  * This implementation in this file is based on source code released by
10cd4e3c3eSJouni Malinen  * Wi-Fi Alliance under the following terms:
11cd4e3c3eSJouni Malinen  *
12cd4e3c3eSJouni Malinen * Copyright (c) 2014 Wi-Fi Alliance
13cd4e3c3eSJouni Malinen *
14cd4e3c3eSJouni Malinen * Permission to use, copy, modify, and/or distribute this software for any
15cd4e3c3eSJouni Malinen * purpose with or without fee is hereby granted, provided that the above
16cd4e3c3eSJouni Malinen * copyright notice and this permission notice appear in all copies.
17cd4e3c3eSJouni Malinen *
18cd4e3c3eSJouni Malinen * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
19cd4e3c3eSJouni Malinen * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
20cd4e3c3eSJouni Malinen * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
21cd4e3c3eSJouni Malinen * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
22cd4e3c3eSJouni Malinen * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
23cd4e3c3eSJouni Malinen * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
24cd4e3c3eSJouni Malinen * USE OR PERFORMANCE OF THIS SOFTWARE.
25cd4e3c3eSJouni Malinen  */
26cd4e3c3eSJouni Malinen 
27cd4e3c3eSJouni Malinen #include "sigma_dut.h"
28cd4e3c3eSJouni Malinen 
29cd4e3c3eSJouni Malinen static void sigma_uapsd_reset(struct sigma_stream *s);
30cd4e3c3eSJouni Malinen static void sigma_uapsd_stop(struct sigma_stream *s);
31cd4e3c3eSJouni Malinen static void create_apts_hello_pkt(int msg, unsigned int *txbuf,
32cd4e3c3eSJouni Malinen 				  int tx_hello_cnt);
33cd4e3c3eSJouni Malinen 
34cd4e3c3eSJouni Malinen 
35cd4e3c3eSJouni Malinen /* WMM-PS Test Case IDs */
36cd4e3c3eSJouni Malinen #define B_D		1
37cd4e3c3eSJouni Malinen #define B_H		2
38cd4e3c3eSJouni Malinen #define B_B		3
39cd4e3c3eSJouni Malinen #define B_M 		4
40cd4e3c3eSJouni Malinen #define M_D		5
41cd4e3c3eSJouni Malinen #define B_Z		6
42cd4e3c3eSJouni Malinen #define M_Y		7
43cd4e3c3eSJouni Malinen #define L_1		8
44cd4e3c3eSJouni Malinen #define A_Y		9
45cd4e3c3eSJouni Malinen #define B_W		10
46cd4e3c3eSJouni Malinen #define A_J		11
47cd4e3c3eSJouni Malinen #define M_V		12
48cd4e3c3eSJouni Malinen #define M_U		13
49cd4e3c3eSJouni Malinen #define A_U		14
50cd4e3c3eSJouni Malinen #define M_L		15
51cd4e3c3eSJouni Malinen #define B_K		16
52cd4e3c3eSJouni Malinen #define M_B		17
53cd4e3c3eSJouni Malinen #define M_K		18
54cd4e3c3eSJouni Malinen #define M_W		19
55cd4e3c3eSJouni Malinen 
56cd4e3c3eSJouni Malinen /* WMM-PS APTS Msg IDs */
57cd4e3c3eSJouni Malinen #define APTS_DEFAULT	(M_W + 0x01)
58cd4e3c3eSJouni Malinen #define APTS_HELLO	(APTS_DEFAULT + 0x01)
59cd4e3c3eSJouni Malinen #define APTS_BCST	(APTS_HELLO + 0x01)
60cd4e3c3eSJouni Malinen #define APTS_CONFIRM	(APTS_BCST + 0x01)
61cd4e3c3eSJouni Malinen #define APTS_STOP	(APTS_CONFIRM + 0x01)
62cd4e3c3eSJouni Malinen #define APTS_CK_BE      (APTS_STOP + 0x01)
63cd4e3c3eSJouni Malinen #define APTS_CK_BK      (APTS_CK_BE + 0x01)
64cd4e3c3eSJouni Malinen #define APTS_CK_VI      (APTS_CK_BK + 0x01)
65cd4e3c3eSJouni Malinen #define APTS_CK_VO      (APTS_CK_VI + 0x01)
66cd4e3c3eSJouni Malinen #define APTS_RESET      (APTS_CK_VO + 0x01)
67cd4e3c3eSJouni Malinen #define APTS_RESET_RESP (APTS_RESET + 0x01)
68cd4e3c3eSJouni Malinen #define APTS_RESET_STOP (APTS_RESET_RESP + 0x01)
69cd4e3c3eSJouni Malinen #define APTS_LAST       99
70cd4e3c3eSJouni Malinen 
71cd4e3c3eSJouni Malinen /* WMM-AC Test Case IDs */
72cd4e3c3eSJouni Malinen extern int sigma_wmm_ac;
73cd4e3c3eSJouni Malinen #ifdef CONFIG_WFA_WMM_AC
74cd4e3c3eSJouni Malinen #define WMMAC_422_T02B            20
75cd4e3c3eSJouni Malinen #define WMMAC_422_T03A            21
76cd4e3c3eSJouni Malinen #define WMMAC_422_T04B            22
77cd4e3c3eSJouni Malinen #define WMMAC_422_T05B            23
78cd4e3c3eSJouni Malinen #define WMMAC_422_T06B            24
79cd4e3c3eSJouni Malinen #define WMMAC_422_T07B            25
80cd4e3c3eSJouni Malinen #define WMMAC_422_T08B            26
81cd4e3c3eSJouni Malinen 
82cd4e3c3eSJouni Malinen #define WMMAC_423_T04             27
83cd4e3c3eSJouni Malinen #define WMMAC_424_T07t14          28
84cd4e3c3eSJouni Malinen #define WMMAC_425_T04t06          29
85cd4e3c3eSJouni Malinen 
86cd4e3c3eSJouni Malinen #define WMMAC_521_T03             30
87cd4e3c3eSJouni Malinen #define WMMAC_521_T05             31
88cd4e3c3eSJouni Malinen 
89cd4e3c3eSJouni Malinen #define WMMAC_522_T04             32
90cd4e3c3eSJouni Malinen #define WMMAC_522_T06             33
91cd4e3c3eSJouni Malinen #define WMMAC_522_T06o            34
92cd4e3c3eSJouni Malinen #define WMMAC_524_T03             35
93cd4e3c3eSJouni Malinen #define WMMAC_524_T03i            36
94cd4e3c3eSJouni Malinen #define WMMAC_525_T07t10          37
95cd4e3c3eSJouni Malinen #endif /* CONFIG_WFA_WMM_AC */
96cd4e3c3eSJouni Malinen 
97cd4e3c3eSJouni Malinen /* WMM-AC APTS Msg IDs */
98cd4e3c3eSJouni Malinen /* WMMAC_APTS_DEFAULT Msg Id would be WMM-AC last test case
99cd4e3c3eSJouni Malinen  * (WMMAC_525_T07t10) + 1 */
100cd4e3c3eSJouni Malinen #define WMMAC_APTS_DEFAULT	38
101cd4e3c3eSJouni Malinen #define WMMAC_APTS_HELLO	(WMMAC_APTS_DEFAULT + 0x01)
102cd4e3c3eSJouni Malinen #define WMMAC_APTS_BCST		(WMMAC_APTS_HELLO + 0x01)
103cd4e3c3eSJouni Malinen #define WMMAC_APTS_CONFIRM	(WMMAC_APTS_BCST + 0x01)
104cd4e3c3eSJouni Malinen #define WMMAC_APTS_STOP		(WMMAC_APTS_CONFIRM + 0x01)
105cd4e3c3eSJouni Malinen #define WMMAC_APTS_CK_BE      	(WMMAC_APTS_STOP + 0x01)
106cd4e3c3eSJouni Malinen #define WMMAC_APTS_CK_BK      	(WMMAC_APTS_CK_BE + 0x01)
107cd4e3c3eSJouni Malinen #define WMMAC_APTS_CK_VI      	(WMMAC_APTS_CK_BK + 0x01)
108cd4e3c3eSJouni Malinen #define WMMAC_APTS_CK_VO      	(WMMAC_APTS_CK_VI + 0x01)
109cd4e3c3eSJouni Malinen #define WMMAC_APTS_RESET      	(WMMAC_APTS_CK_VO + 0x01)
110cd4e3c3eSJouni Malinen #define WMMAC_APTS_RESET_RESP 	(WMMAC_APTS_RESET + 0x01)
111cd4e3c3eSJouni Malinen #define WMMAC_APTS_RESET_STOP 	(WMMAC_APTS_RESET_RESP + 0x01)
112cd4e3c3eSJouni Malinen #define WMMAC_APTS_LAST       	99
113cd4e3c3eSJouni Malinen 
114cd4e3c3eSJouni Malinen #ifdef CONFIG_WFA_WMM_AC
115cd4e3c3eSJouni Malinen #define LAST_TC		WMMAC_525_T07t10
116cd4e3c3eSJouni Malinen #else /* CONFIG_WFA_WMM_AC */
117cd4e3c3eSJouni Malinen #define LAST_TC		M_W
118cd4e3c3eSJouni Malinen #endif /* CONFIG_WFA_WMM_AC */
119cd4e3c3eSJouni Malinen 
120cd4e3c3eSJouni Malinen struct apts_pkt {
121cd4e3c3eSJouni Malinen 	char *name;                     /* name of test */
122cd4e3c3eSJouni Malinen 	int cmd;                        /* msg num */
123cd4e3c3eSJouni Malinen 	int param0;                     /* number of packet exchanges */
124cd4e3c3eSJouni Malinen 	int param1;                     /* number of uplink frames */
125cd4e3c3eSJouni Malinen 	int param2;                     /* number of downlink frames */
126cd4e3c3eSJouni Malinen 	int param3;
127cd4e3c3eSJouni Malinen };
128cd4e3c3eSJouni Malinen 
129cd4e3c3eSJouni Malinen /* WMM-PS APTS messages */
130cd4e3c3eSJouni Malinen struct apts_pkt apts_pkts[] = {
131cd4e3c3eSJouni Malinen 	{0, -1, 0, 0, 0, 0},
132cd4e3c3eSJouni Malinen 	{"B.D", B_D, 0, 0, 0, 0},
133cd4e3c3eSJouni Malinen 	{"B.H", B_H, 0, 0, 0, 0},
134cd4e3c3eSJouni Malinen 	{"B.B", B_B, 0, 0, 0, 0},
135cd4e3c3eSJouni Malinen 	{"B.M", B_M, 0, 0, 0, 0},
136cd4e3c3eSJouni Malinen 	{"M.D", M_D, 0, 0, 0, 0},
137cd4e3c3eSJouni Malinen 	{"B.Z", B_Z, 0, 0, 0, 0},
138cd4e3c3eSJouni Malinen 	{"M.Y", M_Y, 0, 0, 0, 0},
139cd4e3c3eSJouni Malinen 	{"L.1", L_1, 0, 0, 0, 0},
140cd4e3c3eSJouni Malinen 	{"A.Y", A_Y, 0, 0, 0, 0},
141cd4e3c3eSJouni Malinen 	{"B.W", B_W, 0, 0, 0, 0},
142cd4e3c3eSJouni Malinen 	{"A.J", A_J, 0, 0, 0, 0},
143cd4e3c3eSJouni Malinen 	{"M.V", M_V, 0, 0, 0, 0},
144cd4e3c3eSJouni Malinen 	{"M.U", M_U, 0, 0, 0, 0},
145cd4e3c3eSJouni Malinen 	{"A.U", A_U, 0, 0, 0, 0},
146cd4e3c3eSJouni Malinen 	{"M.L", M_L, 0, 0, 0, 0},
147cd4e3c3eSJouni Malinen 	{"B.K", B_K, 0, 0, 0, 0},
148cd4e3c3eSJouni Malinen 	{"M.B", M_B, 0, 0, 0, 0},
149cd4e3c3eSJouni Malinen 	{"M.K", M_K, 0, 0, 0, 0},
150cd4e3c3eSJouni Malinen 	{"M.W", M_W, 0, 0, 0, 0},
151cd4e3c3eSJouni Malinen 
152cd4e3c3eSJouni Malinen 	{"APTS TX         ", APTS_DEFAULT, 0, 0, 0, 0},
153cd4e3c3eSJouni Malinen 	{"APTS Hello      ", APTS_HELLO, 0, 0, 0, 0},
154cd4e3c3eSJouni Malinen 	{"APTS Broadcast  ", APTS_BCST, 0, 0, 0, 0},
155cd4e3c3eSJouni Malinen 	{"APTS Confirm    ", APTS_CONFIRM, 0, 0, 0, 0},
156cd4e3c3eSJouni Malinen 	{"APTS STOP       ", APTS_STOP, 0, 0, 0, 0},
157cd4e3c3eSJouni Malinen 	{"APTS CK BE      ", APTS_CK_BE, 0, 0, 0, 0},
158cd4e3c3eSJouni Malinen 	{"APTS CK BK      ", APTS_CK_BK, 0, 0, 0, 0},
159cd4e3c3eSJouni Malinen 	{"APTS CK VI      ", APTS_CK_VI, 0, 0, 0, 0},
160cd4e3c3eSJouni Malinen 	{"APTS CK VO      ", APTS_CK_VO, 0, 0, 0, 0},
161cd4e3c3eSJouni Malinen 	{"APTS RESET      ", APTS_RESET, 0, 0, 0, 0},
162cd4e3c3eSJouni Malinen 	{"APTS RESET RESP ", APTS_RESET_RESP, 0, 0, 0, 0},
163cd4e3c3eSJouni Malinen 	{"APTS RESET STOP ", APTS_RESET_STOP, 0, 0, 0, 0},
164cd4e3c3eSJouni Malinen 	{0, 0, 0, 0, 0, 0}		/* APTS_LAST */
165cd4e3c3eSJouni Malinen };
166cd4e3c3eSJouni Malinen 
167cd4e3c3eSJouni Malinen /* WMM-AC APTS messages */
168cd4e3c3eSJouni Malinen struct apts_pkt wmm_ac_apts_pkts[] = {
169cd4e3c3eSJouni Malinen 	{0, -1, 0, 0, 0, 0},
170cd4e3c3eSJouni Malinen 	{"B.D", B_D, 0, 0, 0, 0},
171cd4e3c3eSJouni Malinen 	{"B.H", B_H, 0, 0, 0, 0},
172cd4e3c3eSJouni Malinen 	{"B.B", B_B, 0, 0, 0, 0},
173cd4e3c3eSJouni Malinen 	{"B.M", B_M, 0, 0, 0, 0},
174cd4e3c3eSJouni Malinen 	{"M.D", M_D, 0, 0, 0, 0},
175cd4e3c3eSJouni Malinen 	{"B.Z", B_Z, 0, 0, 0, 0},
176cd4e3c3eSJouni Malinen 	{"M.Y", M_Y, 0, 0, 0, 0},
177cd4e3c3eSJouni Malinen 	{"L.1", L_1, 0, 0, 0, 0},
178cd4e3c3eSJouni Malinen 	{"A.Y", A_Y, 0, 0, 0, 0},
179cd4e3c3eSJouni Malinen 	{"B.W", B_W, 0, 0, 0, 0},
180cd4e3c3eSJouni Malinen 	{"A.J", A_J, 0, 0, 0, 0},
181cd4e3c3eSJouni Malinen 	{"M.V", M_V, 0, 0, 0, 0},
182cd4e3c3eSJouni Malinen 	{"M.U", M_U, 0, 0, 0, 0},
183cd4e3c3eSJouni Malinen 	{"A.U", A_U, 0, 0, 0, 0},
184cd4e3c3eSJouni Malinen 	{"M.L", M_L, 0, 0, 0, 0},
185cd4e3c3eSJouni Malinen 	{"B.K", B_K, 0, 0, 0, 0},
186cd4e3c3eSJouni Malinen 	{"M.B", M_B, 0, 0, 0, 0},
187cd4e3c3eSJouni Malinen 	{"M.K", M_K, 0, 0, 0, 0},
188cd4e3c3eSJouni Malinen 	{"M.W", M_W, 0, 0, 0, 0},
189cd4e3c3eSJouni Malinen #ifdef CONFIG_WFA_WMM_AC
190cd4e3c3eSJouni Malinen 	{"422.T02B", WMMAC_422_T02B, 0, 0, 0, 0},
191cd4e3c3eSJouni Malinen 	{"422.T03A", WMMAC_422_T03A, 0, 0, 0, 0},
192cd4e3c3eSJouni Malinen 	{"422.T04A", WMMAC_422_T04B, 0, 0, 0, 0},
193cd4e3c3eSJouni Malinen 	{"422.T05B", WMMAC_422_T05B, 0, 0, 0, 0},
194cd4e3c3eSJouni Malinen 	{"422.T06B", WMMAC_422_T06B, 0, 0, 0, 0},
195cd4e3c3eSJouni Malinen 	{"422.T07B", WMMAC_422_T07B, 0, 0, 0, 0},
196cd4e3c3eSJouni Malinen 	{"422.T08B", WMMAC_422_T08B, 0, 0, 0, 0},
197cd4e3c3eSJouni Malinen 	{"423.T04", WMMAC_423_T04, 0, 0, 0, 0},
198cd4e3c3eSJouni Malinen 	{"424.T07", WMMAC_424_T07t14, 0, 0, 0, 0},
199cd4e3c3eSJouni Malinen 	{"425.T04", WMMAC_425_T04t06, 0, 0, 0, 0},
200cd4e3c3eSJouni Malinen 	{"521.T03", WMMAC_521_T03, 0, 0, 0, 0},
201cd4e3c3eSJouni Malinen 	{"521.T05", WMMAC_521_T05, 0, 0, 0, 0},
202cd4e3c3eSJouni Malinen 	{"522.T04", WMMAC_522_T04, 0, 0, 0, 0},
203cd4e3c3eSJouni Malinen 	{"522.T06", WMMAC_522_T06, 0, 0, 0, 0},
204cd4e3c3eSJouni Malinen 	{"522.T06o", WMMAC_522_T06o, 0, 0, 0, 0},
205cd4e3c3eSJouni Malinen 	{"524.T03", WMMAC_524_T03, 0, 0, 0, 0},
206cd4e3c3eSJouni Malinen 	{"524.T03i", WMMAC_524_T03i, 0, 0, 0, 0},
207cd4e3c3eSJouni Malinen 	{"525.T07", WMMAC_525_T07t10, 0, 0, 0, 0},
208cd4e3c3eSJouni Malinen #endif /* CONFIG_WFA_WMM_AC */
209cd4e3c3eSJouni Malinen 	{"APTS TX         ", WMMAC_APTS_DEFAULT, 0, 0, 0, 0},
210cd4e3c3eSJouni Malinen 	{"APTS Hello      ", WMMAC_APTS_HELLO, 0, 0, 0, 0},
211cd4e3c3eSJouni Malinen 	{"APTS Broadcast  ", WMMAC_APTS_BCST, 0, 0, 0, 0},
212cd4e3c3eSJouni Malinen 	{"APTS Confirm    ", WMMAC_APTS_CONFIRM, 0, 0, 0, 0},
213cd4e3c3eSJouni Malinen 	{"APTS STOP       ", WMMAC_APTS_STOP, 0, 0, 0, 0},
214cd4e3c3eSJouni Malinen 	{"APTS CK BE      ", WMMAC_APTS_CK_BE, 0, 0, 0, 0},
215cd4e3c3eSJouni Malinen 	{"APTS CK BK      ", WMMAC_APTS_CK_BK, 0, 0, 0, 0},
216cd4e3c3eSJouni Malinen 	{"APTS CK VI      ", WMMAC_APTS_CK_VI, 0, 0, 0, 0},
217cd4e3c3eSJouni Malinen 	{"APTS CK VO      ", WMMAC_APTS_CK_VO, 0, 0, 0, 0},
218cd4e3c3eSJouni Malinen 	{"APTS RESET      ", WMMAC_APTS_RESET, 0, 0, 0, 0},
219cd4e3c3eSJouni Malinen 	{"APTS RESET RESP ", WMMAC_APTS_RESET_RESP, 0, 0, 0, 0},
220cd4e3c3eSJouni Malinen 	{"APTS RESET STOP ", WMMAC_APTS_RESET_STOP, 0, 0, 0, 0},
221cd4e3c3eSJouni Malinen 	{0, 0, 0, 0, 0, 0}		/* WMMAC_APTS_LAST */
222cd4e3c3eSJouni Malinen };
223cd4e3c3eSJouni Malinen 
224cd4e3c3eSJouni Malinen /* WMM definitions */
225cd4e3c3eSJouni Malinen /* Atheros Madwifi use 0x88 for UPSD/Voice */
226cd4e3c3eSJouni Malinen #define TOS_VO7	    0xE0  /* 111 0  0000 (7)  AC_VO tos/dscp values default */
227cd4e3c3eSJouni Malinen #define TOS_VO      0xD0  /* AC_VO */
228cd4e3c3eSJouni Malinen #define TOS_VO6     0xC0  /* 110 0  0000 */
229cd4e3c3eSJouni Malinen /* console */
230cd4e3c3eSJouni Malinen #define TOS_VO2     0xB8  /* 101 1  1000 */
231cd4e3c3eSJouni Malinen /* DUT can set VO */
232cd4e3c3eSJouni Malinen 
233cd4e3c3eSJouni Malinen #define TOS_VI      0xA0  /* 101 0  0000 (5)  AC_VI */
234cd4e3c3eSJouni Malinen #define TOS_VI4     0x80  /* 100 0  0000 (4)  AC_VI */
235cd4e3c3eSJouni Malinen /* console */
236cd4e3c3eSJouni Malinen #define TOS_VI5     0x88  /* 100 0  1000 */
237cd4e3c3eSJouni Malinen 
238cd4e3c3eSJouni Malinen #define TOS_BE      0x00  /* 000 0  0000 (0)  AC_BE */
239cd4e3c3eSJouni Malinen #define TOS_EE      0x60  /* 011 0  0000 (3)  AC_BE */
240cd4e3c3eSJouni Malinen 
241cd4e3c3eSJouni Malinen #define TOS_BK      0x20  /* 001 0  0000 (1)  AC_BK */
242cd4e3c3eSJouni Malinen #define TOS_LE      0x40  /* 010 0  0000 (2)  AC_BK */
243cd4e3c3eSJouni Malinen 
244cd4e3c3eSJouni Malinen #define MAX_RETRY 3
245cd4e3c3eSJouni Malinen #define MAX_HELLO 20
246cd4e3c3eSJouni Malinen #define MAX_STOP 10
247cd4e3c3eSJouni Malinen #define LI_INT  2000000
248cd4e3c3eSJouni Malinen 
249cd4e3c3eSJouni Malinen enum uapsd_psave {
250cd4e3c3eSJouni Malinen 	PS_OFF = 0,
251cd4e3c3eSJouni Malinen 	PS_ON = 1
252cd4e3c3eSJouni Malinen };
253cd4e3c3eSJouni Malinen 
254cd4e3c3eSJouni Malinen typedef int (*uapsd_tx_state_func_ptr)(struct sigma_stream *,
255cd4e3c3eSJouni Malinen 				       u32, enum uapsd_psave, u32);
256cd4e3c3eSJouni Malinen 
257cd4e3c3eSJouni Malinen struct uapsd_tx_state_table {
258cd4e3c3eSJouni Malinen 	uapsd_tx_state_func_ptr state_func;
259cd4e3c3eSJouni Malinen 	u32 usr_priority;
260cd4e3c3eSJouni Malinen 	enum uapsd_psave ps;
261cd4e3c3eSJouni Malinen 	u32 sleep_dur;
262cd4e3c3eSJouni Malinen };
263cd4e3c3eSJouni Malinen 
264cd4e3c3eSJouni Malinen static int uapsd_tx_start(struct sigma_stream *s,
265cd4e3c3eSJouni Malinen 			  u32 usr_priority, enum uapsd_psave ps,
266cd4e3c3eSJouni Malinen 			  u32 sleep_duration);
267cd4e3c3eSJouni Malinen static int uapsd_tx_confirm(struct sigma_stream *s,
268cd4e3c3eSJouni Malinen 			    u32 usr_priority, enum uapsd_psave ps,
269cd4e3c3eSJouni Malinen 			    u32 sleep_duration);
270cd4e3c3eSJouni Malinen static int uapsd_tx_data(struct sigma_stream *s,
271cd4e3c3eSJouni Malinen 			 u32 usr_priority, enum uapsd_psave ps,
272cd4e3c3eSJouni Malinen 			 u32 sleep_duration);
273cd4e3c3eSJouni Malinen static int uapsd_tx_stop(struct sigma_stream *s,
274cd4e3c3eSJouni Malinen 			 u32 usr_priority, enum uapsd_psave ps,
275cd4e3c3eSJouni Malinen 			 u32 sleep_duration);
276cd4e3c3eSJouni Malinen static int uapsd_tx_cyclic(struct sigma_stream *s,
277cd4e3c3eSJouni Malinen 			   u32 usr_priority, enum uapsd_psave ps,
278cd4e3c3eSJouni Malinen 			   u32 sleep_duration);
279cd4e3c3eSJouni Malinen static int uapsd_tx_data_twice(struct sigma_stream *s,
280cd4e3c3eSJouni Malinen 			       u32 usr_priority, enum uapsd_psave ps,
281cd4e3c3eSJouni Malinen 			       u32 sleep_duration);
282cd4e3c3eSJouni Malinen 
283cd4e3c3eSJouni Malinen /* The DUT WMM send table for each of the test cases */
284cd4e3c3eSJouni Malinen struct uapsd_tx_state_table sta_uapsd_tx_tbl[LAST_TC + 1][11] = {
285cd4e3c3eSJouni Malinen 	/* B.D */
286cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
287cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
288cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
289cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
290cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
291cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
292cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}},
293cd4e3c3eSJouni Malinen 
294cd4e3c3eSJouni Malinen 	/* B.H */
295cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
296cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
297cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
298cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
299cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
300cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
301cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}},
302cd4e3c3eSJouni Malinen 
303cd4e3c3eSJouni Malinen 	/* B.B */
304cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
305cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
306cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
307cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
308cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
309cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BK, PS_ON, LI_INT / 2},
310cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
311cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
312cd4e3c3eSJouni Malinen 
313cd4e3c3eSJouni Malinen 	/* B.M */
314cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
315cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
316cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, 30000000},
317cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
318cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
319cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
320cd4e3c3eSJouni Malinen 
321cd4e3c3eSJouni Malinen 	/* M.D */
322cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
323cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
324cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
325cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
326cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
327cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
328cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
329cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
330cd4e3c3eSJouni Malinen 
331cd4e3c3eSJouni Malinen 	/* B.Z */
332cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
333cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
334cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT /2},
335cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
336cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
337cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
338cd4e3c3eSJouni Malinen 
339cd4e3c3eSJouni Malinen 	/* M.Y */
340cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
341cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
342cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
343cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
344cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
345cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
346cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
347cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
348cd4e3c3eSJouni Malinen 
349cd4e3c3eSJouni Malinen 	/* L.1 */
350cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
351cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
352cd4e3c3eSJouni Malinen 	 {uapsd_tx_cyclic, TOS_VO7, PS_ON, 20000},
353cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
354cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
355cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
356cd4e3c3eSJouni Malinen 
357cd4e3c3eSJouni Malinen 	/* A.Y */
358cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
359cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
360cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
361cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
362cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
363cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_OFF, LI_INT / 2},
364cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
365cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
366cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
367cd4e3c3eSJouni Malinen 
368cd4e3c3eSJouni Malinen 	/* B.W */
369cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
370cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
371cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
372cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
373cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
374cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
375cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
376cd4e3c3eSJouni Malinen 
377cd4e3c3eSJouni Malinen 	/* A.J */
378cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
379cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
380cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
381cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_OFF, LI_INT / 2},
382cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
383cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
384cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}},
385cd4e3c3eSJouni Malinen 
386cd4e3c3eSJouni Malinen 	/* M.V */
387cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
388cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
389cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
390cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
391cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
392cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
393cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
394cd4e3c3eSJouni Malinen 
395cd4e3c3eSJouni Malinen 	/* M.U */
396cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
397cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
398cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
399cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
400cd4e3c3eSJouni Malinen 	 {uapsd_tx_data_twice, TOS_VO7, PS_ON, LI_INT / 2},
401cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
402cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
403cd4e3c3eSJouni Malinen 
404cd4e3c3eSJouni Malinen 	/* A.U */
405cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
406cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
407cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
408cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_OFF, LI_INT / 2},
409cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
410cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_OFF, LI_INT / 2},
411cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
412cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_OFF, LI_INT / 2},
413cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
414cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}},
415cd4e3c3eSJouni Malinen 
416cd4e3c3eSJouni Malinen 	/* M.L */
417cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
418cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
419cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT /2},
420cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
421cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
422cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
423cd4e3c3eSJouni Malinen 
424cd4e3c3eSJouni Malinen 	/* B.K */
425cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
426cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
427cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
428cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
429cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
430cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
431cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
432cd4e3c3eSJouni Malinen 
433cd4e3c3eSJouni Malinen 	/* M.B */
434cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
435cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
436cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
437cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
438cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
439cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BK, PS_ON, LI_INT / 2},
440cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
441cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
442cd4e3c3eSJouni Malinen 
443cd4e3c3eSJouni Malinen 	/* M.K */
444cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
445cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
446cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
447cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
448cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
449cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
450cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
451cd4e3c3eSJouni Malinen 
452cd4e3c3eSJouni Malinen 	/* M.W */
453cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
454cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
455cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
456cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
457cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
458cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
459cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
460cd4e3c3eSJouni Malinen 
461cd4e3c3eSJouni Malinen #ifdef CONFIG_WFA_WMM_AC
462cd4e3c3eSJouni Malinen 	/* WMMAC_422_T02B */
463cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
464cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
465cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
466cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
467cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
468cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
469cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
470cd4e3c3eSJouni Malinen 
471cd4e3c3eSJouni Malinen 	/* WMMAC_422_T03B or  WMMAC_422_T03A */
472cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
473cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
474cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
475cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
476cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
477cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 20},
478cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
479cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
480cd4e3c3eSJouni Malinen 
481cd4e3c3eSJouni Malinen 	/* WMMAC_422_T04B/ATC7 */
482cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
483cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
484cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
485cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
486cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
487cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 20},
488cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
489cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
490cd4e3c3eSJouni Malinen 
491cd4e3c3eSJouni Malinen 	/* WMMAC_422_T05B/ATC8 */
492cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
493cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
494cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
495cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, 700000},
496cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
497cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
498cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
499cd4e3c3eSJouni Malinen 
500cd4e3c3eSJouni Malinen 	/* WMMAC_422_T06B/ATC9 */
501cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
502cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
503cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
504cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
505cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
506cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
507cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
508cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
509cd4e3c3eSJouni Malinen 
510cd4e3c3eSJouni Malinen 	/* WMMAC_422_T07B/ATC10 */
511cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
512cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
513cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
514cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 4},
515cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
516cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BK, PS_ON, LI_INT / 20},
517cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
518cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
519cd4e3c3eSJouni Malinen 
520cd4e3c3eSJouni Malinen 	/* WMMAC_422_T08B/ATC11 */
521cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
522cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
523cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
524cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 4},
525cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
526cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
527cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
528cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
529cd4e3c3eSJouni Malinen 
530cd4e3c3eSJouni Malinen 	/* WMMAC_423_T04 */
531cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
532cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
533cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
534cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
535cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
536cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
537cd4e3c3eSJouni Malinen 
538cd4e3c3eSJouni Malinen 	/* WMMAC_424_T07t14 */
539cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
540cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
541cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
542cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
543cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 20},
544cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
545cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
546cd4e3c3eSJouni Malinen 
547cd4e3c3eSJouni Malinen 	/* WMMAC_425_T04t06 */
548cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
549cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
550cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
551cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
552cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
553cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
554cd4e3c3eSJouni Malinen 
555cd4e3c3eSJouni Malinen 	/* WMMAC_521_T03 */
556cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
557cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
558cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
559cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
560cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
561cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
562cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
563cd4e3c3eSJouni Malinen 
564cd4e3c3eSJouni Malinen 	/* WMMAC_521_T05 */
565cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
566cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
567cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
568cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
569cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
570cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
571cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
572cd4e3c3eSJouni Malinen 
573cd4e3c3eSJouni Malinen 	/* WMMAC_522_T04 */
574cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
575cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
576cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
577cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
578cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
579cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
580cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
581cd4e3c3eSJouni Malinen 
582cd4e3c3eSJouni Malinen 	/* WMMAC_522_T06 */
583cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
584cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
585cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
586cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
587cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
588cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
589cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
590cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
591cd4e3c3eSJouni Malinen 
592cd4e3c3eSJouni Malinen 	/* WMMAC_522_T06o */
593cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
594cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
595cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
596cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
597cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
598cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
599cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
600cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
601cd4e3c3eSJouni Malinen 
602cd4e3c3eSJouni Malinen 	/* WMMAC_524_T03 */
603cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
604cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
605cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
606cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
607cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
608cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
609cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
610cd4e3c3eSJouni Malinen 
611cd4e3c3eSJouni Malinen 	/* WMMAC_524_T03i */
612cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
613cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
614cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
615cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
616cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
617cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
618cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
619cd4e3c3eSJouni Malinen 
620cd4e3c3eSJouni Malinen 	/* WMMAC_525_T07t10 */
621cd4e3c3eSJouni Malinen 	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
622cd4e3c3eSJouni Malinen 	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
623cd4e3c3eSJouni Malinen 	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
624cd4e3c3eSJouni Malinen 	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
625cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
626cd4e3c3eSJouni Malinen 	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
627cd4e3c3eSJouni Malinen #endif /* CONFIG_WFA_WMM_AC */
628cd4e3c3eSJouni Malinen };
629cd4e3c3eSJouni Malinen 
630cd4e3c3eSJouni Malinen typedef int (*uapsd_recv_state_func_ptr)(struct sigma_stream *s,
631cd4e3c3eSJouni Malinen 					 unsigned int *, int);
632cd4e3c3eSJouni Malinen 
633cd4e3c3eSJouni Malinen struct uapsd_rcv_state_table {
634cd4e3c3eSJouni Malinen 	uapsd_recv_state_func_ptr state_func;
635cd4e3c3eSJouni Malinen };
636cd4e3c3eSJouni Malinen 
637cd4e3c3eSJouni Malinen static int uapsd_rx_start(struct sigma_stream *s,
638cd4e3c3eSJouni Malinen 			  unsigned int *rxpkt, int rxpkt_len);
639cd4e3c3eSJouni Malinen static int uapsd_rx_data(struct sigma_stream *s,
640cd4e3c3eSJouni Malinen 			 unsigned int *rxpkt, int rxpkt_len);
641cd4e3c3eSJouni Malinen static int uapsd_rx_stop(struct sigma_stream *s,
642cd4e3c3eSJouni Malinen 			 unsigned int *rxpkt, int rxpkt_len);
643cd4e3c3eSJouni Malinen static int uapsd_rx_cyclic_vo(struct sigma_stream *s,
644cd4e3c3eSJouni Malinen 			      unsigned int *rxpkt, int rxpkt_len);
645cd4e3c3eSJouni Malinen 
646cd4e3c3eSJouni Malinen /* The DUT WMM send table for each of the test cases */
647cd4e3c3eSJouni Malinen struct uapsd_rcv_state_table sta_uapsd_recv_tbl[LAST_TC + 10][6] = {
648cd4e3c3eSJouni Malinen 	/* B.D */
649cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL}, {NULL},
650cd4e3c3eSJouni Malinen 	 {NULL}},
651cd4e3c3eSJouni Malinen 	/* B.H */
652cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
653cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
654cd4e3c3eSJouni Malinen 	/* B.B */
655cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
656cd4e3c3eSJouni Malinen 	/* B.M */
657cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
658cd4e3c3eSJouni Malinen 	/* M.D */
659cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
660cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
661cd4e3c3eSJouni Malinen 	/* B.Z */
662cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
663cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
664cd4e3c3eSJouni Malinen 	/* M.Y */
665cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
666cd4e3c3eSJouni Malinen 	 {uapsd_rx_stop}, {NULL}},
667cd4e3c3eSJouni Malinen 	/* L.1 */
668cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_cyclic_vo}, {NULL}, {NULL}, {NULL},
669cd4e3c3eSJouni Malinen 	 {NULL}},
670cd4e3c3eSJouni Malinen 	/* A.Y */
671cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
672cd4e3c3eSJouni Malinen 	 {uapsd_rx_stop}, {NULL}},
673cd4e3c3eSJouni Malinen 	/* B.W */
674cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
675cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
676cd4e3c3eSJouni Malinen 	/* A.J */
677cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
678cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
679cd4e3c3eSJouni Malinen 	/* M.V */
680cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
681cd4e3c3eSJouni Malinen 	 {uapsd_rx_stop}, {NULL}},
682cd4e3c3eSJouni Malinen 	/* M.U */
683cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
684cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
685cd4e3c3eSJouni Malinen 	/* A.U */
686cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
687cd4e3c3eSJouni Malinen 	 {uapsd_rx_stop}, {NULL}},
688cd4e3c3eSJouni Malinen 	/* M.L */
689cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL}, {NULL},
690cd4e3c3eSJouni Malinen 	 {NULL}},
691cd4e3c3eSJouni Malinen 	/* B.K */
692cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
693cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
694cd4e3c3eSJouni Malinen 	/* M.B */
695cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
696cd4e3c3eSJouni Malinen 	/* M.K */
697cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
698cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
699cd4e3c3eSJouni Malinen 	/* M.W */
700cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
701cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
702cd4e3c3eSJouni Malinen 
703cd4e3c3eSJouni Malinen #ifdef CONFIG_WFA_WMM_AC
704cd4e3c3eSJouni Malinen 	/* WMMAC_422_T02B */
705cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
706cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
707cd4e3c3eSJouni Malinen 	/* WMMAC_422_T03B or WMMAC_422_T03A */
708cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
709cd4e3c3eSJouni Malinen 	 {uapsd_rx_stop}, {NULL}},
710cd4e3c3eSJouni Malinen 	/* WMMAC_422_T04B */
711cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
712cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
713cd4e3c3eSJouni Malinen 	/* WMMAC_422_T05B */
714cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
715cd4e3c3eSJouni Malinen 	 {uapsd_rx_stop}, {NULL}},
716cd4e3c3eSJouni Malinen 	/* WMMAC_422_T06B */
717cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
718cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
719cd4e3c3eSJouni Malinen 	/* WMMAC_422_T07B */
720cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
721cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
722cd4e3c3eSJouni Malinen 	/* WMMAC_422_T08B */
723cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
724cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
725cd4e3c3eSJouni Malinen 	/* WMMAC_423_T04 */
726cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL}, {NULL},
727cd4e3c3eSJouni Malinen 	 {NULL}},
728cd4e3c3eSJouni Malinen 	/* WMMAC_424_T07t14 */
729cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
730cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
731cd4e3c3eSJouni Malinen 	/* WMMAC_425_T04t06 */
732cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
733cd4e3c3eSJouni Malinen 	/* WMMAC_521_T03 */
734cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
735cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
736cd4e3c3eSJouni Malinen 	/* WMMAC_521_T05 */
737cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
738cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
739cd4e3c3eSJouni Malinen 	/* WMMAC_522_T04 */
740cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
741cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
742cd4e3c3eSJouni Malinen 	/* WMMAC_522_T06 */
743cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
744cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
745cd4e3c3eSJouni Malinen 	/* WMMAC_522_T06o */
746cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
747cd4e3c3eSJouni Malinen 	 {uapsd_rx_data}, {uapsd_rx_stop}},
748cd4e3c3eSJouni Malinen 	/* WMMAC_524_T03 */
749cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
750cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
751cd4e3c3eSJouni Malinen 	/* WMMAC_524_T03i */
752cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
753cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
754cd4e3c3eSJouni Malinen 	/* WMMAC_525_T07t10 */
755cd4e3c3eSJouni Malinen 	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL},
756cd4e3c3eSJouni Malinen 	 {NULL}, {NULL}},
757cd4e3c3eSJouni Malinen #endif /* CONFIG_WFA_WMM_AC */
758cd4e3c3eSJouni Malinen };
759cd4e3c3eSJouni Malinen 
76079594049SPradeep Reddy POTTETI /* U-APSD console data */
76179594049SPradeep Reddy POTTETI #define NETWORK_CLASS_C 0x00ffffff
76279594049SPradeep Reddy POTTETI #define UAPSD_CONSOLE_TIMER 200
76379594049SPradeep Reddy POTTETI 
76479594049SPradeep Reddy POTTETI typedef int (*uapsd_console_state_func_ptr)(struct sigma_stream *s,
76579594049SPradeep Reddy POTTETI 					    unsigned int *rx_msg_buf, int len);
76679594049SPradeep Reddy POTTETI struct uapsd_console_state_table {
76779594049SPradeep Reddy POTTETI 	uapsd_console_state_func_ptr state_func;
76879594049SPradeep Reddy POTTETI };
76979594049SPradeep Reddy POTTETI 
77079594049SPradeep Reddy POTTETI static int console_rx_hello(struct sigma_stream *, unsigned int *, int);
77179594049SPradeep Reddy POTTETI static int console_rx_confirm(struct sigma_stream *, unsigned int *, int);
77279594049SPradeep Reddy POTTETI static int console_rx_confirm_tx_vi(struct sigma_stream *, unsigned int *, int);
77379594049SPradeep Reddy POTTETI static int console_rx_tx_stop(struct sigma_stream *, unsigned int *, int);
77479594049SPradeep Reddy POTTETI static int console_rx_vo_tx_stop(struct sigma_stream *, unsigned int *, int);
77579594049SPradeep Reddy POTTETI static int console_rx_vi_tx_stop(struct sigma_stream *, unsigned int *, int);
77679594049SPradeep Reddy POTTETI static int console_rx_vi_tx_vi(struct sigma_stream *, unsigned int *, int);
77779594049SPradeep Reddy POTTETI static int console_rx_vi_tx_bcst(struct sigma_stream *, unsigned int *, int);
77879594049SPradeep Reddy POTTETI static int console_rx_be_tx_bcst(struct sigma_stream *, unsigned int *, int);
77979594049SPradeep Reddy POTTETI static int console_rx_be_tx_be(struct sigma_stream *, unsigned int *, int);
78079594049SPradeep Reddy POTTETI static int console_rx_be_tx_be_tx_stop(struct sigma_stream *, unsigned int *,
78179594049SPradeep Reddy POTTETI 				       int);
78279594049SPradeep Reddy POTTETI static int console_rx_bk_tx_stop(struct sigma_stream *, unsigned int *, int);
78379594049SPradeep Reddy POTTETI static int console_rx_vi_tx_vo_tx_stop(struct sigma_stream *, unsigned int *,
78479594049SPradeep Reddy POTTETI 				       int);
78579594049SPradeep Reddy POTTETI static int console_rx_vo_tx_bcst_tx_stop(struct sigma_stream *, unsigned int *,
78679594049SPradeep Reddy POTTETI 					 int);
78779594049SPradeep Reddy POTTETI static int console_rx_vi_tx_be(struct sigma_stream *, unsigned int *, int);
78879594049SPradeep Reddy POTTETI static int console_rx_vi_tx_bk(struct sigma_stream *, unsigned int *, int);
78979594049SPradeep Reddy POTTETI static int console_rx_vo_tx_vo_cyclic(struct sigma_stream *, unsigned int *,
79079594049SPradeep Reddy POTTETI 				      int);
79179594049SPradeep Reddy POTTETI static int console_rx_vo_tx_vo(struct sigma_stream *, unsigned int *, int);
79279594049SPradeep Reddy POTTETI static int console_rx_vo_tx_vo_tx_stop(struct sigma_stream *, unsigned int *,
79379594049SPradeep Reddy POTTETI 				       int);
79479594049SPradeep Reddy POTTETI static int console_rx_vo_tx_2vo(struct sigma_stream *, unsigned int *, int);
79579594049SPradeep Reddy POTTETI static int console_rx_be_tx_bcst_tx_stop(struct sigma_stream *, unsigned int *,
79679594049SPradeep Reddy POTTETI 					 int);
79779594049SPradeep Reddy POTTETI static int console_rx_vo(struct sigma_stream *, unsigned int *, int);
79879594049SPradeep Reddy POTTETI static int console_rx_vi(struct sigma_stream *, unsigned int *, int);
79979594049SPradeep Reddy POTTETI static int console_rx_be(struct sigma_stream *, unsigned int *, int);
80079594049SPradeep Reddy POTTETI static int console_rx_vo_tx_all_tx_stop(struct sigma_stream *, unsigned int *,
80179594049SPradeep Reddy POTTETI 					int);
80279594049SPradeep Reddy POTTETI static int console_rx_vi_tx_vi_tx_stop(struct sigma_stream *, unsigned int *,
80379594049SPradeep Reddy POTTETI 				       int);
80479594049SPradeep Reddy POTTETI 
80579594049SPradeep Reddy POTTETI /* U-APSD console process table for each of the test cases */
80679594049SPradeep Reddy POTTETI struct uapsd_console_state_table uapsd_console_state_tbl[LAST_TC + 1][10] = {
80779594049SPradeep Reddy POTTETI 	/* Ini */
80879594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_vo},
80979594049SPradeep Reddy POTTETI 	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},
81079594049SPradeep Reddy POTTETI 
81179594049SPradeep Reddy POTTETI 	/* B.D */
81279594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_vo},
81379594049SPradeep Reddy POTTETI 	 {console_rx_vo_tx_stop}, {console_rx_tx_stop}, {console_rx_tx_stop},
81479594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}, {NULL}},
81579594049SPradeep Reddy POTTETI 
81679594049SPradeep Reddy POTTETI 	/* B.H */
81779594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_2vo},
81879594049SPradeep Reddy POTTETI 	 {console_rx_vo_tx_stop}, {console_rx_tx_stop}, {console_rx_tx_stop},
81979594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}, {NULL}},
82079594049SPradeep Reddy POTTETI 
82179594049SPradeep Reddy POTTETI 	/* B.B */
82279594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo},
82379594049SPradeep Reddy POTTETI 	 {console_rx_vi}, {console_rx_be}, {console_rx_bk_tx_stop},
82479594049SPradeep Reddy POTTETI 	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}},
82579594049SPradeep Reddy POTTETI 
82679594049SPradeep Reddy POTTETI 	/* B.M */
82779594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_stop},
82879594049SPradeep Reddy POTTETI 	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},
82979594049SPradeep Reddy POTTETI 
83079594049SPradeep Reddy POTTETI 	/* M.D */
83179594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_be},
83279594049SPradeep Reddy POTTETI 	 {console_rx_vi_tx_bk}, {console_rx_vi_tx_vi},
83379594049SPradeep Reddy POTTETI 	 {console_rx_vi_tx_vo_tx_stop}, {console_rx_tx_stop},
83479594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}},
83579594049SPradeep Reddy POTTETI 
83679594049SPradeep Reddy POTTETI 	/* B.Z */
83779594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm_tx_vi},
83879594049SPradeep Reddy POTTETI 	 {console_rx_vo_tx_bcst_tx_stop}, {console_rx_tx_stop},
83979594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}, {NULL}},
84079594049SPradeep Reddy POTTETI 
84179594049SPradeep Reddy POTTETI 	/* M.Y */
84279594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
84379594049SPradeep Reddy POTTETI 	 {console_rx_vo}, {console_rx_be_tx_be},
84479594049SPradeep Reddy POTTETI 	 {console_rx_be_tx_bcst_tx_stop}, {console_rx_tx_stop},
84579594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}},
84679594049SPradeep Reddy POTTETI 
84779594049SPradeep Reddy POTTETI 	/* L.1 */
84879594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_vo_cyclic},
84979594049SPradeep Reddy POTTETI 	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},
85079594049SPradeep Reddy POTTETI 
85179594049SPradeep Reddy POTTETI 	/* A.Y */
85279594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
85379594049SPradeep Reddy POTTETI 	 {console_rx_vo}, {console_rx_be_tx_be}, {console_rx_be},
85479594049SPradeep Reddy POTTETI 	 {console_rx_be_tx_bcst_tx_stop}, {console_rx_tx_stop}, {NULL}, {NULL}},
85579594049SPradeep Reddy POTTETI 
85679594049SPradeep Reddy POTTETI 	/* B.W */
85779594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_bcst},
85879594049SPradeep Reddy POTTETI 	 {console_rx_vi_tx_bcst}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
85979594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}, {NULL}},
86079594049SPradeep Reddy POTTETI 
86179594049SPradeep Reddy POTTETI 	/* A.J */
86279594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo},
86379594049SPradeep Reddy POTTETI 	 {console_rx_vo_tx_all_tx_stop}, {console_rx_tx_stop},
86479594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},
86579594049SPradeep Reddy POTTETI 
86679594049SPradeep Reddy POTTETI 	/* M.V */
86779594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
86879594049SPradeep Reddy POTTETI 	 {console_rx_be_tx_be}, {console_rx_vi_tx_vi_tx_stop},
86979594049SPradeep Reddy POTTETI 	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
87079594049SPradeep Reddy POTTETI 
87179594049SPradeep Reddy POTTETI 	/* M.U */
87279594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
87379594049SPradeep Reddy POTTETI 	 {console_rx_be_tx_be}, {console_rx_vo_tx_vo},
87479594049SPradeep Reddy POTTETI 	 {console_rx_vo_tx_vo_tx_stop}, {console_rx_tx_stop},
87579594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}},
87679594049SPradeep Reddy POTTETI 
87779594049SPradeep Reddy POTTETI 	/* A.U */
87879594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
87979594049SPradeep Reddy POTTETI 	 {console_rx_be}, {console_rx_be_tx_be}, {console_rx_be},
88079594049SPradeep Reddy POTTETI 	 {console_rx_vo_tx_vo}, {console_rx_vo_tx_stop}, {console_rx_tx_stop},
88179594049SPradeep Reddy POTTETI 	 {NULL}},
88279594049SPradeep Reddy POTTETI 
88379594049SPradeep Reddy POTTETI 	/* M.L */
88479594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm},
88579594049SPradeep Reddy POTTETI 	 {console_rx_be_tx_be_tx_stop}, {console_rx_tx_stop},
88679594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},
88779594049SPradeep Reddy POTTETI 
88879594049SPradeep Reddy POTTETI 	/* B.K */
88979594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
89079594049SPradeep Reddy POTTETI 	 {console_rx_be_tx_be}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
89179594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}, {NULL}},
89279594049SPradeep Reddy POTTETI 
89379594049SPradeep Reddy POTTETI 	/* M.B */
89479594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo},
89579594049SPradeep Reddy POTTETI 	 {console_rx_vi}, {console_rx_be}, {console_rx_bk_tx_stop},
89679594049SPradeep Reddy POTTETI 	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}},
89779594049SPradeep Reddy POTTETI 
89879594049SPradeep Reddy POTTETI 	/* M.K */
89979594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
90079594049SPradeep Reddy POTTETI 	 {console_rx_be_tx_be}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
90179594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}, {NULL}},
90279594049SPradeep Reddy POTTETI 
90379594049SPradeep Reddy POTTETI 	/* M.W */
90479594049SPradeep Reddy POTTETI 	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_bcst},
90579594049SPradeep Reddy POTTETI 	 {console_rx_be_tx_bcst}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
90679594049SPradeep Reddy POTTETI 	 {NULL}, {NULL}, {NULL}, {NULL}}
90779594049SPradeep Reddy POTTETI };
90879594049SPradeep Reddy POTTETI 
909cd4e3c3eSJouni Malinen 
910cd4e3c3eSJouni Malinen static void create_apts_pkt(int msg, unsigned int txbuf[],
911cd4e3c3eSJouni Malinen 			    u32 uapsd_dscp, struct sigma_stream *s)
912cd4e3c3eSJouni Malinen {
913cd4e3c3eSJouni Malinen 	struct apts_pkt *t;
914cd4e3c3eSJouni Malinen 
915cd4e3c3eSJouni Malinen 	if (!sigma_wmm_ac)
916cd4e3c3eSJouni Malinen 		t = &apts_pkts[msg];
917cd4e3c3eSJouni Malinen 	else
918cd4e3c3eSJouni Malinen 		t = &wmm_ac_apts_pkts[msg];
919cd4e3c3eSJouni Malinen 
920cd4e3c3eSJouni Malinen 	txbuf[0] = s->rx_cookie;
921cd4e3c3eSJouni Malinen 	txbuf[1] = uapsd_dscp;
922cd4e3c3eSJouni Malinen 	txbuf[2] = 0;
923cd4e3c3eSJouni Malinen 	txbuf[3] = 0;
924cd4e3c3eSJouni Malinen 	txbuf[4] = 0;
925cd4e3c3eSJouni Malinen 	txbuf[5] = 0;
926cd4e3c3eSJouni Malinen 	txbuf[9] = s->sta_id;
927cd4e3c3eSJouni Malinen 	txbuf[10] = t->cmd;
928cd4e3c3eSJouni Malinen 	strcpy((char *) &txbuf[11], t->name);
929cd4e3c3eSJouni Malinen }
930cd4e3c3eSJouni Malinen 
931cd4e3c3eSJouni Malinen 
932cd4e3c3eSJouni Malinen static int uapsd_tx_start(struct sigma_stream *s,
933cd4e3c3eSJouni Malinen 			  u32 usr_priority, enum uapsd_psave ps,
934cd4e3c3eSJouni Malinen 			  u32 sleep_duration)
935cd4e3c3eSJouni Malinen {
936cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
937cd4e3c3eSJouni Malinen 	int pktlen = 256;
938cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
939cd4e3c3eSJouni Malinen 	u32 msgid;
940cd4e3c3eSJouni Malinen 
941cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_start");
942cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
943cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
944cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
945cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
946cd4e3c3eSJouni Malinen 		return -1;
947cd4e3c3eSJouni Malinen 	}
948cd4e3c3eSJouni Malinen 
949cd4e3c3eSJouni Malinen 	/* check whether a test case is received */
950cd4e3c3eSJouni Malinen 	if (s->uapsd_rx_state > 0) {
951cd4e3c3eSJouni Malinen 		s->uapsd_tx_state++;
952cd4e3c3eSJouni Malinen 	} else {
953cd4e3c3eSJouni Malinen 		set_ps(s->ifname, dut, 0);
954cd4e3c3eSJouni Malinen 		if (s->tx_hello_cnt <= MAX_HELLO) {
955cd4e3c3eSJouni Malinen 			memset(tpkt, 0, s->payload_size);
956cd4e3c3eSJouni Malinen 			/* if test is for WMM-AC set APTS HELLO to 39 */
957cd4e3c3eSJouni Malinen 			msgid = sigma_wmm_ac ? WMMAC_APTS_HELLO : APTS_HELLO;
958cd4e3c3eSJouni Malinen 			create_apts_hello_pkt(msgid, tpkt, s->tx_hello_cnt);
959cd4e3c3eSJouni Malinen 			if (send(s->sock, tpkt, pktlen, 0) <= 0) {
960cd4e3c3eSJouni Malinen 				sigma_dut_print(dut, DUT_MSG_ERROR,
961cd4e3c3eSJouni Malinen 						"send_uapsd: Send failed");
962cd4e3c3eSJouni Malinen 			}
963cd4e3c3eSJouni Malinen 			s->tx_hello_cnt++;
964cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
965cd4e3c3eSJouni Malinen 					"send_uapsd: Hello Sent cnt %d",
966cd4e3c3eSJouni Malinen 					s->tx_hello_cnt);
967cd4e3c3eSJouni Malinen 			sleep(1);
968cd4e3c3eSJouni Malinen 		} else {
969cd4e3c3eSJouni Malinen 			printf("\n send_uapsd: Too many Hellos Sent... \n");
970cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
971cd4e3c3eSJouni Malinen 					"send_uapsd: Too many Hellos sent... ");
972cd4e3c3eSJouni Malinen 			s->stop = 1;
973cd4e3c3eSJouni Malinen 		}
974cd4e3c3eSJouni Malinen 	}
975cd4e3c3eSJouni Malinen 
976cd4e3c3eSJouni Malinen 	free(tpkt);
977cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
978cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_start uapsd_sta_tc %d uapsd_tx_state %d",
979cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
980cd4e3c3eSJouni Malinen 
981cd4e3c3eSJouni Malinen 	return 0;
982cd4e3c3eSJouni Malinen }
983cd4e3c3eSJouni Malinen 
984cd4e3c3eSJouni Malinen 
985cd4e3c3eSJouni Malinen static int uapsd_tx_confirm(struct sigma_stream *s,
986cd4e3c3eSJouni Malinen 			    u32 usr_priority, enum uapsd_psave ps,
987cd4e3c3eSJouni Malinen 			    u32 sleep_duration)
988cd4e3c3eSJouni Malinen {
989cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
990cd4e3c3eSJouni Malinen 	int pktlen = 256;
991cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
992cd4e3c3eSJouni Malinen 	u32 msgid;
993cd4e3c3eSJouni Malinen 
994cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
995cd4e3c3eSJouni Malinen 			"send_uapsd: Enter uapsd_tx_confirm");
996cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
997cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
998cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
999cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
1000cd4e3c3eSJouni Malinen 		return -1;
1001cd4e3c3eSJouni Malinen 	}
1002cd4e3c3eSJouni Malinen 
1003cd4e3c3eSJouni Malinen 	usleep(sleep_duration);
1004cd4e3c3eSJouni Malinen 	set_ps(s->ifname, dut, ps);
1005cd4e3c3eSJouni Malinen 	memset(tpkt, 0, s->payload_size);
1006cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS CONFIRM to 41 */
1007cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_CONFIRM : APTS_CONFIRM;
1008cd4e3c3eSJouni Malinen 	create_apts_pkt(msgid, tpkt, usr_priority, s);
1009cd4e3c3eSJouni Malinen 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1010cd4e3c3eSJouni Malinen 		   sizeof(usr_priority));
1011cd4e3c3eSJouni Malinen 	if (send(s->sock, tpkt, pktlen, 0) > 0) {
1012cd4e3c3eSJouni Malinen 		s->uapsd_tx_state++;
1013cd4e3c3eSJouni Malinen 	} else {
1014cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1015cd4e3c3eSJouni Malinen 				"send_uapsd: Send failed");
1016cd4e3c3eSJouni Malinen 	}
1017cd4e3c3eSJouni Malinen 	free(tpkt);
1018cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1019cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_confirm uapsd_sta_tc %d uapsd_tx_state %d",
1020cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
1021cd4e3c3eSJouni Malinen 
1022cd4e3c3eSJouni Malinen 	return 0;
1023cd4e3c3eSJouni Malinen }
1024cd4e3c3eSJouni Malinen 
1025cd4e3c3eSJouni Malinen 
1026cd4e3c3eSJouni Malinen static int uapsd_tx_data(struct sigma_stream *s,
1027cd4e3c3eSJouni Malinen 			 u32 usr_priority, enum uapsd_psave ps,
1028cd4e3c3eSJouni Malinen 			 u32 sleep_duration)
1029cd4e3c3eSJouni Malinen {
1030cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
1031cd4e3c3eSJouni Malinen 	int pktlen = 256;
1032cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1033cd4e3c3eSJouni Malinen 	u32 msgid;
1034cd4e3c3eSJouni Malinen 
1035cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_data");
1036cd4e3c3eSJouni Malinen 
1037cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
1038cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
1039cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1040cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
1041cd4e3c3eSJouni Malinen 		return -1;
1042cd4e3c3eSJouni Malinen 	}
1043cd4e3c3eSJouni Malinen 	usleep(sleep_duration);
1044cd4e3c3eSJouni Malinen 	set_ps(s->ifname, dut, ps);
1045cd4e3c3eSJouni Malinen 	memset(tpkt, 0, s->payload_size);
1046cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS DEFAULT to 38 */
1047cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1048cd4e3c3eSJouni Malinen 	create_apts_pkt(msgid, tpkt, usr_priority, s);
1049cd4e3c3eSJouni Malinen 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1050cd4e3c3eSJouni Malinen 		   sizeof(usr_priority));
1051cd4e3c3eSJouni Malinen 	if (send(s->sock, tpkt, pktlen, 0) > 0) {
1052cd4e3c3eSJouni Malinen 		s->uapsd_tx_state++;
1053cd4e3c3eSJouni Malinen 	} else {
1054cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1055cd4e3c3eSJouni Malinen 				"send_uapsd: Send failed");
1056cd4e3c3eSJouni Malinen 	}
1057cd4e3c3eSJouni Malinen 
1058cd4e3c3eSJouni Malinen 	free(tpkt);
1059cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1060cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_data uapsd_sta_tc %d uapsd_tx_state %d",
1061cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
1062cd4e3c3eSJouni Malinen 
1063cd4e3c3eSJouni Malinen 	return 0;
1064cd4e3c3eSJouni Malinen }
1065cd4e3c3eSJouni Malinen 
1066cd4e3c3eSJouni Malinen 
1067cd4e3c3eSJouni Malinen static int uapsd_tx_data_twice(struct sigma_stream *s,
1068cd4e3c3eSJouni Malinen 			       u32 usr_priority, enum uapsd_psave ps,
1069cd4e3c3eSJouni Malinen 			       u32 sleep_duration)
1070cd4e3c3eSJouni Malinen {
1071cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
1072cd4e3c3eSJouni Malinen 	int pktlen = 256, i = 0, tx_status = 0;
1073cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1074cd4e3c3eSJouni Malinen 	u32 msgid;
1075cd4e3c3eSJouni Malinen 
1076cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1077cd4e3c3eSJouni Malinen 			"send_uapsd: Enter uapsd_tx_data_twice");
1078cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
1079cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
1080cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1081cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
1082cd4e3c3eSJouni Malinen 		return -1;
1083cd4e3c3eSJouni Malinen 	}
1084cd4e3c3eSJouni Malinen 	usleep(sleep_duration);
1085cd4e3c3eSJouni Malinen 	set_ps(s->ifname, dut, ps);
1086cd4e3c3eSJouni Malinen 	memset(tpkt, 0, s->payload_size);
1087cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS DEFAULT to 38 */
1088cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1089cd4e3c3eSJouni Malinen 	create_apts_pkt(msgid, tpkt, usr_priority, s);
1090cd4e3c3eSJouni Malinen 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1091cd4e3c3eSJouni Malinen 		   sizeof(usr_priority));
1092cd4e3c3eSJouni Malinen 	for(i = 0; i < 2; i++) {
1093cd4e3c3eSJouni Malinen 		if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1094cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
1095cd4e3c3eSJouni Malinen 					"send_uapsd: Send failed");
1096cd4e3c3eSJouni Malinen 			tx_status = -1;
1097cd4e3c3eSJouni Malinen 		}
1098cd4e3c3eSJouni Malinen 	}
1099cd4e3c3eSJouni Malinen 	if (tx_status == 0)
1100cd4e3c3eSJouni Malinen 		s->uapsd_tx_state++;
1101cd4e3c3eSJouni Malinen 	free(tpkt);
1102cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1103cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_data_twice uapsd_sta_tc %d uapsd_tx_state %d",
1104cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
1105cd4e3c3eSJouni Malinen 
1106cd4e3c3eSJouni Malinen 	return 0;
1107cd4e3c3eSJouni Malinen }
1108cd4e3c3eSJouni Malinen 
1109cd4e3c3eSJouni Malinen 
1110cd4e3c3eSJouni Malinen static int uapsd_tx_cyclic(struct sigma_stream *s,
1111cd4e3c3eSJouni Malinen 			   u32 usr_priority, enum uapsd_psave ps,
1112cd4e3c3eSJouni Malinen 			   u32 sleep_duration)
1113cd4e3c3eSJouni Malinen {
1114cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
1115cd4e3c3eSJouni Malinen 	int pktlen = 256, i = 0, tx_status = 0;
1116cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1117cd4e3c3eSJouni Malinen 	u32 msgid;
1118cd4e3c3eSJouni Malinen 
1119cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_cyclic");
1120cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
1121cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
1122cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1123cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
1124cd4e3c3eSJouni Malinen 		return -1;
1125cd4e3c3eSJouni Malinen 	}
1126cd4e3c3eSJouni Malinen 
1127cd4e3c3eSJouni Malinen 	set_ps(s->ifname, dut, ps);
1128cd4e3c3eSJouni Malinen 	for (i = 0; i < 3000; i++) {
1129cd4e3c3eSJouni Malinen 		usleep(sleep_duration);
1130cd4e3c3eSJouni Malinen 		memset(tpkt, 0, s->payload_size);
1131cd4e3c3eSJouni Malinen 		/* if test is for WMM-AC set APTS DEFAULT to 38 */
1132cd4e3c3eSJouni Malinen 		msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1133cd4e3c3eSJouni Malinen 		create_apts_pkt(msgid, tpkt, usr_priority, s);
1134cd4e3c3eSJouni Malinen 		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1135cd4e3c3eSJouni Malinen 			   sizeof(usr_priority));
1136cd4e3c3eSJouni Malinen 		if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1137cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
1138cd4e3c3eSJouni Malinen 					"send_uapsd: Send failed");
1139cd4e3c3eSJouni Malinen 			tx_status = -1;
1140cd4e3c3eSJouni Malinen 		}
1141cd4e3c3eSJouni Malinen 	}
1142cd4e3c3eSJouni Malinen 	if (tx_status == 0)
1143cd4e3c3eSJouni Malinen 		s->uapsd_tx_state++;
1144cd4e3c3eSJouni Malinen 	free(tpkt);
1145cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1146cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_cyclic uapsd_sta_tc %d uapsd_tx_state %d",
1147cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
1148cd4e3c3eSJouni Malinen 
1149cd4e3c3eSJouni Malinen 	return 0;
1150cd4e3c3eSJouni Malinen }
1151cd4e3c3eSJouni Malinen 
1152cd4e3c3eSJouni Malinen 
1153cd4e3c3eSJouni Malinen static int uapsd_tx_stop(struct sigma_stream *s,
1154cd4e3c3eSJouni Malinen 			 u32 usr_priority, enum uapsd_psave ps,
1155cd4e3c3eSJouni Malinen 			 u32 sleep_duration)
1156cd4e3c3eSJouni Malinen {
1157cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
1158cd4e3c3eSJouni Malinen 	int pktlen = 256;
1159cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1160cd4e3c3eSJouni Malinen 	u32 msgid;
1161cd4e3c3eSJouni Malinen 
1162cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_stop");
1163cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
1164cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
1165cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1166cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
1167cd4e3c3eSJouni Malinen 		return -1;
1168cd4e3c3eSJouni Malinen 	}
1169cd4e3c3eSJouni Malinen 	usleep(sleep_duration);
1170cd4e3c3eSJouni Malinen 	if(!s->tx_stop_cnt)
1171cd4e3c3eSJouni Malinen 		set_ps(s->ifname, dut, ps);
1172cd4e3c3eSJouni Malinen 	s->tx_stop_cnt++;
1173cd4e3c3eSJouni Malinen 	memset(tpkt, 0, s->payload_size);
1174cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS STOP to 42 */
1175cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_STOP : APTS_STOP;
1176cd4e3c3eSJouni Malinen 	create_apts_pkt(msgid, tpkt, usr_priority, s);
1177cd4e3c3eSJouni Malinen 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1178cd4e3c3eSJouni Malinen 		   sizeof(usr_priority));
1179cd4e3c3eSJouni Malinen 	if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1180cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1181cd4e3c3eSJouni Malinen 				"send_uapsd: Send failed");
1182cd4e3c3eSJouni Malinen 	}
1183cd4e3c3eSJouni Malinen 	pthread_mutex_lock(&s->tx_thr_mutex);
1184cd4e3c3eSJouni Malinen 	pthread_cond_signal(&s->tx_thr_cond);
1185cd4e3c3eSJouni Malinen 	pthread_mutex_unlock(&s->tx_thr_mutex);
1186cd4e3c3eSJouni Malinen 	if (s->tx_stop_cnt > MAX_STOP) {
1187cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1188cd4e3c3eSJouni Malinen 				"send_uapsd: Enter TX_STOP Max Stop sent %d",
1189cd4e3c3eSJouni Malinen 				s->tx_stop_cnt);
1190cd4e3c3eSJouni Malinen 		s->stop = 1;
1191cd4e3c3eSJouni Malinen 	}
1192cd4e3c3eSJouni Malinen 	free(tpkt);
1193cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1194cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_stop uapsd_sta_tc %d uapsd_tx_state %d",
1195cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
1196cd4e3c3eSJouni Malinen 
1197cd4e3c3eSJouni Malinen 	return 0;
1198cd4e3c3eSJouni Malinen }
1199cd4e3c3eSJouni Malinen 
1200cd4e3c3eSJouni Malinen 
1201cd4e3c3eSJouni Malinen static int uapsd_rx_start(struct sigma_stream *s,
1202cd4e3c3eSJouni Malinen 			  unsigned int *rxpkt, int rxpkt_len)
1203cd4e3c3eSJouni Malinen {
1204cd4e3c3eSJouni Malinen 	int test_num = 0;
1205cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1206cd4e3c3eSJouni Malinen 	int msgid;
1207cd4e3c3eSJouni Malinen 
1208cd4e3c3eSJouni Malinen 	test_num = rxpkt[10];
1209cd4e3c3eSJouni Malinen 
1210cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1211cd4e3c3eSJouni Malinen 			"receive_uapsd: Enter uapsd_rx_start");
1212cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set LAST_TC to 37 */
1213cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? LAST_TC : M_W;
1214cd4e3c3eSJouni Malinen 
1215cd4e3c3eSJouni Malinen 	if (!((test_num >= B_D) && (test_num <= msgid)))
1216cd4e3c3eSJouni Malinen 		return -1;
1217cd4e3c3eSJouni Malinen 
1218cd4e3c3eSJouni Malinen 	/*
1219cd4e3c3eSJouni Malinen 	 * Test numbers start from 1. Hence decrement by 1
1220cd4e3c3eSJouni Malinen 	 * to match the array index.
1221cd4e3c3eSJouni Malinen 	 */
1222cd4e3c3eSJouni Malinen 	s->uapsd_sta_tc = (rxpkt[10] - 1);
1223cd4e3c3eSJouni Malinen 	s->sta_id = rxpkt[9];
1224cd4e3c3eSJouni Malinen 	(s->uapsd_rx_state)++;
1225cd4e3c3eSJouni Malinen 
1226cd4e3c3eSJouni Malinen 	return 0;
1227cd4e3c3eSJouni Malinen }
1228cd4e3c3eSJouni Malinen 
1229cd4e3c3eSJouni Malinen 
1230cd4e3c3eSJouni Malinen static int uapsd_rx_data(struct sigma_stream *s,
1231cd4e3c3eSJouni Malinen 			 unsigned int *rxpkt, int rxpkt_len)
1232cd4e3c3eSJouni Malinen {
1233cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1234cd4e3c3eSJouni Malinen 	u32 msgid;
1235cd4e3c3eSJouni Malinen 
1236cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1237cd4e3c3eSJouni Malinen 			"receive_uapsd: Enter uapsd_rx_data");
1238cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS DEFAULT to 38 */
1239cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1240cd4e3c3eSJouni Malinen 
1241cd4e3c3eSJouni Malinen 	if ((rxpkt[10] == msgid) &&
1242cd4e3c3eSJouni Malinen 	    ((rxpkt[1] == TOS_BE) ||
1243cd4e3c3eSJouni Malinen 	     (rxpkt[1] == TOS_BK) ||
1244cd4e3c3eSJouni Malinen 	     (rxpkt[1] == TOS_VI) ||
1245cd4e3c3eSJouni Malinen 	     (rxpkt[1] == TOS_VO) ||
1246cd4e3c3eSJouni Malinen 	     (rxpkt[1] == TOS_VO7) ||
1247cd4e3c3eSJouni Malinen 	     (rxpkt[1] == TOS_VO6))) {
1248cd4e3c3eSJouni Malinen 		s->rx_cookie = rxpkt[0];
1249cd4e3c3eSJouni Malinen 		(s->uapsd_rx_state)++;
1250cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1251cd4e3c3eSJouni Malinen 				"receive_uapsd: Recv in uapsd_rx_data uapsd_rx_state %d",
1252cd4e3c3eSJouni Malinen 				s->uapsd_rx_state);
1253cd4e3c3eSJouni Malinen 	} else {
1254cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1255cd4e3c3eSJouni Malinen 				"receive_uapsd: BAD Pkt recv in uapsd_rx_data");
1256cd4e3c3eSJouni Malinen 		sigma_uapsd_reset(s);
1257cd4e3c3eSJouni Malinen 	}
1258cd4e3c3eSJouni Malinen 
1259cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1260cd4e3c3eSJouni Malinen 			"receive_uapsd: Exit uapsd_rx_data");
1261cd4e3c3eSJouni Malinen 
1262cd4e3c3eSJouni Malinen 	return 0;
1263cd4e3c3eSJouni Malinen }
1264cd4e3c3eSJouni Malinen 
1265cd4e3c3eSJouni Malinen 
1266cd4e3c3eSJouni Malinen static int uapsd_rx_stop(struct sigma_stream *s,
1267cd4e3c3eSJouni Malinen 			 unsigned int *rxpkt, int rxpkt_len)
1268cd4e3c3eSJouni Malinen {
1269cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1270cd4e3c3eSJouni Malinen 	u32 msgid;
1271cd4e3c3eSJouni Malinen 
1272cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1273cd4e3c3eSJouni Malinen 			"receive_uapsd: Enter uapsd_rx_stop");
1274cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS STOP to 42 */
1275cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_STOP : APTS_STOP;
1276cd4e3c3eSJouni Malinen 
1277cd4e3c3eSJouni Malinen 	if (rxpkt[10] != msgid) {
1278cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1279cd4e3c3eSJouni Malinen 				"receive_uapsd: BAD Pkt recv in uapsd_rx_stop");
1280cd4e3c3eSJouni Malinen 	} else {
1281cd4e3c3eSJouni Malinen 		sigma_uapsd_stop(s);
1282cd4e3c3eSJouni Malinen 	}
1283cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Exit uapsd_rx_stop");
1284cd4e3c3eSJouni Malinen 
1285cd4e3c3eSJouni Malinen 	return 0;
1286cd4e3c3eSJouni Malinen }
1287cd4e3c3eSJouni Malinen 
1288cd4e3c3eSJouni Malinen 
1289cd4e3c3eSJouni Malinen static int uapsd_rx_cyclic_vo(struct sigma_stream *s,
1290cd4e3c3eSJouni Malinen 			      unsigned int *rxpkt, int rxpkt_len)
1291cd4e3c3eSJouni Malinen {
1292cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1293cd4e3c3eSJouni Malinen 	u32 msgid, msgid2;
1294cd4e3c3eSJouni Malinen 
1295cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1296cd4e3c3eSJouni Malinen 			"receive_uapsd: Enter uapsd_rx_cyclic_vo");
1297cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set
1298cd4e3c3eSJouni Malinen 	 * APTS STOP to 42 and
1299cd4e3c3eSJouni Malinen 	 * APTS DEFAULT to 38 */
1300cd4e3c3eSJouni Malinen 	if (!sigma_wmm_ac) {
1301cd4e3c3eSJouni Malinen 		msgid = APTS_STOP;
1302cd4e3c3eSJouni Malinen 		msgid2 = APTS_DEFAULT;
1303cd4e3c3eSJouni Malinen 	} else {
1304cd4e3c3eSJouni Malinen 		msgid = WMMAC_APTS_STOP;
1305cd4e3c3eSJouni Malinen 		msgid2 = WMMAC_APTS_DEFAULT;
1306cd4e3c3eSJouni Malinen 	}
1307cd4e3c3eSJouni Malinen 
1308cd4e3c3eSJouni Malinen 	if (rxpkt[10] != msgid) {
1309cd4e3c3eSJouni Malinen 		if ((rxpkt[10] == msgid2) &&
1310cd4e3c3eSJouni Malinen 		    ((rxpkt[1] == TOS_VO) ||
1311cd4e3c3eSJouni Malinen 		     (rxpkt[1] == TOS_VO7) ||
1312cd4e3c3eSJouni Malinen 		     (rxpkt[1] == TOS_VO6))) {
1313cd4e3c3eSJouni Malinen 			/* ; 5.7 */
1314cd4e3c3eSJouni Malinen 			s->rx_cookie = rxpkt[0];
1315cd4e3c3eSJouni Malinen 		} else {
1316cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
1317cd4e3c3eSJouni Malinen 					"receive_uapsd: BAD Pkt recv in uapsd_rx_cyclic_vo");
1318cd4e3c3eSJouni Malinen 		}
1319cd4e3c3eSJouni Malinen 	} else {
1320cd4e3c3eSJouni Malinen 		sigma_uapsd_stop(s);
1321cd4e3c3eSJouni Malinen 	}
1322cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1323cd4e3c3eSJouni Malinen 			"receive_uapsd: Exit uapsd_rx_cyclic_vo");
1324cd4e3c3eSJouni Malinen 
1325cd4e3c3eSJouni Malinen 	return 0;
1326cd4e3c3eSJouni Malinen }
1327cd4e3c3eSJouni Malinen 
1328cd4e3c3eSJouni Malinen 
1329cd4e3c3eSJouni Malinen static void create_apts_hello_pkt(int msg, unsigned int *txbuf,
1330cd4e3c3eSJouni Malinen 				  int tx_hello_cnt)
1331cd4e3c3eSJouni Malinen {
1332cd4e3c3eSJouni Malinen 	struct apts_pkt *t;
1333cd4e3c3eSJouni Malinen 
1334cd4e3c3eSJouni Malinen 	if (!sigma_wmm_ac)
1335cd4e3c3eSJouni Malinen 		t = &apts_pkts[msg];
1336cd4e3c3eSJouni Malinen 	else
1337cd4e3c3eSJouni Malinen 		t = &wmm_ac_apts_pkts[msg];
1338cd4e3c3eSJouni Malinen 
1339cd4e3c3eSJouni Malinen 	txbuf[0] = tx_hello_cnt;
1340cd4e3c3eSJouni Malinen 	txbuf[1] = 0;
1341cd4e3c3eSJouni Malinen 	txbuf[2] = 0;
1342cd4e3c3eSJouni Malinen 	txbuf[3] = 0;
1343cd4e3c3eSJouni Malinen 	txbuf[4] = 0;
1344cd4e3c3eSJouni Malinen 	txbuf[5] = 0;
1345cd4e3c3eSJouni Malinen 	txbuf[6] = t->param0;
1346cd4e3c3eSJouni Malinen 	txbuf[7] = t->param1;
1347cd4e3c3eSJouni Malinen 	txbuf[8] = t->param2;
1348cd4e3c3eSJouni Malinen 	txbuf[9] = t->param3;
1349cd4e3c3eSJouni Malinen 	txbuf[10] = t->cmd;
1350cd4e3c3eSJouni Malinen 	strcpy((char *) &txbuf[11], t->name);
1351cd4e3c3eSJouni Malinen 	printf("create_apts_hello_pkt (%s) %d\n", t->name, t->cmd);
1352cd4e3c3eSJouni Malinen }
1353cd4e3c3eSJouni Malinen 
1354cd4e3c3eSJouni Malinen 
1355cd4e3c3eSJouni Malinen static void sigma_uapsd_init(struct sigma_stream *s)
1356cd4e3c3eSJouni Malinen {
1357cd4e3c3eSJouni Malinen 	s->uapsd_sta_tc = 0; /* Test Case to execute or row to select */
1358cd4e3c3eSJouni Malinen 	/* in a test case row, next column or next state function to execute */
1359cd4e3c3eSJouni Malinen 	s->uapsd_rx_state = 0;
1360cd4e3c3eSJouni Malinen 	s->uapsd_tx_state = 0;
1361cd4e3c3eSJouni Malinen 
1362cd4e3c3eSJouni Malinen 	s->sta_id = 0;
1363cd4e3c3eSJouni Malinen 	s->uapsd_send_thr = 0;
1364cd4e3c3eSJouni Malinen 
1365cd4e3c3eSJouni Malinen 	s->reset_rx = 0;
1366cd4e3c3eSJouni Malinen 	s->num_retry = 0;
1367cd4e3c3eSJouni Malinen 	s->tx_stop_cnt = 0;
1368cd4e3c3eSJouni Malinen 	s->tx_hello_cnt = 0;
1369cd4e3c3eSJouni Malinen }
1370cd4e3c3eSJouni Malinen 
1371cd4e3c3eSJouni Malinen 
1372cd4e3c3eSJouni Malinen static void sigma_uapsd_stop(struct sigma_stream *s)
1373cd4e3c3eSJouni Malinen {
1374cd4e3c3eSJouni Malinen 	pthread_mutex_lock(&s->tx_thr_mutex);
1375cd4e3c3eSJouni Malinen 	pthread_cond_wait(&s->tx_thr_cond, &s->tx_thr_mutex);
1376cd4e3c3eSJouni Malinen 	pthread_mutex_unlock(&s->tx_thr_mutex);
1377cd4e3c3eSJouni Malinen 	s->stop = 1;
1378cd4e3c3eSJouni Malinen 	sleep(1);
1379cd4e3c3eSJouni Malinen }
1380cd4e3c3eSJouni Malinen 
1381cd4e3c3eSJouni Malinen 
1382cd4e3c3eSJouni Malinen static void sigma_uapsd_reset(struct sigma_stream *s)
1383cd4e3c3eSJouni Malinen {
1384cd4e3c3eSJouni Malinen 	int tos = TOS_BE;
1385cd4e3c3eSJouni Malinen 	unsigned int *reset_pkt;
1386cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1387cd4e3c3eSJouni Malinen 	u32 msgid;
1388cd4e3c3eSJouni Malinen 
1389cd4e3c3eSJouni Malinen 	s->num_retry++;
1390cd4e3c3eSJouni Malinen 
139179594049SPradeep Reddy POTTETI 	/* if reset is called from U-APSD console set it */
139279594049SPradeep Reddy POTTETI 	s->reset = 1;
139379594049SPradeep Reddy POTTETI 
1394cd4e3c3eSJouni Malinen 	reset_pkt = malloc(s->payload_size);
1395cd4e3c3eSJouni Malinen 	if (reset_pkt == NULL)
1396cd4e3c3eSJouni Malinen 		return;
1397cd4e3c3eSJouni Malinen 
1398cd4e3c3eSJouni Malinen 	if (s->num_retry > MAX_RETRY) {
1399cd4e3c3eSJouni Malinen 		/* if test is for WMM-AC set APTS RESET STOP to 49 */
1400cd4e3c3eSJouni Malinen 		msgid = sigma_wmm_ac ? WMMAC_APTS_RESET_STOP : APTS_RESET_STOP;
1401cd4e3c3eSJouni Malinen 		create_apts_pkt(msgid, reset_pkt, tos, s);
1402cd4e3c3eSJouni Malinen 		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1403cd4e3c3eSJouni Malinen 		send(s->sock, reset_pkt, s->payload_size, 0);
1404cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1405cd4e3c3eSJouni Malinen 				"sigma_uapsd_reset: Too many Reset retries");
1406cd4e3c3eSJouni Malinen 		s->stop = 1;
1407cd4e3c3eSJouni Malinen 	}
1408cd4e3c3eSJouni Malinen 
1409cd4e3c3eSJouni Malinen 	if (!(s->reset_rx)) {
1410cd4e3c3eSJouni Malinen 		/* if test is for WMM-AC set APTS RESET to 47 */
1411cd4e3c3eSJouni Malinen 		msgid = sigma_wmm_ac ? WMMAC_APTS_RESET : APTS_RESET;
1412cd4e3c3eSJouni Malinen 		create_apts_pkt(msgid, reset_pkt, tos, s);
1413cd4e3c3eSJouni Malinen 		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1414cd4e3c3eSJouni Malinen 		send(s->sock, reset_pkt, s->payload_size, 0);
1415cd4e3c3eSJouni Malinen 	} else {
1416cd4e3c3eSJouni Malinen 		/* if test is for WMM-AC set APTS RESET RESP to 48 */
1417cd4e3c3eSJouni Malinen 		msgid = sigma_wmm_ac ? WMMAC_APTS_RESET_RESP : APTS_RESET_RESP;
1418cd4e3c3eSJouni Malinen 		create_apts_pkt(msgid, reset_pkt, tos, s);
1419cd4e3c3eSJouni Malinen 		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1420cd4e3c3eSJouni Malinen 		send(s->sock, reset_pkt, s->payload_size, 0);
1421cd4e3c3eSJouni Malinen 		s->reset_rx = 0;
1422cd4e3c3eSJouni Malinen 	}
1423cd4e3c3eSJouni Malinen 	free(reset_pkt);
1424cd4e3c3eSJouni Malinen }
1425cd4e3c3eSJouni Malinen 
1426cd4e3c3eSJouni Malinen 
1427cd4e3c3eSJouni Malinen static void * send_uapsd(void *data)
1428cd4e3c3eSJouni Malinen {
1429cd4e3c3eSJouni Malinen 	struct sigma_stream *s = data;
1430cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1431cd4e3c3eSJouni Malinen 	uapsd_tx_state_func_ptr tx_state_func;
1432cd4e3c3eSJouni Malinen 	u32 usr_priority, sleep_duration;
1433cd4e3c3eSJouni Malinen 	enum uapsd_psave ps;
1434cd4e3c3eSJouni Malinen 
1435cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Uapsd TX Start");
1436cd4e3c3eSJouni Malinen 
1437cd4e3c3eSJouni Malinen 	s->payload_size = 512;
1438cd4e3c3eSJouni Malinen 
1439cd4e3c3eSJouni Malinen 	while (!s->stop) {
1440cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1441cd4e3c3eSJouni Malinen 				"send_uapsd: running  while uapsd_rx_state %d",
1442cd4e3c3eSJouni Malinen 				s->uapsd_rx_state);
1443cd4e3c3eSJouni Malinen 
1444cd4e3c3eSJouni Malinen 		tx_state_func = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1445cd4e3c3eSJouni Malinen 			[s->uapsd_tx_state].state_func;
1446cd4e3c3eSJouni Malinen 		usr_priority = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1447cd4e3c3eSJouni Malinen 			[s->uapsd_tx_state].usr_priority;
1448cd4e3c3eSJouni Malinen 		sleep_duration = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1449cd4e3c3eSJouni Malinen 			[s->uapsd_tx_state].sleep_dur;
1450cd4e3c3eSJouni Malinen 		ps = sta_uapsd_tx_tbl[s->uapsd_sta_tc][s->uapsd_tx_state].ps;
1451cd4e3c3eSJouni Malinen 
1452cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1453cd4e3c3eSJouni Malinen 				"send_uapsd: uapsd_sta_tc %d uapsd_tx_state %d",
1454cd4e3c3eSJouni Malinen 				s->uapsd_sta_tc, s->uapsd_tx_state);
1455cd4e3c3eSJouni Malinen 		if (tx_state_func) {
1456cd4e3c3eSJouni Malinen 			tx_state_func(s, usr_priority, ps, sleep_duration);
1457cd4e3c3eSJouni Malinen 		} else {
1458cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
1459cd4e3c3eSJouni Malinen 					"send_uapsd: Null Function Detected for TC : %d in uapsd_tx_state : %d",
1460cd4e3c3eSJouni Malinen 					s->uapsd_sta_tc, s->uapsd_tx_state);
1461cd4e3c3eSJouni Malinen 		}
1462cd4e3c3eSJouni Malinen 	}
1463cd4e3c3eSJouni Malinen 
1464cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Uapsd TX End");
1465cd4e3c3eSJouni Malinen 	pthread_join(s->uapsd_send_thr, NULL);
1466cd4e3c3eSJouni Malinen 
1467cd4e3c3eSJouni Malinen 	return NULL;
1468cd4e3c3eSJouni Malinen }
1469cd4e3c3eSJouni Malinen 
1470cd4e3c3eSJouni Malinen 
1471cd4e3c3eSJouni Malinen void receive_uapsd(struct sigma_stream *s)
1472cd4e3c3eSJouni Malinen {
1473cd4e3c3eSJouni Malinen 	struct timeval tv;
1474cd4e3c3eSJouni Malinen 	fd_set rfds;
1475cd4e3c3eSJouni Malinen 	int res = 0, ret = 0, rxpkt_len = 0;
1476cd4e3c3eSJouni Malinen 	unsigned int *rxpkt;
1477cd4e3c3eSJouni Malinen 	uapsd_recv_state_func_ptr recv_state_func;
1478cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1479cd4e3c3eSJouni Malinen 	u32 msgid;
1480cd4e3c3eSJouni Malinen 
1481cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Uapsd RX Start");
1482cd4e3c3eSJouni Malinen 	sigma_uapsd_init(s);
1483cd4e3c3eSJouni Malinen 
1484cd4e3c3eSJouni Malinen 	ret = pthread_mutex_init(&s->tx_thr_mutex, NULL);
1485cd4e3c3eSJouni Malinen 	if (ret != 0) {
1486cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1487cd4e3c3eSJouni Malinen 				"receive_uapsd: pthread_mutex_init failed");
1488cd4e3c3eSJouni Malinen 		return;
1489cd4e3c3eSJouni Malinen 	}
1490cd4e3c3eSJouni Malinen 
1491cd4e3c3eSJouni Malinen 	ret = pthread_cond_init(&s->tx_thr_cond, NULL);
1492cd4e3c3eSJouni Malinen 	if (ret != 0) {
1493cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1494cd4e3c3eSJouni Malinen 				"receive_uapsd: pthread_cond_init failed");
1495cd4e3c3eSJouni Malinen 		pthread_mutex_destroy(&s->tx_thr_mutex);
1496cd4e3c3eSJouni Malinen 		return;
1497cd4e3c3eSJouni Malinen 	}
1498cd4e3c3eSJouni Malinen 
1499cd4e3c3eSJouni Malinen 	if (pthread_create(&s->uapsd_send_thr, NULL, send_uapsd, s)) {
1500cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1501cd4e3c3eSJouni Malinen 				"receive_uapsd: send_uapsd tx thread creation failed");
1502cd4e3c3eSJouni Malinen 		pthread_cond_destroy(&s->tx_thr_cond);
1503cd4e3c3eSJouni Malinen 		pthread_mutex_destroy(&s->tx_thr_mutex);
1504cd4e3c3eSJouni Malinen 		return;
1505cd4e3c3eSJouni Malinen 	}
1506cd4e3c3eSJouni Malinen 
1507cd4e3c3eSJouni Malinen 	s->payload_size = 512;
1508cd4e3c3eSJouni Malinen 	rxpkt = malloc(s->payload_size);
1509cd4e3c3eSJouni Malinen 	if (rxpkt == NULL) {
1510cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1511cd4e3c3eSJouni Malinen 				"receive_uapsd: Receive buffer allocation failed");
1512cd4e3c3eSJouni Malinen 		s->stop = 1;
1513cd4e3c3eSJouni Malinen 	}
1514cd4e3c3eSJouni Malinen 
1515cd4e3c3eSJouni Malinen 	while (!s->stop) {
1516cd4e3c3eSJouni Malinen 		FD_ZERO(&rfds);
1517cd4e3c3eSJouni Malinen 		FD_SET(s->sock, &rfds);
1518cd4e3c3eSJouni Malinen 		tv.tv_sec = 0;
1519cd4e3c3eSJouni Malinen 		tv.tv_usec = 100000;
1520cd4e3c3eSJouni Malinen 		res = select(s->sock + 1, &rfds, NULL, NULL, &tv);
1521cd4e3c3eSJouni Malinen 		if (res < 0) {
1522cd4e3c3eSJouni Malinen 			perror("select");
1523cd4e3c3eSJouni Malinen 			usleep(10000);
1524cd4e3c3eSJouni Malinen 			continue;
1525cd4e3c3eSJouni Malinen 		}
1526cd4e3c3eSJouni Malinen 
1527cd4e3c3eSJouni Malinen 		if (!FD_ISSET(s->sock, &rfds))
1528cd4e3c3eSJouni Malinen 			continue;
1529cd4e3c3eSJouni Malinen 
1530cd4e3c3eSJouni Malinen 		memset(rxpkt, 0, s->payload_size);
1531cd4e3c3eSJouni Malinen 		rxpkt_len = recv(s->sock, rxpkt, s->payload_size, 0);
1532cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1533cd4e3c3eSJouni Malinen 				"receive_uapsd: running res %d cookie %d dscp %d apts-pkt %d sta-id %d",
1534cd4e3c3eSJouni Malinen 				res, rxpkt[0], rxpkt[1], rxpkt[10],
1535cd4e3c3eSJouni Malinen 				rxpkt[9]);
1536cd4e3c3eSJouni Malinen 
1537cd4e3c3eSJouni Malinen 		if (rxpkt_len > 0) {
1538cd4e3c3eSJouni Malinen 			s->rx_frames++;
1539cd4e3c3eSJouni Malinen 			s->rx_payload_bytes += res;
1540cd4e3c3eSJouni Malinen 
1541cd4e3c3eSJouni Malinen 			/* if test is for WMM-AC set APTS RESET to 47 */
1542cd4e3c3eSJouni Malinen 			msgid = sigma_wmm_ac ? WMMAC_APTS_RESET : APTS_RESET;
1543cd4e3c3eSJouni Malinen 			if (msgid == rxpkt[10]) {
1544cd4e3c3eSJouni Malinen 				sigma_dut_print(dut, DUT_MSG_ERROR,
1545cd4e3c3eSJouni Malinen 						"receive_uapsd: RESET Pkt recv");
1546cd4e3c3eSJouni Malinen 				s->reset_rx = 1;
1547cd4e3c3eSJouni Malinen 				sigma_uapsd_reset(s);
1548cd4e3c3eSJouni Malinen 				continue;
1549cd4e3c3eSJouni Malinen 			}
1550cd4e3c3eSJouni Malinen 
1551cd4e3c3eSJouni Malinen 			recv_state_func = sta_uapsd_recv_tbl[s->uapsd_sta_tc]
1552cd4e3c3eSJouni Malinen 				[s->uapsd_rx_state].state_func;
1553cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
1554cd4e3c3eSJouni Malinen 					"receive_uapsd: running s->uapsd_sta_tc %d uapsd_rx_state %d",
1555cd4e3c3eSJouni Malinen 					s->uapsd_sta_tc, s->uapsd_rx_state);
1556cd4e3c3eSJouni Malinen 			if (recv_state_func) {
1557cd4e3c3eSJouni Malinen 				recv_state_func(s, rxpkt, rxpkt_len);
1558cd4e3c3eSJouni Malinen 			} else {
1559cd4e3c3eSJouni Malinen 				sigma_dut_print(dut, DUT_MSG_INFO,
1560cd4e3c3eSJouni Malinen 						"receive_uapsd: Null Function Detected for TC : %d in uapsd_rx_state : %d",
1561cd4e3c3eSJouni Malinen 						s->uapsd_sta_tc,
1562cd4e3c3eSJouni Malinen 						s->uapsd_rx_state);
1563cd4e3c3eSJouni Malinen 			}
1564cd4e3c3eSJouni Malinen 		} else if (res < 0) {
1565cd4e3c3eSJouni Malinen 			perror("recv");
1566cd4e3c3eSJouni Malinen 			break;
1567cd4e3c3eSJouni Malinen 		}
1568cd4e3c3eSJouni Malinen 	}
1569cd4e3c3eSJouni Malinen 
1570cd4e3c3eSJouni Malinen 	if (rxpkt)
1571cd4e3c3eSJouni Malinen 		free(rxpkt);
1572cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Uapsd RX End");
1573cd4e3c3eSJouni Malinen 	if (s->sock >= 0) {
1574cd4e3c3eSJouni Malinen 		pthread_join(s->thr, NULL);
1575cd4e3c3eSJouni Malinen 		close(s->sock);
1576cd4e3c3eSJouni Malinen 		s->sock = -1;
1577cd4e3c3eSJouni Malinen 	}
1578cd4e3c3eSJouni Malinen 	pthread_cond_destroy(&s->tx_thr_cond);
1579cd4e3c3eSJouni Malinen 	pthread_mutex_destroy(&s->tx_thr_mutex);
1580cd4e3c3eSJouni Malinen }
158179594049SPradeep Reddy POTTETI 
158279594049SPradeep Reddy POTTETI 
158379594049SPradeep Reddy POTTETI /* U-APSD apts console code implementation */
158479594049SPradeep Reddy POTTETI static int packet_expected(struct sigma_stream *s, unsigned int *rpkt,
158579594049SPradeep Reddy POTTETI 			   unsigned int type, u32 tos)
158679594049SPradeep Reddy POTTETI {
158779594049SPradeep Reddy POTTETI 	u8 type_ok = 0;
158879594049SPradeep Reddy POTTETI 	u8 tos_ok = 0;
158979594049SPradeep Reddy POTTETI 	int res = 0;
159079594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
159179594049SPradeep Reddy POTTETI 
159279594049SPradeep Reddy POTTETI 	type_ok = (rpkt[10] == type) ? 1 : 0;
159379594049SPradeep Reddy POTTETI 
159479594049SPradeep Reddy POTTETI 	switch (tos) {
159579594049SPradeep Reddy POTTETI 	case TOS_VO7:
159679594049SPradeep Reddy POTTETI 	case TOS_VO:
159779594049SPradeep Reddy POTTETI 	case TOS_VO6:
159879594049SPradeep Reddy POTTETI 	case TOS_VO2:
159979594049SPradeep Reddy POTTETI 		if (rpkt[1] == TOS_VO7 || rpkt[1] == TOS_VO ||
160079594049SPradeep Reddy POTTETI 		    rpkt[1] == TOS_VO6 || rpkt[1] == TOS_VO2)
160179594049SPradeep Reddy POTTETI 			tos_ok = 1;
160279594049SPradeep Reddy POTTETI 		break;
160379594049SPradeep Reddy POTTETI 	case TOS_VI:
160479594049SPradeep Reddy POTTETI 	case TOS_VI4:
160579594049SPradeep Reddy POTTETI 	case TOS_VI5:
160679594049SPradeep Reddy POTTETI 		if (rpkt[1] == TOS_VI || rpkt[1] == TOS_VI4 ||
160779594049SPradeep Reddy POTTETI 		    rpkt[1] == TOS_VI5)
160879594049SPradeep Reddy POTTETI 			tos_ok = 1;
160979594049SPradeep Reddy POTTETI 		break;
161079594049SPradeep Reddy POTTETI 	case TOS_BE:
161179594049SPradeep Reddy POTTETI 	case TOS_EE:
161279594049SPradeep Reddy POTTETI 		if (rpkt[1] == TOS_BE || rpkt[1] == TOS_EE)
161379594049SPradeep Reddy POTTETI 			tos_ok = 1;
161479594049SPradeep Reddy POTTETI 		break;
161579594049SPradeep Reddy POTTETI 	case TOS_BK:
161679594049SPradeep Reddy POTTETI 	case TOS_LE:
161779594049SPradeep Reddy POTTETI 		if (rpkt[1] == TOS_BK || rpkt[1] == TOS_LE)
161879594049SPradeep Reddy POTTETI 			tos_ok = 1;
161979594049SPradeep Reddy POTTETI 		break;
162079594049SPradeep Reddy POTTETI 	default:
162179594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
162279594049SPradeep Reddy POTTETI 				"packet_expected: recv not known tos=0x%x",
162379594049SPradeep Reddy POTTETI 				tos);
162479594049SPradeep Reddy POTTETI 		break;
162579594049SPradeep Reddy POTTETI 	}
162679594049SPradeep Reddy POTTETI 
162779594049SPradeep Reddy POTTETI 	res = type_ok && tos_ok;
162879594049SPradeep Reddy POTTETI 	if (!res) {
162979594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
163079594049SPradeep Reddy POTTETI 				"packet_expected: No match: received pkt_type %u expected type %u, received dscp 0x%x expected dscp 0x%x",
163179594049SPradeep Reddy POTTETI 				rpkt[10], type, rpkt[1], tos);
163279594049SPradeep Reddy POTTETI 	}
163379594049SPradeep Reddy POTTETI 
163479594049SPradeep Reddy POTTETI 	return res;
163579594049SPradeep Reddy POTTETI }
163679594049SPradeep Reddy POTTETI 
163779594049SPradeep Reddy POTTETI 
163879594049SPradeep Reddy POTTETI static int console_send(struct sigma_stream *s, u32 pkt_type, u32 tos)
163979594049SPradeep Reddy POTTETI {
164079594049SPradeep Reddy POTTETI 	u32 *tpkt;
164179594049SPradeep Reddy POTTETI 	int res = 0;
164279594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
164379594049SPradeep Reddy POTTETI 
164479594049SPradeep Reddy POTTETI 	tpkt = malloc(s->payload_size);
164579594049SPradeep Reddy POTTETI 	if (tpkt == NULL) {
164679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
164779594049SPradeep Reddy POTTETI 				"console_send: Send buffer allocation failed");
164879594049SPradeep Reddy POTTETI 		return 0;
164979594049SPradeep Reddy POTTETI 	}
165079594049SPradeep Reddy POTTETI 	memset(tpkt, 0, s->payload_size);
165179594049SPradeep Reddy POTTETI 	create_apts_pkt(pkt_type, tpkt, tos, s);
165279594049SPradeep Reddy POTTETI 	if (pkt_type == APTS_DEFAULT || pkt_type == APTS_STOP)
165379594049SPradeep Reddy POTTETI 		tpkt[0] = ++(s->rx_cookie);
165479594049SPradeep Reddy POTTETI 	tpkt[1] = tos;
165579594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
165679594049SPradeep Reddy POTTETI 	res = send(s->sock, tpkt, s->payload_size / 2, 0);
165779594049SPradeep Reddy POTTETI 	if (res >= 0) {
165879594049SPradeep Reddy POTTETI 		s->tx_frames++;
165979594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
166079594049SPradeep Reddy POTTETI 	}
166179594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
166279594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
166379594049SPradeep Reddy POTTETI 			"console_send: Sent packet return %d Type %d Tos %d",
166479594049SPradeep Reddy POTTETI 			res, tpkt[10], tpkt[1]);
166579594049SPradeep Reddy POTTETI 	free(tpkt);
166679594049SPradeep Reddy POTTETI 
166779594049SPradeep Reddy POTTETI 	return 0;
166879594049SPradeep Reddy POTTETI }
166979594049SPradeep Reddy POTTETI 
167079594049SPradeep Reddy POTTETI 
167179594049SPradeep Reddy POTTETI static int console_rx_hello(struct sigma_stream *s, unsigned int *rpkt, int len)
167279594049SPradeep Reddy POTTETI {
167379594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
167479594049SPradeep Reddy POTTETI 
167579594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_HELLO, TOS_BE)) {
167679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
167779594049SPradeep Reddy POTTETI 				"console_rx_hello: Hello not Recv or Bad TOS");
167879594049SPradeep Reddy POTTETI 		return 0;
167979594049SPradeep Reddy POTTETI 	}
168079594049SPradeep Reddy POTTETI 
168179594049SPradeep Reddy POTTETI 	s->rx_cookie = 0;
168279594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
168379594049SPradeep Reddy POTTETI 			"console_rx_hello: Recv Hello, Sent Test Case");
168479594049SPradeep Reddy POTTETI 	console_send(s, s->uapsd_sta_tc, TOS_BE);
168579594049SPradeep Reddy POTTETI 
168679594049SPradeep Reddy POTTETI 	return 0;
168779594049SPradeep Reddy POTTETI }
168879594049SPradeep Reddy POTTETI 
168979594049SPradeep Reddy POTTETI 
169079594049SPradeep Reddy POTTETI static int console_rx_confirm(struct sigma_stream *s, unsigned int *rpkt,
169179594049SPradeep Reddy POTTETI 			      int len)
169279594049SPradeep Reddy POTTETI {
169379594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
169479594049SPradeep Reddy POTTETI 
169579594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_CONFIRM, TOS_BE)) {
169679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
169779594049SPradeep Reddy POTTETI 				"console_rx_confirm: Confirm not Recv or Bad TOS");
169879594049SPradeep Reddy POTTETI 		return 0;
169979594049SPradeep Reddy POTTETI 	}
170079594049SPradeep Reddy POTTETI 
170179594049SPradeep Reddy POTTETI 	s->rx_cookie = 0;
170279594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
170379594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_confirm: Recv Confirm");
170479594049SPradeep Reddy POTTETI 
170579594049SPradeep Reddy POTTETI 	return 0;
170679594049SPradeep Reddy POTTETI }
170779594049SPradeep Reddy POTTETI 
170879594049SPradeep Reddy POTTETI 
170979594049SPradeep Reddy POTTETI static int console_rx_confirm_tx_vi(struct sigma_stream *s, unsigned int *rpkt,
171079594049SPradeep Reddy POTTETI 				    int len)
171179594049SPradeep Reddy POTTETI {
171279594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
171379594049SPradeep Reddy POTTETI 
171479594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_CONFIRM, TOS_BE)) {
171579594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
171679594049SPradeep Reddy POTTETI 				"console_rx_confirm_tx_vi: Confirm not Recv or Bad TOS");
171779594049SPradeep Reddy POTTETI 		return 0;
171879594049SPradeep Reddy POTTETI 	}
171979594049SPradeep Reddy POTTETI 
172079594049SPradeep Reddy POTTETI 	s->rx_cookie = 0;
172179594049SPradeep Reddy POTTETI 	console_send(s, APTS_DEFAULT, TOS_VI);
172279594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
172379594049SPradeep Reddy POTTETI 			"console_rx_confirm_tx_vi: Recv Confirm, Sent VI");
172479594049SPradeep Reddy POTTETI 
172579594049SPradeep Reddy POTTETI 	return 0;
172679594049SPradeep Reddy POTTETI 
172779594049SPradeep Reddy POTTETI }
172879594049SPradeep Reddy POTTETI 
172979594049SPradeep Reddy POTTETI 
173079594049SPradeep Reddy POTTETI static int console_rx_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
173179594049SPradeep Reddy POTTETI 			      int len)
173279594049SPradeep Reddy POTTETI {
173379594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
173479594049SPradeep Reddy POTTETI 
173579594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
173679594049SPradeep Reddy POTTETI 			"console_rx_tx_stop: Send stop to STA again quit %d stop %d",
173779594049SPradeep Reddy POTTETI 			s->can_quit, s->stop);
173879594049SPradeep Reddy POTTETI 
173979594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
174079594049SPradeep Reddy POTTETI 
174179594049SPradeep Reddy POTTETI 	if (packet_expected(s, rpkt, APTS_STOP, TOS_BE)) {
174279594049SPradeep Reddy POTTETI 		if (s->can_quit) {
174379594049SPradeep Reddy POTTETI 			s->stop = 1;
174479594049SPradeep Reddy POTTETI 			sigma_dut_print(dut, DUT_MSG_INFO,
174579594049SPradeep Reddy POTTETI 					"console_rx_tx_stop: Send stop to STA again quit %d stop %d",
174679594049SPradeep Reddy POTTETI 					s->can_quit, s->stop);
174779594049SPradeep Reddy POTTETI 		} else {
174879594049SPradeep Reddy POTTETI 			s->can_quit = 1;
174979594049SPradeep Reddy POTTETI 		}
175079594049SPradeep Reddy POTTETI 	} else {
175179594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
175279594049SPradeep Reddy POTTETI 				"console_rx_tx_stop: STOP not Recv or Bad TOS");
175379594049SPradeep Reddy POTTETI 	}
175479594049SPradeep Reddy POTTETI 
175579594049SPradeep Reddy POTTETI 	return 0;
175679594049SPradeep Reddy POTTETI }
175779594049SPradeep Reddy POTTETI 
175879594049SPradeep Reddy POTTETI 
175979594049SPradeep Reddy POTTETI static int console_rx_vo_tx_vo(struct sigma_stream *s, unsigned int *rpkt,
176079594049SPradeep Reddy POTTETI 			       int len)
176179594049SPradeep Reddy POTTETI {
176279594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
176379594049SPradeep Reddy POTTETI 	unsigned int tos = TOS_VO7;
176479594049SPradeep Reddy POTTETI 	int res;
176579594049SPradeep Reddy POTTETI 
176679594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
176779594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
176879594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_vo: Expected Pkt not Recv or Bad TOS");
176979594049SPradeep Reddy POTTETI 		return 0;
177079594049SPradeep Reddy POTTETI 	}
177179594049SPradeep Reddy POTTETI 
177279594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
177379594049SPradeep Reddy POTTETI 	rpkt[1] = TOS_VO;
177479594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
177579594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
177679594049SPradeep Reddy POTTETI 	if (res >= 0) {
177779594049SPradeep Reddy POTTETI 		s->tx_frames++;
177879594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
177979594049SPradeep Reddy POTTETI 	}
178079594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
178179594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
178279594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_vo: Recv VO, Sent VO");
178379594049SPradeep Reddy POTTETI 
178479594049SPradeep Reddy POTTETI 	return 0;
178579594049SPradeep Reddy POTTETI }
178679594049SPradeep Reddy POTTETI 
178779594049SPradeep Reddy POTTETI 
178879594049SPradeep Reddy POTTETI static int console_rx_vo_tx_vo_tx_stop(struct sigma_stream *s,
178979594049SPradeep Reddy POTTETI 				       unsigned int *rpkt, int len)
179079594049SPradeep Reddy POTTETI {
179179594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
179279594049SPradeep Reddy POTTETI 	unsigned int tos = TOS_VO7;
179379594049SPradeep Reddy POTTETI 	int res;
179479594049SPradeep Reddy POTTETI 
179579594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
179679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
179779594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
179879594049SPradeep Reddy POTTETI 		return 0;
179979594049SPradeep Reddy POTTETI 	}
180079594049SPradeep Reddy POTTETI 
180179594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
180279594049SPradeep Reddy POTTETI 	rpkt[1] = TOS_VO;
180379594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
180479594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
180579594049SPradeep Reddy POTTETI 	if (res >= 0) {
180679594049SPradeep Reddy POTTETI 		s->tx_frames++;
180779594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
180879594049SPradeep Reddy POTTETI 	}
180979594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
181079594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_vo_tx_stop: Recv VO, Sent VO");
181179594049SPradeep Reddy POTTETI 		usleep(500000);
181279594049SPradeep Reddy POTTETI 		console_send(s, APTS_STOP, TOS_BE);
181379594049SPradeep Reddy POTTETI 
181479594049SPradeep Reddy POTTETI 	return 0;
181579594049SPradeep Reddy POTTETI }
181679594049SPradeep Reddy POTTETI 
181779594049SPradeep Reddy POTTETI 
181879594049SPradeep Reddy POTTETI static int console_rx_vo_tx_all_tx_stop(struct sigma_stream *s,
181979594049SPradeep Reddy POTTETI 					unsigned int *rpkt, int len)
182079594049SPradeep Reddy POTTETI {
182179594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
182279594049SPradeep Reddy POTTETI 	u32 tos = TOS_VO7;
182379594049SPradeep Reddy POTTETI 	int res;
182479594049SPradeep Reddy POTTETI 
182579594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
182679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
182779594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_all_tx_stop: Expected Pkt not Recv or Bad TOS");
182879594049SPradeep Reddy POTTETI 		return 0;
182979594049SPradeep Reddy POTTETI 	}
183079594049SPradeep Reddy POTTETI 
183179594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
183279594049SPradeep Reddy POTTETI 	rpkt[1] = TOS_VO;
183379594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
183479594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
183579594049SPradeep Reddy POTTETI 	if (res >= 0) {
183679594049SPradeep Reddy POTTETI 		s->tx_frames++;
183779594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
183879594049SPradeep Reddy POTTETI 	}
183979594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
184079594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_all_tx_stop: Recv VO, Sent VO");
184179594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
184279594049SPradeep Reddy POTTETI 	tos = TOS_VI;
184379594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
184479594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
184579594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
184679594049SPradeep Reddy POTTETI 	if (res >= 0) {
184779594049SPradeep Reddy POTTETI 		s->tx_frames++;
184879594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
184979594049SPradeep Reddy POTTETI 	}
185079594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
185179594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_all_tx_stop: Sent VI");
185279594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
185379594049SPradeep Reddy POTTETI 	tos = TOS_BE;
185479594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
185579594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
185679594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
185779594049SPradeep Reddy POTTETI 	if (res >= 0) {
185879594049SPradeep Reddy POTTETI 		s->tx_frames++;
185979594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
186079594049SPradeep Reddy POTTETI 	}
186179594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
186279594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_all_tx_stop: Sent BE");
186379594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
186479594049SPradeep Reddy POTTETI 	tos = TOS_BK;
186579594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
186679594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
186779594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
186879594049SPradeep Reddy POTTETI 	if (res >= 0) {
186979594049SPradeep Reddy POTTETI 		s->tx_frames++;
187079594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
187179594049SPradeep Reddy POTTETI 	}
187279594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
187379594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_all_tx_stop: Sent BK");
187479594049SPradeep Reddy POTTETI 	usleep(500000);
187579594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
187679594049SPradeep Reddy POTTETI 
187779594049SPradeep Reddy POTTETI 	return 0;
187879594049SPradeep Reddy POTTETI }
187979594049SPradeep Reddy POTTETI 
188079594049SPradeep Reddy POTTETI 
188179594049SPradeep Reddy POTTETI static int console_rx_be_tx_be(struct  sigma_stream *s, unsigned int *rpkt,
188279594049SPradeep Reddy POTTETI 			       int len)
188379594049SPradeep Reddy POTTETI {
188479594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
188579594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
188679594049SPradeep Reddy POTTETI 	int res;
188779594049SPradeep Reddy POTTETI 
188879594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
188979594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
189079594049SPradeep Reddy POTTETI 				"console_rx_be_tx_be: Expected Pkt not Recv or Bad TOS");
189179594049SPradeep Reddy POTTETI 		return 0;
189279594049SPradeep Reddy POTTETI 	}
189379594049SPradeep Reddy POTTETI 
189479594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
189579594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
189679594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
189779594049SPradeep Reddy POTTETI 	if (res >= 0) {
189879594049SPradeep Reddy POTTETI 		s->tx_frames++;
189979594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
190079594049SPradeep Reddy POTTETI 	}
190179594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
190279594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
190379594049SPradeep Reddy POTTETI 			"console_rx_be_tx_be: Recv BE, Sent BE");
190479594049SPradeep Reddy POTTETI 
190579594049SPradeep Reddy POTTETI 	return 0;
190679594049SPradeep Reddy POTTETI }
190779594049SPradeep Reddy POTTETI 
190879594049SPradeep Reddy POTTETI 
190979594049SPradeep Reddy POTTETI static int console_rx_be_tx_be_tx_stop(struct sigma_stream *s,
191079594049SPradeep Reddy POTTETI 				       unsigned int *rpkt, int len)
191179594049SPradeep Reddy POTTETI {
191279594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
191379594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
191479594049SPradeep Reddy POTTETI 	int res;
191579594049SPradeep Reddy POTTETI 
191679594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
191779594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
191879594049SPradeep Reddy POTTETI 				"console_rx_be_tx_be_tx_stop: Expected Pkt not Recv or Bad TOS");
191979594049SPradeep Reddy POTTETI 		return 0;
192079594049SPradeep Reddy POTTETI 	}
192179594049SPradeep Reddy POTTETI 
192279594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
192379594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
192479594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
192579594049SPradeep Reddy POTTETI 	if (res >= 0) {
192679594049SPradeep Reddy POTTETI 		s->tx_frames++;
192779594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
192879594049SPradeep Reddy POTTETI 	}
192979594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
193079594049SPradeep Reddy POTTETI 			"console_rx_be_tx_be_tx_stop: Recv BE, Sent BE");
193179594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
193279594049SPradeep Reddy POTTETI 
193379594049SPradeep Reddy POTTETI 	return 0;
193479594049SPradeep Reddy POTTETI }
193579594049SPradeep Reddy POTTETI 
193679594049SPradeep Reddy POTTETI 
193779594049SPradeep Reddy POTTETI static int console_rx_vi_tx_be(struct sigma_stream *s, unsigned int *rpkt,
193879594049SPradeep Reddy POTTETI 			       int len)
193979594049SPradeep Reddy POTTETI {
194079594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
194179594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
194279594049SPradeep Reddy POTTETI 	int res;
194379594049SPradeep Reddy POTTETI 
194479594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
194579594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
194679594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_be: Expected Pkt not Recv or Bad TOS");
194779594049SPradeep Reddy POTTETI 		return 0;
194879594049SPradeep Reddy POTTETI 	}
194979594049SPradeep Reddy POTTETI 
195079594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
195179594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
195279594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
195379594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
195479594049SPradeep Reddy POTTETI 	if (res >= 0) {
195579594049SPradeep Reddy POTTETI 		s->tx_frames++;
195679594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
195779594049SPradeep Reddy POTTETI 	}
195879594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
195979594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
196079594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_be: Recv VI, Sent BE");
196179594049SPradeep Reddy POTTETI 
196279594049SPradeep Reddy POTTETI 	return 0;
196379594049SPradeep Reddy POTTETI }
196479594049SPradeep Reddy POTTETI 
196579594049SPradeep Reddy POTTETI 
196679594049SPradeep Reddy POTTETI static int console_rx_vi_tx_bk(struct sigma_stream *s, unsigned int *rpkt,
196779594049SPradeep Reddy POTTETI 			       int len)
196879594049SPradeep Reddy POTTETI {
196979594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
197079594049SPradeep Reddy POTTETI 	u32 tos = TOS_BK;
197179594049SPradeep Reddy POTTETI 	int res;
197279594049SPradeep Reddy POTTETI 
197379594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
197479594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
197579594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_bk: Expected Pkt not Recv or Bad TOS");
197679594049SPradeep Reddy POTTETI 		return 0;
197779594049SPradeep Reddy POTTETI 	}
197879594049SPradeep Reddy POTTETI 
197979594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
198079594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
198179594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
198279594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
198379594049SPradeep Reddy POTTETI 	if (res >= 0) {
198479594049SPradeep Reddy POTTETI 		s->tx_frames++;
198579594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
198679594049SPradeep Reddy POTTETI 	}
198779594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
198879594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
198979594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_bk: Recv VI, Sent BK");
199079594049SPradeep Reddy POTTETI 
199179594049SPradeep Reddy POTTETI 	return 0;
199279594049SPradeep Reddy POTTETI }
199379594049SPradeep Reddy POTTETI 
199479594049SPradeep Reddy POTTETI 
199579594049SPradeep Reddy POTTETI static int console_rx_vo_tx_bcst_tx_stop(struct sigma_stream *s,
199679594049SPradeep Reddy POTTETI 					 unsigned int *rpkt, int len)
199779594049SPradeep Reddy POTTETI {
199879594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
199979594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
200079594049SPradeep Reddy POTTETI 	int res;
200179594049SPradeep Reddy POTTETI 	int broadcast = 1;
200279594049SPradeep Reddy POTTETI 	struct sockaddr_in bcst_addr;
200379594049SPradeep Reddy POTTETI 
200479594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
200579594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
200679594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_bcst_tx_stop: Expected Pkt not Recv or Bad TOS");
200779594049SPradeep Reddy POTTETI 		return 0;
200879594049SPradeep Reddy POTTETI 	}
200979594049SPradeep Reddy POTTETI 
201079594049SPradeep Reddy POTTETI 	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
201179594049SPradeep Reddy POTTETI 	bcst_addr.sin_family = AF_INET;
201279594049SPradeep Reddy POTTETI 	bcst_addr.sin_port = htons(s->dst_port);
201379594049SPradeep Reddy POTTETI 	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
201479594049SPradeep Reddy POTTETI 
201579594049SPradeep Reddy POTTETI 	usleep(300000);
201679594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
201779594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
201879594049SPradeep Reddy POTTETI 	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
201979594049SPradeep Reddy POTTETI 		   sizeof(broadcast));
202079594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
202179594049SPradeep Reddy POTTETI 	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
202279594049SPradeep Reddy POTTETI 		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
202379594049SPradeep Reddy POTTETI 	if (res >= 0) {
202479594049SPradeep Reddy POTTETI 		s->tx_frames++;
202579594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
202679594049SPradeep Reddy POTTETI 	}
202779594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
202879594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_bcst_tx_stop: Recv VO, Sent Broadcast res = %d",
202979594049SPradeep Reddy POTTETI 			res);
203079594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
203179594049SPradeep Reddy POTTETI 
203279594049SPradeep Reddy POTTETI 	return 0;
203379594049SPradeep Reddy POTTETI }
203479594049SPradeep Reddy POTTETI 
203579594049SPradeep Reddy POTTETI 
203679594049SPradeep Reddy POTTETI static int console_rx_vi_tx_bcst(struct sigma_stream *s, unsigned int *rpkt,
203779594049SPradeep Reddy POTTETI 				 int len)
203879594049SPradeep Reddy POTTETI {
203979594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
204079594049SPradeep Reddy POTTETI 	u32 tos = TOS_VI;
204179594049SPradeep Reddy POTTETI 	int res;
204279594049SPradeep Reddy POTTETI 	int broadcast = 1;
204379594049SPradeep Reddy POTTETI 	struct sockaddr_in bcst_addr;
204479594049SPradeep Reddy POTTETI 
204579594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
204679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
204779594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_bcst: Expected Pkt not Recv or Bad TOS");
204879594049SPradeep Reddy POTTETI 		return 0;
204979594049SPradeep Reddy POTTETI 	}
205079594049SPradeep Reddy POTTETI 
205179594049SPradeep Reddy POTTETI 	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
205279594049SPradeep Reddy POTTETI 	bcst_addr.sin_family = AF_INET;
205379594049SPradeep Reddy POTTETI 	bcst_addr.sin_port = htons(s->dst_port);
205479594049SPradeep Reddy POTTETI 	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
205579594049SPradeep Reddy POTTETI 
205679594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
205779594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
205879594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
205979594049SPradeep Reddy POTTETI 	if (res >= 0) {
206079594049SPradeep Reddy POTTETI 		s->tx_frames++;
206179594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
206279594049SPradeep Reddy POTTETI 	}
206379594049SPradeep Reddy POTTETI 	tos = TOS_BE;
206479594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
206579594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
206679594049SPradeep Reddy POTTETI 	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
206779594049SPradeep Reddy POTTETI 		   sizeof(broadcast));
206879594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
206979594049SPradeep Reddy POTTETI 	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
207079594049SPradeep Reddy POTTETI 		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
207179594049SPradeep Reddy POTTETI 	if (res >= 0) {
207279594049SPradeep Reddy POTTETI 		s->tx_frames++;
207379594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
207479594049SPradeep Reddy POTTETI 	}
207579594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
207679594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_bcst: Recv/Sent VI, Sent Broadcast res = %d",
207779594049SPradeep Reddy POTTETI 			res);
207879594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
207979594049SPradeep Reddy POTTETI 
208079594049SPradeep Reddy POTTETI 	return 0;
208179594049SPradeep Reddy POTTETI }
208279594049SPradeep Reddy POTTETI 
208379594049SPradeep Reddy POTTETI 
208479594049SPradeep Reddy POTTETI static int console_rx_be_tx_bcst(struct sigma_stream *s, unsigned int *rpkt,
208579594049SPradeep Reddy POTTETI 				 int len)
208679594049SPradeep Reddy POTTETI {
208779594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
208879594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
208979594049SPradeep Reddy POTTETI 	int res;
209079594049SPradeep Reddy POTTETI 	int broadcast = 1;
209179594049SPradeep Reddy POTTETI 	struct sockaddr_in bcst_addr;
209279594049SPradeep Reddy POTTETI 
209379594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
209479594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
209579594049SPradeep Reddy POTTETI 				"console_rx_be_tx_bcst: Expected Pkt not Recv or Bad TOS");
209679594049SPradeep Reddy POTTETI 		return 0;
209779594049SPradeep Reddy POTTETI 	}
209879594049SPradeep Reddy POTTETI 
209979594049SPradeep Reddy POTTETI 	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
210079594049SPradeep Reddy POTTETI 	bcst_addr.sin_family = AF_INET;
210179594049SPradeep Reddy POTTETI 	bcst_addr.sin_port = htons(s->dst_port);
210279594049SPradeep Reddy POTTETI 	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
210379594049SPradeep Reddy POTTETI 
210479594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
210579594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
210679594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
210779594049SPradeep Reddy POTTETI 	if (res >= 0) {
210879594049SPradeep Reddy POTTETI 		s->tx_frames++;
210979594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
211079594049SPradeep Reddy POTTETI 	}
211179594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
211279594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
211379594049SPradeep Reddy POTTETI 	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
211479594049SPradeep Reddy POTTETI 		   sizeof(broadcast));
211579594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
211679594049SPradeep Reddy POTTETI 	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
211779594049SPradeep Reddy POTTETI 		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
211879594049SPradeep Reddy POTTETI 	if (res >= 0) {
211979594049SPradeep Reddy POTTETI 		s->tx_frames++;
212079594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
212179594049SPradeep Reddy POTTETI 	}
212279594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
212379594049SPradeep Reddy POTTETI 			"console_rx_be_tx_bcst: Recv/Sent BE, Sent Broadcast res = %d",
212479594049SPradeep Reddy POTTETI 			res);
212579594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
212679594049SPradeep Reddy POTTETI 
212779594049SPradeep Reddy POTTETI 	return 0;
212879594049SPradeep Reddy POTTETI }
212979594049SPradeep Reddy POTTETI 
213079594049SPradeep Reddy POTTETI 
213179594049SPradeep Reddy POTTETI static int console_rx_be_tx_bcst_tx_stop(struct sigma_stream *s,
213279594049SPradeep Reddy POTTETI 					 unsigned int *rpkt, int len)
213379594049SPradeep Reddy POTTETI {
213479594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
213579594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
213679594049SPradeep Reddy POTTETI 	int res;
213779594049SPradeep Reddy POTTETI 	int broadcast = 1;
213879594049SPradeep Reddy POTTETI 	struct sockaddr_in bcst_addr;
213979594049SPradeep Reddy POTTETI 
214079594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
214179594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
214279594049SPradeep Reddy POTTETI 				"console_rx_be_tx_bcst_tx_stop: Expected Pkt not Recv or Bad TOS");
214379594049SPradeep Reddy POTTETI 		return 0;
214479594049SPradeep Reddy POTTETI 	}
214579594049SPradeep Reddy POTTETI 
214679594049SPradeep Reddy POTTETI 	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
214779594049SPradeep Reddy POTTETI 	bcst_addr.sin_family = AF_INET;
214879594049SPradeep Reddy POTTETI 	bcst_addr.sin_port = htons(s->dst_port);
214979594049SPradeep Reddy POTTETI 	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
215079594049SPradeep Reddy POTTETI 
215179594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
215279594049SPradeep Reddy POTTETI 	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
215379594049SPradeep Reddy POTTETI 		   sizeof(broadcast));
215479594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
215579594049SPradeep Reddy POTTETI 	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
215679594049SPradeep Reddy POTTETI 		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
215779594049SPradeep Reddy POTTETI 	if (res >= 0) {
215879594049SPradeep Reddy POTTETI 		s->tx_frames++;
215979594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
216079594049SPradeep Reddy POTTETI 	}
216179594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
216279594049SPradeep Reddy POTTETI 			"console_rx_be_tx_bcst_tx_stop: Recv BE, Sent Broadcast res = %d",
216379594049SPradeep Reddy POTTETI 			res);
216479594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
216579594049SPradeep Reddy POTTETI 
216679594049SPradeep Reddy POTTETI 	return 0;
216779594049SPradeep Reddy POTTETI }
216879594049SPradeep Reddy POTTETI 
216979594049SPradeep Reddy POTTETI 
217079594049SPradeep Reddy POTTETI static int console_rx_vi_tx_vi(struct sigma_stream *s, unsigned int *rpkt,
217179594049SPradeep Reddy POTTETI 			       int len)
217279594049SPradeep Reddy POTTETI {
217379594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
217479594049SPradeep Reddy POTTETI 	u32 tos = TOS_VI;
217579594049SPradeep Reddy POTTETI 	int res;
217679594049SPradeep Reddy POTTETI 
217779594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
217879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
217979594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_vi: Expected Pkt not Recv or Bad TOS");
218079594049SPradeep Reddy POTTETI 		return 0;
218179594049SPradeep Reddy POTTETI 	}
218279594049SPradeep Reddy POTTETI 
218379594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
218479594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
218579594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
218679594049SPradeep Reddy POTTETI 	if (res >= 0) {
218779594049SPradeep Reddy POTTETI 		s->tx_frames++;
218879594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
218979594049SPradeep Reddy POTTETI 	}
219079594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
219179594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
219279594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_vi: Recv VI, Sent VI");
219379594049SPradeep Reddy POTTETI 
219479594049SPradeep Reddy POTTETI 	return 0;
219579594049SPradeep Reddy POTTETI }
219679594049SPradeep Reddy POTTETI 
219779594049SPradeep Reddy POTTETI 
219879594049SPradeep Reddy POTTETI static int console_rx_vi_tx_vi_tx_stop(struct sigma_stream *s,
219979594049SPradeep Reddy POTTETI 				       unsigned int *rpkt, int len)
220079594049SPradeep Reddy POTTETI {
220179594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
220279594049SPradeep Reddy POTTETI 	u32 tos = TOS_VI;
220379594049SPradeep Reddy POTTETI 	int res;
220479594049SPradeep Reddy POTTETI 
220579594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
220679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
220779594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_vi_tx_stop: Expected Pkt not Recv or Bad TOS");
220879594049SPradeep Reddy POTTETI 		return 0;
220979594049SPradeep Reddy POTTETI 	}
221079594049SPradeep Reddy POTTETI 
221179594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
221279594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
221379594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
221479594049SPradeep Reddy POTTETI 	if (res >= 0) {
221579594049SPradeep Reddy POTTETI 		s->tx_frames++;
221679594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
221779594049SPradeep Reddy POTTETI 	}
221879594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
221979594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_vi_tx_stop: Recv VI, Sent VI");
222079594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
222179594049SPradeep Reddy POTTETI 
222279594049SPradeep Reddy POTTETI 	return 0;
222379594049SPradeep Reddy POTTETI }
222479594049SPradeep Reddy POTTETI 
222579594049SPradeep Reddy POTTETI 
222679594049SPradeep Reddy POTTETI static int console_rx_vi_tx_vo_tx_stop(struct sigma_stream *s,
222779594049SPradeep Reddy POTTETI 				       unsigned int *rpkt, int len)
222879594049SPradeep Reddy POTTETI {
222979594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
223079594049SPradeep Reddy POTTETI 	u32 tos = TOS_VO7;
223179594049SPradeep Reddy POTTETI 	int res;
223279594049SPradeep Reddy POTTETI 
223379594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
223479594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
223579594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
223679594049SPradeep Reddy POTTETI 		return 0;
223779594049SPradeep Reddy POTTETI 	}
223879594049SPradeep Reddy POTTETI 
223979594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
224079594049SPradeep Reddy POTTETI 	rpkt[1] = TOS_VO;
224179594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
224279594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
224379594049SPradeep Reddy POTTETI 	if (res >= 0) {
224479594049SPradeep Reddy POTTETI 		s->tx_frames++;
224579594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
224679594049SPradeep Reddy POTTETI 	}
224779594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
224879594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_vo_tx_stop: Recv VI, Sent VO");
224979594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
225079594049SPradeep Reddy POTTETI 
225179594049SPradeep Reddy POTTETI 	return 0;
225279594049SPradeep Reddy POTTETI }
225379594049SPradeep Reddy POTTETI 
225479594049SPradeep Reddy POTTETI 
225579594049SPradeep Reddy POTTETI static int console_rx_vo_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
225679594049SPradeep Reddy POTTETI 				 int len)
225779594049SPradeep Reddy POTTETI {
225879594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
225979594049SPradeep Reddy POTTETI 
226079594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
226179594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
226279594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
226379594049SPradeep Reddy POTTETI 		return 0;
226479594049SPradeep Reddy POTTETI 	}
226579594049SPradeep Reddy POTTETI 
226679594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vo_tx_stop: Recv VO");
226779594049SPradeep Reddy POTTETI 	sleep(1);
226879594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
226979594049SPradeep Reddy POTTETI 
227079594049SPradeep Reddy POTTETI 	return 0;
227179594049SPradeep Reddy POTTETI }
227279594049SPradeep Reddy POTTETI 
227379594049SPradeep Reddy POTTETI 
227479594049SPradeep Reddy POTTETI static int console_rx_vi_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
227579594049SPradeep Reddy POTTETI 				 int len)
227679594049SPradeep Reddy POTTETI {
227779594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
227879594049SPradeep Reddy POTTETI 
227979594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
228079594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
228179594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_stop: Expected Pkt not Recv or Bad TOS");
228279594049SPradeep Reddy POTTETI 		return 0;
228379594049SPradeep Reddy POTTETI 	}
228479594049SPradeep Reddy POTTETI 
228579594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vi_tx_stop: Recv VI");
228679594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
228779594049SPradeep Reddy POTTETI 
228879594049SPradeep Reddy POTTETI 	return 0;
228979594049SPradeep Reddy POTTETI }
229079594049SPradeep Reddy POTTETI 
229179594049SPradeep Reddy POTTETI 
229279594049SPradeep Reddy POTTETI static int console_rx_bk_tx_stop(struct  sigma_stream *s, unsigned int *rpkt,
229379594049SPradeep Reddy POTTETI 				 int len)
229479594049SPradeep Reddy POTTETI {
229579594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
229679594049SPradeep Reddy POTTETI 
229779594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BK)) {
229879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
229979594049SPradeep Reddy POTTETI 				"console_rx_bk_tx_stop: Expected Pkt not Recv or Bad TOS");
230079594049SPradeep Reddy POTTETI 		return 0;
230179594049SPradeep Reddy POTTETI 	}
230279594049SPradeep Reddy POTTETI 
230379594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_bk_tx_stop: Recv BK");
230479594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
230579594049SPradeep Reddy POTTETI 
230679594049SPradeep Reddy POTTETI 	return 0;
230779594049SPradeep Reddy POTTETI }
230879594049SPradeep Reddy POTTETI 
230979594049SPradeep Reddy POTTETI 
231079594049SPradeep Reddy POTTETI static int console_rx_vo_tx_2vo(struct sigma_stream *s, unsigned int *rpkt,
231179594049SPradeep Reddy POTTETI 				int len)
231279594049SPradeep Reddy POTTETI {
231379594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
231479594049SPradeep Reddy POTTETI 	u32 tos = TOS_VO7;
231579594049SPradeep Reddy POTTETI 	int res;
231679594049SPradeep Reddy POTTETI 
231779594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
231879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
231979594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_2vo: Expected Pkt not Recv or Bad TOS");
232079594049SPradeep Reddy POTTETI 		return 0;
232179594049SPradeep Reddy POTTETI 	}
232279594049SPradeep Reddy POTTETI 
232379594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
232479594049SPradeep Reddy POTTETI 	rpkt[1] = TOS_VO;
232579594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
232679594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
232779594049SPradeep Reddy POTTETI 	if (res >= 0) {
232879594049SPradeep Reddy POTTETI 		s->tx_frames++;
232979594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
233079594049SPradeep Reddy POTTETI 	}
233179594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
233279594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
233379594049SPradeep Reddy POTTETI 	if (res >= 0) {
233479594049SPradeep Reddy POTTETI 		s->tx_frames++;
233579594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
233679594049SPradeep Reddy POTTETI 	}
233779594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
233879594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
233979594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_2vo: Recv VO, Sent 2 VO");
234079594049SPradeep Reddy POTTETI 
234179594049SPradeep Reddy POTTETI 	return 0;
234279594049SPradeep Reddy POTTETI }
234379594049SPradeep Reddy POTTETI 
234479594049SPradeep Reddy POTTETI 
234579594049SPradeep Reddy POTTETI static int console_rx_be(struct sigma_stream *s, unsigned int *rpkt, int len)
234679594049SPradeep Reddy POTTETI {
234779594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
234879594049SPradeep Reddy POTTETI 
234979594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
235079594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
235179594049SPradeep Reddy POTTETI 				"console_rx_be: Expected Pkt not Recv or Bad TOS");
235279594049SPradeep Reddy POTTETI 		return 0;
235379594049SPradeep Reddy POTTETI 	}
235479594049SPradeep Reddy POTTETI 
235579594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
235679594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_be: Recv BE");
235779594049SPradeep Reddy POTTETI 
235879594049SPradeep Reddy POTTETI 	return 0;
235979594049SPradeep Reddy POTTETI }
236079594049SPradeep Reddy POTTETI 
236179594049SPradeep Reddy POTTETI 
236279594049SPradeep Reddy POTTETI static int console_rx_vi(struct sigma_stream *s, unsigned int *rpkt, int len)
236379594049SPradeep Reddy POTTETI {
236479594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
236579594049SPradeep Reddy POTTETI 
236679594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
236779594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
236879594049SPradeep Reddy POTTETI 				"console_rx_vi: Expected Pkt not Recv or Bad TOS");
236979594049SPradeep Reddy POTTETI 		return 0;
237079594049SPradeep Reddy POTTETI 	}
237179594049SPradeep Reddy POTTETI 
237279594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
237379594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vi: Recv VI");
237479594049SPradeep Reddy POTTETI 
237579594049SPradeep Reddy POTTETI 	return 0;
237679594049SPradeep Reddy POTTETI }
237779594049SPradeep Reddy POTTETI 
237879594049SPradeep Reddy POTTETI 
237979594049SPradeep Reddy POTTETI static int console_rx_vo(struct sigma_stream *s, unsigned int *rpkt, int len)
238079594049SPradeep Reddy POTTETI {
238179594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
238279594049SPradeep Reddy POTTETI 
238379594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
238479594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
238579594049SPradeep Reddy POTTETI 				"console_rx_vo : Expected Pkt not Recv or Bad TOS");
238679594049SPradeep Reddy POTTETI 		return 0;
238779594049SPradeep Reddy POTTETI 	}
238879594049SPradeep Reddy POTTETI 
238979594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
239079594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vo: Recv VO");
239179594049SPradeep Reddy POTTETI 
239279594049SPradeep Reddy POTTETI 	return 0;
239379594049SPradeep Reddy POTTETI 
239479594049SPradeep Reddy POTTETI }
239579594049SPradeep Reddy POTTETI 
239679594049SPradeep Reddy POTTETI 
239779594049SPradeep Reddy POTTETI static int console_rx_vo_tx_vo_cyclic(struct sigma_stream *s,
239879594049SPradeep Reddy POTTETI 				      unsigned int *rpkt, int len)
239979594049SPradeep Reddy POTTETI {
240079594049SPradeep Reddy POTTETI 	int res = 0;
240179594049SPradeep Reddy POTTETI 	unsigned int tos = 0;
240279594049SPradeep Reddy POTTETI 	unsigned int *tpkt;
240379594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
240479594049SPradeep Reddy POTTETI 
240579594049SPradeep Reddy POTTETI 	tpkt = malloc(s->payload_size);
240679594049SPradeep Reddy POTTETI 	if (tpkt == NULL)
240779594049SPradeep Reddy POTTETI 		return -1;
240879594049SPradeep Reddy POTTETI 
240979594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
241079594049SPradeep Reddy POTTETI 		if (rpkt[10] != APTS_STOP)
241179594049SPradeep Reddy POTTETI 			sigma_uapsd_reset(s);
241279594049SPradeep Reddy POTTETI 
241379594049SPradeep Reddy POTTETI 		if (!packet_expected(s, rpkt, APTS_STOP, TOS_BE)) {
241479594049SPradeep Reddy POTTETI 			sigma_dut_print(dut, DUT_MSG_ERROR,
241579594049SPradeep Reddy POTTETI 					"console_rx_vo_tx_vo_cyclic: Expected STOP Pkt not Recv or Bad TOS");
241679594049SPradeep Reddy POTTETI 			free(tpkt);
241779594049SPradeep Reddy POTTETI 			return 0;
241879594049SPradeep Reddy POTTETI 		}
241979594049SPradeep Reddy POTTETI 
2420*1977e0d0SPradeep Reddy POTTETI 		memset(tpkt, 0, s->payload_size);
242179594049SPradeep Reddy POTTETI 		tpkt[0] = s->rx_cookie;
242279594049SPradeep Reddy POTTETI 		tos = TOS_BE;
242379594049SPradeep Reddy POTTETI 		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
242479594049SPradeep Reddy POTTETI 		create_apts_pkt(APTS_STOP, tpkt, tos, s);
242579594049SPradeep Reddy POTTETI 		tpkt[1] = tos;
242679594049SPradeep Reddy POTTETI 		if (s->can_quit) {
2427*1977e0d0SPradeep Reddy POTTETI 			const char *stop_cmd = "APTSL1 STOP";
2428*1977e0d0SPradeep Reddy POTTETI 			size_t stop_cmd_len = strlen(stop_cmd);
2429*1977e0d0SPradeep Reddy POTTETI 
2430*1977e0d0SPradeep Reddy POTTETI 			if (s->payload_size > 11 * sizeof(int) + stop_cmd_len)
2431*1977e0d0SPradeep Reddy POTTETI 				memcpy(&tpkt[11], stop_cmd, stop_cmd_len + 1);
243279594049SPradeep Reddy POTTETI 			res = send(s->sock, tpkt, s->payload_size / 2, 0);
243379594049SPradeep Reddy POTTETI 			if (res >= 0) {
243479594049SPradeep Reddy POTTETI 				s->tx_frames++;
243579594049SPradeep Reddy POTTETI 				s->tx_payload_bytes += res;
243679594049SPradeep Reddy POTTETI 			}
243779594049SPradeep Reddy POTTETI 			sigma_dut_print(dut, DUT_MSG_INFO,
243879594049SPradeep Reddy POTTETI 					"console_rx_vo_tx_vo_cyclic: Sent STOP");
243979594049SPradeep Reddy POTTETI 			sleep(5);
244079594049SPradeep Reddy POTTETI 			s->stop = 1;
244179594049SPradeep Reddy POTTETI 		} else {
244279594049SPradeep Reddy POTTETI 			res = send(s->sock, tpkt, s->payload_size / 2, 0);
244379594049SPradeep Reddy POTTETI 			if (res >= 0) {
244479594049SPradeep Reddy POTTETI 				s->tx_frames++;
244579594049SPradeep Reddy POTTETI 				s->tx_payload_bytes += res;
244679594049SPradeep Reddy POTTETI 			}
244779594049SPradeep Reddy POTTETI 			s->can_quit = 1;
244879594049SPradeep Reddy POTTETI 		}
244979594049SPradeep Reddy POTTETI 	} else {
245079594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_INFO,
245179594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_vo_cyclic: Recv Pkt: %d Cookie: %d Sta-id %d",
245279594049SPradeep Reddy POTTETI 				rpkt[0], s->rx_cookie, s->sta_id);
245379594049SPradeep Reddy POTTETI 		rpkt[0] = ++(s->rx_cookie);
245479594049SPradeep Reddy POTTETI 		tos = TOS_VO7;
245579594049SPradeep Reddy POTTETI 		rpkt[1] = TOS_VO;
245679594049SPradeep Reddy POTTETI 		res = setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos,
245779594049SPradeep Reddy POTTETI 				 sizeof(tos));
245879594049SPradeep Reddy POTTETI 		res = send(s->sock, rpkt, s->payload_size / 2, 0);
245979594049SPradeep Reddy POTTETI 		if (res >= 0) {
246079594049SPradeep Reddy POTTETI 			s->tx_frames++;
246179594049SPradeep Reddy POTTETI 			s->tx_payload_bytes += res;
246279594049SPradeep Reddy POTTETI 		}
246379594049SPradeep Reddy POTTETI 
246479594049SPradeep Reddy POTTETI 		if (s->rx_cookie >= 3000) {
246579594049SPradeep Reddy POTTETI 			/* No state change for L.1 */
246679594049SPradeep Reddy POTTETI 		}
246779594049SPradeep Reddy POTTETI 	}
246879594049SPradeep Reddy POTTETI 
246979594049SPradeep Reddy POTTETI 	free(tpkt);
247079594049SPradeep Reddy POTTETI 
247179594049SPradeep Reddy POTTETI 	return 0;
247279594049SPradeep Reddy POTTETI }
247379594049SPradeep Reddy POTTETI 
247479594049SPradeep Reddy POTTETI 
247579594049SPradeep Reddy POTTETI static struct apts_pkt * apts_lookup(const char *s)
247679594049SPradeep Reddy POTTETI {
247779594049SPradeep Reddy POTTETI 	struct apts_pkt *t;
247879594049SPradeep Reddy POTTETI 
247979594049SPradeep Reddy POTTETI 	for (t = &apts_pkts[1]; s && t->cmd; t++) {
2480e104a5bcSPradeep Reddy POTTETI 		if (strcmp(s, "L.1AP") == 0)
2481e104a5bcSPradeep Reddy POTTETI 			s = "L.1";
248279594049SPradeep Reddy POTTETI 		if (t->name && strcmp(t->name, s) == 0)
248379594049SPradeep Reddy POTTETI 			return t;
248479594049SPradeep Reddy POTTETI 	}
248579594049SPradeep Reddy POTTETI 
248679594049SPradeep Reddy POTTETI 	return NULL;
248779594049SPradeep Reddy POTTETI }
248879594049SPradeep Reddy POTTETI 
248979594049SPradeep Reddy POTTETI 
249079594049SPradeep Reddy POTTETI void send_uapsd_console(struct sigma_stream *s)
249179594049SPradeep Reddy POTTETI {
249279594049SPradeep Reddy POTTETI 	struct timeval tv;
249379594049SPradeep Reddy POTTETI 	fd_set rfds;
249479594049SPradeep Reddy POTTETI 	int res;
249579594049SPradeep Reddy POTTETI 	unsigned int *rpkt;
249679594049SPradeep Reddy POTTETI 	uapsd_console_state_func_ptr console_state_func;
249779594049SPradeep Reddy POTTETI 	struct apts_pkt *testcase;
249879594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
249979594049SPradeep Reddy POTTETI 	/* start timer for self exit */
250079594049SPradeep Reddy POTTETI 	int uapsd_timer = UAPSD_CONSOLE_TIMER;
250179594049SPradeep Reddy POTTETI 
250279594049SPradeep Reddy POTTETI 	s->can_quit = 0;
250379594049SPradeep Reddy POTTETI 	s->reset = 0;
250479594049SPradeep Reddy POTTETI 	s->reset_rx = 0;
250579594049SPradeep Reddy POTTETI 	s->uapsd_sta_tc = 0;
250679594049SPradeep Reddy POTTETI 
250779594049SPradeep Reddy POTTETI 	testcase = apts_lookup(s->test_name);
250879594049SPradeep Reddy POTTETI 	if (testcase == NULL) {
250979594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
251079594049SPradeep Reddy POTTETI 				"send_uapsd_console: no testcase found");
251179594049SPradeep Reddy POTTETI 		return;
251279594049SPradeep Reddy POTTETI 	}
251379594049SPradeep Reddy POTTETI 
251479594049SPradeep Reddy POTTETI 	/* send test case number to be executed */
251579594049SPradeep Reddy POTTETI 	s->uapsd_sta_tc = testcase->cmd;
251679594049SPradeep Reddy POTTETI 	if (s->uapsd_sta_tc < B_D || s->uapsd_sta_tc > LAST_TC) {
251779594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
251879594049SPradeep Reddy POTTETI 				"send_uapsd_console: Test Case: %s Unknown",
251979594049SPradeep Reddy POTTETI 				s->test_name);
252079594049SPradeep Reddy POTTETI 		return;
252179594049SPradeep Reddy POTTETI 	}
252279594049SPradeep Reddy POTTETI 
252379594049SPradeep Reddy POTTETI 	s->payload_size = 512;
252479594049SPradeep Reddy POTTETI 	rpkt = malloc(s->payload_size);
252579594049SPradeep Reddy POTTETI 	if (rpkt == NULL) {
252679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
252779594049SPradeep Reddy POTTETI 				"send_uapsd_console: buffer allocation failed");
252879594049SPradeep Reddy POTTETI 		return;
252979594049SPradeep Reddy POTTETI 	}
253079594049SPradeep Reddy POTTETI 
253179594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
253279594049SPradeep Reddy POTTETI 			"send_uapsd_console: Uapsd Console Start");
253379594049SPradeep Reddy POTTETI 
253479594049SPradeep Reddy POTTETI 	while (!s->stop) {
253579594049SPradeep Reddy POTTETI 		uapsd_timer--;
253679594049SPradeep Reddy POTTETI 		FD_ZERO(&rfds);
253779594049SPradeep Reddy POTTETI 		FD_SET(s->sock, &rfds);
253879594049SPradeep Reddy POTTETI 		tv.tv_sec = 0;
253979594049SPradeep Reddy POTTETI 		tv.tv_usec = 300000;
254079594049SPradeep Reddy POTTETI 		res = select(s->sock + 1, &rfds, NULL, NULL, &tv);
254179594049SPradeep Reddy POTTETI 		if (res < 0) {
254279594049SPradeep Reddy POTTETI 			perror("select");
254379594049SPradeep Reddy POTTETI 			usleep(10000);
254479594049SPradeep Reddy POTTETI 		} else if (FD_ISSET(s->sock, &rfds)) {
254579594049SPradeep Reddy POTTETI 			memset(rpkt, 0, s->payload_size);
254679594049SPradeep Reddy POTTETI 			res = recv(s->sock, rpkt, s->payload_size, 0);
254779594049SPradeep Reddy POTTETI 			if (res < 0) {
254879594049SPradeep Reddy POTTETI 				perror("recv");
254979594049SPradeep Reddy POTTETI 				break;
255079594049SPradeep Reddy POTTETI 			}
255179594049SPradeep Reddy POTTETI 
255279594049SPradeep Reddy POTTETI 			sigma_dut_print(dut, DUT_MSG_INFO,
255379594049SPradeep Reddy POTTETI 					"send_uapsd_console: running res %d cookie %d dscp %d apts-pkt %d sta-id %d",
255479594049SPradeep Reddy POTTETI 					res, rpkt[0], rpkt[1], rpkt[10],
255579594049SPradeep Reddy POTTETI 					rpkt[9]);
255679594049SPradeep Reddy POTTETI 			if (res == 0)
255779594049SPradeep Reddy POTTETI 				continue;
255879594049SPradeep Reddy POTTETI 
255979594049SPradeep Reddy POTTETI 			s->rx_frames++;
256079594049SPradeep Reddy POTTETI 			s->rx_payload_bytes += res;
256179594049SPradeep Reddy POTTETI 			/*
256279594049SPradeep Reddy POTTETI 			 * Reset the timer as packet is received
256379594049SPradeep Reddy POTTETI 			 * within steps.
256479594049SPradeep Reddy POTTETI 			 */
256579594049SPradeep Reddy POTTETI 			uapsd_timer = UAPSD_CONSOLE_TIMER;
256679594049SPradeep Reddy POTTETI 
256779594049SPradeep Reddy POTTETI 			if (rpkt[10] == APTS_HELLO) {
256879594049SPradeep Reddy POTTETI 				if (s->reset)
256979594049SPradeep Reddy POTTETI 					s->reset = 0;
257079594049SPradeep Reddy POTTETI 				s->rx_cookie = 0;
257183d62cbbSPradeep Reddy POTTETI 				/* assign a unique id to this sta */
257283d62cbbSPradeep Reddy POTTETI 				s->sta_id = s->stream_id;
257379594049SPradeep Reddy POTTETI 				/* uapsd console process table state */
257479594049SPradeep Reddy POTTETI 				s->uapsd_rx_state = 0;
257579594049SPradeep Reddy POTTETI 				s->can_quit = 1;
257679594049SPradeep Reddy POTTETI 			} else {
257779594049SPradeep Reddy POTTETI 				if (s->reset)
257879594049SPradeep Reddy POTTETI 					continue;
257979594049SPradeep Reddy POTTETI 			}
258079594049SPradeep Reddy POTTETI 
258179594049SPradeep Reddy POTTETI 			if (rpkt[10] == APTS_RESET) {
258279594049SPradeep Reddy POTTETI 				sigma_dut_print(dut, DUT_MSG_ERROR,
258379594049SPradeep Reddy POTTETI 						"send_uapsd_console: RESET Pkt recv");
258479594049SPradeep Reddy POTTETI 				s->reset_rx = 1;
258579594049SPradeep Reddy POTTETI 				sigma_uapsd_reset(s);
258679594049SPradeep Reddy POTTETI 			}
258779594049SPradeep Reddy POTTETI 
258879594049SPradeep Reddy POTTETI 			if (rpkt[10] == APTS_RESET_STOP) {
258979594049SPradeep Reddy POTTETI 				sigma_dut_print(dut, DUT_MSG_ERROR,
259079594049SPradeep Reddy POTTETI 						"send_uapsd_console: RESET STOP Pkt recv");
259179594049SPradeep Reddy POTTETI 				s->stop = 1;
259279594049SPradeep Reddy POTTETI 			}
259379594049SPradeep Reddy POTTETI 
259479594049SPradeep Reddy POTTETI 			if (rpkt[10] == APTS_BCST) {
259579594049SPradeep Reddy POTTETI 				sigma_dut_print(dut, DUT_MSG_INFO,
259679594049SPradeep Reddy POTTETI 						"send_uapsd_console: Broadcast Pkt recv");
259779594049SPradeep Reddy POTTETI 				continue;
259879594049SPradeep Reddy POTTETI 			}
259979594049SPradeep Reddy POTTETI 
260079594049SPradeep Reddy POTTETI 			console_state_func =
260179594049SPradeep Reddy POTTETI 				uapsd_console_state_tbl[s->uapsd_sta_tc]
260279594049SPradeep Reddy POTTETI 				[s->uapsd_rx_state].state_func;
260379594049SPradeep Reddy POTTETI 			if (console_state_func) {
260479594049SPradeep Reddy POTTETI 				console_state_func(s, rpkt, res);
260579594049SPradeep Reddy POTTETI 			} else {
260679594049SPradeep Reddy POTTETI 				sigma_dut_print(dut, DUT_MSG_INFO,
260779594049SPradeep Reddy POTTETI 						"send_uapsd_console: Null function detected for TC: %d in uapsd_rx_state: %d",
260879594049SPradeep Reddy POTTETI 						s->uapsd_sta_tc,
260979594049SPradeep Reddy POTTETI 						s->uapsd_rx_state);
261079594049SPradeep Reddy POTTETI 			}
261179594049SPradeep Reddy POTTETI 		}
261279594049SPradeep Reddy POTTETI 
261379594049SPradeep Reddy POTTETI 		/* Stop the thread. No transactions for the set time */
261479594049SPradeep Reddy POTTETI 		if (uapsd_timer == 0) {
261579594049SPradeep Reddy POTTETI 			sigma_dut_print(dut, DUT_MSG_INFO,
261679594049SPradeep Reddy POTTETI 					"send_uapsd_console: Timer Expired");
261779594049SPradeep Reddy POTTETI 			s->stop = 1;
261879594049SPradeep Reddy POTTETI 		}
261979594049SPradeep Reddy POTTETI 	}
262079594049SPradeep Reddy POTTETI 
262179594049SPradeep Reddy POTTETI 	free(rpkt);
262279594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
262379594049SPradeep Reddy POTTETI 			"send_uapsd_console: Uapsd Console End");
262479594049SPradeep Reddy POTTETI }
2625