From 53c6db5ab43194c89cc7fe2d03dbd630c39bcfda Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Tue, 24 Jan 2012 01:49:23 +0000
Subject: [PATCH] hostapd: merge an upstream workaround for broken clients
 sending the wrong wpa type (should fix #9561)

SVN-Revision: 29876
---
 package/hostapd/patches/100-pending_work.patch | 18 ++++++++++++++++++
 .../patches/560-disable_ctrl_iface_mib.patch   |  4 ++--
 .../patches/740-group_key_timeout.patch        |  2 +-
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/package/hostapd/patches/100-pending_work.patch b/package/hostapd/patches/100-pending_work.patch
index d9824f3178..8b318190fd 100644
--- a/package/hostapd/patches/100-pending_work.patch
+++ b/package/hostapd/patches/100-pending_work.patch
@@ -160,3 +160,21 @@
  
  	if (bss != &drv->first_bss) {
  		struct i802_bss *tbss;
+--- a/src/ap/wpa_auth.c
++++ b/src/ap/wpa_auth.c
+@@ -776,7 +776,14 @@ void wpa_receive(struct wpa_authenticato
+ 	}
+ 
+ 	if (sm->wpa == WPA_VERSION_WPA2) {
+-		if (key->type != EAPOL_KEY_TYPE_RSN) {
++		if (key->type == EAPOL_KEY_TYPE_WPA) {
++			/*
++			 * Some deployed station implementations seem to send
++			 * msg 4/4 with incorrect type value in WPA2 mode.
++			 */
++			wpa_printf(MSG_DEBUG, "Workaround: Allow EAPOL-Key "
++				   "with unexpected WPA type in RSN mode");
++		} else if (key->type != EAPOL_KEY_TYPE_RSN) {
+ 			wpa_printf(MSG_DEBUG, "Ignore EAPOL-Key with "
+ 				   "unexpected type %d in RSN mode",
+ 				   key->type);
diff --git a/package/hostapd/patches/560-disable_ctrl_iface_mib.patch b/package/hostapd/patches/560-disable_ctrl_iface_mib.patch
index 22f282ab5b..306c051178 100644
--- a/package/hostapd/patches/560-disable_ctrl_iface_mib.patch
+++ b/package/hostapd/patches/560-disable_ctrl_iface_mib.patch
@@ -123,7 +123,7 @@
  				struct sta_info *sta, int success)
 --- a/src/ap/wpa_auth.c
 +++ b/src/ap/wpa_auth.c
-@@ -2534,6 +2534,7 @@ static int wpa_cipher_bits(int cipher)
+@@ -2541,6 +2541,7 @@ static int wpa_cipher_bits(int cipher)
  	}
  }
  
@@ -131,7 +131,7 @@
  
  #define RSN_SUITE "%02x-%02x-%02x-%d"
  #define RSN_SUITE_ARG(s) \
-@@ -2697,7 +2698,7 @@ int wpa_get_mib_sta(struct wpa_state_mac
+@@ -2704,7 +2705,7 @@ int wpa_get_mib_sta(struct wpa_state_mac
  
  	return len;
  }
diff --git a/package/hostapd/patches/740-group_key_timeout.patch b/package/hostapd/patches/740-group_key_timeout.patch
index 694b0661fb..c1493952cd 100644
--- a/package/hostapd/patches/740-group_key_timeout.patch
+++ b/package/hostapd/patches/740-group_key_timeout.patch
@@ -1,6 +1,6 @@
 --- a/src/ap/wpa_auth.c
 +++ b/src/ap/wpa_auth.c
-@@ -1330,7 +1330,7 @@ static void wpa_send_eapol(struct wpa_au
+@@ -1337,7 +1337,7 @@ static void wpa_send_eapol(struct wpa_au
  			 keyidx, encr, 0);
  
  	ctr = pairwise ? sm->TimeoutCtr : sm->GTimeoutCtr;
-- 
2.30.2