aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/tx.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-01-28 11:11:43 -0500
committerJohn W. Linville <linville@tuxdriver.com>2008-02-29 15:19:09 -0500
commit7d185b8bb17eac9e9d673eb483ded0fbf0b28b97 (patch)
tree5f8e56ddebccb2a97a2a99be53c2838472026f0b /net/mac80211/tx.c
parentb22052569657925d6de33b19b2c7b7562900defb (diff)
mac80211: allow sending multicast frames through virtual ports
When reworking the port access control code, I forgot multicast frames and those are now always rejected because the destination station is not known. This changes the code to allow through multicast frames and also avoid the sta hash lookup (which is bound to fail) for them. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/tx.c')
-rw-r--r--net/mac80211/tx.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 67b509edd431..85d01646abf5 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1409,10 +1409,17 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb,
1409 goto fail; 1409 goto fail;
1410 } 1410 }
1411 1411
1412 sta = sta_info_get(local, hdr.addr1); 1412 /*
1413 if (sta) { 1413 * There's no need to try to look up the destination
1414 sta_flags = sta->flags; 1414 * if it is a multicast address (which can only happen
1415 sta_info_put(sta); 1415 * in AP mode)
1416 */
1417 if (!is_multicast_ether_addr(hdr.addr1)) {
1418 sta = sta_info_get(local, hdr.addr1);
1419 if (sta) {
1420 sta_flags = sta->flags;
1421 sta_info_put(sta);
1422 }
1416 } 1423 }
1417 1424
1418 /* receiver is QoS enabled, use a QoS type frame */ 1425 /* receiver is QoS enabled, use a QoS type frame */
@@ -1422,10 +1429,12 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb,
1422 } 1429 }
1423 1430
1424 /* 1431 /*
1425 * If port access control is enabled, drop frames to unauthorised 1432 * If port access control is enabled, drop unicast frames to
1426 * stations unless they are EAPOL frames from the local station. 1433 * unauthorised stations unless they are EAPOL frames from the
1434 * local station.
1427 */ 1435 */
1428 if (unlikely(sdata->ieee802_1x_pac && 1436 if (unlikely(sdata->ieee802_1x_pac &&
1437 !is_multicast_ether_addr(hdr.addr1) &&
1429 !(sta_flags & WLAN_STA_AUTHORIZED) && 1438 !(sta_flags & WLAN_STA_AUTHORIZED) &&
1430 !(ethertype == ETH_P_PAE && 1439 !(ethertype == ETH_P_PAE &&
1431 compare_ether_addr(dev->dev_addr, 1440 compare_ether_addr(dev->dev_addr,