svn commit: r343990 - in head/sys: dev/malo dev/mwl dev/usb/wlan net80211

Andriy Voskoboinyk avos at FreeBSD.org
Sun Feb 10 23:58:59 UTC 2019


Author: avos
Date: Sun Feb 10 23:58:56 2019
New Revision: 343990
URL: https://svnweb.freebsd.org/changeset/base/343990

Log:
  net80211(4): hide casts for 'i_seq' field offset calculation inside
  ieee80211_getqos() and reuse it in various places.
  
  Checked with RTL8188EE, HOSTAP mode + RTL8188CUS, STA mode.
  
  MFC after:	2 weeks

Modified:
  head/sys/dev/malo/if_malo.c
  head/sys/dev/mwl/if_mwl.c
  head/sys/dev/usb/wlan/if_run.c
  head/sys/net80211/ieee80211_adhoc.c
  head/sys/net80211/ieee80211_hostap.c
  head/sys/net80211/ieee80211_ht.c
  head/sys/net80211/ieee80211_mesh.c
  head/sys/net80211/ieee80211_output.c
  head/sys/net80211/ieee80211_proto.h
  head/sys/net80211/ieee80211_sta.c
  head/sys/net80211/ieee80211_wds.c

Modified: head/sys/dev/malo/if_malo.c
==============================================================================
--- head/sys/dev/malo/if_malo.c	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/dev/malo/if_malo.c	Sun Feb 10 23:58:56 2019	(r343990)
@@ -1051,13 +1051,9 @@ malo_tx_start(struct malo_softc *sc, struct ieee80211_
 	copyhdrlen = hdrlen = ieee80211_anyhdrsize(wh);
 	pktlen = m0->m_pkthdr.len;
 	if (IEEE80211_QOS_HAS_SEQ(wh)) {
-		if (IEEE80211_IS_DSTODS(wh)) {
-			qos = *(uint16_t *)
-			    (((struct ieee80211_qosframe_addr4 *) wh)->i_qos);
+		qos = *(uint16_t *)ieee80211_getqos(wh);
+		if (IEEE80211_IS_DSTODS(wh))
 			copyhdrlen -= sizeof(qos);
-		} else
-			qos = *(uint16_t *)
-			    (((struct ieee80211_qosframe *) wh)->i_qos);
 	} else
 		qos = 0;
 
@@ -1952,7 +1948,6 @@ malo_rx_proc(void *arg, int npending)
 	struct malo_rxdesc *ds;
 	struct mbuf *m, *mnew;
 	struct ieee80211_qosframe *wh;
-	struct ieee80211_qosframe_addr4 *wh4;
 	struct ieee80211_node *ni;
 	int off, len, hdrlen, pktlen, rssi, ntodo;
 	uint8_t *data, status;
@@ -2062,15 +2057,8 @@ malo_rx_proc(void *arg, int npending)
 		/* NB: don't need to do this sometimes but ... */
 		/* XXX special case so we can memcpy after m_devget? */
 		ovbcopy(data + sizeof(uint16_t), wh, hdrlen);
-		if (IEEE80211_QOS_HAS_SEQ(wh)) {
-			if (IEEE80211_IS_DSTODS(wh)) {
-				wh4 = mtod(m,
-				    struct ieee80211_qosframe_addr4*);
-				*(uint16_t *)wh4->i_qos = ds->qosctrl;
-			} else {
-				*(uint16_t *)wh->i_qos = ds->qosctrl;
-			}
-		}
+		if (IEEE80211_QOS_HAS_SEQ(wh))
+			*(uint16_t *)ieee80211_getqos(wh) = ds->qosctrl;
 		if (ieee80211_radiotap_active(ic)) {
 			sc->malo_rx_th.wr_flags = 0;
 			sc->malo_rx_th.wr_rate = ds->rate;

Modified: head/sys/dev/mwl/if_mwl.c
==============================================================================
--- head/sys/dev/mwl/if_mwl.c	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/dev/mwl/if_mwl.c	Sun Feb 10 23:58:56 2019	(r343990)
@@ -2614,7 +2614,6 @@ mwl_rx_proc(void *arg, int npending)
 	struct mwl_rxdesc *ds;
 	struct mbuf *m;
 	struct ieee80211_qosframe *wh;
-	struct ieee80211_qosframe_addr4 *wh4;
 	struct ieee80211_node *ni;
 	struct mwl_node *mn;
 	int off, len, hdrlen, pktlen, rssi, ntodo;
@@ -2761,15 +2760,8 @@ mwl_rx_proc(void *arg, int npending)
 		/* NB: don't need to do this sometimes but ... */
 		/* XXX special case so we can memcpy after m_devget? */
 		ovbcopy(data + sizeof(uint16_t), wh, hdrlen);
-		if (IEEE80211_QOS_HAS_SEQ(wh)) {
-			if (IEEE80211_IS_DSTODS(wh)) {
-				wh4 = mtod(m,
-				    struct ieee80211_qosframe_addr4*);
-				*(uint16_t *)wh4->i_qos = ds->QosCtrl;
-			} else {
-				*(uint16_t *)wh->i_qos = ds->QosCtrl;
-			}
-		}
+		if (IEEE80211_QOS_HAS_SEQ(wh))
+			*(uint16_t *)ieee80211_getqos(wh) = ds->QosCtrl;
 		/*
 		 * The f/w strips WEP header but doesn't clear
 		 * the WEP bit; mark the packet with M_WEP so
@@ -3100,13 +3092,9 @@ mwl_tx_start(struct mwl_softc *sc, struct ieee80211_no
 	copyhdrlen = hdrlen;
 	pktlen = m0->m_pkthdr.len;
 	if (IEEE80211_QOS_HAS_SEQ(wh)) {
-		if (IEEE80211_IS_DSTODS(wh)) {
-			qos = *(uint16_t *)
-			    (((struct ieee80211_qosframe_addr4 *) wh)->i_qos);
+		qos = *(uint16_t *)ieee80211_getqos(wh);
+		if (IEEE80211_IS_DSTODS(wh))
 			copyhdrlen -= sizeof(qos);
-		} else
-			qos = *(uint16_t *)
-			    (((struct ieee80211_qosframe *) wh)->i_qos);
 	} else
 		qos = 0;
 

Modified: head/sys/dev/usb/wlan/if_run.c
==============================================================================
--- head/sys/dev/usb/wlan/if_run.c	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/dev/usb/wlan/if_run.c	Sun Feb 10 23:58:56 2019	(r343990)
@@ -3369,11 +3369,7 @@ run_tx(struct run_softc *sc, struct mbuf *m, struct ie
 	if ((hasqos = IEEE80211_QOS_HAS_SEQ(wh))) {
 		uint8_t *frm;
 
-		if(IEEE80211_HAS_ADDR4(wh))
-			frm = ((struct ieee80211_qosframe_addr4 *)wh)->i_qos;
-		else
-			frm =((struct ieee80211_qosframe *)wh)->i_qos;
-
+		frm = ieee80211_getqos(wh);
 		qos = le16toh(*(const uint16_t *)frm);
 		tid = qos & IEEE80211_QOS_TID;
 		qid = TID_TO_WME_AC(tid);

Modified: head/sys/net80211/ieee80211_adhoc.c
==============================================================================
--- head/sys/net80211/ieee80211_adhoc.c	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/net80211/ieee80211_adhoc.c	Sun Feb 10 23:58:56 2019	(r343990)
@@ -522,11 +522,9 @@ adhoc_input(struct ieee80211_node *ni, struct mbuf *m,
 		/*
 		 * Save QoS bits for use below--before we strip the header.
 		 */
-		if (subtype == IEEE80211_FC0_SUBTYPE_QOS) {
-			qos = (dir == IEEE80211_FC1_DIR_DSTODS) ?
-			    ((struct ieee80211_qosframe_addr4 *)wh)->i_qos[0] :
-			    ((struct ieee80211_qosframe *)wh)->i_qos[0];
-		} else
+		if (subtype == IEEE80211_FC0_SUBTYPE_QOS)
+			qos = ieee80211_getqos(wh)[0];
+		else
 			qos = 0;
 
 		/*

Modified: head/sys/net80211/ieee80211_hostap.c
==============================================================================
--- head/sys/net80211/ieee80211_hostap.c	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/net80211/ieee80211_hostap.c	Sun Feb 10 23:58:56 2019	(r343990)
@@ -708,11 +708,9 @@ hostap_input(struct ieee80211_node *ni, struct mbuf *m
 		/*
 		 * Save QoS bits for use below--before we strip the header.
 		 */
-		if (subtype == IEEE80211_FC0_SUBTYPE_QOS) {
-			qos = (dir == IEEE80211_FC1_DIR_DSTODS) ?
-			    ((struct ieee80211_qosframe_addr4 *)wh)->i_qos[0] :
-			    ((struct ieee80211_qosframe *)wh)->i_qos[0];
-		} else
+		if (subtype == IEEE80211_FC0_SUBTYPE_QOS)
+			qos = ieee80211_getqos(wh)[0];
+		else
 			qos = 0;
 
 		/*

Modified: head/sys/net80211/ieee80211_ht.c
==============================================================================
--- head/sys/net80211/ieee80211_ht.c	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/net80211/ieee80211_ht.c	Sun Feb 10 23:58:56 2019	(r343990)
@@ -886,10 +886,7 @@ ieee80211_ampdu_reorder(struct ieee80211_node *ni, str
 	if (IEEE80211_IS_MULTICAST(wh->i_addr1))
 		return PROCESS;
 
-	if (IEEE80211_IS_DSTODS(wh))
-		tid = ((struct ieee80211_qosframe_addr4 *)wh)->i_qos[0];
-	else
-		tid = wh->i_qos[0];
+	tid = ieee80211_getqos(wh)[0];
 	tid &= IEEE80211_QOS_TID;
 	rap = &ni->ni_rx_ampdu[tid];
 	if ((rap->rxa_flags & IEEE80211_AGGR_XCHGPEND) == 0) {

Modified: head/sys/net80211/ieee80211_mesh.c
==============================================================================
--- head/sys/net80211/ieee80211_mesh.c	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/net80211/ieee80211_mesh.c	Sun Feb 10 23:58:56 2019	(r343990)
@@ -1655,12 +1655,7 @@ mesh_input(struct ieee80211_node *ni, struct mbuf *m,
 		 * in the Mesh Control field and a 3 address qos frame
 		 * is used.
 		 */
-		if (IEEE80211_IS_DSTODS(wh))
-			*(uint16_t *)qos = *(uint16_t *)
-			    ((struct ieee80211_qosframe_addr4 *)wh)->i_qos;
-		else
-			*(uint16_t *)qos = *(uint16_t *)
-			    ((struct ieee80211_qosframe *)wh)->i_qos;
+		*(uint16_t *)qos = *(uint16_t *)ieee80211_getqos(wh);
 
 		/*
 		 * NB: The mesh STA sets the Mesh Control Present

Modified: head/sys/net80211/ieee80211_output.c
==============================================================================
--- head/sys/net80211/ieee80211_output.c	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/net80211/ieee80211_output.c	Sun Feb 10 23:58:56 2019	(r343990)
@@ -1948,14 +1948,8 @@ ieee80211_fragment(struct ieee80211vap *vap, struct mb
 		whf = mtod(m, struct ieee80211_frame *);
 		memcpy(whf, wh, hdrsize);
 #ifdef IEEE80211_SUPPORT_MESH
-		if (vap->iv_opmode == IEEE80211_M_MBSS) {
-			if (IEEE80211_IS_DSTODS(wh))
-				((struct ieee80211_qosframe_addr4 *)
-				    whf)->i_qos[1] &= ~IEEE80211_QOS_MC;
-			else
-				((struct ieee80211_qosframe *)
-				    whf)->i_qos[1] &= ~IEEE80211_QOS_MC;
-		}
+		if (vap->iv_opmode == IEEE80211_M_MBSS)
+			ieee80211_getqos(wh)[1] &= ~IEEE80211_QOS_MC;
 #endif
 		*(uint16_t *)&whf->i_seq[0] |= htole16(
 			(fragno & IEEE80211_SEQ_FRAG_MASK) <<

Modified: head/sys/net80211/ieee80211_proto.h
==============================================================================
--- head/sys/net80211/ieee80211_proto.h	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/net80211/ieee80211_proto.h	Sun Feb 10 23:58:56 2019	(r343990)
@@ -303,6 +303,22 @@ void	ieee80211_wme_ic_getparams(struct ieee80211com *i
 int	ieee80211_wme_vap_ac_is_noack(struct ieee80211vap *vap, int ac);
 
 /*
+ * Return pointer to the QoS field from a Qos frame.
+ */
+static __inline uint8_t *
+ieee80211_getqos(void *data)
+{
+	struct ieee80211_frame *wh = data;
+
+	KASSERT(IEEE80211_QOS_HAS_SEQ(wh), ("QoS field is absent!"));
+
+	if (IEEE80211_IS_DSTODS(wh))
+		return (((struct ieee80211_qosframe_addr4 *)wh)->i_qos);
+	else
+		return (((struct ieee80211_qosframe *)wh)->i_qos);
+}
+
+/*
  * Return the WME TID from a QoS frame.  If no TID
  * is present return the index for the "non-QoS" entry.
  */

Modified: head/sys/net80211/ieee80211_sta.c
==============================================================================
--- head/sys/net80211/ieee80211_sta.c	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/net80211/ieee80211_sta.c	Sun Feb 10 23:58:56 2019	(r343990)
@@ -786,11 +786,9 @@ sta_input(struct ieee80211_node *ni, struct mbuf *m,
 		/*
 		 * Save QoS bits for use below--before we strip the header.
 		 */
-		if (subtype == IEEE80211_FC0_SUBTYPE_QOS) {
-			qos = (dir == IEEE80211_FC1_DIR_DSTODS) ?
-			    ((struct ieee80211_qosframe_addr4 *)wh)->i_qos[0] :
-			    ((struct ieee80211_qosframe *)wh)->i_qos[0];
-		} else
+		if (subtype == IEEE80211_FC0_SUBTYPE_QOS)
+			qos = ieee80211_getqos(wh)[0];
+		else
 			qos = 0;
 
 		/*

Modified: head/sys/net80211/ieee80211_wds.c
==============================================================================
--- head/sys/net80211/ieee80211_wds.c	Sun Feb 10 23:47:37 2019	(r343989)
+++ head/sys/net80211/ieee80211_wds.c	Sun Feb 10 23:58:56 2019	(r343990)
@@ -583,11 +583,9 @@ wds_input(struct ieee80211_node *ni, struct mbuf *m,
 		/*
 		 * Save QoS bits for use below--before we strip the header.
 		 */
-		if (subtype == IEEE80211_FC0_SUBTYPE_QOS) {
-			qos = (dir == IEEE80211_FC1_DIR_DSTODS) ?
-			    ((struct ieee80211_qosframe_addr4 *)wh)->i_qos[0] :
-			    ((struct ieee80211_qosframe *)wh)->i_qos[0];
-		} else
+		if (subtype == IEEE80211_FC0_SUBTYPE_QOS)
+			qos = ieee80211_getqos(wh)[0];
+		else
 			qos = 0;
 
 		/*


More information about the svn-src-head mailing list