diff options
author | sam <sam@FreeBSD.org> | 2009-04-26 23:11:22 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2009-04-26 23:11:22 +0000 |
commit | 506d007c7de2e8fbbe90bed7dd9b91a3d59e9de2 (patch) | |
tree | a0bf2cdf5a730707c3ac044fc4085f0c36bacc05 | |
parent | b56ccf5e16a730658f80c0f89fd03bafd1ed90cb (diff) | |
download | FreeBSD-src-506d007c7de2e8fbbe90bed7dd9b91a3d59e9de2.zip FreeBSD-src-506d007c7de2e8fbbe90bed7dd9b91a3d59e9de2.tar.gz |
add IEEE80211_FEXT_4ADDR to indicate ieee80211_encap should do 4-address
encapsulation when relaying frames; this reduces the cost of the test and
enables use for situations other than "sta vap + dwds"
-rw-r--r-- | sys/net80211/ieee80211_ioctl.c | 7 | ||||
-rw-r--r-- | sys/net80211/ieee80211_output.c | 7 | ||||
-rw-r--r-- | sys/net80211/ieee80211_var.h | 5 |
3 files changed, 12 insertions, 7 deletions
diff --git a/sys/net80211/ieee80211_ioctl.c b/sys/net80211/ieee80211_ioctl.c index 4e018cb..b28dffa 100644 --- a/sys/net80211/ieee80211_ioctl.c +++ b/sys/net80211/ieee80211_ioctl.c @@ -3048,8 +3048,13 @@ ieee80211_ioctl_set80211(struct ieee80211vap *vap, u_long cmd, struct ieee80211r vap->iv_opmode != IEEE80211_M_STA) return EINVAL; vap->iv_flags |= IEEE80211_F_DWDS; - } else + if (vap->iv_opmode == IEEE80211_M_STA) + vap->iv_flags_ext |= IEEE80211_FEXT_4ADDR; + } else { vap->iv_flags &= ~IEEE80211_F_DWDS; + if (vap->iv_opmode == IEEE80211_M_STA) + vap->iv_flags_ext &= ~IEEE80211_FEXT_4ADDR; + } break; case IEEE80211_IOC_INACTIVITY: if (ireq->i_val) diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c index fabdfb2..f36365c 100644 --- a/sys/net80211/ieee80211_output.c +++ b/sys/net80211/ieee80211_output.c @@ -974,12 +974,11 @@ ieee80211_encap(struct ieee80211vap *vap, struct ieee80211_node *ni, /* * 4-address frames need to be generated for: * o packets sent through a WDS vap (IEEE80211_M_WDS) - * o packets relayed by a station operating with dynamic WDS - * (IEEE80211_M_STA+IEEE80211_F_DWDS and src address) + * o packets sent through a vap marked for relaying + * (e.g. a station operating with dynamic WDS) */ is4addr = vap->iv_opmode == IEEE80211_M_WDS || - (vap->iv_opmode == IEEE80211_M_STA && - (vap->iv_flags & IEEE80211_F_DWDS) && + ((vap->iv_flags_ext & IEEE80211_FEXT_4ADDR) && !IEEE80211_ADDR_EQ(eh.ether_shost, vap->iv_myaddr)); if (is4addr) hdrsize += IEEE80211_ADDR_LEN; diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h index 0160e74..55204f8 100644 --- a/sys/net80211/ieee80211_var.h +++ b/sys/net80211/ieee80211_var.h @@ -514,6 +514,7 @@ MALLOC_DECLARE(M_80211_VAP); #define IEEE80211_FEXT_TSN 0x00000020 /* CONF: TSN enabled */ #define IEEE80211_FEXT_SCANREQ 0x00000040 /* STATUS: scan req params */ #define IEEE80211_FEXT_RESUME 0x00000080 /* STATUS: start on resume */ +#define IEEE80211_FEXT_4ADDR 0x00000100 /* CONF: apply 4-addr encap */ #define IEEE80211_FEXT_NONERP_PR 0x00000200 /* STATUS: non-ERP sta present*/ #define IEEE80211_FEXT_SWBMISS 0x00000400 /* CONF: do bmiss in s/w */ #define IEEE80211_FEXT_DFS 0x00000800 /* CONF: DFS enabled */ @@ -535,8 +536,8 @@ MALLOC_DECLARE(M_80211_VAP); #define IEEE80211_FEXT_BITS \ "\20\1NONHT_PR\2INACT\3SCANWAIT\4BGSCAN\5WPS\6TSN\7SCANREQ\10RESUME" \ - "\12NONEPR_PR\13SWBMISS\14DFS\15DOTD\22WDSLEGACY\23PROBECHAN\24HT" \ - "\25AMDPU_TX\26AMPDU_TX\27AMSDU_TX\30AMSDU_RX\31USEHT40\32PUREN" \ + "\0114ADDR\12NONEPR_PR\13SWBMISS\14DFS\15DOTD\22WDSLEGACY\23PROBECHAN" \ + "\24HT\25AMDPU_TX\26AMPDU_TX\27AMSDU_TX\30AMSDU_RX\31USEHT40\32PUREN" \ "\33SHORTGI20\34SHORTGI40\35HTCOMPAT\36RIFS" #define IEEE80211_FVEN_BITS "\20" |