mac80211: In IBSS the DA field of auth frames is different from BSSID
authorAntonio Quartulli <ordex@autistici.org>
Mon, 9 Jan 2012 18:43:06 +0000 (19:43 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 24 Jan 2012 19:08:39 +0000 (14:08 -0500)
In case of authentication frame exchange between two IBSS STAs, the
DA field must contain the destinatioin address (instead of the BSSID).

Signed-off-by: Antonio Quartulli <ordex@autistici.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/ibss.c
net/mac80211/ieee80211_i.h
net/mac80211/util.c
net/mac80211/work.c

index b4c30318e22b60e733fd9325a064061b52dffebb..4345e9449d7c0de5091ddb5cc5b99b4fe601a554 100644 (file)
@@ -57,7 +57,7 @@ static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
         * has actually implemented this.
         */
        if (auth_alg == WLAN_AUTH_OPEN && auth_transaction == 1)
-               ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, NULL, 0,
+               ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, NULL, 0, mgmt->sa,
                                    sdata->u.ibss.bssid, NULL, 0, 0);
 }
 
index 2f0642d9e154672da4959bfe4c3e3d828fc3cdac..ca6486b941b66f39803d4466b2b350e5057d5fc0 100644 (file)
@@ -1396,7 +1396,7 @@ void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local,
 void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
                         u16 transaction, u16 auth_alg,
                         u8 *extra, size_t extra_len, const u8 *bssid,
-                        const u8 *key, u8 key_len, u8 key_idx);
+                        const u8 *da, const u8 *key, u8 key_len, u8 key_idx);
 int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
                             const u8 *ie, size_t ie_len,
                             enum ieee80211_band band, u32 rate_mask,
index 9919892575f45a94f55e34c474f3f93736755237..30d72e2af7cefc7d703a13dbf8b6123e33cdd987 100644 (file)
@@ -862,8 +862,8 @@ u32 ieee80211_mandatory_rates(struct ieee80211_local *local,
 
 void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
                         u16 transaction, u16 auth_alg,
-                        u8 *extra, size_t extra_len, const u8 *bssid,
-                        const u8 *key, u8 key_len, u8 key_idx)
+                        u8 *extra, size_t extra_len, const u8 *da,
+                        const u8 *bssid, const u8 *key, u8 key_len, u8 key_idx)
 {
        struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb;
@@ -881,7 +881,7 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
        memset(mgmt, 0, 24 + 6);
        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
                                          IEEE80211_STYPE_AUTH);
-       memcpy(mgmt->da, bssid, ETH_ALEN);
+       memcpy(mgmt->da, da, ETH_ALEN);
        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
        memcpy(mgmt->bssid, bssid, ETH_ALEN);
        mgmt->u.auth.auth_alg = cpu_to_le16(auth_alg);
index c6dd01a05291e25865bac897a67353785131a4fa..0a1a176fbe91b41386c7b6a718dd96b0c25b031e 100644 (file)
@@ -480,7 +480,8 @@ ieee80211_authenticate(struct ieee80211_work *wk)
               sdata->name, wk->filter_ta, wk->probe_auth.tries);
 
        ieee80211_send_auth(sdata, 1, wk->probe_auth.algorithm, wk->ie,
-                           wk->ie_len, wk->filter_ta, NULL, 0, 0);
+                           wk->ie_len, wk->filter_ta, wk->filter_ta, NULL, 0,
+                           0);
        wk->probe_auth.transaction = 2;
 
        wk->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
@@ -598,7 +599,7 @@ static void ieee80211_auth_challenge(struct ieee80211_work *wk,
                return;
        ieee80211_send_auth(sdata, 3, wk->probe_auth.algorithm,
                            elems.challenge - 2, elems.challenge_len + 2,
-                           wk->filter_ta, wk->probe_auth.key,
+                           wk->filter_ta, wk->filter_ta, wk->probe_auth.key,
                            wk->probe_auth.key_len, wk->probe_auth.key_idx);
        wk->probe_auth.transaction = 4;
 }