/*
 * Sigma Control API DUT (station/AP)
 * Copyright (c) 2014, Qualcomm Atheros, Inc.
 * All Rights Reserved.
 * Licensed under the Clear BSD license. See README for more details.
 */

/*
 * This implementation in this file is based on source code released by
 * Wi-Fi Alliance under the following terms:
 *
* Copyright (c) 2014 Wi-Fi Alliance
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
* USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include "sigma_dut.h"

static void sigma_uapsd_reset(struct sigma_stream *s);
static void sigma_uapsd_stop(struct sigma_stream *s);
static void create_apts_hello_pkt(int msg, unsigned int *txbuf,
				  int tx_hello_cnt);


/* WMM-PS Test Case IDs */
#define B_D		1
#define B_H		2
#define B_B		3
#define B_M 		4
#define M_D		5
#define B_Z		6
#define M_Y		7
#define L_1		8
#define A_Y		9
#define B_W		10
#define A_J		11
#define M_V		12
#define M_U		13
#define A_U		14
#define M_L		15
#define B_K		16
#define M_B		17
#define M_K		18
#define M_W		19

/* WMM-PS APTS Msg IDs */
#define APTS_DEFAULT	(M_W + 0x01)
#define APTS_HELLO	(APTS_DEFAULT + 0x01)
#define APTS_BCST	(APTS_HELLO + 0x01)
#define APTS_CONFIRM	(APTS_BCST + 0x01)
#define APTS_STOP	(APTS_CONFIRM + 0x01)
#define APTS_CK_BE      (APTS_STOP + 0x01)
#define APTS_CK_BK      (APTS_CK_BE + 0x01)
#define APTS_CK_VI      (APTS_CK_BK + 0x01)
#define APTS_CK_VO      (APTS_CK_VI + 0x01)
#define APTS_RESET      (APTS_CK_VO + 0x01)
#define APTS_RESET_RESP (APTS_RESET + 0x01)
#define APTS_RESET_STOP (APTS_RESET_RESP + 0x01)
#define APTS_LAST       99

/* WMM-AC Test Case IDs */
extern int sigma_wmm_ac;
#ifdef CONFIG_WFA_WMM_AC
#define WMMAC_422_T02B            20
#define WMMAC_422_T03A            21
#define WMMAC_422_T04B            22
#define WMMAC_422_T05B            23
#define WMMAC_422_T06B            24
#define WMMAC_422_T07B            25
#define WMMAC_422_T08B            26

#define WMMAC_423_T04             27
#define WMMAC_424_T07t14          28
#define WMMAC_425_T04t06          29

#define WMMAC_521_T03             30
#define WMMAC_521_T05             31

#define WMMAC_522_T04             32
#define WMMAC_522_T06             33
#define WMMAC_522_T06o            34
#define WMMAC_524_T03             35
#define WMMAC_524_T03i            36
#define WMMAC_525_T07t10          37
#endif /* CONFIG_WFA_WMM_AC */

/* WMM-AC APTS Msg IDs */
/* WMMAC_APTS_DEFAULT Msg Id would be WMM-AC last test case
 * (WMMAC_525_T07t10) + 1 */
#define WMMAC_APTS_DEFAULT	38
#define WMMAC_APTS_HELLO	(WMMAC_APTS_DEFAULT + 0x01)
#define WMMAC_APTS_BCST		(WMMAC_APTS_HELLO + 0x01)
#define WMMAC_APTS_CONFIRM	(WMMAC_APTS_BCST + 0x01)
#define WMMAC_APTS_STOP		(WMMAC_APTS_CONFIRM + 0x01)
#define WMMAC_APTS_CK_BE      	(WMMAC_APTS_STOP + 0x01)
#define WMMAC_APTS_CK_BK      	(WMMAC_APTS_CK_BE + 0x01)
#define WMMAC_APTS_CK_VI      	(WMMAC_APTS_CK_BK + 0x01)
#define WMMAC_APTS_CK_VO      	(WMMAC_APTS_CK_VI + 0x01)
#define WMMAC_APTS_RESET      	(WMMAC_APTS_CK_VO + 0x01)
#define WMMAC_APTS_RESET_RESP 	(WMMAC_APTS_RESET + 0x01)
#define WMMAC_APTS_RESET_STOP 	(WMMAC_APTS_RESET_RESP + 0x01)
#define WMMAC_APTS_LAST       	99

#ifdef CONFIG_WFA_WMM_AC
#define LAST_TC		WMMAC_525_T07t10
#else /* CONFIG_WFA_WMM_AC */
#define LAST_TC		M_W
#endif /* CONFIG_WFA_WMM_AC */

struct apts_pkt {
	char *name;                     /* name of test */
	int cmd;                        /* msg num */
	int param0;                     /* number of packet exchanges */
	int param1;                     /* number of uplink frames */
	int param2;                     /* number of downlink frames */
	int param3;
};

/* WMM-PS APTS messages */
struct apts_pkt apts_pkts[] = {
	{0, -1, 0, 0, 0, 0},
	{"B.D", B_D, 0, 0, 0, 0},
	{"B.H", B_H, 0, 0, 0, 0},
	{"B.B", B_B, 0, 0, 0, 0},
	{"B.M", B_M, 0, 0, 0, 0},
	{"M.D", M_D, 0, 0, 0, 0},
	{"B.Z", B_Z, 0, 0, 0, 0},
	{"M.Y", M_Y, 0, 0, 0, 0},
	{"L.1", L_1, 0, 0, 0, 0},
	{"A.Y", A_Y, 0, 0, 0, 0},
	{"B.W", B_W, 0, 0, 0, 0},
	{"A.J", A_J, 0, 0, 0, 0},
	{"M.V", M_V, 0, 0, 0, 0},
	{"M.U", M_U, 0, 0, 0, 0},
	{"A.U", A_U, 0, 0, 0, 0},
	{"M.L", M_L, 0, 0, 0, 0},
	{"B.K", B_K, 0, 0, 0, 0},
	{"M.B", M_B, 0, 0, 0, 0},
	{"M.K", M_K, 0, 0, 0, 0},
	{"M.W", M_W, 0, 0, 0, 0},

	{"APTS TX         ", APTS_DEFAULT, 0, 0, 0, 0},
	{"APTS Hello      ", APTS_HELLO, 0, 0, 0, 0},
	{"APTS Broadcast  ", APTS_BCST, 0, 0, 0, 0},
	{"APTS Confirm    ", APTS_CONFIRM, 0, 0, 0, 0},
	{"APTS STOP       ", APTS_STOP, 0, 0, 0, 0},
	{"APTS CK BE      ", APTS_CK_BE, 0, 0, 0, 0},
	{"APTS CK BK      ", APTS_CK_BK, 0, 0, 0, 0},
	{"APTS CK VI      ", APTS_CK_VI, 0, 0, 0, 0},
	{"APTS CK VO      ", APTS_CK_VO, 0, 0, 0, 0},
	{"APTS RESET      ", APTS_RESET, 0, 0, 0, 0},
	{"APTS RESET RESP ", APTS_RESET_RESP, 0, 0, 0, 0},
	{"APTS RESET STOP ", APTS_RESET_STOP, 0, 0, 0, 0},
	{0, 0, 0, 0, 0, 0}		/* APTS_LAST */
};

