diff options
Diffstat (limited to 'sys/net80211')
-rw-r--r-- | sys/net80211/ieee80211_output.c | 23 | ||||
-rw-r--r-- | sys/net80211/ieee80211_var.h | 1 |
2 files changed, 18 insertions, 6 deletions
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c index 0b0735f..c2c7faa 100644 --- a/sys/net80211/ieee80211_output.c +++ b/sys/net80211/ieee80211_output.c @@ -165,13 +165,24 @@ ieee80211_encap(struct ifnet *ifp, struct mbuf *m, struct ieee80211_node **pni) ni = ieee80211_find_node(ic, eh.ether_dhost); if (ni == NULL) { /* - * When not in station mode the - * destination address should always be - * in the node table unless this is a - * multicast/broadcast frame. + * When not in station mode the destination + * address should always be in the node table + * if the device sends management frames to us; + * unless this is a multicast/broadcast frame. + * For devices that don't send management frames + * to the host we have to cheat; use the bss + * node instead; the card will/should clobber + * the bssid address as necessary. + * + * XXX this handles AHDEMO because all devices + * that support it don't send mgmt frames; + * but it might be better to test explicitly */ - if (!IEEE80211_IS_MULTICAST(eh.ether_dhost)) { - /* ic->ic_stats.st_tx_nonode++; XXX statistic */ + if (!IEEE80211_IS_MULTICAST(eh.ether_dhost) && + (ic->ic_caps & IEEE80211_C_RCVMGT)) { + IEEE80211_DPRINTF(("%s: no node for dst %s, " + "discard frame\n", __func__, + ether_sprintf(eh.ether_dhost))); goto bad; } ni = ic->ic_bss; diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h index e57d7ca..86517d0 100644 --- a/sys/net80211/ieee80211_var.h +++ b/sys/net80211/ieee80211_var.h @@ -228,6 +228,7 @@ struct ieee80211com { #define IEEE80211_C_SHSLOT 0x00000080 /* CAPABILITY: short slottime */ #define IEEE80211_C_SHPREAMBLE 0x00000100 /* CAPABILITY: short preamble */ #define IEEE80211_C_MONITOR 0x00000200 /* CAPABILITY: monitor mode */ +#define IEEE80211_C_RCVMGT 0x00000400 /* CAPABILITY: rcv mgt frames */ /* flags for ieee80211_fix_rate() */ #define IEEE80211_F_DOSORT 0x00000001 /* sort rate list */ |