/*
 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * 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.
 */

/*
 * This file was originally distributed by Qualcomm Atheros, Inc.
 * under proprietary terms before Copyright ownership was assigned
 * to the Linux Foundation.
 */

 /*
 * \file dot11f.c
 *
 * \brief Structures, functions & definitions for
 * working with 802.11 Frames
 *
 *
 * This file was automatically generated by 'framesc'
 * Wed Oct 14 10:14:42 2015 from the following file(s):
 *
 * dot11f.frms
 *
 * PLEASE DON'T EDIT THIS FILE BY HAND!
 *
 */

#if !defined  ANI_OS_TYPE_OSX && !defined ANI_OS_TYPE_LINUX && !defined ANI_OS_TYPE_ANDROID
#include <memory.h> /* For memcpy */
#include <stdio.h>  /* For _vsnprintf */
#include <stddef.h> /* For offsetof */
#endif

#include <ani_global.h>
#include <utils_api.h>
#include "dot11fdefs.h"
#include "dot11f.h"

#if defined(_MSC_VER)
#pragma warning (disable:4244)
#pragma warning (disable:4505)
#pragma warning (disable:4702)
#pragma warning (disable:4996)/* ... was declared deprecated */
#endif /* Microsoft C/C++ */

typedef unsigned char tFRAMES_BOOL;
typedef void (*pfnGeneric_t)(void);

typedef struct sFFDefn {
	const char  *name;
	uint32_t offset;
	uint16_t sig;
	uint8_t  size;
} tFFDefn;

typedef struct sIEDefn {
	uint32_t  offset;
	uint32_t  presenceOffset;
	uint32_t  countOffset;
	const char   *name;
	uint16_t  arraybound;
	uint16_t  minSize;
	uint16_t  maxSize;
	uint16_t  sig;
	unsigned char oui[5];
	unsigned char noui;
	uint8_t   eid;
	tFRAMES_BOOL  fMandatory;
} tIEDefn;

#if !defined(countof)
#define countof(x) (sizeof((x)) / sizeof((x)[0]))
#endif

#if !defined(DOT11F_MEMCPY)
#define DOT11F_MEMCPY(ctx, dst, src, len) \
	memcpy((dst), (src), (len))
#endif

#if !defined(DOT11F_MEMCMP)
#define DOT11F_MEMCMP(ctx, lhs, rhs, len) \
	memcmp((lhs), (rhs), (len))
#endif

#ifndef DOT11F_HAVE_LOG_SEVERITIES
#define FRLOG_OFF (0)
#define FRLOGP    (1)
#define FRLOGE    (2)
#define FRLOGW    (3)
#define FRLOG1    (4)
#define FRLOG2    (5)
#define FRLOG3    (6)
#define FRLOG4    (7)
#endif

#define FRFL(x) x

#define FRAMES_LOG0(ctx, sev, fmt)
#define FRAMES_LOG1(ctx, sev, fmt, p1)
#define FRAMES_LOG2(ctx, sev, fmt, p1, p2)
#define FRAMES_LOG3(ctx, sev, fmt, p1, p2, p3)
#define FRAMES_DUMP(ctx, sev, p, n)
#ifndef FRAMES_SEV_FOR_FRAME
#define FRAMES_SEV_FOR_FRAME(ctx, sig) FRLOG3
#endif

#if defined(DOT11F_ENABLE_DBG_BREAK) && defined (WIN32)
#define FRAMES_DBG_BREAK() { _asm int 3 }
#else
#define FRAMES_DBG_BREAK()
#endif

#if !defined(DOT11F_PARAMETER_CHECK)
#if defined (DOT11F_HAVE_WIN32_API)

#define DOT11F_PARAMETER_CHECK(pBuf, nBuf, pFrm, nFrm) \
	if (!pBuf || IsBadReadPtr(pBuf, nBuf))\
		return DOT11F_BAD_INPUT_BUFFER; \
	if (!pFrm || IsBadWritePtr(pFrm, nFrm))\
		return DOT11F_BAD_OUTPUT_BUFFER \

#define DOT11F_PARAMETER_CHECK2(pSrc, pBuf, nBuf, pnConsumed) \
	if (!pSrc || IsBadReadPtr(pSrc, 4))\
		eturn DOT11F_BAD_INPUT_BUFFER; \
	if (!pBuf || IsBadWritePtr(pBuf, nBuf))\
		return DOT11F_BAD_OUTPUT_BUFFER; \
	if (!nBuf)\
		return DOT11F_BAD_OUTPUT_BUFFER; \
	if (IsBadWritePtr(pnConsumed, 4))\
		return DOT11F_BAD_OUTPUT_BUFFER \

#else

#define DOT11F_PARAMETER_CHECK(pBuf, nBuf, pFrm, nFrm) \
	if (!pBuf)\
		return DOT11F_BAD_INPUT_BUFFER; \
	if (!pFrm)\
		return DOT11F_BAD_OUTPUT_BUFFER \

#define DOT11F_PARAMETER_CHECK2(pSrc, pBuf, nBuf, pnConsumed) \
	if (!pSrc)\
		return DOT11F_BAD_INPUT_BUFFER; \
	if (!pBuf)\
		return DOT11F_BAD_OUTPUT_BUFFER; \
	if (!nBuf)\
		return DOT11F_BAD_OUTPUT_BUFFER; \
	if (!pnConsumed)\
		return DOT11F_BAD_OUTPUT_BUFFER \

#endif
#endif

static void framesntohs(tpAniSirGlobal    pCtx,
			uint16_t *pOut,
			uint8_t  *pIn,
			tFRAMES_BOOL  fMsb)
{
	(void)pCtx;
#if defined (DOT11F_LITTLE_ENDIAN_HOST)
	if (!fMsb)
		DOT11F_MEMCPY(pCtx, (uint16_t *)pOut, pIn, 2);
	else
		*pOut = (uint16_t)(*pIn << 8) | *(pIn + 1);
#else
	if (!fMsb)
		*pOut = (uint16_t)(*pIn | (*(pIn + 1) << 8));
	else
		DOT11F_MEMCPY(pCtx, (uint16_t *)pOut, pIn, 2);
#endif
}

static void framesntohl(tpAniSirGlobal    pCtx,
			uint32_t *pOut,
			uint8_t  *pIn,
			tFRAMES_BOOL  fMsb)
{
	(void)pCtx;
#if defined (DOT11F_LITTLE_ENDIAN_HOST)
	if (!fMsb)
		DOT11F_MEMCPY(pCtx, (uint32_t *)pOut, pIn, 4);
	else
		*pOut = (uint32_t)(*pIn << 24) |
			(*(pIn + 1) << 16) |
			(*(pIn + 2) <<  8) |
			(*(pIn + 3));
#else
	if (!fMsb)
		*pOut = (uint32_t)(*(pIn + 3) << 24) |
			(*(pIn + 2) << 16) |
			(*(pIn + 1) <<  8) |
			(*(pIn));
else
		*pOut = *(uint32_t *)pIn;
#endif
}

static void framesntohq(tpAniSirGlobal    pCtx,
			tDOT11F_U64 *pOut,
			uint8_t  *pIn,
			tFRAMES_BOOL  fMsb)
{
#if defined (DOT11F_LITTLE_ENDIAN_HOST)
	framesntohl(pCtx, &((*pOut)[0]), pIn, fMsb);
	framesntohl(pCtx, &((*pOut)[1]), pIn + 4, fMsb);
#else
	framesntohl(pCtx, &((*pOut)[1]), pIn, fMsb);
	framesntohl(pCtx, &((*pOut)[0]), pIn + 4, fMsb);
#endif
}

static void frameshtons(tpAniSirGlobal    pCtx,
			uint8_t  *pOut,
			uint16_t  pIn,
			tFRAMES_BOOL  fMsb)
{
	(void)pCtx;
#if defined (DOT11F_LITTLE_ENDIAN_HOST)
	if (!fMsb) {
		DOT11F_MEMCPY(pCtx, pOut, &pIn, 2);
	} else {
		*pOut       = (pIn & 0xff00) >> 8;
		*(pOut + 1) = pIn & 0xff;
	}
#else
	if (!fMsb) {
		*pOut       = pIn & 0xff;
		*(pOut + 1) = (pIn & 0xff00) >> 8;
	} else {
		DOT11F_MEMCPY(pCtx, pOut, &pIn, 2);
	}
#endif
}

static void frameshtonl(tpAniSirGlobal    pCtx,
			uint8_t  *pOut,
			uint32_t  pIn,
			tFRAMES_BOOL  fMsb)
{
	(void)pCtx;
#if defined (DOT11F_LITTLE_ENDIAN_HOST)
	if (!fMsb) {
		DOT11F_MEMCPY(pCtx, pOut, &pIn, 4);
	} else {
		*pOut       = (pIn & 0xff000000) >> 24;
		*(pOut + 1) = (pIn & 0x00ff0000) >> 16;
		*(pOut + 2) = (pIn & 0x0000ff00) >>  8;
		*(pOut + 3) = (pIn & 0x000000ff);
	}
#else
	if (!fMsb) {
		*pOut       = (pIn & 0x000000ff);
		*(pOut + 1) = (pIn & 0x0000ff00) >>  8;
		*(pOut + 2) = (pIn & 0x00ff0000) >> 16;
		*(pOut + 3) = (pIn & 0xff000000) >> 24;
	} else {
		DOT11F_MEMCPY(pCtx, pOut, &pIn, 4);
	}
#endif
}

static void frameshtonq(tpAniSirGlobal    pCtx,
			uint8_t  *pOut,
			tDOT11F_U64  pIn,
			tFRAMES_BOOL  fMsb)
{
#if defined (DOT11F_LITTLE_ENDIAN_HOST)
	frameshtonl(pCtx, pOut, pIn[0], fMsb);
	frameshtonl(pCtx, pOut + 4, pIn[1], fMsb);
#else
	frameshtonl(pCtx, pOut + 4, pIn[1], fMsb);
	frameshtonl(pCtx, pOut, pIn[0], fMsb);
#endif
}

static const tIEDefn *find_ie_defn(tpAniSirGlobal pCtx,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   const tIEDefn  IEs[])
{
	const tIEDefn *pIe;
	(void)pCtx;

	pIe = &(IEs[0]);
	while (0xff != pIe->eid) {
		if (*pBuf == pIe->eid) {
			if (0 == pIe->noui)
				return pIe;

			if ((nBuf > (uint32_t)(pIe->noui + 2)) &&
			    (!DOT11F_MEMCMP(pCtx, pBuf + 2, pIe->oui,
					      pIe->noui)))
				return pIe;
		}

		++pIe;
	}

	return NULL;
}

static uint32_t get_container_ies_len(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint32_t  nBuf,
				      uint8_t *pnConsumed,
				      const tIEDefn  IEs[])
{
	const tIEDefn *pIe, *pIeFirst;
	uint8_t *pBufRemaining = pBuf;
	uint8_t len = 0;
	(void)pCtx;

	pIeFirst = &(IEs[0]);

	if (*pBufRemaining != pIeFirst->eid)
		return DOT11F_INTERNAL_ERROR;
	len += *(pBufRemaining+1);
	pBufRemaining += len + 2;
	len += 2;
	while (len < nBuf) {
		pIe = find_ie_defn(pCtx, pBufRemaining, nBuf + len, IEs);
		if (NULL == pIe)
			break;
		if (pIe->eid == pIeFirst->eid)
			break;
		len += *(pBufRemaining + 1) + 2;
		pBufRemaining += *(pBufRemaining + 1) + 2;
	}

	*pnConsumed = len;
	return DOT11F_PARSE_SUCCESS;

}


static uint32_t unpack_core(tpAniSirGlobal pCtx,
			    uint8_t *pBuf,
			    uint32_t nBuf,
			    const tFFDefn  FFs[],
			    const tIEDefn  IEs[],
			    uint8_t *pFrm,
			    size_t   nFrm);
static uint32_t pack_core(tpAniSirGlobal pCtx,
			  uint8_t *pSrc,
			  uint8_t *pBuf,
			  uint32_t  nBuf,
			  uint32_t *pnConsumed,
			  const tFFDefn  FFs[],
			  const tIEDefn  IEs[]);
static uint32_t get_packed_size_core(tpAniSirGlobal pCtx,
				     uint8_t *pFrm,
				     uint32_t *pnNeeded,
				     const tIEDefn  IEs[]);

uint32_t dot11f_unpack_tlv_common_func(tpAniSirGlobal pCtx, uint8_t *pBuf,
				       uint16_t tlvlen, uint8_t *pDstPresent,
				       uint8_t *pDstField)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)tlvlen; /* Shutup the compiler */

	*pDstPresent = 1;
	*pDstField = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_common_func. */

uint32_t dot11f_unpack_tlv_common_func2(tpAniSirGlobal  pCtx, uint8_t *pBuf,
					uint16_t tlvlen, uint8_t *pDstPresent,
					uint16_t *pDstState)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)tlvlen; /* Shutup the compiler */

	*pDstPresent = 1;
	framesntohs(pCtx, pDstState, pBuf, 1);
	(void)pCtx;
	return status;

} /* End dot11f_unpack_tlv_common_func2. */

void dot11f_unpack_ff_common_func(tpAniSirGlobal pCtx,
				  uint8_t *pBuf, uint16_t *pDstField)
{
	framesntohs(pCtx, pDstField, pBuf, 0);
	(void)pCtx;
} /* End dot11f_unpack_ff_common_func. */

uint32_t dot11f_unpack_ie_common_func(tpAniSirGlobal pCtx, uint8_t *pBuf,
				      uint8_t ielen, uint8_t *pDstPresent ,
				      uint8_t *pDstField)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)ielen;
	(void)pBuf;
	if ((*pDstPresent))
		status = DOT11F_DUPLICATE_IE;
	*pDstPresent = 1;
	*pDstField = *pBuf;
	(void)pCtx;

	return status;
} /* End dot11f_unpack_ie_common_func */

typedef struct sTLVDefn {
	uint32_t   offset;
	uint32_t   presenceOffset;
	const char     *name;
	uint16_t   sig;
	uint32_t   id;
	uint32_t   pec;
	uint32_t   minSize;
	uint32_t   maxSize;
	uint8_t    fMandatory;
	uint8_t    sType;
	uint8_t    sLen;
	uint8_t    fMsb;
} tTLVDefn;

static const tTLVDefn *find_tlv_defn(tpAniSirGlobal    pCtx,
				     uint8_t  *pBuf,
				     uint32_t  nBuf,
				     const tTLVDefn      TLVs[])
{
	const tTLVDefn *pTlv;
	uint32_t   pec;
	uint16_t   id;

	pTlv = &(TLVs[0]);
	(void)pCtx;
	if (pTlv->sType == 2)
		framesntohs(pCtx, &id, pBuf, 1);
	else
		id = *pBuf;

	while (0xffff != pTlv->id) {
		if (id == pTlv->id) {
			if (0 == pTlv->pec)
				return pTlv;

			if (nBuf > 5) {
				pec = ((*(pBuf + 4)) << 16) |
				      ((*(pBuf + 5)) <<  8) |
				      *(pBuf + 6);
				if (pec == pTlv->pec)
					return pTlv;
			}
		}

		++pTlv;
	}

	return NULL;
}

static uint32_t unpack_tlv_core(tpAniSirGlobal   pCtx,
			uint8_t *pBuf,
			uint32_t nBuf,
			const tTLVDefn TLVs[],
			uint8_t *pFrm,
			size_t       nFrm);
static uint32_t pack_tlv_core(tpAniSirGlobal pCtx,
			      uint8_t *pSrc,
			      uint8_t *pBuf,
			      uint32_t  nBuf,
			      uint32_t *pnConsumed,
			      const tTLVDefn  TLVs[],
			      uint32_t *pidx);
static uint32_t get_packed_size_tlv_core(tpAniSirGlobal pCtx,
					 uint8_t *pFrm,
					 uint32_t *pnNeeded,
					 const tTLVDefn  TLVs[]);

#define SigFfAID (0x0001)

void dot11f_unpack_ff_action(tpAniSirGlobal pCtx,
			     uint8_t *pBuf,
			     tDot11fFfAction *pDst)
{
	pDst->action = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_action. */

#define SigFfAction (0x0002)

#define SigFfAuthAlgo (0x0003)

#define SigFfAuthSeqNo (0x0004)

#define SigFfBeaconInterval (0x0005)

void dot11f_unpack_ff_capabilities(tpAniSirGlobal pCtx,
				   uint8_t *pBuf,
				   tDot11fFfCapabilities *pDst)
{
	uint16_t tmp0__;
	framesntohs(pCtx, &tmp0__, pBuf, 0);
	pDst->ess = tmp0__ >> 0 & 0x1;
	pDst->ibss = tmp0__ >> 1 & 0x1;
	pDst->cfPollable = tmp0__ >> 2 & 0x1;
	pDst->cfPollReq = tmp0__ >> 3 & 0x1;
	pDst->privacy = tmp0__ >> 4 & 0x1;
	pDst->shortPreamble = tmp0__ >> 5 & 0x1;
	pDst->pbcc = tmp0__ >> 6 & 0x1;
	pDst->channelAgility = tmp0__ >> 7 & 0x1;
	pDst->spectrumMgt = tmp0__ >> 8 & 0x1;
	pDst->qos = tmp0__ >> 9 & 0x1;
	pDst->shortSlotTime = tmp0__ >> 10 & 0x1;
	pDst->apsd = tmp0__ >> 11 & 0x1;
	pDst->rrm = tmp0__ >> 12 & 0x1;
	pDst->dsssOfdm = tmp0__ >> 13 & 0x1;
	pDst->delayedBA = tmp0__ >> 14 & 0x1;
	pDst->immediateBA = tmp0__ >> 15 & 0x1;
	(void)pCtx;
} /* End dot11f_unpack_ff_capabilities. */

#define SigFfCapabilities (0x0006)

void dot11f_unpack_ff_category(tpAniSirGlobal pCtx,
			       uint8_t *pBuf,
			       tDot11fFfCategory *pDst)
{
	pDst->category = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_category. */

#define SigFfCategory (0x0007)

void dot11f_unpack_ff_current_ap_address(tpAniSirGlobal pCtx,
				       uint8_t *pBuf,
				       tDot11fFfCurrentAPAddress *pDst)
{
	DOT11F_MEMCPY(pCtx, pDst->mac, pBuf, 6);
	(void)pCtx;
} /* End dot11f_unpack_ff_current_ap_address. */

#define SigFfCurrentAPAddress (0x0008)

void dot11f_unpack_ff_dialog_token(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  tDot11fFfDialogToken *pDst)
{
	pDst->token = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_dialog_token. */

#define SigFfDialogToken (0x0009)

void dot11f_unpack_ff_link_margin(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 tDot11fFfLinkMargin *pDst)
{
	pDst->linkMargin = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_link_margin. */

#define SigFfLinkMargin (0x000a)

#define SigFfListenInterval (0x000b)

void dot11f_unpack_ff_max_tx_power(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 tDot11fFfMaxTxPower *pDst)
{
	pDst->maxTxPower = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_max_tx_power. */

#define SigFfMaxTxPower (0x000c)

void dot11f_unpack_ff_num_of_repetitions(tpAniSirGlobal pCtx,
				       uint8_t *pBuf,
				       tDot11fFfNumOfRepetitions *pDst)
{
	framesntohs(pCtx, &pDst->repetitions, pBuf, 0);
	(void)pCtx;
} /* End dot11f_unpack_ff_num_of_repetitions. */

#define SigFfNumOfRepetitions (0x000d)

void dot11f_unpack_ff_operating_mode(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    tDot11fFfOperatingMode *pDst)
{
	uint8_t tmp1__;
	tmp1__ = *pBuf;
	pDst->chanWidth = tmp1__ >> 0 & 0x3;
	pDst->reserved = tmp1__ >> 2 & 0x3;
	pDst->rxNSS = tmp1__ >> 4 & 0x7;
	pDst->rxNSSType = tmp1__ >> 7 & 0x1;
	(void)pCtx;
} /* End dot11f_unpack_ff_operating_mode. */

#define SigFfOperatingMode (0x000e)

void dot11f_unpack_ff_rcpi(tpAniSirGlobal pCtx,
			   uint8_t *pBuf,
			   tDot11fFfRCPI *pDst)
{
	pDst->rcpi = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_rcpi. */

#define SigFfRCPI (0x000f)

void dot11f_unpack_ff_rsni(tpAniSirGlobal pCtx,
			   uint8_t *pBuf,
			   tDot11fFfRSNI *pDst)
{
	pDst->rsni = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_rsni. */

#define SigFfRSNI (0x0010)

#define SigFfReason (0x0011)

void dot11f_unpack_ff_rx_antenna_id(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  tDot11fFfRxAntennaId *pDst)
{
	pDst->antennaId = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_rx_antenna_id. */

#define SigFfRxAntennaId (0x0012)

void dot11f_unpack_ff_sm_power_mode_set(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     tDot11fFfSMPowerModeSet *pDst)
{
	uint8_t tmp2__;
	tmp2__ = *pBuf;
	pDst->PowerSave_En = tmp2__ >> 0 & 0x1;
	pDst->Mode = tmp2__ >> 1 & 0x1;
	pDst->reserved = tmp2__ >> 2 & 0x3f;
	(void)pCtx;
} /* End dot11f_unpack_ff_sm_power_mode_set. */

#define SigFfSMPowerModeSet (0x0013)

#define SigFfStatus (0x0014)

void dot11f_unpack_ff_status_code(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 tDot11fFfStatusCode *pDst)
{
	pDst->statusCode = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_status_code. */

#define SigFfStatusCode (0x0015)

void dot11f_unpack_ff_tpc_ele_id(tpAniSirGlobal pCtx,
			       uint8_t *pBuf,
			       tDot11fFfTPCEleID *pDst)
{
	pDst->TPCId = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_tpc_ele_id. */

#define SigFfTPCEleID (0x0016)

void dot11f_unpack_ff_tpc_ele_len(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 tDot11fFfTPCEleLen *pDst)
{
	pDst->TPCLen = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_tpc_ele_len. */

#define SigFfTPCEleLen (0x0017)

void dot11f_unpack_ff_ts_info(tpAniSirGlobal pCtx,
			     uint8_t *pBuf,
			     tDot11fFfTSInfo *pDst)
{
	uint32_t tmp3__;
	framesntohl(pCtx, &tmp3__, pBuf, 0);
	pDst->traffic_type = tmp3__ >> 0 & 0x1;
	pDst->tsid = tmp3__ >> 1 & 0xf;
	pDst->direction = tmp3__ >> 5 & 0x3;
	pDst->access_policy = tmp3__ >> 7 & 0x3;
	pDst->aggregation = tmp3__ >> 9 & 0x1;
	pDst->psb = tmp3__ >> 10 & 0x1;
	pDst->user_priority = tmp3__ >> 11 & 0x7;
	pDst->tsinfo_ack_pol = tmp3__ >> 14 & 0x3;
	pDst->schedule = tmp3__ >> 16 & 0x1;
	pDst->unused = tmp3__ >> 17 & 0x7fff;
	(void)pCtx;
} /* End dot11f_unpack_ff_ts_info. */

#define SigFfTSInfo (0x0018)

void dot11f_unpack_ff_time_stamp(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 tDot11fFfTimeStamp *pDst)
{
	framesntohq(pCtx, &pDst->timestamp, pBuf, 0);
	(void)pCtx;
} /* End dot11f_unpack_ff_time_stamp. */

#define SigFfTimeStamp (0x0019)

void dot11f_unpack_ff_transaction_id(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    tDot11fFfTransactionId *pDst)
{
	DOT11F_MEMCPY(pCtx, pDst->transId, pBuf, 2);
	(void)pCtx;
} /* End dot11f_unpack_ff_transaction_id. */

#define SigFfTransactionId (0x001a)

void dot11f_unpack_ff_tx_antenna_id(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  tDot11fFfTxAntennaId *pDst)
{
	pDst->antennaId = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_tx_antenna_id. */

#define SigFfTxAntennaId (0x001b)

void dot11f_unpack_ff_tx_power(tpAniSirGlobal pCtx,
			      uint8_t *pBuf,
			      tDot11fFfTxPower *pDst)
{
	pDst->txPower = *pBuf;
	(void)pCtx;
} /* End dot11f_unpack_ff_tx_power. */

#define SigFfTxPower (0x001c)

void dot11f_unpack_ff_vht_membership_status_array(tpAniSirGlobal pCtx,
					       uint8_t *pBuf,
					       tDot11fFfVhtMembershipStatusArray *pDst)
{
	DOT11F_MEMCPY(pCtx, pDst->membershipStatusArray, pBuf, 8);
	(void)pCtx;
} /* End dot11f_unpack_ff_vht_membership_status_array. */

#define SigFfVhtMembershipStatusArray (0x001d)

void dot11f_unpack_ff_vht_user_position_array(tpAniSirGlobal pCtx,
					   uint8_t *pBuf,
					   tDot11fFfVhtUserPositionArray *pDst)
{
	DOT11F_MEMCPY(pCtx, pDst->userPositionArray, pBuf, 16);
	(void)pCtx;
} /* End dot11f_unpack_ff_vht_user_position_array. */

#define SigFfVhtUserPositionArray (0x001e)

uint32_t dot11f_unpack_tlv_authorized_ma_cs(tpAniSirGlobal pCtx,
					  uint8_t *pBuf,
					  uint16_t tlvlen,
					  tDot11fTLVAuthorizedMACs *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->mac, pBuf, 6);
	pBuf += 6;
	tlvlen -= (uint8_t)6;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_authorized_ma_cs. */

#define SigTlvAuthorizedMACs (0x0001)


#define SigTlvRequestToEnroll (0x0002)


uint32_t dot11f_unpack_tlv_version2(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint16_t tlvlen,
				    tDot11fTLVVersion2 *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp4__;
	pDst->present = 1;
	tmp4__ = *pBuf;
	pBuf += 1;
	tlvlen -= 1;
	pDst->minor = tmp4__ >> 0 & 0xf;
	pDst->major = tmp4__ >> 4 & 0xf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_version2. */

#define SigTlvVersion2 (0x0003)


#define SigTlvAPSetupLocked (0x0004)


#define SigTlvAssociationState (0x0005)


#define SigTlvConfigMethods (0x0006)


#define SigTlvConfigurationError (0x0007)


uint32_t dot11f_unpack_tlv_device_name(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint16_t tlvlen,
				      tDot11fTLVDeviceName *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	pDst->num_text = (uint8_t)(tlvlen);
	if (tlvlen > 32) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->text, pBuf, (tlvlen));
	pBuf += (tlvlen);
	tlvlen -= (tlvlen);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_device_name. */

#define SigTlvDeviceName (0x0008)


#define SigTlvDevicePasswordID (0x0009)


uint32_t dot11f_unpack_tlv_extended_listen_timing(tpAniSirGlobal pCtx,
						 uint8_t *pBuf,
						 uint16_t tlvlen,
						 tDot11fTLVExtendedListenTiming *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->availibilityPeriod, pBuf, 0);
	pBuf += 2;
	tlvlen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->availibilityInterval, pBuf, 0);
	pBuf += 2;
	tlvlen -= (uint8_t)2;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_extended_listen_timing. */

#define SigTlvExtendedListenTiming (0x000a)


uint32_t dot11f_unpack_tlv_listen_channel(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint16_t tlvlen,
					 tDot11fTLVListenChannel *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->countryString, pBuf, 3);
	pBuf += 3;
	tlvlen -= (uint8_t)3;
	pDst->regulatoryClass = *pBuf;
	pBuf += 1;
	tlvlen -= (uint8_t)1;
	pDst->channel = *pBuf;
	pBuf += 1;
	tlvlen -= (uint8_t)1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_listen_channel. */

#define SigTlvListenChannel (0x000b)


uint32_t dot11f_unpack_tlv_manufacturer(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint16_t tlvlen,
					 tDot11fTLVManufacturer *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	pDst->num_name = (uint8_t)(tlvlen);
	if (tlvlen > 64) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->name, pBuf, (tlvlen));
	pBuf += (tlvlen);
	tlvlen -= (tlvlen);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_manufacturer. */

#define SigTlvManufacturer (0x000c)


#define SigTlvMinorReasonCode (0x000d)


uint32_t dot11f_unpack_tlv_model_name(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     uint16_t tlvlen,
				     tDot11fTLVModelName *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	pDst->num_text = (uint8_t)(tlvlen);
	if (tlvlen > 32) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->text, pBuf, (tlvlen));
	pBuf += (tlvlen);
	tlvlen -= (tlvlen);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_model_name. */

#define SigTlvModelName (0x000e)


uint32_t dot11f_unpack_tlv_model_number(tpAniSirGlobal pCtx,
				       uint8_t *pBuf,
				       uint16_t tlvlen,
				       tDot11fTLVModelNumber *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	pDst->num_text = (uint8_t)(tlvlen);
	if (tlvlen > 32) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->text, pBuf, (tlvlen));
	pBuf += (tlvlen);
	tlvlen -= (tlvlen);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_model_number. */

#define SigTlvModelNumber (0x000f)


uint32_t dot11f_unpack_tlv_notice_of_absence(tpAniSirGlobal pCtx,
					   uint8_t *pBuf,
					   uint16_t tlvlen,
					   tDot11fTLVNoticeOfAbsence *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	pDst->index = *pBuf;
	pBuf += 1;
	tlvlen -= (uint8_t)1;
	pDst->CTSWindowOppPS = *pBuf;
	pBuf += 1;
	tlvlen -= (uint8_t)1;
	pDst->num_NoADesc = (uint8_t)(tlvlen);
	if (tlvlen > 36) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->NoADesc, pBuf, (tlvlen));
	pBuf += (tlvlen);
	tlvlen -= (tlvlen);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_notice_of_absence. */

#define SigTlvNoticeOfAbsence (0x0010)


uint32_t dot11f_unpack_tlv_operating_channel(tpAniSirGlobal pCtx,
					    uint8_t *pBuf,
					    uint16_t tlvlen,
					    tDot11fTLVOperatingChannel *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->countryString, pBuf, 3);
	pBuf += 3;
	tlvlen -= (uint8_t)3;
	pDst->regulatoryClass = *pBuf;
	pBuf += 1;
	tlvlen -= (uint8_t)1;
	pDst->channel = *pBuf;
	pBuf += 1;
	tlvlen -= (uint8_t)1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_operating_channel. */

#define SigTlvOperatingChannel (0x0011)


uint32_t dot11f_unpack_tlv_p2_p_capability(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint16_t tlvlen,
					 tDot11fTLVP2PCapability *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	pDst->deviceCapability = *pBuf;
	pBuf += 1;
	tlvlen -= (uint8_t)1;
	pDst->groupCapability = *pBuf;
	pBuf += 1;
	tlvlen -= (uint8_t)1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_p2_p_capability. */

#define SigTlvP2PCapability (0x0012)


uint32_t dot11f_unpack_tlv_p2_p_device_id(tpAniSirGlobal pCtx,
				       uint8_t *pBuf,
				       uint16_t tlvlen,
				       tDot11fTLVP2PDeviceId *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->P2PDeviceAddress, pBuf, 6);
	pBuf += 6;
	tlvlen -= (uint8_t)6;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_p2_p_device_id. */

#define SigTlvP2PDeviceId (0x0013)


static const tTLVDefn TLVS_P2PDeviceInfo[] = {
	{ offsetof(tDot11fTLVP2PDeviceInfo, DeviceName),
	offsetof(tDot11fTLVDeviceName, present), "DeviceName", SigTlvDeviceName,
	DOT11F_TLV_DEVICENAME, 0, 4, 36, 1, 2, 2, 1, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_tlv_p2_p_device_info(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint16_t tlvlen,
					 tDot11fTLVP2PDeviceInfo *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->P2PDeviceAddress, pBuf, 6);
	pBuf += 6;
	tlvlen -= (uint8_t)6;
	framesntohs(pCtx, &pDst->configMethod, pBuf, 0);
	pBuf += 2;
	tlvlen -= (uint8_t)2;
	DOT11F_MEMCPY(pCtx, pDst->primaryDeviceType, pBuf, 8);
	pBuf += 8;
	tlvlen -= (uint8_t)8;
	(void)pCtx;
	status |= unpack_tlv_core(pCtx,
				  pBuf,
				  tlvlen,
				  TLVS_P2PDeviceInfo,
				  (uint8_t *)pDst,
				  sizeof(*pDst));
	return status;
} /* End dot11f_unpack_tlv_p2_p_device_info. */

#define SigTlvP2PDeviceInfo (0x0014)


uint32_t dot11f_unpack_tlv_p2_p_group_info(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint16_t tlvlen,
					 tDot11fTLVP2PGroupInfo *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	pDst->num_P2PClientInfoDesc = (uint8_t)(tlvlen);
	DOT11F_MEMCPY(pCtx, pDst->P2PClientInfoDesc, pBuf, (tlvlen));
	pBuf += (tlvlen);
	tlvlen -= (tlvlen);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_p2_p_group_info. */

#define SigTlvP2PGroupInfo (0x0015)


#define SigTlvP2PStatus (0x0016)


uint32_t dot11f_unpack_tlv_primary_device_type(tpAniSirGlobal pCtx,
					     uint8_t *pBuf,
					     uint16_t tlvlen,
					     tDot11fTLVPrimaryDeviceType *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)tlvlen; /* Shutup the compiler */
	pDst->present = 1;
	framesntohs(pCtx, &pDst->primary_category, pBuf, 1);
	pBuf += 2;
	tlvlen -= (uint8_t)2;
	DOT11F_MEMCPY(pCtx, pDst->oui, pBuf, 4);
	pBuf += 4;
	tlvlen -= (uint8_t)4;
	framesntohs(pCtx, &pDst->sub_category, pBuf, 1);
	pBuf += 2;
	tlvlen -= (uint8_t)2;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_primary_device_type. */

#define SigTlvPrimaryDeviceType (0x0017)


#define SigTlvRFBands (0x0018)


uint32_t dot11f_unpack_tlv_request_device_type(tpAniSirGlobal pCtx,
					     uint8_t *pBuf,
					     uint16_t tlvlen,
					     tDot11fTLVRequestDeviceType *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->primary_category, pBuf, 1);
	pBuf += 2;
	tlvlen -= (uint8_t)2;
	DOT11F_MEMCPY(pCtx, pDst->oui, pBuf, 4);
	pBuf += 4;
	tlvlen -= (uint8_t)4;
	framesntohs(pCtx, &pDst->sub_category, pBuf, 1);
	pBuf += 2;
	tlvlen -= (uint8_t)2;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_request_device_type. */

#define SigTlvRequestDeviceType (0x0019)


#define SigTlvRequestType (0x001a)


#define SigTlvResponseType (0x001b)


#define SigTlvSelectedRegistrar (0x001c)


#define SigTlvSelectedRegistrarConfigMethods (0x001d)


uint32_t dot11f_unpack_tlv_serial_number(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint16_t tlvlen,
					 tDot11fTLVSerialNumber *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	pDst->num_text = (uint8_t)(tlvlen);
	if (tlvlen > 32) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->text, pBuf, (tlvlen));
	pBuf += (tlvlen);
	tlvlen -= (tlvlen);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_serial_number. */

#define SigTlvSerialNumber (0x001e)


uint32_t dot11f_unpack_tlv_uuid_e(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint16_t tlvlen,
				  tDot11fTLVUUID_E *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->uuid, pBuf, 16);
	pBuf += 16;
	tlvlen -= (uint8_t)16;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_uuid_e. */

#define SigTlvUUID_E (0x001f)


uint32_t dot11f_unpack_tlv_uuid_r(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint16_t tlvlen,
				  tDot11fTLVUUID_R *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->uuid, pBuf, 16);
	pBuf += 16;
	tlvlen -= (uint8_t)16;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_uuid_r. */

#define SigTlvUUID_R (0x0020)


static const tTLVDefn TLVS_VendorExtension[] = {
	{ offsetof(tDot11fTLVVendorExtension, Version2),
	offsetof(tDot11fTLVVersion2, present), "Version2", SigTlvVersion2,
	DOT11F_TLV_VERSION2, 0, 3, 3, 0, 1, 1, 1, },
	{ offsetof(tDot11fTLVVendorExtension, AuthorizedMACs),
	offsetof(tDot11fTLVAuthorizedMACs, present), "AuthorizedMACs",
	SigTlvAuthorizedMACs, DOT11F_TLV_AUTHORIZEDMACS, 0, 8, 8, 0, 1, 1, 1, },
	{ offsetof(tDot11fTLVVendorExtension, RequestToEnroll),
	offsetof(tDot11fTLVRequestToEnroll, present), "RequestToEnroll",
	SigTlvRequestToEnroll, DOT11F_TLV_REQUESTTOENROLL,
	0, 3, 3, 0, 1, 1, 1, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_tlv_vendor_extension(tpAniSirGlobal pCtx,
					   uint8_t *pBuf,
					   uint16_t tlvlen,
					   tDot11fTLVVendorExtension *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->vendorId, pBuf, 3);
	pBuf += 3;
	tlvlen -= (uint8_t)3;
	(void)pCtx;
	status |= unpack_tlv_core(pCtx,
				  pBuf,
				  tlvlen,
				  TLVS_VendorExtension,
				  (uint8_t *)pDst,
				  sizeof(*pDst));
	return status;
} /* End dot11f_unpack_tlv_vendor_extension. */

#define SigTlvVendorExtension (0x0021)


uint32_t dot11f_unpack_tlv_version(tpAniSirGlobal pCtx,
				   uint8_t *pBuf,
				   uint16_t tlvlen,
				   tDot11fTLVVersion *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp5__;
	pDst->present = 1;
	tmp5__ = *pBuf;
	pBuf += 1;
	tlvlen -= 1;
	pDst->minor = tmp5__ >> 0 & 0xf;
	pDst->major = tmp5__ >> 4 & 0xf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_version. */

#define SigTlvVersion (0x0022)


#define SigTlvWPSState (0x0023)


uint32_t dot11f_unpack_tlv_p2_p_interface(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint16_t tlvlen,
					 tDot11fTLVP2PInterface *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->P2PDeviceAddress, pBuf, 6);
	pBuf += 6;
	tlvlen -= (uint8_t)6;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_tlv_p2_p_interface. */

#define SigTlvP2PInterface (0x0024)


#define SigTlvP2PManageability (0x0025)


uint32_t dot11f_unpack_ie_condensed_country_str(tpAniSirGlobal pCtx,
					      uint8_t *pBuf,
					      uint8_t ielen,
					      tDot11fIECondensedCountryStr *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->countryStr, pBuf, 2);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_condensed_country_str. */

#define SigIeCondensedCountryStr (0x0001)


uint32_t dot11f_unpack_ie_gtk(tpAniSirGlobal pCtx,
			      uint8_t *pBuf,
			      uint8_t ielen,
			      tDot11fIEGTK *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint16_t tmp6__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &tmp6__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->keyId = tmp6__ >> 0 & 0x3;
	pDst->reserved = tmp6__ >> 2 & 0x3feb;
	pDst->keyLength = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	DOT11F_MEMCPY(pCtx, pDst->RSC, pBuf, 8);
	pBuf += 8;
	ielen -= (uint8_t)8;
	pDst->num_key = (uint8_t)(ielen);
	if (ielen > 32) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->key, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_gtk. */

#define SigIeGTK (0x0002)


uint32_t dot11f_unpack_ie_igtk(tpAniSirGlobal pCtx,
			       uint8_t *pBuf,
			       uint8_t ielen,
			       tDot11fIEIGTK *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->keyID, pBuf, 2);
	pBuf += 2;
	ielen -= (uint8_t)2;
	DOT11F_MEMCPY(pCtx, pDst->IPN, pBuf, 6);
	pBuf += 6;
	ielen -= (uint8_t)6;
	pDst->keyLength = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	DOT11F_MEMCPY(pCtx, pDst->key, pBuf, 24);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_igtk. */

#define SigIeIGTK (0x0003)


uint32_t dot11f_unpack_ie_r0_kh_id(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint8_t ielen,
				  tDot11fIER0KH_ID *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_PMK_R0_ID = (uint8_t)(ielen);
	if (ielen > 48) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->PMK_R0_ID, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_r0_kh_id. */

#define SigIeR0KH_ID (0x0004)


uint32_t dot11f_unpack_ie_r1_kh_id(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint8_t ielen,
				  tDot11fIER1KH_ID *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->PMK_R1_ID, pBuf, 6);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_r1_kh_id. */

#define SigIeR1KH_ID (0x0005)


uint32_t dot11f_unpack_ie_tsf_info(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint8_t ielen,
				  tDot11fIETSFInfo *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->TsfOffset, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->BeaconIntvl, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_tsf_info. */

#define SigIeTSFInfo (0x0006)


uint32_t dot11f_unpack_ie_ap_channel_report(tpAniSirGlobal pCtx,
					  uint8_t *pBuf,
					  uint8_t ielen,
					  tDot11fIEAPChannelReport *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->regulatoryClass = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->num_channelList = (uint8_t)(ielen);
	if (ielen > 50) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->channelList, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ap_channel_report. */

#define SigIeAPChannelReport (0x0007)


uint32_t dot11f_unpack_ie_bcn_reporting_detail(tpAniSirGlobal pCtx,
					     uint8_t *pBuf,
					     uint8_t ielen,
					     tDot11fIEBcnReportingDetail *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->reportingDetail = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_bcn_reporting_detail. */

#define SigIeBcnReportingDetail (0x0008)


uint32_t dot11f_unpack_ie_beacon_report_frm_body(tpAniSirGlobal pCtx,
					      uint8_t *pBuf,
					      uint8_t ielen,
					      tDot11fIEBeaconReportFrmBody *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_reportedFields = (uint8_t)(ielen);
	if (ielen > 224) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->reportedFields, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_beacon_report_frm_body. */

#define SigIeBeaconReportFrmBody (0x0009)


uint32_t dot11f_unpack_ie_beacon_reporting(tpAniSirGlobal pCtx,
					  uint8_t *pBuf,
					  uint8_t ielen,
					  tDot11fIEBeaconReporting *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->reportingCondition = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->threshold = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_beacon_reporting. */

#define SigIeBeaconReporting (0x000a)


uint32_t dot11f_unpack_ie_measurement_pilot(tpAniSirGlobal pCtx,
					   uint8_t *pBuf,
					   uint8_t ielen,
					   tDot11fIEMeasurementPilot *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->measurementPilot = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->num_vendorSpecific = (uint8_t)(ielen);
	DOT11F_MEMCPY(pCtx, pDst->vendorSpecific, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_measurement_pilot. */

#define SigIeMeasurementPilot (0x000b)


uint32_t dot11f_unpack_ie_multi_bssid(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     uint8_t ielen,
				     tDot11fIEMultiBssid *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->maxBSSIDIndicator = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->num_vendorSpecific = (uint8_t)(ielen);
	DOT11F_MEMCPY(pCtx, pDst->vendorSpecific, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_multi_bssid. */

#define SigIeMultiBssid (0x000c)


uint32_t dot11f_unpack_ie_ric_data(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint8_t ielen,
				  tDot11fIERICData *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->Identifier = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->resourceDescCount = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	framesntohs(pCtx, &pDst->statusCode, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ric_data. */

#define SigIeRICData (0x000d)


uint32_t dot11f_unpack_ie_ric_descriptor(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIERICDescriptor *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->resourceType = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->num_variableData = (uint8_t)(ielen);
	DOT11F_MEMCPY(pCtx, pDst->variableData, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ric_descriptor. */

#define SigIeRICDescriptor (0x000e)


uint32_t dot11f_unpack_ie_rrm_enabled_cap(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIERRMEnabledCap *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp7__;
	uint8_t tmp8__;
	uint8_t tmp9__;
	uint8_t tmp10__;
	uint8_t tmp11__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	tmp7__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->LinkMeasurement = tmp7__ >> 0 & 0x1;
	pDst->NeighborRpt = tmp7__ >> 1 & 0x1;
	pDst->parallel = tmp7__ >> 2 & 0x1;
	pDst->repeated = tmp7__ >> 3 & 0x1;
	pDst->BeaconPassive = tmp7__ >> 4 & 0x1;
	pDst->BeaconActive = tmp7__ >> 5 & 0x1;
	pDst->BeaconTable = tmp7__ >> 6 & 0x1;
	pDst->BeaconRepCond = tmp7__ >> 7 & 0x1;
	tmp8__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->FrameMeasurement = tmp8__ >> 0 & 0x1;
	pDst->ChannelLoad = tmp8__ >> 1 & 0x1;
	pDst->NoiseHistogram = tmp8__ >> 2 & 0x1;
	pDst->statistics = tmp8__ >> 3 & 0x1;
	pDst->LCIMeasurement = tmp8__ >> 4 & 0x1;
	pDst->LCIAzimuth = tmp8__ >> 5 & 0x1;
	pDst->TCMCapability = tmp8__ >> 6 & 0x1;
	pDst->triggeredTCM = tmp8__ >> 7 & 0x1;
	tmp9__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->APChanReport = tmp9__ >> 0 & 0x1;
	pDst->RRMMIBEnabled = tmp9__ >> 1 & 0x1;
	pDst->operatingChanMax = tmp9__ >> 2 & 0x7;
	pDst->nonOperatinChanMax = tmp9__ >> 5 & 0x7;
	tmp10__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->MeasurementPilot = tmp10__ >> 0 & 0x7;
	pDst->MeasurementPilotEnabled = tmp10__ >> 3 & 0x1;
	pDst->NeighborTSFOffset = tmp10__ >> 4 & 0x1;
	pDst->RCPIMeasurement = tmp10__ >> 5 & 0x1;
	pDst->RSNIMeasurement = tmp10__ >> 6 & 0x1;
	pDst->BssAvgAccessDelay = tmp10__ >> 7 & 0x1;
	tmp11__ = *pBuf;
	pDst->BSSAvailAdmission = tmp11__ >> 0 & 0x1;
	pDst->AntennaInformation = tmp11__ >> 1 & 0x1;
	pDst->fine_time_meas_rpt = tmp11__ >> 2 & 0x1;
	pDst->lci_capability = tmp11__ >> 3 & 0x1;
	pDst->reserved = tmp11__ >> 4 & 0xf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_rrm_enabled_cap. */

#define SigIeRRMEnabledCap (0x000f)


uint32_t dot11f_unpack_ie_requested_info(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIERequestedInfo *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_requested_eids = (uint8_t)(ielen);
	DOT11F_MEMCPY(pCtx, pDst->requested_eids, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_requested_info. */

#define SigIeRequestedInfo (0x0010)


uint32_t dot11f_unpack_ie_ssid(tpAniSirGlobal pCtx,
			       uint8_t *pBuf,
			       uint8_t ielen,
			       tDot11fIESSID *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present) {
		status = DOT11F_DUPLICATE_IE;
		return status;
	}
	pDst->present = 1;
	pDst->num_ssid = (uint8_t)(ielen);
	if (ielen > 32) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->ssid, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ssid. */

#define SigIeSSID (0x0011)


uint32_t dot11f_unpack_ie_schedule(tpAniSirGlobal pCtx,
				   uint8_t *pBuf,
				   uint8_t ielen,
				   tDot11fIESchedule *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint16_t tmp12__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &tmp12__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->aggregation = tmp12__ >> 0 & 0x1;
	pDst->tsid = tmp12__ >> 1 & 0xf;
	pDst->direction = tmp12__ >> 5 & 0x3;
	pDst->reserved = tmp12__ >> 7 & 0x1ff;
	framesntohl(pCtx, &pDst->service_start_time, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->service_interval, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohs(pCtx, &pDst->max_service_dur, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->spec_interval, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_schedule. */

#define SigIeSchedule (0x0012)


uint32_t dot11f_unpack_ie_tclas(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 uint8_t ielen,
				 tDot11fIETCLAS *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->user_priority = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->classifier_type = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->classifier_mask = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	switch (pDst->classifier_type) {
	case 0:
		DOT11F_MEMCPY(pCtx, pDst->info.EthParams.source, pBuf, 6);
		pBuf += 6;
		ielen -= (uint8_t)6;
		DOT11F_MEMCPY(pCtx, pDst->info.EthParams.dest, pBuf, 6);
		pBuf += 6;
		ielen -= (uint8_t)6;
		framesntohs(pCtx, &pDst->info.EthParams.type, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
		break;
	case 1:
		pDst->info.IpParams.version = *pBuf;
		pBuf += 1;
		ielen -= (uint8_t)1;
		switch (pDst->info.IpParams.version) {
		case 4:
			DOT11F_MEMCPY(pCtx, pDst->info.IpParams.params.IpV4Params.source, pBuf, 4);
			pBuf += 4;
			ielen -= (uint8_t)4;
			DOT11F_MEMCPY(pCtx, pDst->info.IpParams.params.IpV4Params.dest, pBuf, 4);
			pBuf += 4;
			ielen -= (uint8_t)4;
			framesntohs(pCtx, &pDst->info.IpParams.params.IpV4Params.src_port, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			framesntohs(pCtx, &pDst->info.IpParams.params.IpV4Params.dest_port, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			pDst->info.IpParams.params.IpV4Params.DSCP = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->info.IpParams.params.IpV4Params.proto = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->info.IpParams.params.IpV4Params.reserved = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			break;
		case 6:
			DOT11F_MEMCPY(pCtx, pDst->info.IpParams.params.IpV6Params.source, pBuf, 16);
			pBuf += 16;
			ielen -= (uint8_t)16;
			DOT11F_MEMCPY(pCtx, pDst->info.IpParams.params.IpV6Params.dest, pBuf, 16);
			pBuf += 16;
			ielen -= (uint8_t)16;
			framesntohs(pCtx, &pDst->info.IpParams.params.IpV6Params.src_port, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			framesntohs(pCtx, &pDst->info.IpParams.params.IpV6Params.dest_port, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			DOT11F_MEMCPY(pCtx, pDst->info.IpParams.params.IpV6Params.flow_label, pBuf, 3);
			pBuf += 3;
			ielen -= (uint8_t)3;
			break;
		}
		break;
	case 2:
		framesntohs(pCtx, &pDst->info.Params8021dq.tag_type, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
		break;
	}
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_tclas. */

#define SigIeTCLAS (0x0013)


#define SigIeTCLASSPROC (0x0014)


uint32_t dot11f_unpack_ie_ts_delay(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint8_t ielen,
				  tDot11fIETSDelay *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohl(pCtx, &pDst->delay, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ts_delay. */

#define SigIeTSDelay (0x0015)


uint32_t dot11f_unpack_ie_tspec(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 uint8_t ielen,
				 tDot11fIETSPEC *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint16_t tmp13__;
	uint8_t tmp14__;
	uint16_t tmp15__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &tmp13__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->traffic_type = tmp13__ >> 0 & 0x1;
	pDst->tsid = tmp13__ >> 1 & 0xf;
	pDst->direction = tmp13__ >> 5 & 0x3;
	pDst->access_policy = tmp13__ >> 7 & 0x3;
	pDst->aggregation = tmp13__ >> 9 & 0x1;
	pDst->psb = tmp13__ >> 10 & 0x1;
	pDst->user_priority = tmp13__ >> 11 & 0x7;
	pDst->tsinfo_ack_pol = tmp13__ >> 14 & 0x3;
	tmp14__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->schedule = tmp14__ >> 0 & 0x1;
	pDst->unused = tmp14__ >> 1 & 0x7f;
	framesntohs(pCtx, &tmp15__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->size = tmp15__ >> 0 & 0x7fff;
	pDst->fixed = tmp15__ >> 15 & 0x1;
	framesntohs(pCtx, &pDst->max_msdu_size, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohl(pCtx, &pDst->min_service_int, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->max_service_int, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->inactivity_int, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->suspension_int, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->service_start_time, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->min_data_rate, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->mean_data_rate, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->peak_data_rate, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->burst_size, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->delay_bound, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->min_phy_rate, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohs(pCtx, &pDst->surplus_bw_allowance, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->medium_time, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_tspec. */

#define SigIeTSPEC (0x0016)


uint32_t dot11f_unpack_ie_vht_caps(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint8_t ielen,
				  tDot11fIEVHTCaps *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t tmp16__;
	uint16_t tmp17__;
	uint16_t tmp18__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohl(pCtx, &tmp16__, pBuf, 0);
	pBuf += 4;
	ielen -= 4;
	pDst->maxMPDULen = tmp16__ >> 0 & 0x3;
	pDst->supportedChannelWidthSet = tmp16__ >> 2 & 0x3;
	pDst->ldpcCodingCap = tmp16__ >> 4 & 0x1;
	pDst->shortGI80MHz = tmp16__ >> 5 & 0x1;
	pDst->shortGI160and80plus80MHz = tmp16__ >> 6 & 0x1;
	pDst->txSTBC = tmp16__ >> 7 & 0x1;
	pDst->rxSTBC = tmp16__ >> 8 & 0x7;
	pDst->suBeamFormerCap = tmp16__ >> 11 & 0x1;
	pDst->suBeamformeeCap = tmp16__ >> 12 & 0x1;
	pDst->csnofBeamformerAntSup = tmp16__ >> 13 & 0x7;
	pDst->numSoundingDim = tmp16__ >> 16 & 0x7;
	pDst->muBeamformerCap = tmp16__ >> 19 & 0x1;
	pDst->muBeamformeeCap = tmp16__ >> 20 & 0x1;
	pDst->vhtTXOPPS = tmp16__ >> 21 & 0x1;
	pDst->htcVHTCap = tmp16__ >> 22 & 0x1;
	pDst->maxAMPDULenExp = tmp16__ >> 23 & 0x7;
	pDst->vhtLinkAdaptCap = tmp16__ >> 26 & 0x3;
	pDst->rxAntPattern = tmp16__ >> 28 & 0x1;
	pDst->txAntPattern = tmp16__ >> 29 & 0x1;
	pDst->reserved1 = tmp16__ >> 30 & 0x3;
	framesntohs(pCtx, &pDst->rxMCSMap, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &tmp17__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->rxHighSupDataRate = tmp17__ >> 0 & 0x1fff;
	pDst->reserved2 = tmp17__ >> 13 & 0x7;
	framesntohs(pCtx, &pDst->txMCSMap, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &tmp18__, pBuf, 0);
	pDst->txSupDataRate = tmp18__ >> 0 & 0x1fff;
	pDst->reserved3 = tmp18__ >> 13 & 0x7;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_vht_caps. */

#define SigIeVHTCaps (0x0017)


uint32_t dot11f_unpack_ie_vht_operation(tpAniSirGlobal pCtx,
				       uint8_t *pBuf,
				       uint8_t ielen,
				       tDot11fIEVHTOperation *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->chanWidth = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->chanCenterFreqSeg1 = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->chanCenterFreqSeg2 = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	framesntohs(pCtx, &pDst->basicMCSSet, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_vht_operation. */

#define SigIeVHTOperation (0x0018)


uint32_t dot11f_unpack_ie_wmm_schedule(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEWMMSchedule *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint16_t tmp19__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->version = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	if (pDst->version != 0x1) {
		pDst->present = 0;
		return status | DOT11F_BAD_FIXED_VALUE;
	}
	framesntohs(pCtx, &tmp19__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->aggregation = tmp19__ >> 0 & 0x1;
	pDst->tsid = tmp19__ >> 1 & 0xf;
	pDst->direction = tmp19__ >> 5 & 0x3;
	pDst->reserved = tmp19__ >> 7 & 0x1ff;
	framesntohl(pCtx, &pDst->service_start_time, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->service_interval, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohs(pCtx, &pDst->max_service_dur, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->spec_interval, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wmm_schedule. */

#define SigIeWMMSchedule (0x0019)


uint32_t dot11f_unpack_ie_wmmtclas(tpAniSirGlobal pCtx,
				   uint8_t *pBuf,
				   uint8_t ielen,
				   tDot11fIEWMMTCLAS *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->version = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	if (pDst->version != 0x1) {
		pDst->present = 0;
		return status | DOT11F_BAD_FIXED_VALUE;
	}
	pDst->user_priority = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->classifier_type = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->classifier_mask = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	switch (pDst->classifier_type) {
	case 0:
		DOT11F_MEMCPY(pCtx, pDst->info.EthParams.source, pBuf, 6);
		pBuf += 6;
		ielen -= (uint8_t)6;
		DOT11F_MEMCPY(pCtx, pDst->info.EthParams.dest, pBuf, 6);
		pBuf += 6;
		ielen -= (uint8_t)6;
		framesntohs(pCtx, &pDst->info.EthParams.type, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
		break;
	case 1:
		pDst->info.IpParams.version = *pBuf;
		pBuf += 1;
		ielen -= (uint8_t)1;
		switch (pDst->info.IpParams.version) {
		case 4:
			DOT11F_MEMCPY(pCtx, pDst->info.IpParams.params.IpV4Params.source, pBuf, 4);
			pBuf += 4;
			ielen -= (uint8_t)4;
			DOT11F_MEMCPY(pCtx, pDst->info.IpParams.params.IpV4Params.dest, pBuf, 4);
			pBuf += 4;
			ielen -= (uint8_t)4;
			framesntohs(pCtx, &pDst->info.IpParams.params.IpV4Params.src_port, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			framesntohs(pCtx, &pDst->info.IpParams.params.IpV4Params.dest_port, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			pDst->info.IpParams.params.IpV4Params.DSCP = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->info.IpParams.params.IpV4Params.proto = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->info.IpParams.params.IpV4Params.reserved = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			break;
		case 6:
			DOT11F_MEMCPY(pCtx, pDst->info.IpParams.params.IpV6Params.source, pBuf, 16);
			pBuf += 16;
			ielen -= (uint8_t)16;
			DOT11F_MEMCPY(pCtx, pDst->info.IpParams.params.IpV6Params.dest, pBuf, 16);
			pBuf += 16;
			ielen -= (uint8_t)16;
			framesntohs(pCtx, &pDst->info.IpParams.params.IpV6Params.src_port, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			framesntohs(pCtx, &pDst->info.IpParams.params.IpV6Params.dest_port, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			DOT11F_MEMCPY(pCtx, pDst->info.IpParams.params.IpV6Params.flow_label, pBuf, 3);
			pBuf += 3;
			ielen -= (uint8_t)3;
			break;
		}
		break;
	case 2:
		framesntohs(pCtx, &pDst->info.Params8021dq.tag_type, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
		break;
	}
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wmmtclas. */

#define SigIeWMMTCLAS (0x001a)


uint32_t dot11f_unpack_ie_wmmtclasproc(tpAniSirGlobal pCtx,
				       uint8_t *pBuf,
				       uint8_t ielen,
				       tDot11fIEWMMTCLASPROC *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->version = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	if (pDst->version != 0x1) {
		pDst->present = 0;
		return status | DOT11F_BAD_FIXED_VALUE;
	}
	pDst->processing = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wmmtclasproc. */

#define SigIeWMMTCLASPROC (0x001b)


uint32_t dot11f_unpack_ie_wmmts_delay(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     uint8_t ielen,
				     tDot11fIEWMMTSDelay *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->version = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	if (pDst->version != 0x1) {
		pDst->present = 0;
		return status | DOT11F_BAD_FIXED_VALUE;
	}
	framesntohl(pCtx, &pDst->delay, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wmmts_delay. */

#define SigIeWMMTSDelay (0x001c)


uint32_t dot11f_unpack_ie_wmmtspec(tpAniSirGlobal pCtx,
				   uint8_t *pBuf,
				   uint8_t ielen,
				   tDot11fIEWMMTSPEC *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint16_t tmp20__;
	uint8_t tmp21__;
	uint16_t tmp22__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->version = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	if (pDst->version != 0x1) {
		pDst->present = 0;
		return status | DOT11F_BAD_FIXED_VALUE;
	}
	framesntohs(pCtx, &tmp20__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->traffic_type = tmp20__ >> 0 & 0x1;
	pDst->tsid = tmp20__ >> 1 & 0xf;
	pDst->direction = tmp20__ >> 5 & 0x3;
	pDst->access_policy = tmp20__ >> 7 & 0x3;
	pDst->aggregation = tmp20__ >> 9 & 0x1;
	pDst->psb = tmp20__ >> 10 & 0x1;
	pDst->user_priority = tmp20__ >> 11 & 0x7;
	pDst->tsinfo_ack_pol = tmp20__ >> 14 & 0x3;
	tmp21__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->tsinfo_rsvd = tmp21__ >> 0 & 0x7f;
	pDst->burst_size_defn = tmp21__ >> 7 & 0x1;
	framesntohs(pCtx, &tmp22__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->size = tmp22__ >> 0 & 0x7fff;
	pDst->fixed = tmp22__ >> 15 & 0x1;
	framesntohs(pCtx, &pDst->max_msdu_size, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohl(pCtx, &pDst->min_service_int, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->max_service_int, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->inactivity_int, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->suspension_int, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->service_start_time, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->min_data_rate, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->mean_data_rate, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->peak_data_rate, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->burst_size, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->delay_bound, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohl(pCtx, &pDst->min_phy_rate, pBuf, 0);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohs(pCtx, &pDst->surplus_bw_allowance, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->medium_time, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wmmtspec. */

#define SigIeWMMTSPEC (0x001d)


uint32_t dot11f_unpack_ie_wider_bw_chan_switch_ann(tpAniSirGlobal pCtx,
					       uint8_t *pBuf,
					       uint8_t ielen,
					       tDot11fIEWiderBWChanSwitchAnn *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->newChanWidth = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->newCenterChanFreq0 = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->newCenterChanFreq1 = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wider_bw_chan_switch_ann. */

#define SigIeWiderBWChanSwitchAnn (0x001e)


uint32_t dot11f_unpack_ie_aid(tpAniSirGlobal pCtx,
			      uint8_t *pBuf,
			      uint8_t ielen,
			      tDot11fIEAID *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->assocId, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_aid. */

#define SigIeAID (0x001f)


uint32_t dot11f_unpack_ie_cf_params(tpAniSirGlobal pCtx,
				   uint8_t *pBuf,
				   uint8_t ielen,
				   tDot11fIECFParams *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->cfp_count = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->cfp_period = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	framesntohs(pCtx, &pDst->cfp_maxduration, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->cfp_durremaining, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_cf_params. */

#define SigIeCFParams (0x0020)


uint32_t dot11f_unpack_ie_challenge_text(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEChallengeText *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_text = (uint8_t)(ielen);
	if (ielen > 253) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->text, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_challenge_text. */

#define SigIeChallengeText (0x0021)


uint32_t dot11f_unpack_ie_chan_switch_ann(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEChanSwitchAnn *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->switchMode = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->newChannel = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->switchCount = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_chan_switch_ann. */

#define SigIeChanSwitchAnn (0x0022)


static const tFFDefn FFS_ChannelSwitchWrapper[] = {
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_ChannelSwitchWrapper[] = {
	{ offsetof(tDot11fIEChannelSwitchWrapper, WiderBWChanSwitchAnn),
	offsetof(tDot11fIEWiderBWChanSwitchAnn, present), 0,
	"WiderBWChanSwitchAnn", 0, 5, 5, SigIeWiderBWChanSwitchAnn,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_WIDERBWCHANSWITCHANN, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },
};

uint32_t dot11f_unpack_ie_channel_switch_wrapper(tpAniSirGlobal pCtx,
					       uint8_t *pBuf,
					       uint8_t ielen,
					       tDot11fIEChannelSwitchWrapper *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	(void)pCtx;
	status |= unpack_core(pCtx,
				pBuf,
				ielen,
				FFS_ChannelSwitchWrapper,
				IES_ChannelSwitchWrapper,
				(uint8_t *)pDst,
				sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_channel_switch_wrapper. */

#define SigIeChannelSwitchWrapper (0x0023)


uint32_t dot11f_unpack_ie_country(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint8_t ielen,
				  tDot11fIECountry *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->country, pBuf, 3);
	pBuf += 3;
	ielen -= (uint8_t)3;
	if (!ielen) {
		pDst->num_triplets = 0U;
		return 0U;
	} else {
		pDst->num_triplets = (uint8_t)(ielen / 3);
		if (ielen > 84 * 3) {
				pDst->present = 0;
				return DOT11F_SKIPPED_BAD_IE;
		}

		DOT11F_MEMCPY(pCtx, pDst->triplets, pBuf, (ielen));
	}
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_country. */

#define SigIeCountry (0x0024)


#define SigIeDSParams (0x0025)


uint32_t dot11f_unpack_ie_edca_param_set(tpAniSirGlobal pCtx,
				       uint8_t *pBuf,
				       uint8_t ielen,
				       tDot11fIEEDCAParamSet *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp23__;
	uint8_t tmp24__;
	uint8_t tmp25__;
	uint8_t tmp26__;
	uint8_t tmp27__;
	uint8_t tmp28__;
	uint8_t tmp29__;
	uint8_t tmp30__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->qos = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->reserved = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	tmp23__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acbe_aifsn = tmp23__ >> 0 & 0xf;
	pDst->acbe_acm = tmp23__ >> 4 & 0x1;
	pDst->acbe_aci = tmp23__ >> 5 & 0x3;
	pDst->unused1 = tmp23__ >> 7 & 0x1;
	tmp24__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acbe_acwmin = tmp24__ >> 0 & 0xf;
	pDst->acbe_acwmax = tmp24__ >> 4 & 0xf;
	framesntohs(pCtx, &pDst->acbe_txoplimit, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	tmp25__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acbk_aifsn = tmp25__ >> 0 & 0xf;
	pDst->acbk_acm = tmp25__ >> 4 & 0x1;
	pDst->acbk_aci = tmp25__ >> 5 & 0x3;
	pDst->unused2 = tmp25__ >> 7 & 0x1;
	tmp26__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acbk_acwmin = tmp26__ >> 0 & 0xf;
	pDst->acbk_acwmax = tmp26__ >> 4 & 0xf;
	framesntohs(pCtx, &pDst->acbk_txoplimit, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	tmp27__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acvi_aifsn = tmp27__ >> 0 & 0xf;
	pDst->acvi_acm = tmp27__ >> 4 & 0x1;
	pDst->acvi_aci = tmp27__ >> 5 & 0x3;
	pDst->unused3 = tmp27__ >> 7 & 0x1;
	tmp28__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acvi_acwmin = tmp28__ >> 0 & 0xf;
	pDst->acvi_acwmax = tmp28__ >> 4 & 0xf;
	framesntohs(pCtx, &pDst->acvi_txoplimit, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	tmp29__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acvo_aifsn = tmp29__ >> 0 & 0xf;
	pDst->acvo_acm = tmp29__ >> 4 & 0x1;
	pDst->acvo_aci = tmp29__ >> 5 & 0x3;
	pDst->unused4 = tmp29__ >> 7 & 0x1;
	tmp30__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acvo_acwmin = tmp30__ >> 0 & 0xf;
	pDst->acvo_acwmax = tmp30__ >> 4 & 0xf;
	framesntohs(pCtx, &pDst->acvo_txoplimit, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_edca_param_set. */

#define SigIeEDCAParamSet (0x0026)


uint32_t dot11f_unpack_ie_erp_info(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint8_t ielen,
				  tDot11fIEERPInfo *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp31__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	tmp31__ = *pBuf;
	pDst->non_erp_present = tmp31__ >> 0 & 0x1;
	pDst->use_prot = tmp31__ >> 1 & 0x1;
	pDst->barker_preamble = tmp31__ >> 2 & 0x1;
	pDst->unused = tmp31__ >> 3 & 0x1f;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_erp_info. */

#define SigIeERPInfo (0x0027)


uint32_t dot11f_unpack_ie_ese_cckm_opaque(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEESECckmOpaque *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_data = (uint8_t)(ielen);
	if (ielen > 20) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->data, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ese_cckm_opaque. */

#define SigIeESECckmOpaque (0x0028)


uint32_t dot11f_unpack_ie_ese_rad_mgmt_cap(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEESERadMgmtCap *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp32__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->mgmt_state = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	tmp32__ = *pBuf;
	pDst->mbssid_mask = tmp32__ >> 0 & 0x7;
	pDst->reserved = tmp32__ >> 3 & 0x1f;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ese_rad_mgmt_cap. */

#define SigIeESERadMgmtCap (0x0029)


uint32_t dot11f_unpack_ie_ese_traf_strm_met(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEESETrafStrmMet *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->tsid = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->state = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	framesntohs(pCtx, &pDst->msmt_interval, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ese_traf_strm_met. */

#define SigIeESETrafStrmMet (0x002a)


uint32_t dot11f_unpack_ie_ese_traf_strm_rate_set(tpAniSirGlobal pCtx,
					     uint8_t *pBuf,
					     uint8_t ielen,
					     tDot11fIEESETrafStrmRateSet *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->tsid = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->num_tsrates = (uint8_t)(ielen);
	if (ielen > 8) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->tsrates, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ese_traf_strm_rate_set. */

#define SigIeESETrafStrmRateSet (0x002b)


uint32_t dot11f_unpack_ie_ese_txmit_power(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEESETxmitPower *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->power_limit = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->reserved = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ese_txmit_power. */

#define SigIeESETxmitPower (0x002c)


uint32_t dot11f_unpack_ie_ese_version(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     uint8_t ielen,
				     tDot11fIEESEVersion *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->version = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ese_version. */

#define SigIeESEVersion (0x002d)


uint32_t dot11f_unpack_ie_ext_cap(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 uint8_t ielen,
				 tDot11fIEExtCap *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;

	if (!ielen) /* Check to ensure copying of ielen bytes */
		goto endUnpackIeExtCap;
	pDst->num_bytes = (uint8_t)(ielen);
	if (ielen > 9) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->bytes, pBuf, (ielen));

endUnpackIeExtCap:
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ext_cap. */

#define SigIeExtCap (0x002e)


uint32_t dot11f_unpack_ie_ext_supp_rates(tpAniSirGlobal pCtx,
				       uint8_t *pBuf,
				       uint8_t ielen,
				       tDot11fIEExtSuppRates *pDst)
{
	uint8_t i;
	uint8_t rate_indx = 0;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	for (i = 0; i < ielen; i++) {
		if ((DOT11F_IS_BG_RATE(pBuf[i] & 0x7F)) &&
			(rate_indx < 12)) {
			pDst->rates[rate_indx++] = pBuf[i];
		}
	}

	if (rate_indx == 0) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	pDst->num_rates = rate_indx;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ext_supp_rates. */

#define SigIeExtSuppRates (0x002f)


uint32_t dot11f_unpack_ie_fh_param_set(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     uint8_t ielen,
				     tDot11fIEFHParamSet *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->dwell_time, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	pDst->hop_set = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->hop_pattern = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->hop_index = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_fh_param_set. */

#define SigIeFHParamSet (0x0030)


uint32_t dot11f_unpack_ie_fh_params(tpAniSirGlobal pCtx,
				   uint8_t *pBuf,
				   uint8_t ielen,
				   tDot11fIEFHParams *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->radix = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->nchannels = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_fh_params. */

#define SigIeFHParams (0x0031)


uint32_t dot11f_unpack_ie_fh_patt_table(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEFHPattTable *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->flag = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->nsets = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->modulus = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->offset = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->num_randtable = (uint8_t)(ielen);
	if (ielen > 251) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->randtable, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_fh_patt_table. */

#define SigIeFHPattTable (0x0032)


static const tFFDefn FFS_FTInfo[] = {
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_FTInfo[] = {
	{ offsetof(tDot11fIEFTInfo, R1KH_ID), offsetof(tDot11fIER1KH_ID, present),
	0, "R1KH_ID", 0, 8, 8, SigIeR1KH_ID, {0, 0, 0, 0, 0},
	0, DOT11F_EID_R1KH_ID, 0, },
	{ offsetof(tDot11fIEFTInfo, GTK), offsetof(tDot11fIEGTK, present), 0, "GTK",
	0, 18, 45, SigIeGTK, {0, 0, 0, 0, 0}, 0, DOT11F_EID_GTK, 0, },
	{ offsetof(tDot11fIEFTInfo, R0KH_ID), offsetof(tDot11fIER0KH_ID, present),
	0, "R0KH_ID", 0, 3, 50, SigIeR0KH_ID, {0, 0, 0, 0, 0},
	0, DOT11F_EID_R0KH_ID, 0, },
	{ offsetof(tDot11fIEFTInfo, IGTK), offsetof(tDot11fIEIGTK, present), 0,
	"IGTK", 0, 35, 35, SigIeIGTK, {0, 0, 0, 0, 0}, 0, DOT11F_EID_IGTK, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },
};

uint32_t dot11f_unpack_ie_ft_info(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 uint8_t ielen,
				 tDot11fIEFTInfo *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint16_t tmp33__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &tmp33__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->reserved = tmp33__ >> 0 & 0xff;
	pDst->IECount = tmp33__ >> 8 & 0xff;
	DOT11F_MEMCPY(pCtx, pDst->MIC, pBuf, 16);
	pBuf += 16;
	ielen -= (uint8_t)16;
	DOT11F_MEMCPY(pCtx, pDst->Anonce, pBuf, 32);
	pBuf += 32;
	ielen -= (uint8_t)32;
	DOT11F_MEMCPY(pCtx, pDst->Snonce, pBuf, 32);
	pBuf += 32;
	ielen -= (uint8_t)32;
	(void)pCtx;
	status |= unpack_core(pCtx,
				pBuf,
				ielen,
				FFS_FTInfo,
				IES_FTInfo,
				(uint8_t *)pDst,
				sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_ft_info. */

#define SigIeFTInfo (0x0033)


uint32_t dot11f_unpack_ie_ht_caps(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 uint8_t ielen,
				 tDot11fIEHTCaps *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint16_t tmp34__;
	uint8_t tmp35__;
	uint16_t tmp36__;
	uint32_t tmp37__;
	uint8_t tmp38__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &tmp34__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->advCodingCap = tmp34__ >> 0 & 0x1;
	pDst->supportedChannelWidthSet = tmp34__ >> 1 & 0x1;
	pDst->mimoPowerSave = tmp34__ >> 2 & 0x3;
	pDst->greenField = tmp34__ >> 4 & 0x1;
	pDst->shortGI20MHz = tmp34__ >> 5 & 0x1;
	pDst->shortGI40MHz = tmp34__ >> 6 & 0x1;
	pDst->txSTBC = tmp34__ >> 7 & 0x1;
	pDst->rxSTBC = tmp34__ >> 8 & 0x3;
	pDst->delayedBA = tmp34__ >> 10 & 0x1;
	pDst->maximalAMSDUsize = tmp34__ >> 11 & 0x1;
	pDst->dsssCckMode40MHz = tmp34__ >> 12 & 0x1;
	pDst->psmp = tmp34__ >> 13 & 0x1;
	pDst->stbcControlFrame = tmp34__ >> 14 & 0x1;
	pDst->lsigTXOPProtection = tmp34__ >> 15 & 0x1;
	tmp35__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->maxRxAMPDUFactor = tmp35__ >> 0 & 0x3;
	pDst->mpduDensity = tmp35__ >> 2 & 0x7;
	pDst->reserved1 = tmp35__ >> 5 & 0x7;
	DOT11F_MEMCPY(pCtx, pDst->supportedMCSSet, pBuf, 16);
	pBuf += 16;
	ielen -= (uint8_t)16;
	framesntohs(pCtx, &tmp36__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->pco = tmp36__ >> 0 & 0x1;
	pDst->transitionTime = tmp36__ >> 1 & 0x3;
	pDst->reserved2 = tmp36__ >> 3 & 0x1f;
	pDst->mcsFeedback = tmp36__ >> 8 & 0x3;
	pDst->reserved3 = tmp36__ >> 10 & 0x3f;
	framesntohl(pCtx, &tmp37__, pBuf, 0);
	pBuf += 4;
	ielen -= 4;
	pDst->txBF = tmp37__ >> 0 & 0x1;
	pDst->rxStaggeredSounding = tmp37__ >> 1 & 0x1;
	pDst->txStaggeredSounding = tmp37__ >> 2 & 0x1;
	pDst->rxZLF = tmp37__ >> 3 & 0x1;
	pDst->txZLF = tmp37__ >> 4 & 0x1;
	pDst->implicitTxBF = tmp37__ >> 5 & 0x1;
	pDst->calibration = tmp37__ >> 6 & 0x3;
	pDst->explicitCSITxBF = tmp37__ >> 8 & 0x1;
	pDst->explicitUncompressedSteeringMatrix = tmp37__ >> 9 & 0x1;
	pDst->explicitBFCSIFeedback = tmp37__ >> 10 & 0x7;
	pDst->explicitUncompressedSteeringMatrixFeedback = tmp37__ >> 13 & 0x7;
	pDst->explicitCompressedSteeringMatrixFeedback = tmp37__ >> 16 & 0x7;
	pDst->csiNumBFAntennae = tmp37__ >> 19 & 0x3;
	pDst->uncompressedSteeringMatrixBFAntennae = tmp37__ >> 21 & 0x3;
	pDst->compressedSteeringMatrixBFAntennae = tmp37__ >> 23 & 0x3;
	pDst->reserved4 = tmp37__ >> 25 & 0x7f;
	tmp38__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->antennaSelection = tmp38__ >> 0 & 0x1;
	pDst->explicitCSIFeedbackTx = tmp38__ >> 1 & 0x1;
	pDst->antennaIndicesFeedbackTx = tmp38__ >> 2 & 0x1;
	pDst->explicitCSIFeedback = tmp38__ >> 3 & 0x1;
	pDst->antennaIndicesFeedback = tmp38__ >> 4 & 0x1;
	pDst->rxAS = tmp38__ >> 5 & 0x1;
	pDst->txSoundingPPDUs = tmp38__ >> 6 & 0x1;
	pDst->reserved5 = tmp38__ >> 7 & 0x1;
	pDst->num_rsvd = (uint8_t)(ielen);
	if (ielen > 32) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->rsvd, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ht_caps. */

#define SigIeHTCaps (0x0034)


uint32_t dot11f_unpack_ie_ht_info(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 uint8_t ielen,
				 tDot11fIEHTInfo *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp39__;
	uint16_t tmp40__;
	uint16_t tmp41__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->primaryChannel = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	tmp39__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->secondaryChannelOffset = tmp39__ >> 0 & 0x3;
	pDst->recommendedTxWidthSet = tmp39__ >> 2 & 0x1;
	pDst->rifsMode = tmp39__ >> 3 & 0x1;
	pDst->controlledAccessOnly = tmp39__ >> 4 & 0x1;
	pDst->serviceIntervalGranularity = tmp39__ >> 5 & 0x7;
	framesntohs(pCtx, &tmp40__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->opMode = tmp40__ >> 0 & 0x3;
	pDst->nonGFDevicesPresent = tmp40__ >> 2 & 0x1;
	pDst->transmitBurstLimit = tmp40__ >> 3 & 0x1;
	pDst->obssNonHTStaPresent = tmp40__ >> 4 & 0x1;
	pDst->reserved = tmp40__ >> 5 & 0x7ff;
	framesntohs(pCtx, &tmp41__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->basicSTBCMCS = tmp41__ >> 0 & 0x7f;
	pDst->dualCTSProtection = tmp41__ >> 7 & 0x1;
	pDst->secondaryBeacon = tmp41__ >> 8 & 0x1;
	pDst->lsigTXOPProtectionFullSupport = tmp41__ >> 9 & 0x1;
	pDst->pcoActive = tmp41__ >> 10 & 0x1;
	pDst->pcoPhase = tmp41__ >> 11 & 0x1;
	pDst->reserved2 = tmp41__ >> 12 & 0xf;
	DOT11F_MEMCPY(pCtx, pDst->basicMCSSet, pBuf, 16);
	pBuf += 16;
	ielen -= (uint8_t)16;
	pDst->num_rsvd = (uint8_t)(ielen);
	if (ielen > 32) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->rsvd, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ht_info. */

#define SigIeHTInfo (0x0035)


uint32_t dot11f_unpack_ie_ibss_params(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     uint8_t ielen,
				     tDot11fIEIBSSParams *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->atim, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ibss_params. */

#define SigIeIBSSParams (0x0036)


uint32_t dot11f_unpack_ie_link_identifier(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIELinkIdentifier *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->bssid, pBuf, 6);
	pBuf += 6;
	ielen -= (uint8_t)6;
	DOT11F_MEMCPY(pCtx, pDst->InitStaAddr, pBuf, 6);
	pBuf += 6;
	ielen -= (uint8_t)6;
	DOT11F_MEMCPY(pCtx, pDst->RespStaAddr, pBuf, 6);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_link_identifier. */

#define SigIeLinkIdentifier (0x0037)


static const tFFDefn FFS_reportBeacon[] = {
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_reportBeacon[] = {
	{ offsetof(tDot11fIEMeasurementReport,
	report.Beacon.BeaconReportFrmBody),
	offsetof(tDot11fIEBeaconReportFrmBody, present), 0, "BeaconReportFrmBody",
	0, 2, 226, SigIeBeaconReportFrmBody, {0, 0, 0, 0, 0},
	0, DOT11F_EID_BEACONREPORTFRMBODY, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },
};

uint32_t dot11f_unpack_ie_measurement_report(tpAniSirGlobal pCtx,
					    uint8_t *pBuf,
					    uint8_t ielen,
					    tDot11fIEMeasurementReport *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp42__;
	uint8_t tmp43__;
	uint8_t tmp44__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->token = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	tmp42__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->late = tmp42__ >> 0 & 0x1;
	pDst->incapable = tmp42__ >> 1 & 0x1;
	pDst->refused = tmp42__ >> 2 & 0x1;
	pDst->unused = tmp42__ >> 3 & 0x1f;
	pDst->type = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	if (!ielen) {
		return 0U;
	} else {
		switch (pDst->type) {
		case 0:
			pDst->report.Basic.channel = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			framesntohq(pCtx, &pDst->report.Basic.meas_start_time, pBuf, 0);
			pBuf += 8;
			ielen -= (uint8_t)8;
			framesntohs(pCtx, &pDst->report.Basic.meas_duration, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			tmp43__ = *pBuf;
			pBuf += 1;
			ielen -= 1;
			pDst->report.Basic.bss = tmp43__ >> 0 & 0x1;
			pDst->report.Basic.ofdm_preamble = tmp43__ >> 1 & 0x1;
			pDst->report.Basic.unid_signal = tmp43__ >> 2 & 0x1;
			pDst->report.Basic.rader = tmp43__ >> 3 & 0x1;
			pDst->report.Basic.unmeasured = tmp43__ >> 4 & 0x1;
			pDst->report.Basic.unused = tmp43__ >> 5 & 0x7;
			break;
		case 1:
			pDst->report.CCA.channel = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			framesntohq(pCtx, &pDst->report.CCA.meas_start_time, pBuf, 0);
			pBuf += 8;
			ielen -= (uint8_t)8;
			framesntohs(pCtx, &pDst->report.CCA.meas_duration, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			pDst->report.CCA.cca_busy_fraction = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			break;
		case 2:
			pDst->report.RPIHistogram.channel = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			framesntohq(pCtx, &pDst->report.RPIHistogram.meas_start_time, pBuf, 0);
			pBuf += 8;
			ielen -= (uint8_t)8;
			framesntohs(pCtx, &pDst->report.RPIHistogram.meas_duration, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			pDst->report.RPIHistogram.rpi0_density = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->report.RPIHistogram.rpi1_density = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->report.RPIHistogram.rpi2_density = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->report.RPIHistogram.rpi3_density = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->report.RPIHistogram.rpi4_density = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->report.RPIHistogram.rpi5_density = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->report.RPIHistogram.rpi6_density = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->report.RPIHistogram.rpi7_density = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			break;
		case 5:
			pDst->report.Beacon.regClass = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->report.Beacon.channel = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			framesntohq(pCtx, &pDst->report.Beacon.meas_start_time, pBuf, 0);
			pBuf += 8;
			ielen -= (uint8_t)8;
			framesntohs(pCtx, &pDst->report.Beacon.meas_duration, pBuf, 0);
			pBuf += 2;
			ielen -= (uint8_t)2;
			tmp44__ = *pBuf;
			pBuf += 1;
			ielen -= 1;
			pDst->report.Beacon.condensed_PHY = tmp44__ >> 0 & 0x7f;
			pDst->report.Beacon.reported_frame_type = tmp44__ >> 7 & 0x1;
			pDst->report.Beacon.RCPI = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			pDst->report.Beacon.RSNI = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			DOT11F_MEMCPY(pCtx, pDst->report.Beacon.BSSID, pBuf, 6);
			pBuf += 6;
			ielen -= (uint8_t)6;
			pDst->report.Beacon.antenna_id = *pBuf;
			pBuf += 1;
			ielen -= (uint8_t)1;
			framesntohl(pCtx, &pDst->report.Beacon.parent_TSF, pBuf, 0);
			pBuf += 4;
			ielen -= (uint8_t)4;
			status |= unpack_core(pCtx,
				pBuf,
				ielen,
				FFS_reportBeacon,
				IES_reportBeacon,
				(uint8_t *)pDst,
				sizeof(*pDst));
			break;
		}
	}
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_measurement_report. */

#define SigIeMeasurementReport (0x0038)


static const tFFDefn FFS_measurement_requestBeacon[] = {
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_measurement_requestBeacon[] = {
	{ offsetof(tDot11fIEMeasurementRequest,
	measurement_request.Beacon.SSID), offsetof(tDot11fIESSID, present), 0,
	"SSID", 0, 2, 34, SigIeSSID, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SSID, 0, },
	{ offsetof(tDot11fIEMeasurementRequest,
	measurement_request.Beacon.BeaconReporting),
	offsetof(tDot11fIEBeaconReporting, present), 0, "BeaconReporting",
	0, 4, 4, SigIeBeaconReporting, {0, 0, 0, 0, 0},
	0, DOT11F_EID_BEACONREPORTING, 0, },
	{ offsetof(tDot11fIEMeasurementRequest,
	measurement_request.Beacon.BcnReportingDetail),
	offsetof(tDot11fIEBcnReportingDetail, present), 0, "BcnReportingDetail",
	0, 3, 3, SigIeBcnReportingDetail, {0, 0, 0, 0, 0},
	0, DOT11F_EID_BCNREPORTINGDETAIL, 0, },
	{ offsetof(tDot11fIEMeasurementRequest,
	measurement_request.Beacon.RequestedInfo),
	offsetof(tDot11fIERequestedInfo, present), 0, "RequestedInfo",
	0, 2, 257, SigIeRequestedInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_REQUESTEDINFO, 0, },
	{ offsetof(tDot11fIEMeasurementRequest,
	measurement_request.Beacon.APChannelReport),
	offsetof(tDot11fIEAPChannelReport, present),
	offsetof(tDot11fIEMeasurementRequest, measurement_request.Beacon.num_APChannelReport), "APChannelReport", 2, 3, 53, SigIeAPChannelReport, {0, 0, 0, 0, 0}, 0, DOT11F_EID_APCHANNELREPORT, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },
};

uint32_t dot11f_unpack_ie_measurement_request(tpAniSirGlobal pCtx,
					     uint8_t *pBuf,
					     uint8_t ielen,
					     tDot11fIEMeasurementRequest *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp45__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->measurement_token = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	tmp45__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->parallel = tmp45__ >> 0 & 0x1;
	pDst->enable = tmp45__ >> 1 & 0x1;
	pDst->request = tmp45__ >> 2 & 0x1;
	pDst->report = tmp45__ >> 3 & 0x1;
	pDst->durationMandatory = tmp45__ >> 4 & 0x1;
	pDst->unused = tmp45__ >> 5 & 0x7;
	pDst->measurement_type = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	switch (pDst->measurement_type) {
	case 0:
		pDst->measurement_request.Basic.channel_no = *pBuf;
		pBuf += 1;
		ielen -= (uint8_t)1;
		DOT11F_MEMCPY(pCtx, pDst->measurement_request.Basic.meas_start_time, pBuf, 8);
		pBuf += 8;
		ielen -= (uint8_t)8;
		framesntohs(pCtx, &pDst->measurement_request.Basic.meas_duration, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
		break;
	case 1:
		pDst->measurement_request.CCA.channel_no = *pBuf;
		pBuf += 1;
		ielen -= (uint8_t)1;
		DOT11F_MEMCPY(pCtx, pDst->measurement_request.CCA.meas_start_time, pBuf, 8);
		pBuf += 8;
		ielen -= (uint8_t)8;
		framesntohs(pCtx, &pDst->measurement_request.CCA.meas_duration, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
		break;
	case 2:
		pDst->measurement_request.RPIHistogram.channel_no = *pBuf;
		pBuf += 1;
		ielen -= (uint8_t)1;
		DOT11F_MEMCPY(pCtx, pDst->measurement_request.RPIHistogram.meas_start_time, pBuf, 8);
		pBuf += 8;
		ielen -= (uint8_t)8;
		framesntohs(pCtx, &pDst->measurement_request.RPIHistogram.meas_duration, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
		break;
	case 5:
		pDst->measurement_request.Beacon.regClass = *pBuf;
		pBuf += 1;
		ielen -= (uint8_t)1;
		pDst->measurement_request.Beacon.channel = *pBuf;
		pBuf += 1;
		ielen -= (uint8_t)1;
		framesntohs(pCtx, &pDst->measurement_request.Beacon.randomization, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
		framesntohs(pCtx, &pDst->measurement_request.Beacon.meas_duration, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
		pDst->measurement_request.Beacon.meas_mode = *pBuf;
		pBuf += 1;
		ielen -= (uint8_t)1;
		DOT11F_MEMCPY(pCtx, pDst->measurement_request.Beacon.BSSID, pBuf, 6);
		pBuf += 6;
		ielen -= (uint8_t)6;
		status |= unpack_core(pCtx,
				pBuf,
				ielen,
				FFS_measurement_requestBeacon,
				IES_measurement_requestBeacon,
				(uint8_t *)pDst,
				sizeof(*pDst));
		break;
	}
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_measurement_request. */

#define SigIeMeasurementRequest (0x0039)


uint32_t dot11f_unpack_ie_mobility_domain(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEMobilityDomain *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp46__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->MDID, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	tmp46__ = *pBuf;
	pDst->overDSCap = tmp46__ >> 0 & 0x1;
	pDst->resourceReqCap = tmp46__ >> 1 & 0x1;
	pDst->reserved = tmp46__ >> 2 & 0x3f;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_mobility_domain. */

#define SigIeMobilityDomain (0x003a)


static const tFFDefn FFS_NeighborReport[] = {
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_NeighborReport[] = {
	{ offsetof(tDot11fIENeighborReport, TSFInfo), offsetof(tDot11fIETSFInfo,
	present), 0, "TSFInfo", 0, 6, 6, SigIeTSFInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TSFINFO, 0, },
	{ offsetof(tDot11fIENeighborReport, CondensedCountryStr),
	offsetof(tDot11fIECondensedCountryStr, present), 0, "CondensedCountryStr",
	0, 4, 4, SigIeCondensedCountryStr, {0, 0, 0, 0, 0},
	0, DOT11F_EID_CONDENSEDCOUNTRYSTR, 0, },
	{ offsetof(tDot11fIENeighborReport, MeasurementPilot),
	offsetof(tDot11fIEMeasurementPilot, present), 0, "MeasurementPilot",
	0, 3, 258, SigIeMeasurementPilot, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MEASUREMENTPILOT, 0, },
	{ offsetof(tDot11fIENeighborReport, RRMEnabledCap),
	offsetof(tDot11fIERRMEnabledCap, present), 0, "RRMEnabledCap",
	0, 7, 7, SigIeRRMEnabledCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RRMENABLEDCAP, 0, },
	{ offsetof(tDot11fIENeighborReport, MultiBssid),
	offsetof(tDot11fIEMultiBssid, present), 0, "MultiBssid",
	0, 3, 258, SigIeMultiBssid, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MULTIBSSID, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },
};

uint32_t dot11f_unpack_ie_neighbor_report(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIENeighborReport *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp47__;
	uint8_t tmp48__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	DOT11F_MEMCPY(pCtx, pDst->bssid, pBuf, 6);
	pBuf += 6;
	ielen -= (uint8_t)6;
	tmp47__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->APReachability = tmp47__ >> 0 & 0x3;
	pDst->Security = tmp47__ >> 2 & 0x1;
	pDst->KeyScope = tmp47__ >> 3 & 0x1;
	pDst->SpecMgmtCap = tmp47__ >> 4 & 0x1;
	pDst->QosCap = tmp47__ >> 5 & 0x1;
	pDst->apsd = tmp47__ >> 6 & 0x1;
	pDst->rrm = tmp47__ >> 7 & 0x1;
	tmp48__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->DelayedBA = tmp48__ >> 0 & 0x1;
	pDst->ImmBA = tmp48__ >> 1 & 0x1;
	pDst->MobilityDomain = tmp48__ >> 2 & 0x1;
	pDst->reserved = tmp48__ >> 3 & 0x1f;
	framesntohs(pCtx, &pDst->reserved1, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	pDst->regulatoryClass = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->channel = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->PhyType = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	(void)pCtx;
	status |= unpack_core(pCtx,
				pBuf,
				ielen,
				FFS_NeighborReport,
				IES_NeighborReport,
				(uint8_t *)pDst,
				sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_neighbor_report. */

#define SigIeNeighborReport (0x003b)


uint32_t dot11f_unpack_ie_obss_scan_parameters(tpAniSirGlobal pCtx,
					     uint8_t *pBuf,
					     uint8_t ielen,
					     tDot11fIEOBSSScanParameters *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->obssScanPassiveDwell, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->obssScanActiveDwell, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->bssChannelWidthTriggerScanInterval, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->obssScanPassiveTotalPerChannel, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->obssScanActiveTotalPerChannel, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->bssWidthChannelTransitionDelayFactor, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->obssScanActivityThreshold, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_obss_scan_parameters. */

#define SigIeOBSSScanParameters (0x003c)


uint32_t dot11f_unpack_ie_operating_mode(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEOperatingMode *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp49__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	tmp49__ = *pBuf;
	pDst->chanWidth = tmp49__ >> 0 & 0x3;
	pDst->reserved = tmp49__ >> 2 & 0x3;
	pDst->rxNSS = tmp49__ >> 4 & 0x7;
	pDst->rxNSSType = tmp49__ >> 7 & 0x1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_operating_mode. */

#define SigIeOperatingMode (0x003d)


static const tTLVDefn TLVS_P2PAssocReq[] = {
	{ offsetof(tDot11fIEP2PAssocReq, P2PCapability),
	offsetof(tDot11fTLVP2PCapability, present), "P2PCapability",
	SigTlvP2PCapability, DOT11F_TLV_P2PCAPABILITY, 0, 5, 5, 1, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PAssocReq, ExtendedListenTiming),
	offsetof(tDot11fTLVExtendedListenTiming, present),
	"ExtendedListenTiming", SigTlvExtendedListenTiming,
	DOT11F_TLV_EXTENDEDLISTENTIMING, 0, 7, 7, 0, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PAssocReq, P2PDeviceInfo),
	offsetof(tDot11fTLVP2PDeviceInfo, present), "P2PDeviceInfo",
	SigTlvP2PDeviceInfo, DOT11F_TLV_P2PDEVICEINFO, 0, 19, 55, 1, 1, 2, 0, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_p2_p_assoc_req(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEP2PAssocReq *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_P2PAssocReq,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_p2_p_assoc_req. */

#define SigIeP2PAssocReq (0x003e)


static const tTLVDefn TLVS_P2PAssocRes[] = {
	{ offsetof(tDot11fIEP2PAssocRes, P2PStatus),
	offsetof(tDot11fTLVP2PStatus, present), "P2PStatus", SigTlvP2PStatus,
	DOT11F_TLV_P2PSTATUS, 0, 4, 4, 1, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PAssocRes, ExtendedListenTiming),
	offsetof(tDot11fTLVExtendedListenTiming, present),
	"ExtendedListenTiming", SigTlvExtendedListenTiming,
	DOT11F_TLV_EXTENDEDLISTENTIMING, 0, 7, 7, 0, 1, 2, 0, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_p2_p_assoc_res(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEP2PAssocRes *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_P2PAssocRes,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_p2_p_assoc_res. */

#define SigIeP2PAssocRes (0x003f)


static const tTLVDefn TLVS_P2PBeacon[] = {
	{ offsetof(tDot11fIEP2PBeacon, P2PCapability),
	offsetof(tDot11fTLVP2PCapability, present), "P2PCapability",
	SigTlvP2PCapability, DOT11F_TLV_P2PCAPABILITY, 0, 5, 5, 1, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PBeacon, P2PDeviceId),
	offsetof(tDot11fTLVP2PDeviceId, present), "P2PDeviceId",
	SigTlvP2PDeviceId, DOT11F_TLV_P2PDEVICEID, 0, 9, 9, 1, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PBeacon, NoticeOfAbsence),
	offsetof(tDot11fTLVNoticeOfAbsence, present), "NoticeOfAbsence",
	SigTlvNoticeOfAbsence, DOT11F_TLV_NOTICEOFABSENCE,
	0, 5, 41, 0, 1, 2, 0, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_p2_p_beacon(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEP2PBeacon *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_P2PBeacon,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_p2_p_beacon. */

#define SigIeP2PBeacon (0x0040)


static const tTLVDefn TLVS_P2PBeaconProbeRes[] = {
	{ offsetof(tDot11fIEP2PBeaconProbeRes, P2PCapability),
	offsetof(tDot11fTLVP2PCapability, present), "P2PCapability",
	SigTlvP2PCapability, DOT11F_TLV_P2PCAPABILITY, 0, 5, 5, 0, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PBeaconProbeRes, P2PDeviceId),
	offsetof(tDot11fTLVP2PDeviceId, present), "P2PDeviceId",
	SigTlvP2PDeviceId, DOT11F_TLV_P2PDEVICEID, 0, 9, 9, 0, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PBeaconProbeRes, ExtendedListenTiming),
	offsetof(tDot11fTLVExtendedListenTiming, present),
	"ExtendedListenTiming", SigTlvExtendedListenTiming,
	DOT11F_TLV_EXTENDEDLISTENTIMING, 0, 7, 7, 0, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PBeaconProbeRes, NoticeOfAbsence),
	offsetof(tDot11fTLVNoticeOfAbsence, present), "NoticeOfAbsence",
	SigTlvNoticeOfAbsence, DOT11F_TLV_NOTICEOFABSENCE,
	0, 5, 41, 0, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PBeaconProbeRes, P2PDeviceInfo),
	offsetof(tDot11fTLVP2PDeviceInfo, present), "P2PDeviceInfo",
	SigTlvP2PDeviceInfo, DOT11F_TLV_P2PDEVICEINFO, 0, 19, 55, 0, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PBeaconProbeRes, P2PGroupInfo),
	offsetof(tDot11fTLVP2PGroupInfo, present), "P2PGroupInfo",
	SigTlvP2PGroupInfo, DOT11F_TLV_P2PGROUPINFO, 0, 3, 1027, 0, 1, 2, 0, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_p2_p_beacon_probe_res(tpAniSirGlobal pCtx,
					    uint8_t *pBuf,
					    uint8_t ielen,
					    tDot11fIEP2PBeaconProbeRes *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_P2PBeaconProbeRes,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_p2_p_beacon_probe_res. */

#define SigIeP2PBeaconProbeRes (0x0041)


static const tTLVDefn TLVS_P2PDeAuth[] = {
	{ offsetof(tDot11fIEP2PDeAuth, MinorReasonCode),
	offsetof(tDot11fTLVMinorReasonCode, present), "MinorReasonCode",
	SigTlvMinorReasonCode, DOT11F_TLV_MINORREASONCODE,
	0, 4, 4, 1, 1, 2, 0, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_p2_p_de_auth(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEP2PDeAuth *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_P2PDeAuth,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_p2_p_de_auth. */

#define SigIeP2PDeAuth (0x0042)


static const tTLVDefn TLVS_P2PDisAssoc[] = {
	{ offsetof(tDot11fIEP2PDisAssoc, MinorReasonCode),
	offsetof(tDot11fTLVMinorReasonCode, present), "MinorReasonCode",
	SigTlvMinorReasonCode, DOT11F_TLV_MINORREASONCODE,
	0, 4, 4, 1, 1, 2, 0, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_p2_p_dis_assoc(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEP2PDisAssoc *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_P2PDisAssoc,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_p2_p_dis_assoc. */

#define SigIeP2PDisAssoc (0x0043)


uint32_t dot11f_unpack_ie_p2_pie_opaque(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEP2PIEOpaque *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_data = (uint8_t)(ielen);
	if (ielen > 249) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->data, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_p2_pie_opaque. */

#define SigIeP2PIEOpaque (0x0044)


static const tTLVDefn TLVS_P2PProbeReq[] = {
	{ offsetof(tDot11fIEP2PProbeReq, P2PCapability),
	offsetof(tDot11fTLVP2PCapability, present), "P2PCapability",
	SigTlvP2PCapability, DOT11F_TLV_P2PCAPABILITY, 0, 5, 5, 1, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PProbeReq, P2PDeviceId),
	offsetof(tDot11fTLVP2PDeviceId, present), "P2PDeviceId",
	SigTlvP2PDeviceId, DOT11F_TLV_P2PDEVICEID, 0, 9, 9, 0, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PProbeReq, ListenChannel),
	offsetof(tDot11fTLVListenChannel, present), "ListenChannel",
	SigTlvListenChannel, DOT11F_TLV_LISTENCHANNEL, 0, 8, 8, 1, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PProbeReq, ExtendedListenTiming),
	offsetof(tDot11fTLVExtendedListenTiming, present),
	"ExtendedListenTiming", SigTlvExtendedListenTiming,
	DOT11F_TLV_EXTENDEDLISTENTIMING, 0, 7, 7, 0, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PProbeReq, OperatingChannel),
	offsetof(tDot11fTLVOperatingChannel, present), "OperatingChannel",
	SigTlvOperatingChannel, DOT11F_TLV_OPERATINGCHANNEL,
	0, 8, 8, 0, 1, 2, 0, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_p2_p_probe_req(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEP2PProbeReq *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_P2PProbeReq,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_p2_p_probe_req. */

#define SigIeP2PProbeReq (0x0045)


static const tTLVDefn TLVS_P2PProbeRes[] = {
	{ offsetof(tDot11fIEP2PProbeRes, P2PCapability),
	offsetof(tDot11fTLVP2PCapability, present), "P2PCapability",
	SigTlvP2PCapability, DOT11F_TLV_P2PCAPABILITY, 0, 5, 5, 1, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PProbeRes, ExtendedListenTiming),
	offsetof(tDot11fTLVExtendedListenTiming, present),
	"ExtendedListenTiming", SigTlvExtendedListenTiming,
	DOT11F_TLV_EXTENDEDLISTENTIMING, 0, 7, 7, 0, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PProbeRes, NoticeOfAbsence),
	offsetof(tDot11fTLVNoticeOfAbsence, present), "NoticeOfAbsence",
	SigTlvNoticeOfAbsence, DOT11F_TLV_NOTICEOFABSENCE,
	0, 5, 41, 0, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PProbeRes, P2PDeviceInfo),
	offsetof(tDot11fTLVP2PDeviceInfo, present), "P2PDeviceInfo",
	SigTlvP2PDeviceInfo, DOT11F_TLV_P2PDEVICEINFO, 0, 19, 55, 1, 1, 2, 0, },
	{ offsetof(tDot11fIEP2PProbeRes, P2PGroupInfo),
	offsetof(tDot11fTLVP2PGroupInfo, present), "P2PGroupInfo",
	SigTlvP2PGroupInfo, DOT11F_TLV_P2PGROUPINFO, 0, 3, 1027, 0, 1, 2, 0, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_p2_p_probe_res(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEP2PProbeRes *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_P2PProbeRes,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_p2_p_probe_res. */

#define SigIeP2PProbeRes (0x0046)


uint32_t dot11f_unpack_ie_pti_control(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     uint8_t ielen,
				     tDot11fIEPTIControl *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->tid = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	framesntohs(pCtx, &pDst->sequence_control, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_pti_control. */

#define SigIePTIControl (0x0047)


uint32_t dot11f_unpack_ie_pu_buffer_status(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEPUBufferStatus *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp50__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	tmp50__ = *pBuf;
	pDst->ac_bk_traffic_aval = tmp50__ >> 0 & 0x1;
	pDst->ac_be_traffic_aval = tmp50__ >> 1 & 0x1;
	pDst->ac_vi_traffic_aval = tmp50__ >> 2 & 0x1;
	pDst->ac_vo_traffic_aval = tmp50__ >> 3 & 0x1;
	pDst->reserved = tmp50__ >> 4 & 0xf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_pu_buffer_status. */

#define SigIePUBufferStatus (0x0048)


uint32_t dot11f_unpack_ie_power_caps(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEPowerCaps *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->minTxPower = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->maxTxPower = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_power_caps. */

#define SigIePowerCaps (0x0049)


uint32_t dot11f_unpack_ie_power_constraints(tpAniSirGlobal pCtx,
					   uint8_t *pBuf,
					   uint8_t ielen,
					   tDot11fIEPowerConstraints *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->localPowerConstraints = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_power_constraints. */

#define SigIePowerConstraints (0x004a)


uint32_t dot11f_unpack_ie_qbss_load(tpAniSirGlobal pCtx,
				   uint8_t *pBuf,
				   uint8_t ielen,
				   tDot11fIEQBSSLoad *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->stacount, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	pDst->chautil = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	framesntohs(pCtx, &pDst->avail, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_qbss_load. */

#define SigIeQBSSLoad (0x004b)


uint32_t dot11f_unpack_ie_QComVendorIE(tpAniSirGlobal pCtx,
				       uint8_t *pBuf,
				       uint8_t ielen,
				       tDot11fIEQComVendorIE *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->type = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->channel = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_QComVendorIE. */

#define SigIeQComVendorIE (0x004c)


uint32_t dot11f_unpack_ie_qos_caps_ap(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEQOSCapsAp *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp51__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	tmp51__ = *pBuf;
	pDst->count = tmp51__ >> 0 & 0xf;
	pDst->qack = tmp51__ >> 4 & 0x1;
	pDst->qreq = tmp51__ >> 5 & 0x1;
	pDst->txopreq = tmp51__ >> 6 & 0x1;
	pDst->reserved = tmp51__ >> 7 & 0x1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_qos_caps_ap. */

#define SigIeQOSCapsAp (0x004d)


uint32_t dot11f_unpack_ie_qos_caps_station(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEQOSCapsStation *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp52__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	tmp52__ = *pBuf;
	pDst->acvo_uapsd = tmp52__ >> 0 & 0x1;
	pDst->acvi_uapsd = tmp52__ >> 1 & 0x1;
	pDst->acbk_uapsd = tmp52__ >> 2 & 0x1;
	pDst->acbe_uapsd = tmp52__ >> 3 & 0x1;
	pDst->qack = tmp52__ >> 4 & 0x1;
	pDst->max_sp_length = tmp52__ >> 5 & 0x3;
	pDst->more_data_ack = tmp52__ >> 7 & 0x1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_qos_caps_station. */

#define SigIeQOSCapsStation (0x004e)


uint32_t dot11f_unpack_ie_qos_map_set(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEQosMapSet *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_dscp_exceptions = (uint8_t)(ielen);
	if (ielen > 60) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->dscp_exceptions, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_qos_map_set. */

#define SigIeQosMapSet (0x004f)


uint32_t dot11f_unpack_ie_quiet(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 uint8_t ielen,
				 tDot11fIEQuiet *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->count = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->period = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	framesntohs(pCtx, &pDst->duration, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	framesntohs(pCtx, &pDst->offset, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_quiet. */

#define SigIeQuiet (0x0050)


uint32_t dot11f_unpack_ie_rcpiie(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 uint8_t ielen,
				 tDot11fIERCPIIE *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->rcpi = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_rcpiie. */

#define SigIeRCPIIE (0x0051)


static const tFFDefn FFS_RICDataDesc[] = {
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_RICDataDesc[] = {
	{ offsetof(tDot11fIERICDataDesc, RICData), offsetof(tDot11fIERICData,
	present), 0, "RICData", 0, 6, 6, SigIeRICData, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RICDATA, 1, },
	{ offsetof(tDot11fIERICDataDesc, RICDescriptor),
	offsetof(tDot11fIERICDescriptor, present), 0, "RICDescriptor",
	0, 3, 258, SigIeRICDescriptor, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RICDESCRIPTOR, 0, },
	{ offsetof(tDot11fIERICDataDesc, TSPEC), offsetof(tDot11fIETSPEC,
	present), 0, "TSPEC", 0, 57, 57, SigIeTSPEC, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TSPEC, 0, },
	{ offsetof(tDot11fIERICDataDesc, TCLAS), offsetof(tDot11fIETCLAS,
	present), offsetof(tDot11fIERICDataDesc, num_TCLAS), "TCLAS",
	2, 7, 45, SigIeTCLAS, {0, 0, 0, 0, 0}, 0, DOT11F_EID_TCLAS, 0, },
	{ offsetof(tDot11fIERICDataDesc, TCLASSPROC),
	offsetof(tDot11fIETCLASSPROC, present), 0, "TCLASSPROC",
	0, 3, 3, SigIeTCLASSPROC, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TCLASSPROC, 0, },
	{ offsetof(tDot11fIERICDataDesc, TSDelay), offsetof(tDot11fIETSDelay,
	present), 0, "TSDelay", 0, 6, 6, SigIeTSDelay, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TSDELAY, 0, },
	{ offsetof(tDot11fIERICDataDesc, Schedule), offsetof(tDot11fIESchedule,
	present), 0, "Schedule", 0, 16, 16, SigIeSchedule, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SCHEDULE, 0, },
	{ offsetof(tDot11fIERICDataDesc, WMMTSPEC), offsetof(tDot11fIEWMMTSPEC,
	present), 0, "WMMTSPEC", 0, 63, 63, SigIeWMMTSPEC, {0, 80, 242, 2, 2},
	5, DOT11F_EID_WMMTSPEC, 0, },
	{ offsetof(tDot11fIERICDataDesc, WMMTCLAS), offsetof(tDot11fIEWMMTCLAS,
	present), offsetof(tDot11fIERICDataDesc, num_WMMTCLAS), "WMMTCLAS",
	2, 13, 51, SigIeWMMTCLAS, {0, 80, 242, 2, 6},
	5, DOT11F_EID_WMMTCLAS, 0, },
	{ offsetof(tDot11fIERICDataDesc, WMMTCLASPROC),
	offsetof(tDot11fIEWMMTCLASPROC, present), 0, "WMMTCLASPROC",
	0, 9, 9, SigIeWMMTCLASPROC, {0, 80, 242, 2, 7},
	5, DOT11F_EID_WMMTCLASPROC, 0, },
	{ offsetof(tDot11fIERICDataDesc, WMMTSDelay),
	offsetof(tDot11fIEWMMTSDelay, present), 0, "WMMTSDelay",
	0, 12, 12, SigIeWMMTSDelay, {0, 80, 242, 2, 8},
	5, DOT11F_EID_WMMTSDELAY, 0, },
	{ offsetof(tDot11fIERICDataDesc, WMMSchedule),
	offsetof(tDot11fIEWMMSchedule, present), 0, "WMMSchedule",
	0, 22, 22, SigIeWMMSchedule, {0, 80, 242, 2, 9},
	5, DOT11F_EID_WMMSCHEDULE, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },
};

uint32_t dot11f_unpack_ie_ric_data_desc(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIERICDataDesc *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	(void)pCtx;
	status |= unpack_core(pCtx,
				pBuf,
				ielen,
				FFS_RICDataDesc,
				IES_RICDataDesc,
				(uint8_t *)pDst,
				sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_ric_data_desc. */

#define SigIeRICDataDesc (0x0052)


uint32_t dot11f_unpack_ie_rsn(tpAniSirGlobal pCtx,
			      uint8_t *pBuf,
			      uint8_t ielen,
			      tDot11fIERSN *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->version, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	if (pDst->version != 0x1) {
		pDst->present = 0;
		return status | DOT11F_BAD_FIXED_VALUE;
	}
	DOT11F_MEMCPY(pCtx, pDst->gp_cipher_suite, pBuf, 4);
	pBuf += 4;
	ielen -= (uint8_t)4;
	if (!ielen) {
		pDst->pwise_cipher_suite_count = 0U;
		pDst->akm_suite_count = 0U;
		pDst->pmkid_count = 0U;
		return 0U;
	} else {
		framesntohs(pCtx, &pDst->pwise_cipher_suite_count, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
	}
	if (pDst->pwise_cipher_suite_count > 4) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->pwise_cipher_suites, pBuf, (pDst->pwise_cipher_suite_count * 4));
	pBuf += (pDst->pwise_cipher_suite_count * 4);
	ielen -= (pDst->pwise_cipher_suite_count * 4);
	if (!ielen) {
		pDst->akm_suite_count = 0U;
		pDst->pmkid_count = 0U;
		return 0U;
	} else {
		framesntohs(pCtx, &pDst->akm_suite_count, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
	}
	if (pDst->akm_suite_count > 4) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->akm_suites, pBuf, (pDst->akm_suite_count * 4));
	pBuf += (pDst->akm_suite_count * 4);
	ielen -= (pDst->akm_suite_count * 4);
	if (!ielen) {
		pDst->pmkid_count = 0U;
		return 0U;
	} else {
		DOT11F_MEMCPY(pCtx, pDst->RSN_Cap, pBuf, 2);
		pBuf += 2;
		ielen -= (uint8_t)2;
	}
	if (!ielen) {
		pDst->pmkid_count = 0U;
		return 0U;
	} else {
		framesntohs(pCtx, &pDst->pmkid_count, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
	}
	if (pDst->pmkid_count > 4) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->pmkid, pBuf, (pDst->pmkid_count * 16));
	pBuf += (pDst->pmkid_count * 16);
	ielen -= (pDst->pmkid_count * 16);
	if (!ielen) {
		return 0U;
	} else {
		DOT11F_MEMCPY(pCtx, pDst->gp_mgmt_cipher_suite, pBuf, 4);
	}
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_rsn. */

#define SigIeRSN (0x0053)


uint32_t dot11f_unpack_ie_rsniie(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 uint8_t ielen,
				 tDot11fIERSNIIE *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->rsni = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_rsniie. */

#define SigIeRSNIIE (0x0054)


uint32_t dot11f_unpack_ie_rsn_opaque(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIERSNOpaque *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_data = (uint8_t)(ielen);
	if (ielen > 253) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->data, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_rsn_opaque. */

#define SigIeRSNOpaque (0x0055)


uint32_t dot11f_unpack_ie_supp_channels(tpAniSirGlobal pCtx,
				       uint8_t *pBuf,
				       uint8_t ielen,
				       tDot11fIESuppChannels *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_bands = (uint8_t)(ielen / 2);
	if (ielen > 48 * 2) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->bands, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_supp_channels. */

#define SigIeSuppChannels (0x0056)


uint32_t dot11f_unpack_ie_supp_operating_classes(tpAniSirGlobal pCtx,
					       uint8_t *pBuf,
					       uint8_t ielen,
					       tDot11fIESuppOperatingClasses *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_classes = (uint8_t)(ielen);
	if (ielen > 32) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->classes, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_supp_operating_classes. */

#define SigIeSuppOperatingClasses (0x0057)


uint32_t dot11f_unpack_ie_supp_rates(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIESuppRates *pDst)
{
	uint8_t i;
	uint8_t rate_indx = 0;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	for (i = 0; i < ielen; i++) {
		if ((DOT11F_IS_BG_RATE(pBuf[i] & 0x7F)) &&
			(rate_indx < 12)) {
			pDst->rates[rate_indx++] = pBuf[i];
		}
	}

	if (rate_indx == 0) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	pDst->num_rates = rate_indx;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_supp_rates. */

#define SigIeSuppRates (0x0058)


uint32_t dot11f_unpack_ie_tim(tpAniSirGlobal pCtx,
			      uint8_t *pBuf,
			      uint8_t ielen,
			      tDot11fIETIM *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->dtim_count = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->dtim_period = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->bmpctl = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->num_vbmp = (uint8_t)(ielen);
	if (ielen > 251) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->vbmp, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_tim. */

#define SigIeTIM (0x0059)


uint32_t dot11f_unpack_ie_tpc_report(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIETPCReport *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->tx_power = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->link_margin = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_tpc_report. */

#define SigIeTPCReport (0x005a)


uint32_t dot11f_unpack_ie_tpc_request(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     uint8_t ielen,
				     tDot11fIETPCRequest *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_tpc_request. */

#define SigIeTPCRequest (0x005b)


uint32_t dot11f_unpack_ie_time_advertisement(tpAniSirGlobal pCtx,
					    uint8_t *pBuf,
					    uint8_t ielen,
					    tDot11fIETimeAdvertisement *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->timing_capabilities = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	DOT11F_MEMCPY(pCtx, pDst->time_value, pBuf, 10);
	pBuf += 10;
	ielen -= (uint8_t)10;
	DOT11F_MEMCPY(pCtx, pDst->time_error, pBuf, 5);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_time_advertisement. */

#define SigIeTimeAdvertisement (0x005c)


uint32_t dot11f_unpack_ie_timeout_interval(tpAniSirGlobal pCtx,
					  uint8_t *pBuf,
					  uint8_t ielen,
					  tDot11fIETimeoutInterval *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->timeoutType = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	framesntohl(pCtx, &pDst->timeoutValue, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_timeout_interval. */

#define SigIeTimeoutInterval (0x005d)


uint32_t dot11f_unpack_ie_vht_ext_bss_load(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEVHTExtBssLoad *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->muMIMOCapStaCount = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->ssUnderUtil = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->FortyMHzUtil = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->EightyMHzUtil = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->OneSixtyMHzUtil = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_vht_ext_bss_load. */

#define SigIeVHTExtBssLoad (0x005e)


uint32_t dot11f_unpack_ie_vendor1_ie(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEVendor1IE *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_vendor1_ie. */

#define SigIeVendor1IE (0x005f)


uint32_t dot11f_unpack_ie_vendor3_ie(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEVendor3IE *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_vendor3_ie. */

#define SigIeVendor3IE (0x0060)


uint32_t dot11f_unpack_ie_wapi(tpAniSirGlobal pCtx,
			       uint8_t *pBuf,
			       uint8_t ielen,
			       tDot11fIEWAPI *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint16_t tmp53__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->version, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	if (pDst->version != 0x1) {
		pDst->present = 0;
		return status | DOT11F_BAD_FIXED_VALUE;
	}
	framesntohs(pCtx, &pDst->akm_suite_count, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	if (pDst->akm_suite_count > 4) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->akm_suites, pBuf, (pDst->akm_suite_count * 4));
	pBuf += (pDst->akm_suite_count * 4);
	ielen -= (pDst->akm_suite_count * 4);
	framesntohs(pCtx, &pDst->unicast_cipher_suite_count, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	if (pDst->unicast_cipher_suite_count > 4) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->unicast_cipher_suites, pBuf, (pDst->unicast_cipher_suite_count * 4));
	pBuf += (pDst->unicast_cipher_suite_count * 4);
	ielen -= (pDst->unicast_cipher_suite_count * 4);
	DOT11F_MEMCPY(pCtx, pDst->multicast_cipher_suite, pBuf, 4);
	pBuf += 4;
	ielen -= (uint8_t)4;
	framesntohs(pCtx, &tmp53__, pBuf, 0);
	pBuf += 2;
	ielen -= 2;
	pDst->preauth = tmp53__ >> 0 & 0x1;
	pDst->reserved = tmp53__ >> 1 & 0x7fff;
	if (!ielen) {
		pDst->bkid_count = 0U;
		return 0U;
	} else {
		framesntohs(pCtx, &pDst->bkid_count, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
	}
	if (pDst->bkid_count > 4) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->bkid, pBuf, (pDst->bkid_count * 16));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wapi. */

#define SigIeWAPI (0x0061)


uint32_t dot11f_unpack_ie_wapi_opaque(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     uint8_t ielen,
				     tDot11fIEWAPIOpaque *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_data = (uint8_t)(ielen);
	if (ielen > 253) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->data, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wapi_opaque. */

#define SigIeWAPIOpaque (0x0062)


uint32_t dot11f_unpack_ie_wfatpc(tpAniSirGlobal pCtx,
				 uint8_t *pBuf,
				 uint8_t ielen,
				 tDot11fIEWFATPC *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->txPower = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->linkMargin = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wfatpc. */

#define SigIeWFATPC (0x0063)


uint32_t dot11f_unpack_ie_wfdie_opaque(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEWFDIEOpaque *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_data = (uint8_t)(ielen);
	if (ielen > 249) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->data, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wfdie_opaque. */

#define SigIeWFDIEOpaque (0x0064)


uint32_t dot11f_unpack_ie_wmm_caps(tpAniSirGlobal pCtx,
				  uint8_t *pBuf,
				  uint8_t ielen,
				  tDot11fIEWMMCaps *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp54__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->version = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	if (pDst->version != 0x1) {
		pDst->present = 0;
		return status | DOT11F_BAD_FIXED_VALUE;
	}
	tmp54__ = *pBuf;
	pDst->reserved = tmp54__ >> 0 & 0xf;
	pDst->qack = tmp54__ >> 4 & 0x1;
	pDst->queue_request = tmp54__ >> 5 & 0x1;
	pDst->txop_request = tmp54__ >> 6 & 0x1;
	pDst->more_ack = tmp54__ >> 7 & 0x1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wmm_caps. */

#define SigIeWMMCaps (0x0065)


uint32_t dot11f_unpack_ie_wmm_info_ap(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEWMMInfoAp *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp55__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->version = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	tmp55__ = *pBuf;
	pDst->param_set_count = tmp55__ >> 0 & 0xf;
	pDst->reserved = tmp55__ >> 4 & 0x7;
	pDst->uapsd = tmp55__ >> 7 & 0x1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wmm_info_ap. */

#define SigIeWMMInfoAp (0x0066)


uint32_t dot11f_unpack_ie_wmm_info_station(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEWMMInfoStation *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp56__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->version = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	tmp56__ = *pBuf;
	pDst->acvo_uapsd = tmp56__ >> 0 & 0x1;
	pDst->acvi_uapsd = tmp56__ >> 1 & 0x1;
	pDst->acbk_uapsd = tmp56__ >> 2 & 0x1;
	pDst->acbe_uapsd = tmp56__ >> 3 & 0x1;
	pDst->reserved1 = tmp56__ >> 4 & 0x1;
	pDst->max_sp_length = tmp56__ >> 5 & 0x3;
	pDst->reserved2 = tmp56__ >> 7 & 0x1;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wmm_info_station. */

#define SigIeWMMInfoStation (0x0067)


uint32_t dot11f_unpack_ie_wmm_params(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEWMMParams *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp57__;
	uint8_t tmp58__;
	uint8_t tmp59__;
	uint8_t tmp60__;
	uint8_t tmp61__;
	uint8_t tmp62__;
	uint8_t tmp63__;
	uint8_t tmp64__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->version = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	if (pDst->version != 0x1) {
		pDst->present = 0;
		return status | DOT11F_BAD_FIXED_VALUE;
	}
	pDst->qosInfo = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->reserved2 = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	tmp57__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acbe_aifsn = tmp57__ >> 0 & 0xf;
	pDst->acbe_acm = tmp57__ >> 4 & 0x1;
	pDst->acbe_aci = tmp57__ >> 5 & 0x3;
	pDst->unused1 = tmp57__ >> 7 & 0x1;
	tmp58__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acbe_acwmin = tmp58__ >> 0 & 0xf;
	pDst->acbe_acwmax = tmp58__ >> 4 & 0xf;
	framesntohs(pCtx, &pDst->acbe_txoplimit, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	tmp59__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acbk_aifsn = tmp59__ >> 0 & 0xf;
	pDst->acbk_acm = tmp59__ >> 4 & 0x1;
	pDst->acbk_aci = tmp59__ >> 5 & 0x3;
	pDst->unused2 = tmp59__ >> 7 & 0x1;
	tmp60__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acbk_acwmin = tmp60__ >> 0 & 0xf;
	pDst->acbk_acwmax = tmp60__ >> 4 & 0xf;
	framesntohs(pCtx, &pDst->acbk_txoplimit, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	tmp61__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acvi_aifsn = tmp61__ >> 0 & 0xf;
	pDst->acvi_acm = tmp61__ >> 4 & 0x1;
	pDst->acvi_aci = tmp61__ >> 5 & 0x3;
	pDst->unused3 = tmp61__ >> 7 & 0x1;
	tmp62__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acvi_acwmin = tmp62__ >> 0 & 0xf;
	pDst->acvi_acwmax = tmp62__ >> 4 & 0xf;
	framesntohs(pCtx, &pDst->acvi_txoplimit, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	tmp63__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acvo_aifsn = tmp63__ >> 0 & 0xf;
	pDst->acvo_acm = tmp63__ >> 4 & 0x1;
	pDst->acvo_aci = tmp63__ >> 5 & 0x3;
	pDst->unused4 = tmp63__ >> 7 & 0x1;
	tmp64__ = *pBuf;
	pBuf += 1;
	ielen -= 1;
	pDst->acvo_acwmin = tmp64__ >> 0 & 0xf;
	pDst->acvo_acwmax = tmp64__ >> 4 & 0xf;
	framesntohs(pCtx, &pDst->acvo_txoplimit, pBuf, 0);
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wmm_params. */

#define SigIeWMMParams (0x0068)


uint32_t dot11f_unpack_ie_wpa(tpAniSirGlobal pCtx,
			      uint8_t *pBuf,
			      uint8_t ielen,
			      tDot11fIEWPA *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	framesntohs(pCtx, &pDst->version, pBuf, 0);
	pBuf += 2;
	ielen -= (uint8_t)2;
	if (pDst->version != 0x1) {
		pDst->present = 0;
		return status | DOT11F_BAD_FIXED_VALUE;
	}
	if (!ielen) {
		pDst->multicast_cipher_present = 0U;
		pDst->unicast_cipher_count = 0U;
		pDst->auth_suite_count = 0U;
		return 0U;
	} else {
		pDst->multicast_cipher_present = 1U;
		DOT11F_MEMCPY(pCtx, pDst->multicast_cipher, pBuf, 4);
		pBuf += 4;
		ielen -= (uint8_t)4;
	}
	if (!ielen) {
		pDst->unicast_cipher_count = 0U;
		pDst->auth_suite_count = 0U;
		return 0U;
	} else {
		framesntohs(pCtx, &pDst->unicast_cipher_count, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
	}
	if (pDst->unicast_cipher_count > 4) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->unicast_ciphers, pBuf, (pDst->unicast_cipher_count * 4));
	pBuf += (pDst->unicast_cipher_count * 4);
	ielen -= (pDst->unicast_cipher_count * 4);
	if (!ielen) {
		pDst->auth_suite_count = 0U;
		return 0U;
	} else {
		framesntohs(pCtx, &pDst->auth_suite_count, pBuf, 0);
		pBuf += 2;
		ielen -= (uint8_t)2;
	}
	if (pDst->auth_suite_count > 4) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->auth_suites, pBuf, (pDst->auth_suite_count * 4));
	pBuf += (pDst->auth_suite_count * 4);
	ielen -= (pDst->auth_suite_count * 4);
	if (!ielen) {
		return 0U;
	} else {
		framesntohs(pCtx, &pDst->caps, pBuf, 0);
	}
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wpa. */

#define SigIeWPA (0x0069)


uint32_t dot11f_unpack_ie_wpa_opaque(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEWPAOpaque *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_data = (uint8_t)(ielen);
	if (ielen > 249) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->data, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wpa_opaque. */

#define SigIeWPAOpaque (0x006a)


static const tTLVDefn TLVS_WSC[] = {
	{ offsetof(tDot11fIEWSC, Version), offsetof(tDot11fTLVVersion, present),
	"Version", SigTlvVersion, DOT11F_TLV_VERSION, 0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, WPSState), offsetof(tDot11fTLVWPSState, present),
	"WPSState", SigTlvWPSState, DOT11F_TLV_WPSSTATE, 0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, APSetupLocked),
	offsetof(tDot11fTLVAPSetupLocked, present), "APSetupLocked",
	SigTlvAPSetupLocked, DOT11F_TLV_APSETUPLOCKED, 0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, SelectedRegistrarConfigMethods),
	offsetof(tDot11fTLVSelectedRegistrarConfigMethods, present),
	"SelectedRegistrarConfigMethods", SigTlvSelectedRegistrarConfigMethods,
	DOT11F_TLV_SELECTEDREGISTRARCONFIGMETHODS, 0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, UUID_E), offsetof(tDot11fTLVUUID_E, present),
	"UUID_E", SigTlvUUID_E, DOT11F_TLV_UUID_E, 0, 20, 20, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, UUID_R), offsetof(tDot11fTLVUUID_R, present),
	"UUID_R", SigTlvUUID_R, DOT11F_TLV_UUID_R, 0, 20, 20, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, RFBands), offsetof(tDot11fTLVRFBands, present),
	"RFBands", SigTlvRFBands, DOT11F_TLV_RFBANDS, 0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, SelectedRegistrar),
	offsetof(tDot11fTLVSelectedRegistrar, present), "SelectedRegistrar",
	SigTlvSelectedRegistrar, DOT11F_TLV_SELECTEDREGISTRAR,
	0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, ConfigMethods),
	offsetof(tDot11fTLVConfigMethods, present), "ConfigMethods",
	SigTlvConfigMethods, DOT11F_TLV_CONFIGMETHODS, 0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, AssociationState),
	offsetof(tDot11fTLVAssociationState, present), "AssociationState",
	SigTlvAssociationState, DOT11F_TLV_ASSOCIATIONSTATE,
	0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, ConfigurationError),
	offsetof(tDot11fTLVConfigurationError, present), "ConfigurationError",
	SigTlvConfigurationError, DOT11F_TLV_CONFIGURATIONERROR,
	0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, Manufacturer), offsetof(tDot11fTLVManufacturer,
	present), "Manufacturer", SigTlvManufacturer, DOT11F_TLV_MANUFACTURER,
	0, 4, 68, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, ModelName), offsetof(tDot11fTLVModelName,
	present), "ModelName", SigTlvModelName, DOT11F_TLV_MODELNAME,
	0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, ModelNumber), offsetof(tDot11fTLVModelNumber,
	present), "ModelNumber", SigTlvModelNumber, DOT11F_TLV_MODELNUMBER,
	0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, SerialNumber), offsetof(tDot11fTLVSerialNumber,
	present), "SerialNumber", SigTlvSerialNumber, DOT11F_TLV_SERIALNUMBER,
	0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, DeviceName), offsetof(tDot11fTLVDeviceName,
	present), "DeviceName", SigTlvDeviceName, DOT11F_TLV_DEVICENAME,
	0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, DevicePasswordID),
	offsetof(tDot11fTLVDevicePasswordID, present), "DevicePasswordID",
	SigTlvDevicePasswordID, DOT11F_TLV_DEVICEPASSWORDID,
	0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, PrimaryDeviceType),
	offsetof(tDot11fTLVPrimaryDeviceType, present), "PrimaryDeviceType",
	SigTlvPrimaryDeviceType, DOT11F_TLV_PRIMARYDEVICETYPE,
	0, 12, 12, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, RequestType), offsetof(tDot11fTLVRequestType,
	present), "RequestType", SigTlvRequestType, DOT11F_TLV_REQUESTTYPE,
	0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, ResponseType), offsetof(tDot11fTLVResponseType,
	present), "ResponseType", SigTlvResponseType, DOT11F_TLV_RESPONSETYPE,
	0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, VendorExtension),
	offsetof(tDot11fTLVVendorExtension, present), "VendorExtension",
	SigTlvVendorExtension, DOT11F_TLV_VENDOREXTENSION,
	0, 7, 21, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWSC, RequestDeviceType),
	offsetof(tDot11fTLVRequestDeviceType, present), "RequestDeviceType",
	SigTlvRequestDeviceType, DOT11F_TLV_REQUESTDEVICETYPE,
	0, 12, 12, 0, 2, 2, 1, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_wsc(tpAniSirGlobal pCtx,
			      uint8_t *pBuf,
			      uint8_t ielen,
			      tDot11fIEWSC *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_WSC,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_wsc. */

#define SigIeWSC (0x006b)


static const tTLVDefn TLVS_WscAssocReq[] = {
	{ offsetof(tDot11fIEWscAssocReq, Version), offsetof(tDot11fTLVVersion,
	present), "Version", SigTlvVersion, DOT11F_TLV_VERSION,
	0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscAssocReq, RequestType),
	offsetof(tDot11fTLVRequestType, present), "RequestType",
	SigTlvRequestType, DOT11F_TLV_REQUESTTYPE, 0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscAssocReq, VendorExtension),
	offsetof(tDot11fTLVVendorExtension, present), "VendorExtension",
	SigTlvVendorExtension, DOT11F_TLV_VENDOREXTENSION,
	0, 7, 21, 0, 2, 2, 1, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_wsc_assoc_req(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEWscAssocReq *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_WscAssocReq,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_wsc_assoc_req. */

#define SigIeWscAssocReq (0x006c)


static const tTLVDefn TLVS_WscAssocRes[] = {
	{ offsetof(tDot11fIEWscAssocRes, Version), offsetof(tDot11fTLVVersion,
	present), "Version", SigTlvVersion, DOT11F_TLV_VERSION,
	0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscAssocRes, ResponseType),
	offsetof(tDot11fTLVResponseType, present), "ResponseType",
	SigTlvResponseType, DOT11F_TLV_RESPONSETYPE, 0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscAssocRes, VendorExtension),
	offsetof(tDot11fTLVVendorExtension, present), "VendorExtension",
	SigTlvVendorExtension, DOT11F_TLV_VENDOREXTENSION,
	0, 7, 21, 0, 2, 2, 1, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_wsc_assoc_res(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEWscAssocRes *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_WscAssocRes,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_wsc_assoc_res. */

#define SigIeWscAssocRes (0x006d)


static const tTLVDefn TLVS_WscBeacon[] = {
	{ offsetof(tDot11fIEWscBeacon, Version), offsetof(tDot11fTLVVersion,
	present), "Version", SigTlvVersion, DOT11F_TLV_VERSION,
	0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeacon, WPSState), offsetof(tDot11fTLVWPSState,
	present), "WPSState", SigTlvWPSState, DOT11F_TLV_WPSSTATE,
	0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeacon, APSetupLocked),
	offsetof(tDot11fTLVAPSetupLocked, present), "APSetupLocked",
	SigTlvAPSetupLocked, DOT11F_TLV_APSETUPLOCKED, 0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeacon, SelectedRegistrar),
	offsetof(tDot11fTLVSelectedRegistrar, present), "SelectedRegistrar",
	SigTlvSelectedRegistrar, DOT11F_TLV_SELECTEDREGISTRAR,
	0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeacon, DevicePasswordID),
	offsetof(tDot11fTLVDevicePasswordID, present), "DevicePasswordID",
	SigTlvDevicePasswordID, DOT11F_TLV_DEVICEPASSWORDID,
	0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeacon, SelectedRegistrarConfigMethods),
	offsetof(tDot11fTLVSelectedRegistrarConfigMethods, present),
	"SelectedRegistrarConfigMethods", SigTlvSelectedRegistrarConfigMethods,
	DOT11F_TLV_SELECTEDREGISTRARCONFIGMETHODS, 0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeacon, UUID_E), offsetof(tDot11fTLVUUID_E,
	present), "UUID_E", SigTlvUUID_E, DOT11F_TLV_UUID_E,
	0, 20, 20, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeacon, RFBands), offsetof(tDot11fTLVRFBands,
	present), "RFBands", SigTlvRFBands, DOT11F_TLV_RFBANDS,
	0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeacon, VendorExtension),
	offsetof(tDot11fTLVVendorExtension, present), "VendorExtension",
	SigTlvVendorExtension, DOT11F_TLV_VENDOREXTENSION,
	0, 7, 21, 0, 2, 2, 1, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_wsc_beacon(tpAniSirGlobal pCtx,
				    uint8_t *pBuf,
				    uint8_t ielen,
				    tDot11fIEWscBeacon *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_WscBeacon,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_wsc_beacon. */

#define SigIeWscBeacon (0x006e)


static const tTLVDefn TLVS_WscBeaconProbeRes[] = {
	{ offsetof(tDot11fIEWscBeaconProbeRes, Version),
	offsetof(tDot11fTLVVersion, present), "Version", SigTlvVersion,
	DOT11F_TLV_VERSION, 0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, WPSState),
	offsetof(tDot11fTLVWPSState, present), "WPSState", SigTlvWPSState,
	DOT11F_TLV_WPSSTATE, 0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, APSetupLocked),
	offsetof(tDot11fTLVAPSetupLocked, present), "APSetupLocked",
	SigTlvAPSetupLocked, DOT11F_TLV_APSETUPLOCKED, 0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, SelectedRegistrar),
	offsetof(tDot11fTLVSelectedRegistrar, present), "SelectedRegistrar",
	SigTlvSelectedRegistrar, DOT11F_TLV_SELECTEDREGISTRAR,
	0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, DevicePasswordID),
	offsetof(tDot11fTLVDevicePasswordID, present), "DevicePasswordID",
	SigTlvDevicePasswordID, DOT11F_TLV_DEVICEPASSWORDID,
	0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, SelectedRegistrarConfigMethods),
	offsetof(tDot11fTLVSelectedRegistrarConfigMethods, present),
	"SelectedRegistrarConfigMethods", SigTlvSelectedRegistrarConfigMethods,
	DOT11F_TLV_SELECTEDREGISTRARCONFIGMETHODS, 0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, ResponseType),
	offsetof(tDot11fTLVResponseType, present), "ResponseType",
	SigTlvResponseType, DOT11F_TLV_RESPONSETYPE, 0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, UUID_E),
	offsetof(tDot11fTLVUUID_E, present), "UUID_E", SigTlvUUID_E,
	DOT11F_TLV_UUID_E, 0, 20, 20, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, Manufacturer),
	offsetof(tDot11fTLVManufacturer, present), "Manufacturer",
	SigTlvManufacturer, DOT11F_TLV_MANUFACTURER, 0, 4, 68, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, ModelName),
	offsetof(tDot11fTLVModelName, present), "ModelName", SigTlvModelName,
	DOT11F_TLV_MODELNAME, 0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, ModelNumber),
	offsetof(tDot11fTLVModelNumber, present), "ModelNumber",
	SigTlvModelNumber, DOT11F_TLV_MODELNUMBER, 0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, SerialNumber),
	offsetof(tDot11fTLVSerialNumber, present), "SerialNumber",
	SigTlvSerialNumber, DOT11F_TLV_SERIALNUMBER, 0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, PrimaryDeviceType),
	offsetof(tDot11fTLVPrimaryDeviceType, present), "PrimaryDeviceType",
	SigTlvPrimaryDeviceType, DOT11F_TLV_PRIMARYDEVICETYPE,
	0, 12, 12, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, DeviceName),
	offsetof(tDot11fTLVDeviceName, present), "DeviceName", SigTlvDeviceName,
	DOT11F_TLV_DEVICENAME, 0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, ConfigMethods),
	offsetof(tDot11fTLVConfigMethods, present), "ConfigMethods",
	SigTlvConfigMethods, DOT11F_TLV_CONFIGMETHODS, 0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, RFBands),
	offsetof(tDot11fTLVRFBands, present), "RFBands", SigTlvRFBands,
	DOT11F_TLV_RFBANDS, 0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscBeaconProbeRes, VendorExtension),
	offsetof(tDot11fTLVVendorExtension, present), "VendorExtension",
	SigTlvVendorExtension, DOT11F_TLV_VENDOREXTENSION,
	0, 7, 21, 0, 2, 2, 1, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_wsc_beacon_probe_res(tpAniSirGlobal pCtx,
					    uint8_t *pBuf,
					    uint8_t ielen,
					    tDot11fIEWscBeaconProbeRes *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_WscBeaconProbeRes,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_wsc_beacon_probe_res. */

#define SigIeWscBeaconProbeRes (0x006f)


uint32_t dot11f_unpack_ie_wsc_ie_opaque(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEWscIEOpaque *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->num_data = (uint8_t)(ielen);
	if (ielen > 249) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->data, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_wsc_ie_opaque. */

#define SigIeWscIEOpaque (0x0070)


static const tTLVDefn TLVS_WscProbeReq[] = {
	{ offsetof(tDot11fIEWscProbeReq, Version), offsetof(tDot11fTLVVersion,
	present), "Version", SigTlvVersion, DOT11F_TLV_VERSION,
	0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, RequestType),
	offsetof(tDot11fTLVRequestType, present), "RequestType",
	SigTlvRequestType, DOT11F_TLV_REQUESTTYPE, 0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, ConfigMethods),
	offsetof(tDot11fTLVConfigMethods, present), "ConfigMethods",
	SigTlvConfigMethods, DOT11F_TLV_CONFIGMETHODS, 0, 6, 6, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, UUID_E), offsetof(tDot11fTLVUUID_E,
	present), "UUID_E", SigTlvUUID_E, DOT11F_TLV_UUID_E,
	0, 20, 20, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, PrimaryDeviceType),
	offsetof(tDot11fTLVPrimaryDeviceType, present), "PrimaryDeviceType",
	SigTlvPrimaryDeviceType, DOT11F_TLV_PRIMARYDEVICETYPE,
	0, 12, 12, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, RFBands), offsetof(tDot11fTLVRFBands,
	present), "RFBands", SigTlvRFBands, DOT11F_TLV_RFBANDS,
	0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, AssociationState),
	offsetof(tDot11fTLVAssociationState, present), "AssociationState",
	SigTlvAssociationState, DOT11F_TLV_ASSOCIATIONSTATE,
	0, 6, 6, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, ConfigurationError),
	offsetof(tDot11fTLVConfigurationError, present), "ConfigurationError",
	SigTlvConfigurationError, DOT11F_TLV_CONFIGURATIONERROR,
	0, 6, 6, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, DevicePasswordID),
	offsetof(tDot11fTLVDevicePasswordID, present), "DevicePasswordID",
	SigTlvDevicePasswordID, DOT11F_TLV_DEVICEPASSWORDID,
	0, 6, 6, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, Manufacturer),
	offsetof(tDot11fTLVManufacturer, present), "Manufacturer",
	SigTlvManufacturer, DOT11F_TLV_MANUFACTURER, 0, 4, 68, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, ModelName),
	offsetof(tDot11fTLVModelName, present), "ModelName", SigTlvModelName,
	DOT11F_TLV_MODELNAME, 0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, ModelNumber),
	offsetof(tDot11fTLVModelNumber, present), "ModelNumber",
	SigTlvModelNumber, DOT11F_TLV_MODELNUMBER, 0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, DeviceName),
	offsetof(tDot11fTLVDeviceName, present), "DeviceName", SigTlvDeviceName,
	DOT11F_TLV_DEVICENAME, 0, 4, 36, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, VendorExtension),
	offsetof(tDot11fTLVVendorExtension, present), "VendorExtension",
	SigTlvVendorExtension, DOT11F_TLV_VENDOREXTENSION,
	0, 7, 21, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeReq, RequestDeviceType),
	offsetof(tDot11fTLVRequestDeviceType, present), "RequestDeviceType",
	SigTlvRequestDeviceType, DOT11F_TLV_REQUESTDEVICETYPE,
	0, 12, 12, 0, 2, 2, 1, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_wsc_probe_req(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEWscProbeReq *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_WscProbeReq,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_wsc_probe_req. */

#define SigIeWscProbeReq (0x0071)


static const tTLVDefn TLVS_WscProbeRes[] = {
	{ offsetof(tDot11fIEWscProbeRes, Version), offsetof(tDot11fTLVVersion,
	present), "Version", SigTlvVersion, DOT11F_TLV_VERSION,
	0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, WPSState), offsetof(tDot11fTLVWPSState,
	present), "WPSState", SigTlvWPSState, DOT11F_TLV_WPSSTATE,
	0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, APSetupLocked),
	offsetof(tDot11fTLVAPSetupLocked, present), "APSetupLocked",
	SigTlvAPSetupLocked, DOT11F_TLV_APSETUPLOCKED, 0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, SelectedRegistrar),
	offsetof(tDot11fTLVSelectedRegistrar, present), "SelectedRegistrar",
	SigTlvSelectedRegistrar, DOT11F_TLV_SELECTEDREGISTRAR,
	0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, DevicePasswordID),
	offsetof(tDot11fTLVDevicePasswordID, present), "DevicePasswordID",
	SigTlvDevicePasswordID, DOT11F_TLV_DEVICEPASSWORDID,
	0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, SelectedRegistrarConfigMethods),
	offsetof(tDot11fTLVSelectedRegistrarConfigMethods, present),
	"SelectedRegistrarConfigMethods", SigTlvSelectedRegistrarConfigMethods,
	DOT11F_TLV_SELECTEDREGISTRARCONFIGMETHODS, 0, 6, 6, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, ResponseType),
	offsetof(tDot11fTLVResponseType, present), "ResponseType",
	SigTlvResponseType, DOT11F_TLV_RESPONSETYPE, 0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, UUID_E), offsetof(tDot11fTLVUUID_E,
	present), "UUID_E", SigTlvUUID_E, DOT11F_TLV_UUID_E,
	0, 20, 20, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, Manufacturer),
	offsetof(tDot11fTLVManufacturer, present), "Manufacturer",
	SigTlvManufacturer, DOT11F_TLV_MANUFACTURER, 0, 4, 68, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, ModelName),
	offsetof(tDot11fTLVModelName, present), "ModelName", SigTlvModelName,
	DOT11F_TLV_MODELNAME, 0, 4, 36, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, ModelNumber),
	offsetof(tDot11fTLVModelNumber, present), "ModelNumber",
	SigTlvModelNumber, DOT11F_TLV_MODELNUMBER, 0, 4, 36, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, SerialNumber),
	offsetof(tDot11fTLVSerialNumber, present), "SerialNumber",
	SigTlvSerialNumber, DOT11F_TLV_SERIALNUMBER, 0, 4, 36, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, PrimaryDeviceType),
	offsetof(tDot11fTLVPrimaryDeviceType, present), "PrimaryDeviceType",
	SigTlvPrimaryDeviceType, DOT11F_TLV_PRIMARYDEVICETYPE,
	0, 12, 12, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, DeviceName),
	offsetof(tDot11fTLVDeviceName, present), "DeviceName", SigTlvDeviceName,
	DOT11F_TLV_DEVICENAME, 0, 4, 36, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, ConfigMethods),
	offsetof(tDot11fTLVConfigMethods, present), "ConfigMethods",
	SigTlvConfigMethods, DOT11F_TLV_CONFIGMETHODS, 0, 6, 6, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, RFBands), offsetof(tDot11fTLVRFBands,
	present), "RFBands", SigTlvRFBands, DOT11F_TLV_RFBANDS,
	0, 5, 5, 0, 2, 2, 1, },
	{ offsetof(tDot11fIEWscProbeRes, VendorExtension),
	offsetof(tDot11fTLVVendorExtension, present), "VendorExtension",
	SigTlvVendorExtension, DOT11F_TLV_VENDOREXTENSION,
	0, 7, 21, 0, 2, 2, 1, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_wsc_probe_res(tpAniSirGlobal pCtx,
				      uint8_t *pBuf,
				      uint8_t ielen,
				      tDot11fIEWscProbeRes *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_WscProbeRes,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_wsc_probe_res. */

#define SigIeWscProbeRes (0x0072)


static const tTLVDefn TLVS_WscReassocRes[] = {
	{ offsetof(tDot11fIEWscReassocRes, Version), offsetof(tDot11fTLVVersion,
	present), "Version", SigTlvVersion, DOT11F_TLV_VERSION,
	0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscReassocRes, ResponseType),
	offsetof(tDot11fTLVResponseType, present), "ResponseType",
	SigTlvResponseType, DOT11F_TLV_RESPONSETYPE, 0, 5, 5, 1, 2, 2, 1, },
	{ offsetof(tDot11fIEWscReassocRes, VendorExtension),
	offsetof(tDot11fTLVVendorExtension, present), "VendorExtension",
	SigTlvVendorExtension, DOT11F_TLV_VENDOREXTENSION,
	0, 7, 21, 0, 2, 2, 1, },
	{0, 0, NULL, 0, 0xffff, 0, 0, 0, 0, 0, 0},
};

uint32_t dot11f_unpack_ie_wsc_reassoc_res(tpAniSirGlobal pCtx,
					 uint8_t *pBuf,
					 uint8_t ielen,
					 tDot11fIEWscReassocRes *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pBuf; (void)ielen; /* Shutup the compiler */
	pDst->present = 1;
	status = unpack_tlv_core(pCtx, pBuf, ielen,
			TLVS_WscReassocRes,
			(uint8_t *)pDst, sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_wsc_reassoc_res. */

#define SigIeWscReassocRes (0x0073)


uint32_t dot11f_unpack_ie_ext_chan_switch_ann(tpAniSirGlobal pCtx,
					      uint8_t *pBuf,
					      uint8_t ielen,
					      tDot11fIEext_chan_switch_ann *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->switch_mode = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->new_reg_class = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->new_channel = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->switch_count = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ext_chan_switch_ann. */

#define SigIeext_chan_switch_ann (0x0074)


uint32_t dot11f_unpack_ie_ht2040_bss_coexistence(tpAniSirGlobal pCtx,
						 uint8_t *pBuf,
						 uint8_t ielen,
						 tDot11fIEht2040_bss_coexistence *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint8_t tmp65__;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	tmp65__ = *pBuf;
	pDst->info_request = tmp65__ >> 0 & 0x1;
	pDst->forty_mhz_intolerant = tmp65__ >> 1 & 0x1;
	pDst->twenty_mhz_bsswidth_req = tmp65__ >> 2 & 0x1;
	pDst->obss_scan_exemption_req = tmp65__ >> 3 & 0x1;
	pDst->obss_scan_exemption_grant = tmp65__ >> 4 & 0x1;
	pDst->unused = tmp65__ >> 5 & 0x7;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ht2040_bss_coexistence. */

#define SigIeht2040_bss_coexistence (0x0075)


uint32_t dot11f_unpack_ie_ht2040_bss_intolerant_report(tpAniSirGlobal pCtx,
						       uint8_t *pBuf,
						       uint8_t ielen,
						       tDot11fIEht2040_bss_intolerant_report *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->operating_class = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->num_channel_list = (uint8_t)(ielen);
	if (ielen > 50) {
		pDst->present = 0;
		return DOT11F_SKIPPED_BAD_IE;
	}

	DOT11F_MEMCPY(pCtx, pDst->channel_list, pBuf, (ielen));
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_ht2040_bss_intolerant_report. */

#define SigIeht2040_bss_intolerant_report (0x0076)


uint32_t dot11f_unpack_ie_sec_chan_offset_ele(tpAniSirGlobal pCtx,
					      uint8_t *pBuf,
					      uint8_t ielen,
					      tDot11fIEsec_chan_offset_ele *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->secondaryChannelOffset = *pBuf;
	(void)pCtx;
	return status;
} /* End dot11f_unpack_ie_sec_chan_offset_ele. */

#define SigIesec_chan_offset_ele (0x0077)


static const tFFDefn FFS_vendor2_ie[] = {
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_vendor2_ie[] = {
	{ offsetof(tDot11fIEvendor2_ie, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fIEvendor2_ie, VHTOperation),
	offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation",
	0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTOPERATION, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },
};

uint32_t dot11f_unpack_ie_vendor2_ie(tpAniSirGlobal pCtx,
				     uint8_t *pBuf,
				     uint8_t ielen,
				     tDot11fIEvendor2_ie *pDst)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void) pBuf; (void)ielen; /* Shutup the compiler */
	if (pDst->present)
		status = DOT11F_DUPLICATE_IE;
	pDst->present = 1;
	pDst->type = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	pDst->sub_type = *pBuf;
	pBuf += 1;
	ielen -= (uint8_t)1;
	(void)pCtx;
	status |= unpack_core(pCtx,
				pBuf,
				ielen,
				FFS_vendor2_ie,
				IES_vendor2_ie,
				(uint8_t *)pDst,
				sizeof(*pDst));
	return status;
} /* End dot11f_unpack_ie_vendor2_ie. */

#define SigIevendor2_ie (0x0078)


static const tFFDefn FFS_AddTSRequest[] = {
	{ "Category", offsetof(tDot11fAddTSRequest, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fAddTSRequest, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fAddTSRequest, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_AddTSRequest[] = {
	{ offsetof(tDot11fAddTSRequest, TSPEC), offsetof(tDot11fIETSPEC, present),
	0, "TSPEC", 0, 57, 57, SigIeTSPEC, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TSPEC, 1, },
	{ offsetof(tDot11fAddTSRequest, TCLAS), offsetof(tDot11fIETCLAS, present),
	offsetof(tDot11fAddTSRequest, num_TCLAS), "TCLAS", 2, 7, 45, SigIeTCLAS,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_TCLAS, 0, },
	{ offsetof(tDot11fAddTSRequest, TCLASSPROC),
	offsetof(tDot11fIETCLASSPROC, present), 0, "TCLASSPROC",
	0, 3, 3, SigIeTCLASSPROC, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TCLASSPROC, 0, },
	{ offsetof(tDot11fAddTSRequest, WMMTSPEC), offsetof(tDot11fIEWMMTSPEC,
	present), 0, "WMMTSPEC", 0, 63, 63, SigIeWMMTSPEC, {0, 80, 242, 2, 2},
	5, DOT11F_EID_WMMTSPEC, 0, },
	{ offsetof(tDot11fAddTSRequest, WMMTCLAS), offsetof(tDot11fIEWMMTCLAS,
	present), offsetof(tDot11fAddTSRequest, num_WMMTCLAS), "WMMTCLAS",
	2, 13, 51, SigIeWMMTCLAS, {0, 80, 242, 2, 6},
	5, DOT11F_EID_WMMTCLAS, 0, },
	{ offsetof(tDot11fAddTSRequest, WMMTCLASPROC),
	offsetof(tDot11fIEWMMTCLASPROC, present), 0, "WMMTCLASPROC",
	0, 9, 9, SigIeWMMTCLASPROC, {0, 80, 242, 2, 7},
	5, DOT11F_EID_WMMTCLASPROC, 0, },
	{ offsetof(tDot11fAddTSRequest, ESETrafStrmRateSet),
	offsetof(tDot11fIEESETrafStrmRateSet, present), 0, "ESETrafStrmRateSet",
	0, 7, 15, SigIeESETrafStrmRateSet, {0, 64, 150, 8, 0},
	4, DOT11F_EID_ESETRAFSTRMRATESET, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_add_ts_request(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fAddTSRequest *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_AddTSRequest, IES_AddTSRequest,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_add_ts_request. */

static const tFFDefn FFS_AddTSResponse[] = {
	{ "Category", offsetof(tDot11fAddTSResponse, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fAddTSResponse, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fAddTSResponse, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ "Status", offsetof(tDot11fAddTSResponse, Status), SigFfStatus,
	DOT11F_FF_STATUS_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_AddTSResponse[] = {
	{ offsetof(tDot11fAddTSResponse, TSDelay), offsetof(tDot11fIETSDelay,
	present), 0, "TSDelay", 0, 6, 6, SigIeTSDelay, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TSDELAY, 1, },
	{ offsetof(tDot11fAddTSResponse, TSPEC), offsetof(tDot11fIETSPEC,
	present), 0, "TSPEC", 0, 57, 57, SigIeTSPEC, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TSPEC, 1, },
	{ offsetof(tDot11fAddTSResponse, TCLAS), offsetof(tDot11fIETCLAS,
	present), offsetof(tDot11fAddTSResponse, num_TCLAS), "TCLAS",
	2, 7, 45, SigIeTCLAS, {0, 0, 0, 0, 0}, 0, DOT11F_EID_TCLAS, 0, },
	{ offsetof(tDot11fAddTSResponse, TCLASSPROC),
	offsetof(tDot11fIETCLASSPROC, present), 0, "TCLASSPROC",
	0, 3, 3, SigIeTCLASSPROC, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TCLASSPROC, 0, },
	{ offsetof(tDot11fAddTSResponse, Schedule), offsetof(tDot11fIESchedule,
	present), 0, "Schedule", 0, 16, 16, SigIeSchedule, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SCHEDULE, 0, },
	{ offsetof(tDot11fAddTSResponse, WMMTSDelay),
	offsetof(tDot11fIEWMMTSDelay, present), 0, "WMMTSDelay",
	0, 12, 12, SigIeWMMTSDelay, {0, 80, 242, 2, 8},
	5, DOT11F_EID_WMMTSDELAY, 0, },
	{ offsetof(tDot11fAddTSResponse, WMMSchedule),
	offsetof(tDot11fIEWMMSchedule, present), 0, "WMMSchedule",
	0, 22, 22, SigIeWMMSchedule, {0, 80, 242, 2, 9},
	5, DOT11F_EID_WMMSCHEDULE, 0, },
	{ offsetof(tDot11fAddTSResponse, WMMTSPEC), offsetof(tDot11fIEWMMTSPEC,
	present), 0, "WMMTSPEC", 0, 63, 63, SigIeWMMTSPEC, {0, 80, 242, 2, 2},
	5, DOT11F_EID_WMMTSPEC, 0, },
	{ offsetof(tDot11fAddTSResponse, WMMTCLAS), offsetof(tDot11fIEWMMTCLAS,
	present), offsetof(tDot11fAddTSResponse, num_WMMTCLAS), "WMMTCLAS",
	2, 13, 51, SigIeWMMTCLAS, {0, 80, 242, 2, 6},
	5, DOT11F_EID_WMMTCLAS, 0, },
	{ offsetof(tDot11fAddTSResponse, WMMTCLASPROC),
	offsetof(tDot11fIEWMMTCLASPROC, present), 0, "WMMTCLASPROC",
	0, 9, 9, SigIeWMMTCLASPROC, {0, 80, 242, 2, 7},
	5, DOT11F_EID_WMMTCLASPROC, 0, },
	{ offsetof(tDot11fAddTSResponse, ESETrafStrmMet),
	offsetof(tDot11fIEESETrafStrmMet, present), 0, "ESETrafStrmMet",
	0, 10, 10, SigIeESETrafStrmMet, {0, 64, 150, 7, 0},
	4, DOT11F_EID_ESETRAFSTRMMET, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_add_ts_response(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fAddTSResponse *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_AddTSResponse, IES_AddTSResponse,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_add_ts_response. */

static const tFFDefn FFS_AssocRequest[] = {
	{ "Capabilities", offsetof(tDot11fAssocRequest, Capabilities),
	SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ "ListenInterval", offsetof(tDot11fAssocRequest, ListenInterval),
	SigFfListenInterval, DOT11F_FF_LISTENINTERVAL_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_AssocRequest[] = {
	{ offsetof(tDot11fAssocRequest, SSID), offsetof(tDot11fIESSID, present), 0,
	"SSID", 0, 2, 34, SigIeSSID, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SSID, 1, },
	{ offsetof(tDot11fAssocRequest, SuppRates), offsetof(tDot11fIESuppRates,
	present), 0, "SuppRates", 0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fAssocRequest, ExtSuppRates),
	offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates",
	0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fAssocRequest, PowerCaps), offsetof(tDot11fIEPowerCaps,
	present), 0, "PowerCaps", 0, 4, 4, SigIePowerCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_POWERCAPS, 0, },
	{ offsetof(tDot11fAssocRequest, SuppChannels),
	offsetof(tDot11fIESuppChannels, present), 0, "SuppChannels",
	0, 4, 98, SigIeSuppChannels, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPCHANNELS, 0, },
	{ offsetof(tDot11fAssocRequest, RSNOpaque), offsetof(tDot11fIERSNOpaque,
	present), 0, "RSNOpaque", 0, 8, 255, SigIeRSNOpaque, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RSNOPAQUE, 0, },
	{ offsetof(tDot11fAssocRequest, QOSCapsStation),
	offsetof(tDot11fIEQOSCapsStation, present), 0, "QOSCapsStation",
	0, 3, 3, SigIeQOSCapsStation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QOSCAPSSTATION, 0, },
	{ offsetof(tDot11fAssocRequest, RRMEnabledCap),
	offsetof(tDot11fIERRMEnabledCap, present), 0, "RRMEnabledCap",
	0, 7, 7, SigIeRRMEnabledCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RRMENABLEDCAP, 0, },
	{ offsetof(tDot11fAssocRequest, MobilityDomain),
	offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain",
	0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MOBILITYDOMAIN, 0, },
	{ offsetof(tDot11fAssocRequest, WPAOpaque), offsetof(tDot11fIEWPAOpaque,
	present), 0, "WPAOpaque", 0, 8, 255, SigIeWPAOpaque, {0, 80, 242, 1, 0},
	4, DOT11F_EID_WPAOPAQUE, 0, },
	{ offsetof(tDot11fAssocRequest, HTCaps), offsetof(tDot11fIEHTCaps,
	present), 0, "HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fAssocRequest, WMMCaps), offsetof(tDot11fIEWMMCaps,
	present), 0, "WMMCaps", 0, 9, 9, SigIeWMMCaps, {0, 80, 242, 2, 5},
	5, DOT11F_EID_WMMCAPS, 0, },
	{ offsetof(tDot11fAssocRequest, WMMInfoStation),
	offsetof(tDot11fIEWMMInfoStation, present), 0, "WMMInfoStation",
	0, 9, 9, SigIeWMMInfoStation, {0, 80, 242, 2, 0},
	5, DOT11F_EID_WMMINFOSTATION, 0, },
	{ offsetof(tDot11fAssocRequest, WscIEOpaque),
	offsetof(tDot11fIEWscIEOpaque, present), 0, "WscIEOpaque",
	0, 8, 255, SigIeWscIEOpaque, {0, 80, 242, 4, 0},
	4, DOT11F_EID_WSCIEOPAQUE, 0, },
	{ offsetof(tDot11fAssocRequest, WAPIOpaque),
	offsetof(tDot11fIEWAPIOpaque, present), 0, "WAPIOpaque",
	0, 8, 255, SigIeWAPIOpaque, {0, 0, 0, 0, 0},
	0, DOT11F_EID_WAPIOPAQUE, 0, },
	{ offsetof(tDot11fAssocRequest, WAPI), offsetof(tDot11fIEWAPI, present), 0,
	"WAPI", 0, 14, 112, SigIeWAPI, {0, 0, 0, 0, 0}, 0, DOT11F_EID_WAPI, 0, },
	{ offsetof(tDot11fAssocRequest, ESERadMgmtCap),
	offsetof(tDot11fIEESERadMgmtCap, present), 0, "ESERadMgmtCap",
	0, 8, 8, SigIeESERadMgmtCap, {0, 64, 150, 1, 0},
	4, DOT11F_EID_ESERADMGMTCAP, 0, },
	{ offsetof(tDot11fAssocRequest, ESEVersion),
	offsetof(tDot11fIEESEVersion, present), 0, "ESEVersion",
	0, 7, 7, SigIeESEVersion, {0, 64, 150, 3, 0},
	4, DOT11F_EID_ESEVERSION, 0, },
	{ offsetof(tDot11fAssocRequest, P2PIEOpaque),
	offsetof(tDot11fIEP2PIEOpaque, present), 0, "P2PIEOpaque",
	0, 8, 255, SigIeP2PIEOpaque, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PIEOPAQUE, 0, },
	{ offsetof(tDot11fAssocRequest, WFDIEOpaque),
	offsetof(tDot11fIEWFDIEOpaque, present), 0, "WFDIEOpaque",
	0, 8, 255, SigIeWFDIEOpaque, {80, 111, 154, 10, 0},
	4, DOT11F_EID_WFDIEOPAQUE, 0, },
	{ offsetof(tDot11fAssocRequest, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fAssocRequest, ExtCap), offsetof(tDot11fIEExtCap,
	present), 0, "ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fAssocRequest, OperatingMode),
	offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode",
	0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OPERATINGMODE, 0, },
	{ offsetof(tDot11fAssocRequest, QosMapSet), offsetof(tDot11fIEQosMapSet,
	present), 0, "QosMapSet", 0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QOSMAPSET, 0, },
	{ offsetof(tDot11fAssocRequest, vendor2_ie),
	offsetof(tDot11fIEvendor2_ie, present), 0, "vendor2_ie",
	0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
	3, DOT11F_EID_VENDOR2_IE, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_assoc_request(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fAssocRequest *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_AssocRequest, IES_AssocRequest,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_assoc_request. */

static const tFFDefn FFS_AssocResponse[] = {
	{ "Capabilities", offsetof(tDot11fAssocResponse, Capabilities),
	SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ "Status", offsetof(tDot11fAssocResponse, Status), SigFfStatus,
	DOT11F_FF_STATUS_LEN, },
	{ "AID", offsetof(tDot11fAssocResponse, AID), SigFfAID,
	DOT11F_FF_AID_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_AssocResponse[] = {
	{ offsetof(tDot11fAssocResponse, SuppRates), offsetof(tDot11fIESuppRates,
	present), 0, "SuppRates", 0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fAssocResponse, ExtSuppRates),
	offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates",
	0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fAssocResponse, EDCAParamSet),
	offsetof(tDot11fIEEDCAParamSet, present), 0, "EDCAParamSet",
	0, 20, 20, SigIeEDCAParamSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EDCAPARAMSET, 0, },
	{ offsetof(tDot11fAssocResponse, RCPIIE), offsetof(tDot11fIERCPIIE,
	present), 0, "RCPIIE", 0, 3, 3, SigIeRCPIIE, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RCPIIE, 0, },
	{ offsetof(tDot11fAssocResponse, RSNIIE), offsetof(tDot11fIERSNIIE,
	present), 0, "RSNIIE", 0, 3, 3, SigIeRSNIIE, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RSNIIE, 0, },
	{ offsetof(tDot11fAssocResponse, RRMEnabledCap),
	offsetof(tDot11fIERRMEnabledCap, present), 0, "RRMEnabledCap",
	0, 7, 7, SigIeRRMEnabledCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RRMENABLEDCAP, 0, },
	{ offsetof(tDot11fAssocResponse, MobilityDomain),
	offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain",
	0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MOBILITYDOMAIN, 0, },
	{ offsetof(tDot11fAssocResponse, FTInfo), offsetof(tDot11fIEFTInfo,
	present), 0, "FTInfo", 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FTINFO, 0, },
	{ offsetof(tDot11fAssocResponse, RICDataDesc),
	offsetof(tDot11fIERICDataDesc, present),
	offsetof(tDot11fAssocResponse, num_RICDataDesc), "RICDataDesc",
	2, 2, 550, SigIeRICDataDesc, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RICDATADESC, 0, },
	{ offsetof(tDot11fAssocResponse, WPA), offsetof(tDot11fIEWPA, present), 0,
	"WPA", 0, 8, 50, SigIeWPA, {0, 80, 242, 1, 0}, 4, DOT11F_EID_WPA, 0, },
	{ offsetof(tDot11fAssocResponse, TimeoutInterval),
	offsetof(tDot11fIETimeoutInterval, present), 0, "TimeoutInterval",
	0, 7, 7, SigIeTimeoutInterval, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TIMEOUTINTERVAL, 0, },
	{ offsetof(tDot11fAssocResponse, HTCaps), offsetof(tDot11fIEHTCaps,
	present), 0, "HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fAssocResponse, HTInfo), offsetof(tDot11fIEHTInfo,
	present), 0, "HTInfo", 0, 24, 56, SigIeHTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTINFO, 0, },
	{ offsetof(tDot11fAssocResponse, WMMParams), offsetof(tDot11fIEWMMParams,
	present), 0, "WMMParams", 0, 26, 26, SigIeWMMParams, {0, 80, 242, 2, 1},
	5, DOT11F_EID_WMMPARAMS, 0, },
	{ offsetof(tDot11fAssocResponse, WMMCaps), offsetof(tDot11fIEWMMCaps,
	present), 0, "WMMCaps", 0, 9, 9, SigIeWMMCaps, {0, 80, 242, 2, 5},
	5, DOT11F_EID_WMMCAPS, 0, },
	{ offsetof(tDot11fAssocResponse, ESERadMgmtCap),
	offsetof(tDot11fIEESERadMgmtCap, present), 0, "ESERadMgmtCap",
	0, 8, 8, SigIeESERadMgmtCap, {0, 64, 150, 1, 0},
	4, DOT11F_EID_ESERADMGMTCAP, 0, },
	{ offsetof(tDot11fAssocResponse, ESETrafStrmMet),
	offsetof(tDot11fIEESETrafStrmMet, present), 0, "ESETrafStrmMet",
	0, 10, 10, SigIeESETrafStrmMet, {0, 64, 150, 7, 0},
	4, DOT11F_EID_ESETRAFSTRMMET, 0, },
	{ offsetof(tDot11fAssocResponse, ESETxmitPower),
	offsetof(tDot11fIEESETxmitPower, present), 0, "ESETxmitPower",
	0, 8, 8, SigIeESETxmitPower, {0, 64, 150, 0, 0},
	4, DOT11F_EID_ESETXMITPOWER, 0, },
	{ offsetof(tDot11fAssocResponse, WMMTSPEC), offsetof(tDot11fIEWMMTSPEC,
	present), offsetof(tDot11fAssocResponse, num_WMMTSPEC), "WMMTSPEC",
	4, 63, 63, SigIeWMMTSPEC, {0, 80, 242, 2, 2},
	5, DOT11F_EID_WMMTSPEC, 0, },
	{ offsetof(tDot11fAssocResponse, WscAssocRes),
	offsetof(tDot11fIEWscAssocRes, present), 0, "WscAssocRes",
	0, 6, 37, SigIeWscAssocRes, {0, 80, 242, 4, 0},
	4, DOT11F_EID_WSCASSOCRES, 0, },
	{ offsetof(tDot11fAssocResponse, P2PAssocRes),
	offsetof(tDot11fIEP2PAssocRes, present), 0, "P2PAssocRes",
	0, 6, 17, SigIeP2PAssocRes, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PASSOCRES, 0, },
	{ offsetof(tDot11fAssocResponse, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fAssocResponse, VHTOperation),
	offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation",
	0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTOPERATION, 0, },
	{ offsetof(tDot11fAssocResponse, ExtCap), offsetof(tDot11fIEExtCap,
	present), 0, "ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fAssocResponse, OBSSScanParameters),
	offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters",
	0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OBSSSCANPARAMETERS, 0, },
	{ offsetof(tDot11fAssocResponse, QosMapSet), offsetof(tDot11fIEQosMapSet,
	present), 0, "QosMapSet", 0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QOSMAPSET, 0, },
	{ offsetof(tDot11fAssocResponse, vendor2_ie),
	offsetof(tDot11fIEvendor2_ie, present), 0, "vendor2_ie",
	0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
	3, DOT11F_EID_VENDOR2_IE, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_assoc_response(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fAssocResponse *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_AssocResponse, IES_AssocResponse,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_assoc_response. */

static const tFFDefn FFS_Authentication[] = {
	{ "AuthAlgo", offsetof(tDot11fAuthentication, AuthAlgo), SigFfAuthAlgo,
	DOT11F_FF_AUTHALGO_LEN, },
	{ "AuthSeqNo", offsetof(tDot11fAuthentication, AuthSeqNo), SigFfAuthSeqNo,
	DOT11F_FF_AUTHSEQNO_LEN, },
	{ "Status", offsetof(tDot11fAuthentication, Status), SigFfStatus,
	DOT11F_FF_STATUS_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_Authentication[] = {
	{ offsetof(tDot11fAuthentication, ChallengeText),
	offsetof(tDot11fIEChallengeText, present), 0, "ChallengeText",
	0, 3, 255, SigIeChallengeText, {0, 0, 0, 0, 0},
	0, DOT11F_EID_CHALLENGETEXT, 0, },
	{ offsetof(tDot11fAuthentication, RSNOpaque),
	offsetof(tDot11fIERSNOpaque, present), 0, "RSNOpaque",
	0, 8, 255, SigIeRSNOpaque, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RSNOPAQUE, 0, },
	{ offsetof(tDot11fAuthentication, MobilityDomain),
	offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain",
	0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MOBILITYDOMAIN, 0, },
	{ offsetof(tDot11fAuthentication, FTInfo), offsetof(tDot11fIEFTInfo,
	present), 0, "FTInfo", 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FTINFO, 0, },
	{ offsetof(tDot11fAuthentication, TimeoutInterval),
	offsetof(tDot11fIETimeoutInterval, present), 0, "TimeoutInterval",
	0, 7, 7, SigIeTimeoutInterval, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TIMEOUTINTERVAL, 0, },
	{ offsetof(tDot11fAuthentication, RICDataDesc),
	offsetof(tDot11fIERICDataDesc, present),
	offsetof(tDot11fAuthentication, num_RICDataDesc), "RICDataDesc",
	2, 2, 550, SigIeRICDataDesc, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RICDATADESC, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_authentication(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fAuthentication *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_Authentication, IES_Authentication,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_authentication. */

static const tFFDefn FFS_Beacon[] = {
	{ "TimeStamp", offsetof(tDot11fBeacon, TimeStamp), SigFfTimeStamp,
	DOT11F_FF_TIMESTAMP_LEN, },
	{ "BeaconInterval", offsetof(tDot11fBeacon, BeaconInterval),
	SigFfBeaconInterval, DOT11F_FF_BEACONINTERVAL_LEN, },
	{ "Capabilities", offsetof(tDot11fBeacon, Capabilities),
	SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_Beacon[] = {
	{ offsetof(tDot11fBeacon, SSID), offsetof(tDot11fIESSID, present), 0,
	"SSID", 0, 2, 34, SigIeSSID, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SSID, 1, },
	{ offsetof(tDot11fBeacon, SuppRates), offsetof(tDot11fIESuppRates,
	present), 0, "SuppRates", 0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fBeacon, FHParamSet), offsetof(tDot11fIEFHParamSet,
	present), 0, "FHParamSet", 0, 7, 7, SigIeFHParamSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FHPARAMSET, 0, },
	{ offsetof(tDot11fBeacon, DSParams), offsetof(tDot11fIEDSParams, present),
	0, "DSParams", 0, 3, 3, SigIeDSParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_DSPARAMS, 0, },
	{ offsetof(tDot11fBeacon, CFParams), offsetof(tDot11fIECFParams, present),
	0, "CFParams", 0, 8, 8, SigIeCFParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_CFPARAMS, 0, },
	{ offsetof(tDot11fBeacon, IBSSParams), offsetof(tDot11fIEIBSSParams,
	present), 0, "IBSSParams", 0, 4, 4, SigIeIBSSParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_IBSSPARAMS, 0, },
	{ offsetof(tDot11fBeacon, TIM), offsetof(tDot11fIETIM, present), 0, "TIM",
	0, 6, 256, SigIeTIM, {0, 0, 0, 0, 0}, 0, DOT11F_EID_TIM, 0, },
	{ offsetof(tDot11fBeacon, Country), offsetof(tDot11fIECountry, present), 0,
	"Country", 0, 5, 257, SigIeCountry, {0, 0, 0, 0, 0},
	0, DOT11F_EID_COUNTRY, 0, },
	{ offsetof(tDot11fBeacon, FHParams), offsetof(tDot11fIEFHParams, present),
	0, "FHParams", 0, 4, 4, SigIeFHParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FHPARAMS, 0, },
	{ offsetof(tDot11fBeacon, FHPattTable), offsetof(tDot11fIEFHPattTable,
	present), 0, "FHPattTable", 0, 6, 257, SigIeFHPattTable, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FHPATTTABLE, 0, },
	{ offsetof(tDot11fBeacon, PowerConstraints),
	offsetof(tDot11fIEPowerConstraints, present), 0, "PowerConstraints",
	0, 3, 3, SigIePowerConstraints, {0, 0, 0, 0, 0},
	0, DOT11F_EID_POWERCONSTRAINTS, 0, },
	{ offsetof(tDot11fBeacon, ChanSwitchAnn),
	offsetof(tDot11fIEChanSwitchAnn, present), 0, "ChanSwitchAnn",
	0, 5, 5, SigIeChanSwitchAnn, {0, 0, 0, 0, 0},
	0, DOT11F_EID_CHANSWITCHANN, 0, },
	{ offsetof(tDot11fBeacon, ext_chan_switch_ann),
	offsetof(tDot11fIEext_chan_switch_ann, present), 0, "ext_chan_switch_ann",
	0, 6, 6, SigIeext_chan_switch_ann, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXT_CHAN_SWITCH_ANN, 0, },
	{ offsetof(tDot11fBeacon, Quiet), offsetof(tDot11fIEQuiet, present), 0,
	"Quiet", 0, 8, 8, SigIeQuiet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QUIET, 0, },
	{ offsetof(tDot11fBeacon, TPCReport), offsetof(tDot11fIETPCReport,
	present), 0, "TPCReport", 0, 4, 4, SigIeTPCReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TPCREPORT, 0, },
	{ offsetof(tDot11fBeacon, ERPInfo), offsetof(tDot11fIEERPInfo, present), 0,
	"ERPInfo", 0, 3, 3, SigIeERPInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_ERPINFO, 0, },
	{ offsetof(tDot11fBeacon, ExtSuppRates), offsetof(tDot11fIEExtSuppRates,
	present), 0, "ExtSuppRates", 0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fBeacon, RSN), offsetof(tDot11fIERSN, present), 0, "RSN",
	0, 8, 116, SigIeRSN, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RSN, 0, },
	{ offsetof(tDot11fBeacon, QBSSLoad), offsetof(tDot11fIEQBSSLoad, present),
	0, "QBSSLoad", 0, 7, 7, SigIeQBSSLoad, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QBSSLOAD, 0, },
	{ offsetof(tDot11fBeacon, EDCAParamSet), offsetof(tDot11fIEEDCAParamSet,
	present), 0, "EDCAParamSet", 0, 20, 20, SigIeEDCAParamSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EDCAPARAMSET, 0, },
	{ offsetof(tDot11fBeacon, QOSCapsAp), offsetof(tDot11fIEQOSCapsAp,
	present), 0, "QOSCapsAp", 0, 3, 3, SigIeQOSCapsAp, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QOSCAPSAP, 0, },
	{ offsetof(tDot11fBeacon, APChannelReport),
	offsetof(tDot11fIEAPChannelReport, present), 0, "APChannelReport",
	0, 3, 53, SigIeAPChannelReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_APCHANNELREPORT, 0, },
	{ offsetof(tDot11fBeacon, RRMEnabledCap),
	offsetof(tDot11fIERRMEnabledCap, present), 0, "RRMEnabledCap",
	0, 7, 7, SigIeRRMEnabledCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RRMENABLEDCAP, 0, },
	{ offsetof(tDot11fBeacon, MobilityDomain),
	offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain",
	0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MOBILITYDOMAIN, 0, },
	{ offsetof(tDot11fBeacon, WPA), offsetof(tDot11fIEWPA, present), 0, "WPA",
	0, 8, 50, SigIeWPA, {0, 80, 242, 1, 0}, 4, DOT11F_EID_WPA, 0, },
	{ offsetof(tDot11fBeacon, HTCaps), offsetof(tDot11fIEHTCaps, present), 0,
	"HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fBeacon, HTInfo), offsetof(tDot11fIEHTInfo, present), 0,
	"HTInfo", 0, 24, 56, SigIeHTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTINFO, 0, },
	{ offsetof(tDot11fBeacon, sec_chan_offset_ele),
	offsetof(tDot11fIEsec_chan_offset_ele, present), 0, "sec_chan_offset_ele",
	0, 3, 3, SigIesec_chan_offset_ele, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SEC_CHAN_OFFSET_ELE, 0, },
	{ offsetof(tDot11fBeacon, WMMInfoAp), offsetof(tDot11fIEWMMInfoAp,
	present), 0, "WMMInfoAp", 0, 9, 9, SigIeWMMInfoAp, {0, 80, 242, 2, 0},
	5, DOT11F_EID_WMMINFOAP, 0, },
	{ offsetof(tDot11fBeacon, WMMParams), offsetof(tDot11fIEWMMParams,
	present), 0, "WMMParams", 0, 26, 26, SigIeWMMParams, {0, 80, 242, 2, 1},
	5, DOT11F_EID_WMMPARAMS, 0, },
	{ offsetof(tDot11fBeacon, WMMCaps), offsetof(tDot11fIEWMMCaps, present), 0,
	"WMMCaps", 0, 9, 9, SigIeWMMCaps, {0, 80, 242, 2, 5},
	5, DOT11F_EID_WMMCAPS, 0, },
	{ offsetof(tDot11fBeacon, WAPI), offsetof(tDot11fIEWAPI, present), 0,
	"WAPI", 0, 14, 112, SigIeWAPI, {0, 0, 0, 0, 0}, 0, DOT11F_EID_WAPI, 0, },
	{ offsetof(tDot11fBeacon, ESERadMgmtCap),
	offsetof(tDot11fIEESERadMgmtCap, present), 0, "ESERadMgmtCap",
	0, 8, 8, SigIeESERadMgmtCap, {0, 64, 150, 1, 0},
	4, DOT11F_EID_ESERADMGMTCAP, 0, },
	{ offsetof(tDot11fBeacon, ESETrafStrmMet),
	offsetof(tDot11fIEESETrafStrmMet, present), 0, "ESETrafStrmMet",
	0, 10, 10, SigIeESETrafStrmMet, {0, 64, 150, 7, 0},
	4, DOT11F_EID_ESETRAFSTRMMET, 0, },
	{ offsetof(tDot11fBeacon, ESETxmitPower),
	offsetof(tDot11fIEESETxmitPower, present), 0, "ESETxmitPower",
	0, 8, 8, SigIeESETxmitPower, {0, 64, 150, 0, 0},
	4, DOT11F_EID_ESETXMITPOWER, 0, },
	{ offsetof(tDot11fBeacon, WscBeacon), offsetof(tDot11fIEWscBeacon,
	present), 0, "WscBeacon", 0, 6, 84, SigIeWscBeacon, {0, 80, 242, 4, 0},
	4, DOT11F_EID_WSCBEACON, 0, },
	{ offsetof(tDot11fBeacon, P2PBeacon), offsetof(tDot11fIEP2PBeacon,
	present), 0, "P2PBeacon", 0, 6, 61, SigIeP2PBeacon, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PBEACON, 0, },
	{ offsetof(tDot11fBeacon, VHTCaps), offsetof(tDot11fIEVHTCaps, present), 0,
	"VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fBeacon, VHTOperation), offsetof(tDot11fIEVHTOperation,
	present), 0, "VHTOperation", 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTOPERATION, 0, },
	{ offsetof(tDot11fBeacon, VHTExtBssLoad),
	offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad",
	0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTEXTBSSLOAD, 0, },
	{ offsetof(tDot11fBeacon, ExtCap), offsetof(tDot11fIEExtCap, present), 0,
	"ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fBeacon, OperatingMode),
	offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode",
	0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OPERATINGMODE, 0, },
	{ offsetof(tDot11fBeacon, WiderBWChanSwitchAnn),
	offsetof(tDot11fIEWiderBWChanSwitchAnn, present), 0,
	"WiderBWChanSwitchAnn", 0, 5, 5, SigIeWiderBWChanSwitchAnn,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_WIDERBWCHANSWITCHANN, 0, },
	{ offsetof(tDot11fBeacon, OBSSScanParameters),
	offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters",
	0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OBSSSCANPARAMETERS, 0, },
	{ offsetof(tDot11fBeacon, Vendor1IE), offsetof(tDot11fIEVendor1IE,
	present), 0, "Vendor1IE", 0, 5, 5, SigIeVendor1IE, {0, 16, 24, 0, 0},
	3, DOT11F_EID_VENDOR1IE, 0, },
	{ offsetof(tDot11fBeacon, vendor2_ie), offsetof(tDot11fIEvendor2_ie,
	present), 0, "vendor2_ie", 0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
	3, DOT11F_EID_VENDOR2_IE, 0, },
	{ offsetof(tDot11fBeacon, Vendor3IE), offsetof(tDot11fIEVendor3IE,
	present), 0, "Vendor3IE", 0, 5, 5, SigIeVendor3IE, {0, 22, 50, 0, 0},
	3, DOT11F_EID_VENDOR3IE, 0, },
	{ offsetof(tDot11fBeacon, ChannelSwitchWrapper),
	offsetof(tDot11fIEChannelSwitchWrapper, present), 0,
	"ChannelSwitchWrapper", 0, 2, 7, SigIeChannelSwitchWrapper,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_CHANNELSWITCHWRAPPER, 0, },
	{ offsetof(tDot11fBeacon, QComVendorIE), offsetof(tDot11fIEQComVendorIE,
	present), 0, "QComVendorIE", 0, 7, 7, SigIeQComVendorIE,
	{0, 160, 198, 0, 0}, 3, DOT11F_EID_QCOMVENDORIE, 0, },
	{ offsetof(tDot11fBeacon, ESEVersion), offsetof(tDot11fIEESEVersion,
	present), 0, "ESEVersion", 0, 7, 7, SigIeESEVersion, {0, 64, 150, 3, 0},
	4, DOT11F_EID_ESEVERSION, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_beacon(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fBeacon *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_Beacon, IES_Beacon,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_beacon. */

static const tFFDefn FFS_Beacon1[] = {
	{ "TimeStamp", offsetof(tDot11fBeacon1, TimeStamp), SigFfTimeStamp,
	DOT11F_FF_TIMESTAMP_LEN, },
	{ "BeaconInterval", offsetof(tDot11fBeacon1, BeaconInterval),
	SigFfBeaconInterval, DOT11F_FF_BEACONINTERVAL_LEN, },
	{ "Capabilities", offsetof(tDot11fBeacon1, Capabilities),
	SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_Beacon1[] = {
	{ offsetof(tDot11fBeacon1, SSID), offsetof(tDot11fIESSID, present), 0,
	"SSID", 0, 2, 34, SigIeSSID, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SSID, 1, },
	{ offsetof(tDot11fBeacon1, SuppRates), offsetof(tDot11fIESuppRates,
	present), 0, "SuppRates", 0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fBeacon1, DSParams), offsetof(tDot11fIEDSParams,
	present), 0, "DSParams", 0, 3, 3, SigIeDSParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_DSPARAMS, 0, },
	{ offsetof(tDot11fBeacon1, IBSSParams), offsetof(tDot11fIEIBSSParams,
	present), 0, "IBSSParams", 0, 4, 4, SigIeIBSSParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_IBSSPARAMS, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_beacon1(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fBeacon1 *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_Beacon1, IES_Beacon1,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_beacon1. */

static const tFFDefn FFS_Beacon2[] = {
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_Beacon2[] = {
	{ offsetof(tDot11fBeacon2, Country), offsetof(tDot11fIECountry, present),
	0, "Country", 0, 5, 257, SigIeCountry, {0, 0, 0, 0, 0},
	0, DOT11F_EID_COUNTRY, 0, },
	{ offsetof(tDot11fBeacon2, PowerConstraints),
	offsetof(tDot11fIEPowerConstraints, present), 0, "PowerConstraints",
	0, 3, 3, SigIePowerConstraints, {0, 0, 0, 0, 0},
	0, DOT11F_EID_POWERCONSTRAINTS, 0, },
	{ offsetof(tDot11fBeacon2, ChanSwitchAnn),
	offsetof(tDot11fIEChanSwitchAnn, present), 0, "ChanSwitchAnn",
	0, 5, 5, SigIeChanSwitchAnn, {0, 0, 0, 0, 0},
	0, DOT11F_EID_CHANSWITCHANN, 0, },
	{ offsetof(tDot11fBeacon2, ext_chan_switch_ann),
	offsetof(tDot11fIEext_chan_switch_ann, present), 0, "ext_chan_switch_ann",
	0, 6, 6, SigIeext_chan_switch_ann, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXT_CHAN_SWITCH_ANN, 0, },
	{ offsetof(tDot11fBeacon2, Quiet), offsetof(tDot11fIEQuiet, present), 0,
	"Quiet", 0, 8, 8, SigIeQuiet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QUIET, 0, },
	{ offsetof(tDot11fBeacon2, TPCReport), offsetof(tDot11fIETPCReport,
	present), 0, "TPCReport", 0, 4, 4, SigIeTPCReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TPCREPORT, 0, },
	{ offsetof(tDot11fBeacon2, ERPInfo), offsetof(tDot11fIEERPInfo, present),
	0, "ERPInfo", 0, 3, 3, SigIeERPInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_ERPINFO, 0, },
	{ offsetof(tDot11fBeacon2, ExtSuppRates), offsetof(tDot11fIEExtSuppRates,
	present), 0, "ExtSuppRates", 0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fBeacon2, RSNOpaque), offsetof(tDot11fIERSNOpaque,
	present), 0, "RSNOpaque", 0, 8, 255, SigIeRSNOpaque, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RSNOPAQUE, 0, },
	{ offsetof(tDot11fBeacon2, EDCAParamSet), offsetof(tDot11fIEEDCAParamSet,
	present), 0, "EDCAParamSet", 0, 20, 20, SigIeEDCAParamSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EDCAPARAMSET, 0, },
	{ offsetof(tDot11fBeacon2, APChannelReport),
	offsetof(tDot11fIEAPChannelReport, present), 0, "APChannelReport",
	0, 3, 53, SigIeAPChannelReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_APCHANNELREPORT, 0, },
	{ offsetof(tDot11fBeacon2, RRMEnabledCap),
	offsetof(tDot11fIERRMEnabledCap, present), 0, "RRMEnabledCap",
	0, 7, 7, SigIeRRMEnabledCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RRMENABLEDCAP, 0, },
	{ offsetof(tDot11fBeacon2, MobilityDomain),
	offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain",
	0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MOBILITYDOMAIN, 0, },
	{ offsetof(tDot11fBeacon2, WPA), offsetof(tDot11fIEWPA, present), 0, "WPA",
	0, 8, 50, SigIeWPA, {0, 80, 242, 1, 0}, 4, DOT11F_EID_WPA, 0, },
	{ offsetof(tDot11fBeacon2, HTCaps), offsetof(tDot11fIEHTCaps, present), 0,
	"HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fBeacon2, HTInfo), offsetof(tDot11fIEHTInfo, present), 0,
	"HTInfo", 0, 24, 56, SigIeHTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTINFO, 0, },
	{ offsetof(tDot11fBeacon2, sec_chan_offset_ele),
	offsetof(tDot11fIEsec_chan_offset_ele, present), 0, "sec_chan_offset_ele",
	0, 3, 3, SigIesec_chan_offset_ele, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SEC_CHAN_OFFSET_ELE, 0, },
	{ offsetof(tDot11fBeacon2, WMMInfoAp), offsetof(tDot11fIEWMMInfoAp,
	present), 0, "WMMInfoAp", 0, 9, 9, SigIeWMMInfoAp, {0, 80, 242, 2, 0},
	5, DOT11F_EID_WMMINFOAP, 0, },
	{ offsetof(tDot11fBeacon2, WMMParams), offsetof(tDot11fIEWMMParams,
	present), 0, "WMMParams", 0, 26, 26, SigIeWMMParams, {0, 80, 242, 2, 1},
	5, DOT11F_EID_WMMPARAMS, 0, },
	{ offsetof(tDot11fBeacon2, WMMCaps), offsetof(tDot11fIEWMMCaps, present),
	0, "WMMCaps", 0, 9, 9, SigIeWMMCaps, {0, 80, 242, 2, 5},
	5, DOT11F_EID_WMMCAPS, 0, },
	{ offsetof(tDot11fBeacon2, WscBeacon), offsetof(tDot11fIEWscBeacon,
	present), 0, "WscBeacon", 0, 6, 84, SigIeWscBeacon, {0, 80, 242, 4, 0},
	4, DOT11F_EID_WSCBEACON, 0, },
	{ offsetof(tDot11fBeacon2, WAPI), offsetof(tDot11fIEWAPI, present), 0,
	"WAPI", 0, 14, 112, SigIeWAPI, {0, 0, 0, 0, 0}, 0, DOT11F_EID_WAPI, 0, },
	{ offsetof(tDot11fBeacon2, ESERadMgmtCap),
	offsetof(tDot11fIEESERadMgmtCap, present), 0, "ESERadMgmtCap",
	0, 8, 8, SigIeESERadMgmtCap, {0, 64, 150, 1, 0},
	4, DOT11F_EID_ESERADMGMTCAP, 0, },
	{ offsetof(tDot11fBeacon2, ESETrafStrmMet),
	offsetof(tDot11fIEESETrafStrmMet, present), 0, "ESETrafStrmMet",
	0, 10, 10, SigIeESETrafStrmMet, {0, 64, 150, 7, 0},
	4, DOT11F_EID_ESETRAFSTRMMET, 0, },
	{ offsetof(tDot11fBeacon2, ESETxmitPower),
	offsetof(tDot11fIEESETxmitPower, present), 0, "ESETxmitPower",
	0, 8, 8, SigIeESETxmitPower, {0, 64, 150, 0, 0},
	4, DOT11F_EID_ESETXMITPOWER, 0, },
	{ offsetof(tDot11fBeacon2, P2PBeacon), offsetof(tDot11fIEP2PBeacon,
	present), 0, "P2PBeacon", 0, 6, 61, SigIeP2PBeacon, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PBEACON, 0, },
	{ offsetof(tDot11fBeacon2, VHTCaps), offsetof(tDot11fIEVHTCaps, present),
	0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fBeacon2, VHTOperation), offsetof(tDot11fIEVHTOperation,
	present), 0, "VHTOperation", 0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTOPERATION, 0, },
	{ offsetof(tDot11fBeacon2, VHTExtBssLoad),
	offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad",
	0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTEXTBSSLOAD, 0, },
	{ offsetof(tDot11fBeacon2, ExtCap), offsetof(tDot11fIEExtCap, present), 0,
	"ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fBeacon2, OperatingMode),
	offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode",
	0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OPERATINGMODE, 0, },
	{ offsetof(tDot11fBeacon2, WiderBWChanSwitchAnn),
	offsetof(tDot11fIEWiderBWChanSwitchAnn, present), 0,
	"WiderBWChanSwitchAnn", 0, 5, 5, SigIeWiderBWChanSwitchAnn,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_WIDERBWCHANSWITCHANN, 0, },
	{ offsetof(tDot11fBeacon2, OBSSScanParameters),
	offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters",
	0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OBSSSCANPARAMETERS, 0, },
	{ offsetof(tDot11fBeacon2, Vendor1IE), offsetof(tDot11fIEVendor1IE,
	present), 0, "Vendor1IE", 0, 5, 5, SigIeVendor1IE, {0, 16, 24, 0, 0},
	3, DOT11F_EID_VENDOR1IE, 0, },
	{ offsetof(tDot11fBeacon2, vendor2_ie), offsetof(tDot11fIEvendor2_ie,
	present), 0, "vendor2_ie", 0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
	3, DOT11F_EID_VENDOR2_IE, 0, },
	{ offsetof(tDot11fBeacon2, Vendor3IE), offsetof(tDot11fIEVendor3IE,
	present), 0, "Vendor3IE", 0, 5, 5, SigIeVendor3IE, {0, 22, 50, 0, 0},
	3, DOT11F_EID_VENDOR3IE, 0, },
	{ offsetof(tDot11fBeacon2, ChannelSwitchWrapper),
	offsetof(tDot11fIEChannelSwitchWrapper, present), 0,
	"ChannelSwitchWrapper", 0, 2, 7, SigIeChannelSwitchWrapper,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_CHANNELSWITCHWRAPPER, 0, },
	{ offsetof(tDot11fBeacon2, QComVendorIE), offsetof(tDot11fIEQComVendorIE,
	present), 0, "QComVendorIE", 0, 7, 7, SigIeQComVendorIE,
	{0, 160, 198, 0, 0}, 3, DOT11F_EID_QCOMVENDORIE, 0, },
	{ offsetof(tDot11fBeacon2, ESEVersion), offsetof(tDot11fIEESEVersion,
	present), 0, "ESEVersion", 0, 7, 7, SigIeESEVersion, {0, 64, 150, 3, 0},
	4, DOT11F_EID_ESEVERSION, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_beacon2(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fBeacon2 *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_Beacon2, IES_Beacon2,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_beacon2. */

static const tFFDefn FFS_BeaconIEs[] = {
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_BeaconIEs[] = {
	{ offsetof(tDot11fBeaconIEs, SSID), offsetof(tDot11fIESSID, present), 0,
	"SSID", 0, 2, 34, SigIeSSID, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SSID, 1, },
	{ offsetof(tDot11fBeaconIEs, SuppRates), offsetof(tDot11fIESuppRates,
	present), 0, "SuppRates", 0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fBeaconIEs, FHParamSet), offsetof(tDot11fIEFHParamSet,
	present), 0, "FHParamSet", 0, 7, 7, SigIeFHParamSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FHPARAMSET, 0, },
	{ offsetof(tDot11fBeaconIEs, DSParams), offsetof(tDot11fIEDSParams,
	present), 0, "DSParams", 0, 3, 3, SigIeDSParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_DSPARAMS, 0, },
	{ offsetof(tDot11fBeaconIEs, CFParams), offsetof(tDot11fIECFParams,
	present), 0, "CFParams", 0, 8, 8, SigIeCFParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_CFPARAMS, 0, },
	{ offsetof(tDot11fBeaconIEs, IBSSParams), offsetof(tDot11fIEIBSSParams,
	present), 0, "IBSSParams", 0, 4, 4, SigIeIBSSParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_IBSSPARAMS, 0, },
	{ offsetof(tDot11fBeaconIEs, TIM), offsetof(tDot11fIETIM, present), 0,
	"TIM", 0, 6, 256, SigIeTIM, {0, 0, 0, 0, 0}, 0, DOT11F_EID_TIM, 0, },
	{ offsetof(tDot11fBeaconIEs, Country), offsetof(tDot11fIECountry,
	present), 0, "Country", 0, 5, 257, SigIeCountry, {0, 0, 0, 0, 0},
	0, DOT11F_EID_COUNTRY, 0, },
	{ offsetof(tDot11fBeaconIEs, FHParams), offsetof(tDot11fIEFHParams,
	present), 0, "FHParams", 0, 4, 4, SigIeFHParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FHPARAMS, 0, },
	{ offsetof(tDot11fBeaconIEs, FHPattTable), offsetof(tDot11fIEFHPattTable,
	present), 0, "FHPattTable", 0, 6, 257, SigIeFHPattTable, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FHPATTTABLE, 0, },
	{ offsetof(tDot11fBeaconIEs, PowerConstraints),
	offsetof(tDot11fIEPowerConstraints, present), 0, "PowerConstraints",
	0, 3, 3, SigIePowerConstraints, {0, 0, 0, 0, 0},
	0, DOT11F_EID_POWERCONSTRAINTS, 0, },
	{ offsetof(tDot11fBeaconIEs, ChanSwitchAnn),
	offsetof(tDot11fIEChanSwitchAnn, present), 0, "ChanSwitchAnn",
	0, 5, 5, SigIeChanSwitchAnn, {0, 0, 0, 0, 0},
	0, DOT11F_EID_CHANSWITCHANN, 0, },
	{ offsetof(tDot11fBeaconIEs, ext_chan_switch_ann),
	offsetof(tDot11fIEext_chan_switch_ann, present), 0, "ext_chan_switch_ann",
	0, 6, 6, SigIeext_chan_switch_ann, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXT_CHAN_SWITCH_ANN, 0, },
	{ offsetof(tDot11fBeaconIEs, Quiet), offsetof(tDot11fIEQuiet, present), 0,
	"Quiet", 0, 8, 8, SigIeQuiet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QUIET, 0, },
	{ offsetof(tDot11fBeaconIEs, TPCReport), offsetof(tDot11fIETPCReport,
	present), 0, "TPCReport", 0, 4, 4, SigIeTPCReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TPCREPORT, 0, },
	{ offsetof(tDot11fBeaconIEs, ERPInfo), offsetof(tDot11fIEERPInfo,
	present), 0, "ERPInfo", 0, 3, 3, SigIeERPInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_ERPINFO, 0, },
	{ offsetof(tDot11fBeaconIEs, ExtSuppRates),
	offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates",
	0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fBeaconIEs, RSN), offsetof(tDot11fIERSN, present), 0,
	"RSN", 0, 8, 116, SigIeRSN, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RSN, 0, },
	{ offsetof(tDot11fBeaconIEs, QBSSLoad), offsetof(tDot11fIEQBSSLoad,
	present), 0, "QBSSLoad", 0, 7, 7, SigIeQBSSLoad, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QBSSLOAD, 0, },
	{ offsetof(tDot11fBeaconIEs, EDCAParamSet),
	offsetof(tDot11fIEEDCAParamSet, present), 0, "EDCAParamSet",
	0, 20, 20, SigIeEDCAParamSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EDCAPARAMSET, 0, },
	{ offsetof(tDot11fBeaconIEs, QOSCapsAp), offsetof(tDot11fIEQOSCapsAp,
	present), 0, "QOSCapsAp", 0, 3, 3, SigIeQOSCapsAp, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QOSCAPSAP, 0, },
	{ offsetof(tDot11fBeaconIEs, APChannelReport),
	offsetof(tDot11fIEAPChannelReport, present), 0, "APChannelReport",
	0, 3, 53, SigIeAPChannelReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_APCHANNELREPORT, 0, },
	{ offsetof(tDot11fBeaconIEs, RRMEnabledCap),
	offsetof(tDot11fIERRMEnabledCap, present), 0, "RRMEnabledCap",
	0, 7, 7, SigIeRRMEnabledCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RRMENABLEDCAP, 0, },
	{ offsetof(tDot11fBeaconIEs, MobilityDomain),
	offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain",
	0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MOBILITYDOMAIN, 0, },
	{ offsetof(tDot11fBeaconIEs, WPA), offsetof(tDot11fIEWPA, present), 0,
	"WPA", 0, 8, 50, SigIeWPA, {0, 80, 242, 1, 0}, 4, DOT11F_EID_WPA, 0, },
	{ offsetof(tDot11fBeaconIEs, HTCaps), offsetof(tDot11fIEHTCaps, present),
	0, "HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fBeaconIEs, HTInfo), offsetof(tDot11fIEHTInfo, present),
	0, "HTInfo", 0, 24, 56, SigIeHTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTINFO, 0, },
	{ offsetof(tDot11fBeaconIEs, sec_chan_offset_ele),
	offsetof(tDot11fIEsec_chan_offset_ele, present), 0, "sec_chan_offset_ele",
	0, 3, 3, SigIesec_chan_offset_ele, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SEC_CHAN_OFFSET_ELE, 0, },
	{ offsetof(tDot11fBeaconIEs, WMMInfoAp), offsetof(tDot11fIEWMMInfoAp,
	present), 0, "WMMInfoAp", 0, 9, 9, SigIeWMMInfoAp, {0, 80, 242, 2, 0},
	5, DOT11F_EID_WMMINFOAP, 0, },
	{ offsetof(tDot11fBeaconIEs, WMMParams), offsetof(tDot11fIEWMMParams,
	present), 0, "WMMParams", 0, 26, 26, SigIeWMMParams, {0, 80, 242, 2, 1},
	5, DOT11F_EID_WMMPARAMS, 0, },
	{ offsetof(tDot11fBeaconIEs, WMMCaps), offsetof(tDot11fIEWMMCaps,
	present), 0, "WMMCaps", 0, 9, 9, SigIeWMMCaps, {0, 80, 242, 2, 5},
	5, DOT11F_EID_WMMCAPS, 0, },
	{ offsetof(tDot11fBeaconIEs, WAPI), offsetof(tDot11fIEWAPI, present), 0,
	"WAPI", 0, 14, 112, SigIeWAPI, {0, 0, 0, 0, 0}, 0, DOT11F_EID_WAPI, 0, },
	{ offsetof(tDot11fBeaconIEs, ESEVersion), offsetof(tDot11fIEESEVersion,
	present), 0, "ESEVersion", 0, 7, 7, SigIeESEVersion, {0, 64, 150, 3, 0},
	4, DOT11F_EID_ESEVERSION, 0, },
	{ offsetof(tDot11fBeaconIEs, ESERadMgmtCap),
	offsetof(tDot11fIEESERadMgmtCap, present), 0, "ESERadMgmtCap",
	0, 8, 8, SigIeESERadMgmtCap, {0, 64, 150, 1, 0},
	4, DOT11F_EID_ESERADMGMTCAP, 0, },
	{ offsetof(tDot11fBeaconIEs, ESETrafStrmMet),
	offsetof(tDot11fIEESETrafStrmMet, present), 0, "ESETrafStrmMet",
	0, 10, 10, SigIeESETrafStrmMet, {0, 64, 150, 7, 0},
	4, DOT11F_EID_ESETRAFSTRMMET, 0, },
	{ offsetof(tDot11fBeaconIEs, ESETxmitPower),
	offsetof(tDot11fIEESETxmitPower, present), 0, "ESETxmitPower",
	0, 8, 8, SigIeESETxmitPower, {0, 64, 150, 0, 0},
	4, DOT11F_EID_ESETXMITPOWER, 0, },
	{ offsetof(tDot11fBeaconIEs, WscBeaconProbeRes),
	offsetof(tDot11fIEWscBeaconProbeRes, present), 0, "WscBeaconProbeRes",
	0, 6, 319, SigIeWscBeaconProbeRes, {0, 80, 242, 4, 0},
	4, DOT11F_EID_WSCBEACONPROBERES, 0, },
	{ offsetof(tDot11fBeaconIEs, P2PBeaconProbeRes),
	offsetof(tDot11fIEP2PBeaconProbeRes, present), 0, "P2PBeaconProbeRes",
	0, 6, 1150, SigIeP2PBeaconProbeRes, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PBEACONPROBERES, 0, },
	{ offsetof(tDot11fBeaconIEs, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fBeaconIEs, VHTOperation),
	offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation",
	0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTOPERATION, 0, },
	{ offsetof(tDot11fBeaconIEs, VHTExtBssLoad),
	offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad",
	0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTEXTBSSLOAD, 0, },
	{ offsetof(tDot11fBeaconIEs, ExtCap), offsetof(tDot11fIEExtCap, present),
	0, "ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fBeaconIEs, OperatingMode),
	offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode",
	0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OPERATINGMODE, 0, },
	{ offsetof(tDot11fBeaconIEs, WiderBWChanSwitchAnn),
	offsetof(tDot11fIEWiderBWChanSwitchAnn, present), 0,
	"WiderBWChanSwitchAnn", 0, 5, 5, SigIeWiderBWChanSwitchAnn,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_WIDERBWCHANSWITCHANN, 0, },
	{ offsetof(tDot11fBeaconIEs, OBSSScanParameters),
	offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters",
	0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OBSSSCANPARAMETERS, 0, },
	{ offsetof(tDot11fBeaconIEs, Vendor1IE), offsetof(tDot11fIEVendor1IE,
	present), 0, "Vendor1IE", 0, 5, 5, SigIeVendor1IE, {0, 16, 24, 0, 0},
	3, DOT11F_EID_VENDOR1IE, 0, },
	{ offsetof(tDot11fBeaconIEs, vendor2_ie), offsetof(tDot11fIEvendor2_ie,
	present), 0, "vendor2_ie", 0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
	3, DOT11F_EID_VENDOR2_IE, 0, },
	{ offsetof(tDot11fBeaconIEs, Vendor3IE), offsetof(tDot11fIEVendor3IE,
	present), 0, "Vendor3IE", 0, 5, 5, SigIeVendor3IE, {0, 22, 50, 0, 0},
	3, DOT11F_EID_VENDOR3IE, 0, },
	{ offsetof(tDot11fBeaconIEs, ChannelSwitchWrapper),
	offsetof(tDot11fIEChannelSwitchWrapper, present), 0,
	"ChannelSwitchWrapper", 0, 2, 7, SigIeChannelSwitchWrapper,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_CHANNELSWITCHWRAPPER, 0, },
	{ offsetof(tDot11fBeaconIEs, QComVendorIE),
	offsetof(tDot11fIEQComVendorIE, present), 0, "QComVendorIE",
	0, 7, 7, SigIeQComVendorIE, {0, 160, 198, 0, 0},
	3, DOT11F_EID_QCOMVENDORIE, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_beacon_i_es(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fBeaconIEs *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_BeaconIEs, IES_BeaconIEs,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_beacon_i_es. */

static const tFFDefn FFS_ChannelSwitch[] = {
	{ "Category", offsetof(tDot11fChannelSwitch, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fChannelSwitch, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_ChannelSwitch[] = {
	{ offsetof(tDot11fChannelSwitch, ChanSwitchAnn),
	offsetof(tDot11fIEChanSwitchAnn, present), 0, "ChanSwitchAnn",
	0, 5, 5, SigIeChanSwitchAnn, {0, 0, 0, 0, 0},
	0, DOT11F_EID_CHANSWITCHANN, 1, },
	{ offsetof(tDot11fChannelSwitch, sec_chan_offset_ele),
	offsetof(tDot11fIEsec_chan_offset_ele, present), 0, "sec_chan_offset_ele",
	0, 3, 3, SigIesec_chan_offset_ele, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SEC_CHAN_OFFSET_ELE, 0, },
	{ offsetof(tDot11fChannelSwitch, WiderBWChanSwitchAnn),
	offsetof(tDot11fIEWiderBWChanSwitchAnn, present), 0,
	"WiderBWChanSwitchAnn", 0, 5, 5, SigIeWiderBWChanSwitchAnn,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_WIDERBWCHANSWITCHANN, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_channel_switch(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fChannelSwitch *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_ChannelSwitch, IES_ChannelSwitch,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_channel_switch. */

static const tFFDefn FFS_DeAuth[] = {
	{ "Reason", offsetof(tDot11fDeAuth, Reason), SigFfReason,
	DOT11F_FF_REASON_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_DeAuth[] = {
	{ offsetof(tDot11fDeAuth, P2PDeAuth), offsetof(tDot11fIEP2PDeAuth,
	present), 0, "P2PDeAuth", 0, 6, 10, SigIeP2PDeAuth, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PDEAUTH, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_de_auth(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fDeAuth *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_DeAuth, IES_DeAuth,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_de_auth. */

static const tFFDefn FFS_DelTS[] = {
	{ "Category", offsetof(tDot11fDelTS, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fDelTS, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "TSInfo", offsetof(tDot11fDelTS, TSInfo), SigFfTSInfo,
	DOT11F_FF_TSINFO_LEN, },
	{ "Reason", offsetof(tDot11fDelTS, Reason), SigFfReason,
	DOT11F_FF_REASON_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_DelTS[] = {
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_del_ts(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fDelTS *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_DelTS, IES_DelTS,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_del_ts. */

static const tFFDefn FFS_Disassociation[] = {
	{ "Reason", offsetof(tDot11fDisassociation, Reason), SigFfReason,
	DOT11F_FF_REASON_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_Disassociation[] = {
	{ offsetof(tDot11fDisassociation, P2PDisAssoc),
	offsetof(tDot11fIEP2PDisAssoc, present), 0, "P2PDisAssoc",
	0, 6, 10, SigIeP2PDisAssoc, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PDISASSOC, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_disassociation(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fDisassociation *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_Disassociation, IES_Disassociation,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_disassociation. */

static const tFFDefn FFS_LinkMeasurementReport[] = {
	{ "Category", offsetof(tDot11fLinkMeasurementReport, Category),
	SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fLinkMeasurementReport, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fLinkMeasurementReport, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ "TPCEleID", offsetof(tDot11fLinkMeasurementReport, TPCEleID),
	SigFfTPCEleID, DOT11F_FF_TPCELEID_LEN, },
	{ "TPCEleLen", offsetof(tDot11fLinkMeasurementReport, TPCEleLen),
	SigFfTPCEleLen, DOT11F_FF_TPCELELEN_LEN, },
	{ "TxPower", offsetof(tDot11fLinkMeasurementReport, TxPower),
	SigFfTxPower, DOT11F_FF_TXPOWER_LEN, },
	{ "LinkMargin", offsetof(tDot11fLinkMeasurementReport, LinkMargin),
	SigFfLinkMargin, DOT11F_FF_LINKMARGIN_LEN, },
	{ "RxAntennaId", offsetof(tDot11fLinkMeasurementReport, RxAntennaId),
	SigFfRxAntennaId, DOT11F_FF_RXANTENNAID_LEN, },
	{ "TxAntennaId", offsetof(tDot11fLinkMeasurementReport, TxAntennaId),
	SigFfTxAntennaId, DOT11F_FF_TXANTENNAID_LEN, },
	{ "RCPI", offsetof(tDot11fLinkMeasurementReport, RCPI), SigFfRCPI,
	DOT11F_FF_RCPI_LEN, },
	{ "RSNI", offsetof(tDot11fLinkMeasurementReport, RSNI), SigFfRSNI,
	DOT11F_FF_RSNI_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_LinkMeasurementReport[] = {
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_link_measurement_report(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fLinkMeasurementReport *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_LinkMeasurementReport, IES_LinkMeasurementReport,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_link_measurement_report. */

static const tFFDefn FFS_LinkMeasurementRequest[] = {
	{ "Category", offsetof(tDot11fLinkMeasurementRequest, Category),
	SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fLinkMeasurementRequest, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fLinkMeasurementRequest, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ "TxPower", offsetof(tDot11fLinkMeasurementRequest, TxPower),
	SigFfTxPower, DOT11F_FF_TXPOWER_LEN, },
	{ "MaxTxPower", offsetof(tDot11fLinkMeasurementRequest, MaxTxPower),
	SigFfMaxTxPower, DOT11F_FF_MAXTXPOWER_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_LinkMeasurementRequest[] = {
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_link_measurement_request(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fLinkMeasurementRequest *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_LinkMeasurementRequest, IES_LinkMeasurementRequest,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_link_measurement_request. */

static const tFFDefn FFS_MeasurementReport[] = {
	{ "Category", offsetof(tDot11fMeasurementReport, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fMeasurementReport, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fMeasurementReport, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_MeasurementReport[] = {
	{ offsetof(tDot11fMeasurementReport, MeasurementReport),
	offsetof(tDot11fIEMeasurementReport, present), 0, "MeasurementReport",
	0, 5, 31, SigIeMeasurementReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MEASUREMENTREPORT, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_measurement_report(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fMeasurementReport *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_MeasurementReport, IES_MeasurementReport,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_measurement_report. */

static const tFFDefn FFS_MeasurementRequest[] = {
	{ "Category", offsetof(tDot11fMeasurementRequest, Category),
	SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fMeasurementRequest, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fMeasurementRequest, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_MeasurementRequest[] = {
	{ offsetof(tDot11fMeasurementRequest, MeasurementRequest),
	offsetof(tDot11fIEMeasurementRequest, present),
	offsetof(tDot11fMeasurementRequest, num_MeasurementRequest),
	"MeasurementRequest", 4, 16, 18, SigIeMeasurementRequest,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_MEASUREMENTREQUEST, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_measurement_request(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fMeasurementRequest *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_MeasurementRequest, IES_MeasurementRequest,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_measurement_request. */

static const tFFDefn FFS_NeighborReportRequest[] = {
	{ "Category", offsetof(tDot11fNeighborReportRequest, Category),
	SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fNeighborReportRequest, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fNeighborReportRequest, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_NeighborReportRequest[] = {
	{ offsetof(tDot11fNeighborReportRequest, SSID), offsetof(tDot11fIESSID,
	present), 0, "SSID", 0, 2, 34, SigIeSSID, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SSID, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_neighbor_report_request(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fNeighborReportRequest *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_NeighborReportRequest, IES_NeighborReportRequest,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_neighbor_report_request. */

static const tFFDefn FFS_NeighborReportResponse[] = {
	{ "Category", offsetof(tDot11fNeighborReportResponse, Category),
	SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fNeighborReportResponse, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fNeighborReportResponse, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_NeighborReportResponse[] = {
	{ offsetof(tDot11fNeighborReportResponse, NeighborReport),
	offsetof(tDot11fIENeighborReport, present),
	offsetof(tDot11fNeighborReportResponse, num_NeighborReport),
	"NeighborReport", 15, 15, 548, SigIeNeighborReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_NEIGHBORREPORT, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_neighbor_report_response(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fNeighborReportResponse *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_NeighborReportResponse, IES_NeighborReportResponse,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_neighbor_report_response. */

static const tFFDefn FFS_OperatingMode[] = {
	{ "Category", offsetof(tDot11fOperatingMode, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fOperatingMode, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "OperatingMode", offsetof(tDot11fOperatingMode, OperatingMode),
	SigFfOperatingMode, DOT11F_FF_OPERATINGMODE_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_OperatingMode[] = {
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_operating_mode(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fOperatingMode *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_OperatingMode, IES_OperatingMode,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_operating_mode. */

static const tFFDefn FFS_ProbeRequest[] = {
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_ProbeRequest[] = {
	{ offsetof(tDot11fProbeRequest, SSID), offsetof(tDot11fIESSID, present), 0,
	"SSID", 0, 2, 34, SigIeSSID, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SSID, 1, },
	{ offsetof(tDot11fProbeRequest, SuppRates), offsetof(tDot11fIESuppRates,
	present), 0, "SuppRates", 0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fProbeRequest, RequestedInfo),
	offsetof(tDot11fIERequestedInfo, present), 0, "RequestedInfo",
	0, 2, 257, SigIeRequestedInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_REQUESTEDINFO, 0, },
	{ offsetof(tDot11fProbeRequest, ExtSuppRates),
	offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates",
	0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fProbeRequest, DSParams), offsetof(tDot11fIEDSParams,
	present), 0, "DSParams", 0, 3, 3, SigIeDSParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_DSPARAMS, 0, },
	{ offsetof(tDot11fProbeRequest, HTCaps), offsetof(tDot11fIEHTCaps,
	present), 0, "HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fProbeRequest, WscProbeReq),
	offsetof(tDot11fIEWscProbeReq, present), 0, "WscProbeReq",
	0, 6, 286, SigIeWscProbeReq, {0, 80, 242, 4, 0},
	4, DOT11F_EID_WSCPROBEREQ, 0, },
	{ offsetof(tDot11fProbeRequest, WFATPC), offsetof(tDot11fIEWFATPC,
	present), 0, "WFATPC", 0, 9, 9, SigIeWFATPC, {0, 80, 242, 8, 0},
	5, DOT11F_EID_WFATPC, 0, },
	{ offsetof(tDot11fProbeRequest, P2PProbeReq),
	offsetof(tDot11fIEP2PProbeReq, present), 0, "P2PProbeReq",
	0, 6, 43, SigIeP2PProbeReq, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PPROBEREQ, 0, },
	{ offsetof(tDot11fProbeRequest, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fProbeRequest, ExtCap), offsetof(tDot11fIEExtCap,
	present), 0, "ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_probe_request(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fProbeRequest *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_ProbeRequest, IES_ProbeRequest,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_probe_request. */

static const tFFDefn FFS_ProbeResponse[] = {
	{ "TimeStamp", offsetof(tDot11fProbeResponse, TimeStamp), SigFfTimeStamp,
	DOT11F_FF_TIMESTAMP_LEN, },
	{ "BeaconInterval", offsetof(tDot11fProbeResponse, BeaconInterval),
	SigFfBeaconInterval, DOT11F_FF_BEACONINTERVAL_LEN, },
	{ "Capabilities", offsetof(tDot11fProbeResponse, Capabilities),
	SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_ProbeResponse[] = {
	{ offsetof(tDot11fProbeResponse, SSID), offsetof(tDot11fIESSID, present),
	0, "SSID", 0, 2, 34, SigIeSSID, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SSID, 1, },
	{ offsetof(tDot11fProbeResponse, SuppRates), offsetof(tDot11fIESuppRates,
	present), 0, "SuppRates", 0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fProbeResponse, FHParamSet),
	offsetof(tDot11fIEFHParamSet, present), 0, "FHParamSet",
	0, 7, 7, SigIeFHParamSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FHPARAMSET, 0, },
	{ offsetof(tDot11fProbeResponse, DSParams), offsetof(tDot11fIEDSParams,
	present), 0, "DSParams", 0, 3, 3, SigIeDSParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_DSPARAMS, 0, },
	{ offsetof(tDot11fProbeResponse, CFParams), offsetof(tDot11fIECFParams,
	present), 0, "CFParams", 0, 8, 8, SigIeCFParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_CFPARAMS, 0, },
	{ offsetof(tDot11fProbeResponse, IBSSParams),
	offsetof(tDot11fIEIBSSParams, present), 0, "IBSSParams",
	0, 4, 4, SigIeIBSSParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_IBSSPARAMS, 0, },
	{ offsetof(tDot11fProbeResponse, Country), offsetof(tDot11fIECountry,
	present), 0, "Country", 0, 5, 257, SigIeCountry, {0, 0, 0, 0, 0},
	0, DOT11F_EID_COUNTRY, 0, },
	{ offsetof(tDot11fProbeResponse, FHParams), offsetof(tDot11fIEFHParams,
	present), 0, "FHParams", 0, 4, 4, SigIeFHParams, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FHPARAMS, 0, },
	{ offsetof(tDot11fProbeResponse, FHPattTable),
	offsetof(tDot11fIEFHPattTable, present), 0, "FHPattTable",
	0, 6, 257, SigIeFHPattTable, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FHPATTTABLE, 0, },
	{ offsetof(tDot11fProbeResponse, PowerConstraints),
	offsetof(tDot11fIEPowerConstraints, present), 0, "PowerConstraints",
	0, 3, 3, SigIePowerConstraints, {0, 0, 0, 0, 0},
	0, DOT11F_EID_POWERCONSTRAINTS, 0, },
	{ offsetof(tDot11fProbeResponse, ChanSwitchAnn),
	offsetof(tDot11fIEChanSwitchAnn, present), 0, "ChanSwitchAnn",
	0, 5, 5, SigIeChanSwitchAnn, {0, 0, 0, 0, 0},
	0, DOT11F_EID_CHANSWITCHANN, 0, },
	{ offsetof(tDot11fProbeResponse, ext_chan_switch_ann),
	offsetof(tDot11fIEext_chan_switch_ann, present), 0, "ext_chan_switch_ann",
	0, 6, 6, SigIeext_chan_switch_ann, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXT_CHAN_SWITCH_ANN, 0, },
	{ offsetof(tDot11fProbeResponse, Quiet), offsetof(tDot11fIEQuiet,
	present), 0, "Quiet", 0, 8, 8, SigIeQuiet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QUIET, 0, },
	{ offsetof(tDot11fProbeResponse, TPCReport), offsetof(tDot11fIETPCReport,
	present), 0, "TPCReport", 0, 4, 4, SigIeTPCReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TPCREPORT, 0, },
	{ offsetof(tDot11fProbeResponse, ERPInfo), offsetof(tDot11fIEERPInfo,
	present), 0, "ERPInfo", 0, 3, 3, SigIeERPInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_ERPINFO, 0, },
	{ offsetof(tDot11fProbeResponse, ExtSuppRates),
	offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates",
	0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fProbeResponse, RSNOpaque), offsetof(tDot11fIERSNOpaque,
	present), 0, "RSNOpaque", 0, 8, 255, SigIeRSNOpaque, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RSNOPAQUE, 0, },
	{ offsetof(tDot11fProbeResponse, QBSSLoad), offsetof(tDot11fIEQBSSLoad,
	present), 0, "QBSSLoad", 0, 7, 7, SigIeQBSSLoad, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QBSSLOAD, 0, },
	{ offsetof(tDot11fProbeResponse, EDCAParamSet),
	offsetof(tDot11fIEEDCAParamSet, present), 0, "EDCAParamSet",
	0, 20, 20, SigIeEDCAParamSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EDCAPARAMSET, 0, },
	{ offsetof(tDot11fProbeResponse, RRMEnabledCap),
	offsetof(tDot11fIERRMEnabledCap, present), 0, "RRMEnabledCap",
	0, 7, 7, SigIeRRMEnabledCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RRMENABLEDCAP, 0, },
	{ offsetof(tDot11fProbeResponse, APChannelReport),
	offsetof(tDot11fIEAPChannelReport, present), 0, "APChannelReport",
	0, 3, 53, SigIeAPChannelReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_APCHANNELREPORT, 0, },
	{ offsetof(tDot11fProbeResponse, MobilityDomain),
	offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain",
	0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MOBILITYDOMAIN, 0, },
	{ offsetof(tDot11fProbeResponse, WPA), offsetof(tDot11fIEWPA, present), 0,
	"WPA", 0, 8, 50, SigIeWPA, {0, 80, 242, 1, 0}, 4, DOT11F_EID_WPA, 0, },
	{ offsetof(tDot11fProbeResponse, HTCaps), offsetof(tDot11fIEHTCaps,
	present), 0, "HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fProbeResponse, HTInfo), offsetof(tDot11fIEHTInfo,
	present), 0, "HTInfo", 0, 24, 56, SigIeHTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTINFO, 0, },
	{ offsetof(tDot11fProbeResponse, sec_chan_offset_ele),
	offsetof(tDot11fIEsec_chan_offset_ele, present), 0, "sec_chan_offset_ele",
	0, 3, 3, SigIesec_chan_offset_ele, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SEC_CHAN_OFFSET_ELE, 0, },
	{ offsetof(tDot11fProbeResponse, WMMInfoAp), offsetof(tDot11fIEWMMInfoAp,
	present), 0, "WMMInfoAp", 0, 9, 9, SigIeWMMInfoAp, {0, 80, 242, 2, 0},
	5, DOT11F_EID_WMMINFOAP, 0, },
	{ offsetof(tDot11fProbeResponse, WMMParams), offsetof(tDot11fIEWMMParams,
	present), 0, "WMMParams", 0, 26, 26, SigIeWMMParams, {0, 80, 242, 2, 1},
	5, DOT11F_EID_WMMPARAMS, 0, },
	{ offsetof(tDot11fProbeResponse, WMMCaps), offsetof(tDot11fIEWMMCaps,
	present), 0, "WMMCaps", 0, 9, 9, SigIeWMMCaps, {0, 80, 242, 2, 5},
	5, DOT11F_EID_WMMCAPS, 0, },
	{ offsetof(tDot11fProbeResponse, WAPI), offsetof(tDot11fIEWAPI, present),
	0, "WAPI", 0, 14, 112, SigIeWAPI, {0, 0, 0, 0, 0},
	0, DOT11F_EID_WAPI, 0, },
	{ offsetof(tDot11fProbeResponse, ESERadMgmtCap),
	offsetof(tDot11fIEESERadMgmtCap, present), 0, "ESERadMgmtCap",
	0, 8, 8, SigIeESERadMgmtCap, {0, 64, 150, 1, 0},
	4, DOT11F_EID_ESERADMGMTCAP, 0, },
	{ offsetof(tDot11fProbeResponse, ESETrafStrmMet),
	offsetof(tDot11fIEESETrafStrmMet, present), 0, "ESETrafStrmMet",
	0, 10, 10, SigIeESETrafStrmMet, {0, 64, 150, 7, 0},
	4, DOT11F_EID_ESETRAFSTRMMET, 0, },
	{ offsetof(tDot11fProbeResponse, ESETxmitPower),
	offsetof(tDot11fIEESETxmitPower, present), 0, "ESETxmitPower",
	0, 8, 8, SigIeESETxmitPower, {0, 64, 150, 0, 0},
	4, DOT11F_EID_ESETXMITPOWER, 0, },
	{ offsetof(tDot11fProbeResponse, WscProbeRes),
	offsetof(tDot11fIEWscProbeRes, present), 0, "WscProbeRes",
	0, 6, 319, SigIeWscProbeRes, {0, 80, 242, 4, 0},
	4, DOT11F_EID_WSCPROBERES, 0, },
	{ offsetof(tDot11fProbeResponse, P2PProbeRes),
	offsetof(tDot11fIEP2PProbeRes, present), 0, "P2PProbeRes",
	0, 6, 1141, SigIeP2PProbeRes, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PPROBERES, 0, },
	{ offsetof(tDot11fProbeResponse, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fProbeResponse, VHTOperation),
	offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation",
	0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTOPERATION, 0, },
	{ offsetof(tDot11fProbeResponse, VHTExtBssLoad),
	offsetof(tDot11fIEVHTExtBssLoad, present), 0, "VHTExtBssLoad",
	0, 7, 7, SigIeVHTExtBssLoad, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTEXTBSSLOAD, 0, },
	{ offsetof(tDot11fProbeResponse, ExtCap), offsetof(tDot11fIEExtCap,
	present), 0, "ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fProbeResponse, OBSSScanParameters),
	offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters",
	0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OBSSSCANPARAMETERS, 0, },
	{ offsetof(tDot11fProbeResponse, Vendor1IE), offsetof(tDot11fIEVendor1IE,
	present), 0, "Vendor1IE", 0, 5, 5, SigIeVendor1IE, {0, 16, 24, 0, 0},
	3, DOT11F_EID_VENDOR1IE, 0, },
	{ offsetof(tDot11fProbeResponse, vendor2_ie),
	offsetof(tDot11fIEvendor2_ie, present), 0, "vendor2_ie",
	0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
	3, DOT11F_EID_VENDOR2_IE, 0, },
	{ offsetof(tDot11fProbeResponse, Vendor3IE), offsetof(tDot11fIEVendor3IE,
	present), 0, "Vendor3IE", 0, 5, 5, SigIeVendor3IE, {0, 22, 50, 0, 0},
	3, DOT11F_EID_VENDOR3IE, 0, },
	{ offsetof(tDot11fProbeResponse, ChannelSwitchWrapper),
	offsetof(tDot11fIEChannelSwitchWrapper, present), 0,
	"ChannelSwitchWrapper", 0, 2, 7, SigIeChannelSwitchWrapper,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_CHANNELSWITCHWRAPPER, 0, },
	{ offsetof(tDot11fProbeResponse, QComVendorIE),
	offsetof(tDot11fIEQComVendorIE, present), 0, "QComVendorIE",
	0, 7, 7, SigIeQComVendorIE, {0, 160, 198, 0, 0},
	3, DOT11F_EID_QCOMVENDORIE, 0, },
	{ offsetof(tDot11fProbeResponse, ESEVersion),
	offsetof(tDot11fIEESEVersion, present), 0, "ESEVersion",
	0, 7, 7, SigIeESEVersion, {0, 64, 150, 3, 0},
	4, DOT11F_EID_ESEVERSION, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_probe_response(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fProbeResponse *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_ProbeResponse, IES_ProbeResponse,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_probe_response. */

static const tFFDefn FFS_QosMapConfigure[] = {
	{ "Category", offsetof(tDot11fQosMapConfigure, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fQosMapConfigure, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_QosMapConfigure[] = {
	{ offsetof(tDot11fQosMapConfigure, QosMapSet),
	offsetof(tDot11fIEQosMapSet, present), 0, "QosMapSet",
	0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSMAPSET, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_qos_map_configure(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fQosMapConfigure *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_QosMapConfigure, IES_QosMapConfigure,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_qos_map_configure. */

static const tFFDefn FFS_RadioMeasurementReport[] = {
	{ "Category", offsetof(tDot11fRadioMeasurementReport, Category),
	SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fRadioMeasurementReport, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fRadioMeasurementReport, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_RadioMeasurementReport[] = {
	{ offsetof(tDot11fRadioMeasurementReport, MeasurementReport),
	offsetof(tDot11fIEMeasurementReport, present),
	offsetof(tDot11fRadioMeasurementReport, num_MeasurementReport),
	"MeasurementReport", 4, 5, 31, SigIeMeasurementReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MEASUREMENTREPORT, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_radio_measurement_report(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fRadioMeasurementReport *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_RadioMeasurementReport, IES_RadioMeasurementReport,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_radio_measurement_report. */

static const tFFDefn FFS_RadioMeasurementRequest[] = {
	{ "Category", offsetof(tDot11fRadioMeasurementRequest, Category),
	SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fRadioMeasurementRequest, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fRadioMeasurementRequest, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ "NumOfRepetitions", offsetof(tDot11fRadioMeasurementRequest,
	NumOfRepetitions), SigFfNumOfRepetitions,
	DOT11F_FF_NUMOFREPETITIONS_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_RadioMeasurementRequest[] = {
	{ offsetof(tDot11fRadioMeasurementRequest, MeasurementRequest),
	offsetof(tDot11fIEMeasurementRequest, present),
	offsetof(tDot11fRadioMeasurementRequest, num_MeasurementRequest),
	"MeasurementRequest", 2, 16, 18, SigIeMeasurementRequest,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_MEASUREMENTREQUEST, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_radio_measurement_request(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fRadioMeasurementRequest *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_RadioMeasurementRequest, IES_RadioMeasurementRequest,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_radio_measurement_request. */

static const tFFDefn FFS_ReAssocRequest[] = {
	{ "Capabilities", offsetof(tDot11fReAssocRequest, Capabilities),
	SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ "ListenInterval", offsetof(tDot11fReAssocRequest, ListenInterval),
	SigFfListenInterval, DOT11F_FF_LISTENINTERVAL_LEN, },
	{ "CurrentAPAddress", offsetof(tDot11fReAssocRequest, CurrentAPAddress),
	SigFfCurrentAPAddress, DOT11F_FF_CURRENTAPADDRESS_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_ReAssocRequest[] = {
	{ offsetof(tDot11fReAssocRequest, SSID), offsetof(tDot11fIESSID, present),
	0, "SSID", 0, 2, 34, SigIeSSID, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SSID, 1, },
	{ offsetof(tDot11fReAssocRequest, SuppRates),
	offsetof(tDot11fIESuppRates, present), 0, "SuppRates",
	0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fReAssocRequest, ExtSuppRates),
	offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates",
	0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fReAssocRequest, PowerCaps),
	offsetof(tDot11fIEPowerCaps, present), 0, "PowerCaps",
	0, 4, 4, SigIePowerCaps, {0, 0, 0, 0, 0}, 0, DOT11F_EID_POWERCAPS, 0, },
	{ offsetof(tDot11fReAssocRequest, SuppChannels),
	offsetof(tDot11fIESuppChannels, present), 0, "SuppChannels",
	0, 4, 98, SigIeSuppChannels, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPCHANNELS, 0, },
	{ offsetof(tDot11fReAssocRequest, RSNOpaque),
	offsetof(tDot11fIERSNOpaque, present), 0, "RSNOpaque",
	0, 8, 255, SigIeRSNOpaque, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RSNOPAQUE, 0, },
	{ offsetof(tDot11fReAssocRequest, QOSCapsStation),
	offsetof(tDot11fIEQOSCapsStation, present), 0, "QOSCapsStation",
	0, 3, 3, SigIeQOSCapsStation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QOSCAPSSTATION, 0, },
	{ offsetof(tDot11fReAssocRequest, RRMEnabledCap),
	offsetof(tDot11fIERRMEnabledCap, present), 0, "RRMEnabledCap",
	0, 7, 7, SigIeRRMEnabledCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RRMENABLEDCAP, 0, },
	{ offsetof(tDot11fReAssocRequest, MobilityDomain),
	offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain",
	0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MOBILITYDOMAIN, 0, },
	{ offsetof(tDot11fReAssocRequest, FTInfo), offsetof(tDot11fIEFTInfo,
	present), 0, "FTInfo", 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FTINFO, 0, },
	{ offsetof(tDot11fReAssocRequest, RICDataDesc),
	offsetof(tDot11fIERICDataDesc, present),
	offsetof(tDot11fReAssocRequest, num_RICDataDesc), "RICDataDesc",
	2, 2, 550, SigIeRICDataDesc, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RICDATADESC, 0, },
	{ offsetof(tDot11fReAssocRequest, WPAOpaque),
	offsetof(tDot11fIEWPAOpaque, present), 0, "WPAOpaque",
	0, 8, 255, SigIeWPAOpaque, {0, 80, 242, 1, 0},
	4, DOT11F_EID_WPAOPAQUE, 0, },
	{ offsetof(tDot11fReAssocRequest, HTCaps), offsetof(tDot11fIEHTCaps,
	present), 0, "HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fReAssocRequest, WMMCaps), offsetof(tDot11fIEWMMCaps,
	present), 0, "WMMCaps", 0, 9, 9, SigIeWMMCaps, {0, 80, 242, 2, 5},
	5, DOT11F_EID_WMMCAPS, 0, },
	{ offsetof(tDot11fReAssocRequest, WMMInfoStation),
	offsetof(tDot11fIEWMMInfoStation, present), 0, "WMMInfoStation",
	0, 9, 9, SigIeWMMInfoStation, {0, 80, 242, 2, 0},
	5, DOT11F_EID_WMMINFOSTATION, 0, },
	{ offsetof(tDot11fReAssocRequest, WscIEOpaque),
	offsetof(tDot11fIEWscIEOpaque, present), 0, "WscIEOpaque",
	0, 8, 255, SigIeWscIEOpaque, {0, 80, 242, 4, 0},
	4, DOT11F_EID_WSCIEOPAQUE, 0, },
	{ offsetof(tDot11fReAssocRequest, WAPIOpaque),
	offsetof(tDot11fIEWAPIOpaque, present), 0, "WAPIOpaque",
	0, 8, 255, SigIeWAPIOpaque, {0, 0, 0, 0, 0},
	0, DOT11F_EID_WAPIOPAQUE, 0, },
	{ offsetof(tDot11fReAssocRequest, WAPI), offsetof(tDot11fIEWAPI, present),
	0, "WAPI", 0, 14, 112, SigIeWAPI, {0, 0, 0, 0, 0},
	0, DOT11F_EID_WAPI, 0, },
	{ offsetof(tDot11fReAssocRequest, ESERadMgmtCap),
	offsetof(tDot11fIEESERadMgmtCap, present), 0, "ESERadMgmtCap",
	0, 8, 8, SigIeESERadMgmtCap, {0, 64, 150, 1, 0},
	4, DOT11F_EID_ESERADMGMTCAP, 0, },
	{ offsetof(tDot11fReAssocRequest, ESEVersion),
	offsetof(tDot11fIEESEVersion, present), 0, "ESEVersion",
	0, 7, 7, SigIeESEVersion, {0, 64, 150, 3, 0},
	4, DOT11F_EID_ESEVERSION, 0, },
	{ offsetof(tDot11fReAssocRequest, ESECckmOpaque),
	offsetof(tDot11fIEESECckmOpaque, present), 0, "ESECckmOpaque",
	0, 12, 26, SigIeESECckmOpaque, {0, 64, 150, 0, 0},
	4, DOT11F_EID_ESECCKMOPAQUE, 0, },
	{ offsetof(tDot11fReAssocRequest, WMMTSPEC), offsetof(tDot11fIEWMMTSPEC,
	present), offsetof(tDot11fReAssocRequest, num_WMMTSPEC), "WMMTSPEC",
	4, 63, 63, SigIeWMMTSPEC, {0, 80, 242, 2, 2},
	5, DOT11F_EID_WMMTSPEC, 0, },
	{ offsetof(tDot11fReAssocRequest, ESETrafStrmRateSet),
	offsetof(tDot11fIEESETrafStrmRateSet, present), 0, "ESETrafStrmRateSet",
	0, 7, 15, SigIeESETrafStrmRateSet, {0, 64, 150, 8, 0},
	4, DOT11F_EID_ESETRAFSTRMRATESET, 0, },
	{ offsetof(tDot11fReAssocRequest, P2PIEOpaque),
	offsetof(tDot11fIEP2PIEOpaque, present), 0, "P2PIEOpaque",
	0, 8, 255, SigIeP2PIEOpaque, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PIEOPAQUE, 0, },
	{ offsetof(tDot11fReAssocRequest, WFDIEOpaque),
	offsetof(tDot11fIEWFDIEOpaque, present), 0, "WFDIEOpaque",
	0, 8, 255, SigIeWFDIEOpaque, {80, 111, 154, 10, 0},
	4, DOT11F_EID_WFDIEOPAQUE, 0, },
	{ offsetof(tDot11fReAssocRequest, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fReAssocRequest, ExtCap), offsetof(tDot11fIEExtCap,
	present), 0, "ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fReAssocRequest, OperatingMode),
	offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode",
	0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OPERATINGMODE, 0, },
	{ offsetof(tDot11fReAssocRequest, QosMapSet),
	offsetof(tDot11fIEQosMapSet, present), 0, "QosMapSet",
	0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSMAPSET, 0, },
	{ offsetof(tDot11fReAssocRequest, vendor2_ie),
	offsetof(tDot11fIEvendor2_ie, present), 0, "vendor2_ie",
	0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
	3, DOT11F_EID_VENDOR2_IE, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_re_assoc_request(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fReAssocRequest *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_ReAssocRequest, IES_ReAssocRequest,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_re_assoc_request. */

static const tFFDefn FFS_ReAssocResponse[] = {
	{ "Capabilities", offsetof(tDot11fReAssocResponse, Capabilities),
	SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ "Status", offsetof(tDot11fReAssocResponse, Status), SigFfStatus,
	DOT11F_FF_STATUS_LEN, },
	{ "AID", offsetof(tDot11fReAssocResponse, AID), SigFfAID,
	DOT11F_FF_AID_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_ReAssocResponse[] = {
	{ offsetof(tDot11fReAssocResponse, SuppRates),
	offsetof(tDot11fIESuppRates, present), 0, "SuppRates",
	0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fReAssocResponse, ExtSuppRates),
	offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates",
	0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fReAssocResponse, EDCAParamSet),
	offsetof(tDot11fIEEDCAParamSet, present), 0, "EDCAParamSet",
	0, 20, 20, SigIeEDCAParamSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EDCAPARAMSET, 0, },
	{ offsetof(tDot11fReAssocResponse, RCPIIE), offsetof(tDot11fIERCPIIE,
	present), 0, "RCPIIE", 0, 3, 3, SigIeRCPIIE, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RCPIIE, 0, },
	{ offsetof(tDot11fReAssocResponse, RSNIIE), offsetof(tDot11fIERSNIIE,
	present), 0, "RSNIIE", 0, 3, 3, SigIeRSNIIE, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RSNIIE, 0, },
	{ offsetof(tDot11fReAssocResponse, RRMEnabledCap),
	offsetof(tDot11fIERRMEnabledCap, present), 0, "RRMEnabledCap",
	0, 7, 7, SigIeRRMEnabledCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RRMENABLEDCAP, 0, },
	{ offsetof(tDot11fReAssocResponse, RSNOpaque),
	offsetof(tDot11fIERSNOpaque, present), 0, "RSNOpaque",
	0, 8, 255, SigIeRSNOpaque, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RSNOPAQUE, 0, },
	{ offsetof(tDot11fReAssocResponse, MobilityDomain),
	offsetof(tDot11fIEMobilityDomain, present), 0, "MobilityDomain",
	0, 5, 5, SigIeMobilityDomain, {0, 0, 0, 0, 0},
	0, DOT11F_EID_MOBILITYDOMAIN, 0, },
	{ offsetof(tDot11fReAssocResponse, FTInfo), offsetof(tDot11fIEFTInfo,
	present), 0, "FTInfo", 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FTINFO, 0, },
	{ offsetof(tDot11fReAssocResponse, RICDataDesc),
	offsetof(tDot11fIERICDataDesc, present),
	offsetof(tDot11fReAssocResponse, num_RICDataDesc), "RICDataDesc",
	2, 2, 550, SigIeRICDataDesc, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RICDATADESC, 0, },
	{ offsetof(tDot11fReAssocResponse, WPA), offsetof(tDot11fIEWPA, present),
	0, "WPA", 0, 8, 50, SigIeWPA, {0, 80, 242, 1, 0}, 4, DOT11F_EID_WPA, 0, },
	{ offsetof(tDot11fReAssocResponse, TimeoutInterval),
	offsetof(tDot11fIETimeoutInterval, present), 0, "TimeoutInterval",
	0, 7, 7, SigIeTimeoutInterval, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TIMEOUTINTERVAL, 0, },
	{ offsetof(tDot11fReAssocResponse, HTCaps), offsetof(tDot11fIEHTCaps,
	present), 0, "HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fReAssocResponse, HTInfo), offsetof(tDot11fIEHTInfo,
	present), 0, "HTInfo", 0, 24, 56, SigIeHTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTINFO, 0, },
	{ offsetof(tDot11fReAssocResponse, WMMParams),
	offsetof(tDot11fIEWMMParams, present), 0, "WMMParams",
	0, 26, 26, SigIeWMMParams, {0, 80, 242, 2, 1},
	5, DOT11F_EID_WMMPARAMS, 0, },
	{ offsetof(tDot11fReAssocResponse, ESERadMgmtCap),
	offsetof(tDot11fIEESERadMgmtCap, present), 0, "ESERadMgmtCap",
	0, 8, 8, SigIeESERadMgmtCap, {0, 64, 150, 1, 0},
	4, DOT11F_EID_ESERADMGMTCAP, 0, },
	{ offsetof(tDot11fReAssocResponse, ESETrafStrmMet),
	offsetof(tDot11fIEESETrafStrmMet, present), 0, "ESETrafStrmMet",
	0, 10, 10, SigIeESETrafStrmMet, {0, 64, 150, 7, 0},
	4, DOT11F_EID_ESETRAFSTRMMET, 0, },
	{ offsetof(tDot11fReAssocResponse, ESETxmitPower),
	offsetof(tDot11fIEESETxmitPower, present), 0, "ESETxmitPower",
	0, 8, 8, SigIeESETxmitPower, {0, 64, 150, 0, 0},
	4, DOT11F_EID_ESETXMITPOWER, 0, },
	{ offsetof(tDot11fReAssocResponse, WMMTSPEC), offsetof(tDot11fIEWMMTSPEC,
	present), offsetof(tDot11fReAssocResponse, num_WMMTSPEC), "WMMTSPEC",
	4, 63, 63, SigIeWMMTSPEC, {0, 80, 242, 2, 2},
	5, DOT11F_EID_WMMTSPEC, 0, },
	{ offsetof(tDot11fReAssocResponse, ESETrafStrmRateSet),
	offsetof(tDot11fIEESETrafStrmRateSet, present), 0, "ESETrafStrmRateSet",
	0, 7, 15, SigIeESETrafStrmRateSet, {0, 64, 150, 8, 0},
	4, DOT11F_EID_ESETRAFSTRMRATESET, 0, },
	{ offsetof(tDot11fReAssocResponse, WscReassocRes),
	offsetof(tDot11fIEWscReassocRes, present), 0, "WscReassocRes",
	0, 6, 37, SigIeWscReassocRes, {0, 80, 242, 4, 0},
	4, DOT11F_EID_WSCREASSOCRES, 0, },
	{ offsetof(tDot11fReAssocResponse, P2PAssocRes),
	offsetof(tDot11fIEP2PAssocRes, present), 0, "P2PAssocRes",
	0, 6, 17, SigIeP2PAssocRes, {80, 111, 154, 9, 0},
	4, DOT11F_EID_P2PASSOCRES, 0, },
	{ offsetof(tDot11fReAssocResponse, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fReAssocResponse, VHTOperation),
	offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation",
	0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTOPERATION, 0, },
	{ offsetof(tDot11fReAssocResponse, ExtCap), offsetof(tDot11fIEExtCap,
	present), 0, "ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fReAssocResponse, OBSSScanParameters),
	offsetof(tDot11fIEOBSSScanParameters, present), 0, "OBSSScanParameters",
	0, 16, 16, SigIeOBSSScanParameters, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OBSSSCANPARAMETERS, 0, },
	{ offsetof(tDot11fReAssocResponse, QosMapSet),
	offsetof(tDot11fIEQosMapSet, present), 0, "QosMapSet",
	0, 2, 62, SigIeQosMapSet, {0, 0, 0, 0, 0}, 0, DOT11F_EID_QOSMAPSET, 0, },
	{ offsetof(tDot11fReAssocResponse, vendor2_ie),
	offsetof(tDot11fIEvendor2_ie, present), 0, "vendor2_ie",
	0, 7, 28, SigIevendor2_ie, {0, 144, 76, 0, 0},
	3, DOT11F_EID_VENDOR2_IE, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_re_assoc_response(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fReAssocResponse *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_ReAssocResponse, IES_ReAssocResponse,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_re_assoc_response. */

static const tFFDefn FFS_SMPowerSave[] = {
	{ "Category", offsetof(tDot11fSMPowerSave, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fSMPowerSave, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "SMPowerModeSet", offsetof(tDot11fSMPowerSave, SMPowerModeSet),
	SigFfSMPowerModeSet, DOT11F_FF_SMPOWERMODESET_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_SMPowerSave[] = {
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_sm_power_save(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fSMPowerSave *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_SMPowerSave, IES_SMPowerSave,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_sm_power_save. */

static const tFFDefn FFS_SaQueryReq[] = {
	{ "Category", offsetof(tDot11fSaQueryReq, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fSaQueryReq, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "TransactionId", offsetof(tDot11fSaQueryReq, TransactionId),
	SigFfTransactionId, DOT11F_FF_TRANSACTIONID_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_SaQueryReq[] = {
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_sa_query_req(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fSaQueryReq *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_SaQueryReq, IES_SaQueryReq,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_sa_query_req. */

static const tFFDefn FFS_SaQueryRsp[] = {
	{ "Category", offsetof(tDot11fSaQueryRsp, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fSaQueryRsp, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "TransactionId", offsetof(tDot11fSaQueryRsp, TransactionId),
	SigFfTransactionId, DOT11F_FF_TRANSACTIONID_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_SaQueryRsp[] = {
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_sa_query_rsp(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fSaQueryRsp *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_SaQueryRsp, IES_SaQueryRsp,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_sa_query_rsp. */

static const tFFDefn FFS_TDLSDisReq[] = {
	{ "Category", offsetof(tDot11fTDLSDisReq, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fTDLSDisReq, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fTDLSDisReq, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TDLSDisReq[] = {
	{ offsetof(tDot11fTDLSDisReq, LinkIdentifier),
	offsetof(tDot11fIELinkIdentifier, present), 0, "LinkIdentifier",
	0, 20, 20, SigIeLinkIdentifier, {0, 0, 0, 0, 0},
	0, DOT11F_EID_LINKIDENTIFIER, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_tdls_dis_req(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTDLSDisReq *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TDLSDisReq, IES_TDLSDisReq,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_tdls_dis_req. */

static const tFFDefn FFS_TDLSDisRsp[] = {
	{ "Category", offsetof(tDot11fTDLSDisRsp, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fTDLSDisRsp, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fTDLSDisRsp, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ "Capabilities", offsetof(tDot11fTDLSDisRsp, Capabilities),
	SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TDLSDisRsp[] = {
	{ offsetof(tDot11fTDLSDisRsp, SuppRates), offsetof(tDot11fIESuppRates,
	present), 0, "SuppRates", 0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fTDLSDisRsp, ExtSuppRates),
	offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates",
	0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fTDLSDisRsp, SuppChannels),
	offsetof(tDot11fIESuppChannels, present), 0, "SuppChannels",
	0, 4, 98, SigIeSuppChannels, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPCHANNELS, 0, },
	{ offsetof(tDot11fTDLSDisRsp, SuppOperatingClasses),
	offsetof(tDot11fIESuppOperatingClasses, present), 0,
	"SuppOperatingClasses", 0, 3, 34, SigIeSuppOperatingClasses,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPOPERATINGCLASSES, 0, },
	{ offsetof(tDot11fTDLSDisRsp, RSN), offsetof(tDot11fIERSN, present), 0,
	"RSN", 0, 8, 116, SigIeRSN, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RSN, 0, },
	{ offsetof(tDot11fTDLSDisRsp, ExtCap), offsetof(tDot11fIEExtCap, present),
	0, "ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fTDLSDisRsp, FTInfo), offsetof(tDot11fIEFTInfo, present),
	0, "FTInfo", 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FTINFO, 0, },
	{ offsetof(tDot11fTDLSDisRsp, TimeoutInterval),
	offsetof(tDot11fIETimeoutInterval, present), 0, "TimeoutInterval",
	0, 7, 7, SigIeTimeoutInterval, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TIMEOUTINTERVAL, 0, },
	{ offsetof(tDot11fTDLSDisRsp, RICData), offsetof(tDot11fIERICData,
	present), 0, "RICData", 0, 6, 6, SigIeRICData, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RICDATA, 0, },
	{ offsetof(tDot11fTDLSDisRsp, HTCaps), offsetof(tDot11fIEHTCaps, present),
	0, "HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fTDLSDisRsp, ht2040_bss_coexistence),
	offsetof(tDot11fIEht2040_bss_coexistence, present), 0,
	"ht2040_bss_coexistence", 0, 3, 3, SigIeht2040_bss_coexistence,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_HT2040_BSS_COEXISTENCE, 0, },
	{ offsetof(tDot11fTDLSDisRsp, LinkIdentifier),
	offsetof(tDot11fIELinkIdentifier, present), 0, "LinkIdentifier",
	0, 20, 20, SigIeLinkIdentifier, {0, 0, 0, 0, 0},
	0, DOT11F_EID_LINKIDENTIFIER, 1, },
	{ offsetof(tDot11fTDLSDisRsp, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_tdls_dis_rsp(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTDLSDisRsp *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TDLSDisRsp, IES_TDLSDisRsp,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_tdls_dis_rsp. */

static const tFFDefn FFS_TDLSPeerTrafficInd[] = {
	{ "Category", offsetof(tDot11fTDLSPeerTrafficInd, Category),
	SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fTDLSPeerTrafficInd, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fTDLSPeerTrafficInd, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TDLSPeerTrafficInd[] = {
	{ offsetof(tDot11fTDLSPeerTrafficInd, LinkIdentifier),
	offsetof(tDot11fIELinkIdentifier, present), 0, "LinkIdentifier",
	0, 20, 20, SigIeLinkIdentifier, {0, 0, 0, 0, 0},
	0, DOT11F_EID_LINKIDENTIFIER, 1, },
	{ offsetof(tDot11fTDLSPeerTrafficInd, PTIControl),
	offsetof(tDot11fIEPTIControl, present), 0, "PTIControl",
	0, 5, 5, SigIePTIControl, {0, 0, 0, 0, 0},
	0, DOT11F_EID_PTICONTROL, 0, },
	{ offsetof(tDot11fTDLSPeerTrafficInd, PUBufferStatus),
	offsetof(tDot11fIEPUBufferStatus, present), 0, "PUBufferStatus",
	0, 3, 3, SigIePUBufferStatus, {0, 0, 0, 0, 0},
	0, DOT11F_EID_PUBUFFERSTATUS, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_tdls_peer_traffic_ind(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTDLSPeerTrafficInd *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TDLSPeerTrafficInd, IES_TDLSPeerTrafficInd,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_tdls_peer_traffic_ind. */

static const tFFDefn FFS_TDLSPeerTrafficRsp[] = {
	{ "Category", offsetof(tDot11fTDLSPeerTrafficRsp, Category),
	SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fTDLSPeerTrafficRsp, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fTDLSPeerTrafficRsp, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TDLSPeerTrafficRsp[] = {
	{ offsetof(tDot11fTDLSPeerTrafficRsp, LinkIdentifier),
	offsetof(tDot11fIELinkIdentifier, present), 0, "LinkIdentifier",
	0, 20, 20, SigIeLinkIdentifier, {0, 0, 0, 0, 0},
	0, DOT11F_EID_LINKIDENTIFIER, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_tdls_peer_traffic_rsp(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTDLSPeerTrafficRsp *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TDLSPeerTrafficRsp, IES_TDLSPeerTrafficRsp,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_tdls_peer_traffic_rsp. */

static const tFFDefn FFS_TDLSSetupCnf[] = {
	{ "Category", offsetof(tDot11fTDLSSetupCnf, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fTDLSSetupCnf, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "Status", offsetof(tDot11fTDLSSetupCnf, Status), SigFfStatus,
	DOT11F_FF_STATUS_LEN, },
	{ "DialogToken", offsetof(tDot11fTDLSSetupCnf, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TDLSSetupCnf[] = {
	{ offsetof(tDot11fTDLSSetupCnf, RSN), offsetof(tDot11fIERSN, present), 0,
	"RSN", 0, 8, 116, SigIeRSN, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RSN, 0, },
	{ offsetof(tDot11fTDLSSetupCnf, EDCAParamSet),
	offsetof(tDot11fIEEDCAParamSet, present), 0, "EDCAParamSet",
	0, 20, 20, SigIeEDCAParamSet, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EDCAPARAMSET, 0, },
	{ offsetof(tDot11fTDLSSetupCnf, FTInfo), offsetof(tDot11fIEFTInfo,
	present), 0, "FTInfo", 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FTINFO, 0, },
	{ offsetof(tDot11fTDLSSetupCnf, TimeoutInterval),
	offsetof(tDot11fIETimeoutInterval, present), 0, "TimeoutInterval",
	0, 7, 7, SigIeTimeoutInterval, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TIMEOUTINTERVAL, 0, },
	{ offsetof(tDot11fTDLSSetupCnf, HTInfo), offsetof(tDot11fIEHTInfo,
	present), 0, "HTInfo", 0, 24, 56, SigIeHTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTINFO, 0, },
	{ offsetof(tDot11fTDLSSetupCnf, LinkIdentifier),
	offsetof(tDot11fIELinkIdentifier, present), 0, "LinkIdentifier",
	0, 20, 20, SigIeLinkIdentifier, {0, 0, 0, 0, 0},
	0, DOT11F_EID_LINKIDENTIFIER, 0, },
	{ offsetof(tDot11fTDLSSetupCnf, WMMParams), offsetof(tDot11fIEWMMParams,
	present), 0, "WMMParams", 0, 26, 26, SigIeWMMParams, {0, 80, 242, 2, 1},
	5, DOT11F_EID_WMMPARAMS, 0, },
	{ offsetof(tDot11fTDLSSetupCnf, VHTOperation),
	offsetof(tDot11fIEVHTOperation, present), 0, "VHTOperation",
	0, 7, 7, SigIeVHTOperation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTOPERATION, 0, },
	{ offsetof(tDot11fTDLSSetupCnf, OperatingMode),
	offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode",
	0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OPERATINGMODE, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_tdls_setup_cnf(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTDLSSetupCnf *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TDLSSetupCnf, IES_TDLSSetupCnf,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_tdls_setup_cnf. */

static const tFFDefn FFS_TDLSSetupReq[] = {
	{ "Category", offsetof(tDot11fTDLSSetupReq, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fTDLSSetupReq, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fTDLSSetupReq, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ "Capabilities", offsetof(tDot11fTDLSSetupReq, Capabilities),
	SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TDLSSetupReq[] = {
	{ offsetof(tDot11fTDLSSetupReq, SuppRates), offsetof(tDot11fIESuppRates,
	present), 0, "SuppRates", 0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPRATES, 1, },
	{ offsetof(tDot11fTDLSSetupReq, Country), offsetof(tDot11fIECountry,
	present), 0, "Country", 0, 5, 257, SigIeCountry, {0, 0, 0, 0, 0},
	0, DOT11F_EID_COUNTRY, 0, },
	{ offsetof(tDot11fTDLSSetupReq, ExtSuppRates),
	offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates",
	0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fTDLSSetupReq, SuppChannels),
	offsetof(tDot11fIESuppChannels, present), 0, "SuppChannels",
	0, 4, 98, SigIeSuppChannels, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPCHANNELS, 0, },
	{ offsetof(tDot11fTDLSSetupReq, RSN), offsetof(tDot11fIERSN, present), 0,
	"RSN", 0, 8, 116, SigIeRSN, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RSN, 0, },
	{ offsetof(tDot11fTDLSSetupReq, ExtCap), offsetof(tDot11fIEExtCap,
	present), 0, "ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fTDLSSetupReq, SuppOperatingClasses),
	offsetof(tDot11fIESuppOperatingClasses, present), 0,
	"SuppOperatingClasses", 0, 3, 34, SigIeSuppOperatingClasses,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPOPERATINGCLASSES, 0, },
	{ offsetof(tDot11fTDLSSetupReq, QOSCapsStation),
	offsetof(tDot11fIEQOSCapsStation, present), 0, "QOSCapsStation",
	0, 3, 3, SigIeQOSCapsStation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QOSCAPSSTATION, 0, },
	{ offsetof(tDot11fTDLSSetupReq, FTInfo), offsetof(tDot11fIEFTInfo,
	present), 0, "FTInfo", 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FTINFO, 0, },
	{ offsetof(tDot11fTDLSSetupReq, TimeoutInterval),
	offsetof(tDot11fIETimeoutInterval, present), 0, "TimeoutInterval",
	0, 7, 7, SigIeTimeoutInterval, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TIMEOUTINTERVAL, 0, },
	{ offsetof(tDot11fTDLSSetupReq, RICData), offsetof(tDot11fIERICData,
	present), 0, "RICData", 0, 6, 6, SigIeRICData, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RICDATA, 0, },
	{ offsetof(tDot11fTDLSSetupReq, HTCaps), offsetof(tDot11fIEHTCaps,
	present), 0, "HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fTDLSSetupReq, ht2040_bss_coexistence),
	offsetof(tDot11fIEht2040_bss_coexistence, present), 0,
	"ht2040_bss_coexistence", 0, 3, 3, SigIeht2040_bss_coexistence,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_HT2040_BSS_COEXISTENCE, 0, },
	{ offsetof(tDot11fTDLSSetupReq, LinkIdentifier),
	offsetof(tDot11fIELinkIdentifier, present), 0, "LinkIdentifier",
	0, 20, 20, SigIeLinkIdentifier, {0, 0, 0, 0, 0},
	0, DOT11F_EID_LINKIDENTIFIER, 1, },
	{ offsetof(tDot11fTDLSSetupReq, WMMInfoStation),
	offsetof(tDot11fIEWMMInfoStation, present), 0, "WMMInfoStation",
	0, 9, 9, SigIeWMMInfoStation, {0, 80, 242, 2, 0},
	5, DOT11F_EID_WMMINFOSTATION, 0, },
	{ offsetof(tDot11fTDLSSetupReq, AID), offsetof(tDot11fIEAID, present), 0,
	"AID", 0, 4, 4, SigIeAID, {0, 0, 0, 0, 0}, 0, DOT11F_EID_AID, 0, },
	{ offsetof(tDot11fTDLSSetupReq, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_tdls_setup_req(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTDLSSetupReq *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TDLSSetupReq, IES_TDLSSetupReq,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_tdls_setup_req. */

static const tFFDefn FFS_TDLSSetupRsp[] = {
	{ "Category", offsetof(tDot11fTDLSSetupRsp, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fTDLSSetupRsp, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "Status", offsetof(tDot11fTDLSSetupRsp, Status), SigFfStatus,
	DOT11F_FF_STATUS_LEN, },
	{ "DialogToken", offsetof(tDot11fTDLSSetupRsp, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ "Capabilities", offsetof(tDot11fTDLSSetupRsp, Capabilities),
	SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TDLSSetupRsp[] = {
	{ offsetof(tDot11fTDLSSetupRsp, SuppRates), offsetof(tDot11fIESuppRates,
	present), 0, "SuppRates", 0, 2, 14, SigIeSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPRATES, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, Country), offsetof(tDot11fIECountry,
	present), 0, "Country", 0, 5, 257, SigIeCountry, {0, 0, 0, 0, 0},
	0, DOT11F_EID_COUNTRY, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, ExtSuppRates),
	offsetof(tDot11fIEExtSuppRates, present), 0, "ExtSuppRates",
	0, 3, 14, SigIeExtSuppRates, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTSUPPRATES, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, SuppChannels),
	offsetof(tDot11fIESuppChannels, present), 0, "SuppChannels",
	0, 4, 98, SigIeSuppChannels, {0, 0, 0, 0, 0},
	0, DOT11F_EID_SUPPCHANNELS, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, RSN), offsetof(tDot11fIERSN, present), 0,
	"RSN", 0, 8, 116, SigIeRSN, {0, 0, 0, 0, 0}, 0, DOT11F_EID_RSN, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, ExtCap), offsetof(tDot11fIEExtCap,
	present), 0, "ExtCap", 0, 10, 11, SigIeExtCap, {0, 0, 0, 0, 0},
	0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, SuppOperatingClasses),
	offsetof(tDot11fIESuppOperatingClasses, present), 0,
	"SuppOperatingClasses", 0, 3, 34, SigIeSuppOperatingClasses,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_SUPPOPERATINGCLASSES, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, QOSCapsStation),
	offsetof(tDot11fIEQOSCapsStation, present), 0, "QOSCapsStation",
	0, 3, 3, SigIeQOSCapsStation, {0, 0, 0, 0, 0},
	0, DOT11F_EID_QOSCAPSSTATION, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, FTInfo), offsetof(tDot11fIEFTInfo,
	present), 0, "FTInfo", 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FTINFO, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, TimeoutInterval),
	offsetof(tDot11fIETimeoutInterval, present), 0, "TimeoutInterval",
	0, 7, 7, SigIeTimeoutInterval, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TIMEOUTINTERVAL, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, RICData), offsetof(tDot11fIERICData,
	present), 0, "RICData", 0, 6, 6, SigIeRICData, {0, 0, 0, 0, 0},
	0, DOT11F_EID_RICDATA, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, HTCaps), offsetof(tDot11fIEHTCaps,
	present), 0, "HTCaps", 0, 28, 60, SigIeHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HTCAPS, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, ht2040_bss_coexistence),
	offsetof(tDot11fIEht2040_bss_coexistence, present), 0,
	"ht2040_bss_coexistence", 0, 3, 3, SigIeht2040_bss_coexistence,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_HT2040_BSS_COEXISTENCE, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, LinkIdentifier),
	offsetof(tDot11fIELinkIdentifier, present), 0, "LinkIdentifier",
	0, 20, 20, SigIeLinkIdentifier, {0, 0, 0, 0, 0},
	0, DOT11F_EID_LINKIDENTIFIER, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, WMMInfoStation),
	offsetof(tDot11fIEWMMInfoStation, present), 0, "WMMInfoStation",
	0, 9, 9, SigIeWMMInfoStation, {0, 80, 242, 2, 0},
	5, DOT11F_EID_WMMINFOSTATION, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, AID), offsetof(tDot11fIEAID, present), 0,
	"AID", 0, 4, 4, SigIeAID, {0, 0, 0, 0, 0}, 0, DOT11F_EID_AID, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, VHTCaps), offsetof(tDot11fIEVHTCaps,
	present), 0, "VHTCaps", 0, 14, 14, SigIeVHTCaps, {0, 0, 0, 0, 0},
	0, DOT11F_EID_VHTCAPS, 0, },
	{ offsetof(tDot11fTDLSSetupRsp, OperatingMode),
	offsetof(tDot11fIEOperatingMode, present), 0, "OperatingMode",
	0, 3, 3, SigIeOperatingMode, {0, 0, 0, 0, 0},
	0, DOT11F_EID_OPERATINGMODE, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_tdls_setup_rsp(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTDLSSetupRsp *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TDLSSetupRsp, IES_TDLSSetupRsp,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_tdls_setup_rsp. */

static const tFFDefn FFS_TDLSTeardown[] = {
	{ "Category", offsetof(tDot11fTDLSTeardown, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fTDLSTeardown, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "Reason", offsetof(tDot11fTDLSTeardown, Reason), SigFfReason,
	DOT11F_FF_REASON_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TDLSTeardown[] = {
	{ offsetof(tDot11fTDLSTeardown, FTInfo), offsetof(tDot11fIEFTInfo,
	present), 0, "FTInfo", 0, 84, 222, SigIeFTInfo, {0, 0, 0, 0, 0},
	0, DOT11F_EID_FTINFO, 0, },
	{ offsetof(tDot11fTDLSTeardown, LinkIdentifier),
	offsetof(tDot11fIELinkIdentifier, present), 0, "LinkIdentifier",
	0, 20, 20, SigIeLinkIdentifier, {0, 0, 0, 0, 0},
	0, DOT11F_EID_LINKIDENTIFIER, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_tdls_teardown(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTDLSTeardown *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TDLSTeardown, IES_TDLSTeardown,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_tdls_teardown. */

static const tFFDefn FFS_TPCReport[] = {
	{ "Category", offsetof(tDot11fTPCReport, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fTPCReport, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fTPCReport, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TPCReport[] = {
	{ offsetof(tDot11fTPCReport, TPCReport), offsetof(tDot11fIETPCReport,
	present), 0, "TPCReport", 0, 4, 4, SigIeTPCReport, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TPCREPORT, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_tpc_report(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTPCReport *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TPCReport, IES_TPCReport,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_tpc_report. */

static const tFFDefn FFS_TPCRequest[] = {
	{ "Category", offsetof(tDot11fTPCRequest, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fTPCRequest, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fTPCRequest, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TPCRequest[] = {
	{ offsetof(tDot11fTPCRequest, TPCRequest), offsetof(tDot11fIETPCRequest,
	present), 0, "TPCRequest", 0, 2, 2, SigIeTPCRequest, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TPCREQUEST, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_tpc_request(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTPCRequest *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TPCRequest, IES_TPCRequest,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_tpc_request. */

static const tFFDefn FFS_TimingAdvertisementFrame[] = {
	{ "TimeStamp", offsetof(tDot11fTimingAdvertisementFrame, TimeStamp),
	SigFfTimeStamp, DOT11F_FF_TIMESTAMP_LEN, },
	{ "Capabilities", offsetof(tDot11fTimingAdvertisementFrame,
	Capabilities), SigFfCapabilities, DOT11F_FF_CAPABILITIES_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_TimingAdvertisementFrame[] = {
	{ offsetof(tDot11fTimingAdvertisementFrame, Country),
	offsetof(tDot11fIECountry, present), 0, "Country", 0, 5, 257, SigIeCountry,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_COUNTRY, 0, },
	{ offsetof(tDot11fTimingAdvertisementFrame, PowerConstraints),
	offsetof(tDot11fIEPowerConstraints, present), 0, "PowerConstraints",
	0, 3, 3, SigIePowerConstraints, {0, 0, 0, 0, 0},
	0, DOT11F_EID_POWERCONSTRAINTS, 0, },
	{ offsetof(tDot11fTimingAdvertisementFrame, TimeAdvertisement),
	offsetof(tDot11fIETimeAdvertisement, present), 0, "TimeAdvertisement",
	0, 18, 18, SigIeTimeAdvertisement, {0, 0, 0, 0, 0},
	0, DOT11F_EID_TIMEADVERTISEMENT, 0, },
	{ offsetof(tDot11fTimingAdvertisementFrame, ExtCap),
	offsetof(tDot11fIEExtCap, present), 0, "ExtCap", 0, 10, 11, SigIeExtCap,
	{0, 0, 0, 0, 0}, 0, DOT11F_EID_EXTCAP, 0, },
	{ offsetof(tDot11fTimingAdvertisementFrame, Vendor1IE),
	offsetof(tDot11fIEVendor1IE, present), 0, "Vendor1IE",
	0, 5, 5, SigIeVendor1IE, {0, 16, 24, 0, 0},
	3, DOT11F_EID_VENDOR1IE, 0, },
	{ offsetof(tDot11fTimingAdvertisementFrame, Vendor3IE),
	offsetof(tDot11fIEVendor3IE, present), 0, "Vendor3IE",
	0, 5, 5, SigIeVendor3IE, {0, 22, 50, 0, 0},
	3, DOT11F_EID_VENDOR3IE, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_timing_advertisement_frame(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fTimingAdvertisementFrame *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_TimingAdvertisementFrame, IES_TimingAdvertisementFrame,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_timing_advertisement_frame. */

static const tFFDefn FFS_VHTGidManagementActionFrame[] = {
	{ "Category", offsetof(tDot11fVHTGidManagementActionFrame, Category),
	SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fVHTGidManagementActionFrame, Action),
	SigFfAction, DOT11F_FF_ACTION_LEN, },
	{ "VhtMembershipStatusArray",
	offsetof(tDot11fVHTGidManagementActionFrame, VhtMembershipStatusArray),
	SigFfVhtMembershipStatusArray,
	DOT11F_FF_VHTMEMBERSHIPSTATUSARRAY_LEN, },
	{ "VhtUserPositionArray", offsetof(tDot11fVHTGidManagementActionFrame,
	VhtUserPositionArray), SigFfVhtUserPositionArray,
	DOT11F_FF_VHTUSERPOSITIONARRAY_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_VHTGidManagementActionFrame[] = {
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_vht_gid_management_action_frame(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fVHTGidManagementActionFrame *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_VHTGidManagementActionFrame, IES_VHTGidManagementActionFrame,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_vht_gid_management_action_frame. */

static const tFFDefn FFS_WMMAddTSRequest[] = {
	{ "Category", offsetof(tDot11fWMMAddTSRequest, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fWMMAddTSRequest, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fWMMAddTSRequest, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ "StatusCode", offsetof(tDot11fWMMAddTSRequest, StatusCode),
	SigFfStatusCode, DOT11F_FF_STATUSCODE_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_WMMAddTSRequest[] = {
	{ offsetof(tDot11fWMMAddTSRequest, WMMTSPEC), offsetof(tDot11fIEWMMTSPEC,
	present), 0, "WMMTSPEC", 0, 63, 63, SigIeWMMTSPEC, {0, 80, 242, 2, 2},
	5, DOT11F_EID_WMMTSPEC, 1, },
	{ offsetof(tDot11fWMMAddTSRequest, ESETrafStrmRateSet),
	offsetof(tDot11fIEESETrafStrmRateSet, present), 0, "ESETrafStrmRateSet",
	0, 7, 15, SigIeESETrafStrmRateSet, {0, 64, 150, 8, 0},
	4, DOT11F_EID_ESETRAFSTRMRATESET, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_wmm_add_ts_request(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fWMMAddTSRequest *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_WMMAddTSRequest, IES_WMMAddTSRequest,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_wmm_add_ts_request. */

static const tFFDefn FFS_WMMAddTSResponse[] = {
	{ "Category", offsetof(tDot11fWMMAddTSResponse, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fWMMAddTSResponse, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fWMMAddTSResponse, DialogToken),
	SigFfDialogToken, DOT11F_FF_DIALOGTOKEN_LEN, },
	{ "StatusCode", offsetof(tDot11fWMMAddTSResponse, StatusCode),
	SigFfStatusCode, DOT11F_FF_STATUSCODE_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_WMMAddTSResponse[] = {
	{ offsetof(tDot11fWMMAddTSResponse, WMMTSPEC),
	offsetof(tDot11fIEWMMTSPEC, present), 0, "WMMTSPEC",
	0, 63, 63, SigIeWMMTSPEC, {0, 80, 242, 2, 2},
	5, DOT11F_EID_WMMTSPEC, 0, },
	{ offsetof(tDot11fWMMAddTSResponse, ESETrafStrmMet),
	offsetof(tDot11fIEESETrafStrmMet, present), 0, "ESETrafStrmMet",
	0, 10, 10, SigIeESETrafStrmMet, {0, 64, 150, 7, 0},
	4, DOT11F_EID_ESETRAFSTRMMET, 0, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_wmm_add_ts_response(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fWMMAddTSResponse *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_WMMAddTSResponse, IES_WMMAddTSResponse,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_wmm_add_ts_response. */

static const tFFDefn FFS_WMMDelTS[] = {
	{ "Category", offsetof(tDot11fWMMDelTS, Category), SigFfCategory,
	DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fWMMDelTS, Action), SigFfAction,
	DOT11F_FF_ACTION_LEN, },
	{ "DialogToken", offsetof(tDot11fWMMDelTS, DialogToken), SigFfDialogToken,
	DOT11F_FF_DIALOGTOKEN_LEN, },
	{ "StatusCode", offsetof(tDot11fWMMDelTS, StatusCode), SigFfStatusCode,
	DOT11F_FF_STATUSCODE_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_WMMDelTS[] = {
	{ offsetof(tDot11fWMMDelTS, WMMTSPEC), offsetof(tDot11fIEWMMTSPEC,
	present), 0, "WMMTSPEC", 0, 63, 63, SigIeWMMTSPEC, {0, 80, 242, 2, 2},
	5, DOT11F_EID_WMMTSPEC, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_wmm_del_ts(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fWMMDelTS *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_WMMDelTS, IES_WMMDelTS,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_wmm_del_ts. */

static const tFFDefn FFS_ht2040_bss_coexistence_mgmt_action_frame[] = {
	{ "Category", offsetof(tDot11fht2040_bss_coexistence_mgmt_action_frame,
	Category), SigFfCategory, DOT11F_FF_CATEGORY_LEN, },
	{ "Action", offsetof(tDot11fht2040_bss_coexistence_mgmt_action_frame,
	Action), SigFfAction, DOT11F_FF_ACTION_LEN, },
	{ NULL, 0, 0, 0,},
};

static const tIEDefn IES_ht2040_bss_coexistence_mgmt_action_frame[] = {
	{ offsetof(tDot11fht2040_bss_coexistence_mgmt_action_frame,
	ht2040_bss_coexistence), offsetof(tDot11fIEht2040_bss_coexistence,
	present), 0, "ht2040_bss_coexistence",
	0, 3, 3, SigIeht2040_bss_coexistence, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HT2040_BSS_COEXISTENCE, 1, },
	{ offsetof(tDot11fht2040_bss_coexistence_mgmt_action_frame,
	ht2040_bss_intolerant_report),
	offsetof(tDot11fIEht2040_bss_intolerant_report, present), 0,
	"ht2040_bss_intolerant_report",
	0, 3, 53, SigIeht2040_bss_intolerant_report, {0, 0, 0, 0, 0},
	0, DOT11F_EID_HT2040_BSS_INTOLERANT_REPORT, 1, },
	{0, 0, 0, NULL, 0, 0, 0, 0, {0, 0, 0, 0, 0}, 0, 0xff, 0, },};

uint32_t dot11f_unpack_ht2040_bss_coexistence_mgmt_action_frame(tpAniSirGlobal pCtx,
		uint8_t *pBuf, uint32_t nBuf,
		tDot11fht2040_bss_coexistence_mgmt_action_frame *pFrm)
{
	uint32_t i = 0;
	uint32_t status = 0;
	status = unpack_core(pCtx, pBuf, nBuf,
		      FFS_ht2040_bss_coexistence_mgmt_action_frame, IES_ht2040_bss_coexistence_mgmt_action_frame,
		      (uint8_t *)pFrm, sizeof(*pFrm));

	(void)i;
	return status;

} /* End dot11f_unpack_ht2040_bss_coexistence_mgmt_action_frame. */

static uint32_t unpack_core(tpAniSirGlobal pCtx,
			    uint8_t *pBuf,
			    uint32_t nBuf,
			    const tFFDefn  FFs[],
			    const tIEDefn  IEs[],
			    uint8_t *pFrm,
			    size_t   nFrm)
{
	const tFFDefn *pFf;
	const tIEDefn *pIe;
	uint8_t   *pBufRemaining;
	uint32_t  nBufRemaining, status;
	uint8_t   eid, len;
	tFRAMES_BOOL  *pfFound;
	uint32_t  countOffset = 0;

	DOT11F_PARAMETER_CHECK(pBuf, nBuf, pFrm, nFrm);
	(void)nFrm;

	(void)pCtx;
	status = DOT11F_PARSE_SUCCESS;
	pBufRemaining = pBuf;
	nBufRemaining = nBuf;

	pIe = &IEs[0];
	while (0xff != pIe->eid) {
		pfFound = (tFRAMES_BOOL *)(pFrm + pIe->offset +
				   pIe->presenceOffset);
		*pfFound = 0U;
		if (pIe->countOffset)
			*(uint16_t *)(pFrm + pIe->countOffset) = 0U;
		++pIe;
	}

	pFf = &FFs[0];
	while (pFf->size) {
		if (pFf->size > nBufRemaining) {
			FRAMES_LOG3(pCtx, FRLOGE, FRFL("Fixed field %s is %d"
					  "bytes in size, but there are only %d bytes left i"
					  "n this frame.\n"), pFf->name, pFf->size,
					  nBufRemaining);
			FRAMES_DBG_BREAK();
			return DOT11F_MISSING_FIXED_FIELD;
		}

		switch (pFf->sig) {

		case SigFfAID:
			dot11f_unpack_ff_common_func(pCtx,
			    pBufRemaining, (uint16_t *)&(((tDot11fFfAID *)
			    (pFrm + pFf->offset))->associd));
			break;
		case SigFfAction:
			dot11f_unpack_ff_action(pCtx,
			    pBufRemaining, (tDot11fFfAction *)
			    (pFrm + pFf->offset));
			break;
		case SigFfAuthAlgo:
			dot11f_unpack_ff_common_func(pCtx,
			    pBufRemaining, (uint16_t *)&(((tDot11fFfAuthAlgo *)
			    (pFrm + pFf->offset))->algo));
			break;
		case SigFfAuthSeqNo:
			dot11f_unpack_ff_common_func(pCtx,
			    pBufRemaining, (uint16_t *)&(((tDot11fFfAuthSeqNo *)
			    (pFrm + pFf->offset))->no));
			break;
		case SigFfBeaconInterval:
			dot11f_unpack_ff_common_func(pCtx,
			    pBufRemaining, (uint16_t *)&(((tDot11fFfBeaconInterval *)
			    (pFrm + pFf->offset))->interval));
			break;
		case SigFfCapabilities:
			dot11f_unpack_ff_capabilities(pCtx,
			    pBufRemaining, (tDot11fFfCapabilities *)
			    (pFrm + pFf->offset));
			break;
		case SigFfCategory:
			dot11f_unpack_ff_category(pCtx,
			    pBufRemaining, (tDot11fFfCategory *)
			    (pFrm + pFf->offset));
			break;
		case SigFfCurrentAPAddress:
			dot11f_unpack_ff_current_ap_address(pCtx,
			    pBufRemaining, (tDot11fFfCurrentAPAddress *)
			    (pFrm + pFf->offset));
			break;
		case SigFfDialogToken:
			dot11f_unpack_ff_dialog_token(pCtx,
			    pBufRemaining, (tDot11fFfDialogToken *)
			    (pFrm + pFf->offset));
			break;
		case SigFfLinkMargin:
			dot11f_unpack_ff_link_margin(pCtx,
			    pBufRemaining, (tDot11fFfLinkMargin *)
			    (pFrm + pFf->offset));
			break;
		case SigFfListenInterval:
			dot11f_unpack_ff_common_func(pCtx,
			    pBufRemaining, (uint16_t *)&(((tDot11fFfListenInterval *)
			    (pFrm + pFf->offset))->interval));
			break;
		case SigFfMaxTxPower:
			dot11f_unpack_ff_max_tx_power(pCtx,
			    pBufRemaining, (tDot11fFfMaxTxPower *)
			    (pFrm + pFf->offset));
			break;
		case SigFfNumOfRepetitions:
			dot11f_unpack_ff_num_of_repetitions(pCtx,
			    pBufRemaining, (tDot11fFfNumOfRepetitions *)
			    (pFrm + pFf->offset));
			break;
		case SigFfOperatingMode:
			dot11f_unpack_ff_operating_mode(pCtx,
			    pBufRemaining, (tDot11fFfOperatingMode *)
			    (pFrm + pFf->offset));
			break;
		case SigFfRCPI:
			dot11f_unpack_ff_rcpi(pCtx,
			    pBufRemaining, (tDot11fFfRCPI *)
			    (pFrm + pFf->offset));
			break;
		case SigFfRSNI:
			dot11f_unpack_ff_rsni(pCtx,
			    pBufRemaining, (tDot11fFfRSNI *)
			    (pFrm + pFf->offset));
			break;
		case SigFfReason:
			dot11f_unpack_ff_common_func(pCtx,
			    pBufRemaining, (uint16_t *)&(((tDot11fFfReason *)
			    (pFrm + pFf->offset))->code));
			break;
		case SigFfRxAntennaId:
			dot11f_unpack_ff_rx_antenna_id(pCtx,
			    pBufRemaining, (tDot11fFfRxAntennaId *)
			    (pFrm + pFf->offset));
			break;
		case SigFfSMPowerModeSet:
			dot11f_unpack_ff_sm_power_mode_set(pCtx,
			    pBufRemaining, (tDot11fFfSMPowerModeSet *)
			    (pFrm + pFf->offset));
			break;
		case SigFfStatus:
			dot11f_unpack_ff_common_func(pCtx,
			    pBufRemaining, (uint16_t *)&(((tDot11fFfStatus *)
			    (pFrm + pFf->offset))->status));
			break;
		case SigFfStatusCode:
			dot11f_unpack_ff_status_code(pCtx,
			    pBufRemaining, (tDot11fFfStatusCode *)
			    (pFrm + pFf->offset));
			break;
		case SigFfTPCEleID:
			dot11f_unpack_ff_tpc_ele_id(pCtx,
			    pBufRemaining, (tDot11fFfTPCEleID *)
			    (pFrm + pFf->offset));
			break;
		case SigFfTPCEleLen:
			dot11f_unpack_ff_tpc_ele_len(pCtx,
			    pBufRemaining, (tDot11fFfTPCEleLen *)
			    (pFrm + pFf->offset));
			break;
		case SigFfTSInfo:
			dot11f_unpack_ff_ts_info(pCtx,
			    pBufRemaining, (tDot11fFfTSInfo *)
			    (pFrm + pFf->offset));
			break;
		case SigFfTimeStamp:
			dot11f_unpack_ff_time_stamp(pCtx,
			    pBufRemaining, (tDot11fFfTimeStamp *)
			    (pFrm + pFf->offset));
			break;
		case SigFfTransactionId:
			dot11f_unpack_ff_transaction_id(pCtx,
			    pBufRemaining, (tDot11fFfTransactionId *)
			    (pFrm + pFf->offset));
			break;
		case SigFfTxAntennaId:
			dot11f_unpack_ff_tx_antenna_id(pCtx,
			    pBufRemaining, (tDot11fFfTxAntennaId *)
			    (pFrm + pFf->offset));
			break;
		case SigFfTxPower:
			dot11f_unpack_ff_tx_power(pCtx,
			    pBufRemaining, (tDot11fFfTxPower *)
			    (pFrm + pFf->offset));
			break;
		case SigFfVhtMembershipStatusArray:
			dot11f_unpack_ff_vht_membership_status_array(pCtx,
			    pBufRemaining, (tDot11fFfVhtMembershipStatusArray *)
			    (pFrm + pFf->offset));
			break;
		case SigFfVhtUserPositionArray:
			dot11f_unpack_ff_vht_user_position_array(pCtx,
			    pBufRemaining, (tDot11fFfVhtUserPositionArray *)
			    (pFrm + pFf->offset));
			break;
		default:
			FRAMES_LOG1(pCtx, FRLOGE, FRFL("INTERNAL ERROR: I don'"
				   "t know about the FF signature %d-- this is most "
				   "likely a 'framesc' bug.\n"), pFf->sig);
			return DOT11F_INTERNAL_ERROR;
		}

		pBufRemaining += pFf->size;
		nBufRemaining -= pFf->size;
		++pFf;
	}

	while (nBufRemaining) {
		if (1 == nBufRemaining) {
			FRAMES_LOG0(pCtx, FRLOGE, FRFL("This frame reports "
				    "only one byte remaining after it's fixed fields.\n"));
			status |= DOT11F_INCOMPLETE_IE;
			FRAMES_DBG_BREAK();
			goto MandatoryCheck;
		}

		pIe = find_ie_defn(pCtx, pBufRemaining, nBufRemaining, IEs);

		eid = *pBufRemaining++; --nBufRemaining;
		len = *pBufRemaining++; --nBufRemaining;

		if (pIe && pIe->noui) {
			if (pIe->noui > nBufRemaining) {
				FRAMES_LOG3(pCtx, FRLOGW, FRFL("IE %d reports "
					"length %d, but it has an OUI of %d bytes.\n"),
					eid, len, pIe->noui);
				FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf);
				FRAMES_LOG2(pCtx, FRLOG1, FRFL("We've parsed %d by"
					"tes of this buffer, and show %d left.\n"),
					pBufRemaining - pBuf, nBufRemaining);
				status |= DOT11F_INCOMPLETE_IE;
				FRAMES_DBG_BREAK();
				goto MandatoryCheck;
			}
			pBufRemaining += pIe->noui;
			nBufRemaining -= pIe->noui;
			len           -= pIe->noui;
		}

		if (len > nBufRemaining) {
			FRAMES_LOG3(pCtx, FRLOGW, FRFL("IE %d reports length %"
				"d, but there are only %d bytes remaining in this"
				" frame.\n"), eid, len, nBufRemaining);
			FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf);
			FRAMES_LOG2(pCtx, FRLOG1, FRFL("We've parsed %d by"
				"tes of this buffer, and show %d left.\n"),
				pBufRemaining - pBuf, nBufRemaining);
			status |= DOT11F_INCOMPLETE_IE;
			FRAMES_DBG_BREAK();
			goto MandatoryCheck;
		}

		if (pIe) {
			if (nBufRemaining < pIe->minSize - pIe->noui - 2U) {
				FRAMES_LOG3(pCtx, FRLOGW, FRFL("The IE %s must be "
					"at least %d bytes in size, but there are onl"
					"y %d bytes remaining in this frame.\n"),
					pIe->name, pIe->minSize, nBufRemaining);
				FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf);
				status |= DOT11F_INCOMPLETE_IE;
				FRAMES_DBG_BREAK();
				goto MandatoryCheck;
			} else {
				if (len > pIe->maxSize - pIe->noui - 2U) {
				FRAMES_LOG1(pCtx, FRLOGW, FRFL("The IE %s reports "
					"an unexpectedly large size; it is presumably "
					"more up-to-date than this parser, but this wa"
					"rning may also indicate a corrupt frame.\n"),
					pIe->name);
					FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf);
				}

				countOffset = ((0 != pIe->arraybound) *
						(*(uint16_t *)(pFrm + pIe->countOffset)));
				switch (pIe->sig) {
				case SigIeCondensedCountryStr:
					status |=
						dot11f_unpack_ie_condensed_country_str(
						    pCtx, pBufRemaining, len,
						    (tDot11fIECondensedCountryStr *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIECondensedCountryStr) *
						    countOffset));
					break;
				case SigIeGTK:
					status |=
						dot11f_unpack_ie_gtk(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEGTK *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEGTK) *
						    countOffset));
					break;
				case SigIeIGTK:
					status |=
						dot11f_unpack_ie_igtk(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEIGTK *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEIGTK) *
						    countOffset));
					break;
				case SigIeR0KH_ID:
					status |=
						dot11f_unpack_ie_r0_kh_id(
						    pCtx, pBufRemaining, len,
						    (tDot11fIER0KH_ID *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIER0KH_ID) *
						    countOffset));
					break;
				case SigIeR1KH_ID:
					status |=
						dot11f_unpack_ie_r1_kh_id(
						    pCtx, pBufRemaining, len,
						    (tDot11fIER1KH_ID *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIER1KH_ID) *
						    countOffset));
					break;
				case SigIeTSFInfo:
					status |=
						dot11f_unpack_ie_tsf_info(
						    pCtx, pBufRemaining, len,
						    (tDot11fIETSFInfo *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIETSFInfo) *
						    countOffset));
					break;
				case SigIeAPChannelReport:
					status |=
						dot11f_unpack_ie_ap_channel_report(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEAPChannelReport *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEAPChannelReport) *
						    countOffset));
					break;
				case SigIeBcnReportingDetail:
					status |=
						dot11f_unpack_ie_bcn_reporting_detail(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEBcnReportingDetail *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEBcnReportingDetail) *
						    countOffset));
					break;
				case SigIeBeaconReportFrmBody:
					status |=
						dot11f_unpack_ie_beacon_report_frm_body(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEBeaconReportFrmBody *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEBeaconReportFrmBody) *
						    countOffset));
					break;
				case SigIeBeaconReporting:
					status |=
						dot11f_unpack_ie_beacon_reporting(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEBeaconReporting *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEBeaconReporting) *
						    countOffset));
					break;
				case SigIeMeasurementPilot:
					status |=
						dot11f_unpack_ie_measurement_pilot(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEMeasurementPilot *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEMeasurementPilot) *
						    countOffset));
					break;
				case SigIeMultiBssid:
					status |=
						dot11f_unpack_ie_multi_bssid(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEMultiBssid *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEMultiBssid) *
						    countOffset));
					break;
				case SigIeRICData:
					status |=
						dot11f_unpack_ie_ric_data(
						    pCtx, pBufRemaining, len,
						    (tDot11fIERICData *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIERICData) *
						    countOffset));
					break;
				case SigIeRICDescriptor:
					status |=
						dot11f_unpack_ie_ric_descriptor(
						    pCtx, pBufRemaining, len,
						    (tDot11fIERICDescriptor *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIERICDescriptor) *
						    countOffset));
					break;
				case SigIeRRMEnabledCap:
					status |=
						dot11f_unpack_ie_rrm_enabled_cap(
						    pCtx, pBufRemaining, len,
						    (tDot11fIERRMEnabledCap *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIERRMEnabledCap) *
						    countOffset));
					break;
				case SigIeRequestedInfo:
					status |=
						dot11f_unpack_ie_requested_info(
						    pCtx, pBufRemaining, len,
						    (tDot11fIERequestedInfo *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIERequestedInfo) *
						    countOffset));
					break;
				case SigIeSSID:
					status |=
						dot11f_unpack_ie_ssid(
						    pCtx, pBufRemaining, len,
						    (tDot11fIESSID *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIESSID) *
						    countOffset));
					break;
				case SigIeSchedule:
					status |=
						dot11f_unpack_ie_schedule(
						    pCtx, pBufRemaining, len,
						    (tDot11fIESchedule *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIESchedule) *
						    countOffset));
					break;
				case SigIeTCLAS:
					status |=
						dot11f_unpack_ie_tclas(
						    pCtx, pBufRemaining, len,
						    (tDot11fIETCLAS *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIETCLAS) *
						    countOffset));
					break;
				case SigIeTCLASSPROC:
					status |= dot11f_unpack_ie_common_func(pCtx, pBufRemaining, len,
										(uint8_t *) &(((tDot11fIETCLASSPROC *)(pFrm + pIe->offset + sizeof(tDot11fIETCLASSPROC)*countOffset))->present),
										(uint8_t *) &(((tDot11fIETCLASSPROC *)(pFrm + pIe->offset + sizeof(tDot11fIETCLASSPROC)*countOffset))->processing));
					break;
				case SigIeTSDelay:
					status |=
						dot11f_unpack_ie_ts_delay(
						    pCtx, pBufRemaining, len,
						    (tDot11fIETSDelay *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIETSDelay) *
						    countOffset));
					break;
				case SigIeTSPEC:
					status |=
						dot11f_unpack_ie_tspec(
						    pCtx, pBufRemaining, len,
						    (tDot11fIETSPEC *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIETSPEC) *
						    countOffset));
					break;
				case SigIeVHTCaps:
					status |=
						dot11f_unpack_ie_vht_caps(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEVHTCaps *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEVHTCaps) *
						    countOffset));
					break;
				case SigIeVHTOperation:
					status |=
						dot11f_unpack_ie_vht_operation(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEVHTOperation *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEVHTOperation) *
						    countOffset));
					break;
				case SigIeWMMSchedule:
					status |=
						dot11f_unpack_ie_wmm_schedule(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWMMSchedule *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWMMSchedule) *
						    countOffset));
					break;
				case SigIeWMMTCLAS:
					status |=
						dot11f_unpack_ie_wmmtclas(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWMMTCLAS *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWMMTCLAS) *
						    countOffset));
					break;
				case SigIeWMMTCLASPROC:
					status |=
						dot11f_unpack_ie_wmmtclasproc(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWMMTCLASPROC *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWMMTCLASPROC) *
						    countOffset));
					break;
				case SigIeWMMTSDelay:
					status |=
						dot11f_unpack_ie_wmmts_delay(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWMMTSDelay *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWMMTSDelay) *
						    countOffset));
					break;
				case SigIeWMMTSPEC:
					status |=
						dot11f_unpack_ie_wmmtspec(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWMMTSPEC *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWMMTSPEC) *
						    countOffset));
					break;
				case SigIeWiderBWChanSwitchAnn:
					status |=
						dot11f_unpack_ie_wider_bw_chan_switch_ann(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWiderBWChanSwitchAnn *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWiderBWChanSwitchAnn) *
						    countOffset));
					break;
				case SigIeAID:
					status |=
						dot11f_unpack_ie_aid(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEAID *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEAID) *
						    countOffset));
					break;
				case SigIeCFParams:
					status |=
						dot11f_unpack_ie_cf_params(
						    pCtx, pBufRemaining, len,
						    (tDot11fIECFParams *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIECFParams) *
						    countOffset));
					break;
				case SigIeChallengeText:
					status |=
						dot11f_unpack_ie_challenge_text(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEChallengeText *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEChallengeText) *
						    countOffset));
					break;
				case SigIeChanSwitchAnn:
					status |=
						dot11f_unpack_ie_chan_switch_ann(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEChanSwitchAnn *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEChanSwitchAnn) *
						    countOffset));
					break;
				case SigIeChannelSwitchWrapper:
					status |=
						dot11f_unpack_ie_channel_switch_wrapper(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEChannelSwitchWrapper *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEChannelSwitchWrapper) *
						    countOffset));
					break;
				case SigIeCountry:
					status |=
						dot11f_unpack_ie_country(
						    pCtx, pBufRemaining, len,
						    (tDot11fIECountry *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIECountry) *
						    countOffset));
					break;
				case SigIeDSParams:
					status |= dot11f_unpack_ie_common_func(pCtx, pBufRemaining, len,
										(uint8_t *) &(((tDot11fIEDSParams *)(pFrm + pIe->offset + sizeof(tDot11fIEDSParams)*countOffset))->present),
										(uint8_t *) &(((tDot11fIEDSParams *)(pFrm + pIe->offset + sizeof(tDot11fIEDSParams)*countOffset))->curr_channel));
					break;
				case SigIeEDCAParamSet:
					status |=
						dot11f_unpack_ie_edca_param_set(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEEDCAParamSet *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEEDCAParamSet) *
						    countOffset));
					break;
				case SigIeERPInfo:
					status |=
						dot11f_unpack_ie_erp_info(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEERPInfo *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEERPInfo) *
						    countOffset));
					break;
				case SigIeESECckmOpaque:
					status |=
						dot11f_unpack_ie_ese_cckm_opaque(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEESECckmOpaque *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEESECckmOpaque) *
						    countOffset));
					break;
				case SigIeESERadMgmtCap:
					status |=
						dot11f_unpack_ie_ese_rad_mgmt_cap(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEESERadMgmtCap *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEESERadMgmtCap) *
						    countOffset));
					break;
				case SigIeESETrafStrmMet:
					status |=
						dot11f_unpack_ie_ese_traf_strm_met(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEESETrafStrmMet *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEESETrafStrmMet) *
						    countOffset));
					break;
				case SigIeESETrafStrmRateSet:
					status |=
						dot11f_unpack_ie_ese_traf_strm_rate_set(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEESETrafStrmRateSet *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEESETrafStrmRateSet) *
						    countOffset));
					break;
				case SigIeESETxmitPower:
					status |=
						dot11f_unpack_ie_ese_txmit_power(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEESETxmitPower *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEESETxmitPower) *
						    countOffset));
					break;
				case SigIeESEVersion:
					status |=
						dot11f_unpack_ie_ese_version(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEESEVersion *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEESEVersion) *
						    countOffset));
					break;
				case SigIeExtCap:
					status |=
						dot11f_unpack_ie_ext_cap(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEExtCap *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEExtCap) *
						    countOffset));
					break;
				case SigIeExtSuppRates:
					status |=
						dot11f_unpack_ie_ext_supp_rates(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEExtSuppRates *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEExtSuppRates) *
						    countOffset));
					break;
				case SigIeFHParamSet:
					status |=
						dot11f_unpack_ie_fh_param_set(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEFHParamSet *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEFHParamSet) *
						    countOffset));
					break;
				case SigIeFHParams:
					status |=
						dot11f_unpack_ie_fh_params(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEFHParams *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEFHParams) *
						    countOffset));
					break;
				case SigIeFHPattTable:
					status |=
						dot11f_unpack_ie_fh_patt_table(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEFHPattTable *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEFHPattTable) *
						    countOffset));
					break;
				case SigIeFTInfo:
					status |=
						dot11f_unpack_ie_ft_info(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEFTInfo *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEFTInfo) *
						    countOffset));
					break;
				case SigIeHTCaps:
					status |=
						dot11f_unpack_ie_ht_caps(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEHTCaps *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEHTCaps) *
						    countOffset));
					break;
				case SigIeHTInfo:
					status |=
						dot11f_unpack_ie_ht_info(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEHTInfo *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEHTInfo) *
						    countOffset));
					break;
				case SigIeIBSSParams:
					status |=
						dot11f_unpack_ie_ibss_params(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEIBSSParams *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEIBSSParams) *
						    countOffset));
					break;
				case SigIeLinkIdentifier:
					status |=
						dot11f_unpack_ie_link_identifier(
						    pCtx, pBufRemaining, len,
						    (tDot11fIELinkIdentifier *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIELinkIdentifier) *
						    countOffset));
					break;
				case SigIeMeasurementReport:
					status |=
						dot11f_unpack_ie_measurement_report(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEMeasurementReport *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEMeasurementReport) *
						    countOffset));
					break;
				case SigIeMeasurementRequest:
					status |=
						dot11f_unpack_ie_measurement_request(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEMeasurementRequest *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEMeasurementRequest) *
						    countOffset));
					break;
				case SigIeMobilityDomain:
					status |=
						dot11f_unpack_ie_mobility_domain(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEMobilityDomain *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEMobilityDomain) *
						    countOffset));
					break;
				case SigIeNeighborReport:
					if (countOffset < MAX_SUPPORTED_NEIGHBOR_RPT) {
						status |=
							dot11f_unpack_ie_neighbor_report(
							    pCtx, pBufRemaining, len,
							    (tDot11fIENeighborReport *)
							    (pFrm + pIe->offset +
							    sizeof(tDot11fIENeighborReport) *
							    countOffset));
					} else {
						status |= DOT11F_BUFFER_OVERFLOW;
					}
					break;
				case SigIeOBSSScanParameters:
					status |=
						dot11f_unpack_ie_obss_scan_parameters(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEOBSSScanParameters *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEOBSSScanParameters) *
						    countOffset));
					break;
				case SigIeOperatingMode:
					status |=
						dot11f_unpack_ie_operating_mode(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEOperatingMode *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEOperatingMode) *
						    countOffset));
					break;
				case SigIeP2PAssocReq:
					status |=
						dot11f_unpack_ie_p2_p_assoc_req(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEP2PAssocReq *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEP2PAssocReq) *
						    countOffset));
					break;
				case SigIeP2PAssocRes:
					status |=
						dot11f_unpack_ie_p2_p_assoc_res(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEP2PAssocRes *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEP2PAssocRes) *
						    countOffset));
					break;
				case SigIeP2PBeacon:
					status |=
						dot11f_unpack_ie_p2_p_beacon(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEP2PBeacon *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEP2PBeacon) *
						    countOffset));
					break;
				case SigIeP2PBeaconProbeRes:
					status |=
						dot11f_unpack_ie_p2_p_beacon_probe_res(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEP2PBeaconProbeRes *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEP2PBeaconProbeRes) *
						    countOffset));
					break;
				case SigIeP2PDeAuth:
					status |=
						dot11f_unpack_ie_p2_p_de_auth(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEP2PDeAuth *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEP2PDeAuth) *
						    countOffset));
					break;
				case SigIeP2PDisAssoc:
					status |=
						dot11f_unpack_ie_p2_p_dis_assoc(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEP2PDisAssoc *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEP2PDisAssoc) *
						    countOffset));
					break;
				case SigIeP2PIEOpaque:
					status |=
						dot11f_unpack_ie_p2_pie_opaque(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEP2PIEOpaque *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEP2PIEOpaque) *
						    countOffset));
					break;
				case SigIeP2PProbeReq:
					status |=
						dot11f_unpack_ie_p2_p_probe_req(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEP2PProbeReq *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEP2PProbeReq) *
						    countOffset));
					break;
				case SigIeP2PProbeRes:
					status |=
						dot11f_unpack_ie_p2_p_probe_res(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEP2PProbeRes *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEP2PProbeRes) *
						    countOffset));
					break;
				case SigIePTIControl:
					status |=
						dot11f_unpack_ie_pti_control(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEPTIControl *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEPTIControl) *
						    countOffset));
					break;
				case SigIePUBufferStatus:
					status |=
						dot11f_unpack_ie_pu_buffer_status(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEPUBufferStatus *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEPUBufferStatus) *
						    countOffset));
					break;
				case SigIePowerCaps:
					status |=
						dot11f_unpack_ie_power_caps(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEPowerCaps *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEPowerCaps) *
						    countOffset));
					break;
				case SigIePowerConstraints:
					status |=
						dot11f_unpack_ie_power_constraints(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEPowerConstraints *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEPowerConstraints) *
						    countOffset));
					break;
				case SigIeQBSSLoad:
					status |=
						dot11f_unpack_ie_qbss_load(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEQBSSLoad *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEQBSSLoad) *
						    countOffset));
					break;
				case SigIeQComVendorIE:
					status |=
						dot11f_unpack_ie_QComVendorIE(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEQComVendorIE *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEQComVendorIE) *
						    countOffset));
					break;
				case SigIeQOSCapsAp:
					status |=
						dot11f_unpack_ie_qos_caps_ap(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEQOSCapsAp *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEQOSCapsAp) *
						    countOffset));
					break;
				case SigIeQOSCapsStation:
					status |=
						dot11f_unpack_ie_qos_caps_station(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEQOSCapsStation *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEQOSCapsStation) *
						    countOffset));
					break;
				case SigIeQosMapSet:
					status |=
						dot11f_unpack_ie_qos_map_set(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEQosMapSet *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEQosMapSet) *
						    countOffset));
					break;
				case SigIeQuiet:
					status |=
						dot11f_unpack_ie_quiet(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEQuiet *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEQuiet) *
						    countOffset));
					break;
				case SigIeRCPIIE:
					status |=
						dot11f_unpack_ie_rcpiie(
						    pCtx, pBufRemaining, len,
						    (tDot11fIERCPIIE *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIERCPIIE) *
						    countOffset));
					break;
				case SigIeRICDataDesc:
					/* reset the pointers back since this is a container IE and it doesnt have its own EID and Len. */
					pBufRemaining -= 2;
					nBufRemaining += 2;
					if (pIe && pIe->noui) {
						pBufRemaining -= pIe->noui;
						nBufRemaining += pIe->noui;
						len += pIe->noui;
					}
					status |= get_container_ies_len(pCtx, pBufRemaining, nBufRemaining, &len, IES_RICDataDesc);
					if (status != DOT11F_PARSE_SUCCESS && status != DOT11F_UNKNOWN_IES)
						 break;
					status |=
						dot11f_unpack_ie_ric_data_desc(
						    pCtx, pBufRemaining, len,
						    (tDot11fIERICDataDesc *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIERICDataDesc) *
						    countOffset));
					break;
				case SigIeRSN:
					status |=
						dot11f_unpack_ie_rsn(
						    pCtx, pBufRemaining, len,
						    (tDot11fIERSN *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIERSN) *
						    countOffset));
					break;
				case SigIeRSNIIE:
					status |=
						dot11f_unpack_ie_rsniie(
						    pCtx, pBufRemaining, len,
						    (tDot11fIERSNIIE *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIERSNIIE) *
						    countOffset));
					break;
				case SigIeRSNOpaque:
					status |=
						dot11f_unpack_ie_rsn_opaque(
						    pCtx, pBufRemaining, len,
						    (tDot11fIERSNOpaque *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIERSNOpaque) *
						    countOffset));
					break;
				case SigIeSuppChannels:
					status |=
						dot11f_unpack_ie_supp_channels(
						    pCtx, pBufRemaining, len,
						    (tDot11fIESuppChannels *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIESuppChannels) *
						    countOffset));
					break;
				case SigIeSuppOperatingClasses:
					status |=
						dot11f_unpack_ie_supp_operating_classes(
						    pCtx, pBufRemaining, len,
						    (tDot11fIESuppOperatingClasses *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIESuppOperatingClasses) *
						    countOffset));
					break;
				case SigIeSuppRates:
					status |=
						dot11f_unpack_ie_supp_rates(
						    pCtx, pBufRemaining, len,
						    (tDot11fIESuppRates *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIESuppRates) *
						    countOffset));
					break;
				case SigIeTIM:
					status |=
						dot11f_unpack_ie_tim(
						    pCtx, pBufRemaining, len,
						    (tDot11fIETIM *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIETIM) *
						    countOffset));
					break;
				case SigIeTPCReport:
					status |=
						dot11f_unpack_ie_tpc_report(
						    pCtx, pBufRemaining, len,
						    (tDot11fIETPCReport *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIETPCReport) *
						    countOffset));
					break;
				case SigIeTPCRequest:
					status |=
						dot11f_unpack_ie_tpc_request(
						    pCtx, pBufRemaining, len,
						    (tDot11fIETPCRequest *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIETPCRequest) *
						    countOffset));
					break;
				case SigIeTimeAdvertisement:
					status |=
						dot11f_unpack_ie_time_advertisement(
						    pCtx, pBufRemaining, len,
						    (tDot11fIETimeAdvertisement *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIETimeAdvertisement) *
						    countOffset));
					break;
				case SigIeTimeoutInterval:
					status |=
						dot11f_unpack_ie_timeout_interval(
						    pCtx, pBufRemaining, len,
						    (tDot11fIETimeoutInterval *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIETimeoutInterval) *
						    countOffset));
					break;
				case SigIeVHTExtBssLoad:
					status |=
						dot11f_unpack_ie_vht_ext_bss_load(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEVHTExtBssLoad *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEVHTExtBssLoad) *
						    countOffset));
					break;
				case SigIeVendor1IE:
					status |=
						dot11f_unpack_ie_vendor1_ie(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEVendor1IE *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEVendor1IE) *
						    countOffset));
					break;
				case SigIeVendor3IE:
					status |=
						dot11f_unpack_ie_vendor3_ie(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEVendor3IE *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEVendor3IE) *
						    countOffset));
					break;
				case SigIeWAPI:
					status |=
						dot11f_unpack_ie_wapi(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWAPI *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWAPI) *
						    countOffset));
					break;
				case SigIeWAPIOpaque:
					status |=
						dot11f_unpack_ie_wapi_opaque(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWAPIOpaque *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWAPIOpaque) *
						    countOffset));
					break;
				case SigIeWFATPC:
					status |=
						dot11f_unpack_ie_wfatpc(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWFATPC *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWFATPC) *
						    countOffset));
					break;
				case SigIeWFDIEOpaque:
					status |=
						dot11f_unpack_ie_wfdie_opaque(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWFDIEOpaque *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWFDIEOpaque) *
						    countOffset));
					break;
				case SigIeWMMCaps:
					status |=
						dot11f_unpack_ie_wmm_caps(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWMMCaps *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWMMCaps) *
						    countOffset));
					break;
				case SigIeWMMInfoAp:
					status |=
						dot11f_unpack_ie_wmm_info_ap(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWMMInfoAp *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWMMInfoAp) *
						    countOffset));
					break;
				case SigIeWMMInfoStation:
					status |=
						dot11f_unpack_ie_wmm_info_station(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWMMInfoStation *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWMMInfoStation) *
						    countOffset));
					break;
				case SigIeWMMParams:
					status |=
						dot11f_unpack_ie_wmm_params(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWMMParams *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWMMParams) *
						    countOffset));
					break;
				case SigIeWPA:
					status |=
						dot11f_unpack_ie_wpa(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWPA *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWPA) *
						    countOffset));
					break;
				case SigIeWPAOpaque:
					status |=
						dot11f_unpack_ie_wpa_opaque(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWPAOpaque *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWPAOpaque) *
						    countOffset));
					break;
				case SigIeWSC:
					status |=
						dot11f_unpack_ie_wsc(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWSC *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWSC) *
						    countOffset));
					break;
				case SigIeWscAssocReq:
					status |=
						dot11f_unpack_ie_wsc_assoc_req(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWscAssocReq *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWscAssocReq) *
						    countOffset));
					break;
				case SigIeWscAssocRes:
					status |=
						dot11f_unpack_ie_wsc_assoc_res(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWscAssocRes *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWscAssocRes) *
						    countOffset));
					break;
				case SigIeWscBeacon:
					status |=
						dot11f_unpack_ie_wsc_beacon(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWscBeacon *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWscBeacon) *
						    countOffset));
					break;
				case SigIeWscBeaconProbeRes:
					status |=
						dot11f_unpack_ie_wsc_beacon_probe_res(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWscBeaconProbeRes *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWscBeaconProbeRes) *
						    countOffset));
					break;
				case SigIeWscIEOpaque:
					status |=
						dot11f_unpack_ie_wsc_ie_opaque(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWscIEOpaque *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWscIEOpaque) *
						    countOffset));
					break;
				case SigIeWscProbeReq:
					status |=
						dot11f_unpack_ie_wsc_probe_req(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWscProbeReq *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWscProbeReq) *
						    countOffset));
					break;
				case SigIeWscProbeRes:
					status |=
						dot11f_unpack_ie_wsc_probe_res(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWscProbeRes *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWscProbeRes) *
						    countOffset));
					break;
				case SigIeWscReassocRes:
					status |=
						dot11f_unpack_ie_wsc_reassoc_res(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEWscReassocRes *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEWscReassocRes) *
						    countOffset));
					break;
				case SigIeext_chan_switch_ann:
					status |=
						dot11f_unpack_ie_ext_chan_switch_ann(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEext_chan_switch_ann *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEext_chan_switch_ann) *
						    countOffset));
					break;
				case SigIeht2040_bss_coexistence:
					status |=
						dot11f_unpack_ie_ht2040_bss_coexistence(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEht2040_bss_coexistence *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEht2040_bss_coexistence) *
						    countOffset));
					break;
				case SigIeht2040_bss_intolerant_report:
					status |=
						dot11f_unpack_ie_ht2040_bss_intolerant_report(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEht2040_bss_intolerant_report *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEht2040_bss_intolerant_report) *
						    countOffset));
					break;
				case SigIesec_chan_offset_ele:
					status |=
						dot11f_unpack_ie_sec_chan_offset_ele(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEsec_chan_offset_ele *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEsec_chan_offset_ele) *
						    countOffset));
					break;
				case SigIevendor2_ie:
					status |=
						dot11f_unpack_ie_vendor2_ie(
						    pCtx, pBufRemaining, len,
						    (tDot11fIEvendor2_ie *)
						    (pFrm + pIe->offset +
						    sizeof(tDot11fIEvendor2_ie) *
						    countOffset));
					break;
				default:
					FRAMES_LOG1(pCtx, FRLOGE, FRFL("INTERNAL ERROR"
						     ": I don't know about the IE signature %d"
						     "-- this is most likely a 'framesc' bug.\n"),
						     pIe->sig);
					FRAMES_DBG_BREAK();
					return DOT11F_INTERNAL_ERROR;
				}
				if (pIe->arraybound)
					(++(*(uint16_t *)(pFrm + pIe->countOffset)));
			}
		} else {
			FRAMES_LOG2(pCtx, FRLOG3, FRFL("Skipping unknown IE %d"
				     " (length %d)\n"), eid, len);
			FRAMES_DUMP(pCtx, FRLOG3, pBufRemaining - 2, len);
			status |= DOT11F_UNKNOWN_IES;
		}

		pBufRemaining += len;

		if (len > nBufRemaining) {
			FRAMES_LOG0(pCtx, FRLOGW, FRFL("This IE extends past "
				     "the buffer as it was defined to us.  This could"
				     "mean a corrupt frame, or just an incorrect leng"
				     "th parameter.\n"));
			FRAMES_DBG_BREAK();
			status |= DOT11F_LAST_IE_TOO_LONG;
			goto MandatoryCheck;
		}

		nBufRemaining -= len;

	}

MandatoryCheck:
	pIe = &IEs[0];
	while (0xff != pIe->eid) {
		if (pIe->fMandatory) {
			pfFound = (tFRAMES_BOOL *)(pFrm + pIe->offset +
						     pIe->presenceOffset);
			if (!*pfFound) {
				FRAMES_LOG1(pCtx, FRLOGW, FRFL("ERROR: The mandato"
					     "ry IE %s wasn't seen.\n"),
					     pIe->name);
				FRAMES_DBG_BREAK();
				status |= DOT11F_MANDATORY_IE_MISSING;
			}
		}
		++pIe;
	}

	return status;
} /* End unpack_core. */

static uint32_t unpack_tlv_core(tpAniSirGlobal   pCtx,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  const tTLVDefn TLVs[],
				  uint8_t *pFrm,
				  size_t       nFrm)
{
	const tTLVDefn *pTlv;
	uint32_t      nBufRemaining, status, npec;
	uint16_t      id, len;
	uint8_t      *pBufRemaining, *pfFound;

	(void)pCtx;                 /* Shutup the compiler */
	(void)nFrm;
	status = DOT11F_PARSE_SUCCESS;
	pBufRemaining = pBuf;
	nBufRemaining = nBuf;

	/* While we have data... */
	while (nBufRemaining) {
		if (3 > nBufRemaining) {
			FRAMES_LOG0(pCtx, FRLOGE, FRFL("This frame reports "
				     "fewer three byte(s) remaining.\n"));
			status |= DOT11F_INCOMPLETE_TLV;
			FRAMES_DBG_BREAK();
			goto MandatoryCheck;
		}

		npec = 0U;

		/* Look for a matching TLV definition, */
		pTlv = find_tlv_defn(pCtx, pBufRemaining, nBufRemaining, TLVs);
		/* consume the type, */
		if (pTlv) {
			if (pTlv->sType == 2) {
				framesntohs(pCtx, &id, pBufRemaining, pTlv->fMsb);
				pBufRemaining += 2;
				nBufRemaining -= 2;
			} else {
				id = *pBufRemaining;
				pBufRemaining += 1;
				nBufRemaining -= 1;
			}
			/* & length, */
			if (pTlv->sLen == 2) {
				framesntohs(pCtx, &len, pBufRemaining, pTlv->fMsb);
				if (2 > nBufRemaining) {
					FRAMES_LOG0(pCtx, FRLOGE, FRFL("This frame reports "
							"fewer two byte(s) remaining.\n"));
					status |= DOT11F_INCOMPLETE_TLV;
					FRAMES_DBG_BREAK();
					goto MandatoryCheck;
			}
			pBufRemaining += 2;
			nBufRemaining -= 2;
			} else {
				len = *pBufRemaining;
				pBufRemaining += 1;
				nBufRemaining -= 1;
			}
		} else {
			pBufRemaining += TLVs[0].sType;
			nBufRemaining -= TLVs[0].sType;
			framesntohs(pCtx, &len, pBufRemaining, (TLVs[0].sType == 2));
			if (2 > nBufRemaining) {
				FRAMES_LOG0(pCtx, FRLOGE, FRFL("This frame reports "
					     "fewer two byte(s) remaining.\n"));
				status |= DOT11F_INCOMPLETE_TLV;
				FRAMES_DBG_BREAK();
				goto MandatoryCheck;
			}
			pBufRemaining += 2;
			nBufRemaining -= 2;
		}

		if (pTlv && pTlv->pec) {
		npec = 3U;
			if (3 > nBufRemaining) {
				FRAMES_LOG2(pCtx, FRLOGW, FRFL("TLV %d reports length"
				    "%d, but it has a Private Enterprise Code (3 byte"
				    "s.\n"), id, len);
				FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf);
				FRAMES_LOG2(pCtx, FRLOG1, FRFL("We've parsed %d bytes"
				    "of this buffer, and show %d left.\n"),
				pBufRemaining - pBuf, nBufRemaining);
				status |= DOT11F_INCOMPLETE_TLV;
				FRAMES_DBG_BREAK();
				goto MandatoryCheck;
			}
		pBufRemaining += 3;
		nBufRemaining -= 3;
		len           -= 3;
		}

		/* Whether we found a hit or not, we can validate the reported */
		/* length of this TLV: */
		if (len > nBufRemaining) {
			FRAMES_LOG3(pCtx, FRLOGW, FRFL("TLV %d reports length %"
			    "d, but there are only %d bytes remaining in this f"
			    "rame.\n"), id, len, nBufRemaining);
			FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf);
			FRAMES_LOG2(pCtx, FRLOG1, FRFL("We've parsed %d bytes"
			    " of this buffer, and show %d left.\n"),
			    pBufRemaining - pBuf, nBufRemaining);
			status |= DOT11F_INCOMPLETE_TLV;
			FRAMES_DBG_BREAK();
			goto MandatoryCheck;
		}

		/* Now, *if* we found a hit... */
		if (pTlv) {
			if (len < pTlv->minSize - npec) {
				FRAMES_LOG3(pCtx, FRLOGW, FRFL("The IE %s must be "
				    "at least %d bytes in size, but the size is only "
				    "%d bytes.\n"),
				     pTlv->name, pTlv->minSize, len);
				FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf);
				status |= DOT11F_INCOMPLETE_TLV;
				FRAMES_DBG_BREAK();
				goto MandatoryCheck;
			}
			if (nBufRemaining < pTlv->minSize - npec - (pTlv->sType + pTlv->sLen)) {
				FRAMES_LOG3(pCtx, FRLOGW, FRFL("The IE %s must be "
				    "at least %d bytes in size, but there are only "
				    "%d bytes remaining in this frame.\n"),
				     pTlv->name, pTlv->minSize, nBufRemaining);
				FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf);
				status |= DOT11F_INCOMPLETE_TLV;
				FRAMES_DBG_BREAK();
				goto MandatoryCheck;
			} else if (len > pTlv->maxSize - npec - (pTlv->sType + pTlv->sLen)) {
				FRAMES_LOG1(pCtx, FRLOGW, FRFL("The TLV %s reports "
				    "an illegally large size; this TLV is presumably"
				    "corrupt or otherwise invalid & will be skipped "
				    "ipped.\n"), pTlv->name);
				FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf);
				FRAMES_LOG2(pCtx, FRLOG1, FRFL("We've parsed %d by"
				    "tes of this buffer, and show %d left.\n"),
				    pBufRemaining - pBuf, nBufRemaining);
				FRAMES_DBG_BREAK();
				status |= DOT11F_SKIPPED_BAD_TLV;
			} else {
				switch (pTlv->sig) {
				case SigTlvAuthorizedMACs:
					status |=
						dot11f_unpack_tlv_authorized_ma_cs(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVAuthorizedMACs *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvRequestToEnroll:
					status |=
						dot11f_unpack_tlv_common_func(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVRequestToEnroll *)
						  (pFrm + pTlv->offset))->present),
						  (uint8_t *)&(((tDot11fTLVRequestToEnroll *)
						  (pFrm + pTlv->offset))->req));
					break;
				case SigTlvVersion2:
					status |=
						dot11f_unpack_tlv_version2(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVVersion2 *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvAPSetupLocked:
					status |=
						dot11f_unpack_tlv_common_func(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVAPSetupLocked *)
						  (pFrm + pTlv->offset))->present),
						  (uint8_t *)&(((tDot11fTLVAPSetupLocked *)
						  (pFrm + pTlv->offset))->fLocked));
					break;
				case SigTlvAssociationState:
					status |=
						dot11f_unpack_tlv_common_func2(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVAssociationState *)
						  (pFrm + pTlv->offset))->present),
						  (uint16_t *)&(((tDot11fTLVAssociationState *)
						  (pFrm + pTlv->offset))->state));
					break;
				case SigTlvConfigMethods:
					status |=
						dot11f_unpack_tlv_common_func2(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVConfigMethods *)
						  (pFrm + pTlv->offset))->present),
						  (uint16_t *)&(((tDot11fTLVConfigMethods *)
						  (pFrm + pTlv->offset))->methods));
					break;
				case SigTlvConfigurationError:
					status |=
						dot11f_unpack_tlv_common_func2(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVConfigurationError *)
						  (pFrm + pTlv->offset))->present),
						  (uint16_t *)&(((tDot11fTLVConfigurationError *)
						  (pFrm + pTlv->offset))->error));
					break;
				case SigTlvDeviceName:
					status |=
						dot11f_unpack_tlv_device_name(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVDeviceName *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvDevicePasswordID:
					status |=
						dot11f_unpack_tlv_common_func2(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVDevicePasswordID *)
						  (pFrm + pTlv->offset))->present),
						  (uint16_t *)&(((tDot11fTLVDevicePasswordID *)
						  (pFrm + pTlv->offset))->id));
					break;
				case SigTlvExtendedListenTiming:
					status |=
						dot11f_unpack_tlv_extended_listen_timing(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVExtendedListenTiming *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvListenChannel:
					status |=
						dot11f_unpack_tlv_listen_channel(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVListenChannel *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvManufacturer:
					status |=
						dot11f_unpack_tlv_manufacturer(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVManufacturer *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvMinorReasonCode:
					status |=
						dot11f_unpack_tlv_common_func(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVMinorReasonCode *)
						  (pFrm + pTlv->offset))->present),
						  (uint8_t *)&(((tDot11fTLVMinorReasonCode *)
						  (pFrm + pTlv->offset))->minorReasonCode));
					break;
				case SigTlvModelName:
					status |=
						dot11f_unpack_tlv_model_name(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVModelName *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvModelNumber:
					status |=
						dot11f_unpack_tlv_model_number(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVModelNumber *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvNoticeOfAbsence:
					status |=
						dot11f_unpack_tlv_notice_of_absence(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVNoticeOfAbsence *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvOperatingChannel:
					status |=
						dot11f_unpack_tlv_operating_channel(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVOperatingChannel *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvP2PCapability:
					status |=
						dot11f_unpack_tlv_p2_p_capability(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVP2PCapability *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvP2PDeviceId:
					status |=
						dot11f_unpack_tlv_p2_p_device_id(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVP2PDeviceId *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvP2PDeviceInfo:
					status |=
						dot11f_unpack_tlv_p2_p_device_info(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVP2PDeviceInfo *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvP2PGroupInfo:
					status |=
						dot11f_unpack_tlv_p2_p_group_info(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVP2PGroupInfo *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvP2PStatus:
					status |=
						dot11f_unpack_tlv_common_func(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVP2PStatus *)
						  (pFrm + pTlv->offset))->present),
						  (uint8_t *)&(((tDot11fTLVP2PStatus *)
						  (pFrm + pTlv->offset))->status));
					break;
				case SigTlvPrimaryDeviceType:
					status |=
						dot11f_unpack_tlv_primary_device_type(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVPrimaryDeviceType *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvRFBands:
					status |=
						dot11f_unpack_tlv_common_func(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVRFBands *)
						  (pFrm + pTlv->offset))->present),
						  (uint8_t *)&(((tDot11fTLVRFBands *)
						  (pFrm + pTlv->offset))->bands));
					break;
				case SigTlvRequestDeviceType:
					status |=
						dot11f_unpack_tlv_request_device_type(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVRequestDeviceType *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvRequestType:
					status |=
						dot11f_unpack_tlv_common_func(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVRequestType *)
						  (pFrm + pTlv->offset))->present),
						  (uint8_t *)&(((tDot11fTLVRequestType *)
						  (pFrm + pTlv->offset))->reqType));
					break;
				case SigTlvResponseType:
					status |=
						dot11f_unpack_tlv_common_func(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVResponseType *)
						  (pFrm + pTlv->offset))->present),
						  (uint8_t *)&(((tDot11fTLVResponseType *)
						  (pFrm + pTlv->offset))->resType));
					break;
				case SigTlvSelectedRegistrar:
					status |=
						dot11f_unpack_tlv_common_func(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVSelectedRegistrar *)
						  (pFrm + pTlv->offset))->present),
						  (uint8_t *)&(((tDot11fTLVSelectedRegistrar *)
						  (pFrm + pTlv->offset))->selected));
					break;
				case SigTlvSelectedRegistrarConfigMethods:
					status |=
						dot11f_unpack_tlv_common_func2(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVSelectedRegistrarConfigMethods *)
						  (pFrm + pTlv->offset))->present),
						  (uint16_t *)&(((tDot11fTLVSelectedRegistrarConfigMethods *)
						  (pFrm + pTlv->offset))->methods));
					break;
				case SigTlvSerialNumber:
					status |=
						dot11f_unpack_tlv_serial_number(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVSerialNumber *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvUUID_E:
					status |=
						dot11f_unpack_tlv_uuid_e(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVUUID_E *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvUUID_R:
					status |=
						dot11f_unpack_tlv_uuid_r(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVUUID_R *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvVendorExtension:
					status |=
						dot11f_unpack_tlv_vendor_extension(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVVendorExtension *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvVersion:
					status |=
						dot11f_unpack_tlv_version(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVVersion *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvWPSState:
					status |=
						dot11f_unpack_tlv_common_func(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVWPSState *)
						  (pFrm + pTlv->offset))->present),
						  (uint8_t *)&(((tDot11fTLVWPSState *)
						  (pFrm + pTlv->offset))->state));
					break;
				case SigTlvP2PInterface:
					status |=
						dot11f_unpack_tlv_p2_p_interface(pCtx,
						  pBufRemaining, len,
						  (tDot11fTLVP2PInterface *)
						  (pFrm + pTlv->offset));
					break;
				case SigTlvP2PManageability:
					status |=
						dot11f_unpack_tlv_common_func(pCtx,
						  pBufRemaining, len,
						  (uint8_t *)&(((tDot11fTLVP2PManageability *)
						  (pFrm + pTlv->offset))->present),
						  (uint8_t *)&(((tDot11fTLVP2PManageability *)
						  (pFrm + pTlv->offset))->manageability));
					break;
				default:
					FRAMES_LOG1(pCtx, FRLOGE, FRFL("INTERNAL ERROR: I"
					    " don't know about the TLV signature %d-- thi"
					    "s is most likely a 'framesc' bug.\n"),
					    pTlv->sig);
					FRAMES_DBG_BREAK();
					return DOT11F_INTERNAL_ERROR;
				} /* End switch on sig. */
			} /* End if on length check. */

		} else {
			FRAMES_LOG2(pCtx, FRLOG3, FRFL("Skipping unknown TLV %d ("
			    "length %d)\n"), id, len);
			FRAMES_DUMP(pCtx, FRLOG3, pBufRemaining - (pTlv->sType + pTlv->sLen), len);
			status |= DOT11F_UNKNOWN_TLVS;
		}

		/* Advance to the next TLV */
		pBufRemaining += len;

		if (len > nBufRemaining) {
			FRAMES_LOG0(pCtx, FRLOGW, FRFL("This TLV extends past th"
			    "e buffer as it was defined to us.  This could mean "
			    "a corrupt frame, or just an incorrect length parame"
			    "ter.\n"));
			FRAMES_DBG_BREAK();
			status |= DOT11F_LAST_TLV_TOO_LONG;
			goto MandatoryCheck;
		}

		nBufRemaining -= len;

	} /* End iteration over TLVs.*/

MandatoryCheck:
	pTlv = &TLVs[0];
	while (0xffff != pTlv->id) {
		if (pTlv->fMandatory) {
			pfFound = (uint8_t *)(pFrm + pTlv->offset +
					     pTlv->presenceOffset);
			if (!*pfFound) {
				FRAMES_LOG1(pCtx, FRLOGW, FRFL("ERROR: The mandatory "
				    "TLV %s wasn't seen.\n"),
				    pTlv->name);
				FRAMES_DBG_BREAK();
				status |= DOT11F_MANDATORY_TLV_MISSING;
			}

		}
		++pTlv;
	}

	return status;
} /* End UnpacTlvkCore. */
uint32_t dot11f_get_packed_ietclas(tpAniSirGlobal pCtx,
	tDot11fIETCLAS *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 1;
		*pnNeeded += 1;
		*pnNeeded += 1;
		switch (pIe->classifier_type) {
		case 0:
			*pnNeeded += 6;
			*pnNeeded += 6;
			*pnNeeded += 2;
			break;
		case 1:
			*pnNeeded += 1;
			switch (pIe->info.IpParams.version) {
			case 4:
				*pnNeeded += 4;
				*pnNeeded += 4;
				*pnNeeded += 2;
				*pnNeeded += 2;
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 1;
				break;
			case 6:
				*pnNeeded += 16;
				*pnNeeded += 16;
				*pnNeeded += 2;
				*pnNeeded += 2;
				*pnNeeded += 3;
				break;
			}
			break;
		case 2:
			*pnNeeded += 2;
			break;
		}
		break;
	}
	return status;
} /* End dot11f_get_packed_ietclas. */

uint32_t dot11f_get_packed_iewmmtclas(tpAniSirGlobal pCtx,
	tDot11fIEWMMTCLAS *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 1;
		*pnNeeded += 1;
		*pnNeeded += 1;
		*pnNeeded += 1;
		switch (pIe->classifier_type) {
		case 0:
			*pnNeeded += 6;
			*pnNeeded += 6;
			*pnNeeded += 2;
			break;
		case 1:
			*pnNeeded += 1;
			switch (pIe->info.IpParams.version) {
			case 4:
				*pnNeeded += 4;
				*pnNeeded += 4;
				*pnNeeded += 2;
				*pnNeeded += 2;
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 1;
				break;
			case 6:
				*pnNeeded += 16;
				*pnNeeded += 16;
				*pnNeeded += 2;
				*pnNeeded += 2;
				*pnNeeded += 3;
				break;
			}
			break;
		case 2:
			*pnNeeded += 2;
			break;
		}
		break;
	}
	return status;
} /* End dot11f_get_packed_iewmmtclas. */

uint32_t dot11f_get_packed_ie_channel_switch_wrapper(tpAniSirGlobal pCtx,
	tDot11fIEChannelSwitchWrapper *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_core(pCtx, (uint8_t *)pIe, pnNeeded,
				IES_ChannelSwitchWrapper);
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_channel_switch_wrapper. */

uint32_t dot11f_get_packed_ie_country(tpAniSirGlobal pCtx,
	tDot11fIECountry *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 3;
		if (pIe->num_triplets) {
			*pnNeeded += (pIe->num_triplets * 3);
		} else {
			break;
		}
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_country. */

uint32_t dot11f_get_packed_ieft_info(tpAniSirGlobal pCtx,
	tDot11fIEFTInfo *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 2;
		*pnNeeded += 16;
		*pnNeeded += 32;
		*pnNeeded += 32;
		status = get_packed_size_core(pCtx, (uint8_t *)pIe, pnNeeded,
				IES_FTInfo);
		break;
	}
	return status;
} /* End dot11f_get_packed_ieft_info. */

uint32_t dot11f_get_packed_ie_measurement_report(tpAniSirGlobal pCtx,
	tDot11fIEMeasurementReport *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 1;
		*pnNeeded += 1;
		*pnNeeded += 1;
		if (pIe->type) {
			switch (pIe->type) {
			case 0:
				*pnNeeded += 1;
				*pnNeeded += 8;
				*pnNeeded += 2;
				*pnNeeded += 1;
				break;
			case 1:
				*pnNeeded += 1;
				*pnNeeded += 8;
				*pnNeeded += 2;
				*pnNeeded += 1;
				break;
			case 2:
				*pnNeeded += 1;
				*pnNeeded += 8;
				*pnNeeded += 2;
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 1;
				break;
			case 5:
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 8;
				*pnNeeded += 2;
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 1;
				*pnNeeded += 6;
				*pnNeeded += 1;
				*pnNeeded += 4;
				status = get_packed_size_core(pCtx, (uint8_t *)pIe, pnNeeded, IES_reportBeacon);
				break;
			}
		} else {
			break;
		}
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_measurement_report. */

uint32_t dot11f_get_packed_ie_measurement_request(tpAniSirGlobal pCtx,
	tDot11fIEMeasurementRequest *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 1;
		*pnNeeded += 1;
		*pnNeeded += 1;
		switch (pIe->measurement_type) {
		case 0:
			*pnNeeded += 1;
			*pnNeeded += 8;
			*pnNeeded += 2;
			break;
		case 1:
			*pnNeeded += 1;
			*pnNeeded += 8;
			*pnNeeded += 2;
			break;
		case 2:
			*pnNeeded += 1;
			*pnNeeded += 8;
			*pnNeeded += 2;
			break;
		case 5:
			*pnNeeded += 1;
			*pnNeeded += 1;
			*pnNeeded += 2;
			*pnNeeded += 2;
			*pnNeeded += 1;
			*pnNeeded += 6;
			status = get_packed_size_core(pCtx, (uint8_t *)pIe, pnNeeded, IES_measurement_requestBeacon);
			break;
		}
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_measurement_request. */

uint32_t dot11f_get_packed_ie_neighbor_report(tpAniSirGlobal pCtx,
	tDot11fIENeighborReport *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 6;
		*pnNeeded += 1;
		*pnNeeded += 1;
		*pnNeeded += 2;
		*pnNeeded += 1;
		*pnNeeded += 1;
		*pnNeeded += 1;
		status = get_packed_size_core(pCtx, (uint8_t *)pIe, pnNeeded,
				IES_NeighborReport);
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_neighbor_report. */

uint32_t dot11f_get_packed_iep2_p_assoc_req(tpAniSirGlobal pCtx,
	tDot11fIEP2PAssocReq *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_P2PAssocReq);
		break;
	}
	return status;
} /* End dot11f_get_packed_iep2_p_assoc_req. */

uint32_t dot11f_get_packed_iep2_p_assoc_res(tpAniSirGlobal pCtx,
	tDot11fIEP2PAssocRes *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_P2PAssocRes);
		break;
	}
	return status;
} /* End dot11f_get_packed_iep2_p_assoc_res. */

uint32_t dot11f_get_packed_iep2_p_beacon(tpAniSirGlobal pCtx,
	tDot11fIEP2PBeacon *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_P2PBeacon);
		break;
	}
	return status;
} /* End dot11f_get_packed_iep2_p_beacon. */

uint32_t dot11f_get_packed_iep2_p_beacon_probe_res(tpAniSirGlobal pCtx,
	tDot11fIEP2PBeaconProbeRes *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_P2PBeaconProbeRes);
		break;
	}
	return status;
} /* End dot11f_get_packed_iep2_p_beacon_probe_res. */

uint32_t dot11f_get_packed_iep2_p_de_auth(tpAniSirGlobal pCtx,
	tDot11fIEP2PDeAuth *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_P2PDeAuth);
		break;
	}
	return status;
} /* End dot11f_get_packed_iep2_p_de_auth. */

uint32_t dot11f_get_packed_iep2_p_dis_assoc(tpAniSirGlobal pCtx,
	tDot11fIEP2PDisAssoc *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_P2PDisAssoc);
		break;
	}
	return status;
} /* End dot11f_get_packed_iep2_p_dis_assoc. */

uint32_t dot11f_get_packed_iep2_p_probe_req(tpAniSirGlobal pCtx,
	tDot11fIEP2PProbeReq *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_P2PProbeReq);
		break;
	}
	return status;
} /* End dot11f_get_packed_iep2_p_probe_req. */

uint32_t dot11f_get_packed_iep2_p_probe_res(tpAniSirGlobal pCtx,
	tDot11fIEP2PProbeRes *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_P2PProbeRes);
		break;
	}
	return status;
} /* End dot11f_get_packed_iep2_p_probe_res. */

uint32_t dot11f_get_packed_ieric_data_desc(tpAniSirGlobal pCtx,
	tDot11fIERICDataDesc *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_core(pCtx, (uint8_t *)pIe, pnNeeded,
				IES_RICDataDesc);
		break;
	}
	return status;
} /* End dot11f_get_packed_ieric_data_desc. */

uint32_t dot11f_get_packed_iersn(tpAniSirGlobal pCtx,
	tDot11fIERSN *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 2;
		*pnNeeded += 4;
		if (pIe->pwise_cipher_suite_count) {
			*pnNeeded += 2;
		} else {
			break;
		}
		*pnNeeded += (pIe->pwise_cipher_suite_count * 4);
		if (pIe->akm_suite_count) {
			*pnNeeded += 2;
		} else {
			break;
		}
		*pnNeeded += (pIe->akm_suite_count * 4);
		if (pIe->RSN_Cap) {
			*pnNeeded += 2;
		} else {
			break;
		}
		if (pIe->pmkid_count) {
			*pnNeeded += 2;
		} else {
			break;
		}
		*pnNeeded += (pIe->pmkid_count * 16);
		if (pIe->gp_mgmt_cipher_suite) {
			*pnNeeded += 4;
		} else {
			break;
		}
		break;
	}
	return status;
} /* End dot11f_get_packed_iersn. */

uint32_t dot11f_get_packed_iewapi(tpAniSirGlobal pCtx,
	tDot11fIEWAPI *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 2;
		*pnNeeded += 2;
		*pnNeeded += (pIe->akm_suite_count * 4);
		*pnNeeded += 2;
		*pnNeeded += (pIe->unicast_cipher_suite_count * 4);
		*pnNeeded += 4;
		*pnNeeded += 2;
		if (pIe->bkid_count) {
			*pnNeeded += 2;
		} else {
			break;
		}
		*pnNeeded += (pIe->bkid_count * 16);
		break;
	}
	return status;
} /* End dot11f_get_packed_iewapi. */

uint32_t dot11f_get_packed_iewpa(tpAniSirGlobal pCtx,
	tDot11fIEWPA *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 2;
		if (pIe->multicast_cipher_present) {

			*pnNeeded += 4;
		} else {
			break;
		}
		if (pIe->unicast_cipher_count) {
			*pnNeeded += 2;
		} else {
			break;
		}
		*pnNeeded += (pIe->unicast_cipher_count * 4);
		if (pIe->auth_suite_count) {
			*pnNeeded += 2;
		} else {
			break;
		}
		*pnNeeded += (pIe->auth_suite_count * 4);
		if (pIe->caps) {
			*pnNeeded += 2;
		} else {
			break;
		}
		break;
	}
	return status;
} /* End dot11f_get_packed_iewpa. */

uint32_t dot11f_get_packed_iewsc(tpAniSirGlobal pCtx,
	tDot11fIEWSC *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_WSC);
		break;
	}
	return status;
} /* End dot11f_get_packed_iewsc. */

uint32_t dot11f_get_packed_ie_wsc_assoc_req(tpAniSirGlobal pCtx,
	tDot11fIEWscAssocReq *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_WscAssocReq);
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_wsc_assoc_req. */

uint32_t dot11f_get_packed_ie_wsc_assoc_res(tpAniSirGlobal pCtx,
	tDot11fIEWscAssocRes *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_WscAssocRes);
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_wsc_assoc_res. */

uint32_t dot11f_get_packed_ie_wsc_beacon(tpAniSirGlobal pCtx,
	tDot11fIEWscBeacon *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_WscBeacon);
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_wsc_beacon. */

uint32_t dot11f_get_packed_ie_wsc_beacon_probe_res(tpAniSirGlobal pCtx,
	tDot11fIEWscBeaconProbeRes *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_WscBeaconProbeRes);
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_wsc_beacon_probe_res. */

uint32_t dot11f_get_packed_ie_wsc_probe_req(tpAniSirGlobal pCtx,
	tDot11fIEWscProbeReq *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_WscProbeReq);
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_wsc_probe_req. */

uint32_t dot11f_get_packed_ie_wsc_probe_res(tpAniSirGlobal pCtx,
	tDot11fIEWscProbeRes *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_WscProbeRes);
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_wsc_probe_res. */

uint32_t dot11f_get_packed_ie_wsc_reassoc_res(tpAniSirGlobal pCtx,
	tDot11fIEWscReassocRes *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pIe, pnNeeded,
				TLVS_WscReassocRes);
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_wsc_reassoc_res. */

uint32_t dot11f_get_packed_ie_vendor2_ie(tpAniSirGlobal pCtx,
	tDot11fIEvendor2_ie *pIe, uint32_t *pnNeeded)
{
	uint32_t status = DOT11F_PARSE_SUCCESS;
	(void)pCtx;
	while (pIe->present) {
		*pnNeeded += 1;
		*pnNeeded += 1;
		status = get_packed_size_core(pCtx, (uint8_t *)pIe, pnNeeded,
				IES_vendor2_ie);
		break;
	}
	return status;
} /* End dot11f_get_packed_ie_vendor2_ie. */

uint32_t dot11f_get_packed_add_ts_request_size(tpAniSirGlobal pCtx,
	tDot11fAddTSRequest *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_AddTSRequest);
	return status;
} /* End dot11f_get_packed_add_ts_request_size. */

uint32_t dot11f_get_packed_add_ts_response_size(tpAniSirGlobal pCtx,
	tDot11fAddTSResponse *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 5;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_AddTSResponse);
	return status;
} /* End dot11f_get_packed_add_ts_response_size. */

uint32_t dot11f_get_packed_assoc_request_size(tpAniSirGlobal pCtx,
	tDot11fAssocRequest *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 4;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_AssocRequest);
	return status;
} /* End dot11f_get_packed_assoc_request_size. */

uint32_t dot11f_get_packed_assoc_response_size(tpAniSirGlobal pCtx,
	tDot11fAssocResponse *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 6;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_AssocResponse);
	return status;
} /* End dot11f_get_packed_assoc_response_size. */

uint32_t dot11f_get_packed_authentication_size(tpAniSirGlobal pCtx,
	tDot11fAuthentication *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 6;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_Authentication);
	return status;
} /* End dot11f_get_packed_authentication_size. */

uint32_t dot11f_get_packed_beacon_size(tpAniSirGlobal pCtx,
	tDot11fBeacon *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 12;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_Beacon);
	return status;
} /* End dot11f_get_packed_beacon_size. */

uint32_t dot11f_get_packed_beacon1_size(tpAniSirGlobal pCtx,
	tDot11fBeacon1 *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 12;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_Beacon1);
	return status;
} /* End dot11f_get_packed_beacon1_size. */

uint32_t dot11f_get_packed_beacon2_size(tpAniSirGlobal pCtx,
	tDot11fBeacon2 *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 0;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_Beacon2);
	return status;
} /* End dot11f_get_packed_beacon2_size. */

uint32_t dot11f_get_packed_beacon_i_es_size(tpAniSirGlobal pCtx,
	tDot11fBeaconIEs *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 0;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_BeaconIEs);
	return status;
} /* End dot11f_get_packed_beacon_i_es_size. */

uint32_t dot11f_get_packed_channel_switch_size(tpAniSirGlobal pCtx,
	tDot11fChannelSwitch *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 2;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_ChannelSwitch);
	return status;
} /* End dot11f_get_packed_channel_switch_size. */

uint32_t dot11f_get_packed_de_auth_size(tpAniSirGlobal pCtx,
	tDot11fDeAuth *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 2;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_DeAuth);
	return status;
} /* End dot11f_get_packed_de_auth_size. */

uint32_t dot11f_get_packed_del_ts_size(tpAniSirGlobal pCtx,
	tDot11fDelTS *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 7;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_DelTS);
	return status;
} /* End dot11f_get_packed_del_ts_size. */

uint32_t dot11f_get_packed_disassociation_size(tpAniSirGlobal pCtx,
	tDot11fDisassociation *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 2;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_Disassociation);
	return status;
} /* End dot11f_get_packed_disassociation_size. */

uint32_t dot11f_get_packed_link_measurement_report_size(tpAniSirGlobal pCtx,
	tDot11fLinkMeasurementReport *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 11;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_LinkMeasurementReport);
	return status;
} /* End dot11f_get_packed_link_measurement_report_size. */

uint32_t dot11f_get_packed_link_measurement_request_size(tpAniSirGlobal pCtx,
	tDot11fLinkMeasurementRequest *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 5;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_LinkMeasurementRequest);
	return status;
} /* End dot11f_get_packed_link_measurement_request_size. */

uint32_t dot11f_get_packed_measurement_report_size(tpAniSirGlobal pCtx,
	tDot11fMeasurementReport *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_MeasurementReport);
	return status;
} /* End dot11f_get_packed_measurement_report_size. */

uint32_t dot11f_get_packed_measurement_request_size(tpAniSirGlobal pCtx,
	tDot11fMeasurementRequest *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_MeasurementRequest);
	return status;
} /* End dot11f_get_packed_measurement_request_size. */

uint32_t dot11f_get_packed_neighbor_report_request_size(tpAniSirGlobal pCtx,
	tDot11fNeighborReportRequest *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_NeighborReportRequest);
	return status;
} /* End dot11f_get_packed_neighbor_report_request_size. */

uint32_t dot11f_get_packed_neighbor_report_response_size(tpAniSirGlobal pCtx,
	tDot11fNeighborReportResponse *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_NeighborReportResponse);
	return status;
} /* End dot11f_get_packed_neighbor_report_response_size. */

uint32_t dot11f_get_packed_operating_mode_size(tpAniSirGlobal pCtx,
	tDot11fOperatingMode *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_OperatingMode);
	return status;
} /* End dot11f_get_packed_operating_mode_size. */

uint32_t dot11f_get_packed_probe_request_size(tpAniSirGlobal pCtx,
	tDot11fProbeRequest *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 0;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_ProbeRequest);
	return status;
} /* End dot11f_get_packed_probe_request_size. */

uint32_t dot11f_get_packed_probe_response_size(tpAniSirGlobal pCtx,
	tDot11fProbeResponse *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 12;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_ProbeResponse);
	return status;
} /* End dot11f_get_packed_probe_response_size. */

uint32_t dot11f_get_packed_qos_map_configure_size(tpAniSirGlobal pCtx,
	tDot11fQosMapConfigure *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 2;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_QosMapConfigure);
	return status;
} /* End dot11f_get_packed_qos_map_configure_size. */

uint32_t dot11f_get_packed_radio_measurement_report_size(tpAniSirGlobal pCtx,
	tDot11fRadioMeasurementReport *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_RadioMeasurementReport);
	return status;
} /* End dot11f_get_packed_radio_measurement_report_size. */

uint32_t dot11f_get_packed_radio_measurement_request_size(tpAniSirGlobal pCtx,
	tDot11fRadioMeasurementRequest *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 5;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_RadioMeasurementRequest);
	return status;
} /* End dot11f_get_packed_radio_measurement_request_size. */

uint32_t dot11f_get_packed_re_assoc_request_size(tpAniSirGlobal pCtx,
	tDot11fReAssocRequest *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 10;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_ReAssocRequest);
	return status;
} /* End dot11f_get_packed_re_assoc_request_size. */

uint32_t dot11f_get_packed_re_assoc_response_size(tpAniSirGlobal pCtx,
	tDot11fReAssocResponse *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 6;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_ReAssocResponse);
	return status;
} /* End dot11f_get_packed_re_assoc_response_size. */

uint32_t dot11f_get_packed_sm_power_save_size(tpAniSirGlobal pCtx,
	tDot11fSMPowerSave *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_SMPowerSave);
	return status;
} /* End dot11f_get_packed_sm_power_save_size. */

uint32_t dot11f_get_packed_sa_query_req_size(tpAniSirGlobal pCtx,
	tDot11fSaQueryReq *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 4;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_SaQueryReq);
	return status;
} /* End dot11f_get_packed_sa_query_req_size. */

uint32_t dot11f_get_packed_sa_query_rsp_size(tpAniSirGlobal pCtx,
	tDot11fSaQueryRsp *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 4;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_SaQueryRsp);
	return status;
} /* End dot11f_get_packed_sa_query_rsp_size. */

uint32_t dot11f_get_packed_tdls_dis_req_size(tpAniSirGlobal pCtx,
	tDot11fTDLSDisReq *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TDLSDisReq);
	return status;
} /* End dot11f_get_packed_tdls_dis_req_size. */

uint32_t dot11f_get_packed_tdls_dis_rsp_size(tpAniSirGlobal pCtx,
	tDot11fTDLSDisRsp *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 5;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TDLSDisRsp);
	return status;
} /* End dot11f_get_packed_tdls_dis_rsp_size. */

uint32_t dot11f_get_packed_tdls_peer_traffic_ind_size(tpAniSirGlobal pCtx,
	tDot11fTDLSPeerTrafficInd *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TDLSPeerTrafficInd);
	return status;
} /* End dot11f_get_packed_tdls_peer_traffic_ind_size. */

uint32_t dot11f_get_packed_tdls_peer_traffic_rsp_size(tpAniSirGlobal pCtx,
	tDot11fTDLSPeerTrafficRsp *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TDLSPeerTrafficRsp);
	return status;
} /* End dot11f_get_packed_tdls_peer_traffic_rsp_size. */

uint32_t dot11f_get_packed_tdls_setup_cnf_size(tpAniSirGlobal pCtx,
	tDot11fTDLSSetupCnf *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 5;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TDLSSetupCnf);
	return status;
} /* End dot11f_get_packed_tdls_setup_cnf_size. */

uint32_t dot11f_get_packed_tdls_setup_req_size(tpAniSirGlobal pCtx,
	tDot11fTDLSSetupReq *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 5;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TDLSSetupReq);
	return status;
} /* End dot11f_get_packed_tdls_setup_req_size. */

uint32_t dot11f_get_packed_tdls_setup_rsp_size(tpAniSirGlobal pCtx,
	tDot11fTDLSSetupRsp *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 7;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TDLSSetupRsp);
	return status;
} /* End dot11f_get_packed_tdls_setup_rsp_size. */

uint32_t dot11f_get_packed_tdls_teardown_size(tpAniSirGlobal pCtx,
	tDot11fTDLSTeardown *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 4;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TDLSTeardown);
	return status;
} /* End dot11f_get_packed_tdls_teardown_size. */

uint32_t dot11f_get_packed_tpc_report_size(tpAniSirGlobal pCtx,
	tDot11fTPCReport *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TPCReport);
	return status;
} /* End dot11f_get_packed_tpc_report_size. */

uint32_t dot11f_get_packed_tpc_request_size(tpAniSirGlobal pCtx,
	tDot11fTPCRequest *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 3;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TPCRequest);
	return status;
} /* End dot11f_get_packed_tpc_request_size. */

uint32_t dot11f_get_packed_timing_advertisement_frame_size(tpAniSirGlobal pCtx,
	tDot11fTimingAdvertisementFrame *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 10;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_TimingAdvertisementFrame);
	return status;
} /* End dot11f_get_packed_timing_advertisement_frame_size. */

uint32_t dot11f_get_packed_vht_gid_management_action_frame_size(tpAniSirGlobal pCtx,
	tDot11fVHTGidManagementActionFrame *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 26;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_VHTGidManagementActionFrame);
	return status;
} /* End dot11f_get_packed_vht_gid_management_action_frame_size. */

uint32_t dot11f_get_packed_wmm_add_ts_request_size(tpAniSirGlobal pCtx,
	tDot11fWMMAddTSRequest *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 4;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_WMMAddTSRequest);
	return status;
} /* End dot11f_get_packed_wmm_add_ts_request_size. */

uint32_t dot11f_get_packed_wmm_add_ts_response_size(tpAniSirGlobal pCtx,
	tDot11fWMMAddTSResponse *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 4;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_WMMAddTSResponse);
	return status;
} /* End dot11f_get_packed_wmm_add_ts_response_size. */

uint32_t dot11f_get_packed_wmm_del_ts_size(tpAniSirGlobal pCtx,
	tDot11fWMMDelTS *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 4;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_WMMDelTS);
	return status;
} /* End dot11f_get_packed_wmm_del_ts_size. */

uint32_t dot11f_get_packed_ht2040_bss_coexistence_mgmt_action_frameSize(tpAniSirGlobal pCtx,
	tDot11fht2040_bss_coexistence_mgmt_action_frame *pFrm, uint32_t *pnNeeded)
{
	uint32_t status = 0;
	*pnNeeded = 2;
	status = get_packed_size_core(pCtx, (uint8_t *)pFrm, pnNeeded,
				      IES_ht2040_bss_coexistence_mgmt_action_frame);
	return status;
} /* End dot11f_get_packed_ht2040_bss_coexistence_mgmt_action_frameSize. */

static uint32_t get_packed_size_core(tpAniSirGlobal pCtx,
				      uint8_t *pFrm,
				      uint32_t *pnNeeded,
				      const tIEDefn  IEs[])
{
	const tIEDefn *pIe;
	uint16_t  i, n;
	uint32_t  status;
	tFRAMES_BOOL *pfFound;
	uint32_t countOffset = 0;
	uint32_t byteCount = 0;
	uint8_t  pIePresent = 0;
	uint32_t offset = 0;

	status = DOT11F_PARSE_SUCCESS;

	(void)pCtx; /* Shutup the compiler if we have no FFs nor IEs... */
	i = 0;
	n = 0;
	pIe = &(IEs[0]);
	while (0xff != pIe->eid) {
		pfFound = (tFRAMES_BOOL *)(pFrm + pIe->offset +
					  pIe->presenceOffset);
		if (*pfFound) {
			countOffset = ((0 == pIe->arraybound) ? 1 : (*(uint16_t *)(pFrm + pIe->countOffset)));
			for (i = 0U; i < countOffset; ++i) {
				*pnNeeded += 2U + pIe->noui;
				byteCount = 0;
				switch (pIe->sig) {
				case SigIeCondensedCountryStr:
					offset = sizeof(tDot11fIECondensedCountryStr);
					byteCount = 2;
					pIePresent = ((tDot11fIECondensedCountryStr *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeGTK:
					offset = sizeof(tDot11fIEGTK);
					byteCount = ((tDot11fIEGTK *)
					  (pFrm + pIe->offset + offset * i))->
					  num_key + 11;
					pIePresent = ((tDot11fIEGTK *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeIGTK:
					offset = sizeof(tDot11fIEIGTK);
					byteCount = 33;
					pIePresent = ((tDot11fIEIGTK *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeR0KH_ID:
					offset = sizeof(tDot11fIER0KH_ID);
					byteCount = ((tDot11fIER0KH_ID *)
					  (pFrm + pIe->offset + offset * i))->
					  num_PMK_R0_ID;
					pIePresent = ((tDot11fIER0KH_ID *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeR1KH_ID:
					offset = sizeof(tDot11fIER1KH_ID);
					byteCount = 6;
					pIePresent = ((tDot11fIER1KH_ID *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeTSFInfo:
					offset = sizeof(tDot11fIETSFInfo);
					byteCount = 4;
					pIePresent = ((tDot11fIETSFInfo *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeAPChannelReport:
					offset = sizeof(tDot11fIEAPChannelReport);
					byteCount = ((tDot11fIEAPChannelReport *)
					  (pFrm + pIe->offset + offset * i))->
					  num_channelList + 1;
					pIePresent = ((tDot11fIEAPChannelReport *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeBcnReportingDetail:
					offset = sizeof(tDot11fIEBcnReportingDetail);
					byteCount = 1;
					pIePresent = ((tDot11fIEBcnReportingDetail *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeBeaconReportFrmBody:
					offset = sizeof(tDot11fIEBeaconReportFrmBody);
					byteCount = ((tDot11fIEBeaconReportFrmBody *)
					  (pFrm + pIe->offset + offset * i))->
					  num_reportedFields;
					pIePresent = ((tDot11fIEBeaconReportFrmBody *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeBeaconReporting:
					offset = sizeof(tDot11fIEBeaconReporting);
					byteCount = 2;
					pIePresent = ((tDot11fIEBeaconReporting *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeMeasurementPilot:
					offset = sizeof(tDot11fIEMeasurementPilot);
					byteCount = ((tDot11fIEMeasurementPilot *)
					  (pFrm + pIe->offset + offset * i))->
					  num_vendorSpecific + 1;
					pIePresent = ((tDot11fIEMeasurementPilot *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeMultiBssid:
					offset = sizeof(tDot11fIEMultiBssid);
					byteCount = ((tDot11fIEMultiBssid *)
					  (pFrm + pIe->offset + offset * i))->
					  num_vendorSpecific + 1;
					pIePresent = ((tDot11fIEMultiBssid *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeRICData:
					offset = sizeof(tDot11fIERICData);
					byteCount = 4;
					pIePresent = ((tDot11fIERICData *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeRICDescriptor:
					offset = sizeof(tDot11fIERICDescriptor);
					byteCount = ((tDot11fIERICDescriptor *)
					  (pFrm + pIe->offset + offset * i))->
					  num_variableData + 1;
					pIePresent = ((tDot11fIERICDescriptor *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeRRMEnabledCap:
					offset = sizeof(tDot11fIERRMEnabledCap);
					byteCount = 5;
					pIePresent = ((tDot11fIERRMEnabledCap *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeRequestedInfo:
					offset = sizeof(tDot11fIERequestedInfo);
					byteCount = ((tDot11fIERequestedInfo *)
					  (pFrm + pIe->offset + offset * i))->
					  num_requested_eids;
					pIePresent = ((tDot11fIERequestedInfo *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeSSID:
					offset = sizeof(tDot11fIESSID);
					byteCount = ((tDot11fIESSID *)
					  (pFrm + pIe->offset + offset * i))->
					  num_ssid;
					pIePresent = ((tDot11fIESSID *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeSchedule:
					offset = sizeof(tDot11fIESchedule);
					byteCount = 14;
					pIePresent = ((tDot11fIESchedule *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeTCLAS:
					offset = sizeof(tDot11fIETCLAS);
					status |=
						dot11f_get_packed_ietclas(
						pCtx, (tDot11fIETCLAS *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeTCLASSPROC:
					offset = sizeof(tDot11fIETCLASSPROC);
					byteCount = 1;
					pIePresent = ((tDot11fIETCLASSPROC *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeTSDelay:
					offset = sizeof(tDot11fIETSDelay);
					byteCount = 4;
					pIePresent = ((tDot11fIETSDelay *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeTSPEC:
					offset = sizeof(tDot11fIETSPEC);
					byteCount = 55;
					pIePresent = ((tDot11fIETSPEC *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeVHTCaps:
					offset = sizeof(tDot11fIEVHTCaps);
					byteCount = 12;
					pIePresent = ((tDot11fIEVHTCaps *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeVHTOperation:
					offset = sizeof(tDot11fIEVHTOperation);
					byteCount = 5;
					pIePresent = ((tDot11fIEVHTOperation *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWMMSchedule:
					offset = sizeof(tDot11fIEWMMSchedule);
					byteCount = 15;
					pIePresent = ((tDot11fIEWMMSchedule *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWMMTCLAS:
					offset = sizeof(tDot11fIEWMMTCLAS);
					status |=
						dot11f_get_packed_iewmmtclas(
						pCtx, (tDot11fIEWMMTCLAS *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeWMMTCLASPROC:
					offset = sizeof(tDot11fIEWMMTCLASPROC);
					byteCount = 2;
					pIePresent = ((tDot11fIEWMMTCLASPROC *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWMMTSDelay:
					offset = sizeof(tDot11fIEWMMTSDelay);
					byteCount = 5;
					pIePresent = ((tDot11fIEWMMTSDelay *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWMMTSPEC:
					offset = sizeof(tDot11fIEWMMTSPEC);
					byteCount = 56;
					pIePresent = ((tDot11fIEWMMTSPEC *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWiderBWChanSwitchAnn:
					offset = sizeof(tDot11fIEWiderBWChanSwitchAnn);
					byteCount = 3;
					pIePresent = ((tDot11fIEWiderBWChanSwitchAnn *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeAID:
					offset = sizeof(tDot11fIEAID);
					byteCount = 2;
					pIePresent = ((tDot11fIEAID *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeCFParams:
					offset = sizeof(tDot11fIECFParams);
					byteCount = 6;
					pIePresent = ((tDot11fIECFParams *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeChallengeText:
					offset = sizeof(tDot11fIEChallengeText);
					byteCount = ((tDot11fIEChallengeText *)
					  (pFrm + pIe->offset + offset * i))->
					  num_text;
					pIePresent = ((tDot11fIEChallengeText *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeChanSwitchAnn:
					offset = sizeof(tDot11fIEChanSwitchAnn);
					byteCount = 3;
					pIePresent = ((tDot11fIEChanSwitchAnn *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeChannelSwitchWrapper:
					offset = sizeof(tDot11fIEChannelSwitchWrapper);
					status |=
						dot11f_get_packed_ie_channel_switch_wrapper(
						pCtx, (tDot11fIEChannelSwitchWrapper *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeCountry:
					offset = sizeof(tDot11fIECountry);
					status |=
						dot11f_get_packed_ie_country(
						pCtx, (tDot11fIECountry *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeDSParams:
					offset = sizeof(tDot11fIEDSParams);
					byteCount = 1;
					pIePresent = ((tDot11fIEDSParams *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeEDCAParamSet:
					offset = sizeof(tDot11fIEEDCAParamSet);
					byteCount = 18;
					pIePresent = ((tDot11fIEEDCAParamSet *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeERPInfo:
					offset = sizeof(tDot11fIEERPInfo);
					byteCount = 1;
					pIePresent = ((tDot11fIEERPInfo *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeESECckmOpaque:
					offset = sizeof(tDot11fIEESECckmOpaque);
					byteCount = ((tDot11fIEESECckmOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  num_data;
					pIePresent = ((tDot11fIEESECckmOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeESERadMgmtCap:
					offset = sizeof(tDot11fIEESERadMgmtCap);
					byteCount = 2;
					pIePresent = ((tDot11fIEESERadMgmtCap *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeESETrafStrmMet:
					offset = sizeof(tDot11fIEESETrafStrmMet);
					byteCount = 4;
					pIePresent = ((tDot11fIEESETrafStrmMet *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeESETrafStrmRateSet:
					offset = sizeof(tDot11fIEESETrafStrmRateSet);
					byteCount = ((tDot11fIEESETrafStrmRateSet *)
					  (pFrm + pIe->offset + offset * i))->
					  num_tsrates + 1;
					pIePresent = ((tDot11fIEESETrafStrmRateSet *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeESETxmitPower:
					offset = sizeof(tDot11fIEESETxmitPower);
					byteCount = 2;
					pIePresent = ((tDot11fIEESETxmitPower *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeESEVersion:
					offset = sizeof(tDot11fIEESEVersion);
					byteCount = 1;
					pIePresent = ((tDot11fIEESEVersion *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeExtCap:
					offset = sizeof(tDot11fIEExtCap);
					byteCount = ((tDot11fIEExtCap *)
					  (pFrm + pIe->offset + offset * i))->
					  num_bytes;
					pIePresent = ((tDot11fIEExtCap *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeExtSuppRates:
					offset = sizeof(tDot11fIEExtSuppRates);
					byteCount = ((tDot11fIEExtSuppRates *)
					  (pFrm + pIe->offset + offset * i))->
					  num_rates;
					pIePresent = ((tDot11fIEExtSuppRates *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeFHParamSet:
					offset = sizeof(tDot11fIEFHParamSet);
					byteCount = 5;
					pIePresent = ((tDot11fIEFHParamSet *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeFHParams:
					offset = sizeof(tDot11fIEFHParams);
					byteCount = 2;
					pIePresent = ((tDot11fIEFHParams *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeFHPattTable:
					offset = sizeof(tDot11fIEFHPattTable);
					byteCount = ((tDot11fIEFHPattTable *)
					  (pFrm + pIe->offset + offset * i))->
					  num_randtable + 4;
					pIePresent = ((tDot11fIEFHPattTable *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeFTInfo:
					offset = sizeof(tDot11fIEFTInfo);
					status |=
						dot11f_get_packed_ieft_info(
						pCtx, (tDot11fIEFTInfo *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeHTCaps:
					offset = sizeof(tDot11fIEHTCaps);
					byteCount = ((tDot11fIEHTCaps *)
					  (pFrm + pIe->offset + offset * i))->
					  num_rsvd + 26;
					pIePresent = ((tDot11fIEHTCaps *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeHTInfo:
					offset = sizeof(tDot11fIEHTInfo);
					byteCount = ((tDot11fIEHTInfo *)
					  (pFrm + pIe->offset + offset * i))->
					  num_rsvd + 22;
					pIePresent = ((tDot11fIEHTInfo *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeIBSSParams:
					offset = sizeof(tDot11fIEIBSSParams);
					byteCount = 2;
					pIePresent = ((tDot11fIEIBSSParams *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeLinkIdentifier:
					offset = sizeof(tDot11fIELinkIdentifier);
					byteCount = 18;
					pIePresent = ((tDot11fIELinkIdentifier *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeMeasurementReport:
					offset = sizeof(tDot11fIEMeasurementReport);
					status |=
						dot11f_get_packed_ie_measurement_report(
						pCtx, (tDot11fIEMeasurementReport *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeMeasurementRequest:
					offset = sizeof(tDot11fIEMeasurementRequest);
					status |=
						dot11f_get_packed_ie_measurement_request(
						pCtx, (tDot11fIEMeasurementRequest *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeMobilityDomain:
					offset = sizeof(tDot11fIEMobilityDomain);
					byteCount = 3;
					pIePresent = ((tDot11fIEMobilityDomain *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeNeighborReport:
					offset = sizeof(tDot11fIENeighborReport);
					status |=
						dot11f_get_packed_ie_neighbor_report(
						pCtx, (tDot11fIENeighborReport *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeOBSSScanParameters:
					offset = sizeof(tDot11fIEOBSSScanParameters);
					byteCount = 14;
					pIePresent = ((tDot11fIEOBSSScanParameters *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeOperatingMode:
					offset = sizeof(tDot11fIEOperatingMode);
					byteCount = 1;
					pIePresent = ((tDot11fIEOperatingMode *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeP2PAssocReq:
					offset = sizeof(tDot11fIEP2PAssocReq);
					status |=
						dot11f_get_packed_iep2_p_assoc_req(
						pCtx, (tDot11fIEP2PAssocReq *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeP2PAssocRes:
					offset = sizeof(tDot11fIEP2PAssocRes);
					status |=
						dot11f_get_packed_iep2_p_assoc_res(
						pCtx, (tDot11fIEP2PAssocRes *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeP2PBeacon:
					offset = sizeof(tDot11fIEP2PBeacon);
					status |=
						dot11f_get_packed_iep2_p_beacon(
						pCtx, (tDot11fIEP2PBeacon *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeP2PBeaconProbeRes:
					offset = sizeof(tDot11fIEP2PBeaconProbeRes);
					status |=
						dot11f_get_packed_iep2_p_beacon_probe_res(
						pCtx, (tDot11fIEP2PBeaconProbeRes *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeP2PDeAuth:
					offset = sizeof(tDot11fIEP2PDeAuth);
					status |=
						dot11f_get_packed_iep2_p_de_auth(
						pCtx, (tDot11fIEP2PDeAuth *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeP2PDisAssoc:
					offset = sizeof(tDot11fIEP2PDisAssoc);
					status |=
						dot11f_get_packed_iep2_p_dis_assoc(
						pCtx, (tDot11fIEP2PDisAssoc *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeP2PIEOpaque:
					offset = sizeof(tDot11fIEP2PIEOpaque);
					byteCount = ((tDot11fIEP2PIEOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  num_data;
					pIePresent = ((tDot11fIEP2PIEOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeP2PProbeReq:
					offset = sizeof(tDot11fIEP2PProbeReq);
					status |=
						dot11f_get_packed_iep2_p_probe_req(
						pCtx, (tDot11fIEP2PProbeReq *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeP2PProbeRes:
					offset = sizeof(tDot11fIEP2PProbeRes);
					status |=
						dot11f_get_packed_iep2_p_probe_res(
						pCtx, (tDot11fIEP2PProbeRes *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIePTIControl:
					offset = sizeof(tDot11fIEPTIControl);
					byteCount = 3;
					pIePresent = ((tDot11fIEPTIControl *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIePUBufferStatus:
					offset = sizeof(tDot11fIEPUBufferStatus);
					byteCount = 1;
					pIePresent = ((tDot11fIEPUBufferStatus *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIePowerCaps:
					offset = sizeof(tDot11fIEPowerCaps);
					byteCount = 2;
					pIePresent = ((tDot11fIEPowerCaps *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIePowerConstraints:
					offset = sizeof(tDot11fIEPowerConstraints);
					byteCount = 1;
					pIePresent = ((tDot11fIEPowerConstraints *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeQBSSLoad:
					offset = sizeof(tDot11fIEQBSSLoad);
					byteCount = 5;
					pIePresent = ((tDot11fIEQBSSLoad *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeQComVendorIE:
					offset = sizeof(tDot11fIEQComVendorIE);
					byteCount = 2;
					pIePresent = ((tDot11fIEQComVendorIE *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeQOSCapsAp:
					offset = sizeof(tDot11fIEQOSCapsAp);
					byteCount = 1;
					pIePresent = ((tDot11fIEQOSCapsAp *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeQOSCapsStation:
					offset = sizeof(tDot11fIEQOSCapsStation);
					byteCount = 1;
					pIePresent = ((tDot11fIEQOSCapsStation *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeQosMapSet:
					offset = sizeof(tDot11fIEQosMapSet);
					byteCount = ((tDot11fIEQosMapSet *)
					  (pFrm + pIe->offset + offset * i))->
					  num_dscp_exceptions;
					pIePresent = ((tDot11fIEQosMapSet *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeQuiet:
					offset = sizeof(tDot11fIEQuiet);
					byteCount = 6;
					pIePresent = ((tDot11fIEQuiet *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeRCPIIE:
					offset = sizeof(tDot11fIERCPIIE);
					byteCount = 1;
					pIePresent = ((tDot11fIERCPIIE *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeRICDataDesc:
					offset = sizeof(tDot11fIERICDataDesc);
					pnNeeded -= 2  ; /* Subtract the length and Oui as this is our container IE to group Ies and it doesnt have its own length and OUI. */
					status |=
						dot11f_get_packed_ieric_data_desc(
						pCtx, (tDot11fIERICDataDesc *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeRSN:
					offset = sizeof(tDot11fIERSN);
					status |=
						dot11f_get_packed_iersn(
						pCtx, (tDot11fIERSN *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeRSNIIE:
					offset = sizeof(tDot11fIERSNIIE);
					byteCount = 1;
					pIePresent = ((tDot11fIERSNIIE *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeRSNOpaque:
					offset = sizeof(tDot11fIERSNOpaque);
					byteCount = ((tDot11fIERSNOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  num_data;
					pIePresent = ((tDot11fIERSNOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeSuppChannels:
					offset = sizeof(tDot11fIESuppChannels);
					byteCount = ((tDot11fIESuppChannels *)
					  (pFrm + pIe->offset + offset * i))->
					  num_bands * 2;
					pIePresent = ((tDot11fIESuppChannels *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeSuppOperatingClasses:
					offset = sizeof(tDot11fIESuppOperatingClasses);
					byteCount = ((tDot11fIESuppOperatingClasses *)
					  (pFrm + pIe->offset + offset * i))->
					  num_classes;
					pIePresent = ((tDot11fIESuppOperatingClasses *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeSuppRates:
					offset = sizeof(tDot11fIESuppRates);
					byteCount = ((tDot11fIESuppRates *)
					  (pFrm + pIe->offset + offset * i))->
					  num_rates;
					pIePresent = ((tDot11fIESuppRates *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeTIM:
					offset = sizeof(tDot11fIETIM);
					byteCount = ((tDot11fIETIM *)
					  (pFrm + pIe->offset + offset * i))->
					  num_vbmp + 3;
					pIePresent = ((tDot11fIETIM *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeTPCReport:
					offset = sizeof(tDot11fIETPCReport);
					byteCount = 2;
					pIePresent = ((tDot11fIETPCReport *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeTPCRequest:
					offset = sizeof(tDot11fIETPCRequest);
					byteCount = 0;
					pIePresent = ((tDot11fIETPCRequest *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeTimeAdvertisement:
					offset = sizeof(tDot11fIETimeAdvertisement);
					byteCount = 16;
					pIePresent = ((tDot11fIETimeAdvertisement *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeTimeoutInterval:
					offset = sizeof(tDot11fIETimeoutInterval);
					byteCount = 5;
					pIePresent = ((tDot11fIETimeoutInterval *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeVHTExtBssLoad:
					offset = sizeof(tDot11fIEVHTExtBssLoad);
					byteCount = 5;
					pIePresent = ((tDot11fIEVHTExtBssLoad *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeVendor1IE:
					offset = sizeof(tDot11fIEVendor1IE);
					byteCount = 0;
					pIePresent = ((tDot11fIEVendor1IE *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeVendor3IE:
					offset = sizeof(tDot11fIEVendor3IE);
					byteCount = 0;
					pIePresent = ((tDot11fIEVendor3IE *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWAPI:
					offset = sizeof(tDot11fIEWAPI);
					status |=
						dot11f_get_packed_iewapi(
						pCtx, (tDot11fIEWAPI *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeWAPIOpaque:
					offset = sizeof(tDot11fIEWAPIOpaque);
					byteCount = ((tDot11fIEWAPIOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  num_data;
					pIePresent = ((tDot11fIEWAPIOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWFATPC:
					offset = sizeof(tDot11fIEWFATPC);
					byteCount = 2;
					pIePresent = ((tDot11fIEWFATPC *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWFDIEOpaque:
					offset = sizeof(tDot11fIEWFDIEOpaque);
					byteCount = ((tDot11fIEWFDIEOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  num_data;
					pIePresent = ((tDot11fIEWFDIEOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWMMCaps:
					offset = sizeof(tDot11fIEWMMCaps);
					byteCount = 2;
					pIePresent = ((tDot11fIEWMMCaps *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWMMInfoAp:
					offset = sizeof(tDot11fIEWMMInfoAp);
					byteCount = 2;
					pIePresent = ((tDot11fIEWMMInfoAp *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWMMInfoStation:
					offset = sizeof(tDot11fIEWMMInfoStation);
					byteCount = 2;
					pIePresent = ((tDot11fIEWMMInfoStation *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWMMParams:
					offset = sizeof(tDot11fIEWMMParams);
					byteCount = 19;
					pIePresent = ((tDot11fIEWMMParams *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWPA:
					offset = sizeof(tDot11fIEWPA);
					status |=
						dot11f_get_packed_iewpa(
						pCtx, (tDot11fIEWPA *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeWPAOpaque:
					offset = sizeof(tDot11fIEWPAOpaque);
					byteCount = ((tDot11fIEWPAOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  num_data;
					pIePresent = ((tDot11fIEWPAOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWSC:
					offset = sizeof(tDot11fIEWSC);
					status |=
						dot11f_get_packed_iewsc(
						pCtx, (tDot11fIEWSC *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeWscAssocReq:
					offset = sizeof(tDot11fIEWscAssocReq);
					status |=
						dot11f_get_packed_ie_wsc_assoc_req(
						pCtx, (tDot11fIEWscAssocReq *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeWscAssocRes:
					offset = sizeof(tDot11fIEWscAssocRes);
					status |=
						dot11f_get_packed_ie_wsc_assoc_res(
						pCtx, (tDot11fIEWscAssocRes *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeWscBeacon:
					offset = sizeof(tDot11fIEWscBeacon);
					status |=
						dot11f_get_packed_ie_wsc_beacon(
						pCtx, (tDot11fIEWscBeacon *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeWscBeaconProbeRes:
					offset = sizeof(tDot11fIEWscBeaconProbeRes);
					status |=
						dot11f_get_packed_ie_wsc_beacon_probe_res(
						pCtx, (tDot11fIEWscBeaconProbeRes *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeWscIEOpaque:
					offset = sizeof(tDot11fIEWscIEOpaque);
					byteCount = ((tDot11fIEWscIEOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  num_data;
					pIePresent = ((tDot11fIEWscIEOpaque *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeWscProbeReq:
					offset = sizeof(tDot11fIEWscProbeReq);
					status |=
						dot11f_get_packed_ie_wsc_probe_req(
						pCtx, (tDot11fIEWscProbeReq *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeWscProbeRes:
					offset = sizeof(tDot11fIEWscProbeRes);
					status |=
						dot11f_get_packed_ie_wsc_probe_res(
						pCtx, (tDot11fIEWscProbeRes *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeWscReassocRes:
					offset = sizeof(tDot11fIEWscReassocRes);
					status |=
						dot11f_get_packed_ie_wsc_reassoc_res(
						pCtx, (tDot11fIEWscReassocRes *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				case SigIeext_chan_switch_ann:
					offset = sizeof(tDot11fIEext_chan_switch_ann);
					byteCount = 4;
					pIePresent = ((tDot11fIEext_chan_switch_ann *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeht2040_bss_coexistence:
					offset = sizeof(tDot11fIEht2040_bss_coexistence);
					byteCount = 1;
					pIePresent = ((tDot11fIEht2040_bss_coexistence *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIeht2040_bss_intolerant_report:
					offset = sizeof(tDot11fIEht2040_bss_intolerant_report);
					byteCount = ((tDot11fIEht2040_bss_intolerant_report *)
					  (pFrm + pIe->offset + offset * i))->
					  num_channel_list + 1;
					pIePresent = ((tDot11fIEht2040_bss_intolerant_report *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIesec_chan_offset_ele:
					offset = sizeof(tDot11fIEsec_chan_offset_ele);
					byteCount = 1;
					pIePresent = ((tDot11fIEsec_chan_offset_ele *)
					  (pFrm + pIe->offset + offset * i))->
					  present;
					break;
				case SigIevendor2_ie:
					offset = sizeof(tDot11fIEvendor2_ie);
					status |=
						dot11f_get_packed_ie_vendor2_ie(
						pCtx, (tDot11fIEvendor2_ie *)
						(pFrm + pIe->offset + offset * i),
						pnNeeded);
					break;
				default:
					FRAMES_LOG1(pCtx, FRLOGE, FRFL("INTERNAL ERROR-- I don"
						"'t know about the IE signature %d; this is most l"
						"ikely a bug in 'framesc'.\n"), pIe->sig);
					return DOT11F_INTERNAL_ERROR;
				} /*End of switch Case*/

				if (byteCount && pIePresent)
					*pnNeeded += byteCount;
			} /*End of for loop*/
		}
		++pIe;
	}
	return status;

}

static uint32_t get_packed_size_tlv_core(tpAniSirGlobal pCtx,
				uint8_t *pFrm,
				uint32_t *pnNeeded,
				const tTLVDefn  TLVs[])
{
	const tTLVDefn *pTlv;
	uint32_t   status;
	tFRAMES_BOOL   *pfFound;
	uint32_t   byteCount = 0;
	uint8_t    pTlvPresent = 0;

	status = DOT11F_PARSE_SUCCESS;

	pTlv = &(TLVs[0]);
	while (0xffff != pTlv->id) {
		pfFound = (tFRAMES_BOOL *)(pFrm + pTlv->offset +
				pTlv->presenceOffset);
		if (*pfFound) {
			*pnNeeded += (pTlv->sType + pTlv->sLen);
			if (pTlv->pec)
				*pnNeeded += 3U;
			switch (pTlv->sig) {
			case SigTlvAuthorizedMACs:
				byteCount = 6;
				pTlvPresent = ((tDot11fTLVAuthorizedMACs *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvRequestToEnroll:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVRequestToEnroll *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvVersion2:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVVersion2 *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvAPSetupLocked:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVAPSetupLocked *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvAssociationState:
				byteCount = 2;
				pTlvPresent = ((tDot11fTLVAssociationState *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvConfigMethods:
				byteCount = 2;
				pTlvPresent = ((tDot11fTLVConfigMethods *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvConfigurationError:
				byteCount = 2;
				pTlvPresent = ((tDot11fTLVConfigurationError *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvDeviceName:
				byteCount = ((tDot11fTLVDeviceName *)(pFrm + pTlv->offset))->num_text;
				pTlvPresent = ((tDot11fTLVDeviceName *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvDevicePasswordID:
				byteCount = 2;
				pTlvPresent = ((tDot11fTLVDevicePasswordID *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvExtendedListenTiming:
				byteCount = 4;
				pTlvPresent = ((tDot11fTLVExtendedListenTiming *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvListenChannel:
				byteCount = 5;
				pTlvPresent = ((tDot11fTLVListenChannel *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvManufacturer:
				byteCount = ((tDot11fTLVManufacturer *)(pFrm + pTlv->offset))->num_name;
				pTlvPresent = ((tDot11fTLVManufacturer *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvMinorReasonCode:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVMinorReasonCode *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvModelName:
				byteCount = ((tDot11fTLVModelName *)(pFrm + pTlv->offset))->num_text;
				pTlvPresent = ((tDot11fTLVModelName *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvModelNumber:
				byteCount = ((tDot11fTLVModelNumber *)(pFrm + pTlv->offset))->num_text;
				pTlvPresent = ((tDot11fTLVModelNumber *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvNoticeOfAbsence:
				byteCount = ((tDot11fTLVNoticeOfAbsence *)(pFrm + pTlv->offset))->num_NoADesc+2;
				pTlvPresent = ((tDot11fTLVNoticeOfAbsence *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvOperatingChannel:
				byteCount = 5;
				pTlvPresent = ((tDot11fTLVOperatingChannel *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvP2PCapability:
				byteCount = 2;
				pTlvPresent = ((tDot11fTLVP2PCapability *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvP2PDeviceId:
				byteCount = 6;
				pTlvPresent = ((tDot11fTLVP2PDeviceId *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvP2PDeviceInfo:
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pFrm + pTlv->offset, pnNeeded, TLVS_P2PDeviceInfo);
				byteCount = 16;
				pTlvPresent = ((tDot11fTLVP2PDeviceInfo *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvP2PGroupInfo:
				byteCount = ((tDot11fTLVP2PGroupInfo *)(pFrm + pTlv->offset))->num_P2PClientInfoDesc;
				pTlvPresent = ((tDot11fTLVP2PGroupInfo *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvP2PStatus:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVP2PStatus *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvPrimaryDeviceType:
				byteCount = 8;
				pTlvPresent = ((tDot11fTLVPrimaryDeviceType *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvRFBands:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVRFBands *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvRequestDeviceType:
				byteCount = 8;
				pTlvPresent = ((tDot11fTLVRequestDeviceType *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvRequestType:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVRequestType *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvResponseType:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVResponseType *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvSelectedRegistrar:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVSelectedRegistrar *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvSelectedRegistrarConfigMethods:
				byteCount = 2;
				pTlvPresent = ((tDot11fTLVSelectedRegistrarConfigMethods *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvSerialNumber:
				byteCount = ((tDot11fTLVSerialNumber *)(pFrm + pTlv->offset))->num_text;
				pTlvPresent = ((tDot11fTLVSerialNumber *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvUUID_E:
				byteCount = 16;
				pTlvPresent = ((tDot11fTLVUUID_E *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvUUID_R:
				byteCount = 16;
				pTlvPresent = ((tDot11fTLVUUID_R *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvVendorExtension:
		status = get_packed_size_tlv_core(pCtx, (uint8_t *)pFrm + pTlv->offset, pnNeeded, TLVS_VendorExtension);
				byteCount = 3;
				pTlvPresent = ((tDot11fTLVVendorExtension *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvVersion:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVVersion *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvWPSState:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVWPSState *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvP2PInterface:
				byteCount = 6;
				pTlvPresent = ((tDot11fTLVP2PInterface *)
					      (pFrm + pTlv->offset))->present;
				break;
			case SigTlvP2PManageability:
				byteCount = 1;
				pTlvPresent = ((tDot11fTLVP2PManageability *)
					      (pFrm + pTlv->offset))->present;
				break;
			default:
				FRAMES_LOG1(pCtx, FRLOGE, FRFL("INTERNAL ERROR-- I don"
				    "'t know about the TLV signature %d; this is most l"
				    "ikely a bug in 'framesc'.\n"), pTlv->sig);
				return DOT11F_INTERNAL_ERROR;
			}
			if (pTlvPresent) {
				*pnNeeded += byteCount;
			}
		}
		++pTlv;
	}
	return status;
}
void dot11f_pack_ff_aid(tpAniSirGlobal pCtx,
			tDot11fFfAID *pSrc,
			uint8_t *pBuf)
{
	frameshtons(pCtx, pBuf, pSrc->associd, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_aid. */

void dot11f_pack_ff_action(tpAniSirGlobal pCtx,
			   tDot11fFfAction *pSrc,
			   uint8_t *pBuf)
{
	*pBuf = pSrc->action;
	(void)pCtx;
} /* End dot11f_pack_ff_action. */

void dot11f_pack_ff_auth_algo(tpAniSirGlobal pCtx,
			     tDot11fFfAuthAlgo *pSrc,
			     uint8_t *pBuf)
{
	frameshtons(pCtx, pBuf, pSrc->algo, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_auth_algo. */

void dot11f_pack_ff_auth_seq_no(tpAniSirGlobal pCtx,
			      tDot11fFfAuthSeqNo *pSrc,
			      uint8_t *pBuf)
{
	frameshtons(pCtx, pBuf, pSrc->no, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_auth_seq_no. */

void dot11f_pack_ff_beacon_interval(tpAniSirGlobal pCtx,
				   tDot11fFfBeaconInterval *pSrc,
				   uint8_t *pBuf)
{
	frameshtons(pCtx, pBuf, pSrc->interval, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_beacon_interval. */

void dot11f_pack_ff_capabilities(tpAniSirGlobal pCtx,
				 tDot11fFfCapabilities *pSrc,
				 uint8_t *pBuf)
{
	uint16_t tmp66__;
	tmp66__ = 0U;
	tmp66__ |= (pSrc->ess << 0);
	tmp66__ |= (pSrc->ibss << 1);
	tmp66__ |= (pSrc->cfPollable << 2);
	tmp66__ |= (pSrc->cfPollReq << 3);
	tmp66__ |= (pSrc->privacy << 4);
	tmp66__ |= (pSrc->shortPreamble << 5);
	tmp66__ |= (pSrc->pbcc << 6);
	tmp66__ |= (pSrc->channelAgility << 7);
	tmp66__ |= (pSrc->spectrumMgt << 8);
	tmp66__ |= (pSrc->qos << 9);
	tmp66__ |= (pSrc->shortSlotTime << 10);
	tmp66__ |= (pSrc->apsd << 11);
	tmp66__ |= (pSrc->rrm << 12);
	tmp66__ |= (pSrc->dsssOfdm << 13);
	tmp66__ |= (pSrc->delayedBA << 14);
	tmp66__ |= (pSrc->immediateBA << 15);
	frameshtons(pCtx, pBuf, tmp66__, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_capabilities. */

void dot11f_pack_ff_category(tpAniSirGlobal pCtx,
			     tDot11fFfCategory *pSrc,
			     uint8_t *pBuf)
{
	*pBuf = pSrc->category;
	(void)pCtx;
} /* End dot11f_pack_ff_category. */

void dot11f_pack_ff_current_ap_address(tpAniSirGlobal pCtx,
				     tDot11fFfCurrentAPAddress *pSrc,
				     uint8_t *pBuf)
{
	DOT11F_MEMCPY(pCtx, pBuf, pSrc->mac, 6);
	(void)pCtx;
} /* End dot11f_pack_ff_current_ap_address. */

void dot11f_pack_ff_dialog_token(tpAniSirGlobal pCtx,
				tDot11fFfDialogToken *pSrc,
				uint8_t *pBuf)
{
	*pBuf = pSrc->token;
	(void)pCtx;
} /* End dot11f_pack_ff_dialog_token. */

void dot11f_pack_ff_link_margin(tpAniSirGlobal pCtx,
			       tDot11fFfLinkMargin *pSrc,
			       uint8_t *pBuf)
{
	*pBuf = pSrc->linkMargin;
	(void)pCtx;
} /* End dot11f_pack_ff_link_margin. */

void dot11f_pack_ff_listen_interval(tpAniSirGlobal pCtx,
				   tDot11fFfListenInterval *pSrc,
				   uint8_t *pBuf)
{
	frameshtons(pCtx, pBuf, pSrc->interval, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_listen_interval. */

void dot11f_pack_ff_max_tx_power(tpAniSirGlobal pCtx,
			       tDot11fFfMaxTxPower *pSrc,
			       uint8_t *pBuf)
{
	*pBuf = pSrc->maxTxPower;
	(void)pCtx;
} /* End dot11f_pack_ff_max_tx_power. */

void dot11f_pack_ff_num_of_repetitions(tpAniSirGlobal pCtx,
				     tDot11fFfNumOfRepetitions *pSrc,
				     uint8_t *pBuf)
{
	frameshtons(pCtx, pBuf, pSrc->repetitions, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_num_of_repetitions. */

void dot11f_pack_ff_operating_mode(tpAniSirGlobal pCtx,
				  tDot11fFfOperatingMode *pSrc,
				  uint8_t *pBuf)
{
	uint8_t tmp67__;
	tmp67__ = 0U;
	tmp67__ |= (pSrc->chanWidth << 0);
	tmp67__ |= (pSrc->reserved << 2);
	tmp67__ |= (pSrc->rxNSS << 4);
	tmp67__ |= (pSrc->rxNSSType << 7);
	*pBuf = tmp67__;
	(void)pCtx;
} /* End dot11f_pack_ff_operating_mode. */

void dot11f_pack_ff_rcpi(tpAniSirGlobal pCtx,
			 tDot11fFfRCPI *pSrc,
			 uint8_t *pBuf)
{
	*pBuf = pSrc->rcpi;
	(void)pCtx;
} /* End dot11f_pack_ff_rcpi. */

void dot11f_pack_ff_rsni(tpAniSirGlobal pCtx,
			 tDot11fFfRSNI *pSrc,
			 uint8_t *pBuf)
{
	*pBuf = pSrc->rsni;
	(void)pCtx;
} /* End dot11f_pack_ff_rsni. */

void dot11f_pack_ff_reason(tpAniSirGlobal pCtx,
			   tDot11fFfReason *pSrc,
			   uint8_t *pBuf)
{
	frameshtons(pCtx, pBuf, pSrc->code, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_reason. */

void dot11f_pack_ff_rx_antenna_id(tpAniSirGlobal pCtx,
				tDot11fFfRxAntennaId *pSrc,
				uint8_t *pBuf)
{
	*pBuf = pSrc->antennaId;
	(void)pCtx;
} /* End dot11f_pack_ff_rx_antenna_id. */

void dot11f_pack_ff_sm_power_mode_set(tpAniSirGlobal pCtx,
				   tDot11fFfSMPowerModeSet *pSrc,
				   uint8_t *pBuf)
{
	uint8_t tmp68__;
	tmp68__ = 0U;
	tmp68__ |= (pSrc->PowerSave_En << 0);
	tmp68__ |= (pSrc->Mode << 1);
	tmp68__ |= (pSrc->reserved << 2);
	*pBuf = tmp68__;
	(void)pCtx;
} /* End dot11f_pack_ff_sm_power_mode_set. */

void dot11f_pack_ff_status(tpAniSirGlobal pCtx,
			   tDot11fFfStatus *pSrc,
			   uint8_t *pBuf)
{
	frameshtons(pCtx, pBuf, pSrc->status, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_status. */

void dot11f_pack_ff_status_code(tpAniSirGlobal pCtx,
			       tDot11fFfStatusCode *pSrc,
			       uint8_t *pBuf)
{
	*pBuf = pSrc->statusCode;
	(void)pCtx;
} /* End dot11f_pack_ff_status_code. */

void dot11f_pack_ff_tpc_ele_id(tpAniSirGlobal pCtx,
			     tDot11fFfTPCEleID *pSrc,
			     uint8_t *pBuf)
{
	*pBuf = pSrc->TPCId;
	(void)pCtx;
} /* End dot11f_pack_ff_tpc_ele_id. */

void dot11f_pack_ff_tpc_ele_len(tpAniSirGlobal pCtx,
			      tDot11fFfTPCEleLen *pSrc,
			      uint8_t *pBuf)
{
	*pBuf = pSrc->TPCLen;
	(void)pCtx;
} /* End dot11f_pack_ff_tpc_ele_len. */

void dot11f_pack_ff_ts_info(tpAniSirGlobal pCtx,
			   tDot11fFfTSInfo *pSrc,
			   uint8_t *pBuf)
{
	uint32_t tmp69__;
	tmp69__ = 0U;
	tmp69__ |= (pSrc->traffic_type << 0);
	tmp69__ |= (pSrc->tsid << 1);
	tmp69__ |= (pSrc->direction << 5);
	tmp69__ |= (pSrc->access_policy << 7);
	tmp69__ |= (pSrc->aggregation << 9);
	tmp69__ |= (pSrc->psb << 10);
	tmp69__ |= (pSrc->user_priority << 11);
	tmp69__ |= (pSrc->tsinfo_ack_pol << 14);
	tmp69__ |= (pSrc->schedule << 16);
	tmp69__ |= (pSrc->unused << 17);
	frameshtonl(pCtx, pBuf, tmp69__, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_ts_info. */

void dot11f_pack_ff_time_stamp(tpAniSirGlobal pCtx,
			      tDot11fFfTimeStamp *pSrc,
			      uint8_t *pBuf)
{
	frameshtonq(pCtx, pBuf, pSrc->timestamp, 0);
	(void)pCtx;
} /* End dot11f_pack_ff_time_stamp. */

void dot11f_pack_ff_transaction_id(tpAniSirGlobal pCtx,
				  tDot11fFfTransactionId *pSrc,
				  uint8_t *pBuf)
{
	DOT11F_MEMCPY(pCtx, pBuf, pSrc->transId, 2);
	(void)pCtx;
} /* End dot11f_pack_ff_transaction_id. */

void dot11f_pack_ff_tx_antenna_id(tpAniSirGlobal pCtx,
				tDot11fFfTxAntennaId *pSrc,
				uint8_t *pBuf)
{
	*pBuf = pSrc->antennaId;
	(void)pCtx;
} /* End dot11f_pack_ff_tx_antenna_id. */

void dot11f_pack_ff_tx_power(tpAniSirGlobal pCtx,
			    tDot11fFfTxPower *pSrc,
			    uint8_t *pBuf)
{
	*pBuf = pSrc->txPower;
	(void)pCtx;
} /* End dot11f_pack_ff_tx_power. */

void dot11f_pack_ff_vht_membership_status_array(tpAniSirGlobal pCtx,
					     tDot11fFfVhtMembershipStatusArray *pSrc,
					     uint8_t *pBuf)
{
	DOT11F_MEMCPY(pCtx, pBuf, pSrc->membershipStatusArray, 8);
	(void)pCtx;
} /* End dot11f_pack_ff_vht_membership_status_array. */

void dot11f_pack_ff_vht_user_position_array(tpAniSirGlobal pCtx,
					 tDot11fFfVhtUserPositionArray *pSrc,
					 uint8_t *pBuf)
{
	DOT11F_MEMCPY(pCtx, pBuf, pSrc->userPositionArray, 16);
	(void)pCtx;
} /* End dot11f_pack_ff_vht_user_position_array. */

uint32_t dot11f_pack_tlv_authorized_ma_cs(tpAniSirGlobal pCtx,
					tDot11fTLVAuthorizedMACs *pSrc,
					uint8_t *pBuf,
					uint32_t nBuf,
					uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 8;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 1;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 1; *pnConsumed += 1;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->mac, 6);
		*pnConsumed += 6;
		pBuf += 6;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		*pTlvLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_authorized_ma_cs. */

uint32_t dot11f_pack_tlv_request_to_enroll(tpAniSirGlobal pCtx,
					 tDot11fTLVRequestToEnroll *pSrc,
					 uint8_t *pBuf,
					 uint32_t nBuf,
					 uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 3;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 3;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 1; *pnConsumed += 1;
		*pBuf = pSrc->req;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		*pTlvLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_request_to_enroll. */

uint32_t dot11f_pack_tlv_version2(tpAniSirGlobal pCtx,
				  tDot11fTLVVersion2 *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp70__;
	nNeeded += 3;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 0;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 1; *pnConsumed += 1;
		tmp70__ = 0U;
		tmp70__ |= (pSrc->minor << 0);
		tmp70__ |= (pSrc->major << 4);
		*pBuf = tmp70__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		*pTlvLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_version2. */

uint32_t dot11f_pack_tlv_ap_setup_locked(tpAniSirGlobal pCtx,
				       tDot11fTLVAPSetupLocked *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 5;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4183, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->fLocked;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_ap_setup_locked. */

uint32_t dot11f_pack_tlv_association_state(tpAniSirGlobal pCtx,
					  tDot11fTLVAssociationState *pSrc,
					  uint8_t *pBuf,
					  uint32_t nBuf,
					  uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 6;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4098, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		frameshtons(pCtx, pBuf, pSrc->state, 1);
		*pnConsumed += 2;
		pBuf += 2;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_association_state. */

uint32_t dot11f_pack_tlv_config_methods(tpAniSirGlobal pCtx,
				       tDot11fTLVConfigMethods *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 6;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4104, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		frameshtons(pCtx, pBuf, pSrc->methods, 1);
		*pnConsumed += 2;
		pBuf += 2;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_config_methods. */

uint32_t dot11f_pack_tlv_configuration_error(tpAniSirGlobal pCtx,
					    tDot11fTLVConfigurationError *pSrc,
					    uint8_t *pBuf,
					    uint32_t nBuf,
					    uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 6;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4105, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		frameshtons(pCtx, pBuf, pSrc->error, 1);
		*pnConsumed += 2;
		pBuf += 2;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_configuration_error. */

uint32_t dot11f_pack_tlv_device_name(tpAniSirGlobal pCtx,
				    tDot11fTLVDeviceName *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += (pSrc->num_text + 4) ;

	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4113, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->text), pSrc->num_text);
		*pnConsumed += pSrc->num_text;
		pBuf += pSrc->num_text;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_device_name. */

uint32_t dot11f_pack_tlv_device_password_id(tpAniSirGlobal pCtx,
					  tDot11fTLVDevicePasswordID *pSrc,
					  uint8_t *pBuf,
					  uint32_t nBuf,
					  uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 6;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4114, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		frameshtons(pCtx, pBuf, pSrc->id, 1);
		*pnConsumed += 2;
		pBuf += 2;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_device_password_id. */

uint32_t dot11f_pack_tlv_extended_listen_timing(tpAniSirGlobal pCtx,
					      tDot11fTLVExtendedListenTiming *pSrc,
					      uint8_t *pBuf,
					      uint32_t nBuf,
					      uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 7;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 8;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		frameshtons(pCtx, pBuf, pSrc->availibilityPeriod, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->availibilityInterval, 0);
		*pnConsumed += 2;
		pBuf += 2;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_extended_listen_timing. */

uint32_t dot11f_pack_tlv_listen_channel(tpAniSirGlobal pCtx,
				       tDot11fTLVListenChannel *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 8;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 6;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->countryString, 3);
		*pnConsumed += 3;
		pBuf += 3;
		*pBuf = pSrc->regulatoryClass;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->channel;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_listen_channel. */

uint32_t dot11f_pack_tlv_manufacturer(tpAniSirGlobal pCtx,
				      tDot11fTLVManufacturer *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += (pSrc->num_name + 4) ;

	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4129, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->name), pSrc->num_name);
		*pnConsumed += pSrc->num_name;
		pBuf += pSrc->num_name;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_manufacturer. */

uint32_t dot11f_pack_tlv_minor_reason_code(tpAniSirGlobal pCtx,
					 tDot11fTLVMinorReasonCode *pSrc,
					 uint8_t *pBuf,
					 uint32_t nBuf,
					 uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 4;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 1;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->minorReasonCode;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_minor_reason_code. */

uint32_t dot11f_pack_tlv_model_name(tpAniSirGlobal pCtx,
				   tDot11fTLVModelName *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += (pSrc->num_text + 4) ;

	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4131, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->text), pSrc->num_text);
		*pnConsumed += pSrc->num_text;
		pBuf += pSrc->num_text;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_model_name. */

uint32_t dot11f_pack_tlv_model_number(tpAniSirGlobal pCtx,
				     tDot11fTLVModelNumber *pSrc,
				     uint8_t *pBuf,
				     uint32_t nBuf,
				     uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += (pSrc->num_text + 4) ;

	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4132, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->text), pSrc->num_text);
		*pnConsumed += pSrc->num_text;
		pBuf += pSrc->num_text;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_model_number. */

uint32_t dot11f_pack_tlv_notice_of_absence(tpAniSirGlobal pCtx,
					 tDot11fTLVNoticeOfAbsence *pSrc,
					 uint8_t *pBuf,
					 uint32_t nBuf,
					 uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += (pSrc->num_NoADesc + 5) ;

	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 12;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->index;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->CTSWindowOppPS;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->NoADesc), pSrc->num_NoADesc);
		*pnConsumed += pSrc->num_NoADesc;
		pBuf += pSrc->num_NoADesc;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_notice_of_absence. */

uint32_t dot11f_pack_tlv_operating_channel(tpAniSirGlobal pCtx,
					  tDot11fTLVOperatingChannel *pSrc,
					  uint8_t *pBuf,
					  uint32_t nBuf,
					  uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 8;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 17;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->countryString, 3);
		*pnConsumed += 3;
		pBuf += 3;
		*pBuf = pSrc->regulatoryClass;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->channel;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_operating_channel. */

uint32_t dot11f_pack_tlv_p2_p_capability(tpAniSirGlobal pCtx,
				       tDot11fTLVP2PCapability *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 5;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 2;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->deviceCapability;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->groupCapability;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_p2_p_capability. */

uint32_t dot11f_pack_tlv_p2_p_device_id(tpAniSirGlobal pCtx,
				     tDot11fTLVP2PDeviceId *pSrc,
				     uint8_t *pBuf,
				     uint32_t nBuf,
				     uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 9;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 3;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->P2PDeviceAddress, 6);
		*pnConsumed += 6;
		pBuf += 6;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_p2_p_device_id. */

uint32_t dot11f_pack_tlv_p2_p_device_info(tpAniSirGlobal pCtx,
				       tDot11fTLVP2PDeviceInfo *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	uint32_t idx = 0;
	nNeeded += 19;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 13;
		pBuf += 1; nBuf -= 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; nBuf -= 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->P2PDeviceAddress, 6);
		*pnConsumed += 6;
		pBuf += 6;
		frameshtons(pCtx, pBuf, pSrc->configMethod, 1);
		*pnConsumed += 2;
		pBuf += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->primaryDeviceType, 8);
		*pnConsumed += 8;
		pBuf += 8;
		status |= pack_tlv_core(pCtx,
				(uint8_t *)pSrc,
				pBuf,
				nBuf,
				pnConsumed,
				TLVS_P2PDeviceInfo, &idx);
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return status;
} /* End dot11f_pack_tlv_p2_p_device_info. */

uint32_t dot11f_pack_tlv_p2_p_group_info(tpAniSirGlobal pCtx,
				      tDot11fTLVP2PGroupInfo *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += (pSrc->num_P2PClientInfoDesc + 3) ;

	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 14;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->P2PClientInfoDesc), pSrc->num_P2PClientInfoDesc);
		*pnConsumed += pSrc->num_P2PClientInfoDesc;
		pBuf += pSrc->num_P2PClientInfoDesc;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_p2_p_group_info. */

uint32_t dot11f_pack_tlv_p2_p_status(tpAniSirGlobal pCtx,
				   tDot11fTLVP2PStatus *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 4;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 0;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->status;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_p2_p_status. */

uint32_t dot11f_pack_tlv_primary_device_type(tpAniSirGlobal pCtx,
					   tDot11fTLVPrimaryDeviceType *pSrc,
					   uint8_t *pBuf,
					   uint32_t nBuf,
					   uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 12;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4180, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		frameshtons(pCtx, pBuf, pSrc->primary_category, 1);
		*pnConsumed += 2;
		pBuf += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->oui, 4);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtons(pCtx, pBuf, pSrc->sub_category, 1);
		*pnConsumed += 2;
		pBuf += 2;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_primary_device_type. */

uint32_t dot11f_pack_tlv_rf_bands(tpAniSirGlobal pCtx,
				 tDot11fTLVRFBands *pSrc,
				 uint8_t *pBuf,
				 uint32_t nBuf,
				 uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 5;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4156, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->bands;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_rf_bands. */

uint32_t dot11f_pack_tlv_request_device_type(tpAniSirGlobal pCtx,
					   tDot11fTLVRequestDeviceType *pSrc,
					   uint8_t *pBuf,
					   uint32_t nBuf,
					   uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 12;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4202, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		frameshtons(pCtx, pBuf, pSrc->primary_category, 1);
		*pnConsumed += 2;
		pBuf += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->oui, 4);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtons(pCtx, pBuf, pSrc->sub_category, 1);
		*pnConsumed += 2;
		pBuf += 2;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_request_device_type. */

uint32_t dot11f_pack_tlv_request_type(tpAniSirGlobal pCtx,
				     tDot11fTLVRequestType *pSrc,
				     uint8_t *pBuf,
				     uint32_t nBuf,
				     uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 5;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4154, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->reqType;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_request_type. */

uint32_t dot11f_pack_tlv_response_type(tpAniSirGlobal pCtx,
				      tDot11fTLVResponseType *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 5;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4155, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->resType;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_response_type. */

uint32_t dot11f_pack_tlv_selected_registrar(tpAniSirGlobal pCtx,
					   tDot11fTLVSelectedRegistrar *pSrc,
					   uint8_t *pBuf,
					   uint32_t nBuf,
					   uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 5;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4161, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->selected;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_selected_registrar. */

uint32_t dot11f_pack_tlv_selected_registrar_config_methods(tpAniSirGlobal pCtx,
							tDot11fTLVSelectedRegistrarConfigMethods *pSrc,
							uint8_t *pBuf,
							uint32_t nBuf,
							uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 6;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4179, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		frameshtons(pCtx, pBuf, pSrc->methods, 1);
		*pnConsumed += 2;
		pBuf += 2;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_selected_registrar_config_methods. */

uint32_t dot11f_pack_tlv_serial_number(tpAniSirGlobal pCtx,
				      tDot11fTLVSerialNumber *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += (pSrc->num_text + 4) ;

	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4162, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->text), pSrc->num_text);
		*pnConsumed += pSrc->num_text;
		pBuf += pSrc->num_text;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_serial_number. */

uint32_t dot11f_pack_tlv_uuid_e(tpAniSirGlobal pCtx,
				tDot11fTLVUUID_E *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 20;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4167, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->uuid, 16);
		*pnConsumed += 16;
		pBuf += 16;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_uuid_e. */

uint32_t dot11f_pack_tlv_uuid_r(tpAniSirGlobal pCtx,
				tDot11fTLVUUID_R *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 20;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4168, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->uuid, 16);
		*pnConsumed += 16;
		pBuf += 16;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_uuid_r. */

uint32_t dot11f_pack_tlv_vendor_extension(tpAniSirGlobal pCtx,
					 tDot11fTLVVendorExtension *pSrc,
					 uint8_t *pBuf,
					 uint32_t nBuf,
					 uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	uint32_t idx = 0;
	nNeeded += 7;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4169, 1);
		pBuf += 2; nBuf -= 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; nBuf -= 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->vendorId, 3);
		*pnConsumed += 3;
		pBuf += 3;
		status |= pack_tlv_core(pCtx,
				(uint8_t *)pSrc,
				pBuf,
				nBuf,
				pnConsumed,
				TLVS_VendorExtension, &idx);
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return status;
} /* End dot11f_pack_tlv_vendor_extension. */

uint32_t dot11f_pack_tlv_version(tpAniSirGlobal pCtx,
				 tDot11fTLVVersion *pSrc,
				 uint8_t *pBuf,
				 uint32_t nBuf,
				 uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp71__;
	nNeeded += 5;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4170, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		tmp71__ = 0U;
		tmp71__ |= (pSrc->minor << 0);
		tmp71__ |= (pSrc->major << 4);
		*pBuf = tmp71__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_version. */

uint32_t dot11f_pack_tlv_wps_state(tpAniSirGlobal pCtx,
				  tDot11fTLVWPSState *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 5;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		frameshtons(pCtx, pBuf, 4164, 1);
		pBuf += 2; *pnConsumed += 2;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->state;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 4, 1);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_wps_state. */

uint32_t dot11f_pack_tlv_p2_p_interface(tpAniSirGlobal pCtx,
				      tDot11fTLVP2PInterface *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 9;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 16;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->P2PDeviceAddress, 6);
		*pnConsumed += 6;
		pBuf += 6;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_p2_p_interface. */

uint32_t dot11f_pack_tlv_p2_p_manageability(tpAniSirGlobal pCtx,
					  tDot11fTLVP2PManageability *pSrc,
					  uint8_t *pBuf,
					  uint32_t nBuf,
					  uint32_t *pnConsumed)
{
	uint8_t *pTlvLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded += 4;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	while (pSrc->present) {
		*pBuf = 10;
		pBuf += 1; *pnConsumed += 1;
		pTlvLen = pBuf;
		pBuf += 2; *pnConsumed += 2;
		*pBuf = pSrc->manageability;
		*pnConsumed += 1;
		pBuf += 1;
		break;
	}
	(void)pCtx;
	if (pTlvLen) {
		frameshtons(pCtx, pTlvLen, *pnConsumed - nConsumedOnEntry - 3, 0);
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_tlv_p2_p_manageability. */

uint32_t dot11f_pack_ie_condensed_country_str(tpAniSirGlobal pCtx,
					    tDot11fIECondensedCountryStr *pSrc,
					    uint8_t *pBuf,
					    uint32_t nBuf,
					    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 2;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->countryStr, 2);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_condensed_country_str. */

uint32_t dot11f_pack_ie_gtk(tpAniSirGlobal pCtx,
			    tDot11fIEGTK *pSrc,
			    uint8_t *pBuf,
			    uint32_t nBuf,
			    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint16_t tmp72__;
	nNeeded  +=  (pSrc->num_key + 11);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 2;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp72__ = 0U;
		tmp72__ |= (pSrc->keyId << 0);
		tmp72__ |= (pSrc->reserved << 2);
		frameshtons(pCtx, pBuf, tmp72__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		*pBuf = pSrc->keyLength;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->RSC, 8);
		*pnConsumed += 8;
		pBuf += 8;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->key), pSrc->num_key);
		*pnConsumed += pSrc->num_key;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_gtk. */

uint32_t dot11f_pack_ie_igtk(tpAniSirGlobal pCtx,
			     tDot11fIEIGTK *pSrc,
			     uint8_t *pBuf,
			     uint32_t nBuf,
			     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 33;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 4;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->keyID, 2);
		*pnConsumed += 2;
		pBuf += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->IPN, 6);
		*pnConsumed += 6;
		pBuf += 6;
		*pBuf = pSrc->keyLength;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->key, 24);
		*pnConsumed += 24;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_igtk. */

uint32_t dot11f_pack_ie_r0_kh_id(tpAniSirGlobal pCtx,
				tDot11fIER0KH_ID *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_PMK_R0_ID;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 3;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->PMK_R0_ID), pSrc->num_PMK_R0_ID);
		*pnConsumed += pSrc->num_PMK_R0_ID;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_r0_kh_id. */

uint32_t dot11f_pack_ie_r1_kh_id(tpAniSirGlobal pCtx,
				tDot11fIER1KH_ID *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 6;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 1;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->PMK_R1_ID, 6);
		*pnConsumed += 6;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_r1_kh_id. */

uint32_t dot11f_pack_ie_tsf_info(tpAniSirGlobal pCtx,
				tDot11fIETSFInfo *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 4;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 1;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		frameshtons(pCtx, pBuf, pSrc->TsfOffset, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->BeaconIntvl, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_tsf_info. */

uint32_t dot11f_pack_ie_ap_channel_report(tpAniSirGlobal pCtx,
					tDot11fIEAPChannelReport *pSrc,
					uint8_t *pBuf,
					uint32_t nBuf,
					uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  (pSrc->num_channelList + 1);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 51;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->regulatoryClass;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->channelList), pSrc->num_channelList);
		*pnConsumed += pSrc->num_channelList;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ap_channel_report. */

uint32_t dot11f_pack_ie_bcn_reporting_detail(tpAniSirGlobal pCtx,
					   tDot11fIEBcnReportingDetail *pSrc,
					   uint8_t *pBuf,
					   uint32_t nBuf,
					   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 2;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->reportingDetail;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_bcn_reporting_detail. */

uint32_t dot11f_pack_ie_beacon_report_frm_body(tpAniSirGlobal pCtx,
					    tDot11fIEBeaconReportFrmBody *pSrc,
					    uint8_t *pBuf,
					    uint32_t nBuf,
					    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_reportedFields;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 1;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->reportedFields), pSrc->num_reportedFields);
		*pnConsumed += pSrc->num_reportedFields;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_beacon_report_frm_body. */

uint32_t dot11f_pack_ie_beacon_reporting(tpAniSirGlobal pCtx,
					tDot11fIEBeaconReporting *pSrc,
					uint8_t *pBuf,
					uint32_t nBuf,
					uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 1;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->reportingCondition;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->threshold;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_beacon_reporting. */

uint32_t dot11f_pack_ie_measurement_pilot(tpAniSirGlobal pCtx,
					 tDot11fIEMeasurementPilot *pSrc,
					 uint8_t *pBuf,
					 uint32_t nBuf,
					 uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  (pSrc->num_vendorSpecific + 1);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 66;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->measurementPilot;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->vendorSpecific), pSrc->num_vendorSpecific);
		*pnConsumed += pSrc->num_vendorSpecific;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_measurement_pilot. */

uint32_t dot11f_pack_ie_multi_bssid(tpAniSirGlobal pCtx,
				   tDot11fIEMultiBssid *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  (pSrc->num_vendorSpecific + 1);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 71;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->maxBSSIDIndicator;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->vendorSpecific), pSrc->num_vendorSpecific);
		*pnConsumed += pSrc->num_vendorSpecific;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_multi_bssid. */

uint32_t dot11f_pack_ie_ric_data(tpAniSirGlobal pCtx,
				tDot11fIERICData *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 4;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 57;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->Identifier;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->resourceDescCount;
		*pnConsumed += 1;
		pBuf += 1;
		frameshtons(pCtx, pBuf, pSrc->statusCode, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ric_data. */

uint32_t dot11f_pack_ie_ric_descriptor(tpAniSirGlobal pCtx,
				      tDot11fIERICDescriptor *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  (pSrc->num_variableData + 1);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 75;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->resourceType;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->variableData), pSrc->num_variableData);
		*pnConsumed += pSrc->num_variableData;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ric_descriptor. */

uint32_t dot11f_pack_ie_rrm_enabled_cap(tpAniSirGlobal pCtx,
				      tDot11fIERRMEnabledCap *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp73__;
	uint8_t tmp74__;
	uint8_t tmp75__;
	uint8_t tmp76__;
	uint8_t tmp77__;
	nNeeded  += 5;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 70;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp73__ = 0U;
		tmp73__ |= (pSrc->LinkMeasurement << 0);
		tmp73__ |= (pSrc->NeighborRpt << 1);
		tmp73__ |= (pSrc->parallel << 2);
		tmp73__ |= (pSrc->repeated << 3);
		tmp73__ |= (pSrc->BeaconPassive << 4);
		tmp73__ |= (pSrc->BeaconActive << 5);
		tmp73__ |= (pSrc->BeaconTable << 6);
		tmp73__ |= (pSrc->BeaconRepCond << 7);
		*pBuf = tmp73__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp74__ = 0U;
		tmp74__ |= (pSrc->FrameMeasurement << 0);
		tmp74__ |= (pSrc->ChannelLoad << 1);
		tmp74__ |= (pSrc->NoiseHistogram << 2);
		tmp74__ |= (pSrc->statistics << 3);
		tmp74__ |= (pSrc->LCIMeasurement << 4);
		tmp74__ |= (pSrc->LCIAzimuth << 5);
		tmp74__ |= (pSrc->TCMCapability << 6);
		tmp74__ |= (pSrc->triggeredTCM << 7);
		*pBuf = tmp74__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp75__ = 0U;
		tmp75__ |= (pSrc->APChanReport << 0);
		tmp75__ |= (pSrc->RRMMIBEnabled << 1);
		tmp75__ |= (pSrc->operatingChanMax << 2);
		tmp75__ |= (pSrc->nonOperatinChanMax << 5);
		*pBuf = tmp75__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp76__ = 0U;
		tmp76__ |= (pSrc->MeasurementPilot << 0);
		tmp76__ |= (pSrc->MeasurementPilotEnabled << 3);
		tmp76__ |= (pSrc->NeighborTSFOffset << 4);
		tmp76__ |= (pSrc->RCPIMeasurement << 5);
		tmp76__ |= (pSrc->RSNIMeasurement << 6);
		tmp76__ |= (pSrc->BssAvgAccessDelay << 7);
		*pBuf = tmp76__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp77__ = 0U;
		tmp77__ |= (pSrc->BSSAvailAdmission << 0);
		tmp77__ |= (pSrc->AntennaInformation << 1);
		tmp77__ |= (pSrc->fine_time_meas_rpt << 2);
		tmp77__ |= (pSrc->lci_capability << 3);
		tmp77__ |= (pSrc->reserved << 4);
		*pBuf = tmp77__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_rrm_enabled_cap. */

uint32_t dot11f_pack_ie_requested_info(tpAniSirGlobal pCtx,
				      tDot11fIERequestedInfo *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_requested_eids;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 10;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->requested_eids), pSrc->num_requested_eids);
		*pnConsumed += pSrc->num_requested_eids;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_requested_info. */

uint32_t dot11f_pack_ie_ssid(tpAniSirGlobal pCtx,
			     tDot11fIESSID *pSrc,
			     uint8_t *pBuf,
			     uint32_t nBuf,
			     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_ssid;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 0;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->ssid), pSrc->num_ssid);
		*pnConsumed += pSrc->num_ssid;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ssid. */

uint32_t dot11f_pack_ie_schedule(tpAniSirGlobal pCtx,
				 tDot11fIESchedule *pSrc,
				 uint8_t *pBuf,
				 uint32_t nBuf,
				 uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint16_t tmp78__;
	nNeeded  += 14;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 15;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp78__ = 0U;
		tmp78__ |= (pSrc->aggregation << 0);
		tmp78__ |= (pSrc->tsid << 1);
		tmp78__ |= (pSrc->direction << 5);
		tmp78__ |= (pSrc->reserved << 7);
		frameshtons(pCtx, pBuf, tmp78__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		frameshtonl(pCtx, pBuf, pSrc->service_start_time, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->service_interval, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtons(pCtx, pBuf, pSrc->max_service_dur, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->spec_interval, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_schedule. */

uint32_t dot11f_pack_ie_tclas(tpAniSirGlobal pCtx,
			      tDot11fIETCLAS *pSrc,
			      uint8_t *pBuf,
			      uint32_t nBuf,
			      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_ietclas(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 14;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->user_priority;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->classifier_type;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->classifier_mask;
		*pnConsumed += 1;
		pBuf += 1;
		switch (pSrc->classifier_type) {
		case 0:
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.EthParams.source, 6);
			*pnConsumed += 6;
			pBuf += 6;
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.EthParams.dest, 6);
			*pnConsumed += 6;
			pBuf += 6;
			frameshtons(pCtx, pBuf, pSrc->info.EthParams.type, 0);
			*pnConsumed += 2;
			/* fieldsEndFlag = 1 */
			break;
		case 1:
			*pBuf = pSrc->info.IpParams.version;
			*pnConsumed += 1;
			pBuf += 1;
			switch (pSrc->info.IpParams.version) {
			case 4:
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.IpParams.params.IpV4Params.source, 4);
				*pnConsumed += 4;
				pBuf += 4;
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.IpParams.params.IpV4Params.dest, 4);
				*pnConsumed += 4;
				pBuf += 4;
				frameshtons(pCtx, pBuf, pSrc->info.IpParams.params.IpV4Params.src_port, 0);
				*pnConsumed += 2;
				pBuf += 2;
				frameshtons(pCtx, pBuf, pSrc->info.IpParams.params.IpV4Params.dest_port, 0);
				*pnConsumed += 2;
				pBuf += 2;
				*pBuf = pSrc->info.IpParams.params.IpV4Params.DSCP;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->info.IpParams.params.IpV4Params.proto;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->info.IpParams.params.IpV4Params.reserved;
				*pnConsumed += 1;
				/* fieldsEndFlag = 1 */
				break;
			case 6:
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.IpParams.params.IpV6Params.source, 16);
				*pnConsumed += 16;
				pBuf += 16;
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.IpParams.params.IpV6Params.dest, 16);
				*pnConsumed += 16;
				pBuf += 16;
				frameshtons(pCtx, pBuf, pSrc->info.IpParams.params.IpV6Params.src_port, 0);
				*pnConsumed += 2;
				pBuf += 2;
				frameshtons(pCtx, pBuf, pSrc->info.IpParams.params.IpV6Params.dest_port, 0);
				*pnConsumed += 2;
				pBuf += 2;
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.IpParams.params.IpV6Params.flow_label, 3);
				*pnConsumed += 3;
				/* fieldsEndFlag = 1 */
				break;
			}
			break;
		case 2:
			frameshtons(pCtx, pBuf, pSrc->info.Params8021dq.tag_type, 0);
			*pnConsumed += 2;
			/* fieldsEndFlag = 1 */
			break;
		}
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_tclas. */

uint32_t dot11f_pack_ie_tclassproc(tpAniSirGlobal pCtx,
				   tDot11fIETCLASSPROC *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 44;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->processing;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_tclassproc. */

uint32_t dot11f_pack_ie_ts_delay(tpAniSirGlobal pCtx,
				tDot11fIETSDelay *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 4;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 43;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		frameshtonl(pCtx, pBuf, pSrc->delay, 0);
		*pnConsumed += 4;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ts_delay. */

uint32_t dot11f_pack_ie_tspec(tpAniSirGlobal pCtx,
			      tDot11fIETSPEC *pSrc,
			      uint8_t *pBuf,
			      uint32_t nBuf,
			      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint16_t tmp79__;
	uint8_t tmp80__;
	uint16_t tmp81__;
	nNeeded  += 55;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 13;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp79__ = 0U;
		tmp79__ |= (pSrc->traffic_type << 0);
		tmp79__ |= (pSrc->tsid << 1);
		tmp79__ |= (pSrc->direction << 5);
		tmp79__ |= (pSrc->access_policy << 7);
		tmp79__ |= (pSrc->aggregation << 9);
		tmp79__ |= (pSrc->psb << 10);
		tmp79__ |= (pSrc->user_priority << 11);
		tmp79__ |= (pSrc->tsinfo_ack_pol << 14);
		frameshtons(pCtx, pBuf, tmp79__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		tmp80__ = 0U;
		tmp80__ |= (pSrc->schedule << 0);
		tmp80__ |= (pSrc->unused << 1);
		*pBuf = tmp80__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp81__ = 0U;
		tmp81__ |= (pSrc->size << 0);
		tmp81__ |= (pSrc->fixed << 15);
		frameshtons(pCtx, pBuf, tmp81__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		frameshtons(pCtx, pBuf, pSrc->max_msdu_size, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtonl(pCtx, pBuf, pSrc->min_service_int, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->max_service_int, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->inactivity_int, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->suspension_int, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->service_start_time, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->min_data_rate, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->mean_data_rate, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->peak_data_rate, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->burst_size, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->delay_bound, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->min_phy_rate, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtons(pCtx, pBuf, pSrc->surplus_bw_allowance, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->medium_time, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_tspec. */

uint32_t dot11f_pack_ie_vht_caps(tpAniSirGlobal pCtx,
				tDot11fIEVHTCaps *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint32_t tmp82__;
	uint16_t tmp83__;
	uint16_t tmp84__;
	nNeeded  += 12;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 191;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp82__ = 0U;
		tmp82__ |= (pSrc->maxMPDULen << 0);
		tmp82__ |= (pSrc->supportedChannelWidthSet << 2);
		tmp82__ |= (pSrc->ldpcCodingCap << 4);
		tmp82__ |= (pSrc->shortGI80MHz << 5);
		tmp82__ |= (pSrc->shortGI160and80plus80MHz << 6);
		tmp82__ |= (pSrc->txSTBC << 7);
		tmp82__ |= (pSrc->rxSTBC << 8);
		tmp82__ |= (pSrc->suBeamFormerCap << 11);
		tmp82__ |= (pSrc->suBeamformeeCap << 12);
		tmp82__ |= (pSrc->csnofBeamformerAntSup << 13);
		tmp82__ |= (pSrc->numSoundingDim << 16);
		tmp82__ |= (pSrc->muBeamformerCap << 19);
		tmp82__ |= (pSrc->muBeamformeeCap << 20);
		tmp82__ |= (pSrc->vhtTXOPPS << 21);
		tmp82__ |= (pSrc->htcVHTCap << 22);
		tmp82__ |= (pSrc->maxAMPDULenExp << 23);
		tmp82__ |= (pSrc->vhtLinkAdaptCap << 26);
		tmp82__ |= (pSrc->rxAntPattern << 28);
		tmp82__ |= (pSrc->txAntPattern << 29);
		tmp82__ |= (pSrc->reserved1 << 30);
		frameshtonl(pCtx, pBuf, tmp82__, 0);
		*pnConsumed += 4;
		pBuf += 4;
		nBuf -=  4 ;
		frameshtons(pCtx, pBuf, pSrc->rxMCSMap, 0);
		*pnConsumed += 2;
		pBuf += 2;
		tmp83__ = 0U;
		tmp83__ |= (pSrc->rxHighSupDataRate << 0);
		tmp83__ |= (pSrc->reserved2 << 13);
		frameshtons(pCtx, pBuf, tmp83__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		frameshtons(pCtx, pBuf, pSrc->txMCSMap, 0);
		*pnConsumed += 2;
		pBuf += 2;
		tmp84__ = 0U;
		tmp84__ |= (pSrc->txSupDataRate << 0);
		tmp84__ |= (pSrc->reserved3 << 13);
		frameshtons(pCtx, pBuf, tmp84__, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag  = 1 */
		nBuf -=  2 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_vht_caps. */

uint32_t dot11f_pack_ie_vht_operation(tpAniSirGlobal pCtx,
				     tDot11fIEVHTOperation *pSrc,
				     uint8_t *pBuf,
				     uint32_t nBuf,
				     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 5;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 192;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->chanWidth;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->chanCenterFreqSeg1;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->chanCenterFreqSeg2;
		*pnConsumed += 1;
		pBuf += 1;
		frameshtons(pCtx, pBuf, pSrc->basicMCSSet, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_vht_operation. */

uint32_t dot11f_pack_ie_wmm_schedule(tpAniSirGlobal pCtx,
				    tDot11fIEWMMSchedule *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint16_t tmp85__;
	nNeeded  += 15;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x9;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->version;
		*pnConsumed += 1;
		pBuf += 1;
		tmp85__ = 0U;
		tmp85__ |= (pSrc->aggregation << 0);
		tmp85__ |= (pSrc->tsid << 1);
		tmp85__ |= (pSrc->direction << 5);
		tmp85__ |= (pSrc->reserved << 7);
		frameshtons(pCtx, pBuf, tmp85__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		frameshtonl(pCtx, pBuf, pSrc->service_start_time, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->service_interval, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtons(pCtx, pBuf, pSrc->max_service_dur, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->spec_interval, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wmm_schedule. */

uint32_t dot11f_pack_ie_wmmtclas(tpAniSirGlobal pCtx,
				 tDot11fIEWMMTCLAS *pSrc,
				 uint8_t *pBuf,
				 uint32_t nBuf,
				 uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_iewmmtclas(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x6;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->version;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->user_priority;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->classifier_type;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->classifier_mask;
		*pnConsumed += 1;
		pBuf += 1;
		switch (pSrc->classifier_type) {
		case 0:
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.EthParams.source, 6);
			*pnConsumed += 6;
			pBuf += 6;
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.EthParams.dest, 6);
			*pnConsumed += 6;
			pBuf += 6;
			frameshtons(pCtx, pBuf, pSrc->info.EthParams.type, 0);
			*pnConsumed += 2;
			/* fieldsEndFlag = 1 */
			break;
		case 1:
			*pBuf = pSrc->info.IpParams.version;
			*pnConsumed += 1;
			pBuf += 1;
			switch (pSrc->info.IpParams.version) {
			case 4:
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.IpParams.params.IpV4Params.source, 4);
				*pnConsumed += 4;
				pBuf += 4;
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.IpParams.params.IpV4Params.dest, 4);
				*pnConsumed += 4;
				pBuf += 4;
				frameshtons(pCtx, pBuf, pSrc->info.IpParams.params.IpV4Params.src_port, 0);
				*pnConsumed += 2;
				pBuf += 2;
				frameshtons(pCtx, pBuf, pSrc->info.IpParams.params.IpV4Params.dest_port, 0);
				*pnConsumed += 2;
				pBuf += 2;
				*pBuf = pSrc->info.IpParams.params.IpV4Params.DSCP;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->info.IpParams.params.IpV4Params.proto;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->info.IpParams.params.IpV4Params.reserved;
				*pnConsumed += 1;
				/* fieldsEndFlag = 1 */
				break;
			case 6:
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.IpParams.params.IpV6Params.source, 10);
				*pnConsumed += 10;
				pBuf += 10;
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.IpParams.params.IpV6Params.dest, 10);
				*pnConsumed += 10;
				pBuf += 10;
				frameshtons(pCtx, pBuf, pSrc->info.IpParams.params.IpV6Params.src_port, 0);
				*pnConsumed += 2;
				pBuf += 2;
				frameshtons(pCtx, pBuf, pSrc->info.IpParams.params.IpV6Params.dest_port, 0);
				*pnConsumed += 2;
				pBuf += 2;
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->info.IpParams.params.IpV6Params.flow_label, 3);
				*pnConsumed += 3;
				/* fieldsEndFlag = 1 */
				break;
			}
			break;
		case 2:
			frameshtons(pCtx, pBuf, pSrc->info.Params8021dq.tag_type, 0);
			*pnConsumed += 2;
			/* fieldsEndFlag = 1 */
			break;
		}
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_wmmtclas. */

uint32_t dot11f_pack_ie_wmmtclasproc(tpAniSirGlobal pCtx,
				     tDot11fIEWMMTCLASPROC *pSrc,
				     uint8_t *pBuf,
				     uint32_t nBuf,
				     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x7;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->version;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->processing;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wmmtclasproc. */

uint32_t dot11f_pack_ie_wmmts_delay(tpAniSirGlobal pCtx,
				   tDot11fIEWMMTSDelay *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 5;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x8;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->version;
		*pnConsumed += 1;
		pBuf += 1;
		frameshtonl(pCtx, pBuf, pSrc->delay, 0);
		*pnConsumed += 4;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wmmts_delay. */

uint32_t dot11f_pack_ie_wmmtspec(tpAniSirGlobal pCtx,
				 tDot11fIEWMMTSPEC *pSrc,
				 uint8_t *pBuf,
				 uint32_t nBuf,
				 uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint16_t tmp86__;
	uint8_t tmp87__;
	uint16_t tmp88__;
	nNeeded  += 38;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x2;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->version;
		*pnConsumed += 1;
		pBuf += 1;
		tmp86__ = 0U;
		tmp86__ |= (pSrc->traffic_type << 0);
		tmp86__ |= (pSrc->tsid << 1);
		tmp86__ |= (pSrc->direction << 5);
		tmp86__ |= (pSrc->access_policy << 7);
		tmp86__ |= (pSrc->aggregation << 9);
		tmp86__ |= (pSrc->psb << 10);
		tmp86__ |= (pSrc->user_priority << 11);
		tmp86__ |= (pSrc->tsinfo_ack_pol << 14);
		frameshtons(pCtx, pBuf, tmp86__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		tmp87__ = 0U;
		tmp87__ |= (pSrc->tsinfo_rsvd << 0);
		tmp87__ |= (pSrc->burst_size_defn << 7);
		*pBuf = tmp87__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp88__ = 0U;
		tmp88__ |= (pSrc->size << 0);
		tmp88__ |= (pSrc->fixed << 15);
		frameshtons(pCtx, pBuf, tmp88__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		frameshtons(pCtx, pBuf, pSrc->max_msdu_size, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtonl(pCtx, pBuf, pSrc->min_service_int, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->max_service_int, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->inactivity_int, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->suspension_int, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->service_start_time, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->min_data_rate, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->mean_data_rate, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->peak_data_rate, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->burst_size, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->delay_bound, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtonl(pCtx, pBuf, pSrc->min_phy_rate, 0);
		*pnConsumed += 4;
		pBuf += 4;
		frameshtons(pCtx, pBuf, pSrc->surplus_bw_allowance, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->medium_time, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wmmtspec. */

uint32_t dot11f_pack_ie_wider_bw_chan_switch_ann(tpAniSirGlobal pCtx,
					     tDot11fIEWiderBWChanSwitchAnn *pSrc,
					     uint8_t *pBuf,
					     uint32_t nBuf,
					     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 3;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 194;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->newChanWidth;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->newCenterChanFreq0;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->newCenterChanFreq1;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wider_bw_chan_switch_ann. */

uint32_t dot11f_pack_ie_aid(tpAniSirGlobal pCtx,
			    tDot11fIEAID *pSrc,
			    uint8_t *pBuf,
			    uint32_t nBuf,
			    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 197;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		frameshtons(pCtx, pBuf, pSrc->assocId, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_aid. */

uint32_t dot11f_pack_ie_cf_params(tpAniSirGlobal pCtx,
				 tDot11fIECFParams *pSrc,
				 uint8_t *pBuf,
				 uint32_t nBuf,
				 uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 6;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 4;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->cfp_count;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->cfp_period;
		*pnConsumed += 1;
		pBuf += 1;
		frameshtons(pCtx, pBuf, pSrc->cfp_maxduration, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->cfp_durremaining, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_cf_params. */

uint32_t dot11f_pack_ie_challenge_text(tpAniSirGlobal pCtx,
				      tDot11fIEChallengeText *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_text;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 16;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->text), pSrc->num_text);
		*pnConsumed += pSrc->num_text;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_challenge_text. */

uint32_t dot11f_pack_ie_chan_switch_ann(tpAniSirGlobal pCtx,
				      tDot11fIEChanSwitchAnn *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 3;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 37;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->switchMode;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->newChannel;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->switchCount;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_chan_switch_ann. */

uint32_t dot11f_pack_ie_channel_switch_wrapper(tpAniSirGlobal pCtx,
					     tDot11fIEChannelSwitchWrapper *pSrc,
					     uint8_t *pBuf,
					     uint32_t nBuf,
					     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_ie_channel_switch_wrapper(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 196;
		++pBuf; --nBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; --nBuf; ++(*pnConsumed);
		status = pack_core(pCtx,
				(uint8_t *)pSrc,
				pBuf,
				nBuf,
				pnConsumed,
				FFS_ChannelSwitchWrapper,
				IES_ChannelSwitchWrapper);
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_channel_switch_wrapper. */

uint32_t dot11f_pack_ie_country(tpAniSirGlobal pCtx,
				tDot11fIECountry *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_ie_country(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 7;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->country, 3);
		*pnConsumed += 3;
		pBuf += 3;
		if (pSrc->num_triplets) {
			DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->triplets), (pSrc->num_triplets * 3));
			*pnConsumed += (pSrc->num_triplets * 3);
			/* fieldsEndFlag = 1 */
		} else {
			break;
		}
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_country. */

uint32_t dot11f_pack_ie_ds_params(tpAniSirGlobal pCtx,
				 tDot11fIEDSParams *pSrc,
				 uint8_t *pBuf,
				 uint32_t nBuf,
				 uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 3;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->curr_channel;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ds_params. */

uint32_t dot11f_pack_ie_edca_param_set(tpAniSirGlobal pCtx,
				     tDot11fIEEDCAParamSet *pSrc,
				     uint8_t *pBuf,
				     uint32_t nBuf,
				     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp89__;
	uint8_t tmp90__;
	uint8_t tmp91__;
	uint8_t tmp92__;
	uint8_t tmp93__;
	uint8_t tmp94__;
	uint8_t tmp95__;
	uint8_t tmp96__;
	nNeeded  += 18;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 12;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->qos;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->reserved;
		*pnConsumed += 1;
		pBuf += 1;
		tmp89__ = 0U;
		tmp89__ |= (pSrc->acbe_aifsn << 0);
		tmp89__ |= (pSrc->acbe_acm << 4);
		tmp89__ |= (pSrc->acbe_aci << 5);
		tmp89__ |= (pSrc->unused1 << 7);
		*pBuf = tmp89__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp90__ = 0U;
		tmp90__ |= (pSrc->acbe_acwmin << 0);
		tmp90__ |= (pSrc->acbe_acwmax << 4);
		*pBuf = tmp90__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		frameshtons(pCtx, pBuf, pSrc->acbe_txoplimit, 0);
		*pnConsumed += 2;
		pBuf += 2;
		tmp91__ = 0U;
		tmp91__ |= (pSrc->acbk_aifsn << 0);
		tmp91__ |= (pSrc->acbk_acm << 4);
		tmp91__ |= (pSrc->acbk_aci << 5);
		tmp91__ |= (pSrc->unused2 << 7);
		*pBuf = tmp91__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp92__ = 0U;
		tmp92__ |= (pSrc->acbk_acwmin << 0);
		tmp92__ |= (pSrc->acbk_acwmax << 4);
		*pBuf = tmp92__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		frameshtons(pCtx, pBuf, pSrc->acbk_txoplimit, 0);
		*pnConsumed += 2;
		pBuf += 2;
		tmp93__ = 0U;
		tmp93__ |= (pSrc->acvi_aifsn << 0);
		tmp93__ |= (pSrc->acvi_acm << 4);
		tmp93__ |= (pSrc->acvi_aci << 5);
		tmp93__ |= (pSrc->unused3 << 7);
		*pBuf = tmp93__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp94__ = 0U;
		tmp94__ |= (pSrc->acvi_acwmin << 0);
		tmp94__ |= (pSrc->acvi_acwmax << 4);
		*pBuf = tmp94__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		frameshtons(pCtx, pBuf, pSrc->acvi_txoplimit, 0);
		*pnConsumed += 2;
		pBuf += 2;
		tmp95__ = 0U;
		tmp95__ |= (pSrc->acvo_aifsn << 0);
		tmp95__ |= (pSrc->acvo_acm << 4);
		tmp95__ |= (pSrc->acvo_aci << 5);
		tmp95__ |= (pSrc->unused4 << 7);
		*pBuf = tmp95__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp96__ = 0U;
		tmp96__ |= (pSrc->acvo_acwmin << 0);
		tmp96__ |= (pSrc->acvo_acwmax << 4);
		*pBuf = tmp96__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		frameshtons(pCtx, pBuf, pSrc->acvo_txoplimit, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_edca_param_set. */

uint32_t dot11f_pack_ie_erp_info(tpAniSirGlobal pCtx,
				tDot11fIEERPInfo *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp97__;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 42;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp97__ = 0U;
		tmp97__ |= (pSrc->non_erp_present << 0);
		tmp97__ |= (pSrc->use_prot << 1);
		tmp97__ |= (pSrc->barker_preamble << 2);
		tmp97__ |= (pSrc->unused << 3);
		*pBuf = tmp97__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_erp_info. */

uint32_t dot11f_pack_ie_ese_cckm_opaque(tpAniSirGlobal pCtx,
				      tDot11fIEESECckmOpaque *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_data;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 156;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x40;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x96;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->data), pSrc->num_data);
		*pnConsumed += pSrc->num_data;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ese_cckm_opaque. */

uint32_t dot11f_pack_ie_ese_rad_mgmt_cap(tpAniSirGlobal pCtx,
				      tDot11fIEESERadMgmtCap *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp98__;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x40;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x96;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x1;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->mgmt_state;
		*pnConsumed += 1;
		pBuf += 1;
		tmp98__ = 0U;
		tmp98__ |= (pSrc->mbssid_mask << 0);
		tmp98__ |= (pSrc->reserved << 3);
		*pBuf = tmp98__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ese_rad_mgmt_cap. */

uint32_t dot11f_pack_ie_ese_traf_strm_met(tpAniSirGlobal pCtx,
				       tDot11fIEESETrafStrmMet *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 4;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x40;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x96;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x7;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->tsid;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->state;
		*pnConsumed += 1;
		pBuf += 1;
		frameshtons(pCtx, pBuf, pSrc->msmt_interval, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ese_traf_strm_met. */

uint32_t dot11f_pack_ie_ese_traf_strm_rate_set(tpAniSirGlobal pCtx,
					   tDot11fIEESETrafStrmRateSet *pSrc,
					   uint8_t *pBuf,
					   uint32_t nBuf,
					   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  (pSrc->num_tsrates + 1);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x40;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x96;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x8;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->tsid;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->tsrates), pSrc->num_tsrates);
		*pnConsumed += pSrc->num_tsrates;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ese_traf_strm_rate_set. */

uint32_t dot11f_pack_ie_ese_txmit_power(tpAniSirGlobal pCtx,
				      tDot11fIEESETxmitPower *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 150;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x40;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x96;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->power_limit;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->reserved;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ese_txmit_power. */

uint32_t dot11f_pack_ie_ese_version(tpAniSirGlobal pCtx,
				   tDot11fIEESEVersion *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x40;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x96;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x3;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->version;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ese_version. */

uint32_t dot11f_pack_ie_ext_cap(tpAniSirGlobal pCtx,
			       tDot11fIEExtCap *pSrc,
			       uint8_t *pBuf,
			       uint32_t nBuf,
			       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_bytes;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 127;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->bytes), pSrc->num_bytes);
		*pnConsumed += pSrc->num_bytes;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ext_cap. */

uint32_t dot11f_pack_ie_ext_supp_rates(tpAniSirGlobal pCtx,
				     tDot11fIEExtSuppRates *pSrc,
				     uint8_t *pBuf,
				     uint32_t nBuf,
				     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_rates;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 50;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->rates), pSrc->num_rates);
		*pnConsumed += pSrc->num_rates;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ext_supp_rates. */

uint32_t dot11f_pack_ie_fh_param_set(tpAniSirGlobal pCtx,
				   tDot11fIEFHParamSet *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 5;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 2;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		frameshtons(pCtx, pBuf, pSrc->dwell_time, 0);
		*pnConsumed += 2;
		pBuf += 2;
		*pBuf = pSrc->hop_set;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->hop_pattern;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->hop_index;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_fh_param_set. */

uint32_t dot11f_pack_ie_fh_params(tpAniSirGlobal pCtx,
				 tDot11fIEFHParams *pSrc,
				 uint8_t *pBuf,
				 uint32_t nBuf,
				 uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 8;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->radix;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->nchannels;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_fh_params. */

uint32_t dot11f_pack_ie_fh_patt_table(tpAniSirGlobal pCtx,
				    tDot11fIEFHPattTable *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  (pSrc->num_randtable + 4);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 9;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->flag;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->nsets;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->modulus;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->offset;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->randtable), pSrc->num_randtable);
		*pnConsumed += pSrc->num_randtable;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_fh_patt_table. */

uint32_t dot11f_pack_ie_ft_info(tpAniSirGlobal pCtx,
			       tDot11fIEFTInfo *pSrc,
			       uint8_t *pBuf,
			       uint32_t nBuf,
			       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint16_t tmp99__;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_ieft_info(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 55;
		++pBuf; --nBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; --nBuf; ++(*pnConsumed);
		tmp99__ = 0U;
		tmp99__ |= (pSrc->reserved << 0);
		tmp99__ |= (pSrc->IECount << 8);
		frameshtons(pCtx, pBuf, tmp99__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->MIC, 16);
		*pnConsumed += 16;
		pBuf += 16;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->Anonce, 32);
		*pnConsumed += 32;
		pBuf += 32;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->Snonce, 32);
		*pnConsumed += 32;
		pBuf += 32;
		status = pack_core(pCtx,
				(uint8_t *)pSrc,
				pBuf,
				nBuf,
				pnConsumed,
				FFS_FTInfo,
				IES_FTInfo);
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_ft_info. */

uint32_t dot11f_pack_ie_ht_caps(tpAniSirGlobal pCtx,
			       tDot11fIEHTCaps *pSrc,
			       uint8_t *pBuf,
			       uint32_t nBuf,
			       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint16_t tmp100__;
	uint8_t tmp101__;
	uint16_t tmp102__;
	uint32_t tmp103__;
	uint8_t tmp104__;
	nNeeded  +=  (pSrc->num_rsvd + 26);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 45;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp100__ = 0U;
		tmp100__ |= (pSrc->advCodingCap << 0);
		tmp100__ |= (pSrc->supportedChannelWidthSet << 1);
		tmp100__ |= (pSrc->mimoPowerSave << 2);
		tmp100__ |= (pSrc->greenField << 4);
		tmp100__ |= (pSrc->shortGI20MHz << 5);
		tmp100__ |= (pSrc->shortGI40MHz << 6);
		tmp100__ |= (pSrc->txSTBC << 7);
		tmp100__ |= (pSrc->rxSTBC << 8);
		tmp100__ |= (pSrc->delayedBA << 10);
		tmp100__ |= (pSrc->maximalAMSDUsize << 11);
		tmp100__ |= (pSrc->dsssCckMode40MHz << 12);
		tmp100__ |= (pSrc->psmp << 13);
		tmp100__ |= (pSrc->stbcControlFrame << 14);
		tmp100__ |= (pSrc->lsigTXOPProtection << 15);
		frameshtons(pCtx, pBuf, tmp100__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		tmp101__ = 0U;
		tmp101__ |= (pSrc->maxRxAMPDUFactor << 0);
		tmp101__ |= (pSrc->mpduDensity << 2);
		tmp101__ |= (pSrc->reserved1 << 5);
		*pBuf = tmp101__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->supportedMCSSet, 16);
		*pnConsumed += 16;
		pBuf += 16;
		tmp102__ = 0U;
		tmp102__ |= (pSrc->pco << 0);
		tmp102__ |= (pSrc->transitionTime << 1);
		tmp102__ |= (pSrc->reserved2 << 3);
		tmp102__ |= (pSrc->mcsFeedback << 8);
		tmp102__ |= (pSrc->reserved3 << 10);
		frameshtons(pCtx, pBuf, tmp102__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		tmp103__ = 0U;
		tmp103__ |= (pSrc->txBF << 0);
		tmp103__ |= (pSrc->rxStaggeredSounding << 1);
		tmp103__ |= (pSrc->txStaggeredSounding << 2);
		tmp103__ |= (pSrc->rxZLF << 3);
		tmp103__ |= (pSrc->txZLF << 4);
		tmp103__ |= (pSrc->implicitTxBF << 5);
		tmp103__ |= (pSrc->calibration << 6);
		tmp103__ |= (pSrc->explicitCSITxBF << 8);
		tmp103__ |= (pSrc->explicitUncompressedSteeringMatrix << 9);
		tmp103__ |= (pSrc->explicitBFCSIFeedback << 10);
		tmp103__ |= (pSrc->explicitUncompressedSteeringMatrixFeedback << 13);
		tmp103__ |= (pSrc->explicitCompressedSteeringMatrixFeedback << 16);
		tmp103__ |= (pSrc->csiNumBFAntennae << 19);
		tmp103__ |= (pSrc->uncompressedSteeringMatrixBFAntennae << 21);
		tmp103__ |= (pSrc->compressedSteeringMatrixBFAntennae << 23);
		tmp103__ |= (pSrc->reserved4 << 25);
		frameshtonl(pCtx, pBuf, tmp103__, 0);
		*pnConsumed += 4;
		pBuf += 4;
		nBuf -=  4 ;
		tmp104__ = 0U;
		tmp104__ |= (pSrc->antennaSelection << 0);
		tmp104__ |= (pSrc->explicitCSIFeedbackTx << 1);
		tmp104__ |= (pSrc->antennaIndicesFeedbackTx << 2);
		tmp104__ |= (pSrc->explicitCSIFeedback << 3);
		tmp104__ |= (pSrc->antennaIndicesFeedback << 4);
		tmp104__ |= (pSrc->rxAS << 5);
		tmp104__ |= (pSrc->txSoundingPPDUs << 6);
		tmp104__ |= (pSrc->reserved5 << 7);
		*pBuf = tmp104__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->rsvd), pSrc->num_rsvd);
		*pnConsumed += pSrc->num_rsvd;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ht_caps. */

uint32_t dot11f_pack_ie_ht_info(tpAniSirGlobal pCtx,
			       tDot11fIEHTInfo *pSrc,
			       uint8_t *pBuf,
			       uint32_t nBuf,
			       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp105__;
	uint16_t tmp106__;
	uint16_t tmp107__;
	nNeeded  +=  (pSrc->num_rsvd + 22);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 61;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->primaryChannel;
		*pnConsumed += 1;
		pBuf += 1;
		tmp105__ = 0U;
		tmp105__ |= (pSrc->secondaryChannelOffset << 0);
		tmp105__ |= (pSrc->recommendedTxWidthSet << 2);
		tmp105__ |= (pSrc->rifsMode << 3);
		tmp105__ |= (pSrc->controlledAccessOnly << 4);
		tmp105__ |= (pSrc->serviceIntervalGranularity << 5);
		*pBuf = tmp105__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp106__ = 0U;
		tmp106__ |= (pSrc->opMode << 0);
		tmp106__ |= (pSrc->nonGFDevicesPresent << 2);
		tmp106__ |= (pSrc->transmitBurstLimit << 3);
		tmp106__ |= (pSrc->obssNonHTStaPresent << 4);
		tmp106__ |= (pSrc->reserved << 5);
		frameshtons(pCtx, pBuf, tmp106__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		tmp107__ = 0U;
		tmp107__ |= (pSrc->basicSTBCMCS << 0);
		tmp107__ |= (pSrc->dualCTSProtection << 7);
		tmp107__ |= (pSrc->secondaryBeacon << 8);
		tmp107__ |= (pSrc->lsigTXOPProtectionFullSupport << 9);
		tmp107__ |= (pSrc->pcoActive << 10);
		tmp107__ |= (pSrc->pcoPhase << 11);
		tmp107__ |= (pSrc->reserved2 << 12);
		frameshtons(pCtx, pBuf, tmp107__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->basicMCSSet, 16);
		*pnConsumed += 16;
		pBuf += 16;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->rsvd), pSrc->num_rsvd);
		*pnConsumed += pSrc->num_rsvd;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ht_info. */

uint32_t dot11f_pack_ie_ibss_params(tpAniSirGlobal pCtx,
				   tDot11fIEIBSSParams *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 6;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		frameshtons(pCtx, pBuf, pSrc->atim, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ibss_params. */

uint32_t dot11f_pack_ie_link_identifier(tpAniSirGlobal pCtx,
				       tDot11fIELinkIdentifier *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 18;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 101;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->bssid, 6);
		*pnConsumed += 6;
		pBuf += 6;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->InitStaAddr, 6);
		*pnConsumed += 6;
		pBuf += 6;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->RespStaAddr, 6);
		*pnConsumed += 6;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_link_identifier. */

uint32_t dot11f_pack_ie_measurement_report(tpAniSirGlobal pCtx,
					  tDot11fIEMeasurementReport *pSrc,
					  uint8_t *pBuf,
					  uint32_t nBuf,
					  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp108__;
	uint8_t tmp109__;
	uint8_t tmp110__;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_ie_measurement_report(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 39;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->token;
		*pnConsumed += 1;
		pBuf += 1;
		tmp108__ = 0U;
		tmp108__ |= (pSrc->late << 0);
		tmp108__ |= (pSrc->incapable << 1);
		tmp108__ |= (pSrc->refused << 2);
		tmp108__ |= (pSrc->unused << 3);
		*pBuf = tmp108__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		*pBuf = pSrc->type;
		*pnConsumed += 1;
		pBuf += 1;
		if (pSrc->type) {
			switch (pSrc->type) {
			case 0:
				*pBuf = pSrc->report.Basic.channel;
				*pnConsumed += 1;
				pBuf += 1;
				frameshtonq(pCtx, pBuf, pSrc->report.Basic.meas_start_time, 0);
				*pnConsumed += 8;
				pBuf += 8;
				frameshtons(pCtx, pBuf, pSrc->report.Basic.meas_duration, 0);
				*pnConsumed += 2;
				pBuf += 2;
				tmp109__ = 0U;
				tmp109__ |= (pSrc->report.Basic.bss << 0);
				tmp109__ |= (pSrc->report.Basic.ofdm_preamble << 1);
				tmp109__ |= (pSrc->report.Basic.unid_signal << 2);
				tmp109__ |= (pSrc->report.Basic.rader << 3);
				tmp109__ |= (pSrc->report.Basic.unmeasured << 4);
				tmp109__ |= (pSrc->report.Basic.unused << 5);
				*pBuf = tmp109__;
				*pnConsumed += 1;
				/* fieldsEndFlag  = 1 */
				nBuf -=  1 ;
				break;
			case 1:
				*pBuf = pSrc->report.CCA.channel;
				*pnConsumed += 1;
				pBuf += 1;
				frameshtonq(pCtx, pBuf, pSrc->report.CCA.meas_start_time, 0);
				*pnConsumed += 8;
				pBuf += 8;
				frameshtons(pCtx, pBuf, pSrc->report.CCA.meas_duration, 0);
				*pnConsumed += 2;
				pBuf += 2;
				*pBuf = pSrc->report.CCA.cca_busy_fraction;
				*pnConsumed += 1;
				/* fieldsEndFlag = 1 */
				break;
			case 2:
				*pBuf = pSrc->report.RPIHistogram.channel;
				*pnConsumed += 1;
				pBuf += 1;
				frameshtonq(pCtx, pBuf, pSrc->report.RPIHistogram.meas_start_time, 0);
				*pnConsumed += 8;
				pBuf += 8;
				frameshtons(pCtx, pBuf, pSrc->report.RPIHistogram.meas_duration, 0);
				*pnConsumed += 2;
				pBuf += 2;
				*pBuf = pSrc->report.RPIHistogram.rpi0_density;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->report.RPIHistogram.rpi1_density;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->report.RPIHistogram.rpi2_density;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->report.RPIHistogram.rpi3_density;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->report.RPIHistogram.rpi4_density;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->report.RPIHistogram.rpi5_density;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->report.RPIHistogram.rpi6_density;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->report.RPIHistogram.rpi7_density;
				*pnConsumed += 1;
				/* fieldsEndFlag = 1 */
				break;
			case 5:
				*pBuf = pSrc->report.Beacon.regClass;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->report.Beacon.channel;
				*pnConsumed += 1;
				pBuf += 1;
				frameshtonq(pCtx, pBuf, pSrc->report.Beacon.meas_start_time, 0);
				*pnConsumed += 8;
				pBuf += 8;
				frameshtons(pCtx, pBuf, pSrc->report.Beacon.meas_duration, 0);
				*pnConsumed += 2;
				pBuf += 2;
				tmp110__ = 0U;
				tmp110__ |= (pSrc->report.Beacon.condensed_PHY << 0);
				tmp110__ |= (pSrc->report.Beacon.reported_frame_type << 7);
				*pBuf = tmp110__;
				*pnConsumed += 1;
				pBuf += 1;
				nBuf -=  1 ;
				*pBuf = pSrc->report.Beacon.RCPI;
				*pnConsumed += 1;
				pBuf += 1;
				*pBuf = pSrc->report.Beacon.RSNI;
				*pnConsumed += 1;
				pBuf += 1;
				DOT11F_MEMCPY(pCtx, pBuf, pSrc->report.Beacon.BSSID, 6);
				*pnConsumed += 6;
				pBuf += 6;
				*pBuf = pSrc->report.Beacon.antenna_id;
				*pnConsumed += 1;
				pBuf += 1;
				frameshtonl(pCtx, pBuf, pSrc->report.Beacon.parent_TSF, 0);
				*pnConsumed += 4;
				pBuf += 4;
				status = pack_core(pCtx,
					 (uint8_t *)pSrc,
					 pBuf,
					 nBuf,
					 pnConsumed,
					 FFS_reportBeacon,
					 IES_reportBeacon);
				break;
			}
		} else {
			break;
		}
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_measurement_report. */

uint32_t dot11f_pack_ie_measurement_request(tpAniSirGlobal pCtx,
					   tDot11fIEMeasurementRequest *pSrc,
					   uint8_t *pBuf,
					   uint32_t nBuf,
					   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp111__;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_ie_measurement_request(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 38;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->measurement_token;
		*pnConsumed += 1;
		pBuf += 1;
		tmp111__ = 0U;
		tmp111__ |= (pSrc->parallel << 0);
		tmp111__ |= (pSrc->enable << 1);
		tmp111__ |= (pSrc->request << 2);
		tmp111__ |= (pSrc->report << 3);
		tmp111__ |= (pSrc->durationMandatory << 4);
		tmp111__ |= (pSrc->unused << 5);
		*pBuf = tmp111__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		*pBuf = pSrc->measurement_type;
		*pnConsumed += 1;
		pBuf += 1;
		switch (pSrc->measurement_type) {
		case 0:
			*pBuf = pSrc->measurement_request.Basic.channel_no;
			*pnConsumed += 1;
			pBuf += 1;
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->measurement_request.Basic.meas_start_time, 8);
			*pnConsumed += 8;
			pBuf += 8;
			frameshtons(pCtx, pBuf, pSrc->measurement_request.Basic.meas_duration, 0);
			*pnConsumed += 2;
			/* fieldsEndFlag = 1 */
			break;
		case 1:
			*pBuf = pSrc->measurement_request.CCA.channel_no;
			*pnConsumed += 1;
			pBuf += 1;
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->measurement_request.CCA.meas_start_time, 8);
			*pnConsumed += 8;
			pBuf += 8;
			frameshtons(pCtx, pBuf, pSrc->measurement_request.CCA.meas_duration, 0);
			*pnConsumed += 2;
			/* fieldsEndFlag = 1 */
			break;
		case 2:
			*pBuf = pSrc->measurement_request.RPIHistogram.channel_no;
			*pnConsumed += 1;
			pBuf += 1;
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->measurement_request.RPIHistogram.meas_start_time, 8);
			*pnConsumed += 8;
			pBuf += 8;
			frameshtons(pCtx, pBuf, pSrc->measurement_request.RPIHistogram.meas_duration, 0);
			*pnConsumed += 2;
			/* fieldsEndFlag = 1 */
			break;
		case 5:
			*pBuf = pSrc->measurement_request.Beacon.regClass;
			*pnConsumed += 1;
			pBuf += 1;
			*pBuf = pSrc->measurement_request.Beacon.channel;
			*pnConsumed += 1;
			pBuf += 1;
			frameshtons(pCtx, pBuf, pSrc->measurement_request.Beacon.randomization, 0);
			*pnConsumed += 2;
			pBuf += 2;
			frameshtons(pCtx, pBuf, pSrc->measurement_request.Beacon.meas_duration, 0);
			*pnConsumed += 2;
			pBuf += 2;
			*pBuf = pSrc->measurement_request.Beacon.meas_mode;
			*pnConsumed += 1;
			pBuf += 1;
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->measurement_request.Beacon.BSSID, 6);
			*pnConsumed += 6;
			pBuf += 6;
			status = pack_core(pCtx,
				 (uint8_t *)pSrc,
				 pBuf,
				 nBuf,
				 pnConsumed,
				 FFS_measurement_requestBeacon,
				 IES_measurement_requestBeacon);
			break;
		}
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_measurement_request. */

uint32_t dot11f_pack_ie_mobility_domain(tpAniSirGlobal pCtx,
				       tDot11fIEMobilityDomain *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp112__;
	nNeeded  += 3;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 54;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		frameshtons(pCtx, pBuf, pSrc->MDID, 0);
		*pnConsumed += 2;
		pBuf += 2;
		tmp112__ = 0U;
		tmp112__ |= (pSrc->overDSCap << 0);
		tmp112__ |= (pSrc->resourceReqCap << 1);
		tmp112__ |= (pSrc->reserved << 2);
		*pBuf = tmp112__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_mobility_domain. */

uint32_t dot11f_pack_ie_neighbor_report(tpAniSirGlobal pCtx,
				       tDot11fIENeighborReport *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp113__;
	uint8_t tmp114__;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_ie_neighbor_report(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 52;
		++pBuf; --nBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; --nBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->bssid, 6);
		*pnConsumed += 6;
		pBuf += 6;
		tmp113__ = 0U;
		tmp113__ |= (pSrc->APReachability << 0);
		tmp113__ |= (pSrc->Security << 2);
		tmp113__ |= (pSrc->KeyScope << 3);
		tmp113__ |= (pSrc->SpecMgmtCap << 4);
		tmp113__ |= (pSrc->QosCap << 5);
		tmp113__ |= (pSrc->apsd << 6);
		tmp113__ |= (pSrc->rrm << 7);
		*pBuf = tmp113__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp114__ = 0U;
		tmp114__ |= (pSrc->DelayedBA << 0);
		tmp114__ |= (pSrc->ImmBA << 1);
		tmp114__ |= (pSrc->MobilityDomain << 2);
		tmp114__ |= (pSrc->reserved << 3);
		*pBuf = tmp114__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		frameshtons(pCtx, pBuf, pSrc->reserved1, 0);
		*pnConsumed += 2;
		pBuf += 2;
		*pBuf = pSrc->regulatoryClass;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->channel;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->PhyType;
		*pnConsumed += 1;
		pBuf += 1;
		status = pack_core(pCtx,
				(uint8_t *)pSrc,
				pBuf,
				nBuf,
				pnConsumed,
				FFS_NeighborReport,
				IES_NeighborReport);
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_neighbor_report. */

uint32_t dot11f_pack_ie_obss_scan_parameters(tpAniSirGlobal pCtx,
					   tDot11fIEOBSSScanParameters *pSrc,
					   uint8_t *pBuf,
					   uint32_t nBuf,
					   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 14;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 74;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		frameshtons(pCtx, pBuf, pSrc->obssScanPassiveDwell, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->obssScanActiveDwell, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->bssChannelWidthTriggerScanInterval, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->obssScanPassiveTotalPerChannel, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->obssScanActiveTotalPerChannel, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->bssWidthChannelTransitionDelayFactor, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->obssScanActivityThreshold, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_obss_scan_parameters. */

uint32_t dot11f_pack_ie_operating_mode(tpAniSirGlobal pCtx,
				      tDot11fIEOperatingMode *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp115__;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 199;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp115__ = 0U;
		tmp115__ |= (pSrc->chanWidth << 0);
		tmp115__ |= (pSrc->reserved << 2);
		tmp115__ |= (pSrc->rxNSS << 4);
		tmp115__ |= (pSrc->rxNSSType << 7);
		*pBuf = tmp115__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_operating_mode. */

uint32_t dot11f_pack_ie_p2_p_assoc_req(tpAniSirGlobal pCtx,
				    tDot11fIEP2PAssocReq *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_iep2_p_assoc_req(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x6f;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9a;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_P2PAssocReq +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_p2_p_assoc_req. */

uint32_t dot11f_pack_ie_p2_p_assoc_res(tpAniSirGlobal pCtx,
				    tDot11fIEP2PAssocRes *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_iep2_p_assoc_res(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x6f;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9a;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_P2PAssocRes +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_p2_p_assoc_res. */

uint32_t dot11f_pack_ie_p2_p_beacon(tpAniSirGlobal pCtx,
				  tDot11fIEP2PBeacon *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_iep2_p_beacon(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x6f;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9a;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_P2PBeacon +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_p2_p_beacon. */

uint32_t dot11f_pack_ie_p2_p_beacon_probe_res(tpAniSirGlobal pCtx,
					  tDot11fIEP2PBeaconProbeRes *pSrc,
					  uint8_t *pBuf,
					  uint32_t nBuf,
					  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_iep2_p_beacon_probe_res(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x6f;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9a;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_P2PBeaconProbeRes +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_p2_p_beacon_probe_res. */

uint32_t dot11f_pack_ie_p2_p_de_auth(tpAniSirGlobal pCtx,
				  tDot11fIEP2PDeAuth *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_iep2_p_de_auth(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x6f;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9a;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_P2PDeAuth +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_p2_p_de_auth. */

uint32_t dot11f_pack_ie_p2_p_dis_assoc(tpAniSirGlobal pCtx,
				    tDot11fIEP2PDisAssoc *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_iep2_p_dis_assoc(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x6f;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9a;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_P2PDisAssoc +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_p2_p_dis_assoc. */

uint32_t dot11f_pack_ie_p2_pie_opaque(tpAniSirGlobal pCtx,
				    tDot11fIEP2PIEOpaque *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_data;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x6f;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x9a;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x9;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->data), pSrc->num_data);
		*pnConsumed += pSrc->num_data;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_p2_pie_opaque. */

uint32_t dot11f_pack_ie_p2_p_probe_req(tpAniSirGlobal pCtx,
				    tDot11fIEP2PProbeReq *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_iep2_p_probe_req(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x6f;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9a;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_P2PProbeReq +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_p2_p_probe_req. */

uint32_t dot11f_pack_ie_p2_p_probe_res(tpAniSirGlobal pCtx,
				    tDot11fIEP2PProbeRes *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_iep2_p_probe_res(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x6f;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9a;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x9;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_P2PProbeRes +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_p2_p_probe_res. */

uint32_t dot11f_pack_ie_pti_control(tpAniSirGlobal pCtx,
				   tDot11fIEPTIControl *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 3;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 105;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->tid;
		*pnConsumed += 1;
		pBuf += 1;
		frameshtons(pCtx, pBuf, pSrc->sequence_control, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_pti_control. */

uint32_t dot11f_pack_ie_pu_buffer_status(tpAniSirGlobal pCtx,
				       tDot11fIEPUBufferStatus *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp116__;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 106;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp116__ = 0U;
		tmp116__ |= (pSrc->ac_bk_traffic_aval << 0);
		tmp116__ |= (pSrc->ac_be_traffic_aval << 1);
		tmp116__ |= (pSrc->ac_vi_traffic_aval << 2);
		tmp116__ |= (pSrc->ac_vo_traffic_aval << 3);
		tmp116__ |= (pSrc->reserved << 4);
		*pBuf = tmp116__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_pu_buffer_status. */

uint32_t dot11f_pack_ie_power_caps(tpAniSirGlobal pCtx,
				  tDot11fIEPowerCaps *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 33;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->minTxPower;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->maxTxPower;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_power_caps. */

uint32_t dot11f_pack_ie_power_constraints(tpAniSirGlobal pCtx,
					 tDot11fIEPowerConstraints *pSrc,
					 uint8_t *pBuf,
					 uint32_t nBuf,
					 uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 32;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->localPowerConstraints;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_power_constraints. */

uint32_t dot11f_pack_ie_qbss_load(tpAniSirGlobal pCtx,
				 tDot11fIEQBSSLoad *pSrc,
				 uint8_t *pBuf,
				 uint32_t nBuf,
				 uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 5;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 11;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		frameshtons(pCtx, pBuf, pSrc->stacount, 0);
		*pnConsumed += 2;
		pBuf += 2;
		*pBuf = pSrc->chautil;
		*pnConsumed += 1;
		pBuf += 1;
		frameshtons(pCtx, pBuf, pSrc->avail, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_qbss_load. */

uint32_t dot11f_pack_ie_QComVendorIE(tpAniSirGlobal pCtx,
				     tDot11fIEQComVendorIE *pSrc,
				     uint8_t *pBuf,
				     uint32_t nBuf,
				     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xa0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xc6;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->type;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->channel;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_QComVendorIE. */

uint32_t dot11f_pack_ie_qos_caps_ap(tpAniSirGlobal pCtx,
				  tDot11fIEQOSCapsAp *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp117__;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 46;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp117__ = 0U;
		tmp117__ |= (pSrc->count << 0);
		tmp117__ |= (pSrc->qack << 4);
		tmp117__ |= (pSrc->qreq << 5);
		tmp117__ |= (pSrc->txopreq << 6);
		tmp117__ |= (pSrc->reserved << 7);
		*pBuf = tmp117__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_qos_caps_ap. */

uint32_t dot11f_pack_ie_qos_caps_station(tpAniSirGlobal pCtx,
				       tDot11fIEQOSCapsStation *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp118__;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 46;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp118__ = 0U;
		tmp118__ |= (pSrc->acvo_uapsd << 0);
		tmp118__ |= (pSrc->acvi_uapsd << 1);
		tmp118__ |= (pSrc->acbk_uapsd << 2);
		tmp118__ |= (pSrc->acbe_uapsd << 3);
		tmp118__ |= (pSrc->qack << 4);
		tmp118__ |= (pSrc->max_sp_length << 5);
		tmp118__ |= (pSrc->more_data_ack << 7);
		*pBuf = tmp118__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_qos_caps_station. */

uint32_t dot11f_pack_ie_qos_map_set(tpAniSirGlobal pCtx,
				  tDot11fIEQosMapSet *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_dscp_exceptions;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 110;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->dscp_exceptions), pSrc->num_dscp_exceptions);
		*pnConsumed += pSrc->num_dscp_exceptions;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_qos_map_set. */

uint32_t dot11f_pack_ie_quiet(tpAniSirGlobal pCtx,
			      tDot11fIEQuiet *pSrc,
			      uint8_t *pBuf,
			      uint32_t nBuf,
			      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 6;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 40;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->count;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->period;
		*pnConsumed += 1;
		pBuf += 1;
		frameshtons(pCtx, pBuf, pSrc->duration, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->offset, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_quiet. */

uint32_t dot11f_pack_ie_rcpiie(tpAniSirGlobal pCtx,
			       tDot11fIERCPIIE *pSrc,
			       uint8_t *pBuf,
			       uint32_t nBuf,
			       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 53;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->rcpi;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_rcpiie. */

uint32_t dot11f_pack_ie_ric_data_desc(tpAniSirGlobal pCtx,
				    tDot11fIERICDataDesc *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint32_t nNeeded = 0U;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_ieric_data_desc(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		status = pack_core(pCtx,
				(uint8_t *)pSrc,
				pBuf,
				nBuf,
				pnConsumed,
				FFS_RICDataDesc,
				IES_RICDataDesc);
		break;
	}
	(void)pCtx;
	return status;
} /* End dot11f_pack_ie_ric_data_desc. */

uint32_t dot11f_pack_ie_rsn(tpAniSirGlobal pCtx,
			    tDot11fIERSN *pSrc,
			    uint8_t *pBuf,
			    uint32_t nBuf,
			    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_iersn(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 48;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		frameshtons(pCtx, pBuf, pSrc->version, 0);
		*pnConsumed += 2;
		pBuf += 2;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->gp_cipher_suite, 4);
		*pnConsumed += 4;
		pBuf += 4;
		if (pSrc->pwise_cipher_suite_count) {
			frameshtons(pCtx, pBuf, pSrc->pwise_cipher_suite_count, 0);
			*pnConsumed += 2;
			pBuf += 2;
		} else {
			break;
		}
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->pwise_cipher_suites), (pSrc->pwise_cipher_suite_count * 4));
		*pnConsumed += (pSrc->pwise_cipher_suite_count * 4);
		pBuf += (pSrc->pwise_cipher_suite_count * 4);
		if (pSrc->akm_suite_count) {
			frameshtons(pCtx, pBuf, pSrc->akm_suite_count, 0);
			*pnConsumed += 2;
			pBuf += 2;
		} else {
			break;
		}
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->akm_suites), (pSrc->akm_suite_count * 4));
		*pnConsumed += (pSrc->akm_suite_count * 4);
		pBuf += (pSrc->akm_suite_count * 4);
		if (pSrc->RSN_Cap) {
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->RSN_Cap, 2);
			*pnConsumed += 2;
			pBuf += 2;
		} else {
			break;
		}
		if (pSrc->pmkid_count) {
			frameshtons(pCtx, pBuf, pSrc->pmkid_count, 0);
			*pnConsumed += 2;
			pBuf += 2;
		} else {
			break;
		}
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->pmkid), (pSrc->pmkid_count * 16));
		*pnConsumed += (pSrc->pmkid_count * 16);
		pBuf += (pSrc->pmkid_count * 16);
		if (pSrc->gp_mgmt_cipher_suite) {
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->gp_mgmt_cipher_suite, 4);
			*pnConsumed += 4;
			/* fieldsEndFlag = 1 */
		} else {
			break;
		}
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_rsn. */

uint32_t dot11f_pack_ie_rsniie(tpAniSirGlobal pCtx,
			       tDot11fIERSNIIE *pSrc,
			       uint8_t *pBuf,
			       uint32_t nBuf,
			       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 65;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->rsni;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_rsniie. */

uint32_t dot11f_pack_ie_rsn_opaque(tpAniSirGlobal pCtx,
				  tDot11fIERSNOpaque *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_data;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 48;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->data), pSrc->num_data);
		*pnConsumed += pSrc->num_data;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_rsn_opaque. */

uint32_t dot11f_pack_ie_supp_channels(tpAniSirGlobal pCtx,
				     tDot11fIESuppChannels *pSrc,
				     uint8_t *pBuf,
				     uint32_t nBuf,
				     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_bands * 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 36;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->bands), (pSrc->num_bands * 2));
		*pnConsumed += (pSrc->num_bands * 2);
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_supp_channels. */

uint32_t dot11f_pack_ie_supp_operating_classes(tpAniSirGlobal pCtx,
					     tDot11fIESuppOperatingClasses *pSrc,
					     uint8_t *pBuf,
					     uint32_t nBuf,
					     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_classes;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 59;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->classes), pSrc->num_classes);
		*pnConsumed += pSrc->num_classes;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_supp_operating_classes. */

uint32_t dot11f_pack_ie_supp_rates(tpAniSirGlobal pCtx,
				  tDot11fIESuppRates *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_rates;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 1;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->rates), pSrc->num_rates);
		*pnConsumed += pSrc->num_rates;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_supp_rates. */

uint32_t dot11f_pack_ie_tim(tpAniSirGlobal pCtx,
			    tDot11fIETIM *pSrc,
			    uint8_t *pBuf,
			    uint32_t nBuf,
			    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  (pSrc->num_vbmp + 3);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 5;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->dtim_count;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->dtim_period;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->bmpctl;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->vbmp), pSrc->num_vbmp);
		*pnConsumed += pSrc->num_vbmp;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_tim. */

uint32_t dot11f_pack_ie_tpc_report(tpAniSirGlobal pCtx,
				  tDot11fIETPCReport *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 35;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->tx_power;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->link_margin;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_tpc_report. */

uint32_t dot11f_pack_ie_tpc_request(tpAniSirGlobal pCtx,
				   tDot11fIETPCRequest *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 0;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 34;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_tpc_request. */

uint32_t dot11f_pack_ie_time_advertisement(tpAniSirGlobal pCtx,
					  tDot11fIETimeAdvertisement *pSrc,
					  uint8_t *pBuf,
					  uint32_t nBuf,
					  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 16;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 69;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->timing_capabilities;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->time_value, 10);
		*pnConsumed += 10;
		pBuf += 10;
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->time_error, 5);
		*pnConsumed += 5;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_time_advertisement. */

uint32_t dot11f_pack_ie_timeout_interval(tpAniSirGlobal pCtx,
					tDot11fIETimeoutInterval *pSrc,
					uint8_t *pBuf,
					uint32_t nBuf,
					uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 5;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 56;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->timeoutType;
		*pnConsumed += 1;
		pBuf += 1;
		frameshtonl(pCtx, pBuf, pSrc->timeoutValue, 0);
		*pnConsumed += 4;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_timeout_interval. */

uint32_t dot11f_pack_ie_vht_ext_bss_load(tpAniSirGlobal pCtx,
				      tDot11fIEVHTExtBssLoad *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 5;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 193;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->muMIMOCapStaCount;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->ssUnderUtil;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->FortyMHzUtil;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->EightyMHzUtil;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->OneSixtyMHzUtil;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_vht_ext_bss_load. */

uint32_t dot11f_pack_ie_vendor1_ie(tpAniSirGlobal pCtx,
				  tDot11fIEVendor1IE *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 0;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x10;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x18;
		++pBuf; ++(*pnConsumed);
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_vendor1_ie. */

uint32_t dot11f_pack_ie_vendor3_ie(tpAniSirGlobal pCtx,
				  tDot11fIEVendor3IE *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 0;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x16;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x32;
		++pBuf; ++(*pnConsumed);
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_vendor3_ie. */

uint32_t dot11f_pack_ie_wapi(tpAniSirGlobal pCtx,
			     tDot11fIEWAPI *pSrc,
			     uint8_t *pBuf,
			     uint32_t nBuf,
			     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint16_t tmp119__;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_iewapi(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 68;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		frameshtons(pCtx, pBuf, pSrc->version, 0);
		*pnConsumed += 2;
		pBuf += 2;
		frameshtons(pCtx, pBuf, pSrc->akm_suite_count, 0);
		*pnConsumed += 2;
		pBuf += 2;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->akm_suites), (pSrc->akm_suite_count * 4));
		*pnConsumed += (pSrc->akm_suite_count * 4);
		pBuf += (pSrc->akm_suite_count * 4);
		frameshtons(pCtx, pBuf, pSrc->unicast_cipher_suite_count, 0);
		*pnConsumed += 2;
		pBuf += 2;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->unicast_cipher_suites), (pSrc->unicast_cipher_suite_count * 4));
		*pnConsumed += (pSrc->unicast_cipher_suite_count * 4);
		pBuf += (pSrc->unicast_cipher_suite_count * 4);
		DOT11F_MEMCPY(pCtx, pBuf, pSrc->multicast_cipher_suite, 4);
		*pnConsumed += 4;
		pBuf += 4;
		tmp119__ = 0U;
		tmp119__ |= (pSrc->preauth << 0);
		tmp119__ |= (pSrc->reserved << 1);
		frameshtons(pCtx, pBuf, tmp119__, 0);
		*pnConsumed += 2;
		pBuf += 2;
		nBuf -=  2 ;
		if (pSrc->bkid_count) {
			frameshtons(pCtx, pBuf, pSrc->bkid_count, 0);
			*pnConsumed += 2;
			pBuf += 2;
		} else {
			break;
		}
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->bkid), (pSrc->bkid_count * 16));
		*pnConsumed += (pSrc->bkid_count * 16);
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_wapi. */

uint32_t dot11f_pack_ie_wapi_opaque(tpAniSirGlobal pCtx,
				   tDot11fIEWAPIOpaque *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_data;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 68;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->data), pSrc->num_data);
		*pnConsumed += pSrc->num_data;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wapi_opaque. */

uint32_t dot11f_pack_ie_wfatpc(tpAniSirGlobal pCtx,
			       tDot11fIEWFATPC *pSrc,
			       uint8_t *pBuf,
			       uint32_t nBuf,
			       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x8;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->txPower;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->linkMargin;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wfatpc. */

uint32_t dot11f_pack_ie_wfdie_opaque(tpAniSirGlobal pCtx,
				    tDot11fIEWFDIEOpaque *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_data;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x6f;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x9a;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xa;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->data), pSrc->num_data);
		*pnConsumed += pSrc->num_data;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wfdie_opaque. */

uint32_t dot11f_pack_ie_wmm_caps(tpAniSirGlobal pCtx,
				tDot11fIEWMMCaps *pSrc,
				uint8_t *pBuf,
				uint32_t nBuf,
				uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp120__;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x5;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->version;
		*pnConsumed += 1;
		pBuf += 1;
		tmp120__ = 0U;
		tmp120__ |= (pSrc->reserved << 0);
		tmp120__ |= (pSrc->qack << 4);
		tmp120__ |= (pSrc->queue_request << 5);
		tmp120__ |= (pSrc->txop_request << 6);
		tmp120__ |= (pSrc->more_ack << 7);
		*pBuf = tmp120__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wmm_caps. */

uint32_t dot11f_pack_ie_wmm_info_ap(tpAniSirGlobal pCtx,
				  tDot11fIEWMMInfoAp *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp121__;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->version;
		*pnConsumed += 1;
		pBuf += 1;
		tmp121__ = 0U;
		tmp121__ |= (pSrc->param_set_count << 0);
		tmp121__ |= (pSrc->reserved << 4);
		tmp121__ |= (pSrc->uapsd << 7);
		*pBuf = tmp121__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wmm_info_ap. */

uint32_t dot11f_pack_ie_wmm_info_station(tpAniSirGlobal pCtx,
				       tDot11fIEWMMInfoStation *pSrc,
				       uint8_t *pBuf,
				       uint32_t nBuf,
				       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp122__;
	nNeeded  += 2;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->version;
		*pnConsumed += 1;
		pBuf += 1;
		tmp122__ = 0U;
		tmp122__ |= (pSrc->acvo_uapsd << 0);
		tmp122__ |= (pSrc->acvi_uapsd << 1);
		tmp122__ |= (pSrc->acbk_uapsd << 2);
		tmp122__ |= (pSrc->acbe_uapsd << 3);
		tmp122__ |= (pSrc->reserved1 << 4);
		tmp122__ |= (pSrc->max_sp_length << 5);
		tmp122__ |= (pSrc->reserved2 << 7);
		*pBuf = tmp122__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wmm_info_station. */

uint32_t dot11f_pack_ie_wmm_params(tpAniSirGlobal pCtx,
				  tDot11fIEWMMParams *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp123__;
	uint8_t tmp124__;
	uint8_t tmp125__;
	uint8_t tmp126__;
	uint8_t tmp127__;
	uint8_t tmp128__;
	uint8_t tmp129__;
	uint8_t tmp130__;
	nNeeded  += 19;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x1;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->version;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->qosInfo;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->reserved2;
		*pnConsumed += 1;
		pBuf += 1;
		tmp123__ = 0U;
		tmp123__ |= (pSrc->acbe_aifsn << 0);
		tmp123__ |= (pSrc->acbe_acm << 4);
		tmp123__ |= (pSrc->acbe_aci << 5);
		tmp123__ |= (pSrc->unused1 << 7);
		*pBuf = tmp123__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp124__ = 0U;
		tmp124__ |= (pSrc->acbe_acwmin << 0);
		tmp124__ |= (pSrc->acbe_acwmax << 4);
		*pBuf = tmp124__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		frameshtons(pCtx, pBuf, pSrc->acbe_txoplimit, 0);
		*pnConsumed += 2;
		pBuf += 2;
		tmp125__ = 0U;
		tmp125__ |= (pSrc->acbk_aifsn << 0);
		tmp125__ |= (pSrc->acbk_acm << 4);
		tmp125__ |= (pSrc->acbk_aci << 5);
		tmp125__ |= (pSrc->unused2 << 7);
		*pBuf = tmp125__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp126__ = 0U;
		tmp126__ |= (pSrc->acbk_acwmin << 0);
		tmp126__ |= (pSrc->acbk_acwmax << 4);
		*pBuf = tmp126__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		frameshtons(pCtx, pBuf, pSrc->acbk_txoplimit, 0);
		*pnConsumed += 2;
		pBuf += 2;
		tmp127__ = 0U;
		tmp127__ |= (pSrc->acvi_aifsn << 0);
		tmp127__ |= (pSrc->acvi_acm << 4);
		tmp127__ |= (pSrc->acvi_aci << 5);
		tmp127__ |= (pSrc->unused3 << 7);
		*pBuf = tmp127__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp128__ = 0U;
		tmp128__ |= (pSrc->acvi_acwmin << 0);
		tmp128__ |= (pSrc->acvi_acwmax << 4);
		*pBuf = tmp128__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		frameshtons(pCtx, pBuf, pSrc->acvi_txoplimit, 0);
		*pnConsumed += 2;
		pBuf += 2;
		tmp129__ = 0U;
		tmp129__ |= (pSrc->acvo_aifsn << 0);
		tmp129__ |= (pSrc->acvo_acm << 4);
		tmp129__ |= (pSrc->acvo_aci << 5);
		tmp129__ |= (pSrc->unused4 << 7);
		*pBuf = tmp129__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		tmp130__ = 0U;
		tmp130__ |= (pSrc->acvo_acwmin << 0);
		tmp130__ |= (pSrc->acvo_acwmax << 4);
		*pBuf = tmp130__;
		*pnConsumed += 1;
		pBuf += 1;
		nBuf -=  1 ;
		frameshtons(pCtx, pBuf, pSrc->acvo_txoplimit, 0);
		*pnConsumed += 2;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wmm_params. */

uint32_t dot11f_pack_ie_wpa(tpAniSirGlobal pCtx,
			    tDot11fIEWPA *pSrc,
			    uint8_t *pBuf,
			    uint32_t nBuf,
			    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_iewpa(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x1;
		++pBuf; ++(*pnConsumed);
		frameshtons(pCtx, pBuf, pSrc->version, 0);
		*pnConsumed += 2;
		pBuf += 2;
		if (pSrc->multicast_cipher_present) {
			DOT11F_MEMCPY(pCtx, pBuf, pSrc->multicast_cipher, 4);
			*pnConsumed += 4;
			pBuf += 4;
		} else {
			break;
		}
		if (pSrc->unicast_cipher_count) {
			frameshtons(pCtx, pBuf, pSrc->unicast_cipher_count, 0);
			*pnConsumed += 2;
			pBuf += 2;
		} else {
			break;
		}
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->unicast_ciphers), (pSrc->unicast_cipher_count * 4));
		*pnConsumed += (pSrc->unicast_cipher_count * 4);
		pBuf += (pSrc->unicast_cipher_count * 4);
		if (pSrc->auth_suite_count) {
			frameshtons(pCtx, pBuf, pSrc->auth_suite_count, 0);
			*pnConsumed += 2;
			pBuf += 2;
		} else {
			break;
		}
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->auth_suites), (pSrc->auth_suite_count * 4));
		*pnConsumed += (pSrc->auth_suite_count * 4);
		pBuf += (pSrc->auth_suite_count * 4);
		if (pSrc->caps) {
			frameshtons(pCtx, pBuf, pSrc->caps, 0);
			*pnConsumed += 2;
			/* fieldsEndFlag = 1 */
		} else {
			break;
		}
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_wpa. */

uint32_t dot11f_pack_ie_wpa_opaque(tpAniSirGlobal pCtx,
				  tDot11fIEWPAOpaque *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_data;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x1;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->data), pSrc->num_data);
		*pnConsumed += pSrc->num_data;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wpa_opaque. */

uint32_t dot11f_pack_ie_wsc(tpAniSirGlobal pCtx,
			    tDot11fIEWSC *pSrc,
			    uint8_t *pBuf,
			    uint32_t nBuf,
			    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_iewsc(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x0;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0xf2;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x4;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_WSC +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_wsc. */

uint32_t dot11f_pack_ie_wsc_assoc_req(tpAniSirGlobal pCtx,
				    tDot11fIEWscAssocReq *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_ie_wsc_assoc_req(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x0;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0xf2;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x4;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_WscAssocReq +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_wsc_assoc_req. */

uint32_t dot11f_pack_ie_wsc_assoc_res(tpAniSirGlobal pCtx,
				    tDot11fIEWscAssocRes *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_ie_wsc_assoc_res(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x0;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0xf2;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x4;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_WscAssocRes +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_wsc_assoc_res. */

uint32_t dot11f_pack_ie_wsc_beacon(tpAniSirGlobal pCtx,
				  tDot11fIEWscBeacon *pSrc,
				  uint8_t *pBuf,
				  uint32_t nBuf,
				  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_ie_wsc_beacon(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x0;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0xf2;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x4;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_WscBeacon +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_wsc_beacon. */

uint32_t dot11f_pack_ie_wsc_beacon_probe_res(tpAniSirGlobal pCtx,
					  tDot11fIEWscBeaconProbeRes *pSrc,
					  uint8_t *pBuf,
					  uint32_t nBuf,
					  uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_ie_wsc_beacon_probe_res(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x0;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0xf2;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x4;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_WscBeaconProbeRes +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_wsc_beacon_probe_res. */

uint32_t dot11f_pack_ie_wsc_ie_opaque(tpAniSirGlobal pCtx,
				    tDot11fIEWscIEOpaque *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  pSrc->num_data;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x50;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0xf2;
		++pBuf; ++(*pnConsumed);
		*pBuf = 0x4;
		++pBuf; ++(*pnConsumed);
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->data), pSrc->num_data);
		*pnConsumed += pSrc->num_data;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_wsc_ie_opaque. */

uint32_t dot11f_pack_ie_wsc_probe_req(tpAniSirGlobal pCtx,
				    tDot11fIEWscProbeReq *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_ie_wsc_probe_req(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x0;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0xf2;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x4;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_WscProbeReq +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_wsc_probe_req. */

uint32_t dot11f_pack_ie_wsc_probe_res(tpAniSirGlobal pCtx,
				    tDot11fIEWscProbeRes *pSrc,
				    uint8_t *pBuf,
				    uint32_t nBuf,
				    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_ie_wsc_probe_res(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x0;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0xf2;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x4;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_WscProbeRes +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_wsc_probe_res. */

uint32_t dot11f_pack_ie_wsc_reassoc_res(tpAniSirGlobal pCtx,
				      tDot11fIEWscReassocRes *pSrc,
				      uint8_t *pBuf,
				      uint32_t nBuf,
				      uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t n, idx = 0, idxlast;
	uint32_t nConsumedSoFar, nConsumedNow;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	uint32_t nNeeded = 0U;
	status = dot11f_get_packed_ie_wsc_reassoc_res(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	if (nNeeded > nBuf)
		return DOT11F_BUFFER_OVERFLOW;
	(void)pCtx;
	if (pSrc->present) {
		do {
			nConsumedSoFar = *pnConsumed;
			*pBuf = 221;
			++pBuf; --nBuf; ++(*pnConsumed);
			pIeLen = pBuf;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x0;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x50;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0xf2;
			++pBuf; --nBuf; ++(*pnConsumed);
			*pBuf = 0x4;
			++pBuf; --nBuf; ++(*pnConsumed);
			n = (255 - 4) < nBuf ? (255 - 4) : nBuf;
			nConsumedNow = *pnConsumed;
			idxlast = idx;
			status = pack_tlv_core(pCtx, (uint8_t *)pSrc, pBuf, n,
					       pnConsumed,
					       TLVS_WscReassocRes +
					       idx, &idx);
			nConsumedNow = *pnConsumed - nConsumedNow;
			*pIeLen = *pnConsumed - nConsumedSoFar - 2;
			pBuf += nConsumedNow;
			nBuf -= nConsumedNow;
		} while (DOT11F_BUFFER_OVERFLOW == status && idxlast != idx);
	}
	return status;
} /* End dot11f_pack_ie_wsc_reassoc_res. */

uint32_t dot11f_pack_ie_ext_chan_switch_ann(tpAniSirGlobal pCtx,
					    tDot11fIEext_chan_switch_ann *pSrc,
					    uint8_t *pBuf,
					    uint32_t nBuf,
					    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 4;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 60;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->switch_mode;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->new_reg_class;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->new_channel;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->switch_count;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ext_chan_switch_ann. */

uint32_t dot11f_pack_ie_ht2040_bss_coexistence(tpAniSirGlobal pCtx,
					       tDot11fIEht2040_bss_coexistence *pSrc,
					       uint8_t *pBuf,
					       uint32_t nBuf,
					       uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint8_t tmp131__;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 72;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		tmp131__ = 0U;
		tmp131__ |= (pSrc->info_request << 0);
		tmp131__ |= (pSrc->forty_mhz_intolerant << 1);
		tmp131__ |= (pSrc->twenty_mhz_bsswidth_req << 2);
		tmp131__ |= (pSrc->obss_scan_exemption_req << 3);
		tmp131__ |= (pSrc->obss_scan_exemption_grant << 4);
		tmp131__ |= (pSrc->unused << 5);
		*pBuf = tmp131__;
		*pnConsumed += 1;
		/* fieldsEndFlag  = 1 */
		nBuf -=  1 ;
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ht2040_bss_coexistence. */

uint32_t dot11f_pack_ie_ht2040_bss_intolerant_report(tpAniSirGlobal pCtx,
						     tDot11fIEht2040_bss_intolerant_report *pSrc,
						     uint8_t *pBuf,
						     uint32_t nBuf,
						     uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  +=  (pSrc->num_channel_list + 1);
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 73;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->operating_class;
		*pnConsumed += 1;
		pBuf += 1;
		DOT11F_MEMCPY(pCtx, pBuf, &(pSrc->channel_list), pSrc->num_channel_list);
		*pnConsumed += pSrc->num_channel_list;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_ht2040_bss_intolerant_report. */

uint32_t dot11f_pack_ie_sec_chan_offset_ele(tpAniSirGlobal pCtx,
					    tDot11fIEsec_chan_offset_ele *pSrc,
					    uint8_t *pBuf,
					    uint32_t nBuf,
					    uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	nNeeded  += 1;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 62;
		++pBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; ++(*pnConsumed);
		*pBuf = pSrc->secondaryChannelOffset;
		*pnConsumed += 1;
		/* fieldsEndFlag = 1 */
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return DOT11F_PARSE_SUCCESS;
} /* End dot11f_pack_ie_sec_chan_offset_ele. */

uint32_t dot11f_pack_ie_vendor2_ie(tpAniSirGlobal pCtx,
				   tDot11fIEvendor2_ie *pSrc,
				   uint8_t *pBuf,
				   uint32_t nBuf,
				   uint32_t *pnConsumed)
{
	uint8_t *pIeLen = 0;
	uint32_t nConsumedOnEntry = *pnConsumed;
	uint32_t nNeeded = 0U;
	uint32_t status = DOT11F_PARSE_SUCCESS;
	status = dot11f_get_packed_ie_vendor2_ie(pCtx, pSrc, &nNeeded);
	if (!DOT11F_SUCCEEDED(status))
		return status;
	while (pSrc->present) {
		if (nNeeded > nBuf)
			return DOT11F_BUFFER_OVERFLOW;
		*pBuf = 221;
		++pBuf; --nBuf; ++(*pnConsumed);
		pIeLen = pBuf;
		++pBuf; --nBuf; ++(*pnConsumed);
		*pBuf = 0x0;
		++pBuf; --nBuf; ++(*pnConsumed);
		*pBuf = 0x90;
		++pBuf; --nBuf; ++(*pnConsumed);
		*pBuf = 0x4c;
		++pBuf; --nBuf; ++(*pnConsumed);
		*pBuf = pSrc->type;
		*pnConsumed += 1;
		pBuf += 1;
		*pBuf = pSrc->sub_type;
		*pnConsumed += 1;
		pBuf += 1;
		status = pack_core(pCtx,
				(uint8_t *)pSrc,
				pBuf,
				nBuf,
				pnConsumed,
				FFS_vendor2_ie,
				IES_vendor2_ie);
		break;
	}
	(void)pCtx;
	if (pIeLen) {
		*pIeLen = *pnConsumed - nConsumedOnEntry - 2;
	}
	return status;
} /* End dot11f_pack_ie_vendor2_ie. */

uint32_t dot11f_pack_add_ts_request(tpAniSirGlobal pCtx,
	tDot11fAddTSRequest *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_AddTSRequest, IES_AddTSRequest);

	return status;

} /* End dot11f_unpack_add_ts_request. */

uint32_t dot11f_pack_add_ts_response(tpAniSirGlobal pCtx,
	tDot11fAddTSResponse *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_AddTSResponse, IES_AddTSResponse);

	return status;

} /* End dot11f_unpack_add_ts_response. */

uint32_t dot11f_pack_assoc_request(tpAniSirGlobal pCtx,
	tDot11fAssocRequest *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_AssocRequest, IES_AssocRequest);

	return status;

} /* End dot11f_unpack_assoc_request. */

uint32_t dot11f_pack_assoc_response(tpAniSirGlobal pCtx,
	tDot11fAssocResponse *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_AssocResponse, IES_AssocResponse);

	return status;

} /* End dot11f_unpack_assoc_response. */

uint32_t dot11f_pack_authentication(tpAniSirGlobal pCtx,
	tDot11fAuthentication *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_Authentication, IES_Authentication);

	return status;

} /* End dot11f_unpack_authentication. */

uint32_t dot11f_pack_beacon(tpAniSirGlobal pCtx,
	tDot11fBeacon *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_Beacon, IES_Beacon);

	return status;

} /* End dot11f_unpack_beacon. */

uint32_t dot11f_pack_beacon1(tpAniSirGlobal pCtx,
	tDot11fBeacon1 *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_Beacon1, IES_Beacon1);

	return status;

} /* End dot11f_unpack_beacon1. */

uint32_t dot11f_pack_beacon2(tpAniSirGlobal pCtx,
	tDot11fBeacon2 *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_Beacon2, IES_Beacon2);

	return status;

} /* End dot11f_unpack_beacon2. */

uint32_t dot11f_pack_beacon_i_es(tpAniSirGlobal pCtx,
	tDot11fBeaconIEs *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_BeaconIEs, IES_BeaconIEs);

	return status;

} /* End dot11f_unpack_beacon_i_es. */

uint32_t dot11f_pack_channel_switch(tpAniSirGlobal pCtx,
	tDot11fChannelSwitch *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_ChannelSwitch, IES_ChannelSwitch);

	return status;

} /* End dot11f_unpack_channel_switch. */

uint32_t dot11f_pack_de_auth(tpAniSirGlobal pCtx,
	tDot11fDeAuth *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_DeAuth, IES_DeAuth);

	return status;

} /* End dot11f_unpack_de_auth. */

uint32_t dot11f_pack_del_ts(tpAniSirGlobal pCtx,
	tDot11fDelTS *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_DelTS, IES_DelTS);

	return status;

} /* End dot11f_unpack_del_ts. */

uint32_t dot11f_pack_disassociation(tpAniSirGlobal pCtx,
	tDot11fDisassociation *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_Disassociation, IES_Disassociation);

	return status;

} /* End dot11f_unpack_disassociation. */

uint32_t dot11f_pack_link_measurement_report(tpAniSirGlobal pCtx,
	tDot11fLinkMeasurementReport *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_LinkMeasurementReport, IES_LinkMeasurementReport);

	return status;

} /* End dot11f_unpack_link_measurement_report. */

uint32_t dot11f_pack_link_measurement_request(tpAniSirGlobal pCtx,
	tDot11fLinkMeasurementRequest *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_LinkMeasurementRequest, IES_LinkMeasurementRequest);

	return status;

} /* End dot11f_unpack_link_measurement_request. */

uint32_t dot11f_pack_measurement_report(tpAniSirGlobal pCtx,
	tDot11fMeasurementReport *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_MeasurementReport, IES_MeasurementReport);

	return status;

} /* End dot11f_unpack_measurement_report. */

uint32_t dot11f_pack_measurement_request(tpAniSirGlobal pCtx,
	tDot11fMeasurementRequest *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_MeasurementRequest, IES_MeasurementRequest);

	return status;

} /* End dot11f_unpack_measurement_request. */

uint32_t dot11f_pack_neighbor_report_request(tpAniSirGlobal pCtx,
	tDot11fNeighborReportRequest *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_NeighborReportRequest, IES_NeighborReportRequest);

	return status;

} /* End dot11f_unpack_neighbor_report_request. */

uint32_t dot11f_pack_neighbor_report_response(tpAniSirGlobal pCtx,
	tDot11fNeighborReportResponse *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_NeighborReportResponse, IES_NeighborReportResponse);

	return status;

} /* End dot11f_unpack_neighbor_report_response. */

uint32_t dot11f_pack_operating_mode(tpAniSirGlobal pCtx,
	tDot11fOperatingMode *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_OperatingMode, IES_OperatingMode);

	return status;

} /* End dot11f_unpack_operating_mode. */

uint32_t dot11f_pack_probe_request(tpAniSirGlobal pCtx,
	tDot11fProbeRequest *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_ProbeRequest, IES_ProbeRequest);

	return status;

} /* End dot11f_unpack_probe_request. */

uint32_t dot11f_pack_probe_response(tpAniSirGlobal pCtx,
	tDot11fProbeResponse *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_ProbeResponse, IES_ProbeResponse);

	return status;

} /* End dot11f_unpack_probe_response. */

uint32_t dot11f_pack_qos_map_configure(tpAniSirGlobal pCtx,
	tDot11fQosMapConfigure *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_QosMapConfigure, IES_QosMapConfigure);

	return status;

} /* End dot11f_unpack_qos_map_configure. */

uint32_t dot11f_pack_radio_measurement_report(tpAniSirGlobal pCtx,
	tDot11fRadioMeasurementReport *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_RadioMeasurementReport, IES_RadioMeasurementReport);

	return status;

} /* End dot11f_unpack_radio_measurement_report. */

uint32_t dot11f_pack_radio_measurement_request(tpAniSirGlobal pCtx,
	tDot11fRadioMeasurementRequest *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_RadioMeasurementRequest, IES_RadioMeasurementRequest);

	return status;

} /* End dot11f_unpack_radio_measurement_request. */

uint32_t dot11f_pack_re_assoc_request(tpAniSirGlobal pCtx,
	tDot11fReAssocRequest *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_ReAssocRequest, IES_ReAssocRequest);

	return status;

} /* End dot11f_unpack_re_assoc_request. */

uint32_t dot11f_pack_re_assoc_response(tpAniSirGlobal pCtx,
	tDot11fReAssocResponse *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_ReAssocResponse, IES_ReAssocResponse);

	return status;

} /* End dot11f_unpack_re_assoc_response. */

uint32_t dot11f_pack_sm_power_save(tpAniSirGlobal pCtx,
	tDot11fSMPowerSave *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_SMPowerSave, IES_SMPowerSave);

	return status;

} /* End dot11f_unpack_sm_power_save. */

uint32_t dot11f_pack_sa_query_req(tpAniSirGlobal pCtx,
	tDot11fSaQueryReq *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_SaQueryReq, IES_SaQueryReq);

	return status;

} /* End dot11f_unpack_sa_query_req. */

uint32_t dot11f_pack_sa_query_rsp(tpAniSirGlobal pCtx,
	tDot11fSaQueryRsp *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_SaQueryRsp, IES_SaQueryRsp);

	return status;

} /* End dot11f_unpack_sa_query_rsp. */

uint32_t dot11f_pack_tdls_dis_req(tpAniSirGlobal pCtx,
	tDot11fTDLSDisReq *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TDLSDisReq, IES_TDLSDisReq);

	return status;

} /* End dot11f_unpack_tdls_dis_req. */

uint32_t dot11f_pack_tdls_dis_rsp(tpAniSirGlobal pCtx,
	tDot11fTDLSDisRsp *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TDLSDisRsp, IES_TDLSDisRsp);

	return status;

} /* End dot11f_unpack_tdls_dis_rsp. */

uint32_t dot11f_pack_tdls_peer_traffic_ind(tpAniSirGlobal pCtx,
	tDot11fTDLSPeerTrafficInd *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TDLSPeerTrafficInd, IES_TDLSPeerTrafficInd);

	return status;

} /* End dot11f_unpack_tdls_peer_traffic_ind. */

uint32_t dot11f_pack_tdls_peer_traffic_rsp(tpAniSirGlobal pCtx,
	tDot11fTDLSPeerTrafficRsp *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TDLSPeerTrafficRsp, IES_TDLSPeerTrafficRsp);

	return status;

} /* End dot11f_unpack_tdls_peer_traffic_rsp. */

uint32_t dot11f_pack_tdls_setup_cnf(tpAniSirGlobal pCtx,
	tDot11fTDLSSetupCnf *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TDLSSetupCnf, IES_TDLSSetupCnf);

	return status;

} /* End dot11f_unpack_tdls_setup_cnf. */

uint32_t dot11f_pack_tdls_setup_req(tpAniSirGlobal pCtx,
	tDot11fTDLSSetupReq *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TDLSSetupReq, IES_TDLSSetupReq);

	return status;

} /* End dot11f_unpack_tdls_setup_req. */

uint32_t dot11f_pack_tdls_setup_rsp(tpAniSirGlobal pCtx,
	tDot11fTDLSSetupRsp *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TDLSSetupRsp, IES_TDLSSetupRsp);

	return status;

} /* End dot11f_unpack_tdls_setup_rsp. */

uint32_t dot11f_pack_tdls_teardown(tpAniSirGlobal pCtx,
	tDot11fTDLSTeardown *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TDLSTeardown, IES_TDLSTeardown);

	return status;

} /* End dot11f_unpack_tdls_teardown. */

uint32_t dot11f_pack_tpc_report(tpAniSirGlobal pCtx,
	tDot11fTPCReport *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TPCReport, IES_TPCReport);

	return status;

} /* End dot11f_unpack_tpc_report. */

uint32_t dot11f_pack_tpc_request(tpAniSirGlobal pCtx,
	tDot11fTPCRequest *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TPCRequest, IES_TPCRequest);

	return status;

} /* End dot11f_unpack_tpc_request. */

uint32_t dot11f_pack_timing_advertisement_frame(tpAniSirGlobal pCtx,
	tDot11fTimingAdvertisementFrame *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_TimingAdvertisementFrame, IES_TimingAdvertisementFrame);

	return status;

} /* End dot11f_unpack_timing_advertisement_frame. */

uint32_t dot11f_pack_vht_gid_management_action_frame(tpAniSirGlobal pCtx,
	tDot11fVHTGidManagementActionFrame *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_VHTGidManagementActionFrame, IES_VHTGidManagementActionFrame);

	return status;

} /* End dot11f_unpack_vht_gid_management_action_frame. */

uint32_t dot11f_pack_wmm_add_ts_request(tpAniSirGlobal pCtx,
	tDot11fWMMAddTSRequest *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_WMMAddTSRequest, IES_WMMAddTSRequest);

	return status;

} /* End dot11f_unpack_wmm_add_ts_request. */

uint32_t dot11f_pack_wmm_add_ts_response(tpAniSirGlobal pCtx,
	tDot11fWMMAddTSResponse *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_WMMAddTSResponse, IES_WMMAddTSResponse);

	return status;

} /* End dot11f_unpack_wmm_add_ts_response. */

uint32_t dot11f_pack_wmm_del_ts(tpAniSirGlobal pCtx,
	tDot11fWMMDelTS *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_WMMDelTS, IES_WMMDelTS);

	return status;

} /* End dot11f_unpack_wmm_del_ts. */

uint32_t dot11f_pack_ht2040_bss_coexistence_mgmt_action_frame(tpAniSirGlobal pCtx,
	tDot11fht2040_bss_coexistence_mgmt_action_frame *pFrm,
	uint8_t *pBuf, uint32_t nBuf, uint32_t *pnConsumed)
{
	uint32_t i = 0;
	uint32_t status = 0;
	(void)i;
	*pnConsumed = 0U;
	status = pack_core(pCtx, (uint8_t *)pFrm, pBuf, nBuf, pnConsumed,
			   FFS_ht2040_bss_coexistence_mgmt_action_frame, IES_ht2040_bss_coexistence_mgmt_action_frame);

	return status;

} /* End dot11f_unpack_ht2040_bss_coexistence_mgmt_action_frame. */

static uint32_t pack_core(tpAniSirGlobal pCtx,
			   uint8_t *pSrc,
			   uint8_t *pBuf,
			   uint32_t  nBuf,
			   uint32_t *pnConsumed,
			   const tFFDefn  FFs[],
			   const tIEDefn  IEs[])
{
	const tFFDefn *pFf;
	const tIEDefn *pIe;
	tFRAMES_BOOL  *pfFound;
	uint8_t   *pBufRemaining;
	uint16_t  i;
	uint32_t  nBufRemaining, status, len;
	uint32_t  countOffset = 0;

	(void)pCtx; /* Shutup the compiler if we have no FFs nor IEs... */
	i = 0;

	DOT11F_PARAMETER_CHECK2(pSrc, pBuf, nBuf, pnConsumed);

	status = DOT11F_PARSE_SUCCESS;
	pBufRemaining = pBuf;
	nBufRemaining = nBuf;

	pFf = &(FFs[0]);
	while (pFf->size) {
		if (pFf->size > nBufRemaining) {
			FRAMES_LOG3(pCtx, FRLOGE, FRFL("The Fixed Field %s req"
				"uires %d bytes, but there are only %d remaining.\n"),
				pFf->name, pFf->size, nBufRemaining);
			return DOT11F_BUFFER_OVERFLOW;
		}

		switch (pFf->sig) {
		case SigFfAID:
			dot11f_pack_ff_aid(
				pCtx, (tDot11fFfAID *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfAction:
			dot11f_pack_ff_action(
				pCtx, (tDot11fFfAction *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfAuthAlgo:
			dot11f_pack_ff_auth_algo(
				pCtx, (tDot11fFfAuthAlgo *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfAuthSeqNo:
			dot11f_pack_ff_auth_seq_no(
				pCtx, (tDot11fFfAuthSeqNo *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfBeaconInterval:
			dot11f_pack_ff_beacon_interval(
				pCtx, (tDot11fFfBeaconInterval *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfCapabilities:
			dot11f_pack_ff_capabilities(
				pCtx, (tDot11fFfCapabilities *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfCategory:
			dot11f_pack_ff_category(
				pCtx, (tDot11fFfCategory *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfCurrentAPAddress:
			dot11f_pack_ff_current_ap_address(
				pCtx, (tDot11fFfCurrentAPAddress *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfDialogToken:
			dot11f_pack_ff_dialog_token(
				pCtx, (tDot11fFfDialogToken *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfLinkMargin:
			dot11f_pack_ff_link_margin(
				pCtx, (tDot11fFfLinkMargin *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfListenInterval:
			dot11f_pack_ff_listen_interval(
				pCtx, (tDot11fFfListenInterval *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfMaxTxPower:
			dot11f_pack_ff_max_tx_power(
				pCtx, (tDot11fFfMaxTxPower *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfNumOfRepetitions:
			dot11f_pack_ff_num_of_repetitions(
				pCtx, (tDot11fFfNumOfRepetitions *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfOperatingMode:
			dot11f_pack_ff_operating_mode(
				pCtx, (tDot11fFfOperatingMode *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfRCPI:
			dot11f_pack_ff_rcpi(
				pCtx, (tDot11fFfRCPI *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfRSNI:
			dot11f_pack_ff_rsni(
				pCtx, (tDot11fFfRSNI *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfReason:
			dot11f_pack_ff_reason(
				pCtx, (tDot11fFfReason *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfRxAntennaId:
			dot11f_pack_ff_rx_antenna_id(
				pCtx, (tDot11fFfRxAntennaId *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfSMPowerModeSet:
			dot11f_pack_ff_sm_power_mode_set(
				pCtx, (tDot11fFfSMPowerModeSet *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfStatus:
			dot11f_pack_ff_status(
				pCtx, (tDot11fFfStatus *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfStatusCode:
			dot11f_pack_ff_status_code(
				pCtx, (tDot11fFfStatusCode *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfTPCEleID:
			dot11f_pack_ff_tpc_ele_id(
				pCtx, (tDot11fFfTPCEleID *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfTPCEleLen:
			dot11f_pack_ff_tpc_ele_len(
				pCtx, (tDot11fFfTPCEleLen *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfTSInfo:
			dot11f_pack_ff_ts_info(
				pCtx, (tDot11fFfTSInfo *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfTimeStamp:
			dot11f_pack_ff_time_stamp(
				pCtx, (tDot11fFfTimeStamp *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfTransactionId:
			dot11f_pack_ff_transaction_id(
				pCtx, (tDot11fFfTransactionId *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfTxAntennaId:
			dot11f_pack_ff_tx_antenna_id(
				pCtx, (tDot11fFfTxAntennaId *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfTxPower:
			dot11f_pack_ff_tx_power(
				pCtx, (tDot11fFfTxPower *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfVhtMembershipStatusArray:
			dot11f_pack_ff_vht_membership_status_array(
				pCtx, (tDot11fFfVhtMembershipStatusArray *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		case SigFfVhtUserPositionArray:
			dot11f_pack_ff_vht_user_position_array(
				pCtx, (tDot11fFfVhtUserPositionArray *)
				(pSrc + pFf->offset), pBufRemaining);
			break;
		default:
			FRAMES_LOG1(pCtx, FRLOGE, FRFL("INTERNAL ERROR-- I don"
				"'t know about the Fixed Field %d; this is most l"
				"ikely a bug in 'framesg'.\n"), pFf->sig);
			return DOT11F_INTERNAL_ERROR;
		}

		pBufRemaining += pFf->size;
		nBufRemaining -= pFf->size;
		*pnConsumed   += pFf->size;
		++pFf;

	}

	pIe = &(IEs[0]);
	while (0xff != pIe->eid) {
		pfFound = (tFRAMES_BOOL *)(pSrc + pIe->offset +
				pIe->presenceOffset);
		if (*pfFound && pIe->minSize > nBufRemaining) {
			FRAMES_LOG3(pCtx, FRLOGE, FRFL("The IE %s takes at le"
				"ast %d bytes, but there are only %d left in the b"
				"uffer.\n"), pIe->name, pIe->minSize, nBufRemaining);
			return DOT11F_BUFFER_OVERFLOW;
		}


		countOffset = ((0 == pIe->arraybound) ?  1 : *(uint16_t *)(pSrc + pIe->countOffset));
		for (i = 0; i < countOffset; ++i) {
			len = 0U;
			switch (pIe->sig) {
			case SigIeCondensedCountryStr:
			status |=
				dot11f_pack_ie_condensed_country_str(
				pCtx, (tDot11fIECondensedCountryStr *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIECondensedCountryStr) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeGTK:
			status |=
				dot11f_pack_ie_gtk(
				pCtx, (tDot11fIEGTK *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEGTK) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeIGTK:
			status |=
				dot11f_pack_ie_igtk(
				pCtx, (tDot11fIEIGTK *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEIGTK) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeR0KH_ID:
			status |=
				dot11f_pack_ie_r0_kh_id(
				pCtx, (tDot11fIER0KH_ID *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIER0KH_ID) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeR1KH_ID:
			status |=
				dot11f_pack_ie_r1_kh_id(
				pCtx, (tDot11fIER1KH_ID *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIER1KH_ID) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeTSFInfo:
			status |=
				dot11f_pack_ie_tsf_info(
				pCtx, (tDot11fIETSFInfo *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIETSFInfo) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeAPChannelReport:
			status |=
				dot11f_pack_ie_ap_channel_report(
				pCtx, (tDot11fIEAPChannelReport *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEAPChannelReport) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeBcnReportingDetail:
			status |=
				dot11f_pack_ie_bcn_reporting_detail(
				pCtx, (tDot11fIEBcnReportingDetail *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEBcnReportingDetail) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeBeaconReportFrmBody:
			status |=
				dot11f_pack_ie_beacon_report_frm_body(
				pCtx, (tDot11fIEBeaconReportFrmBody *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEBeaconReportFrmBody) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeBeaconReporting:
			status |=
				dot11f_pack_ie_beacon_reporting(
				pCtx, (tDot11fIEBeaconReporting *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEBeaconReporting) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeMeasurementPilot:
			status |=
				dot11f_pack_ie_measurement_pilot(
				pCtx, (tDot11fIEMeasurementPilot *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEMeasurementPilot) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeMultiBssid:
			status |=
				dot11f_pack_ie_multi_bssid(
				pCtx, (tDot11fIEMultiBssid *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEMultiBssid) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeRICData:
			status |=
				dot11f_pack_ie_ric_data(
				pCtx, (tDot11fIERICData *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIERICData) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeRICDescriptor:
			status |=
				dot11f_pack_ie_ric_descriptor(
				pCtx, (tDot11fIERICDescriptor *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIERICDescriptor) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeRRMEnabledCap:
			status |=
				dot11f_pack_ie_rrm_enabled_cap(
				pCtx, (tDot11fIERRMEnabledCap *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIERRMEnabledCap) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeRequestedInfo:
			status |=
				dot11f_pack_ie_requested_info(
				pCtx, (tDot11fIERequestedInfo *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIERequestedInfo) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeSSID:
			status |=
				dot11f_pack_ie_ssid(
				pCtx, (tDot11fIESSID *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIESSID) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeSchedule:
			status |=
				dot11f_pack_ie_schedule(
				pCtx, (tDot11fIESchedule *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIESchedule) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeTCLAS:
			status |=
				dot11f_pack_ie_tclas(
				pCtx, (tDot11fIETCLAS *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIETCLAS) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeTCLASSPROC:
			status |=
				dot11f_pack_ie_tclassproc(
				pCtx, (tDot11fIETCLASSPROC *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIETCLASSPROC) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeTSDelay:
			status |=
				dot11f_pack_ie_ts_delay(
				pCtx, (tDot11fIETSDelay *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIETSDelay) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeTSPEC:
			status |=
				dot11f_pack_ie_tspec(
				pCtx, (tDot11fIETSPEC *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIETSPEC) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeVHTCaps:
			status |=
				dot11f_pack_ie_vht_caps(
				pCtx, (tDot11fIEVHTCaps *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEVHTCaps) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeVHTOperation:
			status |=
				dot11f_pack_ie_vht_operation(
				pCtx, (tDot11fIEVHTOperation *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEVHTOperation) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWMMSchedule:
			status |=
				dot11f_pack_ie_wmm_schedule(
				pCtx, (tDot11fIEWMMSchedule *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWMMSchedule) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWMMTCLAS:
			status |=
				dot11f_pack_ie_wmmtclas(
				pCtx, (tDot11fIEWMMTCLAS *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWMMTCLAS) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWMMTCLASPROC:
			status |=
				dot11f_pack_ie_wmmtclasproc(
				pCtx, (tDot11fIEWMMTCLASPROC *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWMMTCLASPROC) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWMMTSDelay:
			status |=
				dot11f_pack_ie_wmmts_delay(
				pCtx, (tDot11fIEWMMTSDelay *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWMMTSDelay) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWMMTSPEC:
			status |=
				dot11f_pack_ie_wmmtspec(
				pCtx, (tDot11fIEWMMTSPEC *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWMMTSPEC) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWiderBWChanSwitchAnn:
			status |=
				dot11f_pack_ie_wider_bw_chan_switch_ann(
				pCtx, (tDot11fIEWiderBWChanSwitchAnn *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWiderBWChanSwitchAnn) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeAID:
			status |=
				dot11f_pack_ie_aid(
				pCtx, (tDot11fIEAID *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEAID) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeCFParams:
			status |=
				dot11f_pack_ie_cf_params(
				pCtx, (tDot11fIECFParams *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIECFParams) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeChallengeText:
			status |=
				dot11f_pack_ie_challenge_text(
				pCtx, (tDot11fIEChallengeText *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEChallengeText) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeChanSwitchAnn:
			status |=
				dot11f_pack_ie_chan_switch_ann(
				pCtx, (tDot11fIEChanSwitchAnn *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEChanSwitchAnn) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeChannelSwitchWrapper:
			status |=
				dot11f_pack_ie_channel_switch_wrapper(
				pCtx, (tDot11fIEChannelSwitchWrapper *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEChannelSwitchWrapper) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeCountry:
			status |=
				dot11f_pack_ie_country(
				pCtx, (tDot11fIECountry *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIECountry) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeDSParams:
			status |=
				dot11f_pack_ie_ds_params(
				pCtx, (tDot11fIEDSParams *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEDSParams) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeEDCAParamSet:
			status |=
				dot11f_pack_ie_edca_param_set(
				pCtx, (tDot11fIEEDCAParamSet *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEEDCAParamSet) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeERPInfo:
			status |=
				dot11f_pack_ie_erp_info(
				pCtx, (tDot11fIEERPInfo *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEERPInfo) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeESECckmOpaque:
			status |=
				dot11f_pack_ie_ese_cckm_opaque(
				pCtx, (tDot11fIEESECckmOpaque *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEESECckmOpaque) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeESERadMgmtCap:
			status |=
				dot11f_pack_ie_ese_rad_mgmt_cap(
				pCtx, (tDot11fIEESERadMgmtCap *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEESERadMgmtCap) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeESETrafStrmMet:
			status |=
				dot11f_pack_ie_ese_traf_strm_met(
				pCtx, (tDot11fIEESETrafStrmMet *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEESETrafStrmMet) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeESETrafStrmRateSet:
			status |=
				dot11f_pack_ie_ese_traf_strm_rate_set(
				pCtx, (tDot11fIEESETrafStrmRateSet *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEESETrafStrmRateSet) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeESETxmitPower:
			status |=
				dot11f_pack_ie_ese_txmit_power(
				pCtx, (tDot11fIEESETxmitPower *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEESETxmitPower) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeESEVersion:
			status |=
				dot11f_pack_ie_ese_version(
				pCtx, (tDot11fIEESEVersion *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEESEVersion) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeExtCap:
			status |=
				dot11f_pack_ie_ext_cap(
				pCtx, (tDot11fIEExtCap *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEExtCap) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeExtSuppRates:
			status |=
				dot11f_pack_ie_ext_supp_rates(
				pCtx, (tDot11fIEExtSuppRates *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEExtSuppRates) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeFHParamSet:
			status |=
				dot11f_pack_ie_fh_param_set(
				pCtx, (tDot11fIEFHParamSet *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEFHParamSet) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeFHParams:
			status |=
				dot11f_pack_ie_fh_params(
				pCtx, (tDot11fIEFHParams *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEFHParams) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeFHPattTable:
			status |=
				dot11f_pack_ie_fh_patt_table(
				pCtx, (tDot11fIEFHPattTable *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEFHPattTable) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeFTInfo:
			status |=
				dot11f_pack_ie_ft_info(
				pCtx, (tDot11fIEFTInfo *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEFTInfo) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeHTCaps:
			status |=
				dot11f_pack_ie_ht_caps(
				pCtx, (tDot11fIEHTCaps *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEHTCaps) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeHTInfo:
			status |=
				dot11f_pack_ie_ht_info(
				pCtx, (tDot11fIEHTInfo *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEHTInfo) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeIBSSParams:
			status |=
				dot11f_pack_ie_ibss_params(
				pCtx, (tDot11fIEIBSSParams *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEIBSSParams) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeLinkIdentifier:
			status |=
				dot11f_pack_ie_link_identifier(
				pCtx, (tDot11fIELinkIdentifier *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIELinkIdentifier) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeMeasurementReport:
			status |=
				dot11f_pack_ie_measurement_report(
				pCtx, (tDot11fIEMeasurementReport *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEMeasurementReport) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeMeasurementRequest:
			status |=
				dot11f_pack_ie_measurement_request(
				pCtx, (tDot11fIEMeasurementRequest *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEMeasurementRequest) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeMobilityDomain:
			status |=
				dot11f_pack_ie_mobility_domain(
				pCtx, (tDot11fIEMobilityDomain *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEMobilityDomain) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeNeighborReport:
			status |=
				dot11f_pack_ie_neighbor_report(
				pCtx, (tDot11fIENeighborReport *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIENeighborReport) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeOBSSScanParameters:
			status |=
				dot11f_pack_ie_obss_scan_parameters(
				pCtx, (tDot11fIEOBSSScanParameters *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEOBSSScanParameters) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeOperatingMode:
			status |=
				dot11f_pack_ie_operating_mode(
				pCtx, (tDot11fIEOperatingMode *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEOperatingMode) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeP2PAssocReq:
			status |=
				dot11f_pack_ie_p2_p_assoc_req(
				pCtx, (tDot11fIEP2PAssocReq *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEP2PAssocReq) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeP2PAssocRes:
			status |=
				dot11f_pack_ie_p2_p_assoc_res(
				pCtx, (tDot11fIEP2PAssocRes *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEP2PAssocRes) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeP2PBeacon:
			status |=
				dot11f_pack_ie_p2_p_beacon(
				pCtx, (tDot11fIEP2PBeacon *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEP2PBeacon) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeP2PBeaconProbeRes:
			status |=
				dot11f_pack_ie_p2_p_beacon_probe_res(
				pCtx, (tDot11fIEP2PBeaconProbeRes *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEP2PBeaconProbeRes) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeP2PDeAuth:
			status |=
				dot11f_pack_ie_p2_p_de_auth(
				pCtx, (tDot11fIEP2PDeAuth *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEP2PDeAuth) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeP2PDisAssoc:
			status |=
				dot11f_pack_ie_p2_p_dis_assoc(
				pCtx, (tDot11fIEP2PDisAssoc *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEP2PDisAssoc) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeP2PIEOpaque:
			status |=
				dot11f_pack_ie_p2_pie_opaque(
				pCtx, (tDot11fIEP2PIEOpaque *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEP2PIEOpaque) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeP2PProbeReq:
			status |=
				dot11f_pack_ie_p2_p_probe_req(
				pCtx, (tDot11fIEP2PProbeReq *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEP2PProbeReq) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeP2PProbeRes:
			status |=
				dot11f_pack_ie_p2_p_probe_res(
				pCtx, (tDot11fIEP2PProbeRes *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEP2PProbeRes) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIePTIControl:
			status |=
				dot11f_pack_ie_pti_control(
				pCtx, (tDot11fIEPTIControl *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEPTIControl) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIePUBufferStatus:
			status |=
				dot11f_pack_ie_pu_buffer_status(
				pCtx, (tDot11fIEPUBufferStatus *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEPUBufferStatus) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIePowerCaps:
			status |=
				dot11f_pack_ie_power_caps(
				pCtx, (tDot11fIEPowerCaps *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEPowerCaps) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIePowerConstraints:
			status |=
				dot11f_pack_ie_power_constraints(
				pCtx, (tDot11fIEPowerConstraints *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEPowerConstraints) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeQBSSLoad:
			status |=
				dot11f_pack_ie_qbss_load(
				pCtx, (tDot11fIEQBSSLoad *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEQBSSLoad) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeQComVendorIE:
			status |=
				dot11f_pack_ie_QComVendorIE(
				pCtx, (tDot11fIEQComVendorIE *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEQComVendorIE) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeQOSCapsAp:
			status |=
				dot11f_pack_ie_qos_caps_ap(
				pCtx, (tDot11fIEQOSCapsAp *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEQOSCapsAp) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeQOSCapsStation:
			status |=
				dot11f_pack_ie_qos_caps_station(
				pCtx, (tDot11fIEQOSCapsStation *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEQOSCapsStation) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeQosMapSet:
			status |=
				dot11f_pack_ie_qos_map_set(
				pCtx, (tDot11fIEQosMapSet *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEQosMapSet) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeQuiet:
			status |=
				dot11f_pack_ie_quiet(
				pCtx, (tDot11fIEQuiet *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEQuiet) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeRCPIIE:
			status |=
				dot11f_pack_ie_rcpiie(
				pCtx, (tDot11fIERCPIIE *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIERCPIIE) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeRICDataDesc:
			status |=
				dot11f_pack_ie_ric_data_desc(
				pCtx, (tDot11fIERICDataDesc *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIERICDataDesc) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeRSN:
			status |=
				dot11f_pack_ie_rsn(
				pCtx, (tDot11fIERSN *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIERSN) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeRSNIIE:
			status |=
				dot11f_pack_ie_rsniie(
				pCtx, (tDot11fIERSNIIE *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIERSNIIE) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeRSNOpaque:
			status |=
				dot11f_pack_ie_rsn_opaque(
				pCtx, (tDot11fIERSNOpaque *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIERSNOpaque) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeSuppChannels:
			status |=
				dot11f_pack_ie_supp_channels(
				pCtx, (tDot11fIESuppChannels *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIESuppChannels) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeSuppOperatingClasses:
			status |=
				dot11f_pack_ie_supp_operating_classes(
				pCtx, (tDot11fIESuppOperatingClasses *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIESuppOperatingClasses) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeSuppRates:
			status |=
				dot11f_pack_ie_supp_rates(
				pCtx, (tDot11fIESuppRates *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIESuppRates) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeTIM:
			status |=
				dot11f_pack_ie_tim(
				pCtx, (tDot11fIETIM *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIETIM) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeTPCReport:
			status |=
				dot11f_pack_ie_tpc_report(
				pCtx, (tDot11fIETPCReport *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIETPCReport) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeTPCRequest:
			status |=
				dot11f_pack_ie_tpc_request(
				pCtx, (tDot11fIETPCRequest *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIETPCRequest) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeTimeAdvertisement:
			status |=
				dot11f_pack_ie_time_advertisement(
				pCtx, (tDot11fIETimeAdvertisement *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIETimeAdvertisement) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeTimeoutInterval:
			status |=
				dot11f_pack_ie_timeout_interval(
				pCtx, (tDot11fIETimeoutInterval *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIETimeoutInterval) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeVHTExtBssLoad:
			status |=
				dot11f_pack_ie_vht_ext_bss_load(
				pCtx, (tDot11fIEVHTExtBssLoad *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEVHTExtBssLoad) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeVendor1IE:
			status |=
				dot11f_pack_ie_vendor1_ie(
				pCtx, (tDot11fIEVendor1IE *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEVendor1IE) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeVendor3IE:
			status |=
				dot11f_pack_ie_vendor3_ie(
				pCtx, (tDot11fIEVendor3IE *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEVendor3IE) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWAPI:
			status |=
				dot11f_pack_ie_wapi(
				pCtx, (tDot11fIEWAPI *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWAPI) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWAPIOpaque:
			status |=
				dot11f_pack_ie_wapi_opaque(
				pCtx, (tDot11fIEWAPIOpaque *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWAPIOpaque) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWFATPC:
			status |=
				dot11f_pack_ie_wfatpc(
				pCtx, (tDot11fIEWFATPC *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWFATPC) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWFDIEOpaque:
			status |=
				dot11f_pack_ie_wfdie_opaque(
				pCtx, (tDot11fIEWFDIEOpaque *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWFDIEOpaque) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWMMCaps:
			status |=
				dot11f_pack_ie_wmm_caps(
				pCtx, (tDot11fIEWMMCaps *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWMMCaps) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWMMInfoAp:
			status |=
				dot11f_pack_ie_wmm_info_ap(
				pCtx, (tDot11fIEWMMInfoAp *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWMMInfoAp) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWMMInfoStation:
			status |=
				dot11f_pack_ie_wmm_info_station(
				pCtx, (tDot11fIEWMMInfoStation *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWMMInfoStation) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWMMParams:
			status |=
				dot11f_pack_ie_wmm_params(
				pCtx, (tDot11fIEWMMParams *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWMMParams) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWPA:
			status |=
				dot11f_pack_ie_wpa(
				pCtx, (tDot11fIEWPA *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWPA) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWPAOpaque:
			status |=
				dot11f_pack_ie_wpa_opaque(
				pCtx, (tDot11fIEWPAOpaque *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWPAOpaque) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWSC:
			status |=
				dot11f_pack_ie_wsc(
				pCtx, (tDot11fIEWSC *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWSC) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWscAssocReq:
			status |=
				dot11f_pack_ie_wsc_assoc_req(
				pCtx, (tDot11fIEWscAssocReq *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWscAssocReq) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWscAssocRes:
			status |=
				dot11f_pack_ie_wsc_assoc_res(
				pCtx, (tDot11fIEWscAssocRes *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWscAssocRes) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWscBeacon:
			status |=
				dot11f_pack_ie_wsc_beacon(
				pCtx, (tDot11fIEWscBeacon *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWscBeacon) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWscBeaconProbeRes:
			status |=
				dot11f_pack_ie_wsc_beacon_probe_res(
				pCtx, (tDot11fIEWscBeaconProbeRes *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWscBeaconProbeRes) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWscIEOpaque:
			status |=
				dot11f_pack_ie_wsc_ie_opaque(
				pCtx, (tDot11fIEWscIEOpaque *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWscIEOpaque) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWscProbeReq:
			status |=
				dot11f_pack_ie_wsc_probe_req(
				pCtx, (tDot11fIEWscProbeReq *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWscProbeReq) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWscProbeRes:
			status |=
				dot11f_pack_ie_wsc_probe_res(
				pCtx, (tDot11fIEWscProbeRes *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWscProbeRes) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeWscReassocRes:
			status |=
				dot11f_pack_ie_wsc_reassoc_res(
				pCtx, (tDot11fIEWscReassocRes *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEWscReassocRes) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeext_chan_switch_ann:
			status |=
				dot11f_pack_ie_ext_chan_switch_ann(
				pCtx, (tDot11fIEext_chan_switch_ann *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEext_chan_switch_ann) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeht2040_bss_coexistence:
			status |=
				dot11f_pack_ie_ht2040_bss_coexistence(
				pCtx, (tDot11fIEht2040_bss_coexistence *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEht2040_bss_coexistence) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIeht2040_bss_intolerant_report:
			status |=
				dot11f_pack_ie_ht2040_bss_intolerant_report(
				pCtx, (tDot11fIEht2040_bss_intolerant_report *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEht2040_bss_intolerant_report) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIesec_chan_offset_ele:
			status |=
				dot11f_pack_ie_sec_chan_offset_ele(
				pCtx, (tDot11fIEsec_chan_offset_ele *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEsec_chan_offset_ele) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			case SigIevendor2_ie:
			status |=
				dot11f_pack_ie_vendor2_ie(
				pCtx, (tDot11fIEvendor2_ie *)
				(pSrc + pIe->offset +
				sizeof(tDot11fIEvendor2_ie) * i),
				pBufRemaining, nBufRemaining, &len);
			break;
			default:
				FRAMES_LOG1(pCtx, FRLOGE, FRFL("INTERNAL ERROR-- I don"
				"'t know about the IE %d; this is most likely a b"
				"ug in 'framesc'.\n"), pFf->sig);
				return DOT11F_INTERNAL_ERROR;
			}

			pBufRemaining += len;
			nBufRemaining -= len;
			*pnConsumed   += len;
		}

		++pIe;

	}

	return status;

}

static uint32_t pack_tlv_core(tpAniSirGlobal pCtx,
				uint8_t *pSrc,
				uint8_t *pBuf,
				uint32_t  nBuf,
				uint32_t *pnConsumed,
				const tTLVDefn  TLVs[],
				uint32_t *pidx)
{
	const tTLVDefn *pTlv;
	tFRAMES_BOOL   *pfFound;
	uint8_t    *pBufRemaining;
	uint32_t   nBufRemaining, status, len;

	DOT11F_PARAMETER_CHECK2(pSrc, pBuf, nBuf, pnConsumed);

	(void)pCtx;
	status = DOT11F_PARSE_SUCCESS;
	pBufRemaining = pBuf;
	nBufRemaining = nBuf;

	pTlv = &(TLVs[0]);
	while (0xffff != pTlv->id) {
		pfFound = (tFRAMES_BOOL *)(pSrc + pTlv->offset +
					pTlv->presenceOffset);
		if (*pfFound && pTlv->minSize > nBufRemaining) {
			FRAMES_LOG3(pCtx, FRLOGE, FRFL("The TLV %s takes at least"
			    " %d bytes, but there are only %d left in the buffer."
			    "\n"), pTlv->name, pTlv->minSize, nBufRemaining);
			return DOT11F_BUFFER_OVERFLOW;
		}

		len = 0U;

		if (*pfFound) {
			switch (pTlv->sig) {
			case SigTlvAuthorizedMACs:
				status |=
					dot11f_pack_tlv_authorized_ma_cs(
					pCtx, (tDot11fTLVAuthorizedMACs *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvRequestToEnroll:
				status |=
					dot11f_pack_tlv_request_to_enroll(
					pCtx, (tDot11fTLVRequestToEnroll *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvVersion2:
				status |=
					dot11f_pack_tlv_version2(
					pCtx, (tDot11fTLVVersion2 *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvAPSetupLocked:
				status |=
					dot11f_pack_tlv_ap_setup_locked(
					pCtx, (tDot11fTLVAPSetupLocked *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvAssociationState:
				status |=
					dot11f_pack_tlv_association_state(
					pCtx, (tDot11fTLVAssociationState *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvConfigMethods:
				status |=
					dot11f_pack_tlv_config_methods(
					pCtx, (tDot11fTLVConfigMethods *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvConfigurationError:
				status |=
					dot11f_pack_tlv_configuration_error(
					pCtx, (tDot11fTLVConfigurationError *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvDeviceName:
				status |=
					dot11f_pack_tlv_device_name(
					pCtx, (tDot11fTLVDeviceName *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvDevicePasswordID:
				status |=
					dot11f_pack_tlv_device_password_id(
					pCtx, (tDot11fTLVDevicePasswordID *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvExtendedListenTiming:
				status |=
					dot11f_pack_tlv_extended_listen_timing(
					pCtx, (tDot11fTLVExtendedListenTiming *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvListenChannel:
				status |=
					dot11f_pack_tlv_listen_channel(
					pCtx, (tDot11fTLVListenChannel *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvManufacturer:
				status |=
					dot11f_pack_tlv_manufacturer(
					pCtx, (tDot11fTLVManufacturer *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvMinorReasonCode:
				status |=
					dot11f_pack_tlv_minor_reason_code(
					pCtx, (tDot11fTLVMinorReasonCode *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvModelName:
				status |=
					dot11f_pack_tlv_model_name(
					pCtx, (tDot11fTLVModelName *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvModelNumber:
				status |=
					dot11f_pack_tlv_model_number(
					pCtx, (tDot11fTLVModelNumber *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvNoticeOfAbsence:
				status |=
					dot11f_pack_tlv_notice_of_absence(
					pCtx, (tDot11fTLVNoticeOfAbsence *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvOperatingChannel:
				status |=
					dot11f_pack_tlv_operating_channel(
					pCtx, (tDot11fTLVOperatingChannel *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvP2PCapability:
				status |=
					dot11f_pack_tlv_p2_p_capability(
					pCtx, (tDot11fTLVP2PCapability *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvP2PDeviceId:
				status |=
					dot11f_pack_tlv_p2_p_device_id(
					pCtx, (tDot11fTLVP2PDeviceId *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvP2PDeviceInfo:
				status |=
					dot11f_pack_tlv_p2_p_device_info(
					pCtx, (tDot11fTLVP2PDeviceInfo *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvP2PGroupInfo:
				status |=
					dot11f_pack_tlv_p2_p_group_info(
					pCtx, (tDot11fTLVP2PGroupInfo *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvP2PStatus:
				status |=
					dot11f_pack_tlv_p2_p_status(
					pCtx, (tDot11fTLVP2PStatus *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvPrimaryDeviceType:
				status |=
					dot11f_pack_tlv_primary_device_type(
					pCtx, (tDot11fTLVPrimaryDeviceType *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvRFBands:
				status |=
					dot11f_pack_tlv_rf_bands(
					pCtx, (tDot11fTLVRFBands *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvRequestDeviceType:
				status |=
					dot11f_pack_tlv_request_device_type(
					pCtx, (tDot11fTLVRequestDeviceType *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvRequestType:
				status |=
					dot11f_pack_tlv_request_type(
					pCtx, (tDot11fTLVRequestType *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvResponseType:
				status |=
					dot11f_pack_tlv_response_type(
					pCtx, (tDot11fTLVResponseType *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvSelectedRegistrar:
				status |=
					dot11f_pack_tlv_selected_registrar(
					pCtx, (tDot11fTLVSelectedRegistrar *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvSelectedRegistrarConfigMethods:
				status |=
					dot11f_pack_tlv_selected_registrar_config_methods(
					pCtx, (tDot11fTLVSelectedRegistrarConfigMethods *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvSerialNumber:
				status |=
					dot11f_pack_tlv_serial_number(
					pCtx, (tDot11fTLVSerialNumber *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvUUID_E:
				status |=
					dot11f_pack_tlv_uuid_e(
					pCtx, (tDot11fTLVUUID_E *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvUUID_R:
				status |=
					dot11f_pack_tlv_uuid_r(
					pCtx, (tDot11fTLVUUID_R *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvVendorExtension:
				status |=
					dot11f_pack_tlv_vendor_extension(
					pCtx, (tDot11fTLVVendorExtension *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvVersion:
				status |=
					dot11f_pack_tlv_version(
					pCtx, (tDot11fTLVVersion *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvWPSState:
				status |=
					dot11f_pack_tlv_wps_state(
					pCtx, (tDot11fTLVWPSState *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvP2PInterface:
				status |=
					dot11f_pack_tlv_p2_p_interface(
					pCtx, (tDot11fTLVP2PInterface *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			case SigTlvP2PManageability:
				status |=
					dot11f_pack_tlv_p2_p_manageability(
					pCtx, (tDot11fTLVP2PManageability *)
					(pSrc + pTlv->offset), pBufRemaining,
					nBufRemaining, &len);
				break;
			default:
				FRAMES_LOG1(pCtx, FRLOGE, FRFL("INTERNAL ERROR-- I don't "
				    "know about the TLV %d; this is most likely a bug in "
				    "'framesc'.\n"), pTlv->sig);
				return DOT11F_INTERNAL_ERROR;
			}

		} /* End if on *pfFound */
		pBufRemaining += len;
		nBufRemaining -= len;
		*pnConsumed   += len;
		++pTlv;
		if (len)
			++*pidx;
	}

	return status;

}
