fix multicast/authframe handling for wds ap with split sta interfaces
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@12051 3c298f89-4303-0410-b956-a3cf2f4a3e73master
parent
62381bde91
commit
4dfbe7ef52
|
@ -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…
Reference in New Issue