diff options
author | 2020-12-09 21:54:11 +0000 | |
---|---|---|
committer | 2020-12-09 21:54:11 +0000 | |
commit | e9230c34af2e44519a525203cd65ace35a9e9638 (patch) | |
tree | a8fb4b0924027c3f8d712b1c3f1a2ceb763250d5 | |
parent | Update awk to December 8, 2020 version. (diff) | |
download | wireguard-openbsd-e9230c34af2e44519a525203cd65ace35a9e9638.tar.xz wireguard-openbsd-e9230c34af2e44519a525203cd65ace35a9e9638.zip |
Ignore trailing data in A-MSDU frame buffers if it is smaller than the
Ethernet header size. Avoids spurious "input packet decapsulations failed"
errors in 'netstat -W' with A-MSDU enabled (currently disabled in-tree).
Problem observed and fix verified on iwm(4) 8260 by me and 7260 by tobhe.
ok phessler@ tobhe@
-rw-r--r-- | sys/net80211/ieee80211_input.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c index 50def5628b9..924608b6724 100644 --- a/sys/net80211/ieee80211_input.c +++ b/sys/net80211/ieee80211_input.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ieee80211_input.c,v 1.226 2020/12/09 15:50:58 stsp Exp $ */ +/* $OpenBSD: ieee80211_input.c,v 1.227 2020/12/09 21:54:11 stsp Exp $ */ /*- * Copyright (c) 2001 Atsushi Onoe @@ -1153,14 +1153,12 @@ ieee80211_amsdu_decap(struct ieee80211com *ic, struct mbuf *m, /* strip 802.11 header */ m_adj(m, hdrlen); - for (;;) { + while (m->m_pkthdr.len >= ETHER_HDR_LEN + LLC_SNAPFRAMELEN) { /* process an A-MSDU subframe */ - if (m->m_len < ETHER_HDR_LEN + LLC_SNAPFRAMELEN) { - m = m_pullup(m, ETHER_HDR_LEN + LLC_SNAPFRAMELEN); - if (m == NULL) { - ic->ic_stats.is_rx_decap++; - break; - } + m = m_pullup(m, ETHER_HDR_LEN + LLC_SNAPFRAMELEN); + if (m == NULL) { + ic->ic_stats.is_rx_decap++; + break; } eh = mtod(m, struct ether_header *); /* examine 802.3 header */ @@ -1207,15 +1205,13 @@ ieee80211_amsdu_decap(struct ieee80211com *ic, struct mbuf *m, } ieee80211_enqueue_data(ic, m, ni, mcast, ml); - if (n->m_pkthdr.len == 0) { - m_freem(n); - break; - } m = n; /* remove padding */ pad = ((len + 3) & ~3) - len; m_adj(m, pad); } + + m_freem(m); } /* |