[wpa-supplicant] Wireless-extension v19
Benoit Boissinot
bboissin+hostap
Fri Sep 9 12:10:33 PDT 2005
On Fri, Sep 09, 2005 at 10:04:52AM -0700, Jean Tourrilhes wrote:
> On Fri, Sep 09, 2005 at 02:20:01PM +0200, Benoit Boissinot wrote:
> > 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 ?
>
> I believe the most appropriate fix would be to make this
> function use iw_extract_event_stream() available in iwlib.c, which
> does all this magic behind the scenes since WT-27-pre25 (available in
> all good distro).
> If you really want to roll your own, I believe the fix is
> first incomplete and second could be simplified.
> First, you would need to fix wpa_driver_wext_event_wireless()
> as well, as events have the exact same issue.
> Second, you could still copy unconditionally the event before
> the switch and only fixup the pointer events with memmove().
>
Thanks for the comments, here is a revised version (tested with WPA2/RSN
and 2.6.13-mm2).
regards,
Benoit
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 21:01:35.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;
};
@@ -409,12 +410,25 @@ static void wpa_driver_wext_event_wirele
}
break;
case IWEVMICHAELMICFAILURE:
+ custom = pos + IW_EV_POINT_LEN;
+ if(drv->we_version_compiled > 18) {
+ memmove((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
+ (char *)iwe + IW_EV_LCP_LEN,
+ sizeof(struct iw_point) - IW_EV_POINT_OFF);
+ custom -= IW_EV_POINT_OFF;
+ }
wpa_driver_wext_event_wireless_michaelmicfailure(
- drv, ctx, pos + IW_EV_POINT_LEN,
+ drv, ctx, custom,
iwe->u.data.length);
break;
case IWEVCUSTOM:
custom = pos + IW_EV_POINT_LEN;
+ if(drv->we_version_compiled > 18) {
+ memmove((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
+ (char *)iwe + IW_EV_LCP_LEN,
+ sizeof(struct iw_point) - IW_EV_POINT_OFF);
+ custom -= IW_EV_POINT_OFF;
+ }
if (custom + iwe->u.data.length > end)
return;
buf = malloc(iwe->u.data.length + 1);
@@ -431,18 +445,39 @@ static void wpa_driver_wext_event_wirele
wpa_supplicant_event(ctx, EVENT_SCAN_RESULTS, NULL);
break;
case IWEVASSOCREQIE:
+ custom = pos + IW_EV_POINT_LEN;
+ if(drv->we_version_compiled > 18) {
+ memmove((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
+ (char *)iwe + IW_EV_LCP_LEN,
+ sizeof(struct iw_point) - IW_EV_POINT_OFF);
+ custom -= IW_EV_POINT_OFF;
+ }
wpa_driver_wext_event_wireless_assocreqie(
- drv, ctx, pos + IW_EV_POINT_LEN,
+ drv, ctx, custom,
iwe->u.data.length);
break;
case IWEVASSOCRESPIE:
+ custom = pos + IW_EV_POINT_LEN;
+ if(drv->we_version_compiled > 18) {
+ memmove((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
+ (char *)iwe + IW_EV_LCP_LEN,
+ sizeof(struct iw_point) - IW_EV_POINT_OFF);
+ custom -= IW_EV_POINT_OFF;
+ }
wpa_driver_wext_event_wireless_assocrespie(
- drv, ctx, pos + IW_EV_POINT_LEN,
+ drv, ctx, custom,
iwe->u.data.length);
break;
case IWEVPMKIDCAND:
+ custom = pos + IW_EV_POINT_LEN;
+ if(drv->we_version_compiled > 18) {
+ memmove((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
+ (char *)iwe + IW_EV_LCP_LEN,
+ sizeof(struct iw_point) - IW_EV_POINT_OFF);
+ custom -= IW_EV_POINT_OFF;
+ }
wpa_driver_wext_event_wireless_pmkidcand(
- drv, ctx, pos + IW_EV_POINT_LEN,
+ drv, ctx, custom,
iwe->u.data.length);
break;
}
@@ -851,7 +886,7 @@ int wpa_driver_wext_get_scan_results(voi
int ssid_len;
/* Event data may be unaligned, so make a local, aligned copy
* before processing. */
- memcpy(&iwe_buf, pos, sizeof(struct iw_event));
+ memcpy(iwe, pos, sizeof(struct iw_event));
if (iwe->len <= IW_EV_LCP_LEN)
break;
switch (iwe->cmd) {
@@ -874,6 +909,10 @@ int wpa_driver_wext_get_scan_results(voi
results[ap_num].caps |= IEEE80211_CAP_ESS;
break;
case SIOCGIWESSID:
+ if(drv->we_version_compiled > 18)
+ memmove((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
+ (char *)iwe + IW_EV_LCP_LEN,
+ sizeof(struct iw_point) - IW_EV_POINT_OFF);
ssid_len = iwe->u.essid.length;
custom = pos + IW_EV_POINT_LEN;
if (custom + ssid_len > end)
@@ -936,6 +975,10 @@ int wpa_driver_wext_get_scan_results(voi
results[ap_num].maxrate = maxrate;
break;
case IWEVGENIE:
+ if(drv->we_version_compiled > 18)
+ memmove((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
+ (char *)iwe + IW_EV_LCP_LEN,
+ sizeof(struct iw_point) - IW_EV_POINT_OFF);
if (ap_num >= max_size)
break;
gpos = genie = pos + IW_EV_POINT_LEN;
@@ -971,6 +1014,10 @@ int wpa_driver_wext_get_scan_results(voi
}
break;
case IWEVCUSTOM:
+ if(drv->we_version_compiled > 18)
+ memmove((char *)iwe + IW_EV_LCP_LEN + IW_EV_POINT_OFF,
+ (char *)iwe + IW_EV_LCP_LEN,
+ sizeof(struct iw_point) - IW_EV_POINT_OFF);
custom = pos + IW_EV_POINT_LEN;
clen = iwe->u.data.length;
if (custom + clen > end)
@@ -1062,6 +1109,7 @@ static int wpa_driver_wext_get_range(voi
range.we_version_compiled, range.we_version_source,
range.enc_capa);
drv->has_capability = 1;
+ drv->we_version_compiled = range.we_version_compiled;
if (range.enc_capa & IW_ENC_CAPA_WPA) {
drv->capa.key_mgmt |= WPA_DRIVER_CAPA_KEY_MGMT_WPA |
WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK;
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