mac80211: Disallow to set multicast BSSID
authorAlina Friedrichsen <x-alina@gmx.net>
Tue, 6 Jan 2009 01:41:35 +0000 (02:41 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 29 Jan 2009 20:59:47 +0000 (15:59 -0500)
Okay, here is the first of the five patches. After applying all
of them you should be able to build/join huge city mesh networks
(e.g. with the OLSR protocol) with the most of the mac80211 wireless
drivers by setting a fixed BSSID in the ad hoc mode. (If you found no
other bug/problem.) This was not specified in the original standard,
but is a widely used de facto standard.

The first patch now completely disallow to set multicast MAC addresses
as BSSID. The behavior before was really strange.

Signed-off-by: Alina Friedrichsen <x-alina@gmx.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/mlme.c

index 12976026cc45f230c64881bc4a5fd8f2a8973aea..f80dc253570906da87a6872d037e390b15e1a3f7 100644 (file)
@@ -2548,11 +2548,16 @@ int ieee80211_sta_set_bssid(struct ieee80211_sub_if_data *sdata, u8 *bssid)
 {
        struct ieee80211_if_sta *ifsta;
        int res;
+       bool valid;
 
        ifsta = &sdata->u.sta;
+       valid = is_valid_ether_addr(bssid);
 
        if (memcmp(ifsta->bssid, bssid, ETH_ALEN) != 0) {
-               memcpy(ifsta->bssid, bssid, ETH_ALEN);
+               if(valid)
+                       memcpy(ifsta->bssid, bssid, ETH_ALEN);
+               else
+                       memset(ifsta->bssid, 0, ETH_ALEN);
                res = 0;
                /*
                 * Hack! See also ieee80211_sta_set_ssid.
@@ -2566,7 +2571,7 @@ int ieee80211_sta_set_bssid(struct ieee80211_sub_if_data *sdata, u8 *bssid)
                }
        }
 
-       if (is_valid_ether_addr(bssid))
+       if (valid)
                ifsta->flags |= IEEE80211_STA_BSSID_SET;
        else
                ifsta->flags &= ~IEEE80211_STA_BSSID_SET;