/* WMM-AC APTS messages */
struct apts_pkt wmm_ac_apts_pkts[] = {
	{0, -1, 0, 0, 0, 0},
	{"B.D", B_D, 0, 0, 0, 0},
	{"B.H", B_H, 0, 0, 0, 0},
	{"B.B", B_B, 0, 0, 0, 0},
	{"B.M", B_M, 0, 0, 0, 0},
	{"M.D", M_D, 0, 0, 0, 0},
	{"B.Z", B_Z, 0, 0, 0, 0},
	{"M.Y", M_Y, 0, 0, 0, 0},
	{"L.1", L_1, 0, 0, 0, 0},
	{"A.Y", A_Y, 0, 0, 0, 0},
	{"B.W", B_W, 0, 0, 0, 0},
	{"A.J", A_J, 0, 0, 0, 0},
	{"M.V", M_V, 0, 0, 0, 0},
	{"M.U", M_U, 0, 0, 0, 0},
	{"A.U", A_U, 0, 0, 0, 0},
	{"M.L", M_L, 0, 0, 0, 0},
	{"B.K", B_K, 0, 0, 0, 0},
	{"M.B", M_B, 0, 0, 0, 0},
	{"M.K", M_K, 0, 0, 0, 0},
	{"M.W", M_W, 0, 0, 0, 0},
#ifdef CONFIG_WFA_WMM_AC
	{"422.T02B", WMMAC_422_T02B, 0, 0, 0, 0},
	{"422.T03A", WMMAC_422_T03A, 0, 0, 0, 0},
	{"422.T04A", WMMAC_422_T04B, 0, 0, 0, 0},
	{"422.T05B", WMMAC_422_T05B, 0, 0, 0, 0},
	{"422.T06B", WMMAC_422_T06B, 0, 0, 0, 0},
	{"422.T07B", WMMAC_422_T07B, 0, 0, 0, 0},
	{"422.T08B", WMMAC_422_T08B, 0, 0, 0, 0},
	{"423.T04", WMMAC_423_T04, 0, 0, 0, 0},
	{"424.T07", WMMAC_424_T07t14, 0, 0, 0, 0},
	{"425.T04", WMMAC_425_T04t06, 0, 0, 0, 0},
	{"521.T03", WMMAC_521_T03, 0, 0, 0, 0},
	{"521.T05", WMMAC_521_T05, 0, 0, 0, 0},
	{"522.T04", WMMAC_522_T04, 0, 0, 0, 0},
	{"522.T06", WMMAC_522_T06, 0, 0, 0, 0},
	{"522.T06o", WMMAC_522_T06o, 0, 0, 0, 0},
	{"524.T03", WMMAC_524_T03, 0, 0, 0, 0},
	{"524.T03i", WMMAC_524_T03i, 0, 0, 0, 0},
	{"525.T07", WMMAC_525_T07t10, 0, 0, 0, 0},
#endif /* CONFIG_WFA_WMM_AC */
	{"APTS TX         ", WMMAC_APTS_DEFAULT, 0, 0, 0, 0},
	{"APTS Hello      ", WMMAC_APTS_HELLO, 0, 0, 0, 0},
	{"APTS Broadcast  ", WMMAC_APTS_BCST, 0, 0, 0, 0},
	{"APTS Confirm    ", WMMAC_APTS_CONFIRM, 0, 0, 0, 0},
	{"APTS STOP       ", WMMAC_APTS_STOP, 0, 0, 0, 0},
	{"APTS CK BE      ", WMMAC_APTS_CK_BE, 0, 0, 0, 0},
	{"APTS CK BK      ", WMMAC_APTS_CK_BK, 0, 0, 0, 0},
	{"APTS CK VI      ", WMMAC_APTS_CK_VI, 0, 0, 0, 0},
	{"APTS CK VO      ", WMMAC_APTS_CK_VO, 0, 0, 0, 0},
	{"APTS RESET      ", WMMAC_APTS_RESET, 0, 0, 0, 0},
	{"APTS RESET RESP ", WMMAC_APTS_RESET_RESP, 0, 0, 0, 0},
	{"APTS RESET STOP ", WMMAC_APTS_RESET_STOP, 0, 0, 0, 0},
	{0, 0, 0, 0, 0, 0}		/* WMMAC_APTS_LAST */
};

/* WMM definitions */
/* Atheros Madwifi use 0x88 for UPSD/Voice */
#define TOS_VO7	    0xE0  /* 111 0  0000 (7)  AC_VO tos/dscp values default */
#define TOS_VO      0xD0  /* AC_VO */
#define TOS_VO6     0xC0  /* 110 0  0000 */
/* console */
#define TOS_VO2     0xB8  /* 101 1  1000 */
/* DUT can set VO */

#define TOS_VI      0xA0  /* 101 0  0000 (5)  AC_VI */
#define TOS_VI4     0x80  /* 100 0  0000 (4)  AC_VI */
/* console */
#define TOS_VI5     0x88  /* 100 0  1000 */

#define TOS_BE      0x00  /* 000 0  0000 (0)  AC_BE */
#define TOS_EE      0x60  /* 011 0  0000 (3)  AC_BE */

#define TOS_BK      0x20  /* 001 0  0000 (1)  AC_BK */
#define TOS_LE      0x40  /* 010 0  0000 (2)  AC_BK */

#define MAX_RETRY 3
#define MAX_HELLO 20
#define MAX_STOP 10
#define LI_INT  2000000

enum uapsd_psave {
	PS_OFF = 0,
	PS_ON = 1
};

typedef int (*uapsd_tx_state_func_ptr)(struct sigma_stream *,
				       u32, enum uapsd_psave, u32);

struct uapsd_tx_state_table {
	uapsd_tx_state_func_ptr state_func;
	u32 usr_priority;
	enum uapsd_psave ps;
	u32 sleep_dur;
};

static int uapsd_tx_start(struct sigma_stream *s,
			  u32 usr_priority, enum uapsd_psave ps,
			  u32 sleep_duration);
static int uapsd_tx_confirm(struct sigma_stream *s,
			    u32 usr_priority, enum uapsd_psave ps,
			    u32 sleep_duration);
static int uapsd_tx_data(struct sigma_stream *s,
			 u32 usr_priority, enum uapsd_psave ps,
			 u32 sleep_duration);
static int uapsd_tx_stop(struct sigma_stream *s,
			 u32 usr_priority, enum uapsd_psave ps,
			 u32 sleep_duration);
static int uapsd_tx_cyclic(struct sigma_stream *s,
			   u32 usr_priority, enum uapsd_psave ps,
			   u32 sleep_duration);
static int uapsd_tx_data_twice(struct sigma_stream *s,
			       u32 usr_priority, enum uapsd_psave ps,
			       u32 sleep_duration);

/* The DUT WMM send table for each of the test cases */
struct uapsd_tx_state_table sta_uapsd_tx_tbl[LAST_TC + 1][11] = {
	/* B.D */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
	 {NULL, 0, 0, 0}},

	/* B.H */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
	 {NULL, 0, 0, 0}},

	/* B.B */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BK, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* B.M */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, 30000000},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* M.D */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* B.Z */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT /2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* M.Y */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* L.1 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_cyclic, TOS_VO7, PS_ON, 20000},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* A.Y */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* B.W */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* A.J */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_OFF, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
	 {NULL, 0, 0, 0}},

	/* M.V */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* M.U */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data_twice, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* A.U */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_OFF, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}},

	/* M.L */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT /2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* B.K */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* M.B */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BK, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* M.K */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* M.W */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

#ifdef CONFIG_WFA_WMM_AC
	/* WMMAC_422_T02B */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_422_T03B or  WMMAC_422_T03A */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 20},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_422_T04B/ATC7 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 20},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_422_T05B/ATC8 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
	 {uapsd_tx_data, TOS_VI, PS_ON, 700000},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_422_T06B/ATC9 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_422_T07B/ATC10 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 4},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_BK, PS_ON, LI_INT / 20},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_422_T08B/ATC11 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 4},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_423_T04 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_424_T07t14 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 20},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 4},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 20},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_425_T04t06 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 20},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_521_T03 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_521_T05 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_522_T04 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_522_T06 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_522_T06o */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_524_T03 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VO7, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_524_T03i */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},

	/* WMMAC_525_T07t10 */
	{{uapsd_tx_start, TOS_BE, PS_OFF, LI_INT / 2},
	 {uapsd_tx_confirm, TOS_BE, PS_ON, LI_INT / 2},
	 {uapsd_tx_data, TOS_VI, PS_ON, LI_INT / 2},
	 {uapsd_tx_stop, TOS_BE, PS_ON, LI_INT / 2},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0},
	 {NULL, 0, 0, 0}, {NULL, 0, 0, 0}, {NULL, 0, 0, 0}},
#endif /* CONFIG_WFA_WMM_AC */
};

typedef int (*uapsd_recv_state_func_ptr)(struct sigma_stream *s,
					 unsigned int *, int);

struct uapsd_rcv_state_table {
	uapsd_recv_state_func_ptr state_func;
};

static int uapsd_rx_start(struct sigma_stream *s,
			  unsigned int *rxpkt, int rxpkt_len);
static int uapsd_rx_data(struct sigma_stream *s,
			 unsigned int *rxpkt, int rxpkt_len);
static int uapsd_rx_stop(struct sigma_stream *s,
			 unsigned int *rxpkt, int rxpkt_len);
static int uapsd_rx_cyclic_vo(struct sigma_stream *s,
			      unsigned int *rxpkt, int rxpkt_len);

