/*-
 * Copyright (c) 2001 Atsushi Onoe
 * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * GNU General Public License ("GPL") version 2 as published by the Free
 * Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $Id: ieee80211_output.c 2606 2007-07-25 15:14:52Z mrenzmann $
 */
#ifndef EXPORT_SYMTAB
#define	EXPORT_SYMTAB
#endif

/*
 * IEEE 802.11 output handling.
 */
#ifndef AUTOCONF_INCLUDED
#include <linux/config.h>
#endif
#include <linux/version.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>

#include <linux/if_arp.h>		/* for ARP proxy */
#include <linux/ip.h>			/* XXX for TOS */
#include <net/iw_handler.h>		/* wireless_send_event(..) */

#include "qtn/qtn_global.h"
#include "qtn/shared_params.h"
#include "qtn/hardware_revision.h"

#include "net80211/if_llc.h"
#include "net80211/if_ethersubr.h"
#include "net80211/if_media.h"
#include "net80211/ieee80211.h"

#include "net80211/ieee80211_var.h"
#include "net80211/ieee80211_dot11_msg.h"
#include "net80211/ieee80211_monitor.h"
#include "net80211/ieee80211_tdls.h"
#if defined(CONFIG_QTN_BSA_SUPPORT)
#include "net80211/ieee80211_bsa.h"
#endif

#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
#include "asm-generic/unaligned.h"
#endif

#include "qtn_logging.h"

#ifdef IEEE80211_DEBUG
/*
 * Decide if an outbound management frame should be
 * printed when debugging is enabled.  This filters some
 * of the less interesting frames that come frequently
 * (e.g. beacons).
 */
static __inline int
doprint(struct ieee80211vap *vap, int subtype)
{
	if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)
		return (vap->iv_opmode == IEEE80211_M_IBSS);
	return 1;
}
#endif

#define	senderr(_x, _v)	do { vap->iv_stats._v++; ret = (_x); goto bad; } while (0)

/*
 * Add the Quantenna OUI to a frame
 */
uint8_t
ieee80211_oui_add_qtn(uint8_t *oui)
{
	oui[0] = QTN_OUI & 0xff;
	oui[1] = (QTN_OUI >> 8) & 0xff;
	oui[2] = (QTN_OUI >> 16) & 0xff;

	return IEEE80211_OUI_LEN;
}
EXPORT_SYMBOL(ieee80211_oui_add_qtn);

void ieee80211_parent_queue_xmit(struct sk_buff *skb)
{
	struct ieee80211vap *vap = netdev_priv(skb->dev);

	skb->dev = vap->iv_dev;

	dev_queue_xmit(skb);
}

/*
 * Initialise an 802.11 header.
 * This should be called early on in constructing a frame as it sets i_fc[1]. Other bits can then be
 * OR'd in.
 */
static void
ieee80211_send_setup(struct ieee80211vap *vap, struct ieee80211_node *ni,
			struct ieee80211_frame *wh,
			const uint8_t type, const uint8_t subtype,
			const uint8_t *sa, const uint8_t *da, const uint8_t *bssid)
{
#define	WH4(wh)	((struct ieee80211_frame_addr4 *)wh)

	wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | type | subtype;
	if (type == IEEE80211_FC0_TYPE_DATA) {
		switch (vap->iv_opmode) {
		case IEEE80211_M_STA:
			wh->i_fc[1] = IEEE80211_FC1_DIR_TODS;
			IEEE80211_ADDR_COPY(wh->i_addr1, bssid);
			IEEE80211_ADDR_COPY(wh->i_addr2, sa);
			IEEE80211_ADDR_COPY(wh->i_addr3, da);
			break;
		case IEEE80211_M_IBSS:
		case IEEE80211_M_AHDEMO:
			wh->i_fc[1] = IEEE80211_FC1_DIR_NODS;
			IEEE80211_ADDR_COPY(wh->i_addr1, da);
			IEEE80211_ADDR_COPY(wh->i_addr2, sa);
			IEEE80211_ADDR_COPY(wh->i_addr3, bssid);
			break;
		case IEEE80211_M_HOSTAP:
			wh->i_fc[1] = IEEE80211_FC1_DIR_FROMDS;
			IEEE80211_ADDR_COPY(wh->i_addr1, da);
			IEEE80211_ADDR_COPY(wh->i_addr2, bssid);
			IEEE80211_ADDR_COPY(wh->i_addr3, sa);
			break;
		case IEEE80211_M_WDS:
			wh->i_fc[1] = IEEE80211_FC1_DIR_DSTODS;
			IEEE80211_ADDR_COPY(wh->i_addr1, bssid); /* bssid holds RA */
			IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr);
			IEEE80211_ADDR_COPY(wh->i_addr3, da);
			IEEE80211_ADDR_COPY(WH4(wh)->i_addr4, sa);
			break;
		case IEEE80211_M_MONITOR:
			break;
		}
	} else {
		wh->i_fc[1] = IEEE80211_FC1_DIR_NODS;
		IEEE80211_ADDR_COPY(wh->i_addr1, da);
		IEEE80211_ADDR_COPY(wh->i_addr2, sa);
		IEEE80211_ADDR_COPY(wh->i_addr3, bssid);
	}
	wh->i_dur[0] = 0;
	wh->i_dur[1] = 0;

	if (!(subtype & IEEE80211_FC0_SUBTYPE_QOS)) {
		*(__le16 *)&wh->i_seq[0] = htole16(ni->ni_txseqs[0] << IEEE80211_SEQ_SEQ_SHIFT);
		ni->ni_txseqs[0]++;
	}
#undef WH4
}

/*
 * Send an EAPOL frame to the specified node.
 * Use the MGMT frame path to ensure that EAPOL frames are high priority.
 */
void
ieee80211_eap_output(struct net_device *dev, const void *const eap_msg, const int eap_msg_len)
{
	struct ieee80211vap *vap = netdev_priv(dev);
	struct ieee80211com *ic = vap->iv_ic;
	struct ieee80211_node *ni;
	struct ieee80211_frame *wh;
	struct ieee80211_qosframe *qwh;
	const struct ether_header *const eh = eap_msg;
	uint8_t *frm;
	struct sk_buff *skb;
	struct llc *llc;
	int headerlen;
	uint8_t subtype;

	if (eap_msg_len <= sizeof(*eh)) {
		return;
	}

	if (vap->iv_opmode == IEEE80211_M_WDS) {
		IEEE80211_DPRINTF(vap, IEEE80211_MSG_DEBUG | IEEE80211_MSG_DOT1X,
			"[%pM] eap send failed - WDS not supported\n",
			eh->ether_dhost);
		return;
	}

	ni = ieee80211_find_node(&ic->ic_sta, eh->ether_dhost);
	if (!ni) {
		IEEE80211_DPRINTF(vap, IEEE80211_MSG_DEBUG | IEEE80211_MSG_DOT1X,
			"[%pM] eap send failed - node %s not found\n",
			eh->ether_dhost);
		return;
	}

	if (ni->ni_flags & IEEE80211_NODE_QOS) {
		headerlen = sizeof(*qwh);
		subtype = IEEE80211_FC0_SUBTYPE_QOS;
	} else {
		headerlen = sizeof(*wh);
		subtype = IEEE80211_FC0_SUBTYPE_DATA;
	}

	skb = ieee80211_getdataframe(vap, &frm, 1, eap_msg_len + LLC_SNAPFRAMELEN);
	if (!skb) {
		IEEE80211_DPRINTF(vap, IEEE80211_MSG_DEBUG | IEEE80211_MSG_DOT1X,
			"[%s] eap send failed - sbk alloc\n",
			ni->ni_macaddr);
		ieee80211_free_node(ni);
		return;
	}

	memcpy(frm, eap_msg, eap_msg_len);

	/* Replace the ethernet header with SNAP and 802.11 headers */
	skb_pull(skb, sizeof(*eh));

	llc = (struct llc *) skb_push(skb, LLC_SNAPFRAMELEN);
	llc->llc_dsap = llc->llc_ssap = LLC_SNAP_LSAP;
	llc->llc_control = LLC_UI;
	llc->llc_snap.org_code[0] = 0;
	llc->llc_snap.org_code[1] = 0;
	llc->llc_snap.org_code[2] = 0;
	llc->llc_snap.ether_type = htons(ETH_P_PAE);

	wh = (struct ieee80211_frame *) skb_push(skb, headerlen);

	ieee80211_send_setup(vap, ni, wh,
		IEEE80211_FC0_TYPE_DATA, subtype,
		vap->iv_myaddr, ni->ni_macaddr, ni->ni_bssid);

	skb_trim(skb, eap_msg_len - sizeof(*eh) + headerlen + LLC_SNAPFRAMELEN);

	if (ni->ni_flags & IEEE80211_NODE_QOS) {
		qwh = (struct ieee80211_qosframe *) wh;
		qwh->i_qos[0] = QTN_TID_WLAN;
		qwh->i_qos[1] = 0;
	}

	if (IEEE80211_VAP_IS_SLEEPING(ni->ni_vap))
		wh->i_fc[1] |= IEEE80211_FC1_PWR_MGT;

	IEEE80211_DPRINTF(vap, IEEE80211_MSG_DEBUG | IEEE80211_MSG_DOT1X,
		"[%pM] send eapol frame on channel %u\n",
		ni->ni_macaddr, ieee80211_chan2ieee(ic, ic->ic_curchan));

	IEEE80211_NODE_STAT(ni, tx_data);

	ieee80211_off_channel_suspend(vap, IEEE80211_OFFCHAN_TIMEOUT_EAPOL);

	ic->ic_send_80211(ic, ni, skb, WME_AC_VO, 0);
}
EXPORT_SYMBOL(ieee80211_eap_output);

/*
 * Send a management frame to the specified node.  The node pointer
 * must have a reference as the pointer will be passed to the driver
 * and potentially held for a long time.  If the frame is successfully
 * dispatched to the driver, then it is responsible for freeing the
 * reference (and potentially freeing up any associated storage).
 */
void
ieee80211_mgmt_output(struct ieee80211_node *ni, struct sk_buff *skb, int subtype,
			const u_int8_t da[IEEE80211_ADDR_LEN])
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = ni->ni_ic;
	struct ieee80211_frame *wh;

	KASSERT(ni != NULL, ("null node"));

	wh = (struct ieee80211_frame *) skb_push(skb, sizeof(struct ieee80211_frame));
	ieee80211_send_setup(vap, ni, wh, IEEE80211_FC0_TYPE_MGT, subtype,
		vap->iv_myaddr, da, ni->ni_bssid);

	/* FIXME power management */

	if (M_FLAG_ISSET(skb, M_LINK0) && ni->ni_challenge != NULL) {
		M_FLAG_CLR(skb, M_LINK0);
		IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_AUTH, wh->i_addr1,
			"encrypting frame (%s)", __func__);
		wh->i_fc[1] |= IEEE80211_FC1_PROT;
	}

	if (IEEE80211_VAP_IS_SLEEPING(ni->ni_vap))
		wh->i_fc[1] |= IEEE80211_FC1_PWR_MGT;

#ifdef IEEE80211_DEBUG
	if ((ieee80211_msg_debug(vap) && doprint(vap, subtype)) ||
	    ieee80211_msg_dumppkts(vap)) {
		printf("[%pM] send %s on channel %u\n",
			wh->i_addr1,
			ieee80211_mgt_subtype_name[
				(subtype & IEEE80211_FC0_SUBTYPE_MASK) >>
					IEEE80211_FC0_SUBTYPE_SHIFT],
			ieee80211_chan2ieee(ic, ic->ic_curchan));
	}
#endif
	IEEE80211_NODE_STAT(ni, tx_mgmt);

	ic->ic_send_80211(ic, ni, skb, WME_AC_VO, 1);
}
EXPORT_SYMBOL(ieee80211_mgmt_output);

void
ieee80211_tdls_mgmt_output(struct ieee80211_node *ni,
	struct sk_buff *skb, const uint8_t type,
	const uint8_t subtype, const uint8_t *da,
	const uint8_t *bssid)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = ni->ni_ic;
	struct ieee80211_frame *wh;

	KASSERT(ni != NULL, ("null node"));

	wh = (struct ieee80211_frame *)
		skb_push(skb, sizeof(struct ieee80211_frame));
	ieee80211_send_setup(vap, ni, wh,
		type, subtype, vap->iv_myaddr, da, bssid);

	if (M_FLAG_ISSET(skb, M_LINK0) && ni->ni_challenge != NULL) {
		M_FLAG_CLR(skb, M_LINK0);
		IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_AUTH, wh->i_addr1,
			"encrypting frame (%s)", __func__);
		wh->i_fc[1] |= IEEE80211_FC1_PROT;
	}

	/* XXX power management */
	if (IEEE80211_VAP_IS_SLEEPING(ni->ni_vap))
		wh->i_fc[1] |= IEEE80211_FC1_PWR_MGT;

#ifdef IEEE80211_DEBUG
	if ((ieee80211_msg_debug(vap) && doprint(vap, subtype)) ||
	    ieee80211_msg_dumppkts(vap)) {
		printf("[%s] send %s on channel %u\n",
			ether_sprintf(wh->i_addr1),
			ieee80211_mgt_subtype_name[
				(subtype & IEEE80211_FC0_SUBTYPE_MASK) >>
					IEEE80211_FC0_SUBTYPE_SHIFT],
			ieee80211_chan2ieee(ic, ic->ic_curchan));
	}
#endif
	IEEE80211_NODE_STAT(ni, tx_mgmt);

	ic->ic_send_80211(ic, ni, skb, WME_AC_VO, 1);
}
EXPORT_SYMBOL(ieee80211_tdls_mgmt_output);

/*
 * Send a null data frame to the specified node.
 *
 * NB: the caller is assumed to have setup a node reference
 *     for use; this is necessary to deal with a race condition
 *     when probing for inactive stations.
 */
int
ieee80211_send_nulldata(struct ieee80211_node *ni)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = ni->ni_ic;
	struct sk_buff *skb;
	struct ieee80211_frame *wh;
	uint8_t *frm;

	skb = ieee80211_getdataframe(vap, &frm, 0, 0);
	if (skb == NULL) {
		ieee80211_free_node(ni);
		return -ENOMEM;
	}

	wh = (struct ieee80211_frame *) skb_push(skb, sizeof(struct ieee80211_frame));
	ieee80211_send_setup(vap, ni, wh,
		IEEE80211_FC0_TYPE_DATA,
		IEEE80211_FC0_SUBTYPE_NODATA,
		vap->iv_myaddr, ni->ni_macaddr, ni->ni_bssid);

	/* NB: power management bit is never sent by an AP */
	if ((ni->ni_flags & IEEE80211_NODE_PWR_MGT) &&
			vap->iv_opmode != IEEE80211_M_HOSTAP &&
			vap->iv_opmode != IEEE80211_M_WDS)
		wh->i_fc[1] |= IEEE80211_FC1_PWR_MGT;

	IEEE80211_NODE_STAT(ni, tx_data);

	IEEE80211_DPRINTF(vap, IEEE80211_MSG_DEBUG | IEEE80211_MSG_DUMPPKTS,
		"[%s] send null data frame on channel %u, pwr mgt %s\n",
		ether_sprintf(ni->ni_macaddr),
		ieee80211_chan2ieee(ic, ic->ic_curchan),
		wh->i_fc[1] & IEEE80211_FC1_PWR_MGT ? "ena" : "dis");

	ic->ic_send_80211(ic, ni, skb, WME_AC_VO, 0);

	return 0;
}

/*
 * Send some tuning data packets for low level to do
 * power adjustment.
 */
int
ieee80211_send_tuning_data(struct ieee80211_node *ni)
{
	struct ieee80211com	*ic = ni->ni_ic;
	struct ieee80211vap	*vap = ni->ni_vap;
	struct sk_buff		*skb;
	struct ieee80211_frame	*wh;
	uint8_t			*frm;
	const uint8_t		da[IEEE80211_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};

	skb = ieee80211_getdataframe(vap, &frm, 0, 0);
	if (skb == NULL)
		return -ENOMEM;

	/* Fill up the frame header */
	wh = (struct ieee80211_frame *)skb_push(skb, sizeof(struct ieee80211_frame));

	wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_NODATA;
	wh->i_fc[1] = IEEE80211_FC1_DIR_FROMDS;

	IEEE80211_ADDR_COPY(wh->i_addr1, da);
	IEEE80211_ADDR_COPY(wh->i_addr2, ni->ni_bssid);
	IEEE80211_ADDR_COPY(wh->i_addr3, ni->ni_macaddr);

	wh->i_dur[0] = 0;
	wh->i_dur[1] = 0;

	ieee80211_ref_node(ni);

	/* No need to send these at high priority */
	(void)ic->ic_send_80211(ic, ni, skb, WME_AC_BE, 0);

	return 0;
}
EXPORT_SYMBOL(ieee80211_send_nulldata);

/*
 * Get null data on a particular AC to a node.
 *
 * The caller is assumed to have taken a node reference.
 */
struct sk_buff *
ieee80211_get_nulldata(struct ieee80211_node *ni)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct sk_buff *skb;
	struct ieee80211_frame *wh;
	uint8_t *frm;

	skb = ieee80211_getdataframe(vap, &frm, 0, 0);
	if (skb == NULL)
		return NULL;

	wh = (struct ieee80211_frame *)skb_push(skb, sizeof(struct ieee80211_frame));

	ieee80211_send_setup(vap, ni, (struct ieee80211_frame *)wh,
		IEEE80211_FC0_TYPE_DATA,
		IEEE80211_FC0_SUBTYPE_NODATA,
		vap->iv_myaddr,
		ni->ni_macaddr,
		ni->ni_bssid);

	if (IEEE80211_VAP_IS_SLEEPING(ni->ni_vap))
		wh->i_fc[1] |= IEEE80211_FC1_PWR_MGT;

	IEEE80211_NODE_STAT(ni, tx_data);

	return skb;
}
EXPORT_SYMBOL(ieee80211_get_nulldata);

/*
 * Get QoS null data on a particular AC to a node.
 *
 * The caller is assumed to have taken a node reference.
 */
struct sk_buff *
ieee80211_get_qosnulldata(struct ieee80211_node *ni, int ac)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = ni->ni_ic;
	struct sk_buff *skb;
	struct ieee80211_qosframe *qwh;
	uint8_t *frm;
	int tid;

	skb = ieee80211_getdataframe(vap, &frm, 1, 0);
	if (skb == NULL)
		return NULL;

	skb->priority = ac;
	qwh = (struct ieee80211_qosframe *)skb_push(skb, sizeof(struct ieee80211_qosframe));

	ieee80211_send_setup(vap, ni, (struct ieee80211_frame *)qwh,
		IEEE80211_FC0_TYPE_DATA,
		IEEE80211_FC0_SUBTYPE_QOS_NULL,
		vap->iv_myaddr,
		ni->ni_macaddr,
		ni->ni_bssid);

	if (IEEE80211_VAP_IS_SLEEPING(ni->ni_vap))
		qwh->i_fc[1] |= IEEE80211_FC1_PWR_MGT;

	tid = QTN_TID_WLAN;
	qwh->i_qos[0] = tid & IEEE80211_QOS_TID;
	if (ic->ic_wme.wme_wmeChanParams.cap_wmeParams[ac].wmm_noackPolicy)
		qwh->i_qos[0] |= (1 << IEEE80211_QOS_ACKPOLICY_S) & IEEE80211_QOS_ACKPOLICY;
	qwh->i_qos[1] = 0;

	IEEE80211_NODE_STAT(ni, tx_data);

	if (WME_UAPSD_AC_CAN_TRIGGER(skb->priority, ni)) {
		/* U-APSD power save queue */
		/* XXXAPSD: assuming triggerable means deliverable */
		M_FLAG_SET(skb, M_UAPSD);
	}

	return skb;
}
EXPORT_SYMBOL(ieee80211_get_qosnulldata);

/*
 * Send QoS null data on a particular AC to a node.
 *
 * The caller is assumed to have taken a node reference.
 */
int
ieee80211_send_qosnulldata(struct ieee80211_node *ni, int ac)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = ni->ni_ic;
	struct sk_buff *skb;

	skb = ieee80211_get_qosnulldata(ni, ac);
	if (skb == NULL) {
		ieee80211_free_node(ni);
		return -ENOMEM;
	}

	IEEE80211_DPRINTF(vap, IEEE80211_MSG_DEBUG | IEEE80211_MSG_DUMPPKTS,
			"[%s] send qos null data frame on channel %u\n",
			ether_sprintf(ni->ni_macaddr),
			ieee80211_chan2ieee(ic, ic->ic_curchan));
	ic->ic_send_80211(ic, ni, skb, ac, 0);

	return 0;
}
EXPORT_SYMBOL(ieee80211_send_qosnulldata);

int
ieee80211_send_qosnulldata_ext(struct ieee80211com *ic, uint8_t *mac_addr, int pwr_mgt)
{
#define	WH4(wh)	((struct ieee80211_frame_addr4 *)wh)
	struct ieee80211vap *vap;
	struct ieee80211_node *ni;
	struct sk_buff *skb;
	uint8_t *frm;
	struct ieee80211_qosframe *qwh;
	int ac;
	int tid;

	ni = ieee80211_find_node(&ic->ic_sta, mac_addr);
	if (!ni)
	      return -EINVAL;

	ac = WMM_AC_BK;
	vap = ni->ni_vap;
	skb = ieee80211_getdataframe(vap, &frm, 1, 0);
	if (skb == NULL) {
		ieee80211_free_node(ni);
		return -ENOMEM;
	}

	skb->priority = ac;
	qwh = (struct ieee80211_qosframe *)skb_push(skb, sizeof(struct ieee80211_qosframe_addr4));

	ieee80211_send_setup(vap, ni, (struct ieee80211_frame *)qwh,
		IEEE80211_FC0_TYPE_MGT,
		IEEE80211_FC0_SUBTYPE_QOS_NULL,
		vap->iv_myaddr,
		ni->ni_macaddr,
		ni->ni_bssid);
	qwh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS_NULL;

	if (pwr_mgt)
		qwh->i_fc[1] |= IEEE80211_FC1_PWR_MGT;

	tid = QTN_TID_WLAN;
	qwh->i_qos[0] = tid & IEEE80211_QOS_TID;
	if (ic->ic_wme.wme_wmeChanParams.cap_wmeParams[ac].wmm_noackPolicy)
		qwh->i_qos[0] |= (1 << IEEE80211_QOS_ACKPOLICY_S) & IEEE80211_QOS_ACKPOLICY;
	qwh->i_qos[1] = 0;

	IEEE80211_NODE_STAT(ni, tx_data);

	if (WME_UAPSD_AC_CAN_TRIGGER(skb->priority, ni)) {
		/* U-APSD power save queue */
		/* XXXAPSD: assuming triggerable means deliverable */
		M_FLAG_SET(skb, M_UAPSD);
	}
	IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_DEBUG | IEEE80211_MSG_DUMPPKTS,
			"[%s] send pwr_mgt(%d) data frame on channel %u\n",
			ether_sprintf(ni->ni_macaddr), pwr_mgt,
			ieee80211_chan2ieee(ic, ic->ic_curchan));

	ic->ic_send_80211(ic, ni, skb, ac, 0);

	return 0;
}
EXPORT_SYMBOL(ieee80211_send_qosnulldata_ext);

/*
 * Add transmit power envelope information element
 */
u_int8_t *
ieee80211_add_vhttxpwr_envelope(u_int8_t *frm, struct ieee80211com *ic)
{
	u_int32_t bw = ieee80211_get_bw(ic);
	struct ieee80211_ie_vtxpwren *ie = (struct ieee80211_ie_vtxpwren *)frm;
	u_int8_t local_max_tx_pwrcnt = 0;
	struct ieee80211_channel *des_chan = ic->ic_des_chan;

	if (des_chan == IEEE80211_CHAN_ANYC)
		return frm;

	switch (bw) {
		case BW_HT20:
			local_max_tx_pwrcnt = IEEE80211_TX_POW_FOR_20MHZ;
			break;
		case BW_HT40:
			local_max_tx_pwrcnt = IEEE80211_TX_POW_FOR_40MHZ;
			break;
		case BW_HT80:
			local_max_tx_pwrcnt = IEEE80211_TX_POW_FOR_80MHZ;
			break;
		default:
			local_max_tx_pwrcnt = IEEE80211_TX_POW_FOR_80MHZ;
	}

	ie->vtxpwren_id = IEEE80211_ELEMID_VHTXMTPWRENVLP;
	ie->vtxpwren_len = sizeof(struct ieee80211_ie_vtxpwren) - 2;

	ie->vtxpwren_txpwr_info = local_max_tx_pwrcnt;
	ie->vtxpwren_tp20 = des_chan->ic_maxregpower - ic->ic_pwr_constraint;
	ie->vtxpwren_tp40 = des_chan->ic_maxregpower - ic->ic_pwr_constraint;
	ie->vtxpwren_tp80 = des_chan->ic_maxregpower - ic->ic_pwr_constraint;
	ie->vtxpwren_tp160 = 0;

	frm += sizeof(struct ieee80211_ie_vtxpwren);
	return frm;
}

/*
 * Add wide-bandwidth Channel switch wrapper information element
 */
u_int8_t *
ieee80211_add_wband_chanswitch(u_int8_t *frm, struct ieee80211com *ic)
{
	u_int32_t bw = ieee80211_get_bw(ic);
	struct ieee80211_ie_wbchansw *ie = (struct ieee80211_ie_wbchansw *)frm;
	struct ieee80211_channel *des_chan = ic->ic_csa_chan;
	u_int32_t chwidth = 0;

	if (!des_chan || (des_chan == IEEE80211_CHAN_ANYC))
		return frm;

	ie->wbcs_id = IEEE80211_ELEMID_WBWCHANSWITCH;
	ie->wbcs_len = sizeof(struct ieee80211_ie_wbchansw) - 2;
	switch (bw) {
		case BW_HT20:
		case BW_HT40:
			chwidth = IEEE80211_VHTOP_CHAN_WIDTH_20_40MHZ;
			break;
		case BW_HT80:
			chwidth = IEEE80211_VHTOP_CHAN_WIDTH_80MHZ;
			break;
		default:
			chwidth = IEEE80211_VHTOP_CHAN_WIDTH_80MHZ;
	}

	ie->wbcs_newchanw = chwidth;
	if (bw == BW_HT40) {
		ie->wbcs_newchancf0 = des_chan->ic_center_f_40MHz;
		ie->wbcs_newchancf1 = 0;
	} else if (bw == BW_HT80) {
		ie->wbcs_newchancf0 = des_chan->ic_center_f_80MHz;
		ie->wbcs_newchancf1 = 0;
	} else {
		ie->wbcs_newchancf0 = 0;
		ie->wbcs_newchancf1 = 0;
	}

	frm += sizeof(struct ieee80211_ie_wbchansw);
	return frm;
}

/*
 * Add Channel switch wrapper information element
 */
u_int8_t *
ieee80211_add_chansw_wrap(u_int8_t *frm, struct ieee80211com *ic)
{
	struct ieee80211_ie_chsw_wrapper *ie = (struct ieee80211_ie_chsw_wrapper *) frm;
	u_int32_t bw = ieee80211_get_bw(ic);
	ie->chsw_id = IEEE80211_ELEMID_CHANSWITCHWRP;
	ie->chsw_len = 0;
	frm += sizeof(struct ieee80211_ie_chsw_wrapper);

	/* Wide bandwidth channel switch element */
	if (bw > BW_HT20) {
		ie->chsw_len += sizeof(struct ieee80211_ie_wbchansw);
		frm = ieee80211_add_wband_chanswitch(frm, ic);
	}
	/* VHT transmit power envelope */
	if ((ic->ic_flags & IEEE80211_F_DOTH) &&
	    (ic->ic_flags_ext & IEEE80211_FEXT_TPC)) {
		ie->chsw_len += sizeof(struct ieee80211_ie_vtxpwren);
		frm = ieee80211_add_vhttxpwr_envelope(frm, ic);
	}
	return frm;
}

/*
 * Add a supported rates element id to a frame.
 */
u_int8_t *
ieee80211_add_rates(u_int8_t *frm, const struct ieee80211_rateset *rs)
{
	int nrates;

	*frm++ = IEEE80211_ELEMID_RATES;
	nrates = rs->rs_nrates;
	if (nrates > IEEE80211_RATE_SIZE)
		nrates = IEEE80211_RATE_SIZE;
	*frm++ = nrates;
	memcpy(frm, rs->rs_rates, nrates);
	return frm + nrates;
}

/*
 * Add a Supported Channels element id to a frame.
 */
uint8_t*
ieee80211_add_supported_chans(uint8_t *frm, struct ieee80211com *ic)
{
	int band_idx;
	int first_chan;
	int temp_chan;
	int chan_cnt;
	int active_chan_cnt;
	uint8_t *ie_len;
	int cur_bw;
	uint8_t *chan_active;
	struct ieee80211_band_info *band;


	*frm++ = IEEE80211_ELEMID_SUPPCHAN;
	ie_len = frm++;
	*ie_len = 0;

	cur_bw = ieee80211_get_bw(ic);
	if (cur_bw == BW_HT20)
		chan_active = &ic->ic_chan_active_20[0];
	else if (cur_bw == BW_HT40)
		chan_active = &ic->ic_chan_active_40[0];
	else if (cur_bw == BW_HT80)
		chan_active = &ic->ic_chan_active_80[0];
	else
		chan_active = &ic->ic_chan_active[0];

	for (band_idx = 0; band_idx < IEEE80211_BAND_IDX_MAX; band_idx++) {
		band = ieee80211_get_band_info(band_idx);
		if (band == NULL)
			continue;

		first_chan = band->band_first_chan;
		chan_cnt = band->band_chan_cnt;
		active_chan_cnt = 0;
		for (temp_chan = first_chan; chan_cnt >= 0; chan_cnt--){
			if (isset(chan_active, temp_chan) && chan_cnt > 0) {
				active_chan_cnt++;
			} else if (active_chan_cnt) {
				*frm++ = first_chan;
				*frm++ = active_chan_cnt;
				*ie_len += 2;
				active_chan_cnt = 0;
			}

			if (active_chan_cnt == 1)
				first_chan = temp_chan;

			temp_chan += band->band_chan_step;
		}
	}

	return frm;
}


/*
 * Add an extended capabilities element id to a frame
 */
u_int8_t *
ieee80211_add_extcap(u_int8_t *frm)
{
	struct ieee80211_extcap_param *ie  = (struct ieee80211_extcap_param *)frm;

	memset(ie, 0, sizeof(struct ieee80211_extcap_param));

	ie->param_id = IEEE80211_ELEMID_EXTCAP;
	ie->param_len =	sizeof(struct ieee80211_extcap_param) - 2;
	/* max msdu in amsdu 0 = unlimited */
	ie->ext_cap[7] = IEEE80211_EXTCAP_OPMODE_NOTIFICATION;

	return frm + sizeof(struct ieee80211_extcap_param);
}

void
ieee80211_update_bss_tm(uint8_t *appie, int len, struct ieee80211com *ic, struct ieee80211vap *vap)
{
	size_t left = len;
	uint8_t *pos = appie;

	while (left >= 2) {
		uint8_t id;
		uint8_t elen;

		id = *pos++;
		elen = *pos++;
		left -= 2;

		if (elen > left) {
			IEEE80211_DPRINTF(vap, IEEE80211_MSG_ELEMID,
				"IEEE 802.11 element parse failed (id=%u elen=%u left=%u)",
				id, elen, left);
			return;
		}
		if (id == IEEE80211_ELEMID_EXTCAP) {
			if (IEEE80211_COM_BTM_ENABLED(ic)) {
				*(pos + 2) |= IEEE80211_EXTCAP_BTM;
			} else {
				*(pos + 2) &= ~IEEE80211_EXTCAP_BTM;
			}
			return;
		} else {
			left -= elen;
			pos += elen;
		}
	}
}

/*
 * Add an extended supported rates element id to a frame.
 */
u_int8_t *
ieee80211_add_xrates(u_int8_t *frm, const struct ieee80211_rateset *rs)
{
//FIXME
#if 1
	/*
	 * Add an extended supported rates element if operating in 11g/n mode.
	 * Only 11g rates are added. 11n Rates are published via ht cap */
	if (rs->rs_nrates > IEEE80211_RATE_SIZE) {
		int nrates = rs->rs_legacy_nrates - IEEE80211_RATE_SIZE;
		if(nrates)
		{
			*frm++ = IEEE80211_ELEMID_XRATES;
			*frm++ = nrates;
			memcpy(frm, rs->rs_rates + IEEE80211_RATE_SIZE, nrates);
			frm += nrates;
		}
	}
#else
	/* Add BSS membership selector (HT == 0x7F)*/
	*frm++ = IEEE80211_ELEMID_XRATES;
	*frm++ = 1;
	*frm++ = 0x7F;
#endif
	return frm;
}

/*
 * Add an ssid elemet to a frame.
 */
static u_int8_t *
ieee80211_add_ssid(u_int8_t *frm, const u_int8_t *ssid, u_int len)
{
	*frm++ = IEEE80211_ELEMID_SSID;
	*frm++ = len;
	memcpy(frm, ssid, len);
	return frm + len;
}

/*
 * Add an csa element to a frame.
 */
u_int8_t *
ieee80211_add_csa(u_int8_t *frm,
		u_int8_t csa_mode,
		u_int8_t csa_chan,
		u_int8_t csa_count)
{
	*frm++ = IEEE80211_ELEMID_CHANSWITCHANN;
	*frm++ = 3;
	*frm++ = csa_mode;
	*frm++ = csa_chan;
	*frm++ = csa_count;

	return frm;
}

/*
 * Add secondary channel offset element to a frame.
 */
