summaryrefslogtreecommitdiffstats
path: root/sys/net80211
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net80211')
-rw-r--r--sys/net80211/ieee80211_output.c23
-rw-r--r--sys/net80211/ieee80211_var.h1
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 */
OpenPOWER on IntegriCloud