fix multicast/authframe handling for wds ap with split sta interfaces

SVN-Revision: 12051
master
Felix Fietkau 16 years ago
parent 434f4269ea
commit d298a4a411
  1. 21
      package/madwifi/patches/371-wds_sta_separation.patch
  2. 4
      package/madwifi/patches/372-queue_vif.patch

@ -39,19 +39,21 @@
IEEE80211_NODE_STAT(ni, rx_data); IEEE80211_NODE_STAT(ni, rx_data);
IEEE80211_NODE_STAT_ADD(ni, rx_bytes, skb->len); IEEE80211_NODE_STAT_ADD(ni, rx_bytes, skb->len);
ic->ic_lastdata = jiffies; ic->ic_lastdata = jiffies;
@@ -1132,6 +1140,11 @@ @@ -1132,6 +1140,13 @@
dev = vap->iv_xrvap->iv_dev; dev = vap->iv_xrvap->iv_dev;
#endif #endif
+ /* if the node has a wds subif, move data frames there, + /* if the node has a wds subif, move data frames there,
+ * but keep EAP traffic on the master */ + * but keep EAP traffic on the master */
+ if (ni->ni_subif && ((eh)->ether_type != __constant_htons(ETHERTYPE_PAE))) + if (ni->ni_subif && ((eh)->ether_type != __constant_htons(ETHERTYPE_PAE))) {
+ dev = ni->ni_subif->iv_dev; + vap = ni->ni_subif;
+ dev = vap->iv_dev;
+ }
+ +
/* perform as a bridge within the vap */ /* perform as a bridge within the vap */
/* XXX intra-vap bridging only */ /* XXX intra-vap bridging only */
if (vap->iv_opmode == IEEE80211_M_HOSTAP && if (vap->iv_opmode == IEEE80211_M_HOSTAP &&
@@ -1157,6 +1170,7 @@ @@ -1157,6 +1172,7 @@
if (ni1 != NULL) { if (ni1 != NULL) {
if (ni1->ni_vap == vap && if (ni1->ni_vap == vap &&
ieee80211_node_is_authorized(ni1) && ieee80211_node_is_authorized(ni1) &&
@ -419,3 +421,14 @@
/* /*
* Guess how the interrupt handler should work. * Guess how the interrupt handler should work.
*/ */
--- a/net80211/ieee80211_output.c
+++ b/net80211/ieee80211_output.c
@@ -786,6 +786,8 @@
hdrsize = sizeof(struct ieee80211_frame);
SKB_CB(skb)->auth_pkt = (eh.ether_type == __constant_htons(ETHERTYPE_PAE));
+ if (!SKB_CB(skb)->auth_pkt && ni->ni_subif)
+ vap = ni->ni_subif;
switch (vap->iv_opmode) {
case IEEE80211_M_IBSS:

@ -1,6 +1,6 @@
--- a/net80211/ieee80211_input.c --- a/net80211/ieee80211_input.c
+++ b/net80211/ieee80211_input.c +++ b/net80211/ieee80211_input.c
@@ -1181,6 +1181,7 @@ @@ -1183,6 +1183,7 @@
} }
if (skb1 != NULL) { if (skb1 != NULL) {
struct ieee80211_node *ni_tmp; struct ieee80211_node *ni_tmp;
@ -8,7 +8,7 @@
skb1->dev = dev; skb1->dev = dev;
skb_reset_mac_header(skb1); skb_reset_mac_header(skb1);
skb_set_network_header(skb1, sizeof(struct ether_header)); skb_set_network_header(skb1, sizeof(struct ether_header));
@@ -1188,7 +1189,12 @@ @@ -1190,7 +1191,12 @@
skb1->protocol = __constant_htons(ETH_P_802_2); skb1->protocol = __constant_htons(ETH_P_802_2);
/* XXX insert vlan tag before queue it? */ /* XXX insert vlan tag before queue it? */
ni_tmp = SKB_CB(skb1)->ni; /* remember node so we can free it */ ni_tmp = SKB_CB(skb1)->ni; /* remember node so we can free it */

Loading…
Cancel
Save