summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/net80211/ieee80211_ioctl.c7
-rw-r--r--sys/net80211/ieee80211_output.c7
-rw-r--r--sys/net80211/ieee80211_var.h5
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"
OpenPOWER on IntegriCloud