void ieee80211_add_sec_chan_off(u_int8_t **frm,
		struct ieee80211com *ic,
		uint8_t csa_chan)
{
	struct ieee80211_channel *chan = NULL;
	uint8_t sec_position = IEEE80211_HTINFO_EXTOFFSET_NA;
        struct ieee80211_ie_sec_chan_off *sco = (struct ieee80211_ie_sec_chan_off *)(*frm);
	uint32_t curr_bw = ieee80211_get_bw(ic);

	chan = ieee80211_find_channel_by_ieee(ic, csa_chan);

	if (chan && (curr_bw >= BW_HT40)) {
		if (chan->ic_flags & IEEE80211_CHAN_HT40D) {
			sec_position = IEEE80211_HTINFO_EXTOFFSET_BELOW;
		} else if (chan->ic_flags & IEEE80211_CHAN_HT40U) {
			sec_position = IEEE80211_HTINFO_EXTOFFSET_ABOVE;
		}
	}

        sco->sco_id = IEEE80211_ELEMID_SEC_CHAN_OFF;
        sco->sco_len = 1;
        sco->sco_off = sec_position;

        *frm += sizeof(struct ieee80211_ie_sec_chan_off);

	return;
}

/*
 * Add an erp element to a frame.
 */
u_int8_t *
ieee80211_add_erp(u_int8_t *frm, struct ieee80211com *ic)
{
	u_int8_t erp;

	*frm++ = IEEE80211_ELEMID_ERP;
	*frm++ = 1;
	erp = 0;
	if (ic->ic_nonerpsta != 0)
		erp |= IEEE80211_ERP_NON_ERP_PRESENT;
	if (ic->ic_flags & IEEE80211_F_USEPROT)
		erp |= IEEE80211_ERP_USE_PROTECTION;
	if (ic->ic_flags & IEEE80211_F_USEBARKER)
		erp |= IEEE80211_ERP_LONG_PREAMBLE;
	*frm++ = erp;
	return frm;
}

/*
 * Add a country information element to a frame.
 */
u_int8_t *
ieee80211_add_country(u_int8_t *frm, struct ieee80211com *ic)
{
	/* add country code */
	memcpy(frm, (u_int8_t *)&ic->ic_country_ie,
		ic->ic_country_ie.country_len + 2);
	frm +=  ic->ic_country_ie.country_len + 2;
	return frm;
}

/*
 * Add BSS load element to frame
 */
u_int8_t *
ieee80211_add_bss_load(u_int8_t *frm, struct ieee80211vap *vap)
{
	struct shared_params *sp = qtn_mproc_sync_shared_params_get();

	*frm++ = IEEE80211_ELEMID_BSS_LOAD;
	*frm++ = 5;
	ADDINT16LE(frm, vap->iv_sta_assoc);
	*frm++ = sp->chan_util;
	/* TODO: Available Admission Capacity
	 * parameters need to be updated with correct values */
	put_unaligned(0xffff, (__le16 *)frm);
	frm += 2;

	return frm;
}

/*
 * Add RRM Enabled capabilities information element to frame
 */
u_int8_t *
ieee80211_add_rrm_enabled(u_int8_t *frm, struct ieee80211vap *vap)
{
	struct ieee80211_ie_rrm *ie = (struct ieee80211_ie_rrm *)frm;

	memset(ie, 0, sizeof(*ie));
	ie->id = IEEE80211_ELEMID_RRM_ENABLED;
	ie->len = (uint8_t)sizeof(*ie) - IEEE80211_IE_ID_LEN_SIZE;

	/* set neigbor report capable bit */
	if (IEEE80211_COM_NEIGHREPORT_ENABLED(vap->iv_ic)) {
		ie->cap[0] |= IEEE80211_RM_NEIGH_REPORT_CAP;
	} else {
		ie->cap[0] = 0;
	}

	return frm + sizeof(*ie);
}


static u_int8_t *
ieee80211_setup_wpa_ie(struct ieee80211vap *vap, u_int8_t *ie)
{
#define	WPA_OUI_BYTES		0x00, 0x50, 0xf2
#define	ADDSHORT(frm, v) do {			\
	frm[0] = (v) & 0xff;			\
	frm[1] = (v) >> 8;			\
	frm += 2;				\
} while (0)
#define	ADDSELECTOR(frm, sel) do {		\
	memcpy(frm, sel, 4);			\
	frm += 4;				\
} while (0)
	static const u_int8_t oui[4] = { WPA_OUI_BYTES, WPA_RSN_OUI_TYPE };
	static const u_int8_t cipher_suite[][4] = {
		{ WPA_OUI_BYTES, WPA_CSE_WEP40 },	/* NB: 40-bit */
		{ WPA_OUI_BYTES, WPA_CSE_TKIP },
		{ 0x00, 0x00, 0x00, 0x00 },		/* XXX WRAP */
		{ WPA_OUI_BYTES, WPA_CSE_CCMP },
		{ 0x00, 0x00, 0x00, 0x00 },		/* XXX CKIP */
		{ WPA_OUI_BYTES, WPA_CSE_NULL },
	};
	static const u_int8_t wep104_suite[4] =
		{ WPA_OUI_BYTES, WPA_CSE_WEP104 };
	static const u_int8_t key_mgt_unspec[4] =
		{ WPA_OUI_BYTES, WPA_ASE_8021X_UNSPEC };
	static const u_int8_t key_mgt_psk[4] =
		{ WPA_OUI_BYTES, WPA_ASE_8021X_PSK };
	const struct ieee80211_rsnparms *rsn = &vap->iv_bss->ni_rsn;
	u_int8_t *frm = ie;
	u_int8_t *selcnt;
	struct ieee80211com *ic = vap->iv_ic;

	*frm++ = IEEE80211_ELEMID_VENDOR;
	*frm++ = 0;				/* length filled in below */
	memcpy(frm, oui, sizeof(oui));		/* WPA OUI */
	frm += sizeof(oui);
	ADDSHORT(frm, WPA_VERSION);

	/* XXX filter out CKIP */

	/* multicast cipher */
	if (rsn->rsn_mcastcipher == IEEE80211_CIPHER_WEP &&
	    rsn->rsn_mcastkeylen >= 13)
		ADDSELECTOR(frm, wep104_suite);
	else if (!(IEEE80211_IS_TKIP_ALLOWED(ic)) &&
			(rsn->rsn_mcastcipher == IEEE80211_CIPHER_TKIP))	/* remove TKIP functionality */
		ADDSELECTOR(frm, cipher_suite[IEEE80211_CIPHER_AES_CCM]);
	else
		ADDSELECTOR(frm, cipher_suite[rsn->rsn_mcastcipher]);

	/* unicast cipher list */
	selcnt = frm;
	ADDSHORT(frm, 0);			/* selector count */
	if (rsn->rsn_ucastcipherset & (1 << IEEE80211_CIPHER_AES_CCM)) {
		selcnt[0]++;
		ADDSELECTOR(frm, cipher_suite[IEEE80211_CIPHER_AES_CCM]);
	}
	if (IEEE80211_IS_TKIP_ALLOWED(ic)) {
		if (rsn->rsn_ucastcipherset & (1 << IEEE80211_CIPHER_TKIP)) {
			selcnt[0]++;
			ADDSELECTOR(frm, cipher_suite[IEEE80211_CIPHER_TKIP]);
		}
	}
	/* authenticator selector list */
	selcnt = frm;
	ADDSHORT(frm, 0);			/* selector count */
	if (rsn->rsn_keymgmtset & WPA_ASE_8021X_UNSPEC) {
		selcnt[0]++;
		ADDSELECTOR(frm, key_mgt_unspec);
	}
	if (rsn->rsn_keymgmtset & WPA_ASE_8021X_PSK) {
		selcnt[0]++;
		ADDSELECTOR(frm, key_mgt_psk);
	}

	/* optional capabilities */
	if ((rsn->rsn_caps != 0) && (rsn->rsn_caps != RSN_CAP_PREAUTH))
		ADDSHORT(frm, rsn->rsn_caps);

	/* calculate element length */
	ie[1] = frm - ie - 2;
	KASSERT(ie[1] + 2 <= sizeof(struct ieee80211_ie_wpa),
		("WPA IE too big, %u > %u",
		ie[1] + 2, (int)sizeof(struct ieee80211_ie_wpa)));
	return frm;
#undef ADDSHORT
#undef ADDSELECTOR
#undef WPA_OUI_BYTES
}

static u_int8_t *
ieee80211_setup_rsn_ie(struct ieee80211vap *vap, u_int8_t *ie)
{
#define	RSN_OUI_BYTES		0x00, 0x0f, 0xac
#define	ADDSHORT(frm, v) do {			\
	frm[0] = (v) & 0xff;			\
	frm[1] = (v) >> 8;			\
	frm += 2;				\
} while (0)
#define	ADDSELECTOR(frm, sel) do {		\
	memcpy(frm, sel, 4);			\
	frm += 4;				\
} while (0)
	static const u_int8_t cipher_suite[][4] = {
		{ RSN_OUI_BYTES, RSN_CSE_WEP40 },	/* NB: 40-bit */
		{ RSN_OUI_BYTES, RSN_CSE_TKIP },
		{ RSN_OUI_BYTES, RSN_CSE_WRAP },
		{ RSN_OUI_BYTES, RSN_CSE_CCMP },
		{ 0x00, 0x00, 0x00, 0x00 },		/* XXX CKIP */
		{ RSN_OUI_BYTES, RSN_CSE_NULL },
	};
	static const u_int8_t wep104_suite[4] =
		{ RSN_OUI_BYTES, RSN_CSE_WEP104 };
	static const u_int8_t key_mgt_unspec[4] =
		{ RSN_OUI_BYTES, RSN_ASE_8021X_UNSPEC };
	static const u_int8_t key_mgt_psk[4] =
		{ RSN_OUI_BYTES, RSN_ASE_8021X_PSK };
	static const u_int8_t key_mgt_dot1x_sha256[4] =
		{ RSN_OUI_BYTES, RSN_ASE_8021X_SHA256 };
	static const u_int8_t key_mgt_psk_sha256[4] =
		{ RSN_OUI_BYTES, RSN_ASE_8021X_PSK_SHA256 };
	static const u_int8_t key_mgt_bip[4] =
		{ RSN_OUI_BYTES, RSN_CSE_BIP };
	static const u_int8_t key_mgt_ft_8021x[4] =
		{ RSN_OUI_BYTES, RSN_ASE_FT_8021X };
	static const u_int8_t key_mgt_ft_psk[4] =
		{ RSN_OUI_BYTES, RSN_ASE_FT_PSK };
	const struct ieee80211_rsnparms *rsn = &vap->iv_bss->ni_rsn;
	u_int8_t *frm = ie;
	u_int8_t *selcnt;
	struct ieee80211com *ic = vap->iv_ic;

	*frm++ = IEEE80211_ELEMID_RSN;
	*frm++ = 0;				/* length filled in below */
	ADDSHORT(frm, RSN_VERSION);

	/* XXX filter out CKIP */

	/* multicast cipher */
	if (rsn->rsn_mcastcipher == IEEE80211_CIPHER_WEP &&
	    rsn->rsn_mcastkeylen >= 13)
		ADDSELECTOR(frm, wep104_suite);
	else if (!(IEEE80211_IS_TKIP_ALLOWED(ic)) &&
			(rsn->rsn_mcastcipher == IEEE80211_CIPHER_TKIP))	/* remove TKIP functionality */
		ADDSELECTOR(frm, cipher_suite[IEEE80211_CIPHER_AES_CCM]);
	else
		ADDSELECTOR(frm, cipher_suite[rsn->rsn_mcastcipher]);

	/* unicast cipher list */
	selcnt = frm;
	ADDSHORT(frm, 0);			/* selector count */
	if (rsn->rsn_ucastcipherset & (1 << IEEE80211_CIPHER_AES_CCM)) {
		selcnt[0]++;
		ADDSELECTOR(frm, cipher_suite[IEEE80211_CIPHER_AES_CCM]);
	}
	if (IEEE80211_IS_TKIP_ALLOWED(ic)) {
		if (rsn->rsn_ucastcipherset & (1 << IEEE80211_CIPHER_TKIP)) {
			selcnt[0]++;
			ADDSELECTOR(frm, cipher_suite[IEEE80211_CIPHER_TKIP]);
		}
	}
	/* authenticator selector list */
	selcnt = frm;
	ADDSHORT(frm, 0);			/* selector count */
	if (rsn->rsn_keymgmtset == RSN_ASE_8021X_UNSPEC) {
		selcnt[0]++;
		ADDSELECTOR(frm, key_mgt_unspec);
	}
	if (rsn->rsn_keymgmtset == RSN_ASE_8021X_PSK) {
		selcnt[0]++;
		ADDSELECTOR(frm, key_mgt_psk);
	}
	if (rsn->rsn_keymgmtset == (RSN_ASE_8021X_PSK | WPA_KEY_MGMT_FT_PSK)) {
		selcnt[0]++;
		ADDSELECTOR(frm, key_mgt_psk);
		selcnt[0]++;
		ADDSELECTOR(frm, key_mgt_ft_psk);
	}
	if (rsn->rsn_keymgmtset == (RSN_ASE_8021X_UNSPEC | WPA_KEY_MGMT_FT_IEEE8021X)) {
		selcnt[0]++;
		ADDSELECTOR(frm, key_mgt_unspec);
		selcnt[0]++;
		ADDSELECTOR(frm, key_mgt_ft_8021x);
	}

	if (vap->iv_pmf) {
		if ((rsn->rsn_keymgmtset == RSN_ASE_8021X_PSK_SHA256)) {
			selcnt[0]++;
			ADDSELECTOR(frm, key_mgt_psk_sha256);
		} else if ((rsn->rsn_keymgmtset == RSN_ASE_8021X_SHA256)) {
			selcnt[0]++;
			ADDSELECTOR(frm, key_mgt_dot1x_sha256);
		}
	}

	/* capabilities */
	ADDSHORT(frm, (rsn->rsn_caps | (vap->iv_pmf << 6)));
	/* XXX PMKID */
	if (vap->iv_pmf) {
		/* PMKID here: We dont support PMKID list  */
		ADDSHORT(frm, 0);

		/* 802.11w Group Management Cipher suite */
		selcnt = frm;
		if (rsn->rsn_ucastcipherset & (1 << IEEE80211_CIPHER_AES_CCM)) {
			selcnt[0]++;
			ADDSELECTOR(frm, key_mgt_bip);
		}
	}
	/* calculate element length */
	ie[1] = frm - ie - 2;
	KASSERT(ie[1] + 2 <= sizeof(struct ieee80211_ie_wpa),
		("RSN IE too big, %u > %u",
		ie[1] + 2, (int)sizeof(struct ieee80211_ie_wpa)));
	return frm;
#undef ADDSELECTOR
#undef ADDSHORT
#undef RSN_OUI_BYTES
}

/*
 * Add a WPA/RSN element to a frame.
 */
u_int8_t *
ieee80211_add_wpa(u_int8_t *frm, struct ieee80211vap *vap)
{

	KASSERT(vap->iv_flags & IEEE80211_F_WPA, ("no WPA/RSN!"));
	if (vap->iv_flags & IEEE80211_F_WPA2)
		frm = ieee80211_setup_rsn_ie(vap, frm);
	if (vap->iv_flags & IEEE80211_F_WPA1)
		frm = ieee80211_setup_wpa_ie(vap, frm);
	return frm;
}

/*
 * Add a mobility domain element to a frame.
 */
uint8_t *
ieee80211_add_mdie(uint8_t *frm, struct ieee80211vap *vap)
{
	struct ieee80211_md_ie *mdie = (struct ieee80211_md_ie *) frm;

	mdie->md_id = IEEE80211_ELEMID_MOBILITY_DOMAIN;
	mdie->md_len = IEEE80211_MDIE_LEN;
	mdie->md_info = vap->iv_mdid;
	mdie->md_cap = vap->iv_ft_over_ds ? 1 : 0;
	frm += sizeof(struct ieee80211_md_ie);

	return frm;
}

#define	WME_OUI_BYTES		0x00, 0x50, 0xf2
/*
 * Add a WME Info element to a frame.
 */
static u_int8_t *
ieee80211_add_wme(u_int8_t *frm, struct ieee80211_node *ni)
{
	static const u_int8_t oui[4] = { WME_OUI_BYTES, WME_OUI_TYPE };
	struct ieee80211_ie_wme *ie = (struct ieee80211_ie_wme *) frm;
	struct ieee80211_wme_state *wme = &ni->ni_ic->ic_wme;
	struct ieee80211vap *vap = ni->ni_vap;

	*frm++ = IEEE80211_ELEMID_VENDOR;
	*frm++ = 0;				/* length filled in below */
	memcpy(frm, oui, sizeof(oui));		/* WME OUI */
	frm += sizeof(oui);
	*frm++ = WME_INFO_OUI_SUBTYPE;		/* OUI subtype */
	*frm++ = WME_VERSION;			/* protocol version */
	/* QoS Info field depends on operating mode */
	switch (vap->iv_opmode) {
	case IEEE80211_M_HOSTAP:
		*frm = wme->wme_bssChanParams.cap_info_count;
		if (IEEE80211_VAP_UAPSD_ENABLED(vap))
			*frm |= WME_CAPINFO_UAPSD_EN;
		frm++;
		break;
	case IEEE80211_M_STA:
		*frm++ = vap->iv_uapsdinfo;
		break;
	default:
		*frm++ = 0;
	}

	ie->wme_len = frm - &ie->wme_oui[0];

	return frm;
}

/*
 * Add a WME Parameter element to a frame.
 */
u_int8_t *
ieee80211_add_wme_param(u_int8_t *frm, struct ieee80211_wme_state *wme,
	int uapsd_enable, int is_qtn_wme)
{
#define	SM(_v, _f)	(((_v) << _f##_S) & _f)
#define	ADDSHORT(frm, v) do {			\
	frm[0] = (v) & 0xff;			\
	frm[1] = (v) >> 8;			\
	frm += 2;				\
} while (0)
	static const u_int8_t oui[4] = { WME_OUI_BYTES, WME_OUI_TYPE };
	struct ieee80211_wme_param *ie = (struct ieee80211_wme_param *) frm;
	int i;

	*frm++ = IEEE80211_ELEMID_VENDOR;
	*frm++ = 0;				/* length filled in below */
	memcpy(frm, oui, sizeof(oui));		/* WME OUI */
	frm += sizeof(oui);
	*frm++ = WME_PARAM_OUI_SUBTYPE;		/* OUI subtype */
	*frm++ = WME_VERSION;			/* protocol version */
	*frm = wme->wme_bssChanParams.cap_info_count;
	if (uapsd_enable)
		*frm |= WME_CAPINFO_UAPSD_EN;
	frm++;
	*frm++ = 0;                             /* reserved field */
	for (i = 0; i < WME_NUM_AC; i++) {
		const struct wmm_params *ac;
#ifdef CONFIG_QVSP
		if (!is_qtn_wme && (wme->wme_throt_bm & BIT(i))) {
			ac = &wme->wme_throt_bssChanParams.cap_wmeParams[i];
		} else
#endif
		{
			ac = &wme->wme_bssChanParams.cap_wmeParams[i];
		}
		*frm++ = SM(i, WME_PARAM_ACI) |
			SM(ac->wmm_acm, WME_PARAM_ACM) |
			SM(ac->wmm_aifsn, WME_PARAM_AIFSN);
		*frm++ = SM(ac->wmm_logcwmax, WME_PARAM_LOGCWMAX) |
			SM(ac->wmm_logcwmin, WME_PARAM_LOGCWMIN);
		ADDSHORT(frm, ac->wmm_txopLimit);
	}

	ie->param_len = frm - &ie->param_oui[0];

	return frm;
#undef ADDSHORT
}
#undef WME_OUI_BYTES

/*
 * Add an Atheros Advanaced Capability element to a frame
 */
u_int8_t *
ieee80211_add_athAdvCap(u_int8_t *frm, u_int8_t capability, u_int16_t defaultKey)
{
	static const u_int8_t oui[6] = {(ATH_OUI & 0xff), ((ATH_OUI >>8) & 0xff),
		((ATH_OUI >> 16) & 0xff), ATH_OUI_TYPE,
		ATH_OUI_SUBTYPE, ATH_OUI_VERSION};
	struct ieee80211_ie_athAdvCap *ie = (struct ieee80211_ie_athAdvCap *) frm;

	*frm++ = IEEE80211_ELEMID_VENDOR;
	*frm++ = 0;				/* Length filled in below */
	memcpy(frm, oui, sizeof(oui));		/* Atheros OUI, type, subtype, and version for adv capabilities */
	frm += sizeof(oui);
	*frm++ = capability;

	/* Setup default key index in little endian byte order */
	*frm++ = (defaultKey & 0xff);
	*frm++ = ((defaultKey >> 8) & 0xff);
	ie->athAdvCap_len = frm - &ie->athAdvCap_oui[0];

	return frm;
}

/*
 * Add the Quantenna IE to a frame
 * - all existing fields must be backwards compatible with previous verions.
 */
uint8_t *
ieee80211_add_qtn_ie(uint8_t *frm, struct ieee80211com *ic, uint8_t flags, uint8_t my_flags,
			uint8_t implicit_ba, uint16_t implicit_ba_size, uint32_t rate_train)
{
	struct ieee80211_ie_qtn *ie = (struct ieee80211_ie_qtn *)frm;

	ie->qtn_ie_id = IEEE80211_ELEMID_VENDOR;
	ie->qtn_ie_len = (uint8_t)sizeof(*ie) - IEEE80211_IE_ID_LEN_SIZE;
	ieee80211_oui_add_qtn(ie->qtn_ie_oui);
	ie->qtn_ie_type = QTN_OUI_CFG;
	ie->qtn_ie_flags = (flags | IEEE80211_QTN_FLAGS_ENVY_DFLT) & IEEE80211_QTN_FLAGS_ENVY;
	ie->qtn_ie_implicit_ba_tid = implicit_ba;
	ie->qtn_ie_my_flags = (my_flags | IEEE80211_QTN_CAPS_DFLT) & ~IEEE80211_QTN_BF_VER1;
	ie->qtn_ie_implicit_ba_tid_h = implicit_ba;
	ie->qtn_ie_implicit_ba_size = (implicit_ba_size >> IEEE80211_QTN_IE_BA_SIZE_SH);
	ie->qtn_ie_vsp_version = IEEE80211_QTN_VSP_VERSION;

	put_unaligned(htonl(ic->ic_ver_sw), &ie->qtn_ie_ver_sw);
	put_unaligned(htons(ic->ic_ver_hw), &ie->qtn_ie_ver_hw);
	put_unaligned(htons(ic->ic_ver_platform_id), &ie->qtn_ie_ver_platform_id);
	put_unaligned(htonl(ic->ic_ver_timestamp), &ie->qtn_ie_ver_timestamp);
	put_unaligned(htonl(rate_train), &ie->qtn_ie_rate_train);
	put_unaligned(htonl(ic->ic_ver_flags), &ie->qtn_ie_ver_flags);

	return frm + sizeof(*ie);
}

#ifdef CONFIG_QVSP
static __inline int
ieee80211_vsp_ie_max_len(struct ieee80211com *ic)
{
	return sizeof(struct ieee80211_ie_vsp) +
		(sizeof(struct ieee80211_ie_vsp_item) * ARRAY_SIZE(ic->vsp_cfg));
}

/*
 * Add the Quantenna VSP configuration IE to a frame
 */
static uint8_t *
ieee80211_add_vsp_ie(struct ieee80211vap *vap, void *start, void *end)
{
	struct ieee80211com *ic = vap->iv_ic;
	struct ieee80211_ie_vsp *vsp_ie = start;
	struct ieee80211_ie_vsp_item *item_p = &vsp_ie->item[0];
	int i;

	vsp_ie->id = IEEE80211_ELEMID_VENDOR;
	ieee80211_oui_add_qtn(vsp_ie->oui);
	vsp_ie->type = QTN_OUI_VSP_CTRL;
	vsp_ie->item_cnt = 0;

	for (i = 0; i < ARRAY_SIZE(ic->vsp_cfg); i++) {
		if (ic->vsp_cfg[i].set != 0) {
			item_p->index = i;
			put_unaligned(htonl(ic->vsp_cfg[i].value), &item_p->value);
			item_p++;
			vsp_ie->item_cnt++;
			if ((void *)item_p > end) {
				printk(KERN_INFO "VSP: not adding IE to assoc resp - too long\n");
				return start;
			}
		}
	}
	vsp_ie->len = (uint8_t *)item_p - &vsp_ie->oui[0];

	return (uint8_t *)item_p;
}

static uint8_t *
ieee80211_add_timeout_ie(u_int8_t *frm)
{
		struct ieee80211_timout_int_ie *tie = (struct ieee80211_timout_int_ie *) frm;

		tie->timout_int_ie = IEEE80211_ELEMID_TIMEOUT_INT;
		tie->timout_int_len = 5;
		tie->timout_int_type = IEEE80211_TIMEOUT_ASSOC_COMEBACK;	/* timeout value type */
		tie->timout_int_value = htole32(IEEE80211_W_ASSOC_COMEBACK_TO);	/* default value is 1000tus */
		frm += sizeof(struct ieee80211_timout_int_ie);
		return frm;
}

uint8_t *
ieee80211_add_qtn_wme_param(struct ieee80211vap *vap, u_int8_t *frm)
{
	struct ieee80211_ie_qtn_wme *qwme_ie = (struct ieee80211_ie_qtn_wme *)frm;
	struct ieee80211_wme_state *wme = ieee80211_vap_get_wmestate(vap);

	qwme_ie->qtn_ie_id = IEEE80211_ELEMID_VENDOR;
	qwme_ie->qtn_ie_len = sizeof(struct ieee80211_ie_qtn_wme) - 2;
	ieee80211_oui_add_qtn(qwme_ie->qtn_ie_oui);
	qwme_ie->qtn_ie_type = QTN_OUI_QWME;
	qwme_ie->qtn_wme_ie_version = QTN_QWME_IE_VERSION;

	return ieee80211_add_wme_param((uint8_t*)&qwme_ie->qtn_wme_ie, wme, IEEE80211_VAP_UAPSD_ENABLED(vap), 1);
}
#endif

/*
 * Add Quantenna pairing hash to a frame
 */
u_int8_t *
ieee80211_add_qtn_pairing_ie(u_int8_t *frm, struct ieee80211_app_ie_t *pairing_ie)
{
	struct ieee80211_ie_qtn_pairing_tlv tlv_ie;
	struct ieee80211_ie_qtn_pairing *ie = (struct ieee80211_ie_qtn_pairing *) frm;

	tlv_ie.qtn_pairing_tlv_type = QTN_OUI_PAIRING;
	memcpy(tlv_ie.qtn_pairing_tlv_hash, pairing_ie->ie, QTN_PAIRING_TLV_HASH_LEN);
	tlv_ie.qtn_pairing_tlv_len = htole16(sizeof(struct ieee80211_ie_qtn_pairing_tlv));

	*frm++ = IEEE80211_ELEMID_VENDOR;
	*frm++ = 0;
	frm += ieee80211_oui_add_qtn(frm);
	memcpy(frm, &tlv_ie, sizeof(struct ieee80211_ie_qtn_pairing_tlv));
	frm += sizeof(struct ieee80211_ie_qtn_pairing_tlv);
	ie->qtn_pairing_ie_len = frm - &ie->qtn_pairing_ie_oui[0];

	return frm;
}
/*
 * Add Quantenna specific 802.11h information elements to a frame.
 */
u_int8_t *
ieee80211_add_qtn_csatsf_ie(u_int8_t *frm, u_int64_t tsf)
{
	struct ieee80211_ie_qtn_csa_tsf *ie = (struct ieee80211_ie_qtn_csa_tsf *)frm;

	*frm++ = IEEE80211_ELEMID_VENDOR;
	*frm++ = 0;		/* Length is filled in below */
	frm += ieee80211_oui_add_qtn(frm);
	*frm++ = QTN_OUI_CFG;
	ie->tsf = htonll(tsf);
	frm += sizeof(tsf);
	ie->len = frm - &ie->qtn_ie_oui[0];

	return frm;
}

/*
 * Add 802.11h information elements to a frame.
 */
static u_int8_t *
ieee80211_add_doth(u_int8_t *frm, struct ieee80211com *ic)
{
	/* XXX ie structures */
	/*
	 * Power Capability IE
	 */
	if (ic->ic_flags_ext & IEEE80211_FEXT_TPC) {
		*frm++ = IEEE80211_ELEMID_PWRCAP;
		*frm++ = 2;
		*frm++ = ic->ic_bsschan->ic_minpower;
		*frm++ = ic->ic_bsschan->ic_maxpower;
	}

	return frm;
}

/*
 * Add 802.11n HT MCS
 */
static void
ieee80211_mcs_populate(struct ieee80211_node *ni, struct ieee80211_ie_htcap *ie, struct ieee80211_htcap *htcap, int subtype) {

	/* Update the supported MCS on Assoc response based on intersection of AP and client capability */
	if ((ni->ni_vap->iv_opmode == IEEE80211_M_HOSTAP) &&
		(subtype == IEEE80211_FC0_SUBTYPE_ASSOC_RESP || subtype == IEEE80211_FC0_SUBTYPE_REASSOC_RESP)) {
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_NSS1,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_NSS1] & ni->ni_htcap.mcsset[IEEE80211_HT_MCSSET_20_40_NSS1]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_NSS2,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_NSS2] & ni->ni_htcap.mcsset[IEEE80211_HT_MCSSET_20_40_NSS2]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_NSS3,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_NSS3] & ni->ni_htcap.mcsset[IEEE80211_HT_MCSSET_20_40_NSS3]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_NSS4,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_NSS4] & ni->ni_htcap.mcsset[IEEE80211_HT_MCSSET_20_40_NSS4]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM1,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM1] & ni->ni_htcap.mcsset[IEEE80211_HT_MCSSET_20_40_UEQM1]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM2,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM2] & ni->ni_htcap.mcsset[IEEE80211_HT_MCSSET_20_40_UEQM2]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM3,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM3] & ni->ni_htcap.mcsset[IEEE80211_HT_MCSSET_20_40_UEQM3]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM4,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM4] & ni->ni_htcap.mcsset[IEEE80211_HT_MCSSET_20_40_UEQM4]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM5,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM5] & ni->ni_htcap.mcsset[IEEE80211_HT_MCSSET_20_40_UEQM5]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM6,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM6] & ni->ni_htcap.mcsset[IEEE80211_HT_MCSSET_20_40_UEQM6]);
	} else {
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_NSS1,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_NSS1]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_NSS2,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_NSS2]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_NSS3,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_NSS3]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_NSS4,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_NSS4]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM1,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM1]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM2,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM2]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM3,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM3]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM4,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM4]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM5,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM5]);
		IEEE80211_HTCAP_SET_MCS_VALUE(ie, IEEE80211_HT_MCSSET_20_40_UEQM6,
						  htcap->mcsset[IEEE80211_HT_MCSSET_20_40_UEQM6]);
	}

}

/*
 * Add 802.11n HT Capabilities IE
 */
u_int8_t *
ieee80211_add_htcap(struct ieee80211_node *ni, u_int8_t *frm, struct ieee80211_htcap *htcap, int subtype)
{
	struct ieee80211_ie_htcap *ie = (struct ieee80211_ie_htcap *)(void*) frm;

	memset(ie, 0, sizeof(struct ieee80211_ie_htcap));

	ie->hc_id = IEEE80211_ELEMID_HTCAP;
	ie->hc_len = sizeof(struct ieee80211_ie_htcap) - 2;

	/* Update the LDPC capability based on the setting */
	if (ni->ni_vap->iv_ht_flags & IEEE80211_HTF_LDPC_ENABLED) {
		htcap->cap |= IEEE80211_HTCAP_C_LDPCCODING;
	} else {
		htcap->cap &= ~IEEE80211_HTCAP_C_LDPCCODING;
	}

	/* Update the STBC capability based on the setting */
	if (ni->ni_vap->iv_ht_flags & IEEE80211_HTF_STBC_ENABLED) {
		htcap->cap |= (IEEE80211_HTCAP_C_TXSTBC | IEEE80211_HTCAP_C_RXSTBC);
	} else {
		htcap->cap &= ~(IEEE80211_HTCAP_C_TXSTBC | IEEE80211_HTCAP_C_RXSTBC);
	}

	IEEE80211_HTCAP_SET_CAPABILITIES(ie,htcap->cap);

	if (ni->ni_vap->iv_smps_force & 0x8000) {
		IEEE80211_HTCAP_SET_PWRSAVE_MODE(ie, ni->ni_vap->iv_smps_force & 0xF);
	} else {
		IEEE80211_HTCAP_SET_PWRSAVE_MODE(ie,htcap->pwrsave);
	}

	IEEE80211_HTCAP_SET_AMPDU_LEN(ie,htcap->maxampdu);
	IEEE80211_HTCAP_SET_AMPDU_SPACING(ie,htcap->mpduspacing);

	ieee80211_mcs_populate(ni, ie, htcap, subtype);

	IEEE80211_HTCAP_SET_HIGHEST_DATA_RATE(ie,htcap->maxdatarate);
	IEEE80211_HTCAP_SET_MCS_PARAMS(ie,htcap->mcsparams);
	IEEE80211_HTCAP_SET_MCS_STREAMS(ie,htcap->numtxspstr);

	ie->hc_txbf[0] = htcap->hc_txbf[0];
	ie->hc_txbf[1] = htcap->hc_txbf[1];
	ie->hc_txbf[2] = htcap->hc_txbf[2];
	ie->hc_txbf[3] = htcap->hc_txbf[3];

	return frm + sizeof(struct ieee80211_ie_htcap);
}


/*
 * Add 802.11n HT Information IE
 */
