[wpa-supplicant] Wireless-extension v19

Benoit Boissinot bboissin+hostap
Fri Sep 9 05:23:17 PDT 2005


Version 19 of Wireless Extension is now in Linus git tree. It broke
wpa_supplicant for me (because of changes in iw_handler.h).

I needed the following patch, can someone comment if this is the
appropriate fix ?

thanks,

Benoit Boissinot


diff -Naurp wpa_supplicant-0.4.4/driver_wext.c wpa_supplicant-0.4.4.new/driver_wext.c
--- wpa_supplicant-0.4.4/driver_wext.c	2005-09-08 16:18:26.000000000 +0200
+++ wpa_supplicant-0.4.4.new/driver_wext.c	2005-09-09 12:35:58.000000000 +0200
@@ -42,6 +42,7 @@ struct wpa_driver_wext_data {
 	size_t assoc_resp_ies_len;
 	struct wpa_driver_capa capa;
 	int has_capability;
+	int we_version_compiled;
 };
 
 
@@ -846,16 +847,22 @@ int wpa_driver_wext_get_scan_results(voi
 
 	pos = (char *) res_buf;
 	end = (char *) res_buf + len;
+	char * tmp = pos;
 
 	while (pos + IW_EV_LCP_LEN <= end) {
 		int ssid_len;
 		/* Event data may be unaligned, so make a local, aligned copy
 		 * before processing. */
-		memcpy(&iwe_buf, pos, sizeof(struct iw_event));
+		if(drv->we_version_compiled > 18)
+			memcpy(iwe, pos, IW_EV_LCP_LEN);
+		else
+			memcpy(iwe, pos, sizeof(struct iw_event));
 		if (iwe->len <= IW_EV_LCP_LEN)
 			break;
 		switch (iwe->cmd) {
 		case SIOCGIWAP:
+			if(drv->we_version_compiled > 18)
+				memcpy((char *)iwe + IW_EV_LCP_LEN, pos + IW_EV_LCP_LEN, sizeof(union iwreq_data)); 
 			if (!first)
 				ap_num++;
 			first = 0;
@@ -865,6 +872,8 @@ int wpa_driver_wext_get_scan_results(voi
 			}
 			break;
 		case SIOCGIWMODE:
+			if(drv->we_version_compiled > 18)
+				memcpy((char *)iwe + IW_EV_LCP_LEN, pos + IW_EV_LCP_LEN, sizeof(union iwreq_data)); 
 			if (ap_num >= max_size)
 				break;
 			if (iwe->u.mode == IW_MODE_ADHOC)
@@ -874,6 +883,8 @@ int wpa_driver_wext_get_scan_results(voi
 				results[ap_num].caps |= IEEE80211_CAP_ESS;
 			break;
 		case SIOCGIWESSID:
+			if(drv->we_version_compiled > 18)
+				memcpy((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF, pos + IW_EV_LCP_LEN, sizeof(union iwreq_data)); 
 			ssid_len = iwe->u.essid.length;
 			custom = pos + IW_EV_POINT_LEN;
 			if (custom + ssid_len > end)
@@ -889,6 +900,8 @@ int wpa_driver_wext_get_scan_results(voi
 			}
 			break;
 		case SIOCGIWFREQ:
+			if(drv->we_version_compiled > 18)
+				memcpy((char *)iwe + IW_EV_LCP_LEN, pos + IW_EV_LCP_LEN, sizeof(union iwreq_data)); 
 			if (ap_num < max_size) {
 				int div = 1000001, i;
 				if (iwe->u.freq.e > 6) {
@@ -906,6 +919,8 @@ int wpa_driver_wext_get_scan_results(voi
 			}
 			break;
 		case IWEVQUAL:
+			if(drv->we_version_compiled > 18)
+				memcpy((char *)iwe + IW_EV_LCP_LEN, pos + IW_EV_LCP_LEN, sizeof(union iwreq_data)); 
 			if (ap_num < max_size) {
 				results[ap_num].qual = iwe->u.qual.qual;
 				results[ap_num].noise = iwe->u.qual.noise;
@@ -913,11 +928,15 @@ int wpa_driver_wext_get_scan_results(voi
 			}
 			break;
 		case SIOCGIWENCODE:
+			if(drv->we_version_compiled > 18)
+				memcpy((char *)iwe + IW_EV_LCP_LEN, pos + IW_EV_LCP_LEN, sizeof(union iwreq_data)); 
 			if (ap_num < max_size &&
 			    !(iwe->u.data.flags & IW_ENCODE_DISABLED))
 				results[ap_num].caps |= IEEE80211_CAP_PRIVACY;
 			break;
 		case SIOCGIWRATE:
+			if(drv->we_version_compiled > 18)
+				memcpy((char *)iwe + IW_EV_LCP_LEN, pos + IW_EV_LCP_LEN, sizeof(union iwreq_data)); 
 			custom = pos + IW_EV_LCP_LEN;
 			clen = iwe->len;
 			if (custom + clen > end)
@@ -936,6 +955,8 @@ int wpa_driver_wext_get_scan_results(voi
 				results[ap_num].maxrate = maxrate;
 			break;
 		case IWEVGENIE:
+			if(drv->we_version_compiled > 18)
+				memcpy((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF, pos + IW_EV_LCP_LEN, sizeof(union iwreq_data)); 
 			if (ap_num >= max_size)
 				break;
 			gpos = genie = pos + IW_EV_POINT_LEN;
@@ -971,6 +992,8 @@ int wpa_driver_wext_get_scan_results(voi
 			}
 			break;
 		case IWEVCUSTOM:
+			if(drv->we_version_compiled > 18)
+				memcpy((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF, pos + IW_EV_LCP_LEN, sizeof(union iwreq_data)); 
 			custom = pos + IW_EV_POINT_LEN;
 			clen = iwe->u.data.length;
 			if (custom + clen > end)
@@ -1055,6 +1078,7 @@ static int wpa_driver_wext_get_range(voi
 	if (ioctl(drv->ioctl_sock, SIOCGIWRANGE, &iwr) < 0) {
 		perror("ioctl[SIOCGIWRANGE]");
 		return -1;
+	drv->we_version_compiled = range.we_version_compiled;
 	} else if (iwr.u.data.length >= minlen &&
 		   range.we_version_compiled >= 18) {
 		wpa_printf(MSG_DEBUG, "SIOCGIWRANGE: WE(compiled)=%d "
diff -Naurp wpa_supplicant-0.4.4/wireless_copy.h wpa_supplicant-0.4.4.new/wireless_copy.h
--- wpa_supplicant-0.4.4/wireless_copy.h	2005-08-21 21:24:43.000000000 +0200
+++ wpa_supplicant-0.4.4.new/wireless_copy.h	2005-09-08 23:13:59.000000000 +0200
@@ -8,7 +8,7 @@
 /*
  * This file define a set of standard wireless extensions
  *
- * Version :	18	12.3.05
+ * Version :	19	18.3.05
  *
  * Authors :	Jean Tourrilhes - HPL - <jt at hpl.hp.com>
  * Copyright (c) 1997-2005 Jean Tourrilhes, All Rights Reserved.
@@ -103,7 +103,7 @@ typedef __uint8_t __u8;
  * (there is some stuff that will be added in the future...)
  * I just plan to increment with each new version.
  */
-#define WIRELESS_EXT	18
+#define WIRELESS_EXT	19
 
 /*
  * Changes :
@@ -218,6 +218,15 @@ typedef __uint8_t __u8;
  *	  related parameters (extensible up to 4096 parameter values)
  *	- Add wireless events: IWEVGENIE, IWEVMICHAELMICFAILURE,
  *	  IWEVASSOCREQIE, IWEVASSOCRESPIE, IWEVPMKIDCAND
+ *
+ * V18 to V19
+ * ----------
+ *	- Remove (struct iw_point *)->pointer from events and streams
+ *	- Remove header includes to help user space
+ *	- Increase IW_ENCODING_TOKEN_MAX from 32 to 64
+ *	- Add IW_QUAL_ALL_UPDATED and IW_QUAL_ALL_INVALID macros
+ *	- Add explicit flag to tell stats are in dBm : IW_QUAL_DBM
+ *	- Add IW_IOCTL_IDX() and IW_EVENT_IDX() macros
  */
 
 /**************************** CONSTANTS ****************************/
@@ -343,6 +352,7 @@ typedef __uint8_t __u8;
 /* The first and the last (range) */
 #define SIOCIWFIRST	0x8B00
 #define SIOCIWLAST	SIOCIWLASTPRIV		/* 0x8BFF */
+#define IW_IOCTL_IDX(cmd)	((cmd) - SIOCIWFIRST)
 
 /* Even : get (world access), odd : set (root access) */
 #define IW_IS_SET(cmd)	(!((cmd) & 0x1))
@@ -387,6 +397,7 @@ typedef __uint8_t __u8;
 					 * (struct iw_pmkid_cand) */
 
 #define IWEVFIRST	0x8C00
+#define IW_EVENT_IDX(cmd)	((cmd) - IWEVFIRST)
 
 /* ------------------------- PRIVATE INFO ------------------------- */
 /*
@@ -448,12 +459,15 @@ typedef __uint8_t __u8;
 #define IW_MODE_MONITOR	6	/* Passive monitor (listen only) */
 
 /* Statistics flags (bitmask in updated) */
-#define IW_QUAL_QUAL_UPDATED	0x1	/* Value was updated since last read */
-#define IW_QUAL_LEVEL_UPDATED	0x2
-#define IW_QUAL_NOISE_UPDATED	0x4
+#define IW_QUAL_QUAL_UPDATED	0x01	/* Value was updated since last read */
+#define IW_QUAL_LEVEL_UPDATED	0x02
+#define IW_QUAL_NOISE_UPDATED	0x04
+#define IW_QUAL_ALL_UPDATED	0x07
+#define IW_QUAL_DBM		0x08	/* Level + Noise are dBm */
 #define IW_QUAL_QUAL_INVALID	0x10	/* Driver doesn't provide value */
 #define IW_QUAL_LEVEL_INVALID	0x20
 #define IW_QUAL_NOISE_INVALID	0x40
+#define IW_QUAL_ALL_INVALID	0x70
 
 /* Frequency flags */
 #define IW_FREQ_AUTO		0x00	/* Let the driver decides */
@@ -464,7 +478,7 @@ typedef __uint8_t __u8;
 #define IW_MAX_ENCODING_SIZES	8
 
 /* Maximum size of the encoding token in bytes */
-#define IW_ENCODING_TOKEN_MAX	32	/* 256 bits (for now) */
+#define IW_ENCODING_TOKEN_MAX	64	/* 512 bits (for now) */
 
 /* Flags for encoding (along with the token) */
 #define IW_ENCODE_INDEX		0x00FF	/* Token index (if needed) */
@@ -1060,12 +1074,16 @@ struct iw_event
 #define IW_EV_CHAR_LEN	(IW_EV_LCP_LEN + IFNAMSIZ)
 #define IW_EV_UINT_LEN	(IW_EV_LCP_LEN + sizeof(__u32))
 #define IW_EV_FREQ_LEN	(IW_EV_LCP_LEN + sizeof(struct iw_freq))
-#define IW_EV_POINT_LEN	(IW_EV_LCP_LEN + sizeof(struct iw_point))
 #define IW_EV_PARAM_LEN	(IW_EV_LCP_LEN + sizeof(struct iw_param))
 #define IW_EV_ADDR_LEN	(IW_EV_LCP_LEN + sizeof(struct sockaddr))
 #define IW_EV_QUAL_LEN	(IW_EV_LCP_LEN + sizeof(struct iw_quality))
 
-/* Note : in the case of iw_point, the extra data will come at the
- * end of the event */
+/* iw_point events are special. First, the payload (extra data) come at
+ * the end of the event, so they are bigger than IW_EV_POINT_LEN. Second,
+ * we omit the pointer, so start at an offset. */
+#define IW_EV_POINT_OFF (((char *) &(((struct iw_point *) NULL)->length)) - \
+			  (char *) NULL)
+#define IW_EV_POINT_LEN	(IW_EV_LCP_LEN + sizeof(struct iw_point) - \
+			 IW_EV_POINT_OFF)
 
 #endif	/* _LINUX_WIRELESS_H */




More information about the Hostap mailing list