fix multicast/authframe handling for wds ap with split sta interfaces
authorFelix Fietkau <nbd@openwrt.org>
Thu, 31 Jul 2008 21:11:27 +0000 (21:11 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 31 Jul 2008 21:11:27 +0000 (21:11 +0000)
SVN-Revision: 12051

package/madwifi/patches/371-wds_sta_separation.patch
package/madwifi/patches/372-queue_vif.patch

index c16145b..9126fec 100644 (file)
                IEEE80211_NODE_STAT(ni, rx_data);
                IEEE80211_NODE_STAT_ADD(ni, rx_bytes, skb->len);
                ic->ic_lastdata = jiffies;
-@@ -1132,6 +1140,11 @@
+@@ -1132,6 +1140,13 @@
                dev = vap->iv_xrvap->iv_dev;
  #endif
  
 +      /* if the node has a wds subif, move data frames there,
 +       * but keep EAP traffic on the master */
-+      if (ni->ni_subif && ((eh)->ether_type != __constant_htons(ETHERTYPE_PAE)))
-+              dev = ni->ni_subif->iv_dev;
++      if (ni->ni_subif && ((eh)->ether_type != __constant_htons(ETHERTYPE_PAE))) {
++              vap = ni->ni_subif;
++              dev = vap->iv_dev;
++      }
 +
        /* perform as a bridge within the vap */
        /* XXX intra-vap bridging only */
        if (vap->iv_opmode == IEEE80211_M_HOSTAP &&
-@@ -1157,6 +1170,7 @@
+@@ -1157,6 +1172,7 @@
                        if (ni1 != NULL) {
                                if (ni1->ni_vap == vap &&
                                    ieee80211_node_is_authorized(ni1) &&
  /*
   * 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:
index 2467986..a73b9ec 100644 (file)
@@ -1,6 +1,6 @@
 --- a/net80211/ieee80211_input.c
 +++ b/net80211/ieee80211_input.c
-@@ -1181,6 +1181,7 @@
+@@ -1183,6 +1183,7 @@
                }
                if (skb1 != NULL) {
                        struct ieee80211_node *ni_tmp;
@@ -8,7 +8,7 @@
                        skb1->dev = dev;
                        skb_reset_mac_header(skb1);
                        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);
                        /* XXX insert vlan tag before queue it? */
                        ni_tmp = SKB_CB(skb1)->ni; /* remember node so we can free it */