/* The DUT WMM send table for each of the test cases */
struct uapsd_rcv_state_table sta_uapsd_recv_tbl[LAST_TC + 10][6] = {
	/* B.D */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL}, {NULL},
	 {NULL}},
	/* B.H */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
	 {NULL}, {NULL}},
	/* B.B */
	{{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
	/* B.M */
	{{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
	/* M.D */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* B.Z */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
	 {NULL}, {NULL}},
	/* M.Y */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_stop}, {NULL}},
	/* L.1 */
	{{uapsd_rx_start}, {uapsd_rx_cyclic_vo}, {NULL}, {NULL}, {NULL},
	 {NULL}},
	/* A.Y */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_stop}, {NULL}},
	/* B.W */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* A.J */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* M.V */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_stop}, {NULL}},
	/* M.U */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* A.U */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_stop}, {NULL}},
	/* M.L */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL}, {NULL},
	 {NULL}},
	/* B.K */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
	 {NULL}, {NULL}},
	/* M.B */
	{{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
	/* M.K */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
	 {NULL}, {NULL}},
	/* M.W */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},

#ifdef CONFIG_WFA_WMM_AC
	/* WMMAC_422_T02B */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* WMMAC_422_T03B or WMMAC_422_T03A */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_stop}, {NULL}},
	/* WMMAC_422_T04B */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* WMMAC_422_T05B */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_stop}, {NULL}},
	/* WMMAC_422_T06B */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* WMMAC_422_T07B */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* WMMAC_422_T08B */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* WMMAC_423_T04 */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL}, {NULL},
	 {NULL}},
	/* WMMAC_424_T07t14 */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
	 {NULL}, {NULL}},
	/* WMMAC_425_T04t06 */
	{{uapsd_rx_start}, {uapsd_rx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},
	/* WMMAC_521_T03 */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
	 {NULL}, {NULL}},
	/* WMMAC_521_T05 */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
	 {NULL}, {NULL}},
	/* WMMAC_522_T04 */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
	 {NULL}, {NULL}},
	/* WMMAC_522_T06 */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* WMMAC_522_T06o */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_data},
	 {uapsd_rx_data}, {uapsd_rx_stop}},
	/* WMMAC_524_T03 */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
	 {NULL}, {NULL}},
	/* WMMAC_524_T03i */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_data}, {uapsd_rx_stop},
	 {NULL}, {NULL}},
	/* WMMAC_525_T07t10 */
	{{uapsd_rx_start}, {uapsd_rx_data}, {uapsd_rx_stop}, {NULL},
	 {NULL}, {NULL}},
#endif /* CONFIG_WFA_WMM_AC */
};

/* U-APSD console data */
#define NETWORK_CLASS_C 0x00ffffff
#define UAPSD_CONSOLE_TIMER 200

typedef int (*uapsd_console_state_func_ptr)(struct sigma_stream *s,
					    unsigned int *rx_msg_buf, int len);
struct uapsd_console_state_table {
	uapsd_console_state_func_ptr state_func;
};

static int console_rx_hello(struct sigma_stream *, unsigned int *, int);
static int console_rx_confirm(struct sigma_stream *, unsigned int *, int);
static int console_rx_confirm_tx_vi(struct sigma_stream *, unsigned int *, int);
static int console_rx_tx_stop(struct sigma_stream *, unsigned int *, int);
static int console_rx_vo_tx_stop(struct sigma_stream *, unsigned int *, int);
static int console_rx_vi_tx_stop(struct sigma_stream *, unsigned int *, int);
static int console_rx_vi_tx_vi(struct sigma_stream *, unsigned int *, int);
static int console_rx_vi_tx_bcst(struct sigma_stream *, unsigned int *, int);
static int console_rx_be_tx_bcst(struct sigma_stream *, unsigned int *, int);
static int console_rx_be_tx_be(struct sigma_stream *, unsigned int *, int);
static int console_rx_be_tx_be_tx_stop(struct sigma_stream *, unsigned int *,
				       int);
static int console_rx_bk_tx_stop(struct sigma_stream *, unsigned int *, int);
static int console_rx_vi_tx_vo_tx_stop(struct sigma_stream *, unsigned int *,
				       int);
static int console_rx_vo_tx_bcst_tx_stop(struct sigma_stream *, unsigned int *,
					 int);
static int console_rx_vi_tx_be(struct sigma_stream *, unsigned int *, int);
static int console_rx_vi_tx_bk(struct sigma_stream *, unsigned int *, int);
static int console_rx_vo_tx_vo_cyclic(struct sigma_stream *, unsigned int *,
				      int);
static int console_rx_vo_tx_vo(struct sigma_stream *, unsigned int *, int);
static int console_rx_vo_tx_vo_tx_stop(struct sigma_stream *, unsigned int *,
				       int);
static int console_rx_vo_tx_2vo(struct sigma_stream *, unsigned int *, int);
static int console_rx_be_tx_bcst_tx_stop(struct sigma_stream *, unsigned int *,
					 int);
static int console_rx_vo(struct sigma_stream *, unsigned int *, int);
static int console_rx_vi(struct sigma_stream *, unsigned int *, int);
static int console_rx_be(struct sigma_stream *, unsigned int *, int);
static int console_rx_vo_tx_all_tx_stop(struct sigma_stream *, unsigned int *,
					int);
static int console_rx_vi_tx_vi_tx_stop(struct sigma_stream *, unsigned int *,
				       int);

/* U-APSD console process table for each of the test cases */
struct uapsd_console_state_table uapsd_console_state_tbl[LAST_TC + 1][10] = {
	/* Ini */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_vo},
	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},

	/* B.D */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_vo},
	 {console_rx_vo_tx_stop}, {console_rx_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}, {NULL}},

	/* B.H */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_2vo},
	 {console_rx_vo_tx_stop}, {console_rx_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}, {NULL}},

	/* B.B */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo},
	 {console_rx_vi}, {console_rx_be}, {console_rx_bk_tx_stop},
	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}},

	/* B.M */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_stop},
	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},

	/* M.D */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_be},
	 {console_rx_vi_tx_bk}, {console_rx_vi_tx_vi},
	 {console_rx_vi_tx_vo_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}},

	/* B.Z */
	{{console_rx_hello}, {console_rx_confirm_tx_vi},
	 {console_rx_vo_tx_bcst_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}, {NULL}},

	/* M.Y */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
	 {console_rx_vo}, {console_rx_be_tx_be},
	 {console_rx_be_tx_bcst_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}},

	/* L.1 */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo_tx_vo_cyclic},
	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},

	/* A.Y */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
	 {console_rx_vo}, {console_rx_be_tx_be}, {console_rx_be},
	 {console_rx_be_tx_bcst_tx_stop}, {console_rx_tx_stop}, {NULL}, {NULL}},

	/* B.W */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_bcst},
	 {console_rx_vi_tx_bcst}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}, {NULL}},

	/* A.J */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo},
	 {console_rx_vo_tx_all_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},

	/* M.V */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
	 {console_rx_be_tx_be}, {console_rx_vi_tx_vi_tx_stop},
	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}, {NULL}},

	/* M.U */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
	 {console_rx_be_tx_be}, {console_rx_vo_tx_vo},
	 {console_rx_vo_tx_vo_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}},

	/* A.U */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
	 {console_rx_be}, {console_rx_be_tx_be}, {console_rx_be},
	 {console_rx_vo_tx_vo}, {console_rx_vo_tx_stop}, {console_rx_tx_stop},
	 {NULL}},

	/* M.L */
	{{console_rx_hello}, {console_rx_confirm},
	 {console_rx_be_tx_be_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}},

	/* B.K */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
	 {console_rx_be_tx_be}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}, {NULL}},

	/* M.B */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vo},
	 {console_rx_vi}, {console_rx_be}, {console_rx_bk_tx_stop},
	 {console_rx_tx_stop}, {NULL}, {NULL}, {NULL}},

	/* M.K */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_vi},
	 {console_rx_be_tx_be}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}, {NULL}},

	/* M.W */
	{{console_rx_hello}, {console_rx_confirm}, {console_rx_vi_tx_bcst},
	 {console_rx_be_tx_bcst}, {console_rx_vi_tx_stop}, {console_rx_tx_stop},
	 {NULL}, {NULL}, {NULL}, {NULL}}
};


static void create_apts_pkt(int msg, unsigned int txbuf[],
			    u32 uapsd_dscp, struct sigma_stream *s)
{
	struct apts_pkt *t;

	if (!sigma_wmm_ac)
		t = &apts_pkts[msg];
	else
		t = &wmm_ac_apts_pkts[msg];

	txbuf[0] = s->rx_cookie;
	txbuf[1] = uapsd_dscp;
	txbuf[2] = 0;
	txbuf[3] = 0;
	txbuf[4] = 0;
	txbuf[5] = 0;
	txbuf[9] = s->sta_id;
	txbuf[10] = t->cmd;
	strcpy((char *) &txbuf[11], t->name);
}