u_int8_t *
ieee80211_add_htinfo(struct ieee80211_node *ni, u_int8_t *frm, struct ieee80211_htinfo *htinfo)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic  = vap->iv_ic;		/* back ptr to common state */
	u_int8_t byteval = 0;
	struct ieee80211_ie_htinfo *ie = (struct ieee80211_ie_htinfo *)(void*) frm;
	memset(ie, 0, sizeof(struct ieee80211_ie_htinfo));
	ie->hi_id = IEEE80211_ELEMID_HTINFO;
	ie->hi_len = sizeof(struct ieee80211_ie_htinfo) - 2;
	IEEE80211_HTINFO_SET_PRIMARY_CHANNEL(ie,htinfo->ctrlchannel);

	/* set byte 1 */
	byteval = 0;

	/* set channel width */
	byteval |= (htinfo->byte1 & IEEE80211_HTINFO_B1_REC_TXCHWIDTH_40);

	/*
	 * Std 802.11ac-2013, 10.39.1 'Basic VHT BSS functionality': A VHT
	 * AP shall set the RIFS Mode field in the HT Operation element to 0.
	 */
	if (!IS_IEEE80211_VHT_ENABLED(ic) ||
			(vap->iv_opmode != IEEE80211_M_HOSTAP)) {
		/* Rx RIFS is supported */
		byteval |= IEEE80211_HTINFO_B1_RIFS_MODE;
	}

	/* set S-PSMP support */
	/* Deprecated in current draft 11.0 */
// 	byteval |= (htinfo->byte1 & IEEE80211_HTINFO_B1_CONTROLLED_ACCESS);

	IEEE80211_HTINFO_SET_BYTE_ONE(ie,byteval);

	/* set service level granularity and secondary channel offset */
	/* Deprecated in current draft 11.0 */
	//IEEE80211_HTINFO_B1_SET_SIGRANULARITY(ie,htinfo->sigranularity);
	//
	IEEE80211_HTINFO_B1_SET_EXT_CHOFFSET(ie,htinfo->choffset);

	/* set byte 2 */
	byteval = 0;

	/* set op mode */
	if (IEEE80211_11N_PROTECT_ENABLED(ic) &&
			(vap->iv_opmode != IEEE80211_M_IBSS)) {
		if (vap->iv_non_gf_sta_present)
			byteval |= IEEE80211_HTINFO_B2_NON_GF_PRESENT;

		if (ic->ic_non_ht_non_member || ic->ic_non_ht_sta)
			byteval |= IEEE80211_HTINFO_B2_OBSS_PROT;
	}

	/* set OBSS */
	IEEE80211_HTINFO_SET_BYTE_TWO(ie,byteval);

	if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
		u_int8_t opmode = 0;
		if (ic->ic_non_ht_sta != 0) {
			opmode = IEEE80211_HTINFO_OPMODE_HT_PROT_MIXED;
		} else {
			if (ic->ic_non_ht_non_member != 0) {
				opmode = IEEE80211_HTINFO_OPMODE_HT_PROT_NON_MEM;
			} else {
				if (ic->ic_htcap.cap & IEEE80211_HTCAP_C_CHWIDTH40) { /* 20/40 MHZ mode */
					if (ic->ic_ht_20mhz_only_sta != 0) /* 20 MHZ only HT STA is present */
						opmode = IEEE80211_HTINFO_OPMODE_HT_PROT_20_ONLY;
					else
						opmode = IEEE80211_HTINFO_OPMODE_NO_PROT;
				} else {
					opmode = IEEE80211_HTINFO_OPMODE_NO_PROT;
				}
			}
		}

		/*
		 * If nonHT, 20MHz, 'nonHT in other BSS' stations counts are all 0, then we have
		 * a QTN specific usage of HT protection field. If any of those counters are non-zero,
		 * then ht protection field is set as per standard. Otherwise WFA test cases fail.
		*/
		if (!ic->ic_non_ht_sta && !ic->ic_ht_20mhz_only_sta && !ic->ic_non_ht_non_member) {
			/* QTN specific settings */
			if ((!IEEE80211_COM_WDS_IS_RBS(ic) || !ic->ic_extender_mbs_ocac) && !ic->ic_peer_rts) {
				opmode = IEEE80211_HTINFO_OPMODE_NO_PROT;
			} else {
				opmode = IEEE80211_HTINFO_OPMODE_HT_PROT_NON_MEM;
			}

		}

		if (!IEEE80211_11N_PROTECT_ENABLED(ic))
			opmode = IEEE80211_HTINFO_OPMODE_NO_PROT;

		htinfo->opmode = opmode;
		IEEE80211_HTINFO_B2_SET_OP_MODE(ie, htinfo->opmode);
	}

	/* set byte 3 */
	IEEE80211_HTINFO_SET_BYTE_THREE(ie,0);

	/* set byte 4 */
	byteval = 0;

	if (vap->iv_opmode != IEEE80211_M_IBSS)
	{
		/* set dual beacon */
		byteval |= (htinfo->byte4 & IEEE80211_HTINFO_B4_DUAL_BEACON);

		/* set DUAL CTS requirement */
		if (vap->iv_dual_cts_required)
				byteval |= (IEEE80211_HTINFO_B4_DUAL_CTS);
	}

	IEEE80211_HTINFO_SET_BYTE_FOUR(ie,byteval);

	/* set byte 5 */
	byteval = 0;
	if (vap->iv_opmode != IEEE80211_M_IBSS) {
		/* set STBC beacon */
		if (vap->iv_stbc_beacon)
			byteval |= (IEEE80211_HTINFO_B5_STBC_BEACON);

		/* set LSIG TXOP support */
		if (vap->iv_lsig_txop_ok)
			byteval |= (IEEE80211_HTINFO_B5_LSIGTXOPPROT);
	}

	IEEE80211_HTINFO_SET_BYTE_FIVE(ie,byteval);

	IEEE80211_HTINFO_SET_BASIC_MCS_VALUE(ie,IEEE80211_HT_MCSSET_20_40_NSS1,htinfo->basicmcsset[0]);
	IEEE80211_HTINFO_SET_BASIC_MCS_VALUE(ie,IEEE80211_HT_MCSSET_20_40_NSS2,htinfo->basicmcsset[1]);

	return frm + sizeof(struct ieee80211_ie_htinfo);
}


/*
 * Add 802.11ac VHT Capabilities IE
 */
u_int8_t *
ieee80211_add_vhtcap(struct ieee80211_node *ni, u_int8_t *frm, struct ieee80211_vhtcap *vhtcap, uint8_t subtype)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = vap->iv_ic;
	struct ieee80211_ie_vhtcap *ie = (struct ieee80211_ie_vhtcap *)(void *) frm;
	u_int32_t vhtcap_flags = vhtcap->cap_flags;
	uint32_t bfstscap;

	memset(ie, 0, sizeof(struct ieee80211_ie_vhtcap));

	ie->vht_id = IEEE80211_ELEMID_VHTCAP;
	ie->vht_len = sizeof(struct ieee80211_ie_vhtcap) - 2;

	if (vap->iv_vht_flags & IEEE80211_VHTCAP_C_RX_LDPC) {
		vhtcap_flags |= IEEE80211_VHTCAP_C_RX_LDPC;
	} else {
		vhtcap_flags &= ~IEEE80211_VHTCAP_C_RX_LDPC;
	}
	if (vap->iv_vht_flags & IEEE80211_VHTCAP_C_TX_STBC) {
		vhtcap_flags |= IEEE80211_VHTCAP_C_TX_STBC;
	} else {
		vhtcap_flags &= ~IEEE80211_VHTCAP_C_TX_STBC;
	}

	if (ic->ic_vhtcap.cap_flags & IEEE80211_VHTCAP_C_MU_BEAM_FORMER_CAP) {
		vhtcap_flags |= IEEE80211_VHTCAP_C_MU_BEAM_FORMER_CAP;
	} else {
		vhtcap_flags &= ~IEEE80211_VHTCAP_C_MU_BEAM_FORMER_CAP;
	}

	if (ic->ic_vhtcap.cap_flags & IEEE80211_VHTCAP_C_MU_BEAM_FORMEE_CAP) {
		vhtcap_flags |= IEEE80211_VHTCAP_C_MU_BEAM_FORMEE_CAP;
	} else {
		vhtcap_flags &= ~IEEE80211_VHTCAP_C_MU_BEAM_FORMEE_CAP;
	}

	IEEE80211_VHTCAP_SET_CAPFLAGS(ie, vhtcap_flags);

	IEEE80211_VHTCAP_SET_MAXMPDU(ie, vhtcap->maxmpdu);
	IEEE80211_VHTCAP_SET_CHANWIDTH(ie, vhtcap->chanwidth);
	if (ni->ni_vap->iv_vht_flags & IEEE80211_VHTCAP_C_TX_STBC) {
		IEEE80211_VHTCAP_SET_RXSTBC(ie, vhtcap->rxstbc);
	}

	/* FIXME: IOT Workaround for BRCM to set beamformee STS to 3 in beacons
	 * BRCM sound with us assuming 2 antenna  when STS is set to our max value which is 4
	 * However when beacons advertise it as 3, the sounding is done in 3 antenna.
	 * Intel, QCA, MRVL takes the STS value from probe resp / assoc resp.
	 * So having STS 4 in those frames can make use of 4 antenna in V matrix.
	 */
	bfstscap = ((subtype == IEEE80211_FC0_SUBTYPE_BEACON) && (vap->enable_iot_sts_war))
				? MIN(vhtcap->bfstscap, IEEE80211_VHTCAP_RX_STS_3)
				: vhtcap->bfstscap;

	IEEE80211_VHTCAP_SET_BFSTSCAP(ie, bfstscap);
	IEEE80211_VHTCAP_SET_NUMSOUND(ie, vhtcap->numsounding);
	IEEE80211_VHTCAP_SET_MAXAMPDUEXP(ie, vhtcap->maxampduexp);
	IEEE80211_VHTCAP_SET_LNKADPTCAP(ie, vhtcap->lnkadptcap);

	IEEE80211_VHTCAP_SET_RX_MCS_NSS(ie, vhtcap->rxmcsmap);

	IEEE80211_VHTCAP_SET_TX_MCS_NSS(ie, vhtcap->txmcsmap);

	IEEE80211_VHTCAP_SET_RX_LGIMAXRATE(ie, vhtcap->rxlgimaxrate);
	IEEE80211_VHTCAP_SET_TX_LGIMAXRATE(ie, vhtcap->txlgimaxrate);

	return frm + sizeof(struct ieee80211_ie_vhtcap);
}

/*
 * 802.11ac VHT Operation IE
 */
uint8_t *ieee80211_add_vhtop(struct ieee80211_node *ni, uint8_t *frm, struct ieee80211_vhtop *vhtop)
{
	struct ieee80211_ie_vhtop *ie = (struct ieee80211_ie_vhtop *)frm;

	memset (ie, 0, sizeof(struct ieee80211_ie_vhtop));

	ie->vhtop_id = IEEE80211_ELEMID_VHTOP;
	ie->vhtop_len = sizeof(struct ieee80211_ie_vhtop) - 2;

	IEEE80211_VHTOP_SET_CHANWIDTH(ie, vhtop->chanwidth);
	IEEE80211_VHTOP_SET_CENTERFREQ0(ie, vhtop->centerfreq0);
	IEEE80211_VHTOP_SET_CENTERFREQ1(ie, vhtop->centerfreq1);

	IEEE80211_VHTOP_SET_BASIC_MCS_NSS(ie, vhtop->basicvhtmcsnssset);

	return frm + sizeof(struct ieee80211_ie_vhtop);
}

u_int8_t ieee80211_get_peer_nss(struct ieee80211_node *ni)
{
	u_int8_t nss = 0;

	if (IEEE80211_VHT_HAS_4SS(ni->ni_vhtcap.txmcsmap)) {
		nss = 3;
	} else if (IEEE80211_VHT_HAS_3SS(ni->ni_vhtcap.txmcsmap)) {
		nss = 2;
	} else if (IEEE80211_VHT_HAS_2SS(ni->ni_vhtcap.txmcsmap)) {
		nss = 1;
	}

	return nss;
}

/*
 * Add 802.11ac VHT Operating Mode Notification IE
 */
uint8_t *ieee80211_add_vhtop_notif(struct ieee80211_node *ni, uint8_t *frm, struct ieee80211com *ic, int band_24g)
{
	struct ieee80211_ie_vhtop_notif *ie = (struct ieee80211_ie_vhtop_notif *)frm;
	uint8_t chwidth;
	uint8_t vht_nss_cap = (band_24g ? ic->ic_vht_nss_cap_24g : ic->ic_vht_nss_cap);
	uint8_t rxnss = min(vht_nss_cap - 1, QTN_GLOBAL_RATE_NSS_MAX - 1);
	uint8_t rxnss_type = 0;
	struct ieee80211vap *vap = ni->ni_vap;

	switch (ic->ic_max_system_bw) {
	case BW_HT40:
		chwidth = IEEE80211_CWM_WIDTH40;
		break;
	case BW_HT20:
		chwidth = IEEE80211_CWM_WIDTH20;
		break;
	case BW_HT80:
	default:
		chwidth = IEEE80211_CWM_WIDTH80;
		break;
	}

	if (band_24g && chwidth == IEEE80211_CWM_WIDTH80)
		chwidth = IEEE80211_CWM_WIDTH40;

	memset(ie, 0, sizeof(struct ieee80211_ie_vhtop_notif));

	ie->id = IEEE80211_ELEMID_OPMOD_NOTIF;
	ie->len = sizeof(*ie) - 2;

	if (vap->iv_opmode == IEEE80211_M_STA) {
		rxnss = min((uint8_t)(vht_nss_cap - 1), (uint8_t)ieee80211_get_peer_nss(ni));
	}

	if (ic->ic_vht_opmode_notif == IEEE80211_VHT_OPMODE_NOTIF_DEFAULT) {
		/* by default, use current configured channel width and nss */
		ie->vhtop_notif_mode = SM(chwidth, IEEE80211_VHT_OPMODE_CHWIDTH) |
					SM(rxnss, IEEE80211_VHT_OPMODE_RXNSS) |
					SM(rxnss_type, IEEE80211_VHT_OPMODE_RXNSS_TYPE);
	} else {
		ie->vhtop_notif_mode = (uint8_t) (ic->ic_vht_opmode_notif & 0x00ff);
	}

	return frm + sizeof(*ie);
}

/*
 * Add 20/40 coexistence IE
 */
u_int8_t *
ieee80211_add_20_40_bss_coex_ie(u_int8_t *frm, u_int8_t coex)
{
	*frm++ = IEEE80211_ELEMID_20_40_BSS_COEX;
	*frm++ = 1;
	*frm++ = coex;

	return frm;
}

void
ieee80211_get_20_40_bss_into_chan_list(struct ieee80211com *ic,
		struct ieee80211vap *vap, u_int16_t *pp_ch_list)
{
	struct sta_table *st = ic->ic_scan->ss_priv;
	struct sta_entry *se, *next;
	uint16_t ch_list = 0;
	uint8_t se_pri_chan = 0;
	uint8_t se_sec_chan = 0;
	uint8_t unallowed = 0;

	TAILQ_FOREACH_SAFE(se, &st->st_entry, se_list, next) {
		if (!IEEE80211_ADDR_EQ(se->base.se_macaddr, vap->iv_bss->ni_macaddr) &&
				(se->base.se_chan->ic_ieee <= QTN_2G_LAST_OPERATING_CHAN)) {
			ieee80211_find_ht_pri_sec_chan(vap, &se->base,
						&se_pri_chan, &se_sec_chan);
			unallowed = !ieee80211_20_40_operation_permitted(ic,
				ic->ic_curchan, se_pri_chan, se_sec_chan);
		} else {
			unallowed = 0;
		}

		if (unallowed)
			ch_list |= 1 << se->base.se_chan->ic_ieee;
	}
	*pp_ch_list = ch_list;
}

static uint8_t
ieee80211_count_channels(uint16_t ch_list)
{
	uint8_t chan_count = 0;

	for ( ; ch_list; ch_list &= (ch_list - 1))
		chan_count++;

	return chan_count;
}

/*
 * Add 20/40 BSS channel report
 */
u_int8_t *
ieee80211_add_20_40_bss_into_ch_rep(u_int8_t *frm, struct ieee80211com *ic, u_int16_t ch_list)
{
#define IEEE80211_24GHZ_BAND 25
#define IEEE80211_GLOBAL_24GHZ_OPER_CLASS 81
#define bitsz_var(var) (sizeof(var) * 8)
	int i;
	uint8_t cur_reg_class = 0;

	for (i = 1; i < bitsz_var(ch_list); i++) {
		if (ch_list & (1 << i)) {
			cur_reg_class = ieee80211_get_current_operating_class(ic->ic_country_code,
						ic->ic_bsschan->ic_ieee,
						IEEE80211_24GHZ_BAND);
			if (!cur_reg_class)
				cur_reg_class = IEEE80211_GLOBAL_24GHZ_OPER_CLASS;
			break;
		}
	}

	*frm++ = IEEE80211_ELEMID_20_40_IT_CH_REP;
	*frm++ = ieee80211_count_channels(ch_list) + 1;
	*frm++ = cur_reg_class;
	for (i = 1; i < bitsz_var(ch_list); i++) {
		if (ch_list & (1 << i)) {
			*frm++ = i;
		}
	}

	return frm;
}

u_int8_t *
ieee80211_add_obss_scan_ie(u_int8_t *frm, struct ieee80211_obss_scan_ie *obss_ie)
{
	*frm++ = IEEE80211_ELEMID_OBSS_SCAN;
	*frm++ = sizeof(struct ieee80211_obss_scan_ie) - 2;
	memcpy(frm, &obss_ie->obss_passive_dwell, sizeof(struct ieee80211_obss_scan_ie) - 2);

	return (frm + sizeof(struct ieee80211_obss_scan_ie) - 2);
}

/*
* Add Extender Role IE
*/
u_int8_t *
ieee80211_add_qtn_extender_role_ie(uint8_t *frm, uint8_t role)
{
	*frm++ = IEEE80211_ELEMID_VENDOR;
	*frm++ = sizeof(struct ieee80211_qtn_ext_role) - 2;
	frm += ieee80211_oui_add_qtn(frm);
	*frm++ = QTN_OUI_EXTENDER_ROLE;
	*frm++ = role;
	return frm;
}

u_int8_t *
ieee80211_add_qtn_extender_bssid_ie(struct ieee80211vap *vap, uint8_t *frm)
{
	struct ieee80211com *ic = vap->iv_ic;
	int i;

	*frm++ = IEEE80211_ELEMID_VENDOR;
	*frm++ = sizeof(struct ieee80211_qtn_ext_bssid) - 2;
	frm += ieee80211_oui_add_qtn(frm);
	*frm++ = QTN_OUI_EXTENDER_BSSID;

	memcpy(frm, ic->ic_extender_mbs_bssid, IEEE80211_ADDR_LEN);
	frm = frm + IEEE80211_ADDR_LEN;
	*frm++ = ic->ic_extender_rbs_num;
	for (i = 0; i < QTN_MAX_RBS_NUM; i++) {
		memcpy(frm, ic->ic_extender_rbs_bssid[i], IEEE80211_ADDR_LEN);
		frm = frm + IEEE80211_ADDR_LEN;
	}

	return frm;
}

u_int8_t *
ieee80211_add_qtn_extender_state_ie(uint8_t *frm, uint8_t ocac)
{
	*frm++ = IEEE80211_ELEMID_VENDOR;
	*frm++ = sizeof(struct ieee80211_qtn_ext_state) - 2;
	frm += ieee80211_oui_add_qtn(frm);
	*frm++ = QTN_OUI_EXTENDER_STATE;
	*frm++ = (ocac ? QTN_EXT_MBS_OCAC : 0);
	*frm++ = 0;
	*frm++ = 0;
	*frm++ = 0;

	return frm;
}

u_int8_t *
ieee80211_add_qtn_ocac_state_ie(uint8_t *frm)
{
	*frm++ = IEEE80211_ELEMID_VENDOR;
	*frm++ = sizeof(struct ieee80211_ie_qtn_ocac_state) - 2;
	frm += ieee80211_oui_add_qtn(frm);
	*frm++ = QTN_OUI_OCAC_STATE;
	*frm++ = OCAC_STATE_NONE;
	*frm++ = 0;

	return frm;
}

/**
 * Find the next IE in the buffer, return pointer to the next IE,
 * and the length of the current IE.
 */
static void *
ieee80211_smash_ie(const void *p_buf, int buf_len, int *p_this_ie_len)
{
	struct ieee80211_ie *p_ie = (struct ieee80211_ie *)p_buf;
	struct ieee80211_ie *p_next_ie;
	if (p_buf == NULL || buf_len < IEEE80211_IE_ID_LEN_SIZE) {
		return NULL;
	}
	if ((p_ie->len + IEEE80211_IE_ID_LEN_SIZE) > buf_len) {
		return NULL;
	}
	*p_this_ie_len = p_ie->len;
	p_next_ie = (struct ieee80211_ie *)(p_buf + p_ie->len + IEEE80211_IE_ID_LEN_SIZE);
	if ((u32)p_next_ie < (u32)(p_buf + buf_len)) {
		return p_next_ie;
	}
	return NULL;
}

/*
 * Create a probe request frame with the specified ssid
 * and any optional information element data.
 */
struct sk_buff *
ieee80211_get_probereq(struct ieee80211_node *ni,
	const u_int8_t sa[IEEE80211_ADDR_LEN],
	const u_int8_t da[IEEE80211_ADDR_LEN],
	const u_int8_t bssid[IEEE80211_ADDR_LEN],
	const u_int8_t *ssid, size_t ssidlen,
	const void *optie, size_t optielen)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = ni->ni_ic;
	enum ieee80211_phymode mode;
	struct ieee80211_frame *wh;
	struct sk_buff *skb;
	u_int8_t *frm;

	mode = ic->ic_curmode;
	/*
	 * prreq frame format
	 *	[tlv] ssid
	 *	[tlv] supported rates
	 *	[tlv] extended supported rates
	 *	[tlv] HT capabilities
	 *	[tlv] user-specified ie's
	 */
	skb = ieee80211_getmgtframe(&frm, 2 + IEEE80211_NWID_LEN +
	       2 + IEEE80211_RATE_SIZE +
	       2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE) +
	       ((ic->ic_curmode >= IEEE80211_MODE_11NA) ?
			(sizeof(struct ieee80211_ie_htcap) +
			 sizeof(struct ieee80211_extcap_param)) : 0) +
	       (optie != NULL ? optielen : 0) +
	       vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_REQ].length +
	       (IS_IEEE80211_DUALBAND_VHT_ENABLED(ic) ? sizeof(struct ieee80211_ie_vhtcap): 0)
	       );

	if (skb == NULL) {
		vap->iv_stats.is_tx_nobuf++;
		return NULL;
	}

	frm = ieee80211_add_ssid(frm, ssid, ssidlen);
	frm = ieee80211_add_rates(frm, &ic->ic_sup_rates[mode]);

	if (ic->ic_curmode >= IEEE80211_MODE_11NA) {
		frm = ieee80211_add_htcap(ni, frm, &ic->ic_htcap, IEEE80211_FC0_SUBTYPE_PROBE_REQ);
		/* Ext. Capabilities - For AP mode hostapd adds the extended cap */
		if (vap->iv_opmode == IEEE80211_M_STA)
			frm = ieee80211_add_extcap(frm);
	}

	frm = ieee80211_add_xrates(frm, &ic->ic_sup_rates[mode]);

	if (IS_IEEE80211_VHT_ENABLED(ic)) {
		frm = ieee80211_add_vhtcap(ni, frm, &ic->ic_vhtcap, IEEE80211_FC0_SUBTYPE_PROBE_REQ);
	} else if (IS_IEEE80211_11NG_VHT_ENABLED(ic)) {
		/* QTN 2.4G VHT IE */
		frm = ieee80211_add_vhtcap(ni, frm, &ic->ic_vhtcap_24g, IEEE80211_FC0_SUBTYPE_PROBE_REQ);
	}

	/* Only add in vendor IEs to the probe request frame. */
	if (optie != NULL) {
		struct ieee80211_ie *p_ie = (struct ieee80211_ie *)optie;
		struct ieee80211_ie *p_next_ie;
		int this_len = 0;
		do {
			p_next_ie = ieee80211_smash_ie(p_ie, optielen, &this_len);
			if (p_ie && this_len) {
				/**
				 * Rules for probe request is that vendor elements can be appended,
				 * and only a few of the standard IEs. optie as passed in can
				 * contain any one of a number of elements.
				 */
				if (p_ie->id == IEEE80211_ELEMID_VENDOR) {
					if (((struct ieee80211_ie_wme *)p_ie)->wme_type == WPA_RSN_OUI_TYPE) {
						continue;
					}
					memcpy(frm, p_ie, this_len + IEEE80211_IE_ID_LEN_SIZE);
					frm += this_len + IEEE80211_IE_ID_LEN_SIZE;
				}
				p_ie = p_next_ie;
				optielen -= this_len + IEEE80211_IE_ID_LEN_SIZE;
			}
		} while (p_next_ie != NULL);
	}

	if (vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_REQ].ie) {
		memcpy(frm, vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_REQ].ie,
			vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_REQ].length);
		frm += vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_REQ].length;
	}

	skb_trim(skb, frm - skb->data);

	wh = (struct ieee80211_frame *)
		skb_push(skb, sizeof(struct ieee80211_frame));
	ieee80211_send_setup(vap, ni, wh,
		IEEE80211_FC0_TYPE_MGT,
		IEEE80211_FC0_SUBTYPE_PROBE_REQ,
		sa, da, bssid);

	/* FIXME power management? */

	IEEE80211_NODE_STAT(ni, tx_probereq);
	IEEE80211_NODE_STAT(ni, tx_mgmt);

	IEEE80211_DPRINTF(vap, IEEE80211_MSG_DEBUG | IEEE80211_MSG_DUMPPKTS,
		"[%s] send probe req on channel %u\n",
		ether_sprintf(wh->i_addr1),
		ieee80211_chan2ieee(ic, ic->ic_curchan));

	return skb;
}
EXPORT_SYMBOL(ieee80211_get_probereq);

/*
 * Send a probe request frame with the specified ssid
 * and any optional information element data.
 */
int
ieee80211_send_probereq(struct ieee80211_node *ni,
	const u_int8_t sa[IEEE80211_ADDR_LEN],
	const u_int8_t da[IEEE80211_ADDR_LEN],
	const u_int8_t bssid[IEEE80211_ADDR_LEN],
	const u_int8_t *ssid, size_t ssidlen,
	const void *optie, size_t optielen)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = ni->ni_ic;
	struct sk_buff *skb;

	ieee80211_ref_node(ni);

	skb = ieee80211_get_probereq(ni, sa, da, bssid,
			ssid, ssidlen, optie, optielen);
	if (skb == NULL) {
		ieee80211_free_node(ni);
		return -ENOMEM;
	}

	IEEE80211_DPRINTF(vap, IEEE80211_MSG_DEBUG | IEEE80211_MSG_DUMPPKTS,
			"[%s] send probe req frame on channel %u\n",
			ether_sprintf(ni->ni_macaddr),
			ieee80211_chan2ieee(ic, ic->ic_curchan));
	ic->ic_send_80211(ic, ni, skb, WME_AC_BE, 0);

	return 0;
}

/* Send a broadcast CSA frame, announcing the new channel. References are from
 * IEEE 802.11h-2003. CSA frame format is an "Action" frame (Type: 00, Subtype:
 * 1101, see 7.1.3.1.2)
 *
 * [1] Category : 0, Spectrum Management, 7.3.1.11
 * [1] Action : 4, Channel Switch Announcement, 7.4.1 and 7.4.1.5
 * [1] Element ID : 37, Channel Switch Announcement, 7.3.2
 * [1] Length : 3, 7.3.2.20
 * [1] Channel Switch Mode : 1, stop transmission immediately
 * [1] New Channel Number
 * [1] Channel Switch Count in TBTT : 0, immediate channel switch
 *
 * csa_mode : IEEE80211_CSA_CAN_STOP_TX / IEEE80211_CSA_MUST_STOP_TX
 * csa_chan : new IEEE channel number
 * csa_tbtt : TBTT until Channel Switch happens
*/
void
ieee80211_send_csa_frame(struct ieee80211vap *vap,
				u_int8_t csa_mode,
				u_int8_t csa_chan,
				u_int8_t csa_count,
				u_int64_t tsf)
{
	struct ieee80211_node *ni = vap->iv_bss;
	struct ieee80211com *ic = ni->ni_ic;
	uint32_t bw = ieee80211_get_bw(ic);
	uint8_t wband_chanswitch_ie_len = ieee80211_wband_chanswitch_ie_len(bw);
	struct sk_buff *skb;
	int frm_len;
	u_int8_t *frm;

	frm_len = IEEE80211_CSA_LEN + ieee80211_sec_chan_off_ie_len() +
			wband_chanswitch_ie_len;

	if (tsf != 0) {
		frm_len += sizeof(struct ieee80211_ie_qtn_csa_tsf);
	}

	IEEE80211_DPRINTF(vap, IEEE80211_MSG_DOTH,
			"%s: Sending action frame with CSA IE: %u/%u/%u\n",
			__func__, csa_mode, csa_chan, csa_count);

	skb = ieee80211_getmgtframe(&frm, frm_len);
	if (skb == NULL) {
		IEEE80211_NOTE(vap, IEEE80211_MSG_ANY, ni,
			"%s: cannot get buf; size %u", __func__, frm_len);
		vap->iv_stats.is_tx_nobuf++;
		return;
	}

	*frm++ = IEEE80211_ACTION_CAT_SPEC_MGMT;  /* Category */
	*frm++ = IEEE80211_ACTION_S_CHANSWITCHANN;      /* Spectrum Management */
	frm = ieee80211_add_csa(frm, csa_mode, csa_chan, csa_count);
	ieee80211_add_sec_chan_off(&frm, ic, csa_chan);

	if (wband_chanswitch_ie_len) {
		frm = ieee80211_add_wband_chanswitch(frm, ic);
	}

	if (tsf != 0) {
		ieee80211_add_qtn_csatsf_ie(frm, tsf);
	}

	if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
		ieee80211_ref_node(ni);
		ieee80211_mgmt_output(ni, skb, IEEE80211_FC0_SUBTYPE_ACTION,
					vap->iv_dev->broadcast);
	} else {
		/* STA mode - tell AP to change channel */
		ieee80211_ref_node(ni);
		ieee80211_mgmt_output(ni, skb, IEEE80211_FC0_SUBTYPE_ACTION,
					ni->ni_bssid);
	}
}
EXPORT_SYMBOL(ieee80211_send_csa_frame);

#ifdef CONFIG_QVSP
static int
ieee80211_compile_action_qvsp_frame(struct ieee80211vap *vap, struct ieee80211_qvsp_act *qvsp_a,
				struct sk_buff **pp_skb)
{
	struct sk_buff *skb = NULL;

	switch (qvsp_a->type) {
	case QVSP_ACTION_STRM_CTRL: {
		struct ieee80211_qvsp_act_strm_ctrl *qvsp_asc =
			(struct ieee80211_qvsp_act_strm_ctrl *)qvsp_a;
		int total_len;
		struct ieee80211_qvsp_act_strm_ctrl_s *qa;
		struct ieee80211_qvsp_strm_id *qai;
		struct ieee80211_qvsp_strm_id *qvsp_asc_i = &qvsp_asc->strm_items[0];
		int i;
		u_int8_t *frm;
		IEEE80211_DPRINTF(vap, IEEE80211_MSG_ACTION,
				"VSP: constructing stream ctrl frame\n", 0);

		if (qvsp_asc->count > IEEE8021_QVSP_MAX_ACT_ITEMS) {
			printk(KERN_INFO "VSP: truncating strm ctrl frame - too long\n");
			qvsp_asc->count = IEEE8021_QVSP_MAX_ACT_ITEMS;
		}

		total_len = sizeof(*qa) + (qvsp_asc->count * sizeof(*qai));
		KASSERT(total_len <= IEEE80211_MTU_MAX, ("VSP: strm ctrl frame is too large"));
		skb = ieee80211_getmgtframe(&frm, total_len);
		if (!skb) {
			return -ENOMEM;
		}
		/* Common header */
		qa = (struct ieee80211_qvsp_act_strm_ctrl_s *)frm;
		qai = &qa->strm_items[0];
		qa->header.category = IEEE80211_ACTION_CAT_VENDOR;
		ieee80211_oui_add_qtn(qa->header.oui);
		qa->header.type = QVSP_ACTION_TYPE_VSP;
		qa->header.action = qvsp_a->type;
		qa->strm_state = qvsp_asc->strm_state;
		qa->dis_attr.throt_policy = qvsp_asc->dis_attr.throt_policy;
		qa->dis_attr.throt_rate = qvsp_asc->dis_attr.throt_rate;
		qa->dis_attr.demote_rule = qvsp_asc->dis_attr.demote_rule;
		qa->dis_attr.demote_state = qvsp_asc->dis_attr.demote_state;
		qa->count = qvsp_asc->count;
		/* Set state for one or more streams */
		for (i = 0; i < qa->count; i++) {
			*qai++ = *qvsp_asc_i++;
		}
		break;
	}
	case QVSP_ACTION_VSP_CTRL: {
		struct ieee80211_qvsp_act_cfg *qvsp_ac = (struct ieee80211_qvsp_act_cfg *)qvsp_a;
		int total_len;
		struct ieee80211_qvsp_act_vsp_ctrl_s *qa;
		struct ieee80211_qvsp_act_vsp_ctrl_item_s *qai;
		struct ieee80211_qvsp_act_cfg_item *qvsp_ac_i = &qvsp_ac->cfg_items[0];
		int i;
		u_int8_t *frm;

		IEEE80211_DPRINTF(vap, IEEE80211_MSG_ACTION,
				"VSP: constructing cfg frame\n", 0);

		if (qvsp_ac->count > IEEE8021_QVSP_MAX_ACT_ITEMS) {
			printk(KERN_INFO "VSP: truncating cfg frame - too long\n");
			qvsp_ac->count = IEEE8021_QVSP_MAX_ACT_ITEMS;
		}
		total_len = sizeof(*qa) + (qvsp_ac->count * sizeof(*qai));

		KASSERT(total_len <= IEEE80211_MTU_MAX, ("VSP: cfg frame is too large"));
		skb = ieee80211_getmgtframe(&frm, total_len);
		if (!skb) {
			return -ENOMEM;
		}
		/* Common header */
		qa = (struct ieee80211_qvsp_act_vsp_ctrl_s *)frm;
		qai = &qa->ctrl_items[0];
		qa->header.category = IEEE80211_ACTION_CAT_VENDOR;
		ieee80211_oui_add_qtn(qa->header.oui);
		qa->header.type = QVSP_ACTION_TYPE_VSP;
		qa->header.action = qvsp_a->type;
		qa->count = qvsp_ac->count;
		/* Zero or more config index/value pairs. */
		for (i = 0; i < qa->count; i++) {
			qai->index = htonl(qvsp_ac_i->index);
			qai->value = htonl(qvsp_ac_i->value);
			qai++;
			qvsp_ac_i++;
		}
		break;
	}
	default:
		break;
	}

