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