svn commit: r330688 - in head/sys: dev/bwn dev/ral dev/usb/wlan net80211

Andriy Voskoboinyk avos at FreeBSD.org
Fri Mar 9 11:33:58 UTC 2018


Author: avos
Date: Fri Mar  9 11:33:56 2018
New Revision: 330688
URL: https://svnweb.freebsd.org/changeset/base/330688

Log:
  net80211: wrap protection frame allocation into ieee80211_alloc_prot()
  
  Move copy-pasted code for RTS/CTS frame allocation into net80211.
  While here, add stat / debug message for allocation failures
  (copied from run(4)) + return error here in bwn(4).
  
  Reviewed by:	adrian
  Differential Revision:	https://reviews.freebsd.org/D14628

Modified:
  head/sys/dev/bwn/if_bwn.c
  head/sys/dev/ral/rt2560.c
  head/sys/dev/ral/rt2661.c
  head/sys/dev/usb/wlan/if_rum.c
  head/sys/dev/usb/wlan/if_run.c
  head/sys/dev/usb/wlan/if_ural.c
  head/sys/net80211/ieee80211_output.c
  head/sys/net80211/ieee80211_proto.h

Modified: head/sys/dev/bwn/if_bwn.c
==============================================================================
--- head/sys/dev/bwn/if_bwn.c	Fri Mar  9 10:34:44 2018	(r330687)
+++ head/sys/dev/bwn/if_bwn.c	Fri Mar  9 11:33:56 2018	(r330688)
@@ -6401,15 +6401,14 @@ bwn_set_txhdr(struct bwn_mac *mac, struct ieee80211_no
 	struct bwn_softc *sc = mac->mac_sc;
 	struct ieee80211_frame *wh;
 	struct ieee80211_frame *protwh;
-	struct ieee80211_frame_cts *cts;
-	struct ieee80211_frame_rts *rts;
 	const struct ieee80211_txparam *tp = ni->ni_txparms;
 	struct ieee80211vap *vap = ni->ni_vap;
 	struct ieee80211com *ic = &sc->sc_ic;
 	struct mbuf *mprot;
+	uint8_t *prot_ptr;
 	unsigned int len;
 	uint32_t macctl = 0;
-	int protdur, rts_rate, rts_rate_fb, ismcast, isshort, rix, type;
+	int rts_rate, rts_rate_fb, ismcast, isshort, rix, type;
 	uint16_t phyctl = 0;
 	uint8_t rate, rate_fb;
 	int fill_phy_ctl1 = 0;
@@ -6528,7 +6527,8 @@ bwn_set_txhdr(struct bwn_mac *mac, struct ieee80211_no
 	    m->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold)
 		macctl |= BWN_TX_MAC_LONGFRAME;
 
-	if (ic->ic_flags & IEEE80211_F_USEPROT) {
+	if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
+	    ic->ic_protmode != IEEE80211_PROT_NONE) {
 		/* Note: don't fall back to CCK rates for 5G */
 		if (phy->gmode)
 			rts_rate = BWN_CCK_RATE_1MB;
@@ -6537,60 +6537,34 @@ bwn_set_txhdr(struct bwn_mac *mac, struct ieee80211_no
 		rts_rate_fb = bwn_get_fbrate(rts_rate);
 
 		/* XXX 'rate' here is hardware rate now, not the net80211 rate */
-		protdur = ieee80211_compute_duration(ic->ic_rt,
-		    m->m_pkthdr.len, rate, isshort) +
-		    + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
+		mprot = ieee80211_alloc_prot(ni, m, rate, ic->ic_protmode);
+		if (mprot == NULL) {
+			if_inc_counter(vap->iv_ifp, IFCOUNTER_OERRORS, 1);
+			device_printf(sc->sc_dev,
+			    "could not allocate mbuf for protection mode %d\n",
+			    ic->ic_protmode);
+			return (ENOBUFS);
+		}
 
-		if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) {
+		switch (mac->mac_fw.fw_hdr_format) {
+		case BWN_FW_HDR_351:
+			prot_ptr = txhdr->body.r351.rts_frame;
+			break;
+		case BWN_FW_HDR_410:
+			prot_ptr = txhdr->body.r410.rts_frame;
+			break;
+		case BWN_FW_HDR_598:
+			prot_ptr = txhdr->body.r598.rts_frame;
+			break;
+		}
 
-			switch (mac->mac_fw.fw_hdr_format) {
-			case BWN_FW_HDR_351:
-				cts = (struct ieee80211_frame_cts *)
-				    txhdr->body.r351.rts_frame;
-				break;
-			case BWN_FW_HDR_410:
-				cts = (struct ieee80211_frame_cts *)
-				    txhdr->body.r410.rts_frame;
-				break;
-			case BWN_FW_HDR_598:
-				cts = (struct ieee80211_frame_cts *)
-				    txhdr->body.r598.rts_frame;
-				break;
-			}
+		bcopy(mtod(mprot, uint8_t *), prot_ptr, mprot->m_pkthdr.len);
+		m_freem(mprot);
 
-			mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr,
-			    protdur);
-			KASSERT(mprot != NULL, ("failed to alloc mbuf\n"));
-			bcopy(mtod(mprot, uint8_t *), (uint8_t *)cts,
-			    mprot->m_pkthdr.len);
-			m_freem(mprot);
+		if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) {
 			macctl |= BWN_TX_MAC_SEND_CTSTOSELF;
 			len = sizeof(struct ieee80211_frame_cts);
 		} else {
-			switch (mac->mac_fw.fw_hdr_format) {
-			case BWN_FW_HDR_351:
-				rts = (struct ieee80211_frame_rts *)
-				    txhdr->body.r351.rts_frame;
-				break;
-			case BWN_FW_HDR_410:
-				rts = (struct ieee80211_frame_rts *)
-				    txhdr->body.r410.rts_frame;
-				break;
-			case BWN_FW_HDR_598:
-				rts = (struct ieee80211_frame_rts *)
-				    txhdr->body.r598.rts_frame;
-				break;
-			}
-
-			/* XXX rate/rate_fb is the hardware rate */
-			protdur += ieee80211_ack_duration(ic->ic_rt, rate,
-			    isshort);
-			mprot = ieee80211_alloc_rts(ic, wh->i_addr1,
-			    wh->i_addr2, protdur);
-			KASSERT(mprot != NULL, ("failed to alloc mbuf\n"));
-			bcopy(mtod(mprot, uint8_t *), (uint8_t *)rts,
-			    mprot->m_pkthdr.len);
-			m_freem(mprot);
 			macctl |= BWN_TX_MAC_SEND_RTSCTS;
 			len = sizeof(struct ieee80211_frame_rts);
 		}

Modified: head/sys/dev/ral/rt2560.c
==============================================================================
--- head/sys/dev/ral/rt2560.c	Fri Mar  9 10:34:44 2018	(r330687)
+++ head/sys/dev/ral/rt2560.c	Fri Mar  9 11:33:56 2018	(r330688)
@@ -1594,38 +1594,18 @@ rt2560_sendprot(struct rt2560_softc *sc,
     const struct mbuf *m, struct ieee80211_node *ni, int prot, int rate)
 {
 	struct ieee80211com *ic = ni->ni_ic;
-	const struct ieee80211_frame *wh;
 	struct rt2560_tx_desc *desc;
 	struct rt2560_tx_data *data;
 	struct mbuf *mprot;
-	int protrate, ackrate, pktlen, flags, isshort, error;
-	uint16_t dur;
+	int protrate, flags, error;
 	bus_dma_segment_t segs[RT2560_MAX_SCATTER];
 	int nsegs;
 
-	KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
-	    ("protection %d", prot));
-
-	wh = mtod(m, const struct ieee80211_frame *);
-	pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
-
-	protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
-	ackrate = ieee80211_ack_rate(ic->ic_rt, rate);
-
-	isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
-	dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
-	    + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
-	flags = RT2560_TX_MORE_FRAG;
-	if (prot == IEEE80211_PROT_RTSCTS) {
-		/* NB: CTS is the same size as an ACK */
-		dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);
-		flags |= RT2560_TX_ACK;
-		mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
-	} else {
-		mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
-	}
+	mprot = ieee80211_alloc_prot(ni, m, rate, prot);
 	if (mprot == NULL) {
-		/* XXX stat + msg */
+		if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1);
+		device_printf(sc->sc_dev,
+		    "could not allocate mbuf for protection mode %d\n", prot);
 		return ENOBUFS;
 	}
 
