mac80211: allow sending multicast frames through virtual ports
authorJohannes Berg <johannes@sipsolutions.net>
Mon, 28 Jan 2008 16:11:43 +0000 (17:11 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 29 Feb 2008 20:19:09 +0000 (15:19 -0500)
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>
net/mac80211/tx.c

index 67b509edd431024ea62623d023f5cf309005af64..85d01646abf5a520884ddb7dfa1cbca5dae51f67 100644 (file)
@@ -1409,10 +1409,17 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb,
                goto fail;
        }
 
-       sta = sta_info_get(local, hdr.addr1);
-       if (sta) {
-               sta_flags = sta->flags;
-               sta_info_put(sta);
+       /*
+        * There's no need to try to look up the destination
+        * if it is a multicast address (which can only happen
+        * in AP mode)
+        */
+       if (!is_multicast_ether_addr(hdr.addr1)) {
+               sta = sta_info_get(local, hdr.addr1);
+               if (sta) {
+                       sta_flags = sta->flags;
+                       sta_info_put(sta);
+               }
        }
 
        /* receiver is QoS enabled, use a QoS type frame */
@@ -1422,10 +1429,12 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb,
        }
 
        /*
-        * If port access control is enabled, drop frames to unauthorised
-        * stations unless they are EAPOL frames from the local station.
+        * If port access control is enabled, drop unicast frames to
+        * unauthorised stations unless they are EAPOL frames from the
+        * local station.
         */
        if (unlikely(sdata->ieee802_1x_pac &&
+                    !is_multicast_ether_addr(hdr.addr1) &&
                     !(sta_flags & WLAN_STA_AUTHORIZED) &&
                     !(ethertype == ETH_P_PAE &&
                       compare_ether_addr(dev->dev_addr,