	if (skb) {
		*pp_skb = skb;
		return 0;
	}

	return -EINVAL;
}
#endif

static int
ieee80211_compile_action_20_40_coex_frame(struct ieee80211vap *vap, struct ieee80211_action_data *action_data,
				struct sk_buff **pp_skb, struct ieee80211_node *ni)
{
	struct sk_buff *skb;
	int32_t frame_len = 0;
	struct ieee80211com *ic = vap->iv_ic;
	uint8_t *frm;
	uint8_t *coex_value = (uint8_t *)action_data->params;
	uint8_t coex = vap->iv_coex;
	uint16_t ch_list = 0;

	if (coex_value)
		coex = *coex_value;

	frame_len = sizeof(struct ieee80211_action) + sizeof(struct ieee80211_20_40_coex_param);

	if (ic->ic_opmode == IEEE80211_M_STA) {
		uint8_t chan_count;
		ieee80211_get_20_40_bss_into_chan_list(ic, vap, &ch_list);
		chan_count = ieee80211_count_channels(ch_list);
		if (chan_count) {
			frame_len +=  sizeof(struct ieee80211_20_40_in_ch_rep) + chan_count;
			coex |=  WLAN_20_40_BSS_COEX_20MHZ_WIDTH_REQ;
		}
	}

	skb = ieee80211_getmgtframe(&frm, frame_len);
	if (skb == NULL)
		return -1;

	*frm++ = action_data->cat;
	*frm++ = action_data->action;

	frm = ieee80211_add_20_40_bss_coex_ie(frm, coex);

	if (ic->ic_opmode == IEEE80211_M_STA && ch_list) {
		frm = ieee80211_add_20_40_bss_into_ch_rep(frm, ic, ch_list);
	}

	ni->ni_coex = 0;
	skb_trim(skb, frm - skb->data);

	if (skb) {
		*pp_skb = skb;
	}

	return 0;

}

static int
ieee80211_compile_action_sa_query_frame(struct ieee80211vap *vap, struct ieee80211_action_data *action_data,
				struct sk_buff **pp_skb){

	struct sk_buff *skb;
	int32_t frame_len = 0;
	u_int8_t *frm;
	uint16_t *tid = (uint16_t *)action_data->params;
	frame_len = sizeof(struct ieee80211_action_sa_query);

	skb = ieee80211_getmgtframe(&frm, frame_len);
	if (skb == NULL)
		return -1;

	*frm++ = IEEE80211_ACTION_CAT_SA_QUERY;
	*frm++ = action_data->action;
	ADDINT16(frm, *tid);

	skb_trim(skb, frm - skb->data);
	*pp_skb = skb;

	return 0;
}
int32_t ieee80211_measure_request_ie_len(struct ieee80211_meas_request_ctrl *mrequest_ctrl)
{
	int32_t meas_ie_len;

	switch (mrequest_ctrl->meas_type) {
	case IEEE80211_CCA_MEASTYPE_BASIC:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq);
		break;
	case IEEE80211_CCA_MEASTYPE_CCA:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq);
		break;
	case IEEE80211_CCA_MEASTYPE_RPI:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq);
		break;
	case IEEE80211_RM_MEASTYPE_STA:
	{
		int32_t cnt;
		ieee80211_11k_sub_element *p_se;
		ieee80211_11k_sub_element_head *se_head;

		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq_sta_stat);

		if (mrequest_ctrl->u.sta_stats.sub_item == NULL) {
			break;
		}

		se_head = (ieee80211_11k_sub_element_head *)mrequest_ctrl->u.sta_stats.sub_item;
		SLIST_FOREACH(p_se, se_head, next) {
			switch (p_se->sub_id) {
			case IEEE80211_ELEMID_VENDOR:
			{
				struct stastats_subele_vendor *vendor;
				u_int32_t flags;

				meas_ie_len += sizeof(struct ieee80211_ie_qtn_rm_measure_sta);
				vendor = (struct stastats_subele_vendor *)p_se->data;
				flags = vendor->flags;

				if (!IEEE80211_IS_ALL_SET(flags, RM_QTN_MAX)) {
					meas_ie_len += 1;

					for (cnt = RM_QTN_TX_STATS; cnt <= RM_QTN_MAX; cnt++) {
						if (flags & (BIT(cnt)))
							meas_ie_len += 2;
					}

					for (cnt = RM_QTN_CTRL_START; cnt <= RM_QTN_CTRL_END; cnt++) {
						if (flags & (BIT(cnt)))
							meas_ie_len += 2;
					}
				}

				break;
			}
			default:
				break;
			}
		}
		break;
	}
	case IEEE80211_RM_MEASTYPE_QTN_CCA:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq);
		break;
	case IEEE80211_RM_MEASTYPE_CH_LOAD:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq_chan_load);
		break;
	case IEEE80211_RM_MEASTYPE_NOISE:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq_noise_his);
		break;
	case IEEE80211_RM_MEASTYPE_BEACON:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq_beacon);
		break;
	case IEEE80211_RM_MEASTYPE_FRAME:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq_frame);
		break;
	case IEEE80211_RM_MEASTYPE_CATEGORY:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq_trans_stream_cat);
		break;
	case IEEE80211_RM_MEASTYPE_MUL_DIAG:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ sizeof(struct ieee80211_ie_measreq_multicast_diag);
		break;
	default:
		meas_ie_len = -1;
		break;
	}

	return meas_ie_len;
}

int32_t ieee80211_measure_report_ie_len(struct ieee80211_meas_report_ctrl *mreport_ctrl)
{
	int32_t meas_ie_len;

	/* measurement report filed would not exist if any bit of measurement report is set */
	switch (mreport_ctrl->meas_type) {
	case IEEE80211_CCA_MEASTYPE_BASIC:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ ((mreport_ctrl->report_mode == 0) ? sizeof(struct ieee80211_ie_measrep_basic) : 0);
		break;
	case IEEE80211_CCA_MEASTYPE_CCA:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ ((mreport_ctrl->report_mode == 0) ? sizeof(struct ieee80211_ie_measrep_cca) : 0);
		break;
	case IEEE80211_CCA_MEASTYPE_RPI:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ ((mreport_ctrl->report_mode == 0) ? sizeof(struct ieee80211_ie_measrep_rpi) : 0);
		break;
	case IEEE80211_RM_MEASTYPE_STA:
	{
		int32_t cnt;

		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm);
		if (mreport_ctrl->report_mode == 0) {
			ieee80211_11k_sub_element *p_se;
			ieee80211_11k_sub_element_head *se_head;

			meas_ie_len += sizeof(struct ieee80211_ie_measrep_sta_stat);

			if (0 == mreport_ctrl->u.sta_stats.group_id)
				meas_ie_len += sizeof(struct ieee80211_rm_sta_stats_group0);
			else if (1 == mreport_ctrl->u.sta_stats.group_id)
				meas_ie_len += sizeof(struct ieee80211_rm_sta_stats_group1);
			else if (1 < mreport_ctrl->u.sta_stats.group_id && mreport_ctrl->u.sta_stats.group_id < 10)
				meas_ie_len += sizeof(struct ieee80211_rm_sta_stats_group2to9);
			else if (10 == mreport_ctrl->u.sta_stats.group_id)
				meas_ie_len += sizeof(struct ieee80211_rm_sta_stats_group10);
			else if (11 == mreport_ctrl->u.sta_stats.group_id)
				meas_ie_len += sizeof(struct ieee80211_rm_sta_stats_group11);
			else if (12 == mreport_ctrl->u.sta_stats.group_id)
				meas_ie_len += sizeof(struct ieee80211_rm_sta_stats_group12);
			else if (13 == mreport_ctrl->u.sta_stats.group_id)
				meas_ie_len += sizeof(struct ieee80211_rm_sta_stats_group13);
			else if (14 == mreport_ctrl->u.sta_stats.group_id)
				meas_ie_len += sizeof(struct ieee80211_rm_sta_stats_group14);
			else if (15 == mreport_ctrl->u.sta_stats.group_id)
				meas_ie_len += sizeof(struct ieee80211_rm_sta_stats_group15);
			else
				meas_ie_len += sizeof(struct ieee80211_rm_sta_stats_group16);

			if (mreport_ctrl->u.sta_stats.sub_item == NULL) {
				break;
			}

			se_head = (ieee80211_11k_sub_element_head *)mreport_ctrl->u.sta_stats.sub_item;
			/* optional sub element length */
			SLIST_FOREACH(p_se, se_head, next) {
				switch (p_se->sub_id) {
				case IEEE80211_ELEMID_VENDOR:
				{
					struct stastats_subele_vendor *vendor = (struct stastats_subele_vendor *)p_se->data;
					u_int32_t vendor_flags = vendor->flags;

					meas_ie_len += sizeof(struct ieee80211_ie_qtn_rm_measure_sta);
					if (IEEE80211_IS_ALL_SET(vendor_flags, RM_QTN_MAX)) {
						meas_ie_len += sizeof(struct ieee80211_ie_qtn_rm_sta_all);
					} else {
						meas_ie_len++;

						for (cnt = RM_QTN_TX_STATS; cnt <= RM_QTN_MAX; cnt++) {
							if (vendor_flags & (BIT(cnt))) {
								meas_ie_len += 2;
								meas_ie_len += ieee80211_meas_sta_qtn_report_subtype_len[cnt];
							}
						}

						for (cnt = RM_QTN_CTRL_START; cnt <= RM_QTN_CTRL_END; cnt++) {
							if (vendor_flags & (BIT(cnt))) {
								meas_ie_len += 2;
								meas_ie_len += ieee80211_meas_sta_qtn_report_subtype_len[cnt];
							}
						}
					}
					break;
				}
				default:
					break;
				}
			}
		}
		break;
	}
	case IEEE80211_RM_MEASTYPE_QTN_CCA:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ ((mreport_ctrl->report_mode == 0) ?
				sizeof(struct cca_rm_rep_data) + sizeof(struct ieee80211_ie_qtn_scs) : 0) +
			mreport_ctrl->u.qtn_cca.extra_ie_len;
		break;
	case IEEE80211_RM_MEASTYPE_CH_LOAD:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ ((mreport_ctrl->report_mode == 0) ? (sizeof(struct ieee80211_ie_measrep_chan_load)) : (0));
		break;
	case IEEE80211_RM_MEASTYPE_NOISE:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ ((mreport_ctrl->report_mode == 0) ? (sizeof(struct ieee80211_ie_measrep_noise_his)) : (0));
		break;
	case IEEE80211_RM_MEASTYPE_BEACON:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ ((mreport_ctrl->report_mode == 0) ? (sizeof(struct ieee80211_ie_measrep_beacon)) : (0));
		break;
	case IEEE80211_RM_MEASTYPE_FRAME:
	{
		ieee80211_11k_sub_element *p_se;
		ieee80211_11k_sub_element_head *se_head;

		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm);

		if (mreport_ctrl->report_mode == 0) {
			meas_ie_len += sizeof(struct ieee80211_ie_measrep_frame);

			se_head = (ieee80211_11k_sub_element_head *)mreport_ctrl->u.frame.sub_item;
			SLIST_FOREACH(p_se, se_head, next) {
				switch (p_se->sub_id) {
				case IEEE80211_FRAME_REPORT_SUBELE_FRAME_COUNT_REPORT:
					meas_ie_len += sizeof(struct ieee80211_subie_section_frame_entry);
					break;
				default:
					break;
				}
			}
		}
		break;
	}
	case IEEE80211_RM_MEASTYPE_CATEGORY:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ ((mreport_ctrl->report_mode == 0) ? (sizeof(struct ieee80211_ie_measrep_trans_stream_cat)) : (0));
		break;
	case IEEE80211_RM_MEASTYPE_MUL_DIAG:
		meas_ie_len = sizeof(struct ieee80211_ie_measure_comm)
			+ ((mreport_ctrl->report_mode == 0) ? (sizeof(struct ieee80211_ie_measrep_multicast_diag)) : (0));
		break;
	default:
		meas_ie_len = -1;
		break;
	}

	return meas_ie_len;
}

u_int8_t *ieee80211_measure_request_ie_generate(struct ieee80211_node *ni,
		u_int8_t *frm,
		struct ieee80211_meas_request_ctrl *mrequest_ctrl)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = vap->iv_ic;
	u_int8_t *ele_len;


	*frm++ = IEEE80211_ELEMID_MEASREQ;
	ele_len = frm;
	*frm++ = 0;	/* will be filled when finished */
	*frm++ = 1;	/* measurement token */
	*frm++ = 0;	/* mode */
	*frm++ = mrequest_ctrl->meas_type;

	switch (mrequest_ctrl->meas_type) {
	case IEEE80211_CCA_MEASTYPE_BASIC:
	{
		*frm++ = mrequest_ctrl->u.basic.channel;
		ADDINT32(frm, *((u_int32_t *)&mrequest_ctrl->u.basic.start_tsf));
		ADDINT32(frm, *((u_int32_t *)&mrequest_ctrl->u.basic.start_tsf + 1));
		ADDINT16(frm, IEEE80211_MS_TO_TU(mrequest_ctrl->u.basic.duration_ms));

		break;
	}
	case IEEE80211_CCA_MEASTYPE_CCA:
	{
		*frm++ = mrequest_ctrl->u.cca.channel;
		ADDINT32(frm, *((u_int32_t *)&mrequest_ctrl->u.cca.start_tsf));
		ADDINT32(frm, *((u_int32_t *)&mrequest_ctrl->u.cca.start_tsf + 1));
		ADDINT16(frm, IEEE80211_MS_TO_TU(mrequest_ctrl->u.cca.duration_ms));

		break;
	}
	case IEEE80211_CCA_MEASTYPE_RPI:
	{
		*frm++ = mrequest_ctrl->u.rpi.channel;
		ADDINT32(frm, *((u_int32_t *)&mrequest_ctrl->u.rpi.start_tsf));
		ADDINT32(frm, *((u_int32_t *)&mrequest_ctrl->u.cca.start_tsf + 1));
		ADDINT16(frm, IEEE80211_MS_TO_TU(mrequest_ctrl->u.rpi.duration_ms));

		break;
	}
	case IEEE80211_RM_MEASTYPE_STA:
	{
		u_int16_t random_interval;
		ieee80211_11k_sub_element *p_se;
		ieee80211_11k_sub_element_head *se_head;

		memcpy(frm, ni->ni_macaddr, IEEE80211_ADDR_LEN);
		frm += IEEE80211_ADDR_LEN;
		get_random_bytes(&random_interval, 1);
		ADDINT16(frm, random_interval);
		ADDINT16(frm, mrequest_ctrl->u.sta_stats.duration_tu);
		*frm++ = mrequest_ctrl->u.sta_stats.group_id;

		/* optional sub element */
		if (mrequest_ctrl->u.sta_stats.sub_item != NULL) {
			se_head = (ieee80211_11k_sub_element_head *)mrequest_ctrl->u.sta_stats.sub_item;
			while (!SLIST_EMPTY(se_head)) {
				p_se = SLIST_FIRST(se_head);
				switch (p_se->sub_id) {
				case IEEE80211_ELEMID_VENDOR:
				{
					struct stastats_subele_vendor *vendor = (struct stastats_subele_vendor *)p_se->data;
					u_int8_t *vendor_ie_len;

					if (vendor->flags & RM_QTN_MEASURE_MASK) {
						*frm++ = IEEE80211_ELEMID_VENDOR;
						vendor_ie_len = frm;
						*frm++ = 0;
						frm += ieee80211_oui_add_qtn(frm);
						*frm++ = ni->ni_rm_sta_seq++;

						if (IEEE80211_IS_ALL_SET(vendor->flags, RM_QTN_MAX)) {
							*frm++ = QTN_OUI_RM_ALL;
						} else {
							u_int8_t cnt, *p_tlv_cnt;

							*frm++ =  QTN_OUI_RM_SPCIAL;
							p_tlv_cnt = frm;
							*frm++ = 0;

							for (cnt = RM_QTN_TX_STATS; cnt <= RM_QTN_MAX; cnt++) {
								if (vendor->flags & (BIT(cnt))) {
									*frm++ = cnt;
									*frm++ = 0;
									*p_tlv_cnt += 1;
								}
							}

							for (cnt = RM_QTN_CTRL_START; cnt <= RM_QTN_CTRL_END; cnt++) {
								if (vendor->flags & (BIT(cnt))) {
									*frm++ = cnt;
									*frm++ = 0;
									*p_tlv_cnt += 1;
								}
							}
						}
						*vendor_ie_len = frm - vendor_ie_len - 1;
					}
					break;
				}
				default:
					break;
				}
				SLIST_REMOVE_HEAD(se_head, next);
				kfree(p_se);
			}
		}

		break;
	}
	case IEEE80211_RM_MEASTYPE_QTN_CCA:
	{
		/* replace with real type */
		*(frm - 1) = IEEE80211_CCA_MEASTYPE_CCA;

		*frm++ = ic->ic_curchan->ic_ieee;
		ADDINT32(frm, 0);
		ADDINT32(frm, 0);
		ADDINT16(frm, IEEE80211_MS_TO_TU(mrequest_ctrl->u.qtn_cca.duration_tu));
		break;
	}
	case IEEE80211_RM_MEASTYPE_CH_LOAD:
	{
		*frm++ = 0;	/* TODO: operating class, figure out a correct mapping */
		*frm++ = mrequest_ctrl->u.chan_load.channel;
		ADDINT16(frm, 0);
		ADDINT16(frm, IEEE80211_MS_TO_TU(mrequest_ctrl->u.chan_load.duration_ms));

		break;
	}
	case IEEE80211_RM_MEASTYPE_NOISE:
	{
		*frm++ = 0;	/* TODO: operating class, figure out a correct mapping */
		*frm++ = mrequest_ctrl->u.noise_his.channel;
		ADDINT16(frm, 0);
		ADDINT16(frm, IEEE80211_MS_TO_TU(mrequest_ctrl->u.noise_his.duration_ms));

		break;
	}
	case IEEE80211_RM_MEASTYPE_BEACON:
	{
		*frm++ = mrequest_ctrl->u.beacon.op_class;
		*frm++ = mrequest_ctrl->u.beacon.channel;
		ADDINT16(frm, 0);
		ADDINT16(frm, IEEE80211_MS_TO_TU(mrequest_ctrl->u.beacon.duration_ms));
		*frm++ = mrequest_ctrl->u.beacon.mode;
		memcpy(frm, mrequest_ctrl->u.beacon.bssid, IEEE80211_ADDR_LEN);
		frm += IEEE80211_ADDR_LEN;
		if (mrequest_ctrl->u.beacon.ssid_len) {
			*frm++ = IEEE80211_ELEMID_SSID;
			*frm++ = mrequest_ctrl->u.beacon.ssid_len;
			memcpy(frm, mrequest_ctrl->u.beacon.ssid, mrequest_ctrl->u.beacon.ssid_len);
			frm += mrequest_ctrl->u.beacon.ssid_len;
		}
		break;
	}
	case IEEE80211_RM_MEASTYPE_FRAME:
	{
		*frm++ = mrequest_ctrl->u.frame.op_class;
		*frm++ = mrequest_ctrl->u.frame.channel;
		ADDINT16(frm, 0);
		ADDINT16(frm, IEEE80211_MS_TO_TU(mrequest_ctrl->u.frame.duration_ms));
		*frm++ = mrequest_ctrl->u.frame.type;
		memcpy(frm, mrequest_ctrl->u.frame.mac_address, IEEE80211_ADDR_LEN);
		frm += IEEE80211_ADDR_LEN;

		break;
	}
	case IEEE80211_RM_MEASTYPE_CATEGORY:
	{
		ADDINT16(frm, 0);
		ADDINT16(frm, IEEE80211_MS_TO_TU(mrequest_ctrl->u.tran_stream_cat.duration_ms));
		memcpy(frm, mrequest_ctrl->u.tran_stream_cat.peer_sta, IEEE80211_ADDR_LEN);
		frm += IEEE80211_ADDR_LEN;
		*frm++ = mrequest_ctrl->u.tran_stream_cat.tid;
		*frm++ = mrequest_ctrl->u.tran_stream_cat.bin0;

		break;
	}
	case IEEE80211_RM_MEASTYPE_MUL_DIAG:
		ADDINT16(frm, 0);
		ADDINT16(frm, IEEE80211_MS_TO_TU(mrequest_ctrl->u.multicast_diag.duration_ms));
		memcpy(frm, mrequest_ctrl->u.multicast_diag.group_mac, IEEE80211_ADDR_LEN);
		frm += IEEE80211_ADDR_LEN;

		break;
	default:
		break;
	}
	*ele_len = (frm - ele_len) - 1;

	return frm;
}

u_int8_t *ieee80211_measure_report_ie_generate(struct ieee80211_node *ni,
		u_int8_t *frm,
		struct ieee80211_meas_report_ctrl *mreport_ctrl)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = vap->iv_ic;
	u_int8_t *ele_len;

	/* common part */
	*frm++ = IEEE80211_ELEMID_MEASREP;
	ele_len = frm;
	*frm++ = 0;
	if (mreport_ctrl->autonomous)
		*frm++ = 0;
	else
		*frm++ = mreport_ctrl->meas_token;
	*frm++ = mreport_ctrl->report_mode;
	*frm++ = mreport_ctrl->meas_type;

	if (mreport_ctrl->report_mode == 0) {
		switch (mreport_ctrl->meas_type) {
		case IEEE80211_CCA_MEASTYPE_BASIC:
		{
			*frm++ = mreport_ctrl->u.basic.channel;
			ADDINT32(frm, *((u_int32_t *)&mreport_ctrl->u.basic.start_tsf));
			ADDINT32(frm, *((u_int32_t *)&mreport_ctrl->u.basic.start_tsf) + 1);
			ADDINT16(frm, mreport_ctrl->u.basic.duration_tu);
			*frm++ = mreport_ctrl->u.basic.basic_report;

			break;
		}
		case IEEE80211_CCA_MEASTYPE_CCA:
		{
			*frm++ = mreport_ctrl->u.cca.channel;
			ADDINT32(frm, *((u_int32_t *)&mreport_ctrl->u.cca.start_tsf));
			ADDINT32(frm, *((u_int32_t *)&mreport_ctrl->u.cca.start_tsf) + 1);
			ADDINT16(frm, mreport_ctrl->u.cca.duration_tu);
			*frm++ = mreport_ctrl->u.cca.cca_report;

			break;
		}
		case IEEE80211_CCA_MEASTYPE_RPI:
		{
			*frm++ = mreport_ctrl->u.rpi.channel;
			ADDINT32(frm, *((u_int32_t *)&mreport_ctrl->u.rpi.start_tsf));
			ADDINT32(frm, *((u_int32_t *)&mreport_ctrl->u.rpi.start_tsf) + 1);
			ADDINT16(frm, mreport_ctrl->u.rpi.duration_tu);
			memcpy(frm, mreport_ctrl->u.rpi.rpi_report, sizeof(mreport_ctrl->u.rpi.rpi_report));
			frm += sizeof(mreport_ctrl->u.rpi.rpi_report);

			break;
		}
		case IEEE80211_RM_MEASTYPE_STA:
		{
			u_int8_t group_len;
			ieee80211_11k_sub_element *p_se;
			ieee80211_11k_sub_element_head *se_head;
			struct ieee80211_nodestats *stats;
			u_int8_t assoc_bw;

			ADDINT16(frm, mreport_ctrl->u.sta_stats.duration_tu);
			*frm++ = mreport_ctrl->u.sta_stats.group_id;

			switch (mreport_ctrl->u.sta_stats.group_id) {
			case 0:
				group_len = sizeof(struct ieee80211_rm_sta_stats_group0);
				break;
			case 1:
				group_len = sizeof(struct ieee80211_rm_sta_stats_group0);
				break;
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
			case 9:
				group_len = sizeof(struct ieee80211_rm_sta_stats_group2to9);
				break;
			case 10:
				group_len = sizeof(struct ieee80211_rm_sta_stats_group10);
				break;
			case 11:
				group_len = sizeof(struct ieee80211_rm_sta_stats_group11);
				break;
			case 12:
				group_len = sizeof(struct ieee80211_rm_sta_stats_group12);
				break;
			case 13:
				group_len = sizeof(struct ieee80211_rm_sta_stats_group13);
				break;
			case 14:
				group_len = sizeof(struct ieee80211_rm_sta_stats_group14);
				break;
			case 15:
				group_len = sizeof(struct ieee80211_rm_sta_stats_group15);
				break;
			case 16:
				group_len = sizeof(struct ieee80211_rm_sta_stats_group16);
				break;
			default:
				group_len = sizeof(struct ieee80211_ie_qtn_rm_sta_all);
				break;
			}
			frm += group_len;

			if (mreport_ctrl->u.sta_stats.sub_item != NULL) {
				se_head = (ieee80211_11k_sub_element_head *)mreport_ctrl->u.sta_stats.sub_item;
				while (!SLIST_EMPTY(se_head)) {
					p_se = SLIST_FIRST(se_head);
					switch (p_se->sub_id) {
					case IEEE80211_ELEMID_VENDOR:
					{
						struct stastats_subele_vendor *vendor = (struct stastats_subele_vendor *)p_se->data;
						u_int32_t vendor_flags = vendor->flags;
						u_int8_t sequence = vendor->sequence;

						if (vendor_flags & RM_QTN_MEASURE_MASK) {
							u_int8_t *vendor_ie_len;

							*frm++ = IEEE80211_ELEMID_VENDOR;
							vendor_ie_len = frm;
							*frm++ = 0;
							frm += ieee80211_oui_add_qtn(frm);
							*frm++ = sequence;

							stats = &ni->ni_stats;

							if (IS_IEEE80211_VHT_ENABLED(ic) && (ni->ni_flags & IEEE80211_NODE_VHT)) {
								 switch (ni->ni_vhtcap.chanwidth) {
									case IEEE80211_VHTCAP_CW_160M:
									case IEEE80211_VHTCAP_CW_160_AND_80P80M:
										assoc_bw = 160;
										break;
									case IEEE80211_VHTCAP_CW_80M_ONLY:
									default:
										assoc_bw = 80;
								}
							} else {
								if (ic->ic_htcap.cap & IEEE80211_HTCAP_C_CHWIDTH40 &&
									ni->ni_htcap.cap & IEEE80211_HTCAP_C_CHWIDTH40) {
									assoc_bw = 40;
								} else {
									assoc_bw = 20;
								}
							}

							ic->ic_iterate_nodes(&ic->ic_sta, get_node_info, (void *)NULL, 1);

							if (IEEE80211_IS_ALL_SET(vendor_flags, RM_QTN_MAX)) {
								*frm++ = QTN_OUI_RM_ALL;

								/* fill the content here */
								/* fill the sta tx statistics */
								ADDINT32TO64(frm, stats->ns_tx_bytes);
								ADDINT32(frm, stats->ns_tx_data);
								ADDINT32(frm, stats->ns_tx_dropped);
								ADDINT32(frm, stats->ns_tx_errors);
								ADDINT32(frm, stats->ns_tx_ucast);
								ADDINT32(frm, stats->ns_tx_mcast);
								ADDINT32(frm, stats->ns_tx_bcast);

								/* fill the sta rx statistics */
								ADDINT32TO64(frm, stats->ns_rx_bytes);
								ADDINT32(frm, stats->ns_rx_data);
								ADDINT32(frm, stats->ns_rx_dropped);
								ADDINT32(frm, stats->ns_rx_errors);
								ADDINT32(frm, stats->ns_rx_ucast);
								ADDINT32(frm, stats->ns_rx_mcast);
								ADDINT32(frm, stats->ns_rx_bcast);

								/* fill the sta parameters */
								ADDINT32(frm, ni->ni_max_queue);
								ADDINT16TO32(frm, ni->ni_linkqual);
								ADDINT32(frm, ni->ni_smthd_rssi);
								ADDINT8TO32(frm, assoc_bw);
								ADDINT32(frm, ni->ni_snr);
								ADDINT8TO32(frm, ni->ni_rates.rs_rates[ni->ni_txrate]);
								ADDINT16TO32(frm, ni->ni_rx_phy_rate);
							} else {
								u_int8_t *p_tlv_cnt;
								u_int8_t i;

								*frm++ = QTN_OUI_RM_SPCIAL;
								p_tlv_cnt = frm;
								*frm++ = 0;

								for (i = 0; i <= RM_QTN_MAX; i++) {
									if (vendor_flags & (BIT(i))) {
										*p_tlv_cnt += 1;
										*frm++ = i;
										switch (i) {
										case RM_QTN_TX_STATS:
										{
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											ADDINT32TO64(frm, stats->ns_tx_bytes);
											ADDINT32(frm, stats->ns_tx_data);
											ADDINT32(frm, stats->ns_tx_dropped);
											ADDINT32(frm, stats->ns_tx_errors);
											ADDINT32(frm, stats->ns_tx_ucast);
											ADDINT32(frm, stats->ns_tx_mcast);
											ADDINT32(frm, stats->ns_tx_bcast);
											break;
										}
										case RM_QTN_RX_STATS:
										{
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											ADDINT32TO64(frm, stats->ns_rx_bytes);
											ADDINT32(frm, stats->ns_rx_data);
											ADDINT32(frm, stats->ns_rx_dropped);
											ADDINT32(frm, stats->ns_rx_errors);
											ADDINT32(frm, stats->ns_rx_ucast);
											ADDINT32(frm, stats->ns_rx_mcast);
											ADDINT32(frm, stats->ns_rx_bcast);
											break;
										}
										case RM_QTN_MAX_QUEUED:
										{
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											ADDINT32(frm, ni->ni_max_queue);
											break;
										}
										case RM_QTN_LINK_QUALITY:
										{
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											ADDINT32(frm, ni->ni_linkqual);
											break;
										}
										case RM_QTN_RSSI_DBM:
										{
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											ADDINT32(frm, ni->ni_smthd_rssi);
											break;
										}
										case RM_QTN_BANDWIDTH:
										{
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											ADDINT32(frm, assoc_bw);
											break;
										}
										case RM_QTN_SNR:
										{
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											ADDINT32(frm, ni->ni_snr);
											break;
										}
										case RM_QTN_TX_PHY_RATE:
										{
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											ADDINT32(frm, ni->ni_linkqual);
											break;
										}
										case RM_QTN_RX_PHY_RATE:
										{
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											ADDINT32(frm, ni->ni_rx_phy_rate);
											break;
										}
										case RM_QTN_CCA:
										{
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											/* Reserved for cca */
											ADDINT32(frm, 0);
											break;
										}
										case RM_QTN_BR_IP:
										{
											/* Vendor specific content: tlv length field */
											__be32 br_ip = 0;
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											if (ic->ic_getparam != NULL) {
												(*ic->ic_getparam)(ni, IEEE80211_PARAM_BR_IP_ADDR,
														(int *)&br_ip, NULL, NULL);
											}
											ADDINT32(frm, br_ip);
											break;
										}
										case RM_QTN_RSSI:
										{
											int32_t local_rssi = 0;
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];

											if (ic->ic_rssi) {
												local_rssi = ic->ic_rssi(ni);
											}


											if (local_rssi < -1 && local_rssi > -1200) {
												local_rssi += 900;
											}

											if (local_rssi < 0) {
												local_rssi = 0;
											}

											ADDINT32(frm, local_rssi);
											break;
										}
										case RM_QTN_HW_NOISE:
										{
											int32_t local_noise = 0;
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];

											local_noise = ic->ic_hw_noise(ni);

											ADDINT32(frm, local_noise);

											break;
										}
										case RM_QTN_SOC_MACADDR:
										{
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];

											memcpy(frm, ic->soc_addr, IEEE80211_ADDR_LEN);
											frm += IEEE80211_ADDR_LEN;

											break;
										}
										case RM_QTN_SOC_IPADDR:
										{
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];

											ADDINT32(frm, ic->ic_soc_ipaddr);

											break;
										}
										default:
											/* Vendor specific content: tlv length field */
											*frm++ = sizeof(u_int32_t);
											/* unkown type report 0 */
											ADDINT32(frm, 0);
											break;
										}
									}
								}

								for (i = RM_QTN_CTRL_START; i <= RM_QTN_CTRL_END; i++) {
									if (vendor_flags & (BIT(i))) {
										*frm++ = i;
										switch(i) {
										case RM_QTN_RESET_CNTS:
										{
											int32_t		ret;
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											/* reset all counter */
											ret = ieee80211_rst_dev_stats(vap);
											ADDINT32(frm, ret);
											break;
										}
										case RM_QTN_RESET_QUEUED:
											/* Vendor specific content: tlv length field */
											*frm++ = ieee80211_meas_sta_qtn_report_subtype_len[i];
											/* reset all counter */
											ic->ic_queue_reset(ni);
											ADDINT32(frm, 0);
											break;
										default:
											/* Vendor specific content: tlv length field */
											*frm++ = sizeof(int32_t);
											ADDINT32(frm, -1);
											break;
										}
									}
								}
							}
							*vendor_ie_len = frm - vendor_ie_len - 1;
						}
						break;
					}
					default:
						printk("unknown STA Statistics sub element, ID = %d\n", p_se->sub_id);
						break;
					}
					SLIST_REMOVE_HEAD(se_head, next);
					kfree(p_se);
				}
			}

			break;
		}
		case IEEE80211_RM_MEASTYPE_QTN_CCA:
		{
			u_int8_t *vendor_ie_len;

			/* replace with real type */
			*(frm - 1) = IEEE80211_CCA_MEASTYPE_CCA;

			*frm++ = mreport_ctrl->u.qtn_cca.channel;
			ADDINT32LE(frm, *((u_int32_t *)&mreport_ctrl->u.qtn_cca.start_tsf));
			ADDINT32LE(frm, *((u_int32_t *)&mreport_ctrl->u.qtn_cca.start_tsf) + 1);
			ADDINT16LE(frm, IEEE80211_MS_TO_TU(mreport_ctrl->u.qtn_cca.duration_ms));
			*frm++ = mreport_ctrl->u.qtn_cca.qtn_cca_report;

			/* qtn SCS IE */
			*frm++ = IEEE80211_ELEMID_VENDOR;
			vendor_ie_len = frm;
			*frm++ = 0;
			frm += ieee80211_oui_add_qtn(frm);
			*frm++ = QTN_OUI_SCS;
			*frm++ = mreport_ctrl->u.qtn_cca.type;
			if (QTN_SCS_IE_TYPE_STA_INTF_RPT == mreport_ctrl->u.qtn_cca.type) {
				ADDINT32LE(frm, mreport_ctrl->u.qtn_cca.u.qtn_cca_info.sp_fail);
				ADDINT32LE(frm, mreport_ctrl->u.qtn_cca.u.qtn_cca_info.lp_fail);
				ADDINT16LE(frm, mreport_ctrl->u.qtn_cca.u.qtn_cca_info.others_time);
			} else if (QTN_SCS_IE_TYPE_STA_DFS_RPT == mreport_ctrl->u.qtn_cca.type) {
				ADDINT16LE(frm, mreport_ctrl->u.qtn_cca.u.qtn_dfs_info.dfs_enabled);
				*frm++ = mreport_ctrl->u.qtn_cca.u.qtn_dfs_info.max_txpower;
			} else if (QTN_SCS_IE_TYPE_STA_FAT_RPT == mreport_ctrl->u.qtn_cca.type) {
				ADDINT16LE(frm, mreport_ctrl->u.qtn_cca.u.qtn_fat_info.free_airtime);
			}
			ADDINT16LE(frm, mreport_ctrl->u.qtn_cca.extra_ie_len);
			memcpy(frm, mreport_ctrl->u.qtn_cca.extra_ie,
						mreport_ctrl->u.qtn_cca.extra_ie_len);
			frm += mreport_ctrl->u.qtn_cca.extra_ie_len;
			*vendor_ie_len = frm - vendor_ie_len - 1;

			break;
		}
		case IEEE80211_RM_MEASTYPE_CH_LOAD:
		{
			u_int64_t tsf;

			ic->ic_get_tsf(&tsf);

			*frm++ = mreport_ctrl->u.chan_load.op_class;
			*frm++ = mreport_ctrl->u.chan_load.channel;
			ADDINT32(frm, *((u_int32_t *)&tsf));
			ADDINT32(frm, *((u_int32_t *)&tsf + 1));
			ADDINT16(frm, mreport_ctrl->u.chan_load.duration_tu);
			*frm++ = mreport_ctrl->u.chan_load.channel_load;

			break;
		}
		case IEEE80211_RM_MEASTYPE_NOISE:
		{
			u_int64_t tsf;

			ic->ic_get_tsf(&tsf);

			*frm++ = mreport_ctrl->u.noise_his.op_class;
			*frm++ = mreport_ctrl->u.noise_his.channel;
			ADDINT32(frm, *((u_int32_t *)&tsf));
			ADDINT32(frm, *((u_int32_t *)&tsf + 1));
			ADDINT16(frm, mreport_ctrl->u.noise_his.duration_tu);
			*frm++ = mreport_ctrl->u.noise_his.antenna_id;
			*frm++ = mreport_ctrl->u.noise_his.anpi;
			memcpy(frm, mreport_ctrl->u.noise_his.ipi, sizeof(mreport_ctrl->u.noise_his.ipi));
			frm += sizeof(mreport_ctrl->u.noise_his.ipi);

			break;
		}
		case IEEE80211_RM_MEASTYPE_BEACON:
		{
			u_int64_t tsf;

			ic->ic_get_tsf(&tsf);

			*frm++ = mreport_ctrl->u.beacon.op_class;
			*frm++ = mreport_ctrl->u.beacon.channel;
			ADDINT32(frm, *((u_int32_t *)&tsf));
			ADDINT32(frm, *((u_int32_t *)&tsf + 1));
			ADDINT16(frm, mreport_ctrl->u.beacon.duration_tu);
			*frm++ = mreport_ctrl->u.beacon.reported_frame_info;
			*frm++ = mreport_ctrl->u.beacon.rcpi;
			*frm++ = mreport_ctrl->u.beacon.rsni;
			memcpy(frm, mreport_ctrl->u.beacon.bssid, IEEE80211_ADDR_LEN);
			frm += IEEE80211_ADDR_LEN;
			*frm++ = mreport_ctrl->u.beacon.antenna_id;
			memcpy(frm, mreport_ctrl->u.beacon.parent_tsf, 4);
			frm += sizeof(mreport_ctrl->u.beacon.parent_tsf);

			break;
		}
		case IEEE80211_RM_MEASTYPE_FRAME:
		{
			u_int64_t tsf;
			ieee80211_11k_sub_element *p_se;
			ieee80211_11k_sub_element_head *se_head;

			ic->ic_get_tsf(&tsf);

			*frm++ = mreport_ctrl->u.frame.op_class;
			*frm++ = mreport_ctrl->u.frame.channel;
			ADDINT32(frm, *((u_int32_t *)&tsf));
			ADDINT32(frm, *((u_int32_t *)&tsf + 1));
			ADDINT16(frm, mreport_ctrl->u.frame.duration_tu);

			se_head = (ieee80211_11k_sub_element_head *)mreport_ctrl->u.frame.sub_item;
			while (!SLIST_EMPTY(se_head)) {
				p_se = SLIST_FIRST(se_head);
				switch (p_se->sub_id) {
				case IEEE80211_FRAME_REPORT_SUBELE_FRAME_COUNT_REPORT:
				{
					u_int8_t *sub_ele_len;
					struct frame_report_subele_frame_count *sub_ele;

					sub_ele = (struct frame_report_subele_frame_count *)p_se->data;
					*frm++ = p_se->sub_id;
					sub_ele_len = frm;
					*frm++ = 0;
					memcpy(frm, sub_ele->ta, IEEE80211_ADDR_LEN);
					frm += IEEE80211_ADDR_LEN;
					memcpy(frm, sub_ele->bssid, IEEE80211_ADDR_LEN);
					frm += IEEE80211_ADDR_LEN;
					*frm++ = sub_ele->phy_type;
					*frm++ = sub_ele->avg_rcpi;
					*frm++ = sub_ele->last_rsni;
					*frm++ = sub_ele->last_rcpi;
					*frm++ = sub_ele->antenna_id;
					ADDINT16(frm, sub_ele->frame_count);

					*sub_ele_len = frm - sub_ele_len - 1;

					break;
				}
				default:
					break;
				}
				SLIST_REMOVE_HEAD(se_head, next);
				kfree(p_se);
			}

			break;
		}
		case IEEE80211_RM_MEASTYPE_CATEGORY:
		{
			u_int64_t tsf;

			ic->ic_get_tsf(&tsf);

			ADDINT32(frm, *((u_int32_t *)&tsf));
			ADDINT32(frm, *((u_int32_t *)&tsf + 1));
			ADDINT16(frm, mreport_ctrl->u.tran_stream_cat.duration_tu);
			memcpy(frm, mreport_ctrl->u.tran_stream_cat.peer_sta, IEEE80211_ADDR_LEN);
			frm += IEEE80211_ADDR_LEN;
			*frm++ = mreport_ctrl->u.tran_stream_cat.tid;
			*frm++ = mreport_ctrl->u.tran_stream_cat.reason;
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.tran_msdu_cnt);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.msdu_discard_cnt);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.msdu_fail_cnt);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.msdu_mul_retry_cnt);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.qos_lost_cnt);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.avg_queue_delay);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.avg_tran_delay);
			*frm++ = mreport_ctrl->u.tran_stream_cat.bin0_range;
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.bins[0]);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.bins[1]);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.bins[2]);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.bins[3]);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.bins[4]);
			ADDINT32(frm, mreport_ctrl->u.tran_stream_cat.bins[5]);

			break;
		}
		case IEEE80211_RM_MEASTYPE_MUL_DIAG:
			ADDINT32(frm, 0);
			ADDINT32(frm, 0);
			ADDINT16(frm, mreport_ctrl->u.multicast_diag.duration_tu);
			memcpy(frm, mreport_ctrl->u.multicast_diag.group_mac, IEEE80211_ADDR_LEN);
			frm += IEEE80211_ADDR_LEN;
			*frm++ = mreport_ctrl->u.multicast_diag.reason;
			ADDINT32(frm, mreport_ctrl->u.multicast_diag.mul_rec_msdu_cnt);
			ADDINT16(frm, mreport_ctrl->u.multicast_diag.first_seq_num);
			ADDINT16(frm, mreport_ctrl->u.multicast_diag.last_seq_num);
			ADDINT16(frm, mreport_ctrl->u.multicast_diag.mul_rate);

			break;
		default:
			break;
		}
	}
	*ele_len = frm - ele_len - 1;

	return frm;
}