@@ -1645,6 +1625,11 @@ rt2560_sendprot(struct rt2560_softc *sc,
 	data->ni = ieee80211_ref_node(ni);
 	/* ctl frames are not taken into account for amrr */
 	data->rix = IEEE80211_FIXED_RATE_NONE;
+
+	protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
+	flags = RT2560_TX_MORE_FRAG;
+	if (prot == IEEE80211_PROT_RTSCTS)
+		flags |= RT2560_TX_ACK;
 
 	rt2560_setup_tx_desc(sc, desc, flags, mprot->m_pkthdr.len, protrate, 1,
 	    segs->ds_addr);

Modified: head/sys/dev/ral/rt2661.c
==============================================================================
--- head/sys/dev/ral/rt2661.c	Fri Mar  9 10:34:44 2018	(r330687)
+++ head/sys/dev/ral/rt2661.c	Fri Mar  9 11:33:56 2018	(r330688)
@@ -1361,38 +1361,18 @@ rt2661_sendprot(struct rt2661_softc *sc, int ac,
 {
 	struct ieee80211com *ic = ni->ni_ic;
 	struct rt2661_tx_ring *txq = &sc->txq[ac];
-	const struct ieee80211_frame *wh;
 	struct rt2661_tx_desc *desc;
 	struct rt2661_tx_data *data;
 	struct mbuf *mprot;
-	int protrate, ackrate, pktlen, flags, isshort, error;
-	uint16_t dur;
+	int protrate, flags, error;
 	bus_dma_segment_t segs[RT2661_MAX_SCATTER];
 	int nsegs;
 
-	KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
-	    ("protection %d", prot));
-
-	wh = mtod(m, const struct ieee80211_frame *);
-	pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
-
-	protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
-	ackrate = ieee80211_ack_rate(ic->ic_rt, rate);
-
-	isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
-	dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
-	    + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
-	flags = RT2661_TX_MORE_FRAG;
-	if (prot == IEEE80211_PROT_RTSCTS) {
-		/* NB: CTS is the same size as an ACK */
-		dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);
-		flags |= RT2661_TX_NEED_ACK;
-		mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
-	} else {
-		mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
-	}
+	mprot = ieee80211_alloc_prot(ni, m, rate, prot);
 	if (mprot == NULL) {
-		/* XXX stat + msg */
+		if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1);
+		device_printf(sc->sc_dev,
+		    "could not allocate mbuf for protection mode %d\n", prot);
 		return ENOBUFS;
 	}
 
