summaryrefslogtreecommitdiffstats
path: root/openwrt/package/hostapd/patches/100-wpa_fix.patch
blob: 502167cbd38960f0afac43929ced0ff54cef852a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
--- hostapd-0.4.7/driver_madwifi.c	2006-01-30 10:00:44.199096000 -0800
+++ hostapd-0.4.7-new/driver_madwifi.c	2006-01-30 10:05:55.925511000 -0800
@@ -692,6 +692,7 @@
 	struct hostapd_data *hapd = drv->hapd;
 	struct ieee80211req_wpaie ie;
 	int ielen, res;
+        int rsn = 0;
 
 	/*
 	 * Fetch negotiated WPA/RSN parameters from the system.
@@ -702,26 +703,37 @@
 		printf("Failed to get WPA/RSN information element.\n");
 		return -1;		/* XXX not right */
 	}
-	ielen = ie.wpa_ie[1];
-	if (ielen == 0) {
+        if ((ie.wpa_ie[1] == 0) && (ie.rsn_ie[1] == 0)){
 		printf("No WPA/RSN information element for station!?\n");
 		return -1;		/* XXX not right */
 	}
+        ielen = ie.rsn_ie[1]; 
 	ielen += 2;
-	res = wpa_validate_wpa_ie(hapd, sta, ie.wpa_ie, ielen,
-			ie.wpa_ie[0] == WLAN_EID_RSN ?
-			    HOSTAPD_WPA_VERSION_WPA2 : HOSTAPD_WPA_VERSION_WPA);
-	if (res != WPA_IE_OK) {
-		printf("WPA/RSN information element rejected? (res %u)\n", res);
-		return -1;
-	}
+	res = wpa_validate_wpa_ie(hapd, sta, ie.rsn_ie, ielen, 
+                                  HOSTAPD_WPA_VERSION_WPA2);
+        if (res != WPA_IE_OK){
+          // now look for WPA IE
+          ielen = ie.wpa_ie[1];
+          ielen += 2;
+          res = wpa_validate_wpa_ie(hapd, sta, ie.wpa_ie, ielen, 
+                                    HOSTAPD_WPA_VERSION_WPA);
+          if (res != WPA_IE_OK) {
+            printf("WPA/RSN information element rejected? (res %u)\n", res);
+            return -1;
+          }
+        } else {
+          rsn = 1;
+        }
 	free(sta->wpa_ie);
 	sta->wpa_ie = malloc(ielen);
 	if (sta->wpa_ie == NULL) {
 		printf("No memory to save WPA/RSN information element!\n");
 		return -1;
 	}
-	memcpy(sta->wpa_ie, ie.wpa_ie, ielen);
+        if (rsn)
+          memcpy(sta->wpa_ie, ie.rsn_ie, ielen);
+        else
+          memcpy(sta->wpa_ie, ie.wpa_ie, ielen);
 	sta->wpa_ie_len = ielen;
 	return 0;
 }