All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.