1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-30 16:51:41 +00:00

o add capability to indicate if device receives all management frames

o use recv mgmt capability to decide if outbound frames should be
  discarded if no node table entry is present
This commit is contained in:
Sam Leffler 2003-10-17 21:54:59 +00:00
parent 3df780cf76
commit 7f7ecba47e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=121174
2 changed files with 18 additions and 6 deletions

View File

@ -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;

View File

@ -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 */