@@ -1412,6 +1392,11 @@ rt2661_sendprot(struct rt2661_softc *sc, int ac,
 	data->ni = ieee80211_ref_node(ni);
 	/* ctl frames are not taken into account for amrr */
 	data->rix = IEEE80211_FIXED_RATE_NONE;
+
+	protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
+	flags = RT2661_TX_MORE_FRAG;
+	if (prot == IEEE80211_PROT_RTSCTS)
+		flags |= RT2661_TX_NEED_ACK;
 
 	rt2661_setup_tx_desc(sc, desc, flags, 0, mprot->m_pkthdr.len,
 	    protrate, segs, 1, ac);

Modified: head/sys/dev/usb/wlan/if_rum.c
==============================================================================
--- head/sys/dev/usb/wlan/if_rum.c	Fri Mar  9 10:34:44 2018	(r330687)
+++ head/sys/dev/usb/wlan/if_rum.c	Fri Mar  9 11:33:56 2018	(r330688)
@@ -1419,37 +1419,25 @@ rum_sendprot(struct rum_softc *sc,
     const struct mbuf *m, struct ieee80211_node *ni, int prot, int rate)
 {
 	struct ieee80211com *ic = ni->ni_ic;
-	const struct ieee80211_frame *wh;
 	struct rum_tx_data *data;
 	struct mbuf *mprot;
-	int protrate, pktlen, flags, isshort;
-	uint16_t dur;
+	int protrate, flags;
 
 	RUM_LOCK_ASSERT(sc);
-	KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
-	    ("protection %d", prot));
 
-	wh = mtod(m, const struct ieee80211_frame *);
-	pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
+	mprot = ieee80211_alloc_prot(ni, m, rate, prot);
+	if (mprot == NULL) {
+		if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1);
+		device_printf(sc->sc_dev,
+		    "could not allocate mbuf for protection mode %d\n", prot);
+		return (ENOBUFS);
+	}
 
 	protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