int32_t ieee80211_compile_action_measurement_11h(struct ieee80211_node *ni,
		void *ctrl,
		u_int8_t action,
		struct sk_buff **p_skb)
{
	struct sk_buff *skb;
	u_int8_t *frm;
	int32_t meas_frame_len = 0;
	int32_t meas_ie_len = 0;
	struct ieee80211_meas_request_ctrl *mrequest_ctrl = NULL;
	struct ieee80211_meas_report_ctrl *mreport_ctrl = NULL;
	u_int8_t tx_token;

	if ((action != IEEE80211_ACTION_S_MEASUREMENT_REQUEST) && (action != IEEE80211_ACTION_S_MEASUREMENT_REPORT))
		return -1;

	if (action == IEEE80211_ACTION_S_MEASUREMENT_REQUEST) {
		mrequest_ctrl = (struct ieee80211_meas_request_ctrl *)ctrl;
		meas_frame_len = sizeof(struct ieee80211_action_sm_measurement_header);

		meas_ie_len = ieee80211_measure_request_ie_len(mrequest_ctrl);
		if (meas_ie_len <= 0)
			return -1;
		meas_frame_len += meas_ie_len;

		skb = ieee80211_getmgtframe(&frm, meas_frame_len);
		if (NULL == skb)
			return -1;

		*frm++ = IEEE80211_ACTION_CAT_SPEC_MGMT;
		*frm++ = action;
		if (ni->ni_action_token == 0)
			ni->ni_action_token++;
		tx_token = ni->ni_action_token++;
		*frm++ = tx_token;
		frm = ieee80211_measure_request_ie_generate(ni, frm, mrequest_ctrl);
		if (mrequest_ctrl->expire != 0) {
			skb = ieee80211_ppqueue_pre_tx(ni,
					skb,
					IEEE80211_ACTION_CAT_SPEC_MGMT,
					IEEE80211_ACTION_S_MEASUREMENT_REPORT,
					tx_token,
					mrequest_ctrl->expire,
					mrequest_ctrl->fn_success,
					mrequest_ctrl->fn_fail);
			if (skb == NULL)
				return -1;
		}
	} else {
		mreport_ctrl = (struct ieee80211_meas_report_ctrl *)ctrl;
		meas_frame_len = sizeof(struct ieee80211_action_sm_measurement_header);

		meas_ie_len = ieee80211_measure_report_ie_len(mreport_ctrl);
		if (meas_ie_len <= 0)
			return -1;
		meas_frame_len += meas_ie_len;

		skb = ieee80211_getmgtframe(&frm, meas_frame_len);
		if (NULL == skb)
			return -1;
		memset(frm, 0, meas_frame_len);

		*frm++ = IEEE80211_ACTION_CAT_SPEC_MGMT;
		*frm++ = action;
		if (mreport_ctrl->autonomous)
			*frm++ = 0;
		else
			*frm++ = mreport_ctrl->token;
		frm = ieee80211_measure_report_ie_generate(ni, frm, mreport_ctrl);
	}

	KASSERT(((frm - skb->data) <= meas_frame_len),
			("ERROR: 11h measure frame gen fail\n"
			"expected len = %d\n"
			"start address(0x%x), end address(0x%x), len = %d\n",
			meas_frame_len,
			(uint32_t)skb->data,
			(uint32_t)frm,
			(uint32_t)(frm - skb->data)));

	skb_trim(skb, frm - skb->data);
	*p_skb = skb;
	return 0;
}

int32_t ieee80211_compile_action_measurement_11k(struct ieee80211_node *ni,
		void *ctrl,
		u_int8_t action,
		struct sk_buff **p_skb)
{
	struct sk_buff *skb;
	u_int8_t *frm;
	int32_t meas_frame_len = 0;
	int32_t meas_ie_len = 0;
	struct ieee80211_meas_request_ctrl *mrequest_ctrl = NULL;
	struct ieee80211_meas_report_ctrl *mreport_ctrl = NULL;
	u_int8_t tx_token;

	if ((action != IEEE80211_ACTION_R_MEASUREMENT_REQUEST) && (action != IEEE80211_ACTION_R_MEASUREMENT_REPORT))
		return -1;

	if (action == IEEE80211_ACTION_R_MEASUREMENT_REQUEST) {
		mrequest_ctrl = (struct ieee80211_meas_request_ctrl *)ctrl;
		meas_frame_len = sizeof(struct ieee80211_action_radio_measure_request);

		meas_ie_len = ieee80211_measure_request_ie_len(mrequest_ctrl);
		if (meas_ie_len <= 0)
			return -1;

		meas_frame_len += meas_ie_len;

		if ((mrequest_ctrl->meas_type == IEEE80211_RM_MEASTYPE_BEACON)
			&& (mrequest_ctrl->u.beacon.ssid_len)) {
			meas_frame_len += mrequest_ctrl->u.beacon.ssid_len + 2;
		}
		skb = ieee80211_getmgtframe(&frm, meas_frame_len);
		if (NULL == skb)
			return -1;

		*frm++ = IEEE80211_ACTION_CAT_RM;
		*frm++ = action;
		if (ni->ni_action_token == 0)
			ni->ni_action_token++;
		tx_token = ni->ni_action_token++;
		*frm++ = tx_token;
		ADDINT16(frm, 0);	/* set number of repetitions to 0 */
		frm = ieee80211_measure_request_ie_generate(ni, frm, mrequest_ctrl);
		if (mrequest_ctrl->expire != 0) {
			skb = ieee80211_ppqueue_pre_tx(ni,
					skb,
					IEEE80211_ACTION_CAT_RM,
					IEEE80211_ACTION_R_MEASUREMENT_REPORT,
					tx_token,
					mrequest_ctrl->expire,
					mrequest_ctrl->fn_success,
					mrequest_ctrl->fn_fail);
			if (skb == NULL)
				return -1;
		}
	} else {
		mreport_ctrl = (struct ieee80211_meas_report_ctrl *)ctrl;
		meas_frame_len = sizeof(struct ieee80211_action_radio_measure_report);

		meas_ie_len = ieee80211_measure_report_ie_len(mreport_ctrl);
		if (meas_ie_len <= 0)
			return -1;
		meas_frame_len += meas_ie_len;

		skb = ieee80211_getmgtframe(&frm, meas_frame_len);
		if (NULL == skb)
			return -1;

		*frm++ = IEEE80211_ACTION_CAT_RM;
		*frm++ = action;
		if (mreport_ctrl->autonomous)
			*frm++ = 0;
		else
			*frm++ = mreport_ctrl->token;
		frm = ieee80211_measure_report_ie_generate(ni, frm, mreport_ctrl);
	}

	KASSERT(((frm - skb->data) <= meas_frame_len),
			("ERROR: 11k measure frame gen fail\n"
			"expected len = %d\n"
			"start address(0x%x), end address(0x%x), len = %d\n",
			meas_frame_len,
			(uint32_t)skb->data,
			(uint32_t)frm,
			(uint32_t)(frm - skb->data)));

	skb_trim(skb, frm - skb->data);
	*p_skb = skb;
	return 0;
}

#if defined(CONFIG_QTN_80211K_SUPPORT)
void ieee80211_send_action_cca_report(struct ieee80211_node *ni, uint8_t token,
		uint16_t cca_intf, uint64_t tsf, uint16_t duration, uint32_t sp_fail,
		uint32_t lp_fail, uint16_t others_time, uint8_t *extra_ie, uint16_t ie_len)
{
	struct ieee80211_meas_report_ctrl mreport_ctrl;
	struct ieee80211_action_data action_data;
	u_int16_t frac_busy;

	frac_busy = cca_intf * IEEE80211_11K_CCA_INTF_SCALE / IEEE80211_SCS_CCA_INTF_SCALE;
	mreport_ctrl.meas_type = IEEE80211_RM_MEASTYPE_QTN_CCA;
	mreport_ctrl.report_mode = 0;
	mreport_ctrl.autonomous = 1;

	mreport_ctrl.u.qtn_cca.type = QTN_SCS_IE_TYPE_STA_INTF_RPT;

	mreport_ctrl.u.qtn_cca.channel = ni->ni_chan->ic_ieee;
	mreport_ctrl.u.qtn_cca.start_tsf = tsf;
	mreport_ctrl.u.qtn_cca.duration_ms = duration;
	mreport_ctrl.u.qtn_cca.qtn_cca_report = (u_int8_t)frac_busy;

	mreport_ctrl.u.qtn_cca.u.qtn_cca_info.sp_fail = sp_fail;
	mreport_ctrl.u.qtn_cca.u.qtn_cca_info.lp_fail = lp_fail;
	mreport_ctrl.u.qtn_cca.u.qtn_cca_info.others_time = others_time;

	mreport_ctrl.u.qtn_cca.extra_ie = extra_ie;
	mreport_ctrl.u.qtn_cca.extra_ie_len = ie_len;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &mreport_ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}

void ieee80211_send_action_fat_report(struct ieee80211_node *ni, uint8_t token,
		uint16_t cca_intf, uint64_t tsf, uint16_t duration, uint16_t idle_time)
{
	struct ieee80211_meas_report_ctrl mreport_ctrl;
	struct ieee80211_action_data action_data;
	u_int16_t frac_busy;

	frac_busy = cca_intf * IEEE80211_11K_CCA_INTF_SCALE / IEEE80211_SCS_CCA_INTF_SCALE;
	mreport_ctrl.meas_type = IEEE80211_RM_MEASTYPE_QTN_CCA;
	mreport_ctrl.report_mode = 0;
	mreport_ctrl.autonomous = 1;

	mreport_ctrl.u.qtn_cca.type = QTN_SCS_IE_TYPE_STA_FAT_RPT;

	mreport_ctrl.u.qtn_cca.channel = ni->ni_chan->ic_ieee;
	mreport_ctrl.u.qtn_cca.start_tsf = tsf;
	mreport_ctrl.u.qtn_cca.duration_ms = duration;
	mreport_ctrl.u.qtn_cca.qtn_cca_report = (u_int8_t)frac_busy;

	mreport_ctrl.u.qtn_cca.u.qtn_fat_info.free_airtime = idle_time;

	mreport_ctrl.u.qtn_cca.extra_ie_len = 0;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &mreport_ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}

void ieee80211_send_action_dfs_report(struct ieee80211_node *ni)
{
	struct ieee80211_meas_report_ctrl mreport_ctrl;
	struct ieee80211_action_data action_data;
	struct ieee80211com *ic = ni->ni_ic;

	mreport_ctrl.meas_type = IEEE80211_RM_MEASTYPE_QTN_CCA;
	mreport_ctrl.report_mode = 0;
	mreport_ctrl.autonomous = 1;

	mreport_ctrl.u.qtn_cca.type = QTN_SCS_IE_TYPE_STA_DFS_RPT;

	mreport_ctrl.u.qtn_cca.channel = ni->ni_chan->ic_ieee;
	mreport_ctrl.u.qtn_cca.start_tsf = 0;
	mreport_ctrl.u.qtn_cca.duration_ms = 0;
	mreport_ctrl.u.qtn_cca.qtn_cca_report = 0;

	mreport_ctrl.u.qtn_cca.u.qtn_dfs_info.dfs_enabled = !!(ic->ic_flags_ext & IEEE80211_FEXT_MARKDFS);
	mreport_ctrl.u.qtn_cca.u.qtn_dfs_info.max_txpower = ic->ic_curchan->ic_maxpower;

	mreport_ctrl.u.qtn_cca.extra_ie_len = 0;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &mreport_ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_action_dfs_report);
#endif

__inline void ieee80211_ppqueue_release_entry(struct ieee80211_pairing_pending_entry *entry)
{
	if (entry != NULL) {
		dev_kfree_skb_any(entry->skb);
		kfree(entry);
	}
}

void ieee80211_ppqueue_insert_entry(struct ieee80211_pairing_pending_queue *queue,
				struct ieee80211_pairing_pending_entry *entry)
{
	int32_t timer_refresh = 0;
	unsigned long flags;
	struct ieee80211_pairing_pending_entry *prev, *cur;

	spin_lock_irqsave(&queue->lock, flags);
	if (queue->next == NULL) {
		queue->next = entry;
		queue->next_expire_jiffies = entry->next_expire_jiffies;
		timer_refresh = 1;
	} else {
		if (time_before(entry->next_expire_jiffies, queue->next->next_expire_jiffies)) {
			entry->next = queue->next;
			queue->next = entry;
			queue->next_expire_jiffies = entry->next_expire_jiffies;
			timer_refresh = 1;
		} else {
			prev = queue->next;
			cur = prev->next;
			while (cur != NULL) {
				if (time_before(entry->next_expire_jiffies, cur->next_expire_jiffies)) {
					entry->next = cur;
					prev->next = entry;
					break;
				}
				prev = cur;
				cur = prev->next;
			}
		}
	}
	spin_unlock_irqrestore(&queue->lock, flags);

	if (timer_refresh) {
		mod_timer(&queue->timer, queue->next_expire_jiffies);
	}
}

void ieee80211_ppqueue_remove_with_response(struct ieee80211_pairing_pending_queue *queue,
					struct ieee80211_node *ni,
					u_int8_t category,
					u_int8_t action,
					u_int8_t token)
{
	struct ieee80211_pairing_pending_entry **prev, *cur, *to_free;
	unsigned long flags;

	prev = &queue->next;
	cur = queue->next;
	to_free = NULL;

	spin_lock_irqsave(&queue->lock, flags);
	while (cur != NULL) {
		if ((cur->ni == ni) &&
			(cur->expected_category == category) &&
			(cur->expected_action == action) &&
			(cur->expected_token == token)) {
			to_free = cur;
			*prev = cur->next;
			break;
		}
		prev = &cur->next;
		cur = cur->next;
	}
	spin_unlock_irqrestore(&queue->lock, flags);

	if (to_free != NULL) {
		if (to_free->fn_success != NULL)
			to_free->fn_success(to_free->ni);

		ieee80211_ppqueue_release_entry(to_free);
	}
}

void ieee80211_ppqueue_remove_node_leave(struct ieee80211_pairing_pending_queue *queue,
				struct ieee80211_node *ni)
{
	struct ieee80211_pairing_pending_entry **prev, *cur;
	struct ieee80211_pairing_pending_entry *ni_drop_list, *to_free;
	unsigned long flags;

	prev = &queue->next;
	cur = queue->next;
	ni_drop_list = NULL;
	to_free = NULL;

	spin_lock_irqsave(&queue->lock, flags);
	while (cur != NULL) {
		if (cur->ni == ni) {
			to_free = cur;
			*prev = cur->next;
			cur = cur->next;
			REPLACE_PPQ_ENTRY_HEAD(ni_drop_list, to_free);
			continue;
		}
		prev = &cur->next;
		cur = cur->next;
	}
	spin_unlock_irqrestore(&queue->lock, flags);

	while (ni_drop_list != NULL) {
		to_free = ni_drop_list;
		ni_drop_list = ni_drop_list->next;

		if (to_free->fn_fail)
			to_free->fn_fail(to_free->ni, PPQ_FAIL_NODELEAVE);

		ieee80211_ppqueue_release_entry(to_free);
	}
}

void ieee80211_ppqueue_remove_with_cat_action(struct ieee80211_pairing_pending_queue *queue,
				u_int8_t category,
				u_int8_t action)
{
	struct ieee80211_pairing_pending_entry **prev, *cur;
	struct ieee80211_pairing_pending_entry *ni_drop_list, *to_free;
	unsigned long flags;

	prev = &queue->next;
	cur = queue->next;
	ni_drop_list = NULL;
	to_free = NULL;

	spin_lock_irqsave(&queue->lock, flags);
	while (cur != NULL) {
		if (cur->expected_category == category &&
			cur->expected_action == action) {
			to_free = cur;
			*prev = cur->next;
			cur = cur->next;
			REPLACE_PPQ_ENTRY_HEAD(ni_drop_list, to_free);
			continue;
		}
		prev = &cur->next;
		cur = cur->next;
	}
	spin_unlock_irqrestore(&queue->lock, flags);

	while (ni_drop_list != NULL) {
		to_free = ni_drop_list;
		ni_drop_list = ni_drop_list->next;

		if (to_free->fn_fail)
			to_free->fn_fail(to_free->ni, PPQ_FAIL_STOP);

		ieee80211_ppqueue_release_entry(to_free);
	}
}

void ieee80211_ppqueue_flush(struct ieee80211_pairing_pending_queue *queue)
{
	struct ieee80211_pairing_pending_entry *flush_list, *to_free;
	unsigned long flags;

	spin_lock_irqsave(&queue->lock, flags);
	flush_list = queue->next;
	queue->next = NULL;
	spin_unlock_irqrestore(&queue->lock, flags);

	while (flush_list != NULL) {
		to_free = flush_list;
		flush_list = flush_list->next;

		if (to_free->fn_fail)
			to_free->fn_fail(to_free->ni, PPQ_FAIL_STOP);

		ieee80211_ppqueue_release_entry(to_free);
	}
}

void ieee80211_ppqueue_timeout(unsigned long ctx)
{
	struct ieee80211_pairing_pending_queue *queue = (struct ieee80211_pairing_pending_queue *)ctx;
	struct ieee80211_pairing_pending_entry **prev, *cur, *to_do, *timeout_retry, *timeout_fail;
	struct sk_buff *skb;
	unsigned long flags;

	prev = &queue->next;
	cur = queue->next;
	to_do = NULL;
	timeout_retry = NULL;
	timeout_fail = NULL;

	spin_lock_irqsave(&queue->lock, flags);
	while (cur != NULL) {
		if (time_before_eq(cur->next_expire_jiffies, jiffies)) {
			to_do = cur;
			*prev = cur->next;
			cur = cur->next;
			if (to_do->retry_cnt < to_do->max_retry)
				REPLACE_PPQ_ENTRY_HEAD(timeout_retry, to_do);
			else
				REPLACE_PPQ_ENTRY_HEAD(timeout_fail, to_do);
			continue;
		}
		prev = &cur->next;
		cur = cur->next;
	}
	spin_unlock_irqrestore(&queue->lock, flags);

	while (timeout_retry != NULL) {
		to_do = timeout_retry;
		timeout_retry = timeout_retry->next;

		to_do->retry_cnt++;
		to_do->next_expire_jiffies = jiffies + to_do->expire;
		skb = skb_clone(to_do->skb, GFP_ATOMIC);
		if (skb) {
			ieee80211_ref_node(to_do->ni);
			ieee80211_mgmt_output(to_do->ni, skb, IEEE80211_FC0_SUBTYPE_ACTION, to_do->ni->ni_macaddr);
		}
		ieee80211_ppqueue_insert_entry(queue, to_do);
	}

	while (timeout_fail != NULL) {
		to_do = timeout_fail;
		timeout_fail = timeout_fail->next;

		if (to_do->fn_fail)
			to_do->fn_fail(to_do->ni, PPQ_FAIL_TIMEOUT);

		ieee80211_ppqueue_release_entry(to_do);
	}
}

void ieee80211_ppqueue_init(struct ieee80211vap *vap)
{
	struct ieee80211_pairing_pending_queue *queue = (struct ieee80211_pairing_pending_queue *)&vap->iv_ppqueue;

	spin_lock_init(&queue->lock);
	init_timer(&queue->timer);
	queue->timer.data = (unsigned long)queue;
	queue->timer.function = ieee80211_ppqueue_timeout;
	queue->next = NULL;
	queue->next_expire_jiffies = 0;
}

void ieee80211_ppqueue_deinit(struct ieee80211vap *vap)
{
	struct ieee80211_pairing_pending_queue *queue = (struct ieee80211_pairing_pending_queue *)&vap->iv_ppqueue;

	del_timer(&queue->timer);
	ieee80211_ppqueue_flush(queue);
}

struct sk_buff *ieee80211_ppqueue_pre_tx(struct ieee80211_node *ni,
				struct sk_buff *skb,
				u_int8_t category,
				u_int8_t action,
				u_int8_t token,
				unsigned long expire,
				ppq_callback_success fn_success,
				ppq_callback_fail fn_fail)
{
	struct sk_buff *cloned_skb = NULL;
	struct ieee80211_pairing_pending_queue *queue = &ni->ni_vap->iv_ppqueue;
	struct ieee80211_pairing_pending_entry *entry = NULL;

	entry = (struct ieee80211_pairing_pending_entry *)kmalloc(sizeof(*entry), GFP_ATOMIC);
	if (NULL == entry) {
		dev_kfree_skb_any(skb);
		return NULL;
	}

	cloned_skb = skb_clone(skb, GFP_ATOMIC);
	if (cloned_skb == NULL) {
		dev_kfree_skb_any(skb);
		kfree(entry);
		return NULL;
	}

	memset(entry, 0, sizeof(*entry));
	entry->skb = skb;
	entry->ni = ni;
	entry->expected_category = category;
	entry->expected_action = action;
	entry->expected_token = token;
	entry->expire = expire;
	entry->next_expire_jiffies = jiffies + expire;
	entry->max_retry = IEEE80211_PPQ_DEF_MAX_RETRY;
	entry->retry_cnt = 0;
	entry->fn_success = fn_success;
	entry->fn_fail = fn_fail;

	ieee80211_ppqueue_insert_entry(queue, entry);
	return cloned_skb;
}

int32_t ieee80211_compile_action_link_measure_request(struct ieee80211_node *ni,
		void *ctrl,
		struct sk_buff **p_skb)
{
	struct sk_buff *skb;
	int32_t frame_len = 0;
	struct ieee80211_link_measure_request *request;
	u_int8_t *frm;
	u_int8_t tx_token;

	request = (struct ieee80211_link_measure_request *)ctrl;
	frame_len = sizeof(struct ieee80211_action_rm_link_measure_request);

	skb = ieee80211_getmgtframe(&frm, frame_len);
	if (skb == NULL)
		return -1;

	*frm++ = IEEE80211_ACTION_CAT_RM;
	*frm++ = IEEE80211_ACTION_R_LINKMEASURE_REQUEST;

	if (ni->ni_action_token == 0)
		ni->ni_action_token++;
	tx_token = ni->ni_action_token++;
	*frm++ = tx_token;
	*frm++ = ni->ni_ic->ic_get_local_txpow(ni->ni_ic);
	*frm++ = ni->ni_ic->ic_curchan->ic_maxpower_normal + 6;	/* 4 anntenna, add 6 db */

	if (request->ppq.expire != 0) {
		skb = ieee80211_ppqueue_pre_tx(ni, skb, IEEE80211_ACTION_CAT_RM,
				IEEE80211_ACTION_R_LINKMEASURE_REPORT,
				tx_token, request->ppq.expire,
				request->ppq.fn_success, request->ppq.fn_fail);
		if (skb == NULL)
			return -1;
	}

	skb_trim(skb, frm - skb->data);
	*p_skb = skb;
	return 0;
}

int32_t ieee80211_compile_action_link_measure_report(struct ieee80211_node *ni,
		void *ctrl,
		struct sk_buff **p_skb)
{
	struct sk_buff *skb;
	int32_t frame_len = 0;
	struct ieee80211_link_measure_report *report;
	u_int8_t *frm;

	report = (struct ieee80211_link_measure_report *)ctrl;
	frame_len = sizeof(struct ieee80211_action_rm_link_measure_report);

	skb = ieee80211_getmgtframe(&frm, frame_len);
	if (skb == NULL)
		return -1;

	*frm++ = IEEE80211_ACTION_CAT_RM;
	*frm++ = IEEE80211_ACTION_R_LINKMEASURE_REPORT;
	*frm++ = report->token;
	*frm++ = IEEE80211_ELEMID_TPCREP;
	*frm++ = 2;
	*frm++ = report->tpc_report.tx_power;
	*frm++ = report->tpc_report.link_margin;
	*frm++ = report->recv_antenna_id;
	*frm++ = report->tran_antenna_id;
	*frm++ = report->rcpi;
	*frm++ = report->rsni;

	skb_trim(skb, frm - skb->data);
	*p_skb = skb;
	return 0;
}

int32_t ieee80211_compile_action_neighbor_report_request(struct ieee80211_node *ni,
		void *ctrl,
		struct sk_buff **p_skb)
{
	struct sk_buff *skb;
	int32_t frame_len = 0;
	u_int8_t *frm;
	u_int8_t tx_token;
	struct ieee80211_neighbor_report_request *request;

	request = (struct ieee80211_neighbor_report_request *)ctrl;
	frame_len = sizeof(struct ieee80211_action_rm_neighbor_report_request);
	skb = ieee80211_getmgtframe(&frm, frame_len);
	if (skb == NULL)
		return -1;