static int uapsd_tx_start(struct sigma_stream *s,
			  u32 usr_priority, enum uapsd_psave ps,
			  u32 sleep_duration)
{
	unsigned int *tpkt;
	int pktlen = 256;
	struct sigma_dut *dut = s->dut;
	u32 msgid;

	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_start");
	tpkt = malloc(s->payload_size);
	if (tpkt == NULL) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd: Send buffer allocation failed");
		return -1;
	}

	/* check whether a test case is received */
	if (s->uapsd_rx_state > 0) {
		s->uapsd_tx_state++;
	} else {
		set_ps(s->ifname, dut, 0);
		if (s->tx_hello_cnt <= MAX_HELLO) {
			memset(tpkt, 0, s->payload_size);
			/* if test is for WMM-AC set APTS HELLO to 39 */
			msgid = sigma_wmm_ac ? WMMAC_APTS_HELLO : APTS_HELLO;
			create_apts_hello_pkt(msgid, tpkt, s->tx_hello_cnt);
			if (send(s->sock, tpkt, pktlen, 0) <= 0) {
				sigma_dut_print(dut, DUT_MSG_ERROR,
						"send_uapsd: Send failed");
			}
			s->tx_hello_cnt++;
			sigma_dut_print(dut, DUT_MSG_INFO,
					"send_uapsd: Hello Sent cnt %d",
					s->tx_hello_cnt);
			sleep(1);
		} else {
			printf("\n send_uapsd: Too many Hellos Sent... \n");
			sigma_dut_print(dut, DUT_MSG_ERROR,
					"send_uapsd: Too many Hellos sent... ");
			s->stop = 1;
		}
	}

	free(tpkt);
	sigma_dut_print(dut, DUT_MSG_INFO,
			"Exit uapsd_tx_start uapsd_sta_tc %d uapsd_tx_state %d",
			s->uapsd_sta_tc, s->uapsd_tx_state);

	return 0;
}


static int uapsd_tx_confirm(struct sigma_stream *s,
			    u32 usr_priority, enum uapsd_psave ps,
			    u32 sleep_duration)
{
	unsigned int *tpkt;
	int pktlen = 256;
	struct sigma_dut *dut = s->dut;
	u32 msgid;

	sigma_dut_print(dut, DUT_MSG_INFO,
			"send_uapsd: Enter uapsd_tx_confirm");
	tpkt = malloc(s->payload_size);
	if (tpkt == NULL) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd: Send buffer allocation failed");
		return -1;
	}

	usleep(sleep_duration);
	set_ps(s->ifname, dut, ps);
	memset(tpkt, 0, s->payload_size);
	/* if test is for WMM-AC set APTS CONFIRM to 41 */
	msgid = sigma_wmm_ac ? WMMAC_APTS_CONFIRM : APTS_CONFIRM;
	create_apts_pkt(msgid, tpkt, usr_priority, s);
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
		   sizeof(usr_priority));
	if (send(s->sock, tpkt, pktlen, 0) > 0) {
		s->uapsd_tx_state++;
	} else {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd: Send failed");
	}
	free(tpkt);
	sigma_dut_print(dut, DUT_MSG_INFO,
			"Exit uapsd_tx_confirm uapsd_sta_tc %d uapsd_tx_state %d",
			s->uapsd_sta_tc, s->uapsd_tx_state);

	return 0;
}


static int uapsd_tx_data(struct sigma_stream *s,
			 u32 usr_priority, enum uapsd_psave ps,
			 u32 sleep_duration)
{
	unsigned int *tpkt;
	int pktlen = 256;
	struct sigma_dut *dut = s->dut;
	u32 msgid;

	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_data");

	tpkt = malloc(s->payload_size);
	if (tpkt == NULL) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd: Send buffer allocation failed");
		return -1;
	}
	usleep(sleep_duration);
	set_ps(s->ifname, dut, ps);
	memset(tpkt, 0, s->payload_size);
	/* if test is for WMM-AC set APTS DEFAULT to 38 */
	msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
	create_apts_pkt(msgid, tpkt, usr_priority, s);
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
		   sizeof(usr_priority));
	if (send(s->sock, tpkt, pktlen, 0) > 0) {
		s->uapsd_tx_state++;
	} else {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd: Send failed");
	}

	free(tpkt);
	sigma_dut_print(dut, DUT_MSG_INFO,
			"Exit uapsd_tx_data uapsd_sta_tc %d uapsd_tx_state %d",
			s->uapsd_sta_tc, s->uapsd_tx_state);

	return 0;
}


static int uapsd_tx_data_twice(struct sigma_stream *s,
			       u32 usr_priority, enum uapsd_psave ps,
			       u32 sleep_duration)
{
	unsigned int *tpkt;
	int pktlen = 256, i = 0, tx_status = 0;
	struct sigma_dut *dut = s->dut;
	u32 msgid;

	sigma_dut_print(dut, DUT_MSG_INFO,
			"send_uapsd: Enter uapsd_tx_data_twice");
	tpkt = malloc(s->payload_size);
	if (tpkt == NULL) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd: Send buffer allocation failed");
		return -1;
	}
	usleep(sleep_duration);
	set_ps(s->ifname, dut, ps);
	memset(tpkt, 0, s->payload_size);
	/* if test is for WMM-AC set APTS DEFAULT to 38 */
	msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
	create_apts_pkt(msgid, tpkt, usr_priority, s);
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
		   sizeof(usr_priority));
	for(i = 0; i < 2; i++) {
		if (send(s->sock, tpkt, pktlen, 0) <= 0) {
			sigma_dut_print(dut, DUT_MSG_ERROR,
					"send_uapsd: Send failed");
			tx_status = -1;
		}
	}
	if (tx_status == 0)
		s->uapsd_tx_state++;
	free(tpkt);
	sigma_dut_print(dut, DUT_MSG_INFO,
			"Exit uapsd_tx_data_twice uapsd_sta_tc %d uapsd_tx_state %d",
			s->uapsd_sta_tc, s->uapsd_tx_state);

	return 0;
}


static int uapsd_tx_cyclic(struct sigma_stream *s,
			   u32 usr_priority, enum uapsd_psave ps,
			   u32 sleep_duration)
{
	unsigned int *tpkt;
	int pktlen = 256, i = 0, tx_status = 0;
	struct sigma_dut *dut = s->dut;
	u32 msgid;

	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_cyclic");
	tpkt = malloc(s->payload_size);
	if (tpkt == NULL) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd: Send buffer allocation failed");
		return -1;
	}

	set_ps(s->ifname, dut, ps);
	for (i = 0; i < 3000; i++) {
		usleep(sleep_duration);
		memset(tpkt, 0, s->payload_size);
		/* if test is for WMM-AC set APTS DEFAULT to 38 */
		msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;
		create_apts_pkt(msgid, tpkt, usr_priority, s);
		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
			   sizeof(usr_priority));
		if (send(s->sock, tpkt, pktlen, 0) <= 0) {
			sigma_dut_print(dut, DUT_MSG_ERROR,
					"send_uapsd: Send failed");
			tx_status = -1;
		}
	}
	if (tx_status == 0)
		s->uapsd_tx_state++;
	free(tpkt);
	sigma_dut_print(dut, DUT_MSG_INFO,
			"Exit uapsd_tx_cyclic uapsd_sta_tc %d uapsd_tx_state %d",
			s->uapsd_sta_tc, s->uapsd_tx_state);

	return 0;
}


static int uapsd_tx_stop(struct sigma_stream *s,
			 u32 usr_priority, enum uapsd_psave ps,
			 u32 sleep_duration)
{
	unsigned int *tpkt;
	int pktlen = 256;
	struct sigma_dut *dut = s->dut;
	u32 msgid;

	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Enter uapsd_tx_stop");
	tpkt = malloc(s->payload_size);
	if (tpkt == NULL) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd: Send buffer allocation failed");
		return -1;
	}
	usleep(sleep_duration);
	if(!s->tx_stop_cnt)
		set_ps(s->ifname, dut, ps);
	s->tx_stop_cnt++;
	memset(tpkt, 0, s->payload_size);
	/* if test is for WMM-AC set APTS STOP to 42 */
	msgid = sigma_wmm_ac ? WMMAC_APTS_STOP : APTS_STOP;
	create_apts_pkt(msgid, tpkt, usr_priority, s);
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &usr_priority,
		   sizeof(usr_priority));
	if (send(s->sock, tpkt, pktlen, 0) <= 0) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd: Send failed");
	}
	pthread_mutex_lock(&s->tx_thr_mutex);
	pthread_cond_signal(&s->tx_thr_cond);
	pthread_mutex_unlock(&s->tx_thr_mutex);
	if (s->tx_stop_cnt > MAX_STOP) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd: Enter TX_STOP Max Stop sent %d",
				s->tx_stop_cnt);
		s->stop = 1;
	}
	free(tpkt);
	sigma_dut_print(dut, DUT_MSG_INFO,
			"Exit uapsd_tx_stop uapsd_sta_tc %d uapsd_tx_state %d",
			s->uapsd_sta_tc, s->uapsd_tx_state);

	return 0;
}


