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