	*frm++ = IEEE80211_ACTION_CAT_RM;
	*frm++ = IEEE80211_ACTION_R_NEIGHBOR_REQUEST;
	if (ni->ni_action_token == 0)
		ni->ni_action_token++;
	tx_token = ni->ni_action_token++;
	*frm++ = tx_token;

	if (request->ppq.expire != 0) {
		skb = ieee80211_ppqueue_pre_tx(ni, skb, IEEE80211_ACTION_CAT_RM,
				IEEE80211_ACTION_R_NEIGHBOR_REPORT,
				tx_token, request->ppq.expire,
				request->ppq.fn_success, request->ppq.fn_fail);
		if (skb == NULL)
			return -1;
	}

	skb_trim(skb, frm - skb->data);
	*p_skb = skb;
	return 0;
}

int32_t ieee80211_compile_action_neighbor_report_response(struct ieee80211_node *ni,
		void *ctrl,
		struct sk_buff **p_skb)
{
	struct sk_buff *skb;
	int32_t frame_len = 0;
	u_int8_t *frm;
	struct ieee80211_neighbor_report_response *response;
	u_int8_t i;
	u_int8_t bss_num = 0;

	response = (struct ieee80211_neighbor_report_response *)ctrl;
	frame_len = sizeof(struct ieee80211_action_rm_neighbor_report_response);
	if (response->bss_num > 0) {
		bss_num = (response->bss_num > 32 ? 32 : response->bss_num);
		frame_len += sizeof(struct ieee80211_ie_neighbor_report) * bss_num;
	}
	skb = ieee80211_getmgtframe(&frm, frame_len);
	if (skb == NULL)
		return -1;

	*frm++ = IEEE80211_ACTION_CAT_RM;
	*frm++ = IEEE80211_ACTION_R_NEIGHBOR_REPORT;
	*frm++ = response->token;

	for (i = 0; i < bss_num; i++) {
		*frm++ = IEEE80211_ELEMID_NEIGHBOR_REP;
		*frm++ = sizeof(struct ieee80211_ie_neighbor_report) - 2;
		memcpy(frm, response->neighbor_report_ptr[i]->bssid, IEEE80211_ADDR_LEN);
		frm += IEEE80211_ADDR_LEN;
		ADDINT32(frm, response->neighbor_report_ptr[i]->bssid_info);
		*frm++ = response->neighbor_report_ptr[i]->operating_class;
		*frm++ = response->neighbor_report_ptr[i]->channel;
		*frm++ = response->neighbor_report_ptr[i]->phy_type;
	}

	skb_trim(skb, frm - skb->data);
	*p_skb = skb;
	return 0;
}

/*
 * To check whether to enable RX AMSDU or not.
 * Return 1: RX AMSDU can be enabled, 0: should be disabled
 */
static int ieee80211_rx_amsdu_allowed(struct ieee80211_node *ni)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = ni->ni_ic;

	if (vap->iv_rx_amsdu_enable == QTN_RX_AMSDU_DISABLE) {
		return 0;
	}

	if ((vap->iv_rx_amsdu_enable == QTN_RX_AMSDU_DYNAMIC) && !ieee80211_node_is_qtn(ni)) {
		if (ic->ic_scs.scs_stats_on) {
			if (vap->iv_rx_amsdu_threshold_cca && (ic->ic_opmode == IEEE80211_M_HOSTAP)) {
				struct ap_state *as = ic->ic_scan->ss_scs_priv;
				uint32_t cca_intf = as->as_cca_intf[ic->ic_curchan->ic_ieee];
				if ((cca_intf != SCS_CCA_INTF_INVALID) &&
						(cca_intf > vap->iv_rx_amsdu_threshold_cca)) {
					return 0;
				}
			}
			if (vap->iv_rx_amsdu_threshold_pmbl) {
				uint32_t pmbl_err = (vap->iv_rx_amsdu_pmbl_wf_sp * ic->ic_scs.scs_sp_err_smthed +
						vap->iv_rx_amsdu_pmbl_wf_lp * ic->ic_scs.scs_lp_err_smthed) / 100;

				if (pmbl_err > vap->iv_rx_amsdu_threshold_pmbl) {
					return 0;
				}
			}
		}
	}

	return 1;
}

void
ieee80211_get_channel_bw_offset(struct ieee80211com *ic, int16_t *is_40, int16_t *offset)
{
	*is_40 = 0;
	*offset = IEEE80211_HTINFO_CHOFF_SCN;

	if ((ic->ic_htcap.cap & IEEE80211_HTCAP_C_CHWIDTH40) &&
			(ic->ic_bsschan->ic_flags & IEEE80211_CHAN_HT40_DUAL_EXT)) {
		*offset = (ic->ic_bsschan->ic_flags & IEEE80211_CHAN_HT40U) ?
				IEEE80211_HTINFO_CHOFF_SCA : IEEE80211_HTINFO_CHOFF_SCB;
		*is_40 = 1;
	}
}

static int ieee80211_check_11b_ap(const struct ieee80211_node *ni)
{
	struct ieee80211com *ic = ni->ni_ic;
	struct ieee80211_rateset *b_rates = &ic->ic_sup_rates[IEEE80211_MODE_11B];
	int i, j;

	for (i = 0; i < ni->ni_rates.rs_nrates; i++) {
		for (j = 0; j < b_rates->rs_nrates; j++) {
			if ((ni->ni_rates.rs_rates[i] & IEEE80211_RATE_VAL) ==
					(b_rates->rs_rates[j] & IEEE80211_RATE_VAL)) {
				break;
			}
		}

		if (j == b_rates->rs_nrates)
			return 0;
	}

	return 1;
}

static int
ieee80211_compile_action_btm_req(struct ieee80211_node *ni,
				struct btm_request_params *ctrl,
				struct sk_buff **pp_skb)
{
	struct sk_buff *skb = NULL;
	uint8_t *frm = NULL;
	size_t url_len = 0;
	uint16_t frm_len = 0;
	uint8_t tx_token = 0;

	url_len = ctrl->url ? strlen(ctrl->url) + 1 : 0;
	frm_len = (sizeof(struct ieee80211_action_btm_req)
		+ (ctrl->bss_term_dur ? sizeof(struct ieee80211_ie_btm_bss_termdur) : 0)
		+ url_len
		+ ctrl->neigh_reports_length);
	skb = ieee80211_getmgtframe(&frm, frm_len);
	if (skb == NULL)
		return -1;

	*frm++ = IEEE80211_ACTION_CAT_WNM;
	*frm++ = IEEE80211_WNM_BSS_TRANS_MGMT_REQ;
	if (ctrl->dialog_token != 0) {
		*frm++ = ctrl->dialog_token;
		tx_token = ctrl->dialog_token;
	} else {
		if (ni->ni_action_token == 0)
			ni->ni_action_token++;
		*frm++ = ni->ni_action_token;
		tx_token = ni->ni_action_token++;
	}
	*frm++ = ctrl->request_mode;
	ADDINT16LE(frm, ctrl->disassoc_timer);
	*frm++ = ctrl->validity_interval;
	ni->ni_btm_req = tx_token;

	if ((ctrl->request_mode & BTM_REQ_BSS_TERMINATION_INCLUDED) && ctrl->bss_term_dur) {
		memcpy(frm, ctrl->bss_term_dur, sizeof(struct ieee80211_ie_btm_bss_termdur));
		frm += sizeof(struct ieee80211_ie_btm_bss_termdur);
	}

	if (ctrl->url) {
		*frm++ = url_len;
		memcpy(frm, ctrl->url, url_len);
		frm += url_len;
	}
	if (ctrl->neigh_reports) {
		memcpy(frm, ctrl->neigh_reports, ctrl->neigh_reports_length);
		frm += ctrl->neigh_reports_length;
	}

	skb_trim(skb, frm - skb->data);
	*pp_skb = skb;

	IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_ACTION, "Sending BTM request to %pM token %u\n",
			ni->ni_macaddr, tx_token);

	return 0;
}

/*
 * Send a management frame.  The node is for the destination (or ic_bss
 * when in station mode).  Nodes other than ic_bss have their reference
 * count bumped to reflect our use for an indeterminate time.
 */
int
ieee80211_send_mgmt(struct ieee80211_node *ni, int type, int arg)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = ni->ni_ic;
	struct sk_buff *skb = NULL;
	u_int8_t *frm;
	int16_t htinfo_channel_width = 0;
	int16_t htinfo_2nd_channel_offset = 0;
	u_int16_t capinfo, def_keyindex;
	int has_challenge, is_shared_key, ret, timer, status, is_bcast_probe, expired_timer;
	enum ieee80211_phymode mode;
	struct ieee80211_wme_state *wme = ieee80211_vap_get_wmestate(vap);
	int ap_pure_tkip = 0;
	int sta_pure_tkip = 0;
	int is_11b_ap;

	KASSERT(ni != NULL, ("null node"));

	if (vap->iv_opmode == IEEE80211_M_STA && ni != vap->iv_bss) {
		/*
		 * In Roaming cases, STA may receive null data frames from old AP
		 * if it's not disassociated properly.
		 * We add a exception here so that STA can send De-auth to old AP.
		 */
		if (type != IEEE80211_FC0_SUBTYPE_ACTION && type != IEEE80211_FC0_SUBTYPE_DEAUTH)
			return 0;
	}

	ieee80211_ref_node(ni);

	mode = ic->ic_curmode;
	timer = 0;

	if (vap->iv_bss && !vap->allow_tkip_for_vht) {
	      ap_pure_tkip = (vap->iv_bss->ni_rsn.rsn_ucastcipherset == IEEE80211_C_TKIP);
	      sta_pure_tkip = (vap->iv_bss->ni_rsn.rsn_ucastcipher == IEEE80211_CIPHER_TKIP);
	}

	switch (type) {
	case IEEE80211_FC0_SUBTYPE_PROBE_RESP:
		/*
		 * probe response frame format
	 	 *	[8] time stamp
		 *	[2] beacon interval
		 *	[2] capability information
		 *	[tlv] ssid
		 *	[tlv] supported rates
		 *	[7] FH/DS parameter set
		 *	[tlv] IBSS parameter set
		 *	[tlv] country code
		 *	[3] power constraint
		 *	[4] tpc report
		 *	[tlv] Channel Switch Announcement
		 *	[3] extended rate phy (ERP)
		 *	[tlv] extended supported rates
		 *	[tlv] WME parameters
		 *	[tlv] WPA/RSN parameters
		 *	[tlv] Atheros Advanced Capabilities
		 *	[tlv] AtherosXR parameters
		 *	[tlv] Quantenna parameters (probe resp)
		 *      [tlv] QTN IE
		 */
		skb = ieee80211_getmgtframe(&frm,
			  8	/* time stamp */
			+ sizeof(u_int16_t)	/* beacon interval */
			+ sizeof(u_int16_t)	/* capability information */
			+ 2 + IEEE80211_NWID_LEN	/* ssid */
			+ 2 + IEEE80211_RATE_SIZE	/* supported rates */
			+ 7	/* FH/DS parameters max(7,3) */
			/* XXX allocate max size */
			+ 4	/* IBSS parameter set*/
			+ 2 + ic->ic_country_ie.country_len	/* country code */
			+ ((vap->interworking) ? 7 : 0)	/* BSS load */
			+ 3	/* power constraint */
			+ 4	/* tpc report */
			+ IEEE80211_CHANSWITCHANN_BYTES  /*	CSA	*/
			+ 3	/* ERP */
			+ 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE)
			+ sizeof(struct ieee80211_wme_param)
			/* XXX !WPA1+WPA2 fits w/o a cluster */
			+ (vap->iv_flags & IEEE80211_F_WPA ?
				2 * sizeof(struct ieee80211_ie_wpa) : 0)
			+ ((ic->ic_curmode >= IEEE80211_MODE_11NA) ?
					(sizeof(struct ieee80211_ie_htcap) +
					 sizeof(struct ieee80211_ie_htinfo)) : 0)
			+ sizeof(struct ieee80211_ie_athAdvCap)
			+ vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_RESP].length
			+ sizeof(struct ieee80211_ie_qtn)
			+ sizeof(struct ieee80211_qtn_ext_role)
			+ sizeof(struct ieee80211_qtn_ext_bssid)
			+ (vap->qtn_pairing_ie.ie ? sizeof(struct ieee80211_ie_qtn_pairing) : 0)
			+ (IS_IEEE80211_DUALBAND_VHT_ENABLED(ic) ?
				(sizeof(struct ieee80211_ie_vhtcap) +
				 sizeof(struct ieee80211_ie_vhtop) +
				 sizeof(struct ieee80211_ie_vtxpwren)) : 0)
			+ ((IS_IEEE80211_11NG(ic)) ?
				(sizeof(struct ieee80211_20_40_coex_param) +
				sizeof(struct ieee80211_obss_scan_ie)) : 0)
			+ (IEEE80211_COM_NEIGHREPORT_ENABLED(ic) ? sizeof(struct ieee80211_ie_rrm) : 0)
			);
		if (skb == NULL)
			senderr(ENOMEM, is_tx_nobuf);

		/* timestamp should be filled later */
		memset(frm, 0, 8);
		frm += 8;

		/* beacon interval */
		*(__le16 *)frm = htole16(vap->iv_bss ? vap->iv_bss->ni_intval : IEEE80211_BINTVAL_DEFAULT);
		frm += 2;

		/* cap. info */
		if (vap->iv_opmode == IEEE80211_M_IBSS)
			capinfo = IEEE80211_CAPINFO_IBSS;
		else
			capinfo = IEEE80211_CAPINFO_ESS;
		if (vap->iv_flags & IEEE80211_F_PRIVACY)
			capinfo |= IEEE80211_CAPINFO_PRIVACY;
		if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
		    IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan))
			capinfo |= IEEE80211_CAPINFO_SHORT_PREAMBLE;
		if (ic->ic_flags & IEEE80211_F_SHSLOT)
			capinfo |= IEEE80211_CAPINFO_SHORT_SLOTTIME;
		if (ic->ic_flags & IEEE80211_F_DOTH)
			capinfo |= IEEE80211_CAPINFO_SPECTRUM_MGMT;
		*(__le16 *)frm = htole16(capinfo);
		frm += 2;

		/* ssid */
		is_bcast_probe = arg;
		if ((!vap->iv_bss) || ((vap->iv_flags & IEEE80211_F_HIDESSID)
						 && is_bcast_probe)) {
			frm = ieee80211_add_ssid(frm, (u_int8_t *)"", 0);
		} else {
			frm = ieee80211_add_ssid(frm, vap->iv_bss->ni_essid,
				vap->iv_bss->ni_esslen);
		}

		/* supported rates */
		frm = ieee80211_add_rates(frm, &ic->ic_sup_rates[mode]);

		/* XXX: FH/DS parameter set, correct ? */
		if (ic->ic_phytype == IEEE80211_T_FH) {
			*frm++ = IEEE80211_ELEMID_FHPARMS;
			*frm++ = 5;
			*frm++ = ni->ni_fhdwell & 0x00ff;
			*frm++ = (ni->ni_fhdwell >> 8) & 0x00ff;
			*frm++ = IEEE80211_FH_CHANSET(
				ieee80211_chan2ieee(ic, ic->ic_curchan));
			*frm++ = IEEE80211_FH_CHANPAT(
				ieee80211_chan2ieee(ic, ic->ic_curchan));
			*frm++ = ni->ni_fhindex;
		} else {
			*frm++ = IEEE80211_ELEMID_DSPARMS;
			*frm++ = 1;
			*frm++ = ieee80211_chan2ieee(ic, ic->ic_bsschan);
		}

		if (vap->iv_opmode == IEEE80211_M_IBSS) {
			*frm++ = IEEE80211_ELEMID_IBSSPARMS;
			*frm++ = 2;
			*frm++ = 0;
			*frm++ = 0;		/* TODO: ATIM window */
		}

		frm = ieee80211_add_bss_load(frm, vap);

		/*
		 * Tight coupling between Country IE and Power Constraint IE
		 * Both using IEEE80211_FEXT_COUNTRYIE to optional enable them.
		 */
		/* country code */
		if ((ic->ic_flags_ext & IEEE80211_FEXT_COUNTRYIE) ||
				((ic->ic_flags & IEEE80211_F_DOTH) && (ic->ic_flags_ext & IEEE80211_FEXT_TPC)))
			frm = ieee80211_add_country(frm, ic);

		/* power constraint */
		if (((ic->ic_flags & IEEE80211_F_DOTH) && (ic->ic_flags_ext & IEEE80211_FEXT_COUNTRYIE)) ||
				((ic->ic_flags & IEEE80211_F_DOTH) && (ic->ic_flags_ext && IEEE80211_FEXT_TPC))) {
			*frm++ = IEEE80211_ELEMID_PWRCNSTR;
			*frm++ = 1;
			*frm++ = IEEE80211_PWRCONSTRAINT_VAL(ic);
		}

		if (IS_IEEE80211_11NG(ic)) {
			frm = ieee80211_add_20_40_bss_coex_ie(frm, vap->iv_coex);
			frm = ieee80211_add_obss_scan_ie(frm, &ic->ic_obss_ie);
		}

		/* Transmit power envelope */
		if (IS_IEEE80211_VHT_ENABLED(ic) && (ic->ic_flags & IEEE80211_F_DOTH)) {
			frm = ieee80211_add_vhttxpwr_envelope(frm, ic);
		}

		/*TPC Report*/
		if ((ic->ic_flags & IEEE80211_F_DOTH) && (ic->ic_flags_ext & IEEE80211_FEXT_TPC)) {
			*frm++ = IEEE80211_ELEMID_TPCREP;
			*frm++ = 2;
			*frm++ = ic->ic_get_local_txpow(ic);	/* tx power would be updated in macfw */
			*frm++ = 0;	/* link margin is 0 */
		}

		/*	CSA	*/
		if (ic->ic_csa_count) {
			frm = ieee80211_add_csa(frm, ic->ic_csa_mode,
					ic->ic_csa_chan->ic_ieee, ic->ic_csa_count);
			ieee80211_add_sec_chan_off(&frm, ic, ic->ic_csa_chan->ic_ieee);
		}

		/* ERP */
		if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan) &&
			((ic->ic_curmode == IEEE80211_MODE_11A) ||
			(ic->ic_curmode == IEEE80211_MODE_11B))) {
			frm = ieee80211_add_erp(frm, ic);
		}

		ieee80211_get_channel_bw_offset(ic, &htinfo_channel_width, &htinfo_2nd_channel_offset);

		/* 802.11n specific IEs */
		if (IEEE80211_IS_CHAN_ANYN(ic->ic_bsschan) &&
			(ic->ic_curmode >= IEEE80211_MODE_11NA) && !ap_pure_tkip) {
			frm = ieee80211_add_htcap(ni, frm, &ic->ic_htcap, type);
			ic->ic_htinfo.ctrlchannel = ieee80211_chan2ieee(ic, ic->ic_bsschan);
			ic->ic_htinfo.byte1 |= (htinfo_channel_width ? IEEE80211_HTINFO_B1_REC_TXCHWIDTH_40 : 0x0);
			ic->ic_htinfo.choffset = htinfo_2nd_channel_offset;
			frm = ieee80211_add_htinfo(ni, frm, &ic->ic_htinfo);
		}

		/* Ext. Supp. Rates */
		frm = ieee80211_add_xrates(frm, &ic->ic_sup_rates[mode]);

		/* WME */
		if (vap->iv_flags & IEEE80211_F_WME)
			frm = ieee80211_add_wme_param(frm, wme,
					IEEE80211_VAP_UAPSD_ENABLED(vap), 0);

		/* WPA */
		if (!vap->iv_osen && vap->iv_bss && (vap->iv_flags & IEEE80211_F_WPA))
			frm = ieee80211_add_wpa(frm, vap);
		/* RRM enabled IE */
		if (IEEE80211_COM_NEIGHREPORT_ENABLED(ic))
			frm = ieee80211_add_rrm_enabled(frm, vap);
		/* Mobility Domain IE */
		if (vap->iv_mdid) {
			frm = ieee80211_add_mdie(frm, vap);
		}
		/* AthAdvCaps */
		if (vap->iv_bss && vap->iv_bss->ni_ath_flags)
			frm = ieee80211_add_athAdvCap(frm, vap->iv_bss->ni_ath_flags,
					vap->iv_bss->ni_ath_defkeyindex);

		if (vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_RESP].ie) {
			memcpy(frm, vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_RESP].ie,
					vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_RESP].length);
			ieee80211_update_bss_tm(frm,
				vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_RESP].length, ic, vap);
			frm += vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_RESP].length;
		}

		if (vap->qtn_pairing_ie.ie) {
			frm = ieee80211_add_qtn_pairing_ie(frm, &vap->qtn_pairing_ie);
		}

		if (IS_IEEE80211_VHT_ENABLED(ic) && !ap_pure_tkip) {
			frm = ieee80211_add_vhtcap(ni, frm, &ic->ic_vhtcap, type);

			/* VHT Operation element */
			if ((IEEE80211_IS_VHT_40(ic)) || (IEEE80211_IS_VHT_20(ic))) {
				ic->ic_vhtop.chanwidth = IEEE80211_VHTOP_CHAN_WIDTH_20_40MHZ;
				ic->ic_vhtop.centerfreq0 = 0;
			} else if (IEEE80211_IS_VHT_80(ic)) {
				ic->ic_vhtop.chanwidth = IEEE80211_VHTOP_CHAN_WIDTH_80MHZ;
				ic->ic_vhtop.centerfreq0 = ic->ic_bsschan->ic_center_f_80MHz;
			} else {
				ic->ic_vhtop.chanwidth = IEEE80211_VHTOP_CHAN_WIDTH_160MHZ;
				ic->ic_vhtop.centerfreq0 = ic->ic_bsschan->ic_center_f_160MHz;
			}
			frm = ieee80211_add_vhtop(ni, frm, &ic->ic_vhtop);
		} else if (IS_IEEE80211_11NG_VHT_ENABLED(ic) && !ap_pure_tkip) {
			/* QTN 2.4G VHT IE */
			frm = ieee80211_add_vhtcap(ni, frm, &ic->ic_vhtcap_24g, type);
			frm = ieee80211_add_vhtop(ni, frm, &ic->ic_vhtop_24g);
		}

		frm = ieee80211_add_qtn_ie(frm, ic,
			(vap->iv_flags_ext & IEEE80211_FEXT_WDS ? (IEEE80211_QTN_BRIDGEMODE) : 0),
			(vap->iv_flags_ext & IEEE80211_FEXT_WDS ?
				(IEEE80211_QTN_BRIDGEMODE | IEEE80211_QTN_LNCB) : 0),
			0, 0, 0);

		/* Add Quantenna extender IE */
		if (!IEEE80211_COM_WDS_IS_NONE(ic) && (vap == TAILQ_FIRST(&ic->ic_vaps))) {
			frm = ieee80211_add_qtn_extender_role_ie(frm, ic->ic_extender_role);
			frm = ieee80211_add_qtn_extender_bssid_ie(vap, frm);
			frm = ieee80211_add_qtn_extender_state_ie(frm, !!ic->ic_ocac.ocac_cfg.ocac_enable);
		}

#ifdef CONFIG_QVSP
		/* QTN WME IE */
		if (ic->ic_wme.wme_throt_bm && ic->ic_wme.wme_throt_add_qwme_ie &&
				(vap->iv_flags & IEEE80211_F_WME)) {
			frm = ieee80211_add_qtn_wme_param(vap, frm);
		}
#endif
		skb_trim(skb, frm - skb->data);
		break;

	case IEEE80211_FC0_SUBTYPE_AUTH:
		status = arg >> 16;
		arg &= 0xffff;
		has_challenge = ((arg == IEEE80211_AUTH_SHARED_CHALLENGE ||
			arg == IEEE80211_AUTH_SHARED_RESPONSE) &&
			ni->ni_challenge != NULL);
		uint8_t len = 0;
		uint8_t *data = NULL;

		/*
		 * Deduce whether we're doing open authentication or
		 * shared key authentication.  We do the latter if
		 * we're in the middle of a shared key authentication
		 * handshake or if we're initiating an authentication
		 * request and configured to use shared key.
		 */
		is_shared_key = has_challenge ||
			arg >= IEEE80211_AUTH_SHARED_RESPONSE ||
			(arg == IEEE80211_AUTH_SHARED_REQUEST &&
			vap->iv_bss &&
			vap->iv_bss->ni_authmode == IEEE80211_AUTH_SHARED);

		len = 3 * sizeof(u_int16_t)
			+ (has_challenge && status == IEEE80211_STATUS_SUCCESS ?
				sizeof(u_int16_t)+IEEE80211_CHALLENGE_LEN : 0);
		if (ni->ni_tx_md_ie && ni->ni_tx_md_ie[1] > 0)
			len += ni->ni_tx_md_ie[1] + 2;
		if (ni->ni_tx_ft_ie && ni->ni_tx_ft_ie[1] > 0)
			len += ni->ni_tx_ft_ie[1] + 2;
		if (ni->ni_tx_rsn_ie && ni->ni_tx_rsn_ie[1] > 0)
			len += ni->ni_tx_rsn_ie[1] + 2;

		skb = ieee80211_getmgtframe(&frm, len);
		if (skb == NULL)
			senderr(ENOMEM, is_tx_nobuf);

		((__le16 *)frm)[0] =
			(is_shared_key) ? htole16(IEEE80211_AUTH_ALG_SHARED)
				: htole16(IEEE80211_AUTH_ALG_OPEN);
		((__le16 *)frm)[1] = htole16(arg);	/* sequence number */
		((__le16 *)frm)[2] = htole16(status);	/* status */

		if (has_challenge && status == IEEE80211_STATUS_SUCCESS) {
			((__le16 *)frm)[3] =
				htole16((IEEE80211_CHALLENGE_LEN << 8) |
					IEEE80211_ELEMID_CHALLENGE);
			memcpy(&((__le16 *)frm)[4], ni->ni_challenge,
				IEEE80211_CHALLENGE_LEN);
			if (arg == IEEE80211_AUTH_SHARED_RESPONSE) {
				IEEE80211_NOTE(vap, IEEE80211_MSG_AUTH, ni,
					"request encrypt frame (%s)", __func__);
				M_FLAG_SET(skb, M_LINK0);
			}
		}
		if ( arg == IEEE80211_AUTH_FT) {
			((__le16 *)frm)[0] = htole16(IEEE80211_AUTH_ALG_FT);
			((__le16 *)frm)[1] = htole16(2);	/* sequence number */

			if (status == IEEE80211_STATUS_SUCCESS) {
				data = &frm[6];
				if (ni->ni_tx_md_ie) {
					memcpy(data, ni->ni_tx_md_ie, ni->ni_tx_md_ie[1] + 2);
					data += ni->ni_tx_md_ie[1] + 2;
				}
				if (ni->ni_tx_ft_ie) {
					memcpy(data, ni->ni_tx_ft_ie, ni->ni_tx_ft_ie[1] + 2);
					data += ni->ni_tx_ft_ie[1] + 2;
				}
				if (ni->ni_tx_rsn_ie) {
					memcpy(data, ni->ni_tx_rsn_ie, ni->ni_tx_rsn_ie[1] + 2);
					data += ni->ni_tx_rsn_ie[1] + 2;
				}
			}
		}

		/* XXX not right for shared key */
		if (status == IEEE80211_STATUS_SUCCESS) {
			IEEE80211_NODE_STAT(ni, tx_auth);
			if (arg == IEEE80211_AUTH_OPEN_RESPONSE && vap->iv_opmode == IEEE80211_M_HOSTAP) {
				char event_string[IW_CUSTOM_MAX]; /* Buffer for IWEVENT message */
				union iwreq_data wreq;
				memset(&wreq, 0, sizeof(wreq));
				snprintf(event_string,IW_CUSTOM_MAX,"%sClient authenticated [%pM]",
							QEVT_COMMON_PREFIX, ni->ni_macaddr);
				wreq.data.length = strlen(event_string);
				wireless_send_event(vap->iv_dev, IWEVCUSTOM, &wreq, event_string);
			}
		} else {
			IEEE80211_NODE_STAT(ni, tx_auth_fail);
			if (arg == IEEE80211_AUTH_OPEN_RESPONSE && vap->iv_opmode == IEEE80211_M_HOSTAP) {
				char event_string[IW_CUSTOM_MAX]; /* Buffer for IWEVENT message */
				union iwreq_data wreq;
				memset(&wreq, 0, sizeof(wreq));
				snprintf(event_string,IW_CUSTOM_MAX,"%sClient failed to authenticate [%pM]",
							QEVT_COMMON_PREFIX, ni->ni_macaddr);
				wreq.data.length = strlen(event_string);
				wireless_send_event(vap->iv_dev, IWEVCUSTOM, &wreq, event_string);
			}
		}

		if (vap->iv_opmode == IEEE80211_M_STA)
			timer = IEEE80211_TRANS_WAIT;
		break;

	case IEEE80211_FC0_SUBTYPE_DEAUTH:
		IEEE80211_NOTE(vap, IEEE80211_MSG_AUTH, ni,
			"send station deauthenticate (reason %d)", arg);
		skb = ieee80211_getmgtframe(&frm, sizeof(u_int16_t));
		if (skb == NULL)
			senderr(ENOMEM, is_tx_nobuf);
		*(__le16 *)frm = htole16(arg);	/* reason */

		IEEE80211_NODE_STAT(ni, tx_deauth);
		IEEE80211_NODE_STAT_SET(ni, tx_deauth_code, arg);
		{
			int msg = IEEE80211_DOT11_MSG_CLIENT_REMOVED;
			if (vap->iv_opmode == IEEE80211_M_STA) {
				msg = IEEE80211_DOT11_MSG_AP_DISCONNECTED;
			}
			if (arg == IEEE80211_REASON_AUTH_EXPIRE) {
				ieee80211_eventf(vap->iv_dev,"%s[WLAN access rejected: incorrect "
						 "security] from MAC address %pM", QEVT_ACL_PREFIX,
						 ni->ni_macaddr);
			}
#if defined(CONFIG_QTN_BSA_SUPPORT)
			if ((vap->bsa_status == BSA_STATUS_ACTIVE) &&
					(vap->iv_opmode == IEEE80211_M_HOSTAP))
				ieee80211_bsa_disconnect_event_send(vap, ni, arg,
						IEEE80211_FC0_SUBTYPE_DEAUTH,
						BSA_DISCONNECT_SELF_GENERATED);
#endif

			ieee80211_dot11_msg_send(ni->ni_vap,
					(char *)ni->ni_macaddr,
					d11_m[msg],
					d11_c[IEEE80211_DOT11_MSG_REASON_DEAUTHENTICATED],
					arg,
					(arg < DOT11_MAX_REASON_CODE) ? d11_r[arg] : "Reserved",
					NULL,
					NULL);
		}

		ieee80211_node_unauthorize(ni);		/* port closed */
		break;

	case IEEE80211_FC0_SUBTYPE_ASSOC_REQ:
	case IEEE80211_FC0_SUBTYPE_REASSOC_REQ:
		/*
		 * asreq frame format
		 *	[2] capability information
		 *	[2] listen interval
		 *	[6*] current AP address (reassoc only)
		 *	[tlv] ssid
		 *	[tlv] supported rates
		 *	[4] power capability (802.11h)
		 *	[54] supported channels element (802.11h)
		 *	[tlv] extended supported rates
		 *	[tlv] WME [if enabled and AP capable]
		 *      [tlv] Atheros advanced capabilities
		 *	[tlv] user-specified ie's
		 *      [tlv] QTN IE
		 */
		skb = ieee80211_getmgtframe(&frm,
			sizeof(u_int16_t) +
			sizeof(u_int16_t) +
			IEEE80211_ADDR_LEN +
			2 + IEEE80211_NWID_LEN +
			2 + IEEE80211_RATE_SIZE +
			4 + (2 + IEEE80211_SUPPCHAN_LEN) +
			2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE) +
			((ic->ic_curmode >= IEEE80211_MODE_11NA) ?
					(sizeof(struct ieee80211_ie_htcap) +
					 sizeof(struct ieee80211_extcap_param)) : 0) +
			sizeof(struct ieee80211_ie_wme) +
			sizeof(struct ieee80211_ie_athAdvCap) +
			(vap->iv_opt_ie != NULL ? vap->iv_opt_ie_len : 0) +
			vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].length +
			sizeof(struct ieee80211_ie_qtn) +
			(vap->qtn_pairing_ie.ie ? sizeof(struct ieee80211_ie_qtn_pairing) : 0) +
			(IS_IEEE80211_DUALBAND_VHT_ENABLED(ic) ?
				sizeof(struct ieee80211_ie_vhtcap) +
				sizeof(struct ieee80211_ie_vhtop_notif) : 0)
			);
		if (skb == NULL)
			senderr(ENOMEM, is_tx_nobuf);

		capinfo = 0;
		if (vap->iv_opmode == IEEE80211_M_IBSS)
			capinfo |= IEEE80211_CAPINFO_IBSS;
		else		/* IEEE80211_M_STA */
			capinfo |= IEEE80211_CAPINFO_ESS;
		if (vap->iv_flags & IEEE80211_F_PRIVACY)
			capinfo |= IEEE80211_CAPINFO_PRIVACY;
		/*
		 * NB: Some 11a AP's reject the request when
		 *     short premable is set.
		 */
		/* Capability information */
		if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
		    IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan))
			capinfo |= IEEE80211_CAPINFO_SHORT_PREAMBLE;
		if ((ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME) &&
		    (ic->ic_caps & IEEE80211_C_SHSLOT))
			capinfo |= IEEE80211_CAPINFO_SHORT_SLOTTIME;
		if ((ic->ic_flags & IEEE80211_F_DOTH) && vap->iv_bss &&
			(vap->iv_bss->ni_flags & IEEE80211_NODE_HT)) {
			capinfo |= IEEE80211_CAPINFO_SPECTRUM_MGMT;
		}
		*(__le16 *)frm = htole16(capinfo);
		frm += 2;

		/* listen interval */
		*(__le16 *)frm = htole16(ic->ic_lintval / ni->ni_intval);
		frm += 2;

		/* Current AP address */
		if (type == IEEE80211_FC0_SUBTYPE_REASSOC_REQ) {
			if (vap->iv_bss) {
				IEEE80211_ADDR_COPY(frm, vap->iv_bss->ni_bssid);
			} else {
				printk(KERN_ERR "Sending Reassoc Req frame"
						" with NULL BSSID \n");
				memset(frm, 0, IEEE80211_ADDR_LEN);
			}
			frm += IEEE80211_ADDR_LEN;
		}
		/* ssid */
		frm = ieee80211_add_ssid(frm, ni->ni_essid, ni->ni_esslen);

		is_11b_ap = ieee80211_check_11b_ap(ni);
		/* supported rates */
		if (!is_11b_ap) {
			frm = ieee80211_add_rates(frm, &ic->ic_sup_rates[mode]);
		} else {
			frm = ieee80211_add_rates(frm, &ic->ic_sup_rates[IEEE80211_MODE_11B]);
		}

		if ((ic->ic_curmode >= IEEE80211_MODE_11NA) && vap->iv_bss &&
			(vap->iv_bss->ni_flags & IEEE80211_NODE_HT) && !sta_pure_tkip) {
			frm = ieee80211_add_htcap(ni, frm, &ic->ic_htcap, type);
			/* Ext. Capabilities - For AP mode hostapd adds the extended cap */
			if (vap->iv_opmode == IEEE80211_M_STA)
				frm = ieee80211_add_extcap(frm);
		}

		/* ext. supp. rates */
		if (!is_11b_ap) {
			frm = ieee80211_add_xrates(frm, &ic->ic_sup_rates[mode]);
		}

		/* power capability/supported channels
		 * in chapter 8.3.3.5, power capability IE is right after extended supported rates
		 * and before supported channels
		 * */
		if (ic->ic_flags & IEEE80211_F_DOTH)
			frm = ieee80211_add_doth(frm, ic);

		/* Supported Channels */
		frm = ieee80211_add_supported_chans(frm, ic);

		/* WME */
		if ((vap->iv_flags & IEEE80211_F_WME) && (ni->ni_wme_ie != NULL))
			frm = ieee80211_add_wme(frm, ni);

		/* ath adv. cap */
		if (ni->ni_ath_flags & vap->iv_ath_cap) {
			IEEE80211_NOTE(vap, IEEE80211_MSG_ASSOC, ni,
				"Adding ath adv cap ie: ni_ath_flags = %02x, "
				"iv_ath_cap = %02x", ni->ni_ath_flags,
				vap->iv_ath_cap);

			/* Setup default key index for static wep case */
			def_keyindex = IEEE80211_INVAL_DEFKEY;
			if (((vap->iv_flags & IEEE80211_F_WPA) == 0) &&
			    (ni->ni_authmode != IEEE80211_AUTH_8021X) &&
			    (vap->iv_def_txkey != IEEE80211_KEYIX_NONE))
				def_keyindex = vap->iv_def_txkey;

			frm = ieee80211_add_athAdvCap(frm,
				ni->ni_ath_flags & vap->iv_ath_cap,
				def_keyindex);
		}

		/* 802.11ac vht capability */
		if (IS_IEEE80211_VHT_ENABLED(ic) && !sta_pure_tkip) {
			frm = ieee80211_add_vhtcap(ni, frm, &ic->ic_vhtcap, type);
			frm = ieee80211_add_vhtop_notif(ni, frm, ic, 0);
		} else if (IS_IEEE80211_11NG_VHT_ENABLED(ic) && !sta_pure_tkip) {
			/* QTN 2.4G VHT IE */
			frm = ieee80211_add_vhtcap(ni, frm, &ic->ic_vhtcap_24g, type);
			frm = ieee80211_add_vhtop_notif(ni, frm, ic, 1);
		}

		/* User-spec */
		if (vap->iv_opt_ie != NULL) {
			memcpy(frm, vap->iv_opt_ie, vap->iv_opt_ie_len);
			frm += vap->iv_opt_ie_len;
		}

		if (vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].ie) {
			memcpy(frm, vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].ie,
				vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].length);
			frm += vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].length;
		}

		frm = ieee80211_add_qtn_ie(frm, ic,
			(vap->iv_flags_ext & IEEE80211_FEXT_WDS ? (IEEE80211_QTN_BRIDGEMODE) : 0),
			(vap->iv_flags_ext & IEEE80211_FEXT_WDS ?
				(IEEE80211_QTN_BRIDGEMODE | IEEE80211_QTN_LNCB) : 0),
			vap->iv_implicit_ba, IEEE80211_DEFAULT_BA_WINSIZE_H,
			ni->ni_rate_train);

		/* Add QTN Pairing IE */
		if (vap->qtn_pairing_ie.ie) {
			frm = ieee80211_add_qtn_pairing_ie(frm, &vap->qtn_pairing_ie);
		}

		skb_trim(skb, frm - skb->data);

		timer = IEEE80211_TRANS_WAIT;
		IEEE80211_NOTE(vap, IEEE80211_MSG_ASSOC, ni,
			       "send station %s",
			       (type == IEEE80211_FC0_SUBTYPE_ASSOC_REQ) ? "assoc_req" : "reassoc_req");
		break;

	case IEEE80211_FC0_SUBTYPE_ASSOC_RESP:
	case IEEE80211_FC0_SUBTYPE_REASSOC_RESP:
		/*
		 * asreq frame format
		 *	[2] capability information
		 *	[2] status
		 *	[2] association ID
		 *	[tlv] supported rates
		 *	[tlv] extended supported rates
		 *      [tlv] WME (if enabled and STA enabled)
		 *      [tlv] Atheros Advanced Capabilities
		 *      [tlv] QTN IE
		 *      [tlv] VSP IE
		 */
		skb = ieee80211_getmgtframe(&frm,
			3 * sizeof(u_int16_t) +
			2 + IEEE80211_RATE_SIZE +
			2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE) +
			((IEEE80211_IS_CHAN_ANYN(ic->ic_bsschan) &&
			  (ic->ic_curmode >= IEEE80211_MODE_11NA)) ?
					(sizeof(struct ieee80211_ie_htcap) +
					 sizeof(struct ieee80211_ie_htinfo)) : 0) +
			sizeof(struct ieee80211_wme_param) +
			(vap->iv_ath_cap ? sizeof(struct ieee80211_ie_athAdvCap) : 0) +
			vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].length +
			sizeof(struct ieee80211_ie_qtn) +
			(vap->qtn_pairing_ie.ie ? sizeof(struct ieee80211_ie_qtn_pairing) : 0)