static int uapsd_rx_start(struct sigma_stream *s,
			  unsigned int *rxpkt, int rxpkt_len)
{
	int test_num = 0;
	struct sigma_dut *dut = s->dut;
	int msgid;

	test_num = rxpkt[10];

	sigma_dut_print(dut, DUT_MSG_INFO,
			"receive_uapsd: Enter uapsd_rx_start");
	/* if test is for WMM-AC set LAST_TC to 37 */
	msgid = sigma_wmm_ac ? LAST_TC : M_W;

	if (!((test_num >= B_D) && (test_num <= msgid)))
		return -1;

	/*
	 * Test numbers start from 1. Hence decrement by 1
	 * to match the array index.
	 */
	s->uapsd_sta_tc = (rxpkt[10] - 1);
	s->sta_id = rxpkt[9];
	(s->uapsd_rx_state)++;

	return 0;
}


static int uapsd_rx_data(struct sigma_stream *s,
			 unsigned int *rxpkt, int rxpkt_len)
{
	struct sigma_dut *dut = s->dut;
	u32 msgid;

	sigma_dut_print(dut, DUT_MSG_INFO,
			"receive_uapsd: Enter uapsd_rx_data");
	/* if test is for WMM-AC set APTS DEFAULT to 38 */
	msgid = sigma_wmm_ac ? WMMAC_APTS_DEFAULT : APTS_DEFAULT;

	if ((rxpkt[10] == msgid) &&
	    ((rxpkt[1] == TOS_BE) ||
	     (rxpkt[1] == TOS_BK) ||
	     (rxpkt[1] == TOS_VI) ||
	     (rxpkt[1] == TOS_VO) ||
	     (rxpkt[1] == TOS_VO7) ||
	     (rxpkt[1] == TOS_VO6))) {
		s->rx_cookie = rxpkt[0];
		(s->uapsd_rx_state)++;
		sigma_dut_print(dut, DUT_MSG_INFO,
				"receive_uapsd: Recv in uapsd_rx_data uapsd_rx_state %d",
				s->uapsd_rx_state);
	} else {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"receive_uapsd: BAD Pkt recv in uapsd_rx_data");
		sigma_uapsd_reset(s);
	}

	sigma_dut_print(dut, DUT_MSG_INFO,
			"receive_uapsd: Exit uapsd_rx_data");

	return 0;
}


static int uapsd_rx_stop(struct sigma_stream *s,
			 unsigned int *rxpkt, int rxpkt_len)
{
	struct sigma_dut *dut = s->dut;
	u32 msgid;

	sigma_dut_print(dut, DUT_MSG_INFO,
			"receive_uapsd: Enter uapsd_rx_stop");
	/* if test is for WMM-AC set APTS STOP to 42 */
	msgid = sigma_wmm_ac ? WMMAC_APTS_STOP : APTS_STOP;

	if (rxpkt[10] != msgid) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"receive_uapsd: BAD Pkt recv in uapsd_rx_stop");
	} else {
		sigma_uapsd_stop(s);
	}
	sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Exit uapsd_rx_stop");

	return 0;
}


static int uapsd_rx_cyclic_vo(struct sigma_stream *s,
			      unsigned int *rxpkt, int rxpkt_len)
{
	struct sigma_dut *dut = s->dut;
	u32 msgid, msgid2;

	sigma_dut_print(dut, DUT_MSG_INFO,
			"receive_uapsd: Enter uapsd_rx_cyclic_vo");
	/* if test is for WMM-AC set
	 * APTS STOP to 42 and
	 * APTS DEFAULT to 38 */
	if (!sigma_wmm_ac) {
		msgid = APTS_STOP;
		msgid2 = APTS_DEFAULT;
	} else {
		msgid = WMMAC_APTS_STOP;
		msgid2 = WMMAC_APTS_DEFAULT;
	}

	if (rxpkt[10] != msgid) {
		if ((rxpkt[10] == msgid2) &&
		    ((rxpkt[1] == TOS_VO) ||
		     (rxpkt[1] == TOS_VO7) ||
		     (rxpkt[1] == TOS_VO6))) {
			/* ; 5.7 */
			s->rx_cookie = rxpkt[0];
		} else {
			sigma_dut_print(dut, DUT_MSG_ERROR,
					"receive_uapsd: BAD Pkt recv in uapsd_rx_cyclic_vo");
		}
	} else {
		sigma_uapsd_stop(s);
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"receive_uapsd: Exit uapsd_rx_cyclic_vo");

	return 0;
}


static void create_apts_hello_pkt(int msg, unsigned int *txbuf,
				  int tx_hello_cnt)
{
	struct apts_pkt *t;

	if (!sigma_wmm_ac)
		t = &apts_pkts[msg];
	else
		t = &wmm_ac_apts_pkts[msg];

	txbuf[0] = tx_hello_cnt;
	txbuf[1] = 0;
	txbuf[2] = 0;
	txbuf[3] = 0;
	txbuf[4] = 0;
	txbuf[5] = 0;
	txbuf[6] = t->param0;
	txbuf[7] = t->param1;
	txbuf[8] = t->param2;
	txbuf[9] = t->param3;
	txbuf[10] = t->cmd;
	strcpy((char *) &txbuf[11], t->name);
	printf("create_apts_hello_pkt (%s) %d\n", t->name, t->cmd);
}


static void sigma_uapsd_init(struct sigma_stream *s)
{
	s->uapsd_sta_tc = 0; /* Test Case to execute or row to select */
	/* in a test case row, next column or next state function to execute */
	s->uapsd_rx_state = 0;
	s->uapsd_tx_state = 0;

	s->sta_id = 0;
	s->uapsd_send_thr = 0;

	s->reset_rx = 0;
	s->num_retry = 0;
	s->tx_stop_cnt = 0;
	s->tx_hello_cnt = 0;
}


static void sigma_uapsd_stop(struct sigma_stream *s)
{
	pthread_mutex_lock(&s->tx_thr_mutex);
	pthread_cond_wait(&s->tx_thr_cond, &s->tx_thr_mutex);
	pthread_mutex_unlock(&s->tx_thr_mutex);
	s->stop = 1;
	sleep(1);
}


static void sigma_uapsd_reset(struct sigma_stream *s)
{
	int tos = TOS_BE;
	unsigned int *reset_pkt;
	struct sigma_dut *dut = s->dut;
	u32 msgid;

	s->num_retry++;

	/* if reset is called from U-APSD console set it */
	s->reset = 1;

	reset_pkt = malloc(s->payload_size);
	if (reset_pkt == NULL)
		return;

	if (s->num_retry > MAX_RETRY) {
		/* if test is for WMM-AC set APTS RESET STOP to 49 */
		msgid = sigma_wmm_ac ? WMMAC_APTS_RESET_STOP : APTS_RESET_STOP;
		create_apts_pkt(msgid, reset_pkt, tos, s);
		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
		send(s->sock, reset_pkt, s->payload_size, 0);
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"sigma_uapsd_reset: Too many Reset retries");
		s->stop = 1;
	}

	if (!(s->reset_rx)) {
		/* if test is for WMM-AC set APTS RESET to 47 */
		msgid = sigma_wmm_ac ? WMMAC_APTS_RESET : APTS_RESET;
		create_apts_pkt(msgid, reset_pkt, tos, s);
		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
		send(s->sock, reset_pkt, s->payload_size, 0);
	} else {
		/* if test is for WMM-AC set APTS RESET RESP to 48 */
		msgid = sigma_wmm_ac ? WMMAC_APTS_RESET_RESP : APTS_RESET_RESP;
		create_apts_pkt(msgid, reset_pkt, tos, s);
		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
		send(s->sock, reset_pkt, s->payload_size, 0);
		s->reset_rx = 0;
	}
	free(reset_pkt);
}


