aboutsummaryrefslogtreecommitdiff
path: root/sys/net80211/ieee80211_input.c
diff options
context:
space:
mode:
authorAdrian Chadd <adrian@FreeBSD.org>2015-09-26 00:53:37 +0000
committerAdrian Chadd <adrian@FreeBSD.org>2015-09-26 00:53:37 +0000
commitb86fd7bcea3971ba942109d9cbee94a3fe2feec0 (patch)
tree79cc5ea82f192d5e6161b683bfdb0c511f3b97b9 /sys/net80211/ieee80211_input.c
parent5ddb05c2fea45ec45e5c87a132463a96a8125d7f (diff)
downloadsrc-b86fd7bcea3971ba942109d9cbee94a3fe2feec0.tar.gz
src-b86fd7bcea3971ba942109d9cbee94a3fe2feec0.zip
Perform some rather amusing layering violations to add mbuf tags to the
net80211 receive path. This allows drivers (notably USB right now, but anything/everything!) to optionally defer bulk RX of 802.11 frames until /outside/ of the driver lock(s), rather than doing: UNLOCK(sc); ieee80211_input*() LOCK(sc); .. which is really stupid. The existing API is maintaned - if ieee80211_input() / ieee80211_input_all() is called then the RSSI/NF values are used. If the MIMO versions are called with a given rx status pointer then it's used. Else, it'll use whatever is in the RX mbuf tag.
Notes
Notes: svn path=/head/; revision=288245
Diffstat (limited to 'sys/net80211/ieee80211_input.c')
-rw-r--r--sys/net80211/ieee80211_input.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c
index b757ae635f9f..0b9552012d3d 100644
--- a/sys/net80211/ieee80211_input.c
+++ b/sys/net80211/ieee80211_input.c
@@ -86,10 +86,21 @@ int
ieee80211_input_mimo(struct ieee80211_node *ni, struct mbuf *m,
struct ieee80211_rx_stats *rx)
{
+ struct ieee80211_rx_stats rxs;
+
+ if (rx) {
+ memcpy(&rxs, rx, sizeof(*rx));
+ } else {
+ /* try to read from mbuf */
+ bzero(&rxs, sizeof(rxs));
+ ieee80211_get_rx_params(m, &rxs);
+ }
+
/* XXX should assert IEEE80211_R_NF and IEEE80211_R_RSSI are set */
- ieee80211_process_mimo(ni, rx);
+ ieee80211_process_mimo(ni, &rxs);
+
//return ieee80211_input(ni, m, rx->rssi, rx->nf);
- return ni->ni_vap->iv_input(ni, m, rx, rx->rssi, rx->nf);
+ return ni->ni_vap->iv_input(ni, m, &rxs, rxs.rssi, rxs.nf);
}
int
@@ -107,11 +118,20 @@ int
ieee80211_input_mimo_all(struct ieee80211com *ic, struct mbuf *m,
struct ieee80211_rx_stats *rx)
{
+ struct ieee80211_rx_stats rxs;
struct ieee80211vap *vap;
int type = -1;
m->m_flags |= M_BCAST; /* NB: mark for bpf tap'ing */
+ if (rx) {
+ memcpy(&rxs, rx, sizeof(*rx));
+ } else {
+ /* try to read from mbuf */
+ bzero(&rxs, sizeof(rxs));
+ ieee80211_get_rx_params(m, &rxs);
+ }
+
/* XXX locking */
TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
struct ieee80211_node *ni;
@@ -143,7 +163,7 @@ ieee80211_input_mimo_all(struct ieee80211com *ic, struct mbuf *m,
m = NULL;
}
ni = ieee80211_ref_node(vap->iv_bss);
- type = ieee80211_input_mimo(ni, mcopy, rx);
+ type = ieee80211_input_mimo(ni, mcopy, &rxs);
ieee80211_free_node(ni);
}
if (m != NULL) /* no vaps, reclaim mbuf */