#ifdef CONFIG_QVSP
			+ ieee80211_vsp_ie_max_len(ic)
#endif
			+ (IS_IEEE80211_DUALBAND_VHT_ENABLED(ic) ?
				(sizeof(struct ieee80211_ie_vhtcap) +
				 sizeof(struct ieee80211_ie_vhtop)) : 0)
			+ ((IS_IEEE80211_11NG(ic)) ?
				(sizeof(struct ieee80211_20_40_coex_param) +
				sizeof(struct ieee80211_obss_scan_ie)) : 0)
			+ (IEEE80211_COM_NEIGHREPORT_ENABLED(ic) ? sizeof(struct ieee80211_ie_rrm) : 0)
			+ (ni->ni_tx_md_ie ? IEEE80211_MDIE_LEN + 2 : 0)
			+ (ni->ni_tx_ft_ie ? ni->ni_tx_ft_ie[1] + 2: 0)
			+ (ni->ni_rsn_ie ? ni->ni_rsn_ie[1] + 2: 0)
			);
		if (skb == NULL)
			senderr(ENOMEM, is_tx_nobuf);

		/* Capability Information */
		capinfo = IEEE80211_CAPINFO_ESS;
		if (vap->iv_flags & IEEE80211_F_PRIVACY)
			capinfo |= IEEE80211_CAPINFO_PRIVACY;
		if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
		    IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan))
			capinfo |= IEEE80211_CAPINFO_SHORT_PREAMBLE;
		if (ic->ic_flags & IEEE80211_F_SHSLOT)
			capinfo |= IEEE80211_CAPINFO_SHORT_SLOTTIME;
		if (ic->ic_flags & IEEE80211_F_DOTH)
			capinfo |= IEEE80211_CAPINFO_SPECTRUM_MGMT;
		if (IEEE80211_COM_NEIGHREPORT_ENABLED(ic))
			capinfo |= IEEE80211_CAPINFO_RM;
		*(__le16 *)frm = htole16(capinfo);
		frm += 2;

		/* status */
		*(__le16 *)frm = htole16(arg);
		frm += 2;

		/* Assoc ID */
		if (arg == IEEE80211_STATUS_SUCCESS) {
			*(__le16 *)frm = htole16(ni->ni_associd);
			IEEE80211_NODE_STAT(ni, tx_assoc);
		} else
			IEEE80211_NODE_STAT(ni, tx_assoc_fail);
		frm += 2;

		/* supported rates */
		frm = ieee80211_add_rates(frm, &ic->ic_sup_rates[mode]);

		if (IS_IEEE80211_11NG(ic)) {
			frm = ieee80211_add_20_40_bss_coex_ie(frm, vap->iv_coex);
			frm = ieee80211_add_obss_scan_ie(frm, &ic->ic_obss_ie);
		}

		/* 802.11w / PMF Timeout element */
		if(vap->iv_pmf && arg == IEEE80211_STATUS_PMF_REJECT_RETRY) {
			frm = ieee80211_add_timeout_ie(frm);
		}

		if (IEEE80211_IS_CHAN_ANYN(ic->ic_bsschan) &&
			(ic->ic_curmode >= IEEE80211_MODE_11NA)) {
			if (arg == IEEE80211_STATUS_SUCCESS) {
				if ((ni->ni_htcap.cap & IEEE80211_HTCAP_C_CHWIDTH40) == 0) {
					vap->iv_ht_anomaly_40MHz_present = 1;
				}

				if ((ni->ni_htcap.cap & IEEE80211_HTCAP_C_GREENFIELD) == 0)
					vap->iv_non_gf_sta_present = 1;

				if ((ni->ni_htcap.cap & IEEE80211_HTCAP_C_LSIGTXOPPROT) == 0)
					vap->iv_lsig_txop_ok = 0;

				vap->iv_ht_flags |= IEEE80211_HTF_HTINFOUPDATE;

			}
			if (!ap_pure_tkip &&
				(ni->ni_rsn.rsn_ucastcipher != IEEE80211_CIPHER_TKIP) &&
					(ni->ni_flags >= IEEE80211_NODE_HT)) {
				frm = ieee80211_add_htcap(ni, frm, &ic->ic_htcap, type);
				frm = ieee80211_add_htinfo(ni, frm, &ic->ic_htinfo);
			}
		}

		/* ext. suppo. rates */
		frm = ieee80211_add_xrates(frm, &ic->ic_sup_rates[mode]);

		/* WME */
		if ((vap->iv_flags & IEEE80211_F_WME) && (ni->ni_wme_ie != NULL))
			frm = ieee80211_add_wme_param(frm, wme,
						IEEE80211_VAP_UAPSD_ENABLED(vap), 0);

		if (IEEE80211_COM_NEIGHREPORT_ENABLED(ic))
			frm = ieee80211_add_rrm_enabled(frm, vap);

		/* athAdvCap */
		if (vap->iv_ath_cap)
			frm = ieee80211_add_athAdvCap(frm,
				vap->iv_ath_cap & ni->ni_ath_flags,
				ni->ni_ath_defkeyindex);

		if (vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].ie) {
			memcpy(frm, vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].ie,
				vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].length);
			ieee80211_update_bss_tm(frm,
				vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_RESP].length, ic, vap);
			frm += vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].length;
		}

		if (ni->ni_qtn_assoc_ie) {
			frm = ieee80211_add_qtn_ie(frm, ic,
				((struct ieee80211_ie_qtn *)ni->ni_qtn_assoc_ie)->qtn_ie_flags,
				(vap->iv_flags_ext & IEEE80211_FEXT_WDS ?
					(IEEE80211_QTN_BRIDGEMODE | IEEE80211_QTN_LNCB) : 0),
				vap->iv_implicit_ba, IEEE80211_DEFAULT_BA_WINSIZE_H,
				ni->ni_rate_train);
#ifdef CONFIG_QVSP
			frm = ieee80211_add_vsp_ie(vap, frm, skb->end);
			/* QTN WME IE */
			if (ic->ic_wme.wme_throt_bm && ic->ic_wme.wme_throt_add_qwme_ie &&
					(vap->iv_flags & IEEE80211_F_WME)) {
				frm = ieee80211_add_qtn_wme_param(vap, frm);
			}
#endif
		}
		if (!ap_pure_tkip && (ni->ni_flags & IEEE80211_NODE_VHT)) {
			if (IS_IEEE80211_VHT_ENABLED(ic)) {
				frm = ieee80211_add_vhtcap(ni, frm, &ic->ic_vhtcap, type);

				/* VHT Operation element */
				if ((IEEE80211_IS_VHT_40(ic)) || (IEEE80211_IS_VHT_20(ic))) {
					ic->ic_vhtop.chanwidth = IEEE80211_VHTOP_CHAN_WIDTH_20_40MHZ;
					ic->ic_vhtop.centerfreq0 = 0;
				} else if (IEEE80211_IS_VHT_80(ic)) {
					ic->ic_vhtop.chanwidth = IEEE80211_VHTOP_CHAN_WIDTH_80MHZ;
					ic->ic_vhtop.centerfreq0 = ic->ic_bsschan->ic_center_f_80MHz;
				} else {
					ic->ic_vhtop.chanwidth = IEEE80211_VHTOP_CHAN_WIDTH_160MHZ;
					ic->ic_vhtop.centerfreq0 = ic->ic_bsschan->ic_center_f_160MHz;
				}
				frm = ieee80211_add_vhtop(ni, frm, &ic->ic_vhtop);
			} else if (IS_IEEE80211_11NG_VHT_ENABLED(ic)) {
				/* QTN 2.4G VHT IE */
				frm = ieee80211_add_vhtcap(ni, frm, &ic->ic_vhtcap_24g, type);
				frm = ieee80211_add_vhtop(ni, frm, &ic->ic_vhtop_24g);
			}
		}

		/* Add QTN Pairing IE. */
		if (vap->qtn_pairing_ie.ie) {
			frm = ieee80211_add_qtn_pairing_ie(frm, &vap->qtn_pairing_ie);
		}
		if (ni->ni_tx_md_ie) {
			memcpy(frm, ni->ni_tx_md_ie, ni->ni_tx_md_ie[1] + 2);
			frm += 5;
		}
		if (ni->ni_tx_ft_ie) {
			memcpy(frm, ni->ni_tx_ft_ie, ni->ni_tx_ft_ie[1] + 2);
			frm += ni->ni_tx_ft_ie[1] + 2;
		}
		if (type == IEEE80211_FC0_SUBTYPE_REASSOC_RESP) {
			if (ni->ni_tx_rsn_ie) {
				memcpy(frm, ni->ni_tx_rsn_ie, ni->ni_tx_rsn_ie[1] + 2);
				frm += ni->ni_tx_rsn_ie[1] + 2;
			}
		}

		skb_trim(skb, frm - skb->data);
		IEEE80211_NOTE(vap, IEEE80211_MSG_ASSOC, ni,
			       "send station %s (reason %d)",
			       (type == IEEE80211_FC0_SUBTYPE_ASSOC_RESP) ? "assoc_resp" : "reassoc_resp", arg);

		if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
			ieee80211_eventf(vap->iv_dev, "%sClient associated [%pM]",
					 QEVT_COMMON_PREFIX, ni->ni_macaddr);
		}
		break;

	case IEEE80211_FC0_SUBTYPE_DISASSOC:
		IEEE80211_NOTE(vap, IEEE80211_MSG_ASSOC, ni,
		    "send station disassociate (reason %d)", arg);
		skb = ieee80211_getmgtframe(&frm, sizeof(u_int16_t));
		if (skb == NULL)
			senderr(ENOMEM, is_tx_nobuf);
		*(__le16 *)frm = htole16(arg);	/* reason */

		{
			int msg = IEEE80211_DOT11_MSG_CLIENT_REMOVED;
			if (vap->iv_opmode == IEEE80211_M_STA) {
				msg = IEEE80211_DOT11_MSG_AP_DISCONNECTED;
			}
#if defined(CONFIG_QTN_BSA_SUPPORT)
			if ((vap->bsa_status == BSA_STATUS_ACTIVE) &&
					(vap->iv_opmode == IEEE80211_M_HOSTAP))
				ieee80211_bsa_disconnect_event_send(vap, ni, arg,
						IEEE80211_FC0_SUBTYPE_DISASSOC,
						BSA_DISCONNECT_SELF_GENERATED);
#endif

			ieee80211_dot11_msg_send(ni->ni_vap,
					(char *)ni->ni_macaddr,
					d11_m[msg],
					d11_c[IEEE80211_DOT11_MSG_REASON_DISASSOCIATED],
					arg,
					(arg < DOT11_MAX_REASON_CODE) ? d11_r[arg] : "Reserved",
					NULL,
					NULL);
		}

		if (ic->ic_opmode == IEEE80211_M_STA)
			del_timer_sync(&ic->ic_obss_timer);

		IEEE80211_NODE_STAT(ni, tx_disassoc);
		IEEE80211_NODE_STAT_SET(ni, tx_disassoc_code, arg);
		break;

	case IEEE80211_FC0_SUBTYPE_ACTION: {
		u_int16_t temp16;
		struct ieee80211_action_data *action_data = (struct ieee80211_action_data *)arg;
		u_int8_t cat = action_data->cat;

		IEEE80211_NODE_STAT(ni, tx_action);

		switch (cat) {
		case IEEE80211_ACTION_CAT_SPEC_MGMT:
			switch (action_data->action) {
			case IEEE80211_ACTION_S_TPC_REQUEST:
			{
				struct ieee80211_action_tpc_request *request;
				u_int8_t tx_token;

				request = (struct ieee80211_action_tpc_request *)action_data->params;
				skb = ieee80211_getmgtframe(&frm, sizeof(u_int16_t) +	/* action header */
									1 +		/* dialog token */
									2);		/* tpc request ie */
				if (skb == NULL)
					senderr(ENOMEM, is_tx_nobuf);
				*frm++ = IEEE80211_ACTION_CAT_SPEC_MGMT;
				*frm++ = IEEE80211_ACTION_S_TPC_REQUEST;
				tx_token = ni->ni_action_token++;
				*frm++ = tx_token;
				*frm++ = IEEE80211_ELEMID_TPCREQ;
				*frm++ = 0;

				if (request->expire != 0) {
					skb = ieee80211_ppqueue_pre_tx(ni,
							skb,
							IEEE80211_ACTION_CAT_SPEC_MGMT,
							IEEE80211_ACTION_S_TPC_REPORT,
							tx_token,
							request->expire,
							request->fn_success,
							request->fn_fail);

					if (skb == NULL) {
						ret = -ENOMEM;
						goto bad;
					}
				}
				break;
			}
			case IEEE80211_ACTION_S_TPC_REPORT: {
				struct ieee80211_action_tpc_report *tpc_report = (struct ieee80211_action_tpc_report *)action_data->params;
				skb = ieee80211_getmgtframe(&frm, sizeof(u_int16_t) +	/* action header */
									1 +		/* dialog token */
									4);		/* tpc report ie */
				if (skb == NULL)
					senderr(ENOMEM, is_tx_nobuf);
				*frm++ = IEEE80211_ACTION_CAT_SPEC_MGMT;
				*frm++ = IEEE80211_ACTION_S_TPC_REPORT;
				*frm++ = tpc_report->rx_token;
				*frm++ = IEEE80211_ELEMID_TPCREP;
				*frm++ = 2;
				*frm++ = tpc_report->tx_power;
				*frm++ = tpc_report->link_margin;
				break;
			}
			case IEEE80211_ACTION_S_MEASUREMENT_REQUEST:
			case IEEE80211_ACTION_S_MEASUREMENT_REPORT:
				ret = ieee80211_compile_action_measurement_11h(ni, action_data->params, action_data->action, &skb);
				if (ret != 0)
					goto bad;
				break;
			default:
				break;
			}
			break;
		case IEEE80211_ACTION_CAT_HT: {
			switch (action_data->action) {
			case IEEE80211_ACTION_HT_NCBEAMFORMING:
				IEEE80211_DPRINTF(vap,IEEE80211_MSG_OUTPUT,
					"Err: Action frame construction not suppported\n",0);
				break;
			case IEEE80211_ACTION_HT_MIMOPWRSAVE:
				{
				/* Form the HT SM PS frame - change of mode for this client. */
				/* Single byte argument, which is formatted as per 802.11n d11.0 section 7.3.1.22 */
				u_int8_t *p_byte = (u_int8_t *)&action_data->params;
				skb = ieee80211_getmgtframe(&frm, sizeof(u_int16_t) + /* action header */
								1 /* SMPS state change */ );
				if (skb == NULL) {
					senderr(ENOMEM, is_tx_nobuf);
				}

				*(u_int8_t *)frm = IEEE80211_ACTION_CAT_HT;
				frm += 1;

				*(u_int8_t *)frm = IEEE80211_ACTION_HT_MIMOPWRSAVE;
				frm += 1;

				*(u_int8_t *)frm = *p_byte; /* New power save mode */
				frm += 1;
				}
				break;
			default:
				break;
			}

			if(skb != NULL) {
				skb_trim(skb, frm - skb->data);
			}
			break;
		}
		case IEEE80211_ACTION_CAT_BA: {
			switch (action_data->action) {
			case IEEE80211_ACTION_BA_ADDBA_REQ: {
				struct ba_action_req *ba = (struct ba_action_req *)action_data->params;

				skb = ieee80211_getmgtframe(&frm,
							sizeof(u_int16_t) + /* action header */
							sizeof(u_int8_t) + /* dialog */
							sizeof(u_int16_t) + /* BA params */
							sizeof(u_int16_t) + /* BA timeout */
							sizeof(u_int16_t) /* BA sequence control */
							);
				if (skb == NULL) {
					senderr(ENOMEM, is_tx_nobuf);
				}

				*(u_int8_t *)frm = IEEE80211_ACTION_CAT_BA;
				frm += 1;

				*(u_int8_t *)frm = IEEE80211_ACTION_BA_ADDBA_REQ;
				frm += 1;

				/* fill ba dialog */
				ni->ni_ba_tx[ba->tid].dlg_out = (ni->ni_ba_tx[ba->tid].dlg_out + 1) % 0xFF;
				*(u_int8_t *)frm = ni->ni_ba_tx[ba->tid].dlg_out;
				frm += 1;

				/* fill ba params (non half word aligned) */
				temp16 = 0;
				temp16 |= ((ba->type == IEEE80211_BA_DELAYED) ?
						IEEE80211_A_BA_DELAYED : IEEE80211_A_BA_IMMEDIATE);
				temp16 |= ((ba->tid) << IEEE80211_A_BA_TID_S);
				temp16 |= ((ba->buff_size) << IEEE80211_A_BA_BUFF_SIZE_S);
				if (!ieee80211_tx_amsdu_disabled(ni))
					temp16 |= IEEE80211_A_BA_AMSDU_SUPPORTED;

				*(u_int8_t *)frm = temp16 & 0xFF;
				frm += 1;

				*(u_int8_t *)frm = temp16 >> 8;
				frm += 1;

				/* fill ba timeout (non half word aligned) */
				*(u_int8_t *)frm = ba->timeout & 0xFF;
				frm += 1;

				*(u_int8_t *)frm = ba->timeout >> 8;
				frm += 1;

				/* fill sequence control (non half word aligned) */
				*(u_int8_t *)frm = ba->frag | ((ba->seq & 0xF) << 4);
				frm += 1;

				*(u_int8_t *)frm = (ba->seq  & 0xFF0) >> 4;
				frm += 1;
				break;
			}
			case IEEE80211_ACTION_BA_ADDBA_RESP: {
				struct ba_action_resp *ba = (struct ba_action_resp *)action_data->params;
				skb = ieee80211_getmgtframe(&frm,
							sizeof(u_int16_t) + /* action header */
							sizeof(u_int8_t) + /* dialog */
							sizeof(u_int16_t) + /* status */
							sizeof(u_int16_t) + /* BA params */
							sizeof(u_int16_t) /* BA timeout */
							);
				if (skb == NULL)
					senderr(ENOMEM, is_tx_nobuf);

				*(u_int8_t *)frm = IEEE80211_ACTION_CAT_BA;
				frm += 1;

				*(u_int8_t *)frm = IEEE80211_ACTION_BA_ADDBA_RESP;
				frm += 1;

				/* fill ba dialog */
				*(u_int8_t *)frm = ni->ni_ba_rx[ba->tid].dlg_in;
				frm += 1;

				/* fill ba status (non half word aligned) */
				*(u_int8_t *)frm = ba->reason & 0xFF;
				frm += 1;

				*(u_int8_t *)frm = ba->reason >> 8;
				frm += 1;

				/* fill ba params (non half word aligned) */
				temp16 = 0;
				temp16 |= ((ba->type == IEEE80211_BA_DELAYED) ?
						IEEE80211_A_BA_DELAYED : IEEE80211_A_BA_IMMEDIATE);
				temp16 |= ((ba->tid) << IEEE80211_A_BA_TID_S);
				temp16 |= ((ba->buff_size) << IEEE80211_A_BA_BUFF_SIZE_S);

				if (!ieee80211_rx_amsdu_allowed(ni)) {
					IEEE80211_DPRINTF(vap, IEEE80211_MSG_ACTION,
							"receive AMSDU within AMPDU is not permitted from \
							station %pM\n",	ni->ni_macaddr);
					temp16 &= ~IEEE80211_A_BA_AMSDU_SUPPORTED;
				} else {
					temp16 |= IEEE80211_A_BA_AMSDU_SUPPORTED;
				}

				*(u_int8_t *)frm = temp16 & 0xFF;
				frm += 1;

				*(u_int8_t *)frm = temp16 >> 8;
				frm += 1;

				/* fill ba timeout (non half word aligned) */
				*(u_int8_t *)frm = ba->timeout & 0xFF;
				frm += 1;

				*(u_int8_t *)frm = ba->timeout >> 8;
				frm += 1;
				break;
			}
			case IEEE80211_ACTION_BA_DELBA: {
				struct ba_action_del *ba = (struct ba_action_del *)action_data->params;
				skb = ieee80211_getmgtframe(&frm,
							sizeof(u_int16_t) + /* action header */
							sizeof(u_int16_t) + /* DELBA params */
							sizeof(u_int16_t) /* DELBA reason */
							);
				if (skb == NULL)
					senderr(ENOMEM, is_tx_nobuf);

				*(u_int8_t *)frm = IEEE80211_ACTION_CAT_BA;
				frm += 1;

				*(u_int8_t *)frm = IEEE80211_ACTION_BA_DELBA;
				frm += 1;

				/* fill ba params (non half word aligned) */
				temp16 = 0;
				temp16 |= SM(ba->tid, IEEE80211_A_BA_DELBA_TID);
				temp16 |= SM(ba->initiator, IEEE80211_A_BA_INITIATOR);

				*(u_int8_t *)frm = temp16 & 0xFF;
				frm += 1;

				*(u_int8_t *)frm = temp16 >> 8;
				frm += 1;

				/* fill ba reason (non half word aligned) */
				*(u_int8_t *)frm = ba->reason & 0xFF;
				frm += 1;

				*(u_int8_t *)frm = ba->reason >> 8;
				frm += 1;
				break;
			}
			default:
				break;
			}

			if(skb != NULL) {
				skb_trim(skb, frm - skb->data);
			}
			break;
		}
		case IEEE80211_ACTION_CAT_RM:
		{
			switch (action_data->action) {
			case IEEE80211_ACTION_R_MEASUREMENT_REQUEST:
			case IEEE80211_ACTION_R_MEASUREMENT_REPORT:
				ret = ieee80211_compile_action_measurement_11k(ni, action_data->params, action_data->action, &skb);
				break;
			case IEEE80211_ACTION_R_LINKMEASURE_REQUEST:
				ret = ieee80211_compile_action_link_measure_request(ni, action_data->params, &skb);
				break;
			case IEEE80211_ACTION_R_LINKMEASURE_REPORT:
				ret = ieee80211_compile_action_link_measure_report(ni, action_data->params, &skb);
				break;
			case IEEE80211_ACTION_R_NEIGHBOR_REQUEST:
				ret = ieee80211_compile_action_neighbor_report_request(ni, action_data->params, &skb);
				break;
			case IEEE80211_ACTION_R_NEIGHBOR_REPORT:
				ret = ieee80211_compile_action_neighbor_report_response(ni, action_data->params, &skb);
				break;
			default:
				ret = -1;
				break;
			}

			if (ret != 0)
				goto bad;

			break;
		}
#ifdef CONFIG_QVSP
		case IEEE80211_ACTION_CAT_VENDOR: {
			/* FIXME: Work out which vendor specific type to output. */
			struct ieee80211_qvsp_act *qvsp_a = (struct ieee80211_qvsp_act *)action_data->params;
			ret = ieee80211_compile_action_qvsp_frame(vap, qvsp_a, &skb);
			if (ret != 0)
				goto bad;
			break;
		}
#endif
		case IEEE80211_ACTION_CAT_SA_QUERY: {
			ret = ieee80211_compile_action_sa_query_frame(vap, action_data, &skb);
			if (ret != 0)
				goto bad;
			break;
		}
		case IEEE80211_ACTION_CAT_PUBLIC:
			if (action_data->action == IEEE80211_ACTION_PUB_20_40_COEX) {
				ret = ieee80211_compile_action_20_40_coex_frame(vap,
							action_data, &skb, ni);
				if (ret != 0)
					goto bad;
				break;
			}
		/* fall through if condition is not true */

		case IEEE80211_ACTION_CAT_FBSS:
		case IEEE80211_ACTION_CAT_QOS: {
			struct action_frame_payload *frm_payload =
					(struct action_frame_payload *)action_data->params;

			skb = ieee80211_getmgtframe(&frm, frm_payload->length);

			if (skb == NULL) {
				senderr(ENOMEM, is_tx_nobuf);
			} else {
				memcpy(frm, frm_payload->data, frm_payload->length);
				frm += frm_payload->length;
			}
			break;
		}
		case IEEE80211_ACTION_CAT_WNM: {
			if (action_data->action == IEEE80211_WNM_BSS_TRANS_MGMT_REQ) {
				struct btm_request_params *ctrl
					= (struct btm_request_params *)action_data->params;
				ret = ieee80211_compile_action_btm_req(ni, ctrl, &skb);
				if (ret != 0)
					goto bad;
			} else {
				struct action_frame_payload *frm_payload =
						(struct action_frame_payload *)action_data->params;

				skb = ieee80211_getmgtframe(&frm, frm_payload->length);

				if (skb == NULL) {
					senderr(ENOMEM, is_tx_nobuf);
				} else {
					memcpy(frm, frm_payload->data, frm_payload->length);
					frm += frm_payload->length;
				}
			}
			break;
		}
		default:
			break;
		}
		break;
	}

	default:
		IEEE80211_NOTE(vap, IEEE80211_MSG_ANY, ni,
			"invalid mgmt frame type %u", type);
		senderr(EINVAL, is_tx_unknownmgt);
		/* NOTREACHED */
	}

	if (skb != NULL) {
		if (timer) {
			if (ni != vap->iv_mgmt_retry_ni || type != vap->iv_mgmt_retry_type ||
					arg != vap->iv_mgmt_retry_arg) {
				vap->iv_mgmt_retry_ni = ni;
				vap->iv_mgmt_retry_type = type;
				vap->iv_mgmt_retry_arg = arg;
				vap->iv_mgmt_retry_cnt = 0;
			}
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
			expired_timer = (timer * HZ) + (random32() % HZ);
#else
			expired_timer = (timer * HZ) + (prandom_u32() % HZ);
#endif
			mod_timer(&vap->iv_mgtsend, jiffies + expired_timer);
		}

		ieee80211_mgmt_output(ni, skb, type, ni->ni_macaddr);
	} else {
		ieee80211_free_node(ni);
	}

	return 0;

bad:
	ieee80211_free_node(ni);
	return ret;
#undef senderr
}

/*
 * Send PS-POLL from to bss. Should only be called when as STA.
 */
void
ieee80211_send_pspoll(struct ieee80211_node *ni)
{
	struct ieee80211vap *vap = ni->ni_vap;
	struct ieee80211com *ic = ni->ni_ic;
	struct sk_buff *skb;
	struct ieee80211_ctlframe_addr2 *wh;

	skb = dev_alloc_skb(sizeof(struct ieee80211_ctlframe_addr2));
	if (skb == NULL) {
		return;
	}
	ieee80211_ref_node(ni);

	wh = (struct ieee80211_ctlframe_addr2 *) skb_put(skb, sizeof(struct ieee80211_ctlframe_addr2));

	wh->i_aidordur = htole16(0xc000 | IEEE80211_NODE_AID(ni));
	IEEE80211_ADDR_COPY(wh->i_addr1, ni->ni_bssid);
	IEEE80211_ADDR_COPY(wh->i_addr2, vap->iv_myaddr);
	wh->i_fc[0] = 0;
	wh->i_fc[1] = 0;
	wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
		IEEE80211_FC0_SUBTYPE_PS_POLL;
	if (IEEE80211_VAP_IS_SLEEPING(ni->ni_vap))
		wh->i_fc[1] |= IEEE80211_FC1_PWR_MGT;
	IEEE80211_DPRINTF(vap, IEEE80211_MSG_DEBUG | IEEE80211_MSG_DUMPPKTS,
			"[%s] send ps poll frame on channel %u\n",
			ether_sprintf(ni->ni_macaddr),
			ieee80211_chan2ieee(ic, ic->ic_curchan));
	ic->ic_send_80211(ic, ni, skb, WME_AC_VO, 0);
}
EXPORT_SYMBOL(ieee80211_send_pspoll);