static void * send_uapsd(void *data)
{
	struct sigma_stream *s = data;
	struct sigma_dut *dut = s->dut;
	uapsd_tx_state_func_ptr tx_state_func;
	u32 usr_priority, sleep_duration;
	enum uapsd_psave ps;

	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Uapsd TX Start");

	s->payload_size = 512;

	while (!s->stop) {
		sigma_dut_print(dut, DUT_MSG_INFO,
				"send_uapsd: running  while uapsd_rx_state %d",
				s->uapsd_rx_state);

		tx_state_func = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
			[s->uapsd_tx_state].state_func;
		usr_priority = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
			[s->uapsd_tx_state].usr_priority;
		sleep_duration = sta_uapsd_tx_tbl[s->uapsd_sta_tc]
			[s->uapsd_tx_state].sleep_dur;
		ps = sta_uapsd_tx_tbl[s->uapsd_sta_tc][s->uapsd_tx_state].ps;

		sigma_dut_print(dut, DUT_MSG_INFO,
				"send_uapsd: uapsd_sta_tc %d uapsd_tx_state %d",
				s->uapsd_sta_tc, s->uapsd_tx_state);
		if (tx_state_func) {
			tx_state_func(s, usr_priority, ps, sleep_duration);
		} else {
			sigma_dut_print(dut, DUT_MSG_INFO,
					"send_uapsd: Null Function Detected for TC : %d in uapsd_tx_state : %d",
					s->uapsd_sta_tc, s->uapsd_tx_state);
		}
	}

	sigma_dut_print(dut, DUT_MSG_INFO, "send_uapsd: Uapsd TX End");
	pthread_join(s->uapsd_send_thr, NULL);

	return NULL;
}


void receive_uapsd(struct sigma_stream *s)
{
	struct timeval tv;
	fd_set rfds;
	int res = 0, ret = 0, rxpkt_len = 0;
	unsigned int *rxpkt;
	uapsd_recv_state_func_ptr recv_state_func;
	struct sigma_dut *dut = s->dut;
	u32 msgid;

	sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Uapsd RX Start");
	sigma_uapsd_init(s);

	ret = pthread_mutex_init(&s->tx_thr_mutex, NULL);
	if (ret != 0) {
		sigma_dut_print(dut, DUT_MSG_INFO,
				"receive_uapsd: pthread_mutex_init failed");
		return;
	}

	ret = pthread_cond_init(&s->tx_thr_cond, NULL);
	if (ret != 0) {
		sigma_dut_print(dut, DUT_MSG_INFO,
				"receive_uapsd: pthread_cond_init failed");
		pthread_mutex_destroy(&s->tx_thr_mutex);
		return;
	}

	if (pthread_create(&s->uapsd_send_thr, NULL, send_uapsd, s)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"receive_uapsd: send_uapsd tx thread creation failed");
		pthread_cond_destroy(&s->tx_thr_cond);
		pthread_mutex_destroy(&s->tx_thr_mutex);
		return;
	}

	s->payload_size = 512;
	rxpkt = malloc(s->payload_size);
	if (rxpkt == NULL) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"receive_uapsd: Receive buffer allocation failed");
		s->stop = 1;
	}

	while (!s->stop) {
		FD_ZERO(&rfds);
		FD_SET(s->sock, &rfds);
		tv.tv_sec = 0;
		tv.tv_usec = 100000;
		res = select(s->sock + 1, &rfds, NULL, NULL, &tv);
		if (res < 0) {
			perror("select");
			usleep(10000);
			continue;
		}

		if (!FD_ISSET(s->sock, &rfds))
			continue;

		memset(rxpkt, 0, s->payload_size);
		rxpkt_len = recv(s->sock, rxpkt, s->payload_size, 0);
		sigma_dut_print(dut, DUT_MSG_INFO,
				"receive_uapsd: running res %d cookie %d dscp %d apts-pkt %d sta-id %d",
				res, rxpkt[0], rxpkt[1], rxpkt[10],
				rxpkt[9]);

		if (rxpkt_len > 0) {
			s->rx_frames++;
			s->rx_payload_bytes += res;

			/* if test is for WMM-AC set APTS RESET to 47 */
			msgid = sigma_wmm_ac ? WMMAC_APTS_RESET : APTS_RESET;
			if (msgid == rxpkt[10]) {
				sigma_dut_print(dut, DUT_MSG_ERROR,
						"receive_uapsd: RESET Pkt recv");
				s->reset_rx = 1;
				sigma_uapsd_reset(s);
				continue;
			}

			recv_state_func = sta_uapsd_recv_tbl[s->uapsd_sta_tc]
				[s->uapsd_rx_state].state_func;
			sigma_dut_print(dut, DUT_MSG_INFO,
					"receive_uapsd: running s->uapsd_sta_tc %d uapsd_rx_state %d",
					s->uapsd_sta_tc, s->uapsd_rx_state);
			if (recv_state_func) {
				recv_state_func(s, rxpkt, rxpkt_len);
			} else {
				sigma_dut_print(dut, DUT_MSG_INFO,
						"receive_uapsd: Null Function Detected for TC : %d in uapsd_rx_state : %d",
						s->uapsd_sta_tc,
						s->uapsd_rx_state);
			}
		} else if (res < 0) {
			perror("recv");
			break;
		}
	}

	if (rxpkt)
		free(rxpkt);
	sigma_dut_print(dut, DUT_MSG_INFO, "receive_uapsd: Uapsd RX End");
	if (s->sock >= 0) {
		pthread_join(s->thr, NULL);
		close(s->sock);
		s->sock = -1;
	}
	pthread_cond_destroy(&s->tx_thr_cond);
	pthread_mutex_destroy(&s->tx_thr_mutex);
}


/* U-APSD apts console code implementation */
static int packet_expected(struct sigma_stream *s, unsigned int *rpkt,
			   unsigned int type, u32 tos)
{
	u8 type_ok = 0;
	u8 tos_ok = 0;
	int res = 0;
	struct sigma_dut *dut = s->dut;

	type_ok = (rpkt[10] == type) ? 1 : 0;

	switch (tos) {
	case TOS_VO7:
	case TOS_VO:
	case TOS_VO6:
	case TOS_VO2:
		if (rpkt[1] == TOS_VO7 || rpkt[1] == TOS_VO ||
		    rpkt[1] == TOS_VO6 || rpkt[1] == TOS_VO2)
			tos_ok = 1;
		break;
	case TOS_VI:
	case TOS_VI4:
	case TOS_VI5:
		if (rpkt[1] == TOS_VI || rpkt[1] == TOS_VI4 ||
		    rpkt[1] == TOS_VI5)
			tos_ok = 1;
		break;
	case TOS_BE:
	case TOS_EE:
		if (rpkt[1] == TOS_BE || rpkt[1] == TOS_EE)
			tos_ok = 1;
		break;
	case TOS_BK:
	case TOS_LE:
		if (rpkt[1] == TOS_BK || rpkt[1] == TOS_LE)
			tos_ok = 1;
		break;
	default:
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"packet_expected: recv not known tos=0x%x",
				tos);
		break;
	}

	res = type_ok && tos_ok;
	if (!res) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"packet_expected: No match: received pkt_type %u expected type %u, received dscp 0x%x expected dscp 0x%x",
				rpkt[10], type, rpkt[1], tos);
	}

	return res;
}


static int console_send(struct sigma_stream *s, u32 pkt_type, u32 tos)
{
	u32 *tpkt;
	int res = 0;
	struct sigma_dut *dut = s->dut;

	tpkt = malloc(s->payload_size);
	if (tpkt == NULL) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_send: Send buffer allocation failed");
		return 0;
	}
	memset(tpkt, 0, s->payload_size);
	create_apts_pkt(pkt_type, tpkt, tos, s);
	if (pkt_type == APTS_DEFAULT || pkt_type == APTS_STOP)
		tpkt[0] = ++(s->rx_cookie);
	tpkt[1] = tos;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, tpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_send: Sent packet return %d Type %d Tos %d",
			res, tpkt[10], tpkt[1]);
	free(tpkt);

	return 0;
}


static int console_rx_hello(struct sigma_stream *s, unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;

	if (!packet_expected(s, rpkt, APTS_HELLO, TOS_BE)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_hello: Hello not Recv or Bad TOS");
		return 0;
	}

	s->rx_cookie = 0;
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_hello: Recv Hello, Sent Test Case");
	console_send(s, s->uapsd_sta_tc, TOS_BE);

	return 0;
}


static int console_rx_confirm(struct sigma_stream *s, unsigned int *rpkt,
			      int len)
{
	struct sigma_dut *dut = s->dut;

	if (!packet_expected(s, rpkt, APTS_CONFIRM, TOS_BE)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_confirm: Confirm not Recv or Bad TOS");
		return 0;
	}

	s->rx_cookie = 0;
	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_confirm: Recv Confirm");

	return 0;
}


