]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Fixed WEP authentication (both Open System and Shared Key) with mac80211
authorJouni Malinen <jouni.malinen@atheros.com>
Thu, 4 Dec 2008 11:21:35 +0000 (13:21 +0200)
committerJouni Malinen <j@w1.fi>
Thu, 4 Dec 2008 11:21:35 +0000 (13:21 +0200)
Only one of the authentication frame types is encrypted. In order for
static WEP encryption to work properly (i.e., to not encrypt the frame),
we need to tell mac80211 about the frames that must not be encrypted.

hostapd/ChangeLog
hostapd/driver_nl80211.c

index 343efaa16f0d802c7c7d8cbfa497fc1d7d68307f..04b310082e3776897b4a1d542b069965beafda72 100644 (file)
@@ -13,6 +13,8 @@ ChangeLog for hostapd
        * added IEEE 802.11n HT capability configuration (ht_capab)
        * added support for generating Country IE based on nl80211 regulatory
          information (added if ieee80211d=1 in configuration)
+       * fixed WEP authentication (both Open System and Shared Key) with
+         mac80211
 
 2008-11-23 - v0.6.6
        * added a new configuration option, wpa_ptk_rekey, that can be used to
index 8543d9a47a349c6690f706d8ef190059d4edeb0e..1352efe255fa1bdf08a76fbd89c8907806e10106 100644 (file)
@@ -460,7 +460,29 @@ static int i802_send_frame(void *priv, const void *data, size_t len,
 static int i802_send_mgmt_frame(void *priv, const void *data, size_t len,
                                int flags)
 {
-       return i802_send_frame(priv, data, len, 1, flags);
+       struct ieee80211_mgmt *mgmt;
+       int do_not_encrypt = 0;
+       u16 fc;
+
+       mgmt = (struct ieee80211_mgmt *) data;
+       fc = le_to_host16(mgmt->frame_control);
+
+       if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT &&
+           WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_AUTH) {
+               /*
+                * Only one of the authentication frame types is encrypted.
+                * In order for static WEP encryption to work properly (i.e.,
+                * to not encrypt the frame), we need to tell mac80211 about
+                * the frames that must not be encrypted.
+                */
+               u16 auth_alg = le_to_host16(mgmt->u.auth.auth_alg);
+               u16 auth_trans = le_to_host16(mgmt->u.auth.auth_transaction);
+               if (auth_alg == WLAN_AUTH_OPEN ||
+                   (auth_alg == WLAN_AUTH_SHARED_KEY && auth_trans != 3))
+                       do_not_encrypt = 1;
+       }
+
+       return i802_send_frame(priv, data, len, !do_not_encrypt, flags);
 }
 
 /* Set kernel driver on given frequency (MHz) */