diff options
Diffstat (limited to 'net/mac80211/tx.c')
-rw-r--r-- | net/mac80211/tx.c | 21 |
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, |