static int console_rx_confirm_tx_vi(struct sigma_stream *s, unsigned int *rpkt,
				    int len)
{
	struct sigma_dut *dut = s->dut;

	if (!packet_expected(s, rpkt, APTS_CONFIRM, TOS_BE)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_confirm_tx_vi: Confirm not Recv or Bad TOS");
		return 0;
	}

	s->rx_cookie = 0;
	console_send(s, APTS_DEFAULT, TOS_VI);
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_confirm_tx_vi: Recv Confirm, Sent VI");

	return 0;

}


static int console_rx_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
			      int len)
{
	struct sigma_dut *dut = s->dut;

	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_tx_stop: Send stop to STA again quit %d stop %d",
			s->can_quit, s->stop);

	console_send(s, APTS_STOP, TOS_BE);

	if (packet_expected(s, rpkt, APTS_STOP, TOS_BE)) {
		if (s->can_quit) {
			s->stop = 1;
			sigma_dut_print(dut, DUT_MSG_INFO,
					"console_rx_tx_stop: Send stop to STA again quit %d stop %d",
					s->can_quit, s->stop);
		} else {
			s->can_quit = 1;
		}
	} else {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_tx_stop: STOP not Recv or Bad TOS");
	}

	return 0;
}


static int console_rx_vo_tx_vo(struct sigma_stream *s, unsigned int *rpkt,
			       int len)
{
	struct sigma_dut *dut = s->dut;
	unsigned int tos = TOS_VO7;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vo_tx_vo: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	rpkt[1] = TOS_VO;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vo_tx_vo: Recv VO, Sent VO");

	return 0;
}


static int console_rx_vo_tx_vo_tx_stop(struct sigma_stream *s,
				       unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;
	unsigned int tos = TOS_VO7;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vo_tx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	rpkt[1] = TOS_VO;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vo_tx_vo_tx_stop: Recv VO, Sent VO");
		usleep(500000);
		console_send(s, APTS_STOP, TOS_BE);

	return 0;
}


static int console_rx_vo_tx_all_tx_stop(struct sigma_stream *s,
					unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_VO7;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vo_tx_all_tx_stop: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	rpkt[1] = TOS_VO;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vo_tx_all_tx_stop: Recv VO, Sent VO");
	rpkt[0] = ++(s->rx_cookie);
	tos = TOS_VI;
	rpkt[1] = tos;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vo_tx_all_tx_stop: Sent VI");
	rpkt[0] = ++(s->rx_cookie);
	tos = TOS_BE;
	rpkt[1] = tos;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vo_tx_all_tx_stop: Sent BE");
	rpkt[0] = ++(s->rx_cookie);
	tos = TOS_BK;
	rpkt[1] = tos;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vo_tx_all_tx_stop: Sent BK");
	usleep(500000);
	console_send(s, APTS_STOP, TOS_BE);

	return 0;
}


static int console_rx_be_tx_be(struct  sigma_stream *s, unsigned int *rpkt,
			       int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_BE;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_be_tx_be: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_be_tx_be: Recv BE, Sent BE");

	return 0;
}


static int console_rx_be_tx_be_tx_stop(struct sigma_stream *s,
				       unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_BE;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_be_tx_be_tx_stop: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_be_tx_be_tx_stop: Recv BE, Sent BE");
	console_send(s, APTS_STOP, TOS_BE);

	return 0;
}


static int console_rx_vi_tx_be(struct sigma_stream *s, unsigned int *rpkt,
			       int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_BE;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vi_tx_be: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	rpkt[1] = tos;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vi_tx_be: Recv VI, Sent BE");

	return 0;
}


static int console_rx_vi_tx_bk(struct sigma_stream *s, unsigned int *rpkt,
			       int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_BK;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vi_tx_bk: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	rpkt[1] = tos;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vi_tx_bk: Recv VI, Sent BK");

	return 0;
}


static int console_rx_vo_tx_bcst_tx_stop(struct sigma_stream *s,
					 unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_BE;
	int res;
	int broadcast = 1;
	struct sockaddr_in bcst_addr;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vo_tx_bcst_tx_stop: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
	bcst_addr.sin_family = AF_INET;
	bcst_addr.sin_port = htons(s->dst_port);
	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));

	usleep(300000);
	rpkt[0] = ++(s->rx_cookie);
	rpkt[1] = tos;
	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
		   sizeof(broadcast));
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vo_tx_bcst_tx_stop: Recv VO, Sent Broadcast res = %d",
			res);
	console_send(s, APTS_STOP, TOS_BE);

	return 0;
}


static int console_rx_vi_tx_bcst(struct sigma_stream *s, unsigned int *rpkt,
				 int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_VI;
	int res;
	int broadcast = 1;
	struct sockaddr_in bcst_addr;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vi_tx_bcst: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
	bcst_addr.sin_family = AF_INET;
	bcst_addr.sin_port = htons(s->dst_port);
	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));

	rpkt[0] = ++(s->rx_cookie);
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	tos = TOS_BE;
	rpkt[0] = ++(s->rx_cookie);
	rpkt[1] = tos;
	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
		   sizeof(broadcast));
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vi_tx_bcst: Recv/Sent VI, Sent Broadcast res = %d",
			res);
	s->uapsd_rx_state++;

	return 0;
}


static int console_rx_be_tx_bcst(struct sigma_stream *s, unsigned int *rpkt,
				 int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_BE;
	int res;
	int broadcast = 1;
	struct sockaddr_in bcst_addr;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_be_tx_bcst: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
	bcst_addr.sin_family = AF_INET;
	bcst_addr.sin_port = htons(s->dst_port);
	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));

	rpkt[0] = ++(s->rx_cookie);
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	rpkt[0] = ++(s->rx_cookie);
	rpkt[1] = tos;
	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
		   sizeof(broadcast));
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_be_tx_bcst: Recv/Sent BE, Sent Broadcast res = %d",
			res);
	s->uapsd_rx_state++;

	return 0;
}


static int console_rx_be_tx_bcst_tx_stop(struct sigma_stream *s,
					 unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_BE;
	int res;
	int broadcast = 1;
	struct sockaddr_in bcst_addr;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_be_tx_bcst_tx_stop: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	memset(&bcst_addr, 0, sizeof(struct sockaddr_in));
	bcst_addr.sin_family = AF_INET;
	bcst_addr.sin_port = htons(s->dst_port);
	bcst_addr.sin_addr.s_addr = (s->dst.s_addr | ~(NETWORK_CLASS_C));

	rpkt[0] = ++(s->rx_cookie);
	setsockopt(s->sock, SOL_SOCKET, SO_BROADCAST, &broadcast,
		   sizeof(broadcast));
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = sendto(s->sock, rpkt, s->payload_size / 2, 0,
		     (struct sockaddr *) &bcst_addr, sizeof(bcst_addr));
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_be_tx_bcst_tx_stop: Recv BE, Sent Broadcast res = %d",
			res);
	console_send(s, APTS_STOP, TOS_BE);

	return 0;
}


static int console_rx_vi_tx_vi(struct sigma_stream *s, unsigned int *rpkt,
			       int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_VI;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vi_tx_vi: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vi_tx_vi: Recv VI, Sent VI");

	return 0;
}


static int console_rx_vi_tx_vi_tx_stop(struct sigma_stream *s,
				       unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_VI;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vi_tx_vi_tx_stop: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vi_tx_vi_tx_stop: Recv VI, Sent VI");
	console_send(s, APTS_STOP, TOS_BE);

	return 0;
}


static int console_rx_vi_tx_vo_tx_stop(struct sigma_stream *s,
				       unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_VO7;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vi_tx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	rpkt[1] = TOS_VO;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vi_tx_vo_tx_stop: Recv VI, Sent VO");
	console_send(s, APTS_STOP, TOS_BE);

	return 0;
}


static int console_rx_vo_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
				 int len)
{
	struct sigma_dut *dut = s->dut;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vo_tx_stop: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vo_tx_stop: Recv VO");
	sleep(1);
	console_send(s, APTS_STOP, TOS_BE);

	return 0;
}


static int console_rx_vi_tx_stop(struct sigma_stream *s, unsigned int *rpkt,
				 int len)
{
	struct sigma_dut *dut = s->dut;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vi_tx_stop: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vi_tx_stop: Recv VI");
	console_send(s, APTS_STOP, TOS_BE);

	return 0;
}


static int console_rx_bk_tx_stop(struct  sigma_stream *s, unsigned int *rpkt,
				 int len)
{
	struct sigma_dut *dut = s->dut;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BK)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_bk_tx_stop: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_bk_tx_stop: Recv BK");
	console_send(s, APTS_STOP, TOS_BE);

	return 0;
}


