Fixed WEP authentication (both Open System and Shared Key) with mac80211

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.
This commit is contained in:
Jouni Malinen 2008-12-04 13:21:35 +02:00 committed by Jouni Malinen
parent 73d48dc4b4
commit 4a7b9f885f
2 changed files with 25 additions and 1 deletions

View file

@ -13,6 +13,8 @@ ChangeLog for hostapd
* added IEEE 802.11n HT capability configuration (ht_capab) * added IEEE 802.11n HT capability configuration (ht_capab)
* added support for generating Country IE based on nl80211 regulatory * added support for generating Country IE based on nl80211 regulatory
information (added if ieee80211d=1 in configuration) information (added if ieee80211d=1 in configuration)
* fixed WEP authentication (both Open System and Shared Key) with
mac80211
2008-11-23 - v0.6.6 2008-11-23 - v0.6.6
* added a new configuration option, wpa_ptk_rekey, that can be used to * added a new configuration option, wpa_ptk_rekey, that can be used to

View 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, static int i802_send_mgmt_frame(void *priv, const void *data, size_t len,
int flags) 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) */ /* Set kernel driver on given frequency (MHz) */