/*
 * Send DELBA management frame.
 */
void ieee80211_send_delba(struct ieee80211_node *ni, int tid, int tx, int reason)
{
	struct ieee80211com *ic = ni->ni_ic;
	struct ieee80211_action_data act;
	struct ba_action_del ba_del;

	memset(&ba_del, 0, sizeof(ba_del));
	ba_del.tid = tid;
	ba_del.reason = reason;
	//	ba_del.initiator = (tx) ? 1 : 0;
	ba_del.initiator = !tx;

	memset(&act, 0, sizeof(act));
	act.cat = IEEE80211_ACTION_CAT_BA;
	act.action = IEEE80211_ACTION_BA_DELBA;
	act.params = (void *)&ba_del;

	ic->ic_send_mgmt(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&act);
}
EXPORT_SYMBOL(ieee80211_send_delba);

void ieee80211_rm_req_callback_success(void *ctx)
{
	struct ieee80211_node *ni = (struct ieee80211_node *)ctx;

	if (ni->ni_dotk_meas_state.meas_state_sta.pending) {
		ni->ni_dotk_meas_state.meas_state_sta.pending = 0;
		wake_up_interruptible(&ni->ni_dotk_waitq);
	}
}

void ieee80211_rm_req_callback_fail(void *ctx, int32_t reason)
{
	struct ieee80211_node *ni = (struct ieee80211_node *)ctx;

	if (ni->ni_dotk_meas_state.meas_state_sta.pending) {
		ni->ni_dotk_meas_state.meas_state_sta.status = -ETIMEDOUT;
		ni->ni_dotk_meas_state.meas_state_sta.pending = 0;
		wake_up_interruptible(&ni->ni_dotk_waitq);
	}
}

/*
 * Send radio measurement request - STA Statistics to associated STA. Should only be called when as AP.
 */
void
ieee80211_send_rm_req_stastats(struct ieee80211_node *ni, u_int32_t flags)
{
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;
	ieee80211_11k_sub_element_head se_head;
	ieee80211_11k_sub_element *p_se;
	struct stastats_subele_vendor *vendor = NULL;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_STA;
	ctrl.u.sta_stats.duration_tu = 0;
	if (flags & RM_QTN_MEASURE_MASK) {
		ctrl.u.sta_stats.group_id = 0;
		SLIST_INIT(&se_head);
		p_se = (ieee80211_11k_sub_element *)kmalloc(sizeof(*p_se) + sizeof(struct stastats_subele_vendor), GFP_KERNEL);
		if (p_se != NULL) {
			p_se->sub_id = IEEE80211_ELEMID_VENDOR;
			vendor = (struct stastats_subele_vendor *)p_se->data;
			vendor->flags = flags;
			SLIST_INSERT_HEAD(&se_head, p_se, next);
		}
		ctrl.u.sta_stats.sub_item = &se_head;
	} else {
		ctrl.u.sta_stats.group_id = 221;
	}
	ctrl.expire = IEEE80211K_RM_MEASURE_STA_TIMEOUT;
	ctrl.fn_success = ieee80211_rm_req_callback_success;
	ctrl.fn_fail = ieee80211_rm_req_callback_fail;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_req_stastats);

int32_t
ieee80211_send_rm_rep_stastats(struct ieee80211_node *ni,
		u_int8_t report_mode,
		u_int8_t token,
		u_int8_t meas_token,
		u_int8_t group_id,
		u_int16_t duration_tu,
		void *sub_item)
{
	struct ieee80211_meas_report_ctrl mreport_ctrl;
	struct ieee80211_action_data action_data;

	mreport_ctrl.meas_type = IEEE80211_RM_MEASTYPE_STA;
	mreport_ctrl.token = token;
	mreport_ctrl.meas_token = meas_token;
	mreport_ctrl.report_mode = report_mode;
	mreport_ctrl.autonomous = 0;
	if (report_mode == 0) {
		mreport_ctrl.u.sta_stats.group_id = group_id;
		mreport_ctrl.u.sta_stats.duration_tu = duration_tu;
		mreport_ctrl.u.sta_stats.sub_item = sub_item;
	}

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &mreport_ctrl;

	return IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_rep_stastats);

/*
 * Send radio measurement request - CCA. Should only be called when as AP.
 */
void
ieee80211_send_rm_req_cca(struct ieee80211_node *ni)
{
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_QTN_CCA;
	ctrl.u.qtn_cca.duration_tu = 1;
	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_req_cca);

void
ieee80211_send_rm_req_stastats_all(struct ieee80211com *ic)
{
	struct ieee80211_node *ni;
	struct ieee80211_node_table *nt = &ic->ic_sta;
	/* Fixed structure STA statistics */
	u_int32_t flags = BIT(RM_QTN_MAX + 1) - 1;

	IEEE80211_NODE_LOCK_BH(nt);
	TAILQ_FOREACH(ni, &nt->nt_node, ni_list) {
		if (ni->ni_vap->iv_opmode != IEEE80211_M_HOSTAP)
			continue;
		if (ni->ni_associd == 0)
			continue;
		ieee80211_send_rm_req_stastats(ni, flags);
	}
	IEEE80211_NODE_UNLOCK_BH(nt);
}
EXPORT_SYMBOL(ieee80211_send_rm_req_stastats_all);

void
ieee80211_send_rm_req_chan_load(struct ieee80211_node *ni,
				u_int8_t channel,
				u_int16_t duration_ms,
				unsigned long expire,
				void *fn_success,
				void *fn_fail)
{
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_CH_LOAD;
	ctrl.u.chan_load.channel = (channel == 0 ? ni->ni_ic->ic_curchan->ic_ieee : channel);
	ctrl.u.chan_load.duration_ms = duration_ms;

	ctrl.expire = expire;
	ctrl.fn_success = (ppq_callback_success)fn_success;
	ctrl.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_req_chan_load);

void
ieee80211_send_rm_rep_chan_load(struct ieee80211_node *ni,
		u_int8_t report_mode,
		u_int8_t token,
		u_int8_t meas_token,
		u_int8_t op_class,
		u_int8_t channel,
		u_int16_t duration_tu,
		u_int8_t channel_load)
{
	struct ieee80211_meas_report_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_CH_LOAD;
	ctrl.report_mode = report_mode;
	ctrl.token = token;
	ctrl.meas_token = meas_token;
	ctrl.autonomous = 0;
	if (report_mode == 0) {
		ctrl.u.chan_load.op_class = op_class;
		ctrl.u.chan_load.channel = channel;
		ctrl.u.chan_load.duration_tu = duration_tu;
		ctrl.u.chan_load.channel_load = channel_load;
	}

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_rep_chan_load);

void
ieee80211_send_rm_req_noise_his(struct ieee80211_node *ni,
				u_int8_t channel,
				u_int16_t duration_ms,
				unsigned long expire,
				void *fn_success,
				void *fn_fail)
{
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_NOISE;
	ctrl.u.noise_his.channel = (channel == 0 ? ni->ni_ic->ic_curchan->ic_ieee : channel);
	ctrl.u.noise_his.duration_ms = duration_ms;

	ctrl.expire = expire;
	ctrl.fn_success = (ppq_callback_success)fn_success;
	ctrl.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_req_noise_his);

void
ieee80211_send_rm_rep_noise_his(struct ieee80211_node *ni,
		u_int8_t report_mode,
		u_int8_t token,
		u_int8_t meas_token,
		u_int8_t op_class,
		u_int8_t channel,
		u_int16_t duration_tu,
		u_int8_t antenna_id,
		u_int8_t anpi,
		u_int8_t *ipi)
{
	struct ieee80211_meas_report_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_NOISE;
	ctrl.report_mode = report_mode;
	ctrl.token = token;
	ctrl.meas_token = meas_token;
	ctrl.autonomous = 0;
	if (report_mode == 0) {
		ctrl.u.noise_his.op_class = op_class;
		ctrl.u.noise_his.channel = channel;
		ctrl.u.noise_his.duration_tu = duration_tu;
		ctrl.u.noise_his.antenna_id = antenna_id;
		ctrl.u.noise_his.anpi = anpi;
		if (ipi != NULL)
			memcpy(ctrl.u.noise_his.ipi, ipi, sizeof(ctrl.u.noise_his.ipi));
	}

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_rep_noise_his);

void
ieee80211_send_rm_req_beacon(struct ieee80211_node *ni,
				u_int8_t op_class,
				u_int8_t channel,
				u_int16_t duration_ms,
				u_int8_t mode,
				u_int8_t *bssid,
				u_int8_t *ssid,
				u_int8_t ssid_len,
				unsigned long expire,
				void *fn_success,
				void *fn_fail)
{
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_BEACON;
	ctrl.u.beacon.op_class = op_class;
	/* ctrl.u.beacon.channel = (channel == 0 ? ni->ni_ic->ic_curchan->ic_ieee : channel); */
	ctrl.u.beacon.channel = channel;
	ctrl.u.beacon.duration_ms = duration_ms;
	ctrl.u.beacon.mode = mode;
	ctrl.u.beacon.ssid = ssid;
	ctrl.u.beacon.ssid_len = ssid_len;

	if (bssid != NULL)
		memcpy(ctrl.u.beacon.bssid, bssid, IEEE80211_ADDR_LEN);
	else
		memset(ctrl.u.beacon.bssid, 0xFF, IEEE80211_ADDR_LEN);

	ctrl.expire = expire;
	ctrl.fn_success = (ppq_callback_success)fn_success;
	ctrl.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_req_beacon);

void
ieee80211_send_rm_rep_beacon(struct ieee80211_node *ni,
		u_int8_t report_mode,
		u_int8_t token,
		u_int8_t meas_token,
		u_int8_t op_class,
		u_int8_t channel,
		u_int16_t duration_tu,
		u_int8_t reported_frame_info,
		u_int8_t rcpi,
		u_int8_t rsni,
		u_int8_t *bssid,
		u_int8_t antenna_id,
		u_int8_t *parent_tsf)
{
	struct ieee80211_meas_report_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_BEACON;
	ctrl.report_mode = report_mode;
	ctrl.token = token;
	ctrl.meas_token = meas_token;
	ctrl.autonomous = 0;
	if (report_mode == 0) {
		ctrl.u.beacon.op_class = op_class;
		ctrl.u.beacon.channel = channel;
		ctrl.u.beacon.duration_tu = duration_tu;
		ctrl.u.beacon.reported_frame_info = reported_frame_info;
		ctrl.u.beacon.rcpi = rcpi;
		ctrl.u.beacon.rsni = rsni;
		if (bssid != NULL)
			memcpy(ctrl.u.beacon.bssid, bssid, IEEE80211_ADDR_LEN);
		ctrl.u.beacon.antenna_id = antenna_id;
		if (parent_tsf != NULL)
			memcpy(ctrl.u.beacon.parent_tsf, parent_tsf, sizeof(ctrl.u.beacon.parent_tsf));
	}

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_rep_beacon);

void
ieee80211_send_rm_req_frame(struct ieee80211_node *ni,
				u_int8_t op_class,
				u_int8_t channel,
				u_int16_t duration_ms,
				u_int8_t type,
				u_int8_t *mac_address,
				unsigned long expire,
				void *fn_success,
				void *fn_fail)
{
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_FRAME;
	ctrl.u.frame.op_class = op_class;
	ctrl.u.frame.channel = (channel == 0 ? ni->ni_ic->ic_curchan->ic_ieee : channel);
	ctrl.u.frame.duration_ms = duration_ms;
	ctrl.u.frame.type = type;
	if (mac_address != NULL)
		memcpy(ctrl.u.frame.mac_address, mac_address, IEEE80211_ADDR_LEN);
	else
		memset(ctrl.u.frame.mac_address, 0xFF, IEEE80211_ADDR_LEN);

	ctrl.expire = expire;
	ctrl.fn_success = (ppq_callback_success)fn_success;
	ctrl.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_req_frame);

void
ieee80211_send_rm_rep_frame(struct ieee80211_node *ni,
		u_int8_t report_mode,
		u_int8_t token,
		u_int8_t meas_token,
		u_int8_t op_class,
		u_int8_t channel,
		u_int16_t duration_tu,
		void *sub_ele)
{
	struct ieee80211_meas_report_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_FRAME;
	ctrl.report_mode = report_mode;
	ctrl.token = token;
	ctrl.meas_token = meas_token;
	ctrl.autonomous = 0;
	if (report_mode == 0) {
		ctrl.u.frame.op_class = op_class;
		ctrl.u.frame.channel = channel;
		ctrl.u.frame.duration_tu = duration_tu;
		ctrl.u.frame.sub_item = sub_ele;
	}

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_rep_frame);

void
ieee80211_send_rm_req_tran_stream_cat(struct ieee80211_node *ni,
				u_int16_t duration_ms,
				u_int8_t *peer_sta,
				u_int8_t tid,
				u_int8_t bin0,
				unsigned long expire,
				void *fn_success,
				void *fn_fail)
{
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;
	u_int8_t null_mac[IEEE80211_ADDR_LEN] = {0};

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_CATEGORY;
	ctrl.u.tran_stream_cat.duration_ms = duration_ms;
	if (peer_sta != NULL && memcmp(null_mac, ctrl.u.tran_stream_cat.peer_sta, IEEE80211_ADDR_LEN) != 0)
		memcpy(ctrl.u.tran_stream_cat.peer_sta, peer_sta, IEEE80211_ADDR_LEN);
	else
		memcpy(ctrl.u.tran_stream_cat.peer_sta, ni->ni_macaddr, IEEE80211_ADDR_LEN);
	ctrl.u.tran_stream_cat.tid = tid;
	ctrl.u.tran_stream_cat.bin0 = bin0;

	ctrl.expire = expire;
	ctrl.fn_success = (ppq_callback_success)fn_success;
	ctrl.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_req_tran_stream_cat);

void
ieee80211_send_rm_req_multicast_diag(struct ieee80211_node *ni,
				u_int16_t duration_ms,
				u_int8_t *group_mac,
				unsigned long expire,
				void *fn_success,
				void *fn_fail)
{
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_MUL_DIAG;
	ctrl.u.multicast_diag.duration_ms = duration_ms;
	if (group_mac != NULL)
		memcpy(ctrl.u.multicast_diag.group_mac, group_mac, IEEE80211_ADDR_LEN);
	else
		memset(ctrl.u.multicast_diag.group_mac, 0, IEEE80211_ADDR_LEN);

	ctrl.expire = expire;
	ctrl.fn_success = (ppq_callback_success)fn_success;
	ctrl.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_req_multicast_diag);

void
ieee80211_send_rm_rep_multicast_diag(struct ieee80211_node *ni,
		u_int8_t report_mode,
		u_int8_t token,
		u_int8_t meas_token,
		u_int16_t duration_tu,
		u_int8_t *group_mac,
		u_int8_t reason,
		u_int32_t mul_rec_msdu_cnt,
		u_int16_t first_seq_num,
		u_int16_t last_seq_num,
		u_int16_t mul_rate)
{
	struct ieee80211_meas_report_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_RM_MEASTYPE_MUL_DIAG;
	ctrl.report_mode = report_mode;
	ctrl.token = token;
	ctrl.meas_token = meas_token;
	ctrl.autonomous = 0;
	if (report_mode == 0) {
		ctrl.u.multicast_diag.duration_tu = duration_tu;
		if (group_mac != NULL)
			memcpy(ctrl.u.multicast_diag.group_mac, group_mac, IEEE80211_ADDR_LEN);
		else
			memset(ctrl.u.multicast_diag.group_mac, 0, IEEE80211_ADDR_LEN);
		ctrl.u.multicast_diag.reason = reason;
		ctrl.u.multicast_diag.mul_rec_msdu_cnt = mul_rec_msdu_cnt;
		ctrl.u.multicast_diag.first_seq_num = first_seq_num;
		ctrl.u.multicast_diag.last_seq_num = last_seq_num;
		ctrl.u.multicast_diag.mul_rate = mul_rate;
	}

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &ctrl;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_rm_rep_multicast_diag);

int32_t ieee80211_send_meas_request_basic(struct ieee80211_node *ni,
		u_int8_t channel,
		u_int16_t tsf_offset,
		u_int16_t duration,
		unsigned long expire,
		void *fn_success,
		void *fn_fail)
{
	struct ieee80211com *ic = ni->ni_vap->iv_ic;
	u_int64_t tsf;
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;

	ctrl.meas_type = IEEE80211_CCA_MEASTYPE_BASIC;
	if (channel == 0)
		ctrl.u.basic.channel = ic->ic_curchan->ic_ieee;
	else
		ctrl.u.basic.channel = channel;
	ic->ic_get_tsf(&tsf);
	if (tsf_offset == 0)
		ctrl.u.basic.start_tsf = 0;
	else
		ctrl.u.basic.start_tsf = tsf + tsf_offset * 1000;
	ctrl.u.basic.duration_ms = duration;
	ctrl.expire = expire;
	ctrl.fn_success = (ppq_callback_success)fn_success;
	ctrl.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_SPEC_MGMT;
	action_data.action = IEEE80211_ACTION_S_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	return IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_meas_request_basic);

int32_t ieee80211_send_meas_request_cca(struct ieee80211_node *ni,
		u_int8_t channel,
		u_int16_t tsf_offset,
		u_int16_t duration,
		unsigned long expire,
		void *fn_success,
		void *fn_fail)
{
	struct ieee80211com *ic = ni->ni_vap->iv_ic;
	u_int64_t tsf;
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;

	ctrl.meas_type = IEEE80211_CCA_MEASTYPE_CCA;
	if (channel == 0)
		ctrl.u.cca.channel = ic->ic_curchan->ic_ieee;
	else
		ctrl.u.cca.channel = channel;
	ic->ic_get_tsf(&tsf);
	if (tsf_offset == 0)
		ctrl.u.cca.start_tsf = 0;
	else
		ctrl.u.cca.start_tsf = tsf + tsf_offset * 1000;
	ctrl.u.cca.duration_ms = duration;
	ctrl.expire = expire;
	ctrl.fn_success = (ppq_callback_success)fn_success;
	ctrl.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_SPEC_MGMT;
	action_data.action = IEEE80211_ACTION_S_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	return IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_meas_request_cca);

int32_t ieee80211_send_meas_request_rpi(struct ieee80211_node *ni,
		u_int8_t channel,
		u_int16_t tsf_offset,
		u_int16_t duration,
		unsigned long expire,
		void *fn_success,
		void *fn_fail)
{
	struct ieee80211com *ic = ni->ni_vap->iv_ic;
	u_int64_t tsf;
	struct ieee80211_meas_request_ctrl ctrl;
	struct ieee80211_action_data action_data;

	ctrl.meas_type = IEEE80211_CCA_MEASTYPE_RPI;
	if (channel == 0)
		ctrl.u.rpi.channel = ic->ic_curchan->ic_ieee;
	else
		ctrl.u.rpi.channel = channel;
	ic->ic_get_tsf(&tsf);
	if (tsf_offset == 0)
		ctrl.u.rpi.start_tsf = 0;
	else
		ctrl.u.rpi.start_tsf = tsf + tsf_offset * 1000;
	ctrl.u.rpi.duration_ms = duration;
	ctrl.expire = expire;
	ctrl.fn_success = (ppq_callback_success)fn_success;
	ctrl.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_SPEC_MGMT;
	action_data.action = IEEE80211_ACTION_S_MEASUREMENT_REQUEST;
	action_data.params = &ctrl;

	return IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_meas_request_rpi);

int32_t ieee80211_send_meas_report_basic(struct ieee80211_node *ni,
		u_int8_t report_mode,
		u_int8_t token,
		u_int8_t meas_token,
		u_int8_t channel,
		u_int64_t start_tsf,
		u_int16_t duration,
		u_int8_t basic_report)
{
	struct ieee80211_meas_report_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_CCA_MEASTYPE_BASIC;
	ctrl.report_mode = report_mode;
	ctrl.token = token;
	ctrl.meas_token = meas_token;
	ctrl.autonomous = 0;
	if (report_mode == 0) {
		ctrl.u.basic.channel = channel;
		ctrl.u.basic.start_tsf = start_tsf;
		ctrl.u.basic.duration_tu = duration;
		ctrl.u.basic.basic_report = basic_report;
	}

	action_data.cat = IEEE80211_ACTION_CAT_SPEC_MGMT;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &ctrl;

	return IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_meas_report_basic);

int32_t ieee80211_send_meas_report_cca(struct ieee80211_node *ni,
		u_int8_t report_mode,
		u_int8_t token,
		u_int8_t meas_token,
		u_int8_t channel,
		u_int64_t start_tsf,
		u_int16_t duration,
		u_int8_t cca_report)
{
	struct ieee80211_meas_report_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_CCA_MEASTYPE_CCA;
	ctrl.report_mode = report_mode;
	ctrl.token = token;
	ctrl.meas_token = meas_token;
	ctrl.autonomous = 0;
	if (report_mode == 0) {
		ctrl.u.cca.channel = channel;
		ctrl.u.cca.start_tsf = start_tsf;
		ctrl.u.cca.duration_tu = duration;
		ctrl.u.cca.cca_report = cca_report;
	}

	action_data.cat = IEEE80211_ACTION_CAT_SPEC_MGMT;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &ctrl;

	return IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_meas_report_cca);

int32_t ieee80211_send_meas_report_rpi(struct ieee80211_node *ni,
		u_int8_t report_mode,
		u_int8_t token,
		u_int8_t meas_token,
		u_int8_t channel,
		u_int64_t start_tsf,
		u_int16_t duration,
		u_int8_t *rpi_report)
{
	struct ieee80211_meas_report_ctrl ctrl;
	struct ieee80211_action_data action_data;

	memset(&ctrl, 0, sizeof(ctrl));
	ctrl.meas_type = IEEE80211_CCA_MEASTYPE_RPI;
	ctrl.report_mode = report_mode;
	ctrl.token = token;
	ctrl.meas_token = meas_token;
	ctrl.autonomous = 0;
	if (report_mode == 0) {
		ctrl.u.rpi.channel = channel;
		ctrl.u.rpi.start_tsf = start_tsf;
		ctrl.u.rpi.duration_tu = duration;
		memcpy(ctrl.u.rpi.rpi_report, rpi_report, sizeof(ctrl.u.rpi.rpi_report));
	}

	action_data.cat = IEEE80211_ACTION_CAT_SPEC_MGMT;
	action_data.action = IEEE80211_ACTION_R_MEASUREMENT_REPORT;
	action_data.params = &ctrl;

	return IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_meas_report_rpi);

void ieee80211_send_link_measure_request(struct ieee80211_node *ni,
				unsigned long expire,
				void *fn_success,
				void *fn_fail)
{
	struct ieee80211_link_measure_request request;
	struct ieee80211_action_data action_data;

	memset(&request, 0, sizeof(request));
	request.ppq.expire = expire;
	request.ppq.fn_success = (ppq_callback_success)fn_success;
	request.ppq.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_LINKMEASURE_REQUEST;
	action_data.params = &request;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_link_measure_request);

void ieee80211_send_neighbor_report_request(struct ieee80211_node *ni,
				unsigned long expire,
				void *fn_success,
				void *fn_fail)
{
	struct ieee80211_neighbor_report_request request;
	struct ieee80211_action_data action_data;

	memset(&request, 0, sizeof(request));
	request.ppq.expire = expire;
	request.ppq.fn_success = (ppq_callback_success)fn_success;
	request.ppq.fn_fail = (ppq_callback_fail)fn_fail;

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_NEIGHBOR_REQUEST;
	action_data.params = &request;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}
EXPORT_SYMBOL(ieee80211_send_neighbor_report_request);

void ieee80211_send_neighbor_report_response(struct ieee80211_node *ni,
					u_int8_t token,
					u_int8_t bss_num,
					void *table)
{
	struct ieee80211_neighbor_report_response response;
	struct ieee80211_action_data action_data;
	struct ieee80211_neighbor_report_request_item** bss_table;
	u_int8_t i;

	memset(&response, 0, sizeof(response));
	response.token = token;
	response.bss_num = bss_num;
	bss_table = (struct ieee80211_neighbor_report_request_item**)table;
	for (i = 0; i < bss_num; i++) {
		response.neighbor_report_ptr[i] = bss_table[i];
	}

	action_data.cat = IEEE80211_ACTION_CAT_RM;
	action_data.action = IEEE80211_ACTION_R_NEIGHBOR_REPORT;
	action_data.params = &response;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
}

void
ieee80211_send_vht_opmode_action(struct ieee80211vap *vap,
					struct ieee80211_node *ni,
					uint8_t bw, uint8_t rx_nss)
{
	struct sk_buff *skb;
	int frm_len;
	u_int8_t *frm;

	frm_len = IEEE80211_NCW_ACT_LEN;

	skb = ieee80211_getmgtframe(&frm, frm_len);
	if (skb == NULL) {
		IEEE80211_NOTE(vap, IEEE80211_MSG_ANY, ni,
			"%s: cannot get buf; size %u", __func__, frm_len);
		vap->iv_stats.is_tx_nobuf++;
		return;
	}

	*frm++ = IEEE80211_ACTION_CAT_VHT;
	*frm++ = IEEE80211_ACTION_VHT_OPMODE_NOTIFICATION;
	*frm++ = bw | (rx_nss << 4);

	ieee80211_ref_node(ni);
	ieee80211_mgmt_output(ni, skb, IEEE80211_FC0_SUBTYPE_ACTION,
					ni->ni_macaddr);
}

/* sending Notify Channel Width Action
 * if the ni is NULL, then it sends it as broadcast
 * otherwise, unicast it to the targeted node
 *     width == 0:  use HT20
 *     width != 0   use any channel width the node support
 *
 * Notify Channel Width Action frame fromat:
 *     |category: 1byte, value(7): CAT_HT | action: 1byte, value(0): NCW | Channel_width: 1byte, value: 0/HT20, or 1/HT40 |
 */
void
ieee80211_send_notify_chan_width_action(struct ieee80211vap *vap,
					struct ieee80211_node *ni,
					u_int32_t width)
{
	// struct ieee80211com *ic = vap->iv_ic;
	struct sk_buff *skb;
	int frm_len;
	u_int8_t *frm;
	int is_bcst = (ni == NULL) ? 1 : 0;

	frm_len = IEEE80211_NCW_ACT_LEN;

	IEEE80211_DPRINTF(vap, IEEE80211_MSG_11N,
			  "%s: Sending Notify Chan Width %s action to %s\n",
			  __func__,
			  (width) ? "HT40/20" : "HT20",
			  (is_bcst) ? "bcast" : ether_sprintf(ni->ni_macaddr));

	skb = ieee80211_getmgtframe(&frm, frm_len);
	if (skb == NULL) {
		IEEE80211_NOTE(vap, IEEE80211_MSG_ANY, ni,
			"%s: cannot get buf; size %u", __func__, frm_len);
		vap->iv_stats.is_tx_nobuf++;
		return;
	}

	*frm++ = IEEE80211_ACTION_CAT_HT;            /* Category */
	*frm++ = IEEE80211_ACTION_HT_TXCHWIDTH;      /* notify channel width action */
	if (width) {
		*frm++ = IEEE80211_CWM_WIDTH40;
	} else {
		*frm++ = IEEE80211_CWM_WIDTH20;
	}

	if (is_bcst) {
		ieee80211_ref_node(vap->iv_bss);
		ieee80211_mgmt_output(vap->iv_bss, skb, IEEE80211_FC0_SUBTYPE_ACTION,
					vap->iv_dev->broadcast);
	} else {
		ieee80211_ref_node(ni);
		ieee80211_mgmt_output(ni, skb, IEEE80211_FC0_SUBTYPE_ACTION,
					ni->ni_macaddr);
	}
}
EXPORT_SYMBOL(ieee80211_send_notify_chan_width_action);

/* sending 11ac(VHT) Group ID mgmt Action
 * node group membership and the positions are stored inside the node struct
 * VHT group ID mgmt action frame format:
 * |category: 1byte, value(21): CAT_VHT | action: 1byte, value(1): GRP ID MGMT | membership status array: 8 bytes | user position array: 16 bytes|
 */
void
ieee80211_send_vht_grp_id_mgmt_action(struct ieee80211vap *vap,
				      struct ieee80211_node *ni)
{
	struct sk_buff *skb;
	int frm_len;
	u_int8_t *frm;

	frm_len = IEEE80211_MU_GRP_ID_ACT_LEN;
	IEEE80211_DPRINTF(vap, IEEE80211_MSG_VHT,
			  "%s: Sending MU GRP ID action to %s\n",
			  __func__, ether_sprintf(ni->ni_macaddr));

	skb = ieee80211_getmgtframe(&frm, frm_len);
	if (skb == NULL) {
		IEEE80211_NOTE(vap, IEEE80211_MSG_ANY, ni,
			"%s: cannot get buf; size %u", __func__, frm_len);
		vap->iv_stats.is_tx_nobuf++;
		return;
	}

	/* Category VHT */
	*frm++ = IEEE80211_ACTION_CAT_VHT;

	/* MU GRP ID action */
	*frm++ = IEEE80211_ACTION_VHT_MU_GRP_ID;

	memcpy(frm, &ni->ni_mu_grp, sizeof(ni->ni_mu_grp));
	frm += sizeof(ni->ni_mu_grp);

	ieee80211_ref_node(ni);
	ieee80211_mgmt_output(ni, skb, IEEE80211_FC0_SUBTYPE_ACTION,
			      ni->ni_macaddr);

}

EXPORT_SYMBOL(ieee80211_send_vht_grp_id_mgmt_action);

int
ieee80211_send_20_40_bss_coex(struct ieee80211vap *vap)
{

	struct ieee80211_action_data action_data;
	struct ieee80211_node *ni = vap->iv_bss;
	uint8_t coex = vap->iv_coex;

	if ((!ni) || (!IEEE80211_AID(ni->ni_associd)))
		return -EFAULT;

	action_data.cat = IEEE80211_ACTION_CAT_PUBLIC;
	action_data.action = IEEE80211_ACTION_PUB_20_40_COEX;
	action_data.params = &coex;

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
	return 0;
}

void ieee80211_send_sa_query (struct ieee80211_node *ni, u_int8_t action,
					u_int16_t tid)
{
	struct ieee80211_action_data action_data;

	if(RSN_IS_MFP(ni->ni_rsn.rsn_caps)) {
		action_data.cat = IEEE80211_ACTION_CAT_SA_QUERY;
		action_data.action = action;
		action_data.params = &tid;
		IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
		ni->ni_sa_query_timeout = jiffies;
	}
}

void ieee80211_btm_resp_timeout(unsigned long arg)
{
	struct ieee80211_node *ni = (struct ieee80211_node *)arg;
	IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_ACTION, \
			"BSS Transition management response timeout token(%d)\n", ni->ni_btm_req);
	ni->ni_btm_req = 0;
}

static int
ieee80211_send_wnm_bss_tm_req(struct ieee80211_node *ni,
			uint8_t mode,
			uint16_t disassoc_timer,
			uint8_t valid_int,
			const uint8_t *bss_term_dur,
			const char *url,
			const uint8_t *nei_rep,
			size_t nei_rep_len,
			uint8_t tx_token)
{
	struct btm_request_params req;
	struct ieee80211_action_data action_data;
	int url_len = 0;

	if (url) {
		/* Session Information URL */
		url_len = strlen(url);
		if (url_len > 255) {
			return -1;
		}
	}
	IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_ACTION,
			"WNM: Send BSS Transition Management Request to %s"
			" req_mode=0x%x disassoc_timer=%u valid_int=0x%u\n",
			ether_sprintf(ni->ni_macaddr), mode, disassoc_timer, valid_int);

	memset(&req, 0, sizeof(req));

	req.dialog_token = tx_token;
	req.request_mode = mode;
	req.disassoc_timer = disassoc_timer;
	req.validity_interval = valid_int;
	req.bss_term_dur = (uint8_t *)bss_term_dur;
	req.url = (char *)url;
	req.neigh_reports = (uint8_t *)nei_rep;
	req.neigh_reports_length = nei_rep_len;

	action_data.cat = IEEE80211_ACTION_CAT_WNM;
	action_data.action = IEEE80211_WNM_BSS_TRANS_MGMT_REQ;
	action_data.params = &req;

	if (ni->ni_btm_req != 0) {
		del_timer(&ni->ni_btm_resp_wait_timer);
		ni->ni_btm_req = 0;
	}
	ni->ni_btm_req = tx_token;
	ni->ni_btm_resp_wait_timer.function = ieee80211_btm_resp_timeout;
	ni->ni_btm_resp_wait_timer.data = (unsigned long)ni;
	mod_timer(&ni->ni_btm_resp_wait_timer, jiffies + ((disassoc_timer + 1) * ni->ni_intval));

	IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_ACTION, (int)&action_data);
	return 0;
}

int
ieee80211_send_wnm_bss_tm_solicited_req(struct ieee80211_node *ni,
					uint8_t mode,
					uint16_t disassoc_timer,
					uint8_t valid_int,
					const uint8_t *bss_term_dur,
					const char *url,
					const uint8_t *nei_rep,
					size_t nei_rep_len,
					uint8_t tx_token)
{
	return ieee80211_send_wnm_bss_tm_req(ni, mode, disassoc_timer, valid_int,
					bss_term_dur, url, nei_rep, nei_rep_len, tx_token);
}

int
ieee80211_send_wnm_bss_tm_unsolicited_req(struct ieee80211_node *ni,
					uint8_t mode,
					uint16_t disassoc_timer,
					uint8_t valid_int,
					const uint8_t *bss_term_dur,
					const char *url,
					const uint8_t *nei_rep,
					size_t nei_rep_len,
					uint8_t tx_token)
{
	if (!ni)
		return -1;

	if (valid_int == 0)
		disassoc_timer = WNM_BTM_DEFAULT_VAL_INTVAL;

	return ieee80211_send_wnm_bss_tm_req(ni, mode, disassoc_timer, valid_int,
					bss_term_dur, url, nei_rep, nei_rep_len, tx_token);
}