static int console_rx_vo_tx_2vo(struct sigma_stream *s, unsigned int *rpkt,
				int len)
{
	struct sigma_dut *dut = s->dut;
	u32 tos = TOS_VO7;
	int res;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vo_tx_2vo: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	rpkt[0] = ++(s->rx_cookie);
	rpkt[1] = TOS_VO;
	setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	rpkt[0] = ++(s->rx_cookie);
	res = send(s->sock, rpkt, s->payload_size / 2, 0);
	if (res >= 0) {
		s->tx_frames++;
		s->tx_payload_bytes += res;
	}
	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO,
			"console_rx_vo_tx_2vo: Recv VO, Sent 2 VO");

	return 0;
}


static int console_rx_be(struct sigma_stream *s, unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_BE)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_be: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_be: Recv BE");

	return 0;
}


static int console_rx_vi(struct sigma_stream *s, unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VI)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vi: Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vi: Recv VI");

	return 0;
}


static int console_rx_vo(struct sigma_stream *s, unsigned int *rpkt, int len)
{
	struct sigma_dut *dut = s->dut;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"console_rx_vo : Expected Pkt not Recv or Bad TOS");
		return 0;
	}

	s->uapsd_rx_state++;
	sigma_dut_print(dut, DUT_MSG_INFO, "console_rx_vo: Recv VO");

	return 0;

}


static int console_rx_vo_tx_vo_cyclic(struct sigma_stream *s,
				      unsigned int *rpkt, int len)
{
	int res = 0;
	unsigned int tos = 0;
	unsigned int *tpkt;
	struct sigma_dut *dut = s->dut;

	tpkt = malloc(s->payload_size);
	if (tpkt == NULL)
		return -1;

	if (!packet_expected(s, rpkt, APTS_DEFAULT, TOS_VO)) {
		if (rpkt[10] != APTS_STOP)
			sigma_uapsd_reset(s);

		if (!packet_expected(s, rpkt, APTS_STOP, TOS_BE)) {
			sigma_dut_print(dut, DUT_MSG_ERROR,
					"console_rx_vo_tx_vo_cyclic: Expected STOP Pkt not Recv or Bad TOS");
			free(tpkt);
			return 0;
		}

		memset(tpkt, 0, s->payload_size);
		tpkt[0] = s->rx_cookie;
		tos = TOS_BE;
		setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
		create_apts_pkt(APTS_STOP, tpkt, tos, s);
		tpkt[1] = tos;
		if (s->can_quit) {
			const char *stop_cmd = "APTSL1 STOP";
			size_t stop_cmd_len = strlen(stop_cmd);

			if (s->payload_size > 11 * sizeof(int) + stop_cmd_len)
				memcpy(&tpkt[11], stop_cmd, stop_cmd_len + 1);
			res = send(s->sock, tpkt, s->payload_size / 2, 0);
			if (res >= 0) {
				s->tx_frames++;
				s->tx_payload_bytes += res;
			}
			sigma_dut_print(dut, DUT_MSG_INFO,
					"console_rx_vo_tx_vo_cyclic: Sent STOP");
			sleep(5);
			s->stop = 1;
		} else {
			res = send(s->sock, tpkt, s->payload_size / 2, 0);
			if (res >= 0) {
				s->tx_frames++;
				s->tx_payload_bytes += res;
			}
			s->can_quit = 1;
		}
	} else {
		sigma_dut_print(dut, DUT_MSG_INFO,
				"console_rx_vo_tx_vo_cyclic: Recv Pkt: %d Cookie: %d Sta-id %d",
				rpkt[0], s->rx_cookie, s->sta_id);
		rpkt[0] = ++(s->rx_cookie);
		tos = TOS_VO7;
		rpkt[1] = TOS_VO;
		res = setsockopt(s->sock, IPPROTO_IP, IP_TOS, &tos,
				 sizeof(tos));
		res = send(s->sock, rpkt, s->payload_size / 2, 0);
		if (res >= 0) {
			s->tx_frames++;
			s->tx_payload_bytes += res;
		}

		if (s->rx_cookie >= 3000) {
			/* No state change for L.1 */
		}
	}

	free(tpkt);

	return 0;
}


static struct apts_pkt * apts_lookup(const char *s)
{
	struct apts_pkt *t;

	for (t = &apts_pkts[1]; s && t->cmd; t++) {
		if (strcmp(s, "L.1AP") == 0)
			s = "L.1";
		if (t->name && strcmp(t->name, s) == 0)
			return t;
	}

	return NULL;
}


void send_uapsd_console(struct sigma_stream *s)
{
	struct timeval tv;
	fd_set rfds;
	int res;
	unsigned int *rpkt;
	uapsd_console_state_func_ptr console_state_func;
	struct apts_pkt *testcase;
	struct sigma_dut *dut = s->dut;
	/* start timer for self exit */
	int uapsd_timer = UAPSD_CONSOLE_TIMER;

	s->can_quit = 0;
	s->reset = 0;
	s->reset_rx = 0;
	s->uapsd_sta_tc = 0;

	testcase = apts_lookup(s->test_name);
	if (testcase == NULL) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd_console: no testcase found");
		return;
	}

	/* send test case number to be executed */
	s->uapsd_sta_tc = testcase->cmd;
	if (s->uapsd_sta_tc < B_D || s->uapsd_sta_tc > LAST_TC) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd_console: Test Case: %s Unknown",
				s->test_name);
		return;
	}

	s->payload_size = 512;
	rpkt = malloc(s->payload_size);
	if (rpkt == NULL) {
		sigma_dut_print(dut, DUT_MSG_ERROR,
				"send_uapsd_console: buffer allocation failed");
		return;
	}

	sigma_dut_print(dut, DUT_MSG_INFO,
			"send_uapsd_console: Uapsd Console Start");

	while (!s->stop) {
		uapsd_timer--;
		FD_ZERO(&rfds);
		FD_SET(s->sock, &rfds);
		tv.tv_sec = 0;
		tv.tv_usec = 300000;
		res = select(s->sock + 1, &rfds, NULL, NULL, &tv);
		if (res < 0) {
			perror("select");
			usleep(10000);
		} else if (FD_ISSET(s->sock, &rfds)) {
			memset(rpkt, 0, s->payload_size);
			res = recv(s->sock, rpkt, s->payload_size, 0);
			if (res < 0) {
				perror("recv");
				break;
			}

			sigma_dut_print(dut, DUT_MSG_INFO,
					"send_uapsd_console: running res %d cookie %d dscp %d apts-pkt %d sta-id %d",
					res, rpkt[0], rpkt[1], rpkt[10],
					rpkt[9]);
			if (res == 0)
				continue;

			s->rx_frames++;
			s->rx_payload_bytes += res;
			/*
			 * Reset the timer as packet is received
			 * within steps.
			 */
			uapsd_timer = UAPSD_CONSOLE_TIMER;

			if (rpkt[10] == APTS_HELLO) {
				if (s->reset)
					s->reset = 0;
				s->rx_cookie = 0;
				/* assign a unique id to this sta */
				s->sta_id = s->stream_id;
				/* uapsd console process table state */
				s->uapsd_rx_state = 0;
				s->can_quit = 1;
			} else {
				if (s->reset)
					continue;
			}

			if (rpkt[10] == APTS_RESET) {
				sigma_dut_print(dut, DUT_MSG_ERROR,
						"send_uapsd_console: RESET Pkt recv");
				s->reset_rx = 1;
				sigma_uapsd_reset(s);
			}

			if (rpkt[10] == APTS_RESET_STOP) {
				sigma_dut_print(dut, DUT_MSG_ERROR,
						"send_uapsd_console: RESET STOP Pkt recv");
				s->stop = 1;
			}

			if (rpkt[10] == APTS_BCST) {
				sigma_dut_print(dut, DUT_MSG_INFO,
						"send_uapsd_console: Broadcast Pkt recv");
				continue;
			}

			console_state_func =
				uapsd_console_state_tbl[s->uapsd_sta_tc]
				[s->uapsd_rx_state].state_func;
			if (console_state_func) {
				console_state_func(s, rpkt, res);
			} else {
				sigma_dut_print(dut, DUT_MSG_INFO,
						"send_uapsd_console: Null function detected for TC: %d in uapsd_rx_state: %d",
						s->uapsd_sta_tc,
						s->uapsd_rx_state);
			}
		}

		/* Stop the thread. No transactions for the set time */
		if (uapsd_timer == 0) {
			sigma_dut_print(dut, DUT_MSG_INFO,
					"send_uapsd_console: Timer Expired");
			s->stop = 1;
		}
	}

	free(rpkt);
	sigma_dut_print(dut, DUT_MSG_INFO,
			"send_uapsd_console: Uapsd Console End");
}
