diff options
author | sam <sam@FreeBSD.org> | 2009-04-26 21:34:53 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2009-04-26 21:34:53 +0000 |
commit | be423d2c6ca0d32cb8eb0416167f33e5af155e93 (patch) | |
tree | 1407ae093f33bc1685f1ed69ed1e749897f292a0 /sys/net80211/ieee80211_output.c | |
parent | 9570237fa6fd98deb34237bb05bbc9a216525bda (diff) | |
download | FreeBSD-src-be423d2c6ca0d32cb8eb0416167f33e5af155e93.zip FreeBSD-src-be423d2c6ca0d32cb8eb0416167f33e5af155e93.tar.gz |
uniformly mark mbufs that pass through the tx path with M_MCAST; drivers
can now use this flag instead of inspecting the contents
Diffstat (limited to 'sys/net80211/ieee80211_output.c')
-rw-r--r-- | sys/net80211/ieee80211_output.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c index f4eae12..bc7447f 100644 --- a/sys/net80211/ieee80211_output.c +++ b/sys/net80211/ieee80211_output.c @@ -424,13 +424,15 @@ bad: static void ieee80211_send_setup( struct ieee80211_node *ni, - struct ieee80211_frame *wh, + struct mbuf *m, int type, int tid, const uint8_t sa[IEEE80211_ADDR_LEN], const uint8_t da[IEEE80211_ADDR_LEN], const uint8_t bssid[IEEE80211_ADDR_LEN]) { #define WH4(wh) ((struct ieee80211_frame_addr4 *)wh) + struct ieee80211_frame *wh = mtod(m, struct ieee80211_frame *); + ieee80211_seq seqno; wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | type; if ((type & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA) { @@ -473,9 +475,12 @@ ieee80211_send_setup( IEEE80211_ADDR_COPY(wh->i_addr3, bssid); } *(uint16_t *)&wh->i_dur[0] = 0; - *(uint16_t *)&wh->i_seq[0] = - htole16(ni->ni_txseqs[tid] << IEEE80211_SEQ_SEQ_SHIFT); - ni->ni_txseqs[tid]++; + + seqno = ni->ni_txseqs[tid]++; + *(uint16_t *)&wh->i_seq[0] = htole16(seqno << IEEE80211_SEQ_SEQ_SHIFT); + + if (IEEE80211_IS_MULTICAST(wh->i_addr1)) + m->m_flags |= M_MCAST; #undef WH4 } @@ -516,7 +521,7 @@ ieee80211_mgmt_output(struct ieee80211_node *ni, struct mbuf *m, int type, } wh = mtod(m, struct ieee80211_frame *); - ieee80211_send_setup(ni, wh, + ieee80211_send_setup(ni, m, IEEE80211_FC0_TYPE_MGT | type, IEEE80211_NONQOS_TID, vap->iv_myaddr, ni->ni_macaddr, ni->ni_bssid); if (params->ibp_flags & IEEE80211_BPF_CRYPTO) { @@ -607,7 +612,7 @@ ieee80211_send_nulldata(struct ieee80211_node *ni) const int tid = WME_AC_TO_TID(WME_AC_BE); uint8_t *qos; - ieee80211_send_setup(ni, wh, + ieee80211_send_setup(ni, m, IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS_NULL, tid, vap->iv_myaddr, ni->ni_macaddr, ni->ni_bssid); @@ -620,7 +625,7 @@ ieee80211_send_nulldata(struct ieee80211_node *ni) qos[0] |= IEEE80211_QOS_ACKPOLICY_NOACK; qos[1] = 0; } else { - ieee80211_send_setup(ni, wh, + ieee80211_send_setup(ni, m, IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_NODATA, IEEE80211_NONQOS_TID, vap->iv_myaddr, ni->ni_macaddr, ni->ni_bssid); @@ -879,6 +884,7 @@ ieee80211_encap(struct ieee80211vap *vap, struct ieee80211_node *ni, struct ieee80211_key *key; struct llc *llc; int hdrsize, hdrspace, datalen, addqos, txfrag, is4addr; + ieee80211_seq seqno; /* * Copy existing Ethernet header to a safe place. The @@ -1091,14 +1097,14 @@ ieee80211_encap(struct ieee80211vap *vap, struct ieee80211_node *ni, * capability; this may also change when we pull * aggregation up into net80211 */ + seqno = ni->ni_txseqs[tid]++; *(uint16_t *)wh->i_seq = - htole16(ni->ni_txseqs[tid] << IEEE80211_SEQ_SEQ_SHIFT); - ni->ni_txseqs[tid]++; + htole16(seqno << IEEE80211_SEQ_SEQ_SHIFT); } } else { + seqno = ni->ni_txseqs[IEEE80211_NONQOS_TID]++; *(uint16_t *)wh->i_seq = - htole16(ni->ni_txseqs[IEEE80211_NONQOS_TID] << IEEE80211_SEQ_SEQ_SHIFT); - ni->ni_txseqs[IEEE80211_NONQOS_TID]++; + htole16(seqno << IEEE80211_SEQ_SEQ_SHIFT); } /* check if xmit fragmentation is required */ txfrag = (m->m_pkthdr.len > vap->iv_fragthreshold && @@ -1132,9 +1138,10 @@ ieee80211_encap(struct ieee80211vap *vap, struct ieee80211_node *ni, m->m_flags |= M_ENCAP; /* mark encapsulated */ IEEE80211_NODE_STAT(ni, tx_data); - if (IEEE80211_IS_MULTICAST(wh->i_addr1)) + if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { IEEE80211_NODE_STAT(ni, tx_mcast); - else + m->m_flags |= M_MCAST; + } else IEEE80211_NODE_STAT(ni, tx_ucast); IEEE80211_NODE_STAT_ADD(ni, tx_bytes, datalen); @@ -1591,7 +1598,7 @@ ieee80211_send_probereq(struct ieee80211_node *ni, } wh = mtod(m, struct ieee80211_frame *); - ieee80211_send_setup(ni, wh, + ieee80211_send_setup(ni, m, IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_REQ, IEEE80211_NONQOS_TID, sa, da, bssid); /* XXX power management? */ @@ -2195,7 +2202,7 @@ ieee80211_send_proberesp(struct ieee80211vap *vap, KASSERT(m != NULL, ("no room for header")); wh = mtod(m, struct ieee80211_frame *); - ieee80211_send_setup(bss, wh, + ieee80211_send_setup(bss, m, IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP, IEEE80211_NONQOS_TID, vap->iv_myaddr, da, bss->ni_bssid); /* XXX power management? */ |