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
This commit is contained in:
parent
0020c845a0
commit
f3f08e16a3
@ -1051,13 +1051,9 @@ malo_tx_start(struct malo_softc *sc, struct ieee80211_node *ni,
|
||||
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;
|
||||
|
@ -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_node *ni, struct mwl_txbuf *
|
||||
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;
|
||||
|
||||
|
@ -3369,11 +3369,7 @@ run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
|
||||
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);
|
||||
|
@ -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;
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
|
||||
/*
|
||||
|
@ -886,10 +886,7 @@ ieee80211_ampdu_reorder(struct ieee80211_node *ni, struct mbuf *m,
|
||||
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) {
|
||||
|
@ -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
|
||||
|
@ -1948,14 +1948,8 @@ ieee80211_fragment(struct ieee80211vap *vap, struct mbuf *m0,
|
||||
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) <<
|
||||
|
@ -302,6 +302,22 @@ void ieee80211_wme_ic_getparams(struct ieee80211com *ic,
|
||||
struct chanAccParams *);
|
||||
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.
|
||||
|
@ -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;
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user