xref: /wlan-dirver/utils/sigma-dut/uapsd_stream.c (revision 58d357b02caf48a045a76cecdb21df043ae654b6)
1cd4e3c3eSJouni Malinen /*
2cd4e3c3eSJouni Malinen  * Sigma Control API DUT (station/AP)
39d7e31d5SJouni Malinen  * Copyright (c) 2014-2017, 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,
32947fdf6dSJouni Malinen 				  size_t txbuf_len, 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 
create_apts_pkt(int msg,unsigned int txbuf[],size_t txbuf_len,u32 uapsd_dscp,struct sigma_stream * s)910947fdf6dSJouni Malinen static void create_apts_pkt(int msg, unsigned int txbuf[], size_t txbuf_len,
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;
928947fdf6dSJouni Malinen 	strlcpy((char *) &txbuf[11], t->name,
929947fdf6dSJouni Malinen 		txbuf_len - sizeof(txbuf[0]) * 11);
930cd4e3c3eSJouni Malinen }
931cd4e3c3eSJouni Malinen 
932cd4e3c3eSJouni Malinen 
uapsd_tx_start(struct sigma_stream * s,u32 usr_priority,enum uapsd_psave ps,u32 sleep_duration)933cd4e3c3eSJouni Malinen static int uapsd_tx_start(struct sigma_stream *s,
934cd4e3c3eSJouni Malinen 			  u32 usr_priority, enum uapsd_psave ps,
935cd4e3c3eSJouni Malinen 			  u32 sleep_duration)
936cd4e3c3eSJouni Malinen {
937cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
938cd4e3c3eSJouni Malinen 	int pktlen = 256;
939cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
940cd4e3c3eSJouni Malinen 	u32 msgid;
941cd4e3c3eSJouni Malinen 
942cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_start");
943cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
944cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
945cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
946cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
947cd4e3c3eSJouni Malinen 		return -1;
948cd4e3c3eSJouni Malinen 	}
949cd4e3c3eSJouni Malinen 
950cd4e3c3eSJouni Malinen 	/* check whether a test case is received */
951cd4e3c3eSJouni Malinen 	if (s->uapsd_rx_state > 0) {
952cd4e3c3eSJouni Malinen 		s->uapsd_tx_state++;
953cd4e3c3eSJouni Malinen 	} else {
954cd4e3c3eSJouni Malinen 		set_ps(s->ifname, dut, 0);
955cd4e3c3eSJouni Malinen 		if (s->tx_hello_cnt <= MAX_HELLO) {
956cd4e3c3eSJouni Malinen 			memset(tpkt, 0, s->payload_size);
957cd4e3c3eSJouni Malinen 			/* if test is for WMM-AC set APTS HELLO to 39 */
958cd4e3c3eSJouni Malinen 			msgid = sigma_wmm_ac ? WMMAC_APTS_HELLO : APTS_HELLO;
959947fdf6dSJouni Malinen 			create_apts_hello_pkt(msgid, tpkt, s->payload_size,
960947fdf6dSJouni Malinen 					      s->tx_hello_cnt);
961cd4e3c3eSJouni Malinen 			if (send(s->sock, tpkt, pktlen, 0) <= 0) {
962cd4e3c3eSJouni Malinen 				sigma_dut_print(dut, DUT_MSG_ERROR,
963cd4e3c3eSJouni Malinen 						"send_uapsd: Send failed");
964cd4e3c3eSJouni Malinen 			}
965cd4e3c3eSJouni Malinen 			s->tx_hello_cnt++;
966cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
967cd4e3c3eSJouni Malinen 					"send_uapsd: Hello Sent cnt %d",
968cd4e3c3eSJouni Malinen 					s->tx_hello_cnt);
969cd4e3c3eSJouni Malinen 			sleep(1);
970cd4e3c3eSJouni Malinen 		} else {
971cd4e3c3eSJouni Malinen 			printf("\n send_uapsd: Too many Hellos Sent... \n");
972cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
973cd4e3c3eSJouni Malinen 					"send_uapsd: Too many Hellos sent... ");
974cd4e3c3eSJouni Malinen 			s->stop = 1;
975cd4e3c3eSJouni Malinen 		}
976cd4e3c3eSJouni Malinen 	}
977cd4e3c3eSJouni Malinen 
978cd4e3c3eSJouni Malinen 	free(tpkt);
979cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
980cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_start uapsd_sta_tc %d uapsd_tx_state %d",
981cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
982cd4e3c3eSJouni Malinen 
983cd4e3c3eSJouni Malinen 	return 0;
984cd4e3c3eSJouni Malinen }
985cd4e3c3eSJouni Malinen 
986cd4e3c3eSJouni Malinen 
uapsd_tx_confirm(struct sigma_stream * s,u32 usr_priority,enum uapsd_psave ps,u32 sleep_duration)987cd4e3c3eSJouni Malinen static int uapsd_tx_confirm(struct sigma_stream *s,
988cd4e3c3eSJouni Malinen 			    u32 usr_priority, enum uapsd_psave ps,
989cd4e3c3eSJouni Malinen 			    u32 sleep_duration)
990cd4e3c3eSJouni Malinen {
991cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
992cd4e3c3eSJouni Malinen 	int pktlen = 256;
993cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
994cd4e3c3eSJouni Malinen 	u32 msgid;
995cd4e3c3eSJouni Malinen 
996cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
997cd4e3c3eSJouni Malinen 			"send_uapsd: Enter uapsd_tx_confirm");
998cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
999cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
1000cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1001cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
1002cd4e3c3eSJouni Malinen 		return -1;
1003cd4e3c3eSJouni Malinen 	}
1004cd4e3c3eSJouni Malinen 
1005cd4e3c3eSJouni Malinen 	usleep(sleep_duration);
1006cd4e3c3eSJouni Malinen 	set_ps(s->ifname, dut, ps);
1007cd4e3c3eSJouni Malinen 	memset(tpkt, 0, s->payload_size);
1008cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS CONFIRM to 41 */
1009cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_CONFIRM : APTS_CONFIRM;
1010947fdf6dSJouni Malinen 	create_apts_pkt(msgid, tpkt, s->payload_size, usr_priority, s);
1011cd4e3c3eSJouni Malinen 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1012cd4e3c3eSJouni Malinen 		   sizeof(usr_priority));
1013cd4e3c3eSJouni Malinen 	if (send(s->sock, tpkt, pktlen, 0) > 0) {
1014cd4e3c3eSJouni Malinen 		s->uapsd_tx_state++;
1015cd4e3c3eSJouni Malinen 	} else {
1016cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1017cd4e3c3eSJouni Malinen 				"send_uapsd: Send failed");
1018cd4e3c3eSJouni Malinen 	}
1019cd4e3c3eSJouni Malinen 	free(tpkt);
1020cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1021cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_confirm uapsd_sta_tc %d uapsd_tx_state %d",
1022cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
1023cd4e3c3eSJouni Malinen 
1024cd4e3c3eSJouni Malinen 	return 0;
1025cd4e3c3eSJouni Malinen }
1026cd4e3c3eSJouni Malinen 
1027cd4e3c3eSJouni Malinen 
uapsd_tx_data(struct sigma_stream * s,u32 usr_priority,enum uapsd_psave ps,u32 sleep_duration)1028cd4e3c3eSJouni Malinen static int uapsd_tx_data(struct sigma_stream *s,
1029cd4e3c3eSJouni Malinen 			 u32 usr_priority, enum uapsd_psave ps,
1030cd4e3c3eSJouni Malinen 			 u32 sleep_duration)
1031cd4e3c3eSJouni Malinen {
1032cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
1033cd4e3c3eSJouni Malinen 	int pktlen = 256;
1034cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1035cd4e3c3eSJouni Malinen 	u32 msgid;
1036cd4e3c3eSJouni Malinen 
1037cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_data");
1038cd4e3c3eSJouni Malinen 
1039cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
1040cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
1041cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1042cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
1043cd4e3c3eSJouni Malinen 		return -1;
1044cd4e3c3eSJouni Malinen 	}
1045cd4e3c3eSJouni Malinen 	usleep(sleep_duration);
1046cd4e3c3eSJouni Malinen 	set_ps(s->ifname, dut, ps);
1047cd4e3c3eSJouni Malinen 	memset(tpkt, 0, s->payload_size);
1048cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS DEFAULT to 38 */
1049cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1050947fdf6dSJouni Malinen 	create_apts_pkt(msgid, tpkt, s->payload_size, usr_priority, s);
1051cd4e3c3eSJouni Malinen 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1052cd4e3c3eSJouni Malinen 		   sizeof(usr_priority));
1053cd4e3c3eSJouni Malinen 	if (send(s->sock, tpkt, pktlen, 0) > 0) {
1054cd4e3c3eSJouni Malinen 		s->uapsd_tx_state++;
1055cd4e3c3eSJouni Malinen 	} else {
1056cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1057cd4e3c3eSJouni Malinen 				"send_uapsd: Send failed");
1058cd4e3c3eSJouni Malinen 	}
1059cd4e3c3eSJouni Malinen 
1060cd4e3c3eSJouni Malinen 	free(tpkt);
1061cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1062cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_data uapsd_sta_tc %d uapsd_tx_state %d",
1063cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
1064cd4e3c3eSJouni Malinen 
1065cd4e3c3eSJouni Malinen 	return 0;
1066cd4e3c3eSJouni Malinen }
1067cd4e3c3eSJouni Malinen 
1068cd4e3c3eSJouni Malinen 
uapsd_tx_data_twice(struct sigma_stream * s,u32 usr_priority,enum uapsd_psave ps,u32 sleep_duration)1069cd4e3c3eSJouni Malinen static int uapsd_tx_data_twice(struct sigma_stream *s,
1070cd4e3c3eSJouni Malinen 			       u32 usr_priority, enum uapsd_psave ps,
1071cd4e3c3eSJouni Malinen 			       u32 sleep_duration)
1072cd4e3c3eSJouni Malinen {
1073cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
1074cd4e3c3eSJouni Malinen 	int pktlen = 256, i = 0, tx_status = 0;
1075cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1076cd4e3c3eSJouni Malinen 	u32 msgid;
1077cd4e3c3eSJouni Malinen 
1078cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1079cd4e3c3eSJouni Malinen 			"send_uapsd: Enter uapsd_tx_data_twice");
1080cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
1081cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
1082cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1083cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
1084cd4e3c3eSJouni Malinen 		return -1;
1085cd4e3c3eSJouni Malinen 	}
1086cd4e3c3eSJouni Malinen 	usleep(sleep_duration);
1087cd4e3c3eSJouni Malinen 	set_ps(s->ifname, dut, ps);
1088cd4e3c3eSJouni Malinen 	memset(tpkt, 0, s->payload_size);
1089cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS DEFAULT to 38 */
1090cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1091947fdf6dSJouni Malinen 	create_apts_pkt(msgid, tpkt, s->payload_size, usr_priority, s);
1092cd4e3c3eSJouni Malinen 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1093cd4e3c3eSJouni Malinen 		   sizeof(usr_priority));
1094cd4e3c3eSJouni Malinen 	for(i = 0; i < 2; i++) {
1095cd4e3c3eSJouni Malinen 		if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1096cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
1097cd4e3c3eSJouni Malinen 					"send_uapsd: Send failed");
1098cd4e3c3eSJouni Malinen 			tx_status = -1;
1099cd4e3c3eSJouni Malinen 		}
1100cd4e3c3eSJouni Malinen 	}
1101cd4e3c3eSJouni Malinen 	if (tx_status == 0)
1102cd4e3c3eSJouni Malinen 		s->uapsd_tx_state++;
1103cd4e3c3eSJouni Malinen 	free(tpkt);
1104cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1105cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_data_twice uapsd_sta_tc %d uapsd_tx_state %d",
1106cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
1107cd4e3c3eSJouni Malinen 
1108cd4e3c3eSJouni Malinen 	return 0;
1109cd4e3c3eSJouni Malinen }
1110cd4e3c3eSJouni Malinen 
1111cd4e3c3eSJouni Malinen 
uapsd_tx_cyclic(struct sigma_stream * s,u32 usr_priority,enum uapsd_psave ps,u32 sleep_duration)1112cd4e3c3eSJouni Malinen static int uapsd_tx_cyclic(struct sigma_stream *s,
1113cd4e3c3eSJouni Malinen 			   u32 usr_priority, enum uapsd_psave ps,
1114cd4e3c3eSJouni Malinen 			   u32 sleep_duration)
1115cd4e3c3eSJouni Malinen {
1116cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
1117cd4e3c3eSJouni Malinen 	int pktlen = 256, i = 0, tx_status = 0;
1118cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1119cd4e3c3eSJouni Malinen 	u32 msgid;
1120cd4e3c3eSJouni Malinen 
1121cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_cyclic");
1122cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
1123cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
1124cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1125cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
1126cd4e3c3eSJouni Malinen 		return -1;
1127cd4e3c3eSJouni Malinen 	}
1128cd4e3c3eSJouni Malinen 
1129cd4e3c3eSJouni Malinen 	set_ps(s->ifname, dut, ps);
1130cd4e3c3eSJouni Malinen 	for (i = 0; i < 3000; i++) {
1131cd4e3c3eSJouni Malinen 		usleep(sleep_duration);
1132cd4e3c3eSJouni Malinen 		memset(tpkt, 0, s->payload_size);
1133cd4e3c3eSJouni Malinen 		/* if test is for WMM-AC set APTS DEFAULT to 38 */
1134cd4e3c3eSJouni Malinen 		msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1135947fdf6dSJouni Malinen 		create_apts_pkt(msgid, tpkt, s->payload_size, usr_priority, s);
1136cd4e3c3eSJouni Malinen 		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1137cd4e3c3eSJouni Malinen 			   sizeof(usr_priority));
1138cd4e3c3eSJouni Malinen 		if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1139cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
1140cd4e3c3eSJouni Malinen 					"send_uapsd: Send failed");
1141cd4e3c3eSJouni Malinen 			tx_status = -1;
1142cd4e3c3eSJouni Malinen 		}
1143cd4e3c3eSJouni Malinen 	}
1144cd4e3c3eSJouni Malinen 	if (tx_status == 0)
1145cd4e3c3eSJouni Malinen 		s->uapsd_tx_state++;
1146cd4e3c3eSJouni Malinen 	free(tpkt);
1147cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1148cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_cyclic uapsd_sta_tc %d uapsd_tx_state %d",
1149cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
1150cd4e3c3eSJouni Malinen 
1151cd4e3c3eSJouni Malinen 	return 0;
1152cd4e3c3eSJouni Malinen }
1153cd4e3c3eSJouni Malinen 
1154cd4e3c3eSJouni Malinen 
uapsd_tx_stop(struct sigma_stream * s,u32 usr_priority,enum uapsd_psave ps,u32 sleep_duration)1155cd4e3c3eSJouni Malinen static int uapsd_tx_stop(struct sigma_stream *s,
1156cd4e3c3eSJouni Malinen 			 u32 usr_priority, enum uapsd_psave ps,
1157cd4e3c3eSJouni Malinen 			 u32 sleep_duration)
1158cd4e3c3eSJouni Malinen {
1159cd4e3c3eSJouni Malinen 	unsigned int *tpkt;
1160cd4e3c3eSJouni Malinen 	int pktlen = 256;
1161cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1162cd4e3c3eSJouni Malinen 	u32 msgid;
1163cd4e3c3eSJouni Malinen 
1164cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_stop");
1165cd4e3c3eSJouni Malinen 	tpkt = malloc(s->payload_size);
1166cd4e3c3eSJouni Malinen 	if (tpkt == NULL) {
1167cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1168cd4e3c3eSJouni Malinen 				"send_uapsd: Send buffer allocation failed");
1169cd4e3c3eSJouni Malinen 		return -1;
1170cd4e3c3eSJouni Malinen 	}
1171cd4e3c3eSJouni Malinen 	usleep(sleep_duration);
1172cd4e3c3eSJouni Malinen 	if(!s->tx_stop_cnt)
1173cd4e3c3eSJouni Malinen 		set_ps(s->ifname, dut, ps);
1174cd4e3c3eSJouni Malinen 	s->tx_stop_cnt++;
1175cd4e3c3eSJouni Malinen 	memset(tpkt, 0, s->payload_size);
1176cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS STOP to 42 */
1177cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_STOP : APTS_STOP;
1178947fdf6dSJouni Malinen 	create_apts_pkt(msgid, tpkt, s->payload_size, usr_priority, s);
1179cd4e3c3eSJouni Malinen 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
1180cd4e3c3eSJouni Malinen 		   sizeof(usr_priority));
1181cd4e3c3eSJouni Malinen 	if (send(s->sock, tpkt, pktlen, 0) <= 0) {
1182cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1183cd4e3c3eSJouni Malinen 				"send_uapsd: Send failed");
1184cd4e3c3eSJouni Malinen 	}
1185cd4e3c3eSJouni Malinen 	pthread_mutex_lock(&s->tx_thr_mutex);
1186cd4e3c3eSJouni Malinen 	pthread_cond_signal(&s->tx_thr_cond);
1187cd4e3c3eSJouni Malinen 	pthread_mutex_unlock(&s->tx_thr_mutex);
1188cd4e3c3eSJouni Malinen 	if (s->tx_stop_cnt > MAX_STOP) {
1189cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1190cd4e3c3eSJouni Malinen 				"send_uapsd: Enter TX_STOP Max Stop sent %d",
1191cd4e3c3eSJouni Malinen 				s->tx_stop_cnt);
1192cd4e3c3eSJouni Malinen 		s->stop = 1;
1193cd4e3c3eSJouni Malinen 	}
1194cd4e3c3eSJouni Malinen 	free(tpkt);
1195cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1196cd4e3c3eSJouni Malinen 			"Exit uapsd_tx_stop uapsd_sta_tc %d uapsd_tx_state %d",
1197cd4e3c3eSJouni Malinen 			s->uapsd_sta_tc, s->uapsd_tx_state);
1198cd4e3c3eSJouni Malinen 
1199cd4e3c3eSJouni Malinen 	return 0;
1200cd4e3c3eSJouni Malinen }
1201cd4e3c3eSJouni Malinen 
1202cd4e3c3eSJouni Malinen 
uapsd_rx_start(struct sigma_stream * s,unsigned int * rxpkt,int rxpkt_len)1203cd4e3c3eSJouni Malinen static int uapsd_rx_start(struct sigma_stream *s,
1204cd4e3c3eSJouni Malinen 			  unsigned int *rxpkt, int rxpkt_len)
1205cd4e3c3eSJouni Malinen {
1206cd4e3c3eSJouni Malinen 	int test_num = 0;
1207cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1208cd4e3c3eSJouni Malinen 	int msgid;
1209cd4e3c3eSJouni Malinen 
1210cd4e3c3eSJouni Malinen 	test_num = rxpkt[10];
1211cd4e3c3eSJouni Malinen 
1212cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1213cd4e3c3eSJouni Malinen 			"receive_uapsd: Enter uapsd_rx_start");
1214cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set LAST_TC to 37 */
1215cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? LAST_TC : M_W;
1216cd4e3c3eSJouni Malinen 
1217cd4e3c3eSJouni Malinen 	if (!((test_num >= B_D) && (test_num <= msgid)))
1218cd4e3c3eSJouni Malinen 		return -1;
1219cd4e3c3eSJouni Malinen 
1220cd4e3c3eSJouni Malinen 	/*
1221cd4e3c3eSJouni Malinen 	 * Test numbers start from 1. Hence decrement by 1
1222cd4e3c3eSJouni Malinen 	 * to match the array index.
1223cd4e3c3eSJouni Malinen 	 */
1224cd4e3c3eSJouni Malinen 	s->uapsd_sta_tc = (rxpkt[10] - 1);
1225cd4e3c3eSJouni Malinen 	s->sta_id = rxpkt[9];
1226cd4e3c3eSJouni Malinen 	(s->uapsd_rx_state)++;
1227cd4e3c3eSJouni Malinen 
1228cd4e3c3eSJouni Malinen 	return 0;
1229cd4e3c3eSJouni Malinen }
1230cd4e3c3eSJouni Malinen 
1231cd4e3c3eSJouni Malinen 
uapsd_rx_data(struct sigma_stream * s,unsigned int * rxpkt,int rxpkt_len)1232cd4e3c3eSJouni Malinen static int uapsd_rx_data(struct sigma_stream *s,
1233cd4e3c3eSJouni Malinen 			 unsigned int *rxpkt, int rxpkt_len)
1234cd4e3c3eSJouni Malinen {
1235cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1236cd4e3c3eSJouni Malinen 	u32 msgid;
1237cd4e3c3eSJouni Malinen 
1238cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1239cd4e3c3eSJouni Malinen 			"receive_uapsd: Enter uapsd_rx_data");
1240cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS DEFAULT to 38 */
1241cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
1242cd4e3c3eSJouni Malinen 
1243cd4e3c3eSJouni Malinen 	if ((rxpkt[10] == msgid) &&
1244cd4e3c3eSJouni Malinen 	    ((rxpkt[1] == TOS_BE) ||
1245cd4e3c3eSJouni Malinen 	     (rxpkt[1] == TOS_BK) ||
1246cd4e3c3eSJouni Malinen 	     (rxpkt[1] == TOS_VI) ||
1247cd4e3c3eSJouni Malinen 	     (rxpkt[1] == TOS_VO) ||
1248cd4e3c3eSJouni Malinen 	     (rxpkt[1] == TOS_VO7) ||
1249cd4e3c3eSJouni Malinen 	     (rxpkt[1] == TOS_VO6))) {
1250cd4e3c3eSJouni Malinen 		s->rx_cookie = rxpkt[0];
1251cd4e3c3eSJouni Malinen 		(s->uapsd_rx_state)++;
1252cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1253cd4e3c3eSJouni Malinen 				"receive_uapsd: Recv in uapsd_rx_data uapsd_rx_state %d",
1254cd4e3c3eSJouni Malinen 				s->uapsd_rx_state);
1255cd4e3c3eSJouni Malinen 	} else {
1256cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1257cd4e3c3eSJouni Malinen 				"receive_uapsd: BAD Pkt recv in uapsd_rx_data");
1258cd4e3c3eSJouni Malinen 		sigma_uapsd_reset(s);
1259cd4e3c3eSJouni Malinen 	}
1260cd4e3c3eSJouni Malinen 
1261cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1262cd4e3c3eSJouni Malinen 			"receive_uapsd: Exit uapsd_rx_data");
1263cd4e3c3eSJouni Malinen 
1264cd4e3c3eSJouni Malinen 	return 0;
1265cd4e3c3eSJouni Malinen }
1266cd4e3c3eSJouni Malinen 
1267cd4e3c3eSJouni Malinen 
uapsd_rx_stop(struct sigma_stream * s,unsigned int * rxpkt,int rxpkt_len)1268cd4e3c3eSJouni Malinen static int uapsd_rx_stop(struct sigma_stream *s,
1269cd4e3c3eSJouni Malinen 			 unsigned int *rxpkt, int rxpkt_len)
1270cd4e3c3eSJouni Malinen {
1271cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1272cd4e3c3eSJouni Malinen 	u32 msgid;
1273cd4e3c3eSJouni Malinen 
1274cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1275cd4e3c3eSJouni Malinen 			"receive_uapsd: Enter uapsd_rx_stop");
1276cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set APTS STOP to 42 */
1277cd4e3c3eSJouni Malinen 	msgid = sigma_wmm_ac ? WMMAC_APTS_STOP : APTS_STOP;
1278cd4e3c3eSJouni Malinen 
1279cd4e3c3eSJouni Malinen 	if (rxpkt[10] != msgid) {
1280cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1281cd4e3c3eSJouni Malinen 				"receive_uapsd: BAD Pkt recv in uapsd_rx_stop");
1282cd4e3c3eSJouni Malinen 	} else {
1283cd4e3c3eSJouni Malinen 		sigma_uapsd_stop(s);
1284cd4e3c3eSJouni Malinen 	}
1285cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Exit uapsd_rx_stop");
1286cd4e3c3eSJouni Malinen 
1287cd4e3c3eSJouni Malinen 	return 0;
1288cd4e3c3eSJouni Malinen }
1289cd4e3c3eSJouni Malinen 
1290cd4e3c3eSJouni Malinen 
uapsd_rx_cyclic_vo(struct sigma_stream * s,unsigned int * rxpkt,int rxpkt_len)1291cd4e3c3eSJouni Malinen static int uapsd_rx_cyclic_vo(struct sigma_stream *s,
1292cd4e3c3eSJouni Malinen 			      unsigned int *rxpkt, int rxpkt_len)
1293cd4e3c3eSJouni Malinen {
1294cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1295cd4e3c3eSJouni Malinen 	u32 msgid, msgid2;
1296cd4e3c3eSJouni Malinen 
1297cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1298cd4e3c3eSJouni Malinen 			"receive_uapsd: Enter uapsd_rx_cyclic_vo");
1299cd4e3c3eSJouni Malinen 	/* if test is for WMM-AC set
1300cd4e3c3eSJouni Malinen 	 * APTS STOP to 42 and
1301cd4e3c3eSJouni Malinen 	 * APTS DEFAULT to 38 */
1302cd4e3c3eSJouni Malinen 	if (!sigma_wmm_ac) {
1303cd4e3c3eSJouni Malinen 		msgid = APTS_STOP;
1304cd4e3c3eSJouni Malinen 		msgid2 = APTS_DEFAULT;
1305cd4e3c3eSJouni Malinen 	} else {
1306cd4e3c3eSJouni Malinen 		msgid = WMMAC_APTS_STOP;
1307cd4e3c3eSJouni Malinen 		msgid2 = WMMAC_APTS_DEFAULT;
1308cd4e3c3eSJouni Malinen 	}
1309cd4e3c3eSJouni Malinen 
1310cd4e3c3eSJouni Malinen 	if (rxpkt[10] != msgid) {
1311cd4e3c3eSJouni Malinen 		if ((rxpkt[10] == msgid2) &&
1312cd4e3c3eSJouni Malinen 		    ((rxpkt[1] == TOS_VO) ||
1313cd4e3c3eSJouni Malinen 		     (rxpkt[1] == TOS_VO7) ||
1314cd4e3c3eSJouni Malinen 		     (rxpkt[1] == TOS_VO6))) {
1315cd4e3c3eSJouni Malinen 			/* ; 5.7 */
1316cd4e3c3eSJouni Malinen 			s->rx_cookie = rxpkt[0];
1317cd4e3c3eSJouni Malinen 		} else {
1318cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_ERROR,
1319cd4e3c3eSJouni Malinen 					"receive_uapsd: BAD Pkt recv in uapsd_rx_cyclic_vo");
1320cd4e3c3eSJouni Malinen 		}
1321cd4e3c3eSJouni Malinen 	} else {
1322cd4e3c3eSJouni Malinen 		sigma_uapsd_stop(s);
1323cd4e3c3eSJouni Malinen 	}
1324cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
1325cd4e3c3eSJouni Malinen 			"receive_uapsd: Exit uapsd_rx_cyclic_vo");
1326cd4e3c3eSJouni Malinen 
1327cd4e3c3eSJouni Malinen 	return 0;
1328cd4e3c3eSJouni Malinen }
1329cd4e3c3eSJouni Malinen 
1330cd4e3c3eSJouni Malinen 
create_apts_hello_pkt(int msg,unsigned int * txbuf,size_t txbuf_len,int tx_hello_cnt)1331cd4e3c3eSJouni Malinen static void create_apts_hello_pkt(int msg, unsigned int *txbuf,
1332947fdf6dSJouni Malinen 				  size_t txbuf_len, int tx_hello_cnt)
1333cd4e3c3eSJouni Malinen {
1334cd4e3c3eSJouni Malinen 	struct apts_pkt *t;
1335cd4e3c3eSJouni Malinen 
1336cd4e3c3eSJouni Malinen 	if (!sigma_wmm_ac)
1337cd4e3c3eSJouni Malinen 		t = &apts_pkts[msg];
1338cd4e3c3eSJouni Malinen 	else
1339cd4e3c3eSJouni Malinen 		t = &wmm_ac_apts_pkts[msg];
1340cd4e3c3eSJouni Malinen 
1341cd4e3c3eSJouni Malinen 	txbuf[0] = tx_hello_cnt;
1342cd4e3c3eSJouni Malinen 	txbuf[1] = 0;
1343cd4e3c3eSJouni Malinen 	txbuf[2] = 0;
1344cd4e3c3eSJouni Malinen 	txbuf[3] = 0;
1345cd4e3c3eSJouni Malinen 	txbuf[4] = 0;
1346cd4e3c3eSJouni Malinen 	txbuf[5] = 0;
1347cd4e3c3eSJouni Malinen 	txbuf[6] = t->param0;
1348cd4e3c3eSJouni Malinen 	txbuf[7] = t->param1;
1349cd4e3c3eSJouni Malinen 	txbuf[8] = t->param2;
1350cd4e3c3eSJouni Malinen 	txbuf[9] = t->param3;
1351cd4e3c3eSJouni Malinen 	txbuf[10] = t->cmd;
1352947fdf6dSJouni Malinen 	strlcpy((char *) &txbuf[11], t->name,
1353947fdf6dSJouni Malinen 		txbuf_len - sizeof(txbuf[0]) * 11);
1354cd4e3c3eSJouni Malinen 	printf("create_apts_hello_pkt (%s) %d\n", t->name, t->cmd);
1355cd4e3c3eSJouni Malinen }
1356cd4e3c3eSJouni Malinen 
1357cd4e3c3eSJouni Malinen 
sigma_uapsd_init(struct sigma_stream * s)1358cd4e3c3eSJouni Malinen static void sigma_uapsd_init(struct sigma_stream *s)
1359cd4e3c3eSJouni Malinen {
1360cd4e3c3eSJouni Malinen 	s->uapsd_sta_tc = 0; /* Test Case to execute or row to select */
1361cd4e3c3eSJouni Malinen 	/* in a test case row, next column or next state function to execute */
1362cd4e3c3eSJouni Malinen 	s->uapsd_rx_state = 0;
1363cd4e3c3eSJouni Malinen 	s->uapsd_tx_state = 0;
1364cd4e3c3eSJouni Malinen 
1365cd4e3c3eSJouni Malinen 	s->sta_id = 0;
1366cd4e3c3eSJouni Malinen 	s->uapsd_send_thr = 0;
1367cd4e3c3eSJouni Malinen 
1368cd4e3c3eSJouni Malinen 	s->reset_rx = 0;
1369cd4e3c3eSJouni Malinen 	s->num_retry = 0;
1370cd4e3c3eSJouni Malinen 	s->tx_stop_cnt = 0;
1371cd4e3c3eSJouni Malinen 	s->tx_hello_cnt = 0;
1372cd4e3c3eSJouni Malinen }
1373cd4e3c3eSJouni Malinen 
1374cd4e3c3eSJouni Malinen 
sigma_uapsd_stop(struct sigma_stream * s)1375cd4e3c3eSJouni Malinen static void sigma_uapsd_stop(struct sigma_stream *s)
1376cd4e3c3eSJouni Malinen {
1377cd4e3c3eSJouni Malinen 	pthread_mutex_lock(&s->tx_thr_mutex);
1378cd4e3c3eSJouni Malinen 	pthread_cond_wait(&s->tx_thr_cond, &s->tx_thr_mutex);
1379cd4e3c3eSJouni Malinen 	pthread_mutex_unlock(&s->tx_thr_mutex);
1380cd4e3c3eSJouni Malinen 	s->stop = 1;
1381cd4e3c3eSJouni Malinen 	sleep(1);
1382cd4e3c3eSJouni Malinen }
1383cd4e3c3eSJouni Malinen 
1384cd4e3c3eSJouni Malinen 
sigma_uapsd_reset(struct sigma_stream * s)1385cd4e3c3eSJouni Malinen static void sigma_uapsd_reset(struct sigma_stream *s)
1386cd4e3c3eSJouni Malinen {
1387cd4e3c3eSJouni Malinen 	int tos = TOS_BE;
1388cd4e3c3eSJouni Malinen 	unsigned int *reset_pkt;
1389cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1390cd4e3c3eSJouni Malinen 	u32 msgid;
1391cd4e3c3eSJouni Malinen 
1392cd4e3c3eSJouni Malinen 	s->num_retry++;
1393cd4e3c3eSJouni Malinen 
139479594049SPradeep Reddy POTTETI 	/* if reset is called from U-APSD console set it */
139579594049SPradeep Reddy POTTETI 	s->reset = 1;
139679594049SPradeep Reddy POTTETI 
1397cd4e3c3eSJouni Malinen 	reset_pkt = malloc(s->payload_size);
1398cd4e3c3eSJouni Malinen 	if (reset_pkt == NULL)
1399cd4e3c3eSJouni Malinen 		return;
1400cd4e3c3eSJouni Malinen 
1401cd4e3c3eSJouni Malinen 	if (s->num_retry > MAX_RETRY) {
1402cd4e3c3eSJouni Malinen 		/* if test is for WMM-AC set APTS RESET STOP to 49 */
1403cd4e3c3eSJouni Malinen 		msgid = sigma_wmm_ac ? WMMAC_APTS_RESET_STOP : APTS_RESET_STOP;
1404947fdf6dSJouni Malinen 		create_apts_pkt(msgid, reset_pkt, s->payload_size, tos, s);
1405cd4e3c3eSJouni Malinen 		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1406cd4e3c3eSJouni Malinen 		send(s->sock, reset_pkt, s->payload_size, 0);
1407cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1408cd4e3c3eSJouni Malinen 				"sigma_uapsd_reset: Too many Reset retries");
1409cd4e3c3eSJouni Malinen 		s->stop = 1;
1410cd4e3c3eSJouni Malinen 	}
1411cd4e3c3eSJouni Malinen 
1412cd4e3c3eSJouni Malinen 	if (!(s->reset_rx)) {
1413cd4e3c3eSJouni Malinen 		/* if test is for WMM-AC set APTS RESET to 47 */
1414cd4e3c3eSJouni Malinen 		msgid = sigma_wmm_ac ? WMMAC_APTS_RESET : APTS_RESET;
1415947fdf6dSJouni Malinen 		create_apts_pkt(msgid, reset_pkt, s->payload_size, tos, s);
1416cd4e3c3eSJouni Malinen 		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1417cd4e3c3eSJouni Malinen 		send(s->sock, reset_pkt, s->payload_size, 0);
1418cd4e3c3eSJouni Malinen 	} else {
1419cd4e3c3eSJouni Malinen 		/* if test is for WMM-AC set APTS RESET RESP to 48 */
1420cd4e3c3eSJouni Malinen 		msgid = sigma_wmm_ac ? WMMAC_APTS_RESET_RESP : APTS_RESET_RESP;
1421947fdf6dSJouni Malinen 		create_apts_pkt(msgid, reset_pkt, s->payload_size, tos, s);
1422cd4e3c3eSJouni Malinen 		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
1423cd4e3c3eSJouni Malinen 		send(s->sock, reset_pkt, s->payload_size, 0);
1424cd4e3c3eSJouni Malinen 		s->reset_rx = 0;
1425cd4e3c3eSJouni Malinen 	}
1426cd4e3c3eSJouni Malinen 	free(reset_pkt);
1427cd4e3c3eSJouni Malinen }
1428cd4e3c3eSJouni Malinen 
1429cd4e3c3eSJouni Malinen 
send_uapsd(void * data)1430cd4e3c3eSJouni Malinen static void * send_uapsd(void *data)
1431cd4e3c3eSJouni Malinen {
1432cd4e3c3eSJouni Malinen 	struct sigma_stream *s = data;
1433cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1434cd4e3c3eSJouni Malinen 	uapsd_tx_state_func_ptr tx_state_func;
1435cd4e3c3eSJouni Malinen 	u32 usr_priority, sleep_duration;
1436cd4e3c3eSJouni Malinen 	enum uapsd_psave ps;
1437cd4e3c3eSJouni Malinen 
1438cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Uapsd TX Start");
1439cd4e3c3eSJouni Malinen 
1440cd4e3c3eSJouni Malinen 	s->payload_size = 512;
1441cd4e3c3eSJouni Malinen 
1442cd4e3c3eSJouni Malinen 	while (!s->stop) {
1443cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1444cd4e3c3eSJouni Malinen 				"send_uapsd: running  while uapsd_rx_state %d",
1445cd4e3c3eSJouni Malinen 				s->uapsd_rx_state);
1446cd4e3c3eSJouni Malinen 
1447cd4e3c3eSJouni Malinen 		tx_state_func = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1448cd4e3c3eSJouni Malinen 			[s->uapsd_tx_state].state_func;
1449cd4e3c3eSJouni Malinen 		usr_priority = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1450cd4e3c3eSJouni Malinen 			[s->uapsd_tx_state].usr_priority;
1451cd4e3c3eSJouni Malinen 		sleep_duration = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
1452cd4e3c3eSJouni Malinen 			[s->uapsd_tx_state].sleep_dur;
1453cd4e3c3eSJouni Malinen 		ps = sta_uapsd_tx_tbl[s->uapsd_sta_tc][s->uapsd_tx_state].ps;
1454cd4e3c3eSJouni Malinen 
1455cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1456cd4e3c3eSJouni Malinen 				"send_uapsd: uapsd_sta_tc %d uapsd_tx_state %d",
1457cd4e3c3eSJouni Malinen 				s->uapsd_sta_tc, s->uapsd_tx_state);
1458cd4e3c3eSJouni Malinen 		if (tx_state_func) {
1459cd4e3c3eSJouni Malinen 			tx_state_func(s, usr_priority, ps, sleep_duration);
1460cd4e3c3eSJouni Malinen 		} else {
1461cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
1462cd4e3c3eSJouni Malinen 					"send_uapsd: Null Function Detected for TC : %d in uapsd_tx_state : %d",
1463cd4e3c3eSJouni Malinen 					s->uapsd_sta_tc, s->uapsd_tx_state);
1464cd4e3c3eSJouni Malinen 		}
1465cd4e3c3eSJouni Malinen 	}
1466cd4e3c3eSJouni Malinen 
1467cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Uapsd TX End");
1468cd4e3c3eSJouni Malinen 
1469cd4e3c3eSJouni Malinen 	return NULL;
1470cd4e3c3eSJouni Malinen }
1471cd4e3c3eSJouni Malinen 
1472cd4e3c3eSJouni Malinen 
receive_uapsd(struct sigma_stream * s)1473cd4e3c3eSJouni Malinen void receive_uapsd(struct sigma_stream *s)
1474cd4e3c3eSJouni Malinen {
1475cd4e3c3eSJouni Malinen 	struct timeval tv;
1476cd4e3c3eSJouni Malinen 	fd_set rfds;
1477cd4e3c3eSJouni Malinen 	int res = 0, ret = 0, rxpkt_len = 0;
1478cd4e3c3eSJouni Malinen 	unsigned int *rxpkt;
1479cd4e3c3eSJouni Malinen 	uapsd_recv_state_func_ptr recv_state_func;
1480cd4e3c3eSJouni Malinen 	struct sigma_dut *dut = s->dut;
1481cd4e3c3eSJouni Malinen 	u32 msgid;
1482cd4e3c3eSJouni Malinen 
1483cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Uapsd RX Start");
1484cd4e3c3eSJouni Malinen 	sigma_uapsd_init(s);
1485cd4e3c3eSJouni Malinen 
1486cd4e3c3eSJouni Malinen 	ret = pthread_mutex_init(&s->tx_thr_mutex, NULL);
1487cd4e3c3eSJouni Malinen 	if (ret != 0) {
1488cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1489cd4e3c3eSJouni Malinen 				"receive_uapsd: pthread_mutex_init failed");
1490cd4e3c3eSJouni Malinen 		return;
1491cd4e3c3eSJouni Malinen 	}
1492cd4e3c3eSJouni Malinen 
1493cd4e3c3eSJouni Malinen 	ret = pthread_cond_init(&s->tx_thr_cond, NULL);
1494cd4e3c3eSJouni Malinen 	if (ret != 0) {
1495cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1496cd4e3c3eSJouni Malinen 				"receive_uapsd: pthread_cond_init failed");
1497cd4e3c3eSJouni Malinen 		pthread_mutex_destroy(&s->tx_thr_mutex);
1498cd4e3c3eSJouni Malinen 		return;
1499cd4e3c3eSJouni Malinen 	}
1500cd4e3c3eSJouni Malinen 
1501cd4e3c3eSJouni Malinen 	if (pthread_create(&s->uapsd_send_thr, NULL, send_uapsd, s)) {
1502cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1503cd4e3c3eSJouni Malinen 				"receive_uapsd: send_uapsd tx thread creation failed");
1504cd4e3c3eSJouni Malinen 		pthread_cond_destroy(&s->tx_thr_cond);
1505cd4e3c3eSJouni Malinen 		pthread_mutex_destroy(&s->tx_thr_mutex);
1506cd4e3c3eSJouni Malinen 		return;
1507cd4e3c3eSJouni Malinen 	}
1508cd4e3c3eSJouni Malinen 
1509cd4e3c3eSJouni Malinen 	s->payload_size = 512;
1510cd4e3c3eSJouni Malinen 	rxpkt = malloc(s->payload_size);
1511cd4e3c3eSJouni Malinen 	if (rxpkt == NULL) {
1512cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
1513cd4e3c3eSJouni Malinen 				"receive_uapsd: Receive buffer allocation failed");
1514cd4e3c3eSJouni Malinen 		s->stop = 1;
1515cd4e3c3eSJouni Malinen 	}
1516cd4e3c3eSJouni Malinen 
1517cd4e3c3eSJouni Malinen 	while (!s->stop) {
1518cd4e3c3eSJouni Malinen 		FD_ZERO(&rfds);
1519cd4e3c3eSJouni Malinen 		FD_SET(s->sock, &rfds);
1520cd4e3c3eSJouni Malinen 		tv.tv_sec = 0;
1521cd4e3c3eSJouni Malinen 		tv.tv_usec = 100000;
1522cd4e3c3eSJouni Malinen 		res = select(s->sock + 1, &rfds, NULL, NULL, &tv);
1523cd4e3c3eSJouni Malinen 		if (res < 0) {
1524cd4e3c3eSJouni Malinen 			perror("select");
1525cd4e3c3eSJouni Malinen 			usleep(10000);
1526cd4e3c3eSJouni Malinen 			continue;
1527cd4e3c3eSJouni Malinen 		}
1528cd4e3c3eSJouni Malinen 
1529cd4e3c3eSJouni Malinen 		if (!FD_ISSET(s->sock, &rfds))
1530cd4e3c3eSJouni Malinen 			continue;
1531cd4e3c3eSJouni Malinen 
1532cd4e3c3eSJouni Malinen 		memset(rxpkt, 0, s->payload_size);
1533cd4e3c3eSJouni Malinen 		rxpkt_len = recv(s->sock, rxpkt, s->payload_size, 0);
1534cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
1535cd4e3c3eSJouni Malinen 				"receive_uapsd: running res %d cookie %d dscp %d apts-pkt %d sta-id %d",
1536cd4e3c3eSJouni Malinen 				res, rxpkt[0], rxpkt[1], rxpkt[10],
1537cd4e3c3eSJouni Malinen 				rxpkt[9]);
1538cd4e3c3eSJouni Malinen 
1539cd4e3c3eSJouni Malinen 		if (rxpkt_len > 0) {
1540cd4e3c3eSJouni Malinen 			s->rx_frames++;
1541cd4e3c3eSJouni Malinen 			s->rx_payload_bytes += res;
1542cd4e3c3eSJouni Malinen 
1543cd4e3c3eSJouni Malinen 			/* if test is for WMM-AC set APTS RESET to 47 */
1544cd4e3c3eSJouni Malinen 			msgid = sigma_wmm_ac ? WMMAC_APTS_RESET : APTS_RESET;
1545cd4e3c3eSJouni Malinen 			if (msgid == rxpkt[10]) {
1546cd4e3c3eSJouni Malinen 				sigma_dut_print(dut, DUT_MSG_ERROR,
1547cd4e3c3eSJouni Malinen 						"receive_uapsd: RESET Pkt recv");
1548cd4e3c3eSJouni Malinen 				s->reset_rx = 1;
1549cd4e3c3eSJouni Malinen 				sigma_uapsd_reset(s);
1550cd4e3c3eSJouni Malinen 				continue;
1551cd4e3c3eSJouni Malinen 			}
1552cd4e3c3eSJouni Malinen 
1553cd4e3c3eSJouni Malinen 			recv_state_func = sta_uapsd_recv_tbl[s->uapsd_sta_tc]
1554cd4e3c3eSJouni Malinen 				[s->uapsd_rx_state].state_func;
1555cd4e3c3eSJouni Malinen 			sigma_dut_print(dut, DUT_MSG_INFO,
1556cd4e3c3eSJouni Malinen 					"receive_uapsd: running s->uapsd_sta_tc %d uapsd_rx_state %d",
1557cd4e3c3eSJouni Malinen 					s->uapsd_sta_tc, s->uapsd_rx_state);
1558cd4e3c3eSJouni Malinen 			if (recv_state_func) {
1559cd4e3c3eSJouni Malinen 				recv_state_func(s, rxpkt, rxpkt_len);
1560cd4e3c3eSJouni Malinen 			} else {
1561cd4e3c3eSJouni Malinen 				sigma_dut_print(dut, DUT_MSG_INFO,
1562cd4e3c3eSJouni Malinen 						"receive_uapsd: Null Function Detected for TC : %d in uapsd_rx_state : %d",
1563cd4e3c3eSJouni Malinen 						s->uapsd_sta_tc,
1564cd4e3c3eSJouni Malinen 						s->uapsd_rx_state);
1565cd4e3c3eSJouni Malinen 			}
1566cd4e3c3eSJouni Malinen 		} else if (res < 0) {
1567cd4e3c3eSJouni Malinen 			perror("recv");
1568cd4e3c3eSJouni Malinen 			break;
1569cd4e3c3eSJouni Malinen 		}
1570cd4e3c3eSJouni Malinen 	}
1571cd4e3c3eSJouni Malinen 
1572cd4e3c3eSJouni Malinen 	if (rxpkt)
1573cd4e3c3eSJouni Malinen 		free(rxpkt);
1574cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Uapsd RX End");
1575cd4e3c3eSJouni Malinen 	if (s->sock >= 0) {
1576*58d357b0SVeerendranath Jakkam 		pthread_join(s->uapsd_send_thr, NULL);
1577cd4e3c3eSJouni Malinen 		close(s->sock);
1578cd4e3c3eSJouni Malinen 		s->sock = -1;
1579cd4e3c3eSJouni Malinen 	}
1580cd4e3c3eSJouni Malinen 	pthread_cond_destroy(&s->tx_thr_cond);
1581cd4e3c3eSJouni Malinen 	pthread_mutex_destroy(&s->tx_thr_mutex);
1582cd4e3c3eSJouni Malinen }
158379594049SPradeep Reddy POTTETI 
158479594049SPradeep Reddy POTTETI 
158579594049SPradeep Reddy POTTETI /* U-APSD apts console code implementation */
packet_expected(struct sigma_stream * s,unsigned int * rpkt,unsigned int type,u32 tos)158679594049SPradeep Reddy POTTETI static int packet_expected(struct sigma_stream *s, unsigned int *rpkt,
158779594049SPradeep Reddy POTTETI 			   unsigned int type, u32 tos)
158879594049SPradeep Reddy POTTETI {
158979594049SPradeep Reddy POTTETI 	u8 type_ok = 0;
159079594049SPradeep Reddy POTTETI 	u8 tos_ok = 0;
159179594049SPradeep Reddy POTTETI 	int res = 0;
159279594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
159379594049SPradeep Reddy POTTETI 
159479594049SPradeep Reddy POTTETI 	type_ok = (rpkt[10] == type) ? 1 : 0;
159579594049SPradeep Reddy POTTETI 
159679594049SPradeep Reddy POTTETI 	switch (tos) {
159779594049SPradeep Reddy POTTETI 	case TOS_VO7:
159879594049SPradeep Reddy POTTETI 	case TOS_VO:
159979594049SPradeep Reddy POTTETI 	case TOS_VO6:
160079594049SPradeep Reddy POTTETI 	case TOS_VO2:
160179594049SPradeep Reddy POTTETI 		if (rpkt[1] == TOS_VO7 || rpkt[1] == TOS_VO ||
160279594049SPradeep Reddy POTTETI 		    rpkt[1] == TOS_VO6 || rpkt[1] == TOS_VO2)
160379594049SPradeep Reddy POTTETI 			tos_ok = 1;
160479594049SPradeep Reddy POTTETI 		break;
160579594049SPradeep Reddy POTTETI 	case TOS_VI:
160679594049SPradeep Reddy POTTETI 	case TOS_VI4:
160779594049SPradeep Reddy POTTETI 	case TOS_VI5:
160879594049SPradeep Reddy POTTETI 		if (rpkt[1] == TOS_VI || rpkt[1] == TOS_VI4 ||
160979594049SPradeep Reddy POTTETI 		    rpkt[1] == TOS_VI5)
161079594049SPradeep Reddy POTTETI 			tos_ok = 1;
161179594049SPradeep Reddy POTTETI 		break;
161279594049SPradeep Reddy POTTETI 	case TOS_BE:
161379594049SPradeep Reddy POTTETI 	case TOS_EE:
161479594049SPradeep Reddy POTTETI 		if (rpkt[1] == TOS_BE || rpkt[1] == TOS_EE)
161579594049SPradeep Reddy POTTETI 			tos_ok = 1;
161679594049SPradeep Reddy POTTETI 		break;
161779594049SPradeep Reddy POTTETI 	case TOS_BK:
161879594049SPradeep Reddy POTTETI 	case TOS_LE:
161979594049SPradeep Reddy POTTETI 		if (rpkt[1] == TOS_BK || rpkt[1] == TOS_LE)
162079594049SPradeep Reddy POTTETI 			tos_ok = 1;
162179594049SPradeep Reddy POTTETI 		break;
162279594049SPradeep Reddy POTTETI 	default:
162379594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
162479594049SPradeep Reddy POTTETI 				"packet_expected: recv not known tos=0x%x",
162579594049SPradeep Reddy POTTETI 				tos);
162679594049SPradeep Reddy POTTETI 		break;
162779594049SPradeep Reddy POTTETI 	}
162879594049SPradeep Reddy POTTETI 
162979594049SPradeep Reddy POTTETI 	res = type_ok && tos_ok;
163079594049SPradeep Reddy POTTETI 	if (!res) {
163179594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
163279594049SPradeep Reddy POTTETI 				"packet_expected: No match: received pkt_type %u expected type %u, received dscp 0x%x expected dscp 0x%x",
163379594049SPradeep Reddy POTTETI 				rpkt[10], type, rpkt[1], tos);
163479594049SPradeep Reddy POTTETI 	}
163579594049SPradeep Reddy POTTETI 
163679594049SPradeep Reddy POTTETI 	return res;
163779594049SPradeep Reddy POTTETI }
163879594049SPradeep Reddy POTTETI 
163979594049SPradeep Reddy POTTETI 
console_send(struct sigma_stream * s,u32 pkt_type,u32 tos)164079594049SPradeep Reddy POTTETI static int console_send(struct sigma_stream *s, u32 pkt_type, u32 tos)
164179594049SPradeep Reddy POTTETI {
164279594049SPradeep Reddy POTTETI 	u32 *tpkt;
164379594049SPradeep Reddy POTTETI 	int res = 0;
164479594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
164579594049SPradeep Reddy POTTETI 
164679594049SPradeep Reddy POTTETI 	tpkt = malloc(s->payload_size);
164779594049SPradeep Reddy POTTETI 	if (tpkt == NULL) {
164879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
164979594049SPradeep Reddy POTTETI 				"console_send: Send buffer allocation failed");
165079594049SPradeep Reddy POTTETI 		return 0;
165179594049SPradeep Reddy POTTETI 	}
165279594049SPradeep Reddy POTTETI 	memset(tpkt, 0, s->payload_size);
1653947fdf6dSJouni Malinen 	create_apts_pkt(pkt_type, tpkt, s->payload_size, tos, s);
165479594049SPradeep Reddy POTTETI 	if (pkt_type == APTS_DEFAULT || pkt_type == APTS_STOP)
165579594049SPradeep Reddy POTTETI 		tpkt[0] = ++(s->rx_cookie);
165679594049SPradeep Reddy POTTETI 	tpkt[1] = tos;
165779594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
165879594049SPradeep Reddy POTTETI 	res = send(s->sock, tpkt, s->payload_size / 2, 0);
165979594049SPradeep Reddy POTTETI 	if (res >= 0) {
166079594049SPradeep Reddy POTTETI 		s->tx_frames++;
166179594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
166279594049SPradeep Reddy POTTETI 	}
166379594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
166479594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
166579594049SPradeep Reddy POTTETI 			"console_send: Sent packet return %d Type %d Tos %d",
166679594049SPradeep Reddy POTTETI 			res, tpkt[10], tpkt[1]);
166779594049SPradeep Reddy POTTETI 	free(tpkt);
166879594049SPradeep Reddy POTTETI 
166979594049SPradeep Reddy POTTETI 	return 0;
167079594049SPradeep Reddy POTTETI }
167179594049SPradeep Reddy POTTETI 
167279594049SPradeep Reddy POTTETI 
console_rx_hello(struct sigma_stream * s,unsigned int * rpkt,int len)167379594049SPradeep Reddy POTTETI static int console_rx_hello(struct sigma_stream *s, unsigned int *rpkt, int len)
167479594049SPradeep Reddy POTTETI {
167579594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
167679594049SPradeep Reddy POTTETI 
167779594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_HELLO, TOS_BE)) {
167879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
167979594049SPradeep Reddy POTTETI 				"console_rx_hello: Hello not Recv or Bad TOS");
168079594049SPradeep Reddy POTTETI 		return 0;
168179594049SPradeep Reddy POTTETI 	}
168279594049SPradeep Reddy POTTETI 
168379594049SPradeep Reddy POTTETI 	s->rx_cookie = 0;
168479594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
168579594049SPradeep Reddy POTTETI 			"console_rx_hello: Recv Hello, Sent Test Case");
168679594049SPradeep Reddy POTTETI 	console_send(s, s->uapsd_sta_tc, TOS_BE);
168779594049SPradeep Reddy POTTETI 
168879594049SPradeep Reddy POTTETI 	return 0;
168979594049SPradeep Reddy POTTETI }
169079594049SPradeep Reddy POTTETI 
169179594049SPradeep Reddy POTTETI 
console_rx_confirm(struct sigma_stream * s,unsigned int * rpkt,int len)169279594049SPradeep Reddy POTTETI static int console_rx_confirm(struct sigma_stream *s, unsigned int *rpkt,
169379594049SPradeep Reddy POTTETI 			      int len)
169479594049SPradeep Reddy POTTETI {
169579594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
169679594049SPradeep Reddy POTTETI 
169779594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_CONFIRM, TOS_BE)) {
169879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
169979594049SPradeep Reddy POTTETI 				"console_rx_confirm: Confirm not Recv or Bad TOS");
170079594049SPradeep Reddy POTTETI 		return 0;
170179594049SPradeep Reddy POTTETI 	}
170279594049SPradeep Reddy POTTETI 
170379594049SPradeep Reddy POTTETI 	s->rx_cookie = 0;
170479594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
170579594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_confirm: Recv Confirm");
170679594049SPradeep Reddy POTTETI 
170779594049SPradeep Reddy POTTETI 	return 0;
170879594049SPradeep Reddy POTTETI }
170979594049SPradeep Reddy POTTETI 
171079594049SPradeep Reddy POTTETI 
console_rx_confirm_tx_vi(struct sigma_stream * s,unsigned int * rpkt,int len)171179594049SPradeep Reddy POTTETI static int console_rx_confirm_tx_vi(struct sigma_stream *s, unsigned int *rpkt,
171279594049SPradeep Reddy POTTETI 				    int len)
171379594049SPradeep Reddy POTTETI {
171479594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
171579594049SPradeep Reddy POTTETI 
171679594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_CONFIRM, TOS_BE)) {
171779594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
171879594049SPradeep Reddy POTTETI 				"console_rx_confirm_tx_vi: Confirm not Recv or Bad TOS");
171979594049SPradeep Reddy POTTETI 		return 0;
172079594049SPradeep Reddy POTTETI 	}
172179594049SPradeep Reddy POTTETI 
172279594049SPradeep Reddy POTTETI 	s->rx_cookie = 0;
172379594049SPradeep Reddy POTTETI 	console_send(s, APTS_DEFAULT, TOS_VI);
172479594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
172579594049SPradeep Reddy POTTETI 			"console_rx_confirm_tx_vi: Recv Confirm, Sent VI");
172679594049SPradeep Reddy POTTETI 
172779594049SPradeep Reddy POTTETI 	return 0;
172879594049SPradeep Reddy POTTETI 
172979594049SPradeep Reddy POTTETI }
173079594049SPradeep Reddy POTTETI 
173179594049SPradeep Reddy POTTETI 
console_rx_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)173279594049SPradeep Reddy POTTETI static int console_rx_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
173379594049SPradeep Reddy POTTETI 			      int len)
173479594049SPradeep Reddy POTTETI {
173579594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
173679594049SPradeep Reddy POTTETI 
173779594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
173879594049SPradeep Reddy POTTETI 			"console_rx_tx_stop: Send stop to STA again quit %d stop %d",
173979594049SPradeep Reddy POTTETI 			s->can_quit, s->stop);
174079594049SPradeep Reddy POTTETI 
174179594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
174279594049SPradeep Reddy POTTETI 
174379594049SPradeep Reddy POTTETI 	if (packet_expected(s, rpkt, APTS_STOP, TOS_BE)) {
174479594049SPradeep Reddy POTTETI 		if (s->can_quit) {
174579594049SPradeep Reddy POTTETI 			s->stop = 1;
174679594049SPradeep Reddy POTTETI 			sigma_dut_print(dut, DUT_MSG_INFO,
174779594049SPradeep Reddy POTTETI 					"console_rx_tx_stop: Send stop to STA again quit %d stop %d",
174879594049SPradeep Reddy POTTETI 					s->can_quit, s->stop);
174979594049SPradeep Reddy POTTETI 		} else {
175079594049SPradeep Reddy POTTETI 			s->can_quit = 1;
175179594049SPradeep Reddy POTTETI 		}
175279594049SPradeep Reddy POTTETI 	} else {
175379594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
175479594049SPradeep Reddy POTTETI 				"console_rx_tx_stop: STOP not Recv or Bad TOS");
175579594049SPradeep Reddy POTTETI 	}
175679594049SPradeep Reddy POTTETI 
175779594049SPradeep Reddy POTTETI 	return 0;
175879594049SPradeep Reddy POTTETI }
175979594049SPradeep Reddy POTTETI 
176079594049SPradeep Reddy POTTETI 
console_rx_vo_tx_vo(struct sigma_stream * s,unsigned int * rpkt,int len)176179594049SPradeep Reddy POTTETI static int console_rx_vo_tx_vo(struct sigma_stream *s, unsigned int *rpkt,
176279594049SPradeep Reddy POTTETI 			       int len)
176379594049SPradeep Reddy POTTETI {
176479594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
176579594049SPradeep Reddy POTTETI 	unsigned int tos = TOS_VO7;
176679594049SPradeep Reddy POTTETI 	int res;
176779594049SPradeep Reddy POTTETI 
176879594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
176979594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
177079594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_vo: Expected Pkt not Recv or Bad TOS");
177179594049SPradeep Reddy POTTETI 		return 0;
177279594049SPradeep Reddy POTTETI 	}
177379594049SPradeep Reddy POTTETI 
177479594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
177579594049SPradeep Reddy POTTETI 	rpkt[1] = TOS_VO;
177679594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
177779594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
177879594049SPradeep Reddy POTTETI 	if (res >= 0) {
177979594049SPradeep Reddy POTTETI 		s->tx_frames++;
178079594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
178179594049SPradeep Reddy POTTETI 	}
178279594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
178379594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
178479594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_vo: Recv VO, Sent VO");
178579594049SPradeep Reddy POTTETI 
178679594049SPradeep Reddy POTTETI 	return 0;
178779594049SPradeep Reddy POTTETI }
178879594049SPradeep Reddy POTTETI 
178979594049SPradeep Reddy POTTETI 
console_rx_vo_tx_vo_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)179079594049SPradeep Reddy POTTETI static int console_rx_vo_tx_vo_tx_stop(struct sigma_stream *s,
179179594049SPradeep Reddy POTTETI 				       unsigned int *rpkt, int len)
179279594049SPradeep Reddy POTTETI {
179379594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
179479594049SPradeep Reddy POTTETI 	unsigned int tos = TOS_VO7;
179579594049SPradeep Reddy POTTETI 	int res;
179679594049SPradeep Reddy POTTETI 
179779594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
179879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
179979594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
180079594049SPradeep Reddy POTTETI 		return 0;
180179594049SPradeep Reddy POTTETI 	}
180279594049SPradeep Reddy POTTETI 
180379594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
180479594049SPradeep Reddy POTTETI 	rpkt[1] = TOS_VO;
180579594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
180679594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
180779594049SPradeep Reddy POTTETI 	if (res >= 0) {
180879594049SPradeep Reddy POTTETI 		s->tx_frames++;
180979594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
181079594049SPradeep Reddy POTTETI 	}
181179594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
181279594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_vo_tx_stop: Recv VO, Sent VO");
181379594049SPradeep Reddy POTTETI 		usleep(500000);
181479594049SPradeep Reddy POTTETI 		console_send(s, APTS_STOP, TOS_BE);
181579594049SPradeep Reddy POTTETI 
181679594049SPradeep Reddy POTTETI 	return 0;
181779594049SPradeep Reddy POTTETI }
181879594049SPradeep Reddy POTTETI 
181979594049SPradeep Reddy POTTETI 
console_rx_vo_tx_all_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)182079594049SPradeep Reddy POTTETI static int console_rx_vo_tx_all_tx_stop(struct sigma_stream *s,
182179594049SPradeep Reddy POTTETI 					unsigned int *rpkt, int len)
182279594049SPradeep Reddy POTTETI {
182379594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
182479594049SPradeep Reddy POTTETI 	u32 tos = TOS_VO7;
182579594049SPradeep Reddy POTTETI 	int res;
182679594049SPradeep Reddy POTTETI 
182779594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
182879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
182979594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_all_tx_stop: Expected Pkt not Recv or Bad TOS");
183079594049SPradeep Reddy POTTETI 		return 0;
183179594049SPradeep Reddy POTTETI 	}
183279594049SPradeep Reddy POTTETI 
183379594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
183479594049SPradeep Reddy POTTETI 	rpkt[1] = TOS_VO;
183579594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
183679594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
183779594049SPradeep Reddy POTTETI 	if (res >= 0) {
183879594049SPradeep Reddy POTTETI 		s->tx_frames++;
183979594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
184079594049SPradeep Reddy POTTETI 	}
184179594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
184279594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_all_tx_stop: Recv VO, Sent VO");
184379594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
184479594049SPradeep Reddy POTTETI 	tos = TOS_VI;
184579594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
184679594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
184779594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
184879594049SPradeep Reddy POTTETI 	if (res >= 0) {
184979594049SPradeep Reddy POTTETI 		s->tx_frames++;
185079594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
185179594049SPradeep Reddy POTTETI 	}
185279594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
185379594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_all_tx_stop: Sent VI");
185479594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
185579594049SPradeep Reddy POTTETI 	tos = TOS_BE;
185679594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
185779594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
185879594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
185979594049SPradeep Reddy POTTETI 	if (res >= 0) {
186079594049SPradeep Reddy POTTETI 		s->tx_frames++;
186179594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
186279594049SPradeep Reddy POTTETI 	}
186379594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
186479594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_all_tx_stop: Sent BE");
186579594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
186679594049SPradeep Reddy POTTETI 	tos = TOS_BK;
186779594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
186879594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
186979594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
187079594049SPradeep Reddy POTTETI 	if (res >= 0) {
187179594049SPradeep Reddy POTTETI 		s->tx_frames++;
187279594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
187379594049SPradeep Reddy POTTETI 	}
187479594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
187579594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_all_tx_stop: Sent BK");
187679594049SPradeep Reddy POTTETI 	usleep(500000);
187779594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
187879594049SPradeep Reddy POTTETI 
187979594049SPradeep Reddy POTTETI 	return 0;
188079594049SPradeep Reddy POTTETI }
188179594049SPradeep Reddy POTTETI 
188279594049SPradeep Reddy POTTETI 
console_rx_be_tx_be(struct sigma_stream * s,unsigned int * rpkt,int len)188379594049SPradeep Reddy POTTETI static int console_rx_be_tx_be(struct  sigma_stream *s, unsigned int *rpkt,
188479594049SPradeep Reddy POTTETI 			       int len)
188579594049SPradeep Reddy POTTETI {
188679594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
188779594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
188879594049SPradeep Reddy POTTETI 	int res;
188979594049SPradeep Reddy POTTETI 
189079594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
189179594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
189279594049SPradeep Reddy POTTETI 				"console_rx_be_tx_be: Expected Pkt not Recv or Bad TOS");
189379594049SPradeep Reddy POTTETI 		return 0;
189479594049SPradeep Reddy POTTETI 	}
189579594049SPradeep Reddy POTTETI 
189679594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
189779594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
189879594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
189979594049SPradeep Reddy POTTETI 	if (res >= 0) {
190079594049SPradeep Reddy POTTETI 		s->tx_frames++;
190179594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
190279594049SPradeep Reddy POTTETI 	}
190379594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
190479594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
190579594049SPradeep Reddy POTTETI 			"console_rx_be_tx_be: Recv BE, Sent BE");
190679594049SPradeep Reddy POTTETI 
190779594049SPradeep Reddy POTTETI 	return 0;
190879594049SPradeep Reddy POTTETI }
190979594049SPradeep Reddy POTTETI 
191079594049SPradeep Reddy POTTETI 
console_rx_be_tx_be_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)191179594049SPradeep Reddy POTTETI static int console_rx_be_tx_be_tx_stop(struct sigma_stream *s,
191279594049SPradeep Reddy POTTETI 				       unsigned int *rpkt, int len)
191379594049SPradeep Reddy POTTETI {
191479594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
191579594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
191679594049SPradeep Reddy POTTETI 	int res;
191779594049SPradeep Reddy POTTETI 
191879594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
191979594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
192079594049SPradeep Reddy POTTETI 				"console_rx_be_tx_be_tx_stop: Expected Pkt not Recv or Bad TOS");
192179594049SPradeep Reddy POTTETI 		return 0;
192279594049SPradeep Reddy POTTETI 	}
192379594049SPradeep Reddy POTTETI 
192479594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
192579594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
192679594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
192779594049SPradeep Reddy POTTETI 	if (res >= 0) {
192879594049SPradeep Reddy POTTETI 		s->tx_frames++;
192979594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
193079594049SPradeep Reddy POTTETI 	}
193179594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
193279594049SPradeep Reddy POTTETI 			"console_rx_be_tx_be_tx_stop: Recv BE, Sent BE");
193379594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
193479594049SPradeep Reddy POTTETI 
193579594049SPradeep Reddy POTTETI 	return 0;
193679594049SPradeep Reddy POTTETI }
193779594049SPradeep Reddy POTTETI 
193879594049SPradeep Reddy POTTETI 
console_rx_vi_tx_be(struct sigma_stream * s,unsigned int * rpkt,int len)193979594049SPradeep Reddy POTTETI static int console_rx_vi_tx_be(struct sigma_stream *s, unsigned int *rpkt,
194079594049SPradeep Reddy POTTETI 			       int len)
194179594049SPradeep Reddy POTTETI {
194279594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
194379594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
194479594049SPradeep Reddy POTTETI 	int res;
194579594049SPradeep Reddy POTTETI 
194679594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
194779594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
194879594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_be: Expected Pkt not Recv or Bad TOS");
194979594049SPradeep Reddy POTTETI 		return 0;
195079594049SPradeep Reddy POTTETI 	}
195179594049SPradeep Reddy POTTETI 
195279594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
195379594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
195479594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
195579594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
195679594049SPradeep Reddy POTTETI 	if (res >= 0) {
195779594049SPradeep Reddy POTTETI 		s->tx_frames++;
195879594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
195979594049SPradeep Reddy POTTETI 	}
196079594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
196179594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
196279594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_be: Recv VI, Sent BE");
196379594049SPradeep Reddy POTTETI 
196479594049SPradeep Reddy POTTETI 	return 0;
196579594049SPradeep Reddy POTTETI }
196679594049SPradeep Reddy POTTETI 
196779594049SPradeep Reddy POTTETI 
console_rx_vi_tx_bk(struct sigma_stream * s,unsigned int * rpkt,int len)196879594049SPradeep Reddy POTTETI static int console_rx_vi_tx_bk(struct sigma_stream *s, unsigned int *rpkt,
196979594049SPradeep Reddy POTTETI 			       int len)
197079594049SPradeep Reddy POTTETI {
197179594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
197279594049SPradeep Reddy POTTETI 	u32 tos = TOS_BK;
197379594049SPradeep Reddy POTTETI 	int res;
197479594049SPradeep Reddy POTTETI 
197579594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
197679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
197779594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_bk: Expected Pkt not Recv or Bad TOS");
197879594049SPradeep Reddy POTTETI 		return 0;
197979594049SPradeep Reddy POTTETI 	}
198079594049SPradeep Reddy POTTETI 
198179594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
198279594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
198379594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
198479594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
198579594049SPradeep Reddy POTTETI 	if (res >= 0) {
198679594049SPradeep Reddy POTTETI 		s->tx_frames++;
198779594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
198879594049SPradeep Reddy POTTETI 	}
198979594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
199079594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
199179594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_bk: Recv VI, Sent BK");
199279594049SPradeep Reddy POTTETI 
199379594049SPradeep Reddy POTTETI 	return 0;
199479594049SPradeep Reddy POTTETI }
199579594049SPradeep Reddy POTTETI 
199679594049SPradeep Reddy POTTETI 
console_rx_vo_tx_bcst_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)199779594049SPradeep Reddy POTTETI static int console_rx_vo_tx_bcst_tx_stop(struct sigma_stream *s,
199879594049SPradeep Reddy POTTETI 					 unsigned int *rpkt, int len)
199979594049SPradeep Reddy POTTETI {
200079594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
200179594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
200279594049SPradeep Reddy POTTETI 	int res;
200379594049SPradeep Reddy POTTETI 	int broadcast = 1;
200479594049SPradeep Reddy POTTETI 	struct sockaddr_in bcst_addr;
200579594049SPradeep Reddy POTTETI 
200679594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
200779594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
200879594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_bcst_tx_stop: Expected Pkt not Recv or Bad TOS");
200979594049SPradeep Reddy POTTETI 		return 0;
201079594049SPradeep Reddy POTTETI 	}
201179594049SPradeep Reddy POTTETI 
201279594049SPradeep Reddy POTTETI 	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
201379594049SPradeep Reddy POTTETI 	bcst_addr.sin_family = AF_INET;
201479594049SPradeep Reddy POTTETI 	bcst_addr.sin_port = htons(s->dst_port);
201579594049SPradeep Reddy POTTETI 	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
201679594049SPradeep Reddy POTTETI 
201779594049SPradeep Reddy POTTETI 	usleep(300000);
201879594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
201979594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
202079594049SPradeep Reddy POTTETI 	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
202179594049SPradeep Reddy POTTETI 		   sizeof(broadcast));
202279594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
202379594049SPradeep Reddy POTTETI 	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
202479594049SPradeep Reddy POTTETI 		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
202579594049SPradeep Reddy POTTETI 	if (res >= 0) {
202679594049SPradeep Reddy POTTETI 		s->tx_frames++;
202779594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
202879594049SPradeep Reddy POTTETI 	}
202979594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
203079594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_bcst_tx_stop: Recv VO, Sent Broadcast res = %d",
203179594049SPradeep Reddy POTTETI 			res);
203279594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
203379594049SPradeep Reddy POTTETI 
203479594049SPradeep Reddy POTTETI 	return 0;
203579594049SPradeep Reddy POTTETI }
203679594049SPradeep Reddy POTTETI 
203779594049SPradeep Reddy POTTETI 
console_rx_vi_tx_bcst(struct sigma_stream * s,unsigned int * rpkt,int len)203879594049SPradeep Reddy POTTETI static int console_rx_vi_tx_bcst(struct sigma_stream *s, unsigned int *rpkt,
203979594049SPradeep Reddy POTTETI 				 int len)
204079594049SPradeep Reddy POTTETI {
204179594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
204279594049SPradeep Reddy POTTETI 	u32 tos = TOS_VI;
204379594049SPradeep Reddy POTTETI 	int res;
204479594049SPradeep Reddy POTTETI 	int broadcast = 1;
204579594049SPradeep Reddy POTTETI 	struct sockaddr_in bcst_addr;
204679594049SPradeep Reddy POTTETI 
204779594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
204879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
204979594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_bcst: Expected Pkt not Recv or Bad TOS");
205079594049SPradeep Reddy POTTETI 		return 0;
205179594049SPradeep Reddy POTTETI 	}
205279594049SPradeep Reddy POTTETI 
205379594049SPradeep Reddy POTTETI 	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
205479594049SPradeep Reddy POTTETI 	bcst_addr.sin_family = AF_INET;
205579594049SPradeep Reddy POTTETI 	bcst_addr.sin_port = htons(s->dst_port);
205679594049SPradeep Reddy POTTETI 	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
205779594049SPradeep Reddy POTTETI 
205879594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
205979594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
206079594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
206179594049SPradeep Reddy POTTETI 	if (res >= 0) {
206279594049SPradeep Reddy POTTETI 		s->tx_frames++;
206379594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
206479594049SPradeep Reddy POTTETI 	}
206579594049SPradeep Reddy POTTETI 	tos = TOS_BE;
206679594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
206779594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
206879594049SPradeep Reddy POTTETI 	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
206979594049SPradeep Reddy POTTETI 		   sizeof(broadcast));
207079594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
207179594049SPradeep Reddy POTTETI 	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
207279594049SPradeep Reddy POTTETI 		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
207379594049SPradeep Reddy POTTETI 	if (res >= 0) {
207479594049SPradeep Reddy POTTETI 		s->tx_frames++;
207579594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
207679594049SPradeep Reddy POTTETI 	}
207779594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
207879594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_bcst: Recv/Sent VI, Sent Broadcast res = %d",
207979594049SPradeep Reddy POTTETI 			res);
208079594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
208179594049SPradeep Reddy POTTETI 
208279594049SPradeep Reddy POTTETI 	return 0;
208379594049SPradeep Reddy POTTETI }
208479594049SPradeep Reddy POTTETI 
208579594049SPradeep Reddy POTTETI 
console_rx_be_tx_bcst(struct sigma_stream * s,unsigned int * rpkt,int len)208679594049SPradeep Reddy POTTETI static int console_rx_be_tx_bcst(struct sigma_stream *s, unsigned int *rpkt,
208779594049SPradeep Reddy POTTETI 				 int len)
208879594049SPradeep Reddy POTTETI {
208979594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
209079594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
209179594049SPradeep Reddy POTTETI 	int res;
209279594049SPradeep Reddy POTTETI 	int broadcast = 1;
209379594049SPradeep Reddy POTTETI 	struct sockaddr_in bcst_addr;
209479594049SPradeep Reddy POTTETI 
209579594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
209679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
209779594049SPradeep Reddy POTTETI 				"console_rx_be_tx_bcst: Expected Pkt not Recv or Bad TOS");
209879594049SPradeep Reddy POTTETI 		return 0;
209979594049SPradeep Reddy POTTETI 	}
210079594049SPradeep Reddy POTTETI 
210179594049SPradeep Reddy POTTETI 	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
210279594049SPradeep Reddy POTTETI 	bcst_addr.sin_family = AF_INET;
210379594049SPradeep Reddy POTTETI 	bcst_addr.sin_port = htons(s->dst_port);
210479594049SPradeep Reddy POTTETI 	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
210579594049SPradeep Reddy POTTETI 
210679594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
210779594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
210879594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
210979594049SPradeep Reddy POTTETI 	if (res >= 0) {
211079594049SPradeep Reddy POTTETI 		s->tx_frames++;
211179594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
211279594049SPradeep Reddy POTTETI 	}
211379594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
211479594049SPradeep Reddy POTTETI 	rpkt[1] = tos;
211579594049SPradeep Reddy POTTETI 	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
211679594049SPradeep Reddy POTTETI 		   sizeof(broadcast));
211779594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
211879594049SPradeep Reddy POTTETI 	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
211979594049SPradeep Reddy POTTETI 		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
212079594049SPradeep Reddy POTTETI 	if (res >= 0) {
212179594049SPradeep Reddy POTTETI 		s->tx_frames++;
212279594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
212379594049SPradeep Reddy POTTETI 	}
212479594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
212579594049SPradeep Reddy POTTETI 			"console_rx_be_tx_bcst: Recv/Sent BE, Sent Broadcast res = %d",
212679594049SPradeep Reddy POTTETI 			res);
212779594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
212879594049SPradeep Reddy POTTETI 
212979594049SPradeep Reddy POTTETI 	return 0;
213079594049SPradeep Reddy POTTETI }
213179594049SPradeep Reddy POTTETI 
213279594049SPradeep Reddy POTTETI 
console_rx_be_tx_bcst_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)213379594049SPradeep Reddy POTTETI static int console_rx_be_tx_bcst_tx_stop(struct sigma_stream *s,
213479594049SPradeep Reddy POTTETI 					 unsigned int *rpkt, int len)
213579594049SPradeep Reddy POTTETI {
213679594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
213779594049SPradeep Reddy POTTETI 	u32 tos = TOS_BE;
213879594049SPradeep Reddy POTTETI 	int res;
213979594049SPradeep Reddy POTTETI 	int broadcast = 1;
214079594049SPradeep Reddy POTTETI 	struct sockaddr_in bcst_addr;
214179594049SPradeep Reddy POTTETI 
214279594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
214379594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
214479594049SPradeep Reddy POTTETI 				"console_rx_be_tx_bcst_tx_stop: Expected Pkt not Recv or Bad TOS");
214579594049SPradeep Reddy POTTETI 		return 0;
214679594049SPradeep Reddy POTTETI 	}
214779594049SPradeep Reddy POTTETI 
214879594049SPradeep Reddy POTTETI 	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
214979594049SPradeep Reddy POTTETI 	bcst_addr.sin_family = AF_INET;
215079594049SPradeep Reddy POTTETI 	bcst_addr.sin_port = htons(s->dst_port);
215179594049SPradeep Reddy POTTETI 	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));
215279594049SPradeep Reddy POTTETI 
215379594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
215479594049SPradeep Reddy POTTETI 	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
215579594049SPradeep Reddy POTTETI 		   sizeof(broadcast));
215679594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
215779594049SPradeep Reddy POTTETI 	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
215879594049SPradeep Reddy POTTETI 		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
215979594049SPradeep Reddy POTTETI 	if (res >= 0) {
216079594049SPradeep Reddy POTTETI 		s->tx_frames++;
216179594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
216279594049SPradeep Reddy POTTETI 	}
216379594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
216479594049SPradeep Reddy POTTETI 			"console_rx_be_tx_bcst_tx_stop: Recv BE, Sent Broadcast res = %d",
216579594049SPradeep Reddy POTTETI 			res);
216679594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
216779594049SPradeep Reddy POTTETI 
216879594049SPradeep Reddy POTTETI 	return 0;
216979594049SPradeep Reddy POTTETI }
217079594049SPradeep Reddy POTTETI 
217179594049SPradeep Reddy POTTETI 
console_rx_vi_tx_vi(struct sigma_stream * s,unsigned int * rpkt,int len)217279594049SPradeep Reddy POTTETI static int console_rx_vi_tx_vi(struct sigma_stream *s, unsigned int *rpkt,
217379594049SPradeep Reddy POTTETI 			       int len)
217479594049SPradeep Reddy POTTETI {
217579594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
217679594049SPradeep Reddy POTTETI 	u32 tos = TOS_VI;
217779594049SPradeep Reddy POTTETI 	int res;
217879594049SPradeep Reddy POTTETI 
217979594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
218079594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
218179594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_vi: Expected Pkt not Recv or Bad TOS");
218279594049SPradeep Reddy POTTETI 		return 0;
218379594049SPradeep Reddy POTTETI 	}
218479594049SPradeep Reddy POTTETI 
218579594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
218679594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
218779594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
218879594049SPradeep Reddy POTTETI 	if (res >= 0) {
218979594049SPradeep Reddy POTTETI 		s->tx_frames++;
219079594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
219179594049SPradeep Reddy POTTETI 	}
219279594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
219379594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
219479594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_vi: Recv VI, Sent VI");
219579594049SPradeep Reddy POTTETI 
219679594049SPradeep Reddy POTTETI 	return 0;
219779594049SPradeep Reddy POTTETI }
219879594049SPradeep Reddy POTTETI 
219979594049SPradeep Reddy POTTETI 
console_rx_vi_tx_vi_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)220079594049SPradeep Reddy POTTETI static int console_rx_vi_tx_vi_tx_stop(struct sigma_stream *s,
220179594049SPradeep Reddy POTTETI 				       unsigned int *rpkt, int len)
220279594049SPradeep Reddy POTTETI {
220379594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
220479594049SPradeep Reddy POTTETI 	u32 tos = TOS_VI;
220579594049SPradeep Reddy POTTETI 	int res;
220679594049SPradeep Reddy POTTETI 
220779594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
220879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
220979594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_vi_tx_stop: Expected Pkt not Recv or Bad TOS");
221079594049SPradeep Reddy POTTETI 		return 0;
221179594049SPradeep Reddy POTTETI 	}
221279594049SPradeep Reddy POTTETI 
221379594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
221479594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
221579594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
221679594049SPradeep Reddy POTTETI 	if (res >= 0) {
221779594049SPradeep Reddy POTTETI 		s->tx_frames++;
221879594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
221979594049SPradeep Reddy POTTETI 	}
222079594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
222179594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_vi_tx_stop: Recv VI, Sent VI");
222279594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
222379594049SPradeep Reddy POTTETI 
222479594049SPradeep Reddy POTTETI 	return 0;
222579594049SPradeep Reddy POTTETI }
222679594049SPradeep Reddy POTTETI 
222779594049SPradeep Reddy POTTETI 
console_rx_vi_tx_vo_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)222879594049SPradeep Reddy POTTETI static int console_rx_vi_tx_vo_tx_stop(struct sigma_stream *s,
222979594049SPradeep Reddy POTTETI 				       unsigned int *rpkt, int len)
223079594049SPradeep Reddy POTTETI {
223179594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
223279594049SPradeep Reddy POTTETI 	u32 tos = TOS_VO7;
223379594049SPradeep Reddy POTTETI 	int res;
223479594049SPradeep Reddy POTTETI 
223579594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
223679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
223779594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
223879594049SPradeep Reddy POTTETI 		return 0;
223979594049SPradeep Reddy POTTETI 	}
224079594049SPradeep Reddy POTTETI 
224179594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
224279594049SPradeep Reddy POTTETI 	rpkt[1] = TOS_VO;
224379594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
224479594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
224579594049SPradeep Reddy POTTETI 	if (res >= 0) {
224679594049SPradeep Reddy POTTETI 		s->tx_frames++;
224779594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
224879594049SPradeep Reddy POTTETI 	}
224979594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
225079594049SPradeep Reddy POTTETI 			"console_rx_vi_tx_vo_tx_stop: Recv VI, Sent VO");
225179594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
225279594049SPradeep Reddy POTTETI 
225379594049SPradeep Reddy POTTETI 	return 0;
225479594049SPradeep Reddy POTTETI }
225579594049SPradeep Reddy POTTETI 
225679594049SPradeep Reddy POTTETI 
console_rx_vo_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)225779594049SPradeep Reddy POTTETI static int console_rx_vo_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
225879594049SPradeep Reddy POTTETI 				 int len)
225979594049SPradeep Reddy POTTETI {
226079594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
226179594049SPradeep Reddy POTTETI 
226279594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
226379594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
226479594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
226579594049SPradeep Reddy POTTETI 		return 0;
226679594049SPradeep Reddy POTTETI 	}
226779594049SPradeep Reddy POTTETI 
226879594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vo_tx_stop: Recv VO");
226979594049SPradeep Reddy POTTETI 	sleep(1);
227079594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
227179594049SPradeep Reddy POTTETI 
227279594049SPradeep Reddy POTTETI 	return 0;
227379594049SPradeep Reddy POTTETI }
227479594049SPradeep Reddy POTTETI 
227579594049SPradeep Reddy POTTETI 
console_rx_vi_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)227679594049SPradeep Reddy POTTETI static int console_rx_vi_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
227779594049SPradeep Reddy POTTETI 				 int len)
227879594049SPradeep Reddy POTTETI {
227979594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
228079594049SPradeep Reddy POTTETI 
228179594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
228279594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
228379594049SPradeep Reddy POTTETI 				"console_rx_vi_tx_stop: Expected Pkt not Recv or Bad TOS");
228479594049SPradeep Reddy POTTETI 		return 0;
228579594049SPradeep Reddy POTTETI 	}
228679594049SPradeep Reddy POTTETI 
228779594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vi_tx_stop: Recv VI");
228879594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
228979594049SPradeep Reddy POTTETI 
229079594049SPradeep Reddy POTTETI 	return 0;
229179594049SPradeep Reddy POTTETI }
229279594049SPradeep Reddy POTTETI 
229379594049SPradeep Reddy POTTETI 
console_rx_bk_tx_stop(struct sigma_stream * s,unsigned int * rpkt,int len)229479594049SPradeep Reddy POTTETI static int console_rx_bk_tx_stop(struct  sigma_stream *s, unsigned int *rpkt,
229579594049SPradeep Reddy POTTETI 				 int len)
229679594049SPradeep Reddy POTTETI {
229779594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
229879594049SPradeep Reddy POTTETI 
229979594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BK)) {
230079594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
230179594049SPradeep Reddy POTTETI 				"console_rx_bk_tx_stop: Expected Pkt not Recv or Bad TOS");
230279594049SPradeep Reddy POTTETI 		return 0;
230379594049SPradeep Reddy POTTETI 	}
230479594049SPradeep Reddy POTTETI 
230579594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_bk_tx_stop: Recv BK");
230679594049SPradeep Reddy POTTETI 	console_send(s, APTS_STOP, TOS_BE);
230779594049SPradeep Reddy POTTETI 
230879594049SPradeep Reddy POTTETI 	return 0;
230979594049SPradeep Reddy POTTETI }
231079594049SPradeep Reddy POTTETI 
231179594049SPradeep Reddy POTTETI 
console_rx_vo_tx_2vo(struct sigma_stream * s,unsigned int * rpkt,int len)231279594049SPradeep Reddy POTTETI static int console_rx_vo_tx_2vo(struct sigma_stream *s, unsigned int *rpkt,
231379594049SPradeep Reddy POTTETI 				int len)
231479594049SPradeep Reddy POTTETI {
231579594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
231679594049SPradeep Reddy POTTETI 	u32 tos = TOS_VO7;
231779594049SPradeep Reddy POTTETI 	int res;
231879594049SPradeep Reddy POTTETI 
231979594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
232079594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
232179594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_2vo: Expected Pkt not Recv or Bad TOS");
232279594049SPradeep Reddy POTTETI 		return 0;
232379594049SPradeep Reddy POTTETI 	}
232479594049SPradeep Reddy POTTETI 
232579594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
232679594049SPradeep Reddy POTTETI 	rpkt[1] = TOS_VO;
232779594049SPradeep Reddy POTTETI 	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
232879594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
232979594049SPradeep Reddy POTTETI 	if (res >= 0) {
233079594049SPradeep Reddy POTTETI 		s->tx_frames++;
233179594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
233279594049SPradeep Reddy POTTETI 	}
233379594049SPradeep Reddy POTTETI 	rpkt[0] = ++(s->rx_cookie);
233479594049SPradeep Reddy POTTETI 	res = send(s->sock, rpkt, s->payload_size / 2, 0);
233579594049SPradeep Reddy POTTETI 	if (res >= 0) {
233679594049SPradeep Reddy POTTETI 		s->tx_frames++;
233779594049SPradeep Reddy POTTETI 		s->tx_payload_bytes += res;
233879594049SPradeep Reddy POTTETI 	}
233979594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
234079594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
234179594049SPradeep Reddy POTTETI 			"console_rx_vo_tx_2vo: Recv VO, Sent 2 VO");
234279594049SPradeep Reddy POTTETI 
234379594049SPradeep Reddy POTTETI 	return 0;
234479594049SPradeep Reddy POTTETI }
234579594049SPradeep Reddy POTTETI 
234679594049SPradeep Reddy POTTETI 
console_rx_be(struct sigma_stream * s,unsigned int * rpkt,int len)234779594049SPradeep Reddy POTTETI static int console_rx_be(struct sigma_stream *s, unsigned int *rpkt, int len)
234879594049SPradeep Reddy POTTETI {
234979594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
235079594049SPradeep Reddy POTTETI 
235179594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
235279594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
235379594049SPradeep Reddy POTTETI 				"console_rx_be: Expected Pkt not Recv or Bad TOS");
235479594049SPradeep Reddy POTTETI 		return 0;
235579594049SPradeep Reddy POTTETI 	}
235679594049SPradeep Reddy POTTETI 
235779594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
235879594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_be: Recv BE");
235979594049SPradeep Reddy POTTETI 
236079594049SPradeep Reddy POTTETI 	return 0;
236179594049SPradeep Reddy POTTETI }
236279594049SPradeep Reddy POTTETI 
236379594049SPradeep Reddy POTTETI 
console_rx_vi(struct sigma_stream * s,unsigned int * rpkt,int len)236479594049SPradeep Reddy POTTETI static int console_rx_vi(struct sigma_stream *s, unsigned int *rpkt, int len)
236579594049SPradeep Reddy POTTETI {
236679594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
236779594049SPradeep Reddy POTTETI 
236879594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
236979594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
237079594049SPradeep Reddy POTTETI 				"console_rx_vi: Expected Pkt not Recv or Bad TOS");
237179594049SPradeep Reddy POTTETI 		return 0;
237279594049SPradeep Reddy POTTETI 	}
237379594049SPradeep Reddy POTTETI 
237479594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
237579594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vi: Recv VI");
237679594049SPradeep Reddy POTTETI 
237779594049SPradeep Reddy POTTETI 	return 0;
237879594049SPradeep Reddy POTTETI }
237979594049SPradeep Reddy POTTETI 
238079594049SPradeep Reddy POTTETI 
console_rx_vo(struct sigma_stream * s,unsigned int * rpkt,int len)238179594049SPradeep Reddy POTTETI static int console_rx_vo(struct sigma_stream *s, unsigned int *rpkt, int len)
238279594049SPradeep Reddy POTTETI {
238379594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
238479594049SPradeep Reddy POTTETI 
238579594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
238679594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
238779594049SPradeep Reddy POTTETI 				"console_rx_vo : Expected Pkt not Recv or Bad TOS");
238879594049SPradeep Reddy POTTETI 		return 0;
238979594049SPradeep Reddy POTTETI 	}
239079594049SPradeep Reddy POTTETI 
239179594049SPradeep Reddy POTTETI 	s->uapsd_rx_state++;
239279594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vo: Recv VO");
239379594049SPradeep Reddy POTTETI 
239479594049SPradeep Reddy POTTETI 	return 0;
239579594049SPradeep Reddy POTTETI 
239679594049SPradeep Reddy POTTETI }
239779594049SPradeep Reddy POTTETI 
239879594049SPradeep Reddy POTTETI 
console_rx_vo_tx_vo_cyclic(struct sigma_stream * s,unsigned int * rpkt,int len)239979594049SPradeep Reddy POTTETI static int console_rx_vo_tx_vo_cyclic(struct sigma_stream *s,
240079594049SPradeep Reddy POTTETI 				      unsigned int *rpkt, int len)
240179594049SPradeep Reddy POTTETI {
240279594049SPradeep Reddy POTTETI 	int res = 0;
240379594049SPradeep Reddy POTTETI 	unsigned int tos = 0;
240479594049SPradeep Reddy POTTETI 	unsigned int *tpkt;
240579594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
240679594049SPradeep Reddy POTTETI 
240779594049SPradeep Reddy POTTETI 	tpkt = malloc(s->payload_size);
240879594049SPradeep Reddy POTTETI 	if (tpkt == NULL)
240979594049SPradeep Reddy POTTETI 		return -1;
241079594049SPradeep Reddy POTTETI 
241179594049SPradeep Reddy POTTETI 	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
241279594049SPradeep Reddy POTTETI 		if (rpkt[10] != APTS_STOP)
241379594049SPradeep Reddy POTTETI 			sigma_uapsd_reset(s);
241479594049SPradeep Reddy POTTETI 
241579594049SPradeep Reddy POTTETI 		if (!packet_expected(s, rpkt, APTS_STOP, TOS_BE)) {
241679594049SPradeep Reddy POTTETI 			sigma_dut_print(dut, DUT_MSG_ERROR,
241779594049SPradeep Reddy POTTETI 					"console_rx_vo_tx_vo_cyclic: Expected STOP Pkt not Recv or Bad TOS");
241879594049SPradeep Reddy POTTETI 			free(tpkt);
241979594049SPradeep Reddy POTTETI 			return 0;
242079594049SPradeep Reddy POTTETI 		}
242179594049SPradeep Reddy POTTETI 
24221977e0d0SPradeep Reddy POTTETI 		memset(tpkt, 0, s->payload_size);
242379594049SPradeep Reddy POTTETI 		tpkt[0] = s->rx_cookie;
242479594049SPradeep Reddy POTTETI 		tos = TOS_BE;
242579594049SPradeep Reddy POTTETI 		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
2426947fdf6dSJouni Malinen 		create_apts_pkt(APTS_STOP, tpkt, s->payload_size, tos, s);
242779594049SPradeep Reddy POTTETI 		tpkt[1] = tos;
242879594049SPradeep Reddy POTTETI 		if (s->can_quit) {
24291977e0d0SPradeep Reddy POTTETI 			const char *stop_cmd = "APTSL1 STOP";
24301977e0d0SPradeep Reddy POTTETI 			size_t stop_cmd_len = strlen(stop_cmd);
24311977e0d0SPradeep Reddy POTTETI 
24321977e0d0SPradeep Reddy POTTETI 			if (s->payload_size > 11 * sizeof(int) + stop_cmd_len)
24331977e0d0SPradeep Reddy POTTETI 				memcpy(&tpkt[11], stop_cmd, stop_cmd_len + 1);
243479594049SPradeep Reddy POTTETI 			res = send(s->sock, tpkt, s->payload_size / 2, 0);
243579594049SPradeep Reddy POTTETI 			if (res >= 0) {
243679594049SPradeep Reddy POTTETI 				s->tx_frames++;
243779594049SPradeep Reddy POTTETI 				s->tx_payload_bytes += res;
243879594049SPradeep Reddy POTTETI 			}
243979594049SPradeep Reddy POTTETI 			sigma_dut_print(dut, DUT_MSG_INFO,
244079594049SPradeep Reddy POTTETI 					"console_rx_vo_tx_vo_cyclic: Sent STOP");
244179594049SPradeep Reddy POTTETI 			sleep(5);
244279594049SPradeep Reddy POTTETI 			s->stop = 1;
244379594049SPradeep Reddy POTTETI 		} else {
244479594049SPradeep Reddy POTTETI 			res = send(s->sock, tpkt, s->payload_size / 2, 0);
244579594049SPradeep Reddy POTTETI 			if (res >= 0) {
244679594049SPradeep Reddy POTTETI 				s->tx_frames++;
244779594049SPradeep Reddy POTTETI 				s->tx_payload_bytes += res;
244879594049SPradeep Reddy POTTETI 			}
244979594049SPradeep Reddy POTTETI 			s->can_quit = 1;
245079594049SPradeep Reddy POTTETI 		}
245179594049SPradeep Reddy POTTETI 	} else {
245279594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_INFO,
245379594049SPradeep Reddy POTTETI 				"console_rx_vo_tx_vo_cyclic: Recv Pkt: %d Cookie: %d Sta-id %d",
245479594049SPradeep Reddy POTTETI 				rpkt[0], s->rx_cookie, s->sta_id);
245579594049SPradeep Reddy POTTETI 		rpkt[0] = ++(s->rx_cookie);
245679594049SPradeep Reddy POTTETI 		tos = TOS_VO7;
245779594049SPradeep Reddy POTTETI 		rpkt[1] = TOS_VO;
245879594049SPradeep Reddy POTTETI 		res = setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos,
245979594049SPradeep Reddy POTTETI 				 sizeof(tos));
246079594049SPradeep Reddy POTTETI 		res = send(s->sock, rpkt, s->payload_size / 2, 0);
246179594049SPradeep Reddy POTTETI 		if (res >= 0) {
246279594049SPradeep Reddy POTTETI 			s->tx_frames++;
246379594049SPradeep Reddy POTTETI 			s->tx_payload_bytes += res;
246479594049SPradeep Reddy POTTETI 		}
246579594049SPradeep Reddy POTTETI 
246679594049SPradeep Reddy POTTETI 		if (s->rx_cookie >= 3000) {
246779594049SPradeep Reddy POTTETI 			/* No state change for L.1 */
246879594049SPradeep Reddy POTTETI 		}
246979594049SPradeep Reddy POTTETI 	}
247079594049SPradeep Reddy POTTETI 
247179594049SPradeep Reddy POTTETI 	free(tpkt);
247279594049SPradeep Reddy POTTETI 
247379594049SPradeep Reddy POTTETI 	return 0;
247479594049SPradeep Reddy POTTETI }
247579594049SPradeep Reddy POTTETI 
247679594049SPradeep Reddy POTTETI 
apts_lookup(const char * s)247779594049SPradeep Reddy POTTETI static struct apts_pkt * apts_lookup(const char *s)
247879594049SPradeep Reddy POTTETI {
247979594049SPradeep Reddy POTTETI 	struct apts_pkt *t;
248079594049SPradeep Reddy POTTETI 
248179594049SPradeep Reddy POTTETI 	for (t = &apts_pkts[1]; s && t->cmd; t++) {
2482e104a5bcSPradeep Reddy POTTETI 		if (strcmp(s, "L.1AP") == 0)
2483e104a5bcSPradeep Reddy POTTETI 			s = "L.1";
248479594049SPradeep Reddy POTTETI 		if (t->name && strcmp(t->name, s) == 0)
248579594049SPradeep Reddy POTTETI 			return t;
248679594049SPradeep Reddy POTTETI 	}
248779594049SPradeep Reddy POTTETI 
248879594049SPradeep Reddy POTTETI 	return NULL;
248979594049SPradeep Reddy POTTETI }
249079594049SPradeep Reddy POTTETI 
249179594049SPradeep Reddy POTTETI 
send_uapsd_console(struct sigma_stream * s)249279594049SPradeep Reddy POTTETI void send_uapsd_console(struct sigma_stream *s)
249379594049SPradeep Reddy POTTETI {
249479594049SPradeep Reddy POTTETI 	struct timeval tv;
249579594049SPradeep Reddy POTTETI 	fd_set rfds;
249679594049SPradeep Reddy POTTETI 	int res;
249779594049SPradeep Reddy POTTETI 	unsigned int *rpkt;
249879594049SPradeep Reddy POTTETI 	uapsd_console_state_func_ptr console_state_func;
249979594049SPradeep Reddy POTTETI 	struct apts_pkt *testcase;
250079594049SPradeep Reddy POTTETI 	struct sigma_dut *dut = s->dut;
250179594049SPradeep Reddy POTTETI 	/* start timer for self exit */
250279594049SPradeep Reddy POTTETI 	int uapsd_timer = UAPSD_CONSOLE_TIMER;
250379594049SPradeep Reddy POTTETI 
250479594049SPradeep Reddy POTTETI 	s->can_quit = 0;
250579594049SPradeep Reddy POTTETI 	s->reset = 0;
250679594049SPradeep Reddy POTTETI 	s->reset_rx = 0;
250779594049SPradeep Reddy POTTETI 	s->uapsd_sta_tc = 0;
250879594049SPradeep Reddy POTTETI 
250979594049SPradeep Reddy POTTETI 	testcase = apts_lookup(s->test_name);
251079594049SPradeep Reddy POTTETI 	if (testcase == NULL) {
251179594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
251279594049SPradeep Reddy POTTETI 				"send_uapsd_console: no testcase found");
251379594049SPradeep Reddy POTTETI 		return;
251479594049SPradeep Reddy POTTETI 	}
251579594049SPradeep Reddy POTTETI 
251679594049SPradeep Reddy POTTETI 	/* send test case number to be executed */
251779594049SPradeep Reddy POTTETI 	s->uapsd_sta_tc = testcase->cmd;
251879594049SPradeep Reddy POTTETI 	if (s->uapsd_sta_tc < B_D || s->uapsd_sta_tc > LAST_TC) {
251979594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
252079594049SPradeep Reddy POTTETI 				"send_uapsd_console: Test Case: %s Unknown",
252179594049SPradeep Reddy POTTETI 				s->test_name);
252279594049SPradeep Reddy POTTETI 		return;
252379594049SPradeep Reddy POTTETI 	}
252479594049SPradeep Reddy POTTETI 
252579594049SPradeep Reddy POTTETI 	s->payload_size = 512;
252679594049SPradeep Reddy POTTETI 	rpkt = malloc(s->payload_size);
252779594049SPradeep Reddy POTTETI 	if (rpkt == NULL) {
252879594049SPradeep Reddy POTTETI 		sigma_dut_print(dut, DUT_MSG_ERROR,
252979594049SPradeep Reddy POTTETI 				"send_uapsd_console: buffer allocation failed");
253079594049SPradeep Reddy POTTETI 		return;
253179594049SPradeep Reddy POTTETI 	}
253279594049SPradeep Reddy POTTETI 
253379594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
253479594049SPradeep Reddy POTTETI 			"send_uapsd_console: Uapsd Console Start");
253579594049SPradeep Reddy POTTETI 
253679594049SPradeep Reddy POTTETI 	while (!s->stop) {
253779594049SPradeep Reddy POTTETI 		uapsd_timer--;
253879594049SPradeep Reddy POTTETI 		FD_ZERO(&rfds);
253979594049SPradeep Reddy POTTETI 		FD_SET(s->sock, &rfds);
254079594049SPradeep Reddy POTTETI 		tv.tv_sec = 0;
254179594049SPradeep Reddy POTTETI 		tv.tv_usec = 300000;
254279594049SPradeep Reddy POTTETI 		res = select(s->sock + 1, &rfds, NULL, NULL, &tv);
254379594049SPradeep Reddy POTTETI 		if (res < 0) {
254479594049SPradeep Reddy POTTETI 			perror("select");
254579594049SPradeep Reddy POTTETI 			usleep(10000);
254679594049SPradeep Reddy POTTETI 		} else if (FD_ISSET(s->sock, &rfds)) {
254779594049SPradeep Reddy POTTETI 			memset(rpkt, 0, s->payload_size);
254879594049SPradeep Reddy POTTETI 			res = recv(s->sock, rpkt, s->payload_size, 0);
254979594049SPradeep Reddy POTTETI 			if (res < 0) {
255079594049SPradeep Reddy POTTETI 				perror("recv");
255179594049SPradeep Reddy POTTETI 				break;
255279594049SPradeep Reddy POTTETI 			}
255379594049SPradeep Reddy POTTETI 
255479594049SPradeep Reddy POTTETI 			sigma_dut_print(dut, DUT_MSG_INFO,
255579594049SPradeep Reddy POTTETI 					"send_uapsd_console: running res %d cookie %d dscp %d apts-pkt %d sta-id %d",
255679594049SPradeep Reddy POTTETI 					res, rpkt[0], rpkt[1], rpkt[10],
255779594049SPradeep Reddy POTTETI 					rpkt[9]);
255879594049SPradeep Reddy POTTETI 			if (res == 0)
255979594049SPradeep Reddy POTTETI 				continue;
256079594049SPradeep Reddy POTTETI 
256179594049SPradeep Reddy POTTETI 			s->rx_frames++;
256279594049SPradeep Reddy POTTETI 			s->rx_payload_bytes += res;
256379594049SPradeep Reddy POTTETI 			/*
256479594049SPradeep Reddy POTTETI 			 * Reset the timer as packet is received
256579594049SPradeep Reddy POTTETI 			 * within steps.
256679594049SPradeep Reddy POTTETI 			 */
256779594049SPradeep Reddy POTTETI 			uapsd_timer = UAPSD_CONSOLE_TIMER;
256879594049SPradeep Reddy POTTETI 
256979594049SPradeep Reddy POTTETI 			if (rpkt[10] == APTS_HELLO) {
257079594049SPradeep Reddy POTTETI 				if (s->reset)
257179594049SPradeep Reddy POTTETI 					s->reset = 0;
257279594049SPradeep Reddy POTTETI 				s->rx_cookie = 0;
257383d62cbbSPradeep Reddy POTTETI 				/* assign a unique id to this sta */
257483d62cbbSPradeep Reddy POTTETI 				s->sta_id = s->stream_id;
257579594049SPradeep Reddy POTTETI 				/* uapsd console process table state */
257679594049SPradeep Reddy POTTETI 				s->uapsd_rx_state = 0;
257779594049SPradeep Reddy POTTETI 				s->can_quit = 1;
257879594049SPradeep Reddy POTTETI 			} else {
257979594049SPradeep Reddy POTTETI 				if (s->reset)
258079594049SPradeep Reddy POTTETI 					continue;
258179594049SPradeep Reddy POTTETI 			}
258279594049SPradeep Reddy POTTETI 
258379594049SPradeep Reddy POTTETI 			if (rpkt[10] == APTS_RESET) {
258479594049SPradeep Reddy POTTETI 				sigma_dut_print(dut, DUT_MSG_ERROR,
258579594049SPradeep Reddy POTTETI 						"send_uapsd_console: RESET Pkt recv");
258679594049SPradeep Reddy POTTETI 				s->reset_rx = 1;
258779594049SPradeep Reddy POTTETI 				sigma_uapsd_reset(s);
258879594049SPradeep Reddy POTTETI 			}
258979594049SPradeep Reddy POTTETI 
259079594049SPradeep Reddy POTTETI 			if (rpkt[10] == APTS_RESET_STOP) {
259179594049SPradeep Reddy POTTETI 				sigma_dut_print(dut, DUT_MSG_ERROR,
259279594049SPradeep Reddy POTTETI 						"send_uapsd_console: RESET STOP Pkt recv");
259379594049SPradeep Reddy POTTETI 				s->stop = 1;
259479594049SPradeep Reddy POTTETI 			}
259579594049SPradeep Reddy POTTETI 
259679594049SPradeep Reddy POTTETI 			if (rpkt[10] == APTS_BCST) {
259779594049SPradeep Reddy POTTETI 				sigma_dut_print(dut, DUT_MSG_INFO,
259879594049SPradeep Reddy POTTETI 						"send_uapsd_console: Broadcast Pkt recv");
259979594049SPradeep Reddy POTTETI 				continue;
260079594049SPradeep Reddy POTTETI 			}
260179594049SPradeep Reddy POTTETI 
260279594049SPradeep Reddy POTTETI 			console_state_func =
260379594049SPradeep Reddy POTTETI 				uapsd_console_state_tbl[s->uapsd_sta_tc]
260479594049SPradeep Reddy POTTETI 				[s->uapsd_rx_state].state_func;
260579594049SPradeep Reddy POTTETI 			if (console_state_func) {
260679594049SPradeep Reddy POTTETI 				console_state_func(s, rpkt, res);
260779594049SPradeep Reddy POTTETI 			} else {
260879594049SPradeep Reddy POTTETI 				sigma_dut_print(dut, DUT_MSG_INFO,
260979594049SPradeep Reddy POTTETI 						"send_uapsd_console: Null function detected for TC: %d in uapsd_rx_state: %d",
261079594049SPradeep Reddy POTTETI 						s->uapsd_sta_tc,
261179594049SPradeep Reddy POTTETI 						s->uapsd_rx_state);
261279594049SPradeep Reddy POTTETI 			}
261379594049SPradeep Reddy POTTETI 		}
261479594049SPradeep Reddy POTTETI 
261579594049SPradeep Reddy POTTETI 		/* Stop the thread. No transactions for the set time */
261679594049SPradeep Reddy POTTETI 		if (uapsd_timer == 0) {
261779594049SPradeep Reddy POTTETI 			sigma_dut_print(dut, DUT_MSG_INFO,
261879594049SPradeep Reddy POTTETI 					"send_uapsd_console: Timer Expired");
261979594049SPradeep Reddy POTTETI 			s->stop = 1;
262079594049SPradeep Reddy POTTETI 		}
262179594049SPradeep Reddy POTTETI 	}
262279594049SPradeep Reddy POTTETI 
262379594049SPradeep Reddy POTTETI 	free(rpkt);
262479594049SPradeep Reddy POTTETI 	sigma_dut_print(dut, DUT_MSG_INFO,
262579594049SPradeep Reddy POTTETI 			"send_uapsd_console: Uapsd Console End");
262679594049SPradeep Reddy POTTETI }
2627