-
-	isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
-	dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
-	    + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
 	flags = 0;
-	if (prot == IEEE80211_PROT_RTSCTS) {
-		/* NB: CTS is the same size as an ACK */
-		dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);
+	if (prot == IEEE80211_PROT_RTSCTS)
 		flags |= RT2573_TX_NEED_ACK;
-		mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
-	} else {
-		mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
-	}
-	if (mprot == NULL) {
-		/* XXX stat + msg */
-		return (ENOBUFS);
-	}
+
 	data = STAILQ_FIRST(&sc->tx_free);
 	STAILQ_REMOVE_HEAD(&sc->tx_free, next);
 	sc->tx_nfree--;

Modified: head/sys/dev/usb/wlan/if_run.c
==============================================================================
--- head/sys/dev/usb/wlan/if_run.c	Fri Mar  9 10:34:44 2018	(r330687)
+++ head/sys/dev/usb/wlan/if_run.c	Fri Mar  9 11:33:56 2018	(r330688)
@@ -3543,56 +3543,34 @@ run_sendprot(struct run_softc *sc,
     const struct mbuf *m, struct ieee80211_node *ni, int prot, int rate)
 {
 	struct ieee80211com *ic = ni->ni_ic;
-	struct ieee80211_frame *wh;
 	struct run_tx_data *data;
 	struct rt2870_txd *txd;
 	struct rt2860_txwi *txwi;
 	struct mbuf *mprot;
 	int ridx;
 	int protrate;
-	int ackrate;
-	int pktlen;
-	int isshort;
-	uint16_t dur;
-	uint8_t type;
 	uint8_t wflags = 0;
 	uint8_t xflags = 0;
 
 	RUN_LOCK_ASSERT(sc, MA_OWNED);
 
-	KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
-	    ("protection %d", prot));
-
-	wh = mtod(m, struct ieee80211_frame *);
-	pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
-	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
-
-	protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
-	ackrate = ieee80211_ack_rate(ic->ic_rt, rate);
-
-	isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
-	dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
-	    + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
-	wflags = RT2860_TX_FRAG;
-
 	/* check that there are free slots before allocating the mbuf */
 	if (sc->sc_epq[0].tx_nfree == 0)
 		/* let caller free mbuf */
 		return (ENOBUFS);
 
-	if (prot == IEEE80211_PROT_RTSCTS) {
-		/* NB: CTS is the same size as an ACK */
-		dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);
-		xflags |= RT2860_TX_ACK;
-		mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
-	} else {
-		mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
-	}
+	mprot = ieee80211_alloc_prot(ni, m, rate, prot);
 	if (mprot == NULL) {
 		if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1);
 		RUN_DPRINTF(sc, RUN_DEBUG_XMIT, "could not allocate mbuf\n");
 		return (ENOBUFS);
 	}
+
+	protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
+	wflags = RT2860_TX_FRAG;
+	xflags = 0;
+	if (prot == IEEE80211_PROT_RTSCTS)
+		xflags |= RT2860_TX_ACK;
 
         data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh);
         STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next);

