* [PATCH wireless-dev 5/5] airo: Switch to d80211.h
@ 2006-07-24 3:50 Michael Wu
2006-07-24 3:59 ` Jeff Garzik
0 siblings, 1 reply; 2+ messages in thread
From: Michael Wu @ 2006-07-24 3:50 UTC (permalink / raw)
To: linville; +Cc: Jiri Benc, netdev
[-- Attachment #1: Type: text/plain, Size: 6675 bytes --]
airo: Switch to d80211.h
This patch "converts" the airo driver to use d80211.h instead of
ieee80211.h. It also adds struct ieee80211_info_element and
modifies d80211 to use that.
Signed-off-by: Michael Wu <flamingice@sourmilk.net>
---
drivers/net/wireless/airo.c | 15 ++++----
include/net/d80211.h | 6 +++
net/d80211/ieee80211_sta.c | 85 +++++++++++++++++++++----------------------
3 files changed, 54 insertions(+), 52 deletions(-)
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
index a4dd139..c08767a 100644
--- a/drivers/net/wireless/airo.c
+++ b/drivers/net/wireless/airo.c
@@ -46,7 +46,8 @@ #include <linux/if_arp.h>
#include <linux/ioport.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
-#include <net/ieee80211.h>
+#include <net/d80211.h>
+#include <net/d80211_mgmt.h>
#include "airo.h"
@@ -7317,31 +7318,29 @@ static inline char *airo_translate_scan(
}
switch (info_element->id) {
- case MFIE_TYPE_SSID:
+ case WLAN_EID_SSID:
/* Two zero-length SSID elements
* mean we're done parsing elements */
if (!info_element->len)
num_null_ies++;
break;
- case MFIE_TYPE_GENERIC:
+ case WLAN_EID_GENERIC:
if (info_element->len >= 4 &&
info_element->data[0] == 0x00 &&
info_element->data[1] == 0x50 &&
info_element->data[2] == 0xf2 &&
info_element->data[3] == 0x01) {
iwe.cmd = IWEVGENIE;
- iwe.u.data.length = min(info_element->len + 2,
- MAX_WPA_IE_LEN);
+ iwe.u.data.length = min(info_element->len + 2, 64);
current_ev = iwe_stream_add_point(current_ev, end_buf,
&iwe, (char *) info_element);
}
break;
- case MFIE_TYPE_RSN:
+ case WLAN_EID_RSN:
iwe.cmd = IWEVGENIE;
- iwe.u.data.length = min(info_element->len + 2,
- MAX_WPA_IE_LEN);
+ iwe.u.data.length = min(info_element->len + 2, 64);
current_ev = iwe_stream_add_point(current_ev, end_buf,
&iwe, (char *) info_element);
break;
diff --git a/include/net/d80211.h b/include/net/d80211.h
index 6bf1b08..10ef570 100644
--- a/include/net/d80211.h
+++ b/include/net/d80211.h
@@ -977,6 +977,12 @@ struct ieee80211_hdr {
u8 addr4[6];
} __attribute__ ((packed));
+struct ieee80211_info_element {
+ u8 id;
+ u8 len;
+ u8 data[0];
+} __attribute__ ((packed));
+
/* return a pointer to the source address (SA) */
static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
{
diff --git a/net/d80211/ieee80211_sta.c b/net/d80211/ieee80211_sta.c
index b0cfff1..d206b16 100644
--- a/net/d80211/ieee80211_sta.c
+++ b/net/d80211/ieee80211_sta.c
@@ -110,91 +110,88 @@ static ParseRes ieee802_11_parse_elems(u
struct ieee802_11_elems *elems)
{
size_t left = len;
- u8 *pos = start;
+ struct ieee80211_info_element *info = (struct ieee80211_info_element *) start;
int unknown = 0;
memset(elems, 0, sizeof(*elems));
while (left >= 2) {
- u8 id, elen;
-
- id = *pos++;
- elen = *pos++;
left -= 2;
- if (elen > left) {
+ if (info->len > left) {
#if 0
if (net_ratelimit())
printk(KERN_DEBUG "IEEE 802.11 element parse "
"failed (id=%d elen=%d left=%d)\n",
- id, elen, left);
+ info->id, info->len, left);
#endif
return ParseFailed;
}
- switch (id) {
+ switch (info->id) {
case WLAN_EID_SSID:
- elems->ssid = pos;
- elems->ssid_len = elen;
+ elems->ssid = info->data;
+ elems->ssid_len = info->len;
break;
case WLAN_EID_SUPP_RATES:
- elems->supp_rates = pos;
- elems->supp_rates_len = elen;
+ elems->supp_rates = info->data;
+ elems->supp_rates_len = info->len;
break;
case WLAN_EID_FH_PARAMS:
- elems->fh_params = pos;
- elems->fh_params_len = elen;
+ elems->fh_params = info->data;
+ elems->fh_params_len = info->len;
break;
case WLAN_EID_DS_PARAMS:
- elems->ds_params = pos;
- elems->ds_params_len = elen;
+ elems->ds_params = info->data;
+ elems->ds_params_len = info->len;
break;
case WLAN_EID_CF_PARAMS:
- elems->cf_params = pos;
- elems->cf_params_len = elen;
+ elems->cf_params = info->data;
+ elems->cf_params_len = info->len;
break;
case WLAN_EID_TIM:
- elems->tim = pos;
- elems->tim_len = elen;
+ elems->tim = info->data;
+ elems->tim_len = info->len;
break;
case WLAN_EID_IBSS_PARAMS:
- elems->ibss_params = pos;
- elems->ibss_params_len = elen;
+ elems->ibss_params = info->data;
+ elems->ibss_params_len = info->len;
break;
case WLAN_EID_CHALLENGE:
- elems->challenge = pos;
- elems->challenge_len = elen;
+ elems->challenge = info->data;
+ elems->challenge_len = info->len;
break;
case WLAN_EID_WPA:
- if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
- pos[2] == 0xf2) {
+ if (info->len >= 4 && info->data[0] == 0x00 &&
+ info->data[1] == 0x50 && info->data[2] == 0xf2) {
/* Microsoft OUI (00:50:F2) */
- if (pos[3] == 1) {
+ if (info->data[3] == 1) {
/* OUI Type 1 - WPA IE */
- elems->wpa = pos;
- elems->wpa_len = elen;
- } else if (elen >= 5 && pos[3] == 2) {
- if (pos[4] == 0) {
- elems->wmm_info = pos;
- elems->wmm_info_len = elen;
- } else if (pos[4] == 1) {
- elems->wmm_param = pos;
- elems->wmm_param_len = elen;
+ elems->wpa = info->data;
+ elems->wpa_len = info->len;
+ } else if (info->len >= 5 &&
+ info->data[3] == 2) {
+ if (info->data[4] == 0) {
+ elems->wmm_info = info->data;
+ elems->wmm_info_len = info->len;
+ } else if (info->data[4] == 1) {
+ elems->wmm_param = info->data;
+ elems->wmm_param_len = info->len;
}
}
}
break;
case WLAN_EID_RSN:
- elems->rsn = pos;
- elems->rsn_len = elen;
+ elems->rsn = info->data;
+ elems->rsn_len = info->len;
break;
case WLAN_EID_ERP_INFO:
- elems->erp_info = pos;
- elems->erp_info_len = elen;
+ elems->erp_info = info->data;
+ elems->erp_info_len = info->len;
break;
case WLAN_EID_EXT_SUPP_RATES:
- elems->ext_supp_rates = pos;
- elems->ext_supp_rates_len = elen;
+ elems->ext_supp_rates = info->data;
+ elems->ext_supp_rates_len = info->len;
break;
default:
#if 0
@@ -206,8 +203,8 @@ #endif
break;
}
- left -= elen;
- pos += elen;
+ left -= info->len;
+ info = (void *)info + sizeof(*info) + info->len;
}
/* Do not trigger error if left == 1 as Apple Airport base stations
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH wireless-dev 5/5] airo: Switch to d80211.h
2006-07-24 3:50 [PATCH wireless-dev 5/5] airo: Switch to d80211.h Michael Wu
@ 2006-07-24 3:59 ` Jeff Garzik
0 siblings, 0 replies; 2+ messages in thread
From: Jeff Garzik @ 2006-07-24 3:59 UTC (permalink / raw)
To: Michael Wu; +Cc: linville, Jiri Benc, netdev
Michael Wu wrote:
> airo: Switch to d80211.h
>
> This patch "converts" the airo driver to use d80211.h instead of
> ieee80211.h. It also adds struct ieee80211_info_element and
> modifies d80211 to use that.
>
> Signed-off-by: Michael Wu <flamingice@sourmilk.net>
> ---
>
> drivers/net/wireless/airo.c | 15 ++++----
> include/net/d80211.h | 6 +++
> net/d80211/ieee80211_sta.c | 85 +++++++++++++++++++++----------------------
> 3 files changed, 54 insertions(+), 52 deletions(-)
>
> diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
> index a4dd139..c08767a 100644
> --- a/drivers/net/wireless/airo.c
> +++ b/drivers/net/wireless/airo.c
> @@ -46,7 +46,8 @@ #include <linux/if_arp.h>
> #include <linux/ioport.h>
> #include <linux/pci.h>
> #include <asm/uaccess.h>
> -#include <net/ieee80211.h>
> +#include <net/d80211.h>
> +#include <net/d80211_mgmt.h>
>
> #include "airo.h"
>
> @@ -7317,31 +7318,29 @@ static inline char *airo_translate_scan(
> }
>
> switch (info_element->id) {
> - case MFIE_TYPE_SSID:
> + case WLAN_EID_SSID:
> /* Two zero-length SSID elements
> * mean we're done parsing elements */
> if (!info_element->len)
> num_null_ies++;
> break;
>
> - case MFIE_TYPE_GENERIC:
> + case WLAN_EID_GENERIC:
> if (info_element->len >= 4 &&
> info_element->data[0] == 0x00 &&
> info_element->data[1] == 0x50 &&
> info_element->data[2] == 0xf2 &&
> info_element->data[3] == 0x01) {
> iwe.cmd = IWEVGENIE;
> - iwe.u.data.length = min(info_element->len + 2,
> - MAX_WPA_IE_LEN);
> + iwe.u.data.length = min(info_element->len + 2, 64);
nak: converts named constant to magic number
> current_ev = iwe_stream_add_point(current_ev, end_buf,
> &iwe, (char *) info_element);
> }
> break;
>
> - case MFIE_TYPE_RSN:
> + case WLAN_EID_RSN:
> iwe.cmd = IWEVGENIE;
> - iwe.u.data.length = min(info_element->len + 2,
> - MAX_WPA_IE_LEN);
> + iwe.u.data.length = min(info_element->len + 2, 64);
ditto
> current_ev = iwe_stream_add_point(current_ev, end_buf,
> &iwe, (char *) info_element);
> break;
> diff --git a/include/net/d80211.h b/include/net/d80211.h
> index 6bf1b08..10ef570 100644
> --- a/include/net/d80211.h
> +++ b/include/net/d80211.h
> @@ -977,6 +977,12 @@ struct ieee80211_hdr {
> u8 addr4[6];
> } __attribute__ ((packed));
>
> +struct ieee80211_info_element {
> + u8 id;
> + u8 len;
> + u8 data[0];
> +} __attribute__ ((packed));
> +
> /* return a pointer to the source address (SA) */
> static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
> {
> diff --git a/net/d80211/ieee80211_sta.c b/net/d80211/ieee80211_sta.c
> index b0cfff1..d206b16 100644
> --- a/net/d80211/ieee80211_sta.c
> +++ b/net/d80211/ieee80211_sta.c
> @@ -110,91 +110,88 @@ static ParseRes ieee802_11_parse_elems(u
> struct ieee802_11_elems *elems)
> {
> size_t left = len;
> - u8 *pos = start;
> + struct ieee80211_info_element *info = (struct ieee80211_info_element *) start;
> int unknown = 0;
>
> memset(elems, 0, sizeof(*elems));
>
> while (left >= 2) {
> - u8 id, elen;
> -
> - id = *pos++;
> - elen = *pos++;
> left -= 2;
>
> - if (elen > left) {
> + if (info->len > left) {
> #if 0
> if (net_ratelimit())
> printk(KERN_DEBUG "IEEE 802.11 element parse "
> "failed (id=%d elen=%d left=%d)\n",
> - id, elen, left);
> + info->id, info->len, left);
> #endif
> return ParseFailed;
> }
>
> - switch (id) {
> + switch (info->id) {
> case WLAN_EID_SSID:
> - elems->ssid = pos;
> - elems->ssid_len = elen;
> + elems->ssid = info->data;
> + elems->ssid_len = info->len;
> break;
> case WLAN_EID_SUPP_RATES:
> - elems->supp_rates = pos;
> - elems->supp_rates_len = elen;
> + elems->supp_rates = info->data;
> + elems->supp_rates_len = info->len;
> break;
> case WLAN_EID_FH_PARAMS:
> - elems->fh_params = pos;
> - elems->fh_params_len = elen;
> + elems->fh_params = info->data;
> + elems->fh_params_len = info->len;
> break;
> case WLAN_EID_DS_PARAMS:
> - elems->ds_params = pos;
> - elems->ds_params_len = elen;
> + elems->ds_params = info->data;
> + elems->ds_params_len = info->len;
> break;
> case WLAN_EID_CF_PARAMS:
> - elems->cf_params = pos;
> - elems->cf_params_len = elen;
> + elems->cf_params = info->data;
> + elems->cf_params_len = info->len;
> break;
> case WLAN_EID_TIM:
> - elems->tim = pos;
> - elems->tim_len = elen;
> + elems->tim = info->data;
> + elems->tim_len = info->len;
> break;
> case WLAN_EID_IBSS_PARAMS:
> - elems->ibss_params = pos;
> - elems->ibss_params_len = elen;
> + elems->ibss_params = info->data;
> + elems->ibss_params_len = info->len;
> break;
> case WLAN_EID_CHALLENGE:
> - elems->challenge = pos;
> - elems->challenge_len = elen;
> + elems->challenge = info->data;
> + elems->challenge_len = info->len;
> break;
> case WLAN_EID_WPA:
> - if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
> - pos[2] == 0xf2) {
> + if (info->len >= 4 && info->data[0] == 0x00 &&
> + info->data[1] == 0x50 && info->data[2] == 0xf2) {
> /* Microsoft OUI (00:50:F2) */
> - if (pos[3] == 1) {
> + if (info->data[3] == 1) {
> /* OUI Type 1 - WPA IE */
> - elems->wpa = pos;
> - elems->wpa_len = elen;
> - } else if (elen >= 5 && pos[3] == 2) {
> - if (pos[4] == 0) {
> - elems->wmm_info = pos;
> - elems->wmm_info_len = elen;
> - } else if (pos[4] == 1) {
> - elems->wmm_param = pos;
> - elems->wmm_param_len = elen;
> + elems->wpa = info->data;
> + elems->wpa_len = info->len;
> + } else if (info->len >= 5 &&
> + info->data[3] == 2) {
> + if (info->data[4] == 0) {
> + elems->wmm_info = info->data;
> + elems->wmm_info_len = info->len;
> + } else if (info->data[4] == 1) {
> + elems->wmm_param = info->data;
> + elems->wmm_param_len = info->len;
> }
> }
> }
> break;
> case WLAN_EID_RSN:
> - elems->rsn = pos;
> - elems->rsn_len = elen;
> + elems->rsn = info->data;
> + elems->rsn_len = info->len;
> break;
> case WLAN_EID_ERP_INFO:
> - elems->erp_info = pos;
> - elems->erp_info_len = elen;
> + elems->erp_info = info->data;
> + elems->erp_info_len = info->len;
> break;
> case WLAN_EID_EXT_SUPP_RATES:
> - elems->ext_supp_rates = pos;
> - elems->ext_supp_rates_len = elen;
> + elems->ext_supp_rates = info->data;
> + elems->ext_supp_rates_len = info->len;
A lot of this patch would go away, if you simply assigned 'pos' and
'elen' local variables to values info->data and info->len, before all
these assignments.
Jeff
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2006-07-24 4:00 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-07-24 3:50 [PATCH wireless-dev 5/5] airo: Switch to d80211.h Michael Wu
2006-07-24 3:59 ` Jeff Garzik
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.