Modified: head/sys/dev/usb/wlan/if_ural.c
==============================================================================
--- head/sys/dev/usb/wlan/if_ural.c	Fri Mar  9 10:34:44 2018	(r330687)
+++ head/sys/dev/usb/wlan/if_ural.c	Fri Mar  9 11:33:56 2018	(r330688)
@@ -1130,37 +1130,23 @@ ural_sendprot(struct ural_softc *sc,
     const struct mbuf *m, struct ieee80211_node *ni, int prot, int rate)
 {
 	struct ieee80211com *ic = ni->ni_ic;
-	const struct ieee80211_frame *wh;
 	struct ural_tx_data *data;
 	struct mbuf *mprot;
-	int protrate, ackrate, pktlen, flags, isshort;
-	uint16_t dur;
+	int protrate, flags;
 
-	KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
-	    ("protection %d", prot));
+	mprot = ieee80211_alloc_prot(ni, m, rate, prot);
+	if (mprot == NULL) {
+		if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1);
+		device_printf(sc->sc_dev,
+		    "could not allocate mbuf for protection mode %d\n", prot);
+		return ENOBUFS;
+	}
 
-	wh = mtod(m, const struct ieee80211_frame *);
-	pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
-
 	protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
-	ackrate = ieee80211_ack_rate(ic->ic_rt, rate);
-
-	isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
-	dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
-	    + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
 	flags = RAL_TX_RETRY(7);
-	if (prot == IEEE80211_PROT_RTSCTS) {
-		/* NB: CTS is the same size as an ACK */
-		dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);
+	if (prot == IEEE80211_PROT_RTSCTS)
 		flags |= RAL_TX_ACK;
-		mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
-	} else {
-		mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
-	}
-	if (mprot == NULL) {
-		/* XXX stat + msg */
-		return ENOBUFS;
-	}
+
 	data = STAILQ_FIRST(&sc->tx_free);
 	STAILQ_REMOVE_HEAD(&sc->tx_free, next);
 	sc->tx_nfree--;

Modified: head/sys/net80211/ieee80211_output.c
==============================================================================
--- head/sys/net80211/ieee80211_output.c	Fri Mar  9 10:34:44 2018	(r330687)
+++ head/sys/net80211/ieee80211_output.c	Fri Mar  9 11:33:56 2018	(r330688)
@@ -3088,6 +3088,39 @@ ieee80211_alloc_cts(struct ieee80211com *ic,
 	return m;
 }
 
+/*
+ * Wrapper for CTS/RTS frame allocation.
+ */
+struct mbuf *
+ieee80211_alloc_prot(struct ieee80211_node *ni, const struct mbuf *m,
+    uint8_t rate, int prot)
+{
+	struct ieee80211com *ic = ni->ni_ic;
+	const struct ieee80211_frame *wh;
+	struct mbuf *mprot;
+	uint16_t dur;
+	int pktlen, isshort;
+
+	KASSERT(prot == IEEE80211_PROT_RTSCTS ||
+	    prot == IEEE80211_PROT_CTSONLY,
+	    ("wrong protection type %d", prot));
+
+	wh = mtod(m, const struct ieee80211_frame *);
+	pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
+	isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
+	dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
+	    + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
+
+	if (prot == IEEE80211_PROT_RTSCTS) {
+		/* NB: CTS is the same size as an ACK */
+		dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);
+		mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
+	} else
+		mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
+
+	return (mprot);
+}
+
 static void
 ieee80211_tx_mgt_timeout(void *arg)
 {

Modified: head/sys/net80211/ieee80211_proto.h
==============================================================================
--- head/sys/net80211/ieee80211_proto.h	Fri Mar  9 10:34:44 2018	(r330687)
+++ head/sys/net80211/ieee80211_proto.h	Fri Mar  9 11:33:56 2018	(r330688)
@@ -140,6 +140,8 @@ struct mbuf *ieee80211_alloc_rts(struct ieee80211com *
 		const uint8_t [IEEE80211_ADDR_LEN], uint16_t);
 struct mbuf *ieee80211_alloc_cts(struct ieee80211com *,
 		const uint8_t [IEEE80211_ADDR_LEN], uint16_t);
+struct mbuf *ieee80211_alloc_prot(struct ieee80211_node *,
+		const struct mbuf *, uint8_t, int);
 
 uint8_t *ieee80211_add_rates(uint8_t *, const struct ieee80211_rateset *);
 uint8_t *ieee80211_add_xrates(uint8_t *, const struct ieee80211_rateset *);


More information about the svn-src-all mailing list