diff options
| author | James Ketrenos <jketreno@linux.intel.com> | 2005-09-21 11:54:36 -0500 | 
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-09-21 23:02:30 -0400 | 
| commit | ee34af37c095482b9dba254b9cd7cb5e65e9a25e (patch) | |
| tree | eed75aee11663053e658d839fb91bc8dfae56ecb | |
| parent | e0d369d1d969fc9e4fd08a20f6dad04d369aceea (diff) | |
| download | olio-linux-3.10-ee34af37c095482b9dba254b9cd7cb5e65e9a25e.tar.xz olio-linux-3.10-ee34af37c095482b9dba254b9cd7cb5e65e9a25e.zip  | |
[PATCH] ieee80211: Renamed ieee80211_hdr to ieee80211_hdr_3addr
tree e9c18b2c8e5ad446a4d213243c2dcf9fd1652a7b
parent 4e97ad6ae7084a4f741e94e76c41c68bc7c5a76a
author James Ketrenos <jketreno@linux.intel.com> 1124444315 -0500
committer James Ketrenos <jketreno@linux.intel.com> 1127312922 -0500
Renamed ieee80211_hdr to ieee80211_hdr_3addr and modified ieee80211_hdr
to just contain the frame_ctrl and duration_id.
Changed uses of ieee80211_hdr to ieee80211_hdr_4addr or
ieee80211_hdr_3addr based on what was expected for that portion of code.
NOTE: This requires changes to ipw2100, ipw2200, hostap, and atmel
drivers.
Signed-off-by: James Ketrenos <jketreno@linux.intel.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
| -rw-r--r-- | include/net/ieee80211.h | 117 | ||||
| -rw-r--r-- | net/ieee80211/ieee80211_crypt_ccmp.c | 10 | ||||
| -rw-r--r-- | net/ieee80211/ieee80211_crypt_tkip.c | 27 | ||||
| -rw-r--r-- | net/ieee80211/ieee80211_rx.c | 32 | ||||
| -rw-r--r-- | net/ieee80211/ieee80211_tx.c | 7 | 
5 files changed, 129 insertions, 64 deletions
diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h index dfc5d65cc6c..ebe7e41e5ea 100644 --- a/include/net/ieee80211.h +++ b/include/net/ieee80211.h @@ -33,33 +33,13 @@     represents the 2304 bytes of real data, plus a possible 8 bytes of     WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ -#define IEEE80211_HLEN			30 -#define IEEE80211_FRAME_LEN		(IEEE80211_DATA_LEN + IEEE80211_HLEN) - -struct ieee80211_hdr { -	__le16 frame_ctl; -	__le16 duration_id; -	u8 addr1[ETH_ALEN]; -	u8 addr2[ETH_ALEN]; -	u8 addr3[ETH_ALEN]; -	__le16 seq_ctl; -	u8 addr4[ETH_ALEN]; -} __attribute__ ((packed)); - -struct ieee80211_hdr_3addr { -	__le16 frame_ctl; -	__le16 duration_id; -	u8 addr1[ETH_ALEN]; -	u8 addr2[ETH_ALEN]; -	u8 addr3[ETH_ALEN]; -	__le16 seq_ctl; -} __attribute__ ((packed)); -  #define IEEE80211_1ADDR_LEN 10  #define IEEE80211_2ADDR_LEN 16  #define IEEE80211_3ADDR_LEN 24  #define IEEE80211_4ADDR_LEN 30  #define IEEE80211_FCS_LEN    4 +#define IEEE80211_HLEN			(IEEE80211_4ADDR_LEN) +#define IEEE80211_FRAME_LEN		(IEEE80211_DATA_LEN + IEEE80211_HLEN)  #define MIN_FRAG_THRESHOLD     256U  #define	MAX_FRAG_THRESHOLD     2346U @@ -515,6 +495,51 @@ enum ieee80211_mfie {  	MFIE_TYPE_GENERIC = 221,  }; +/* Minimal header; can be used for passing 802.11 frames with sufficient + * information to determine what type of underlying data type is actually + * stored in the data. */ +struct ieee80211_hdr { +	u16 frame_ctl; +	u16 duration_id; +	u8 payload[0]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_1addr { +	u16 frame_ctl; +	u16 duration_id; +	u8 addr1[ETH_ALEN]; +	u8 payload[0]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_2addr { +	u16 frame_ctl; +	u16 duration_id; +	u8 addr1[ETH_ALEN]; +	u8 addr2[ETH_ALEN]; +	u8 payload[0]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_3addr { +	u16 frame_ctl; +	u16 duration_id; +	u8 addr1[ETH_ALEN]; +	u8 addr2[ETH_ALEN]; +	u8 addr3[ETH_ALEN]; +	u16 seq_ctl; +	u8 payload[0]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_4addr { +	u16 frame_ctl; +	u16 duration_id; +	u8 addr1[ETH_ALEN]; +	u8 addr2[ETH_ALEN]; +	u8 addr3[ETH_ALEN]; +	u16 seq_ctl; +	u8 addr4[ETH_ALEN]; +	u8 payload[0]; +} __attribute__ ((packed)); +  struct ieee80211_info_element {  	u8 id;  	u8 len; @@ -538,7 +563,7 @@ struct ieee80211_info_element {  	u16 status;  */ -struct ieee80211_authentication { +struct ieee80211_auth {  	struct ieee80211_hdr_3addr header;  	__le16 algorithm;  	__le16 transaction; @@ -546,6 +571,17 @@ struct ieee80211_authentication {  	struct ieee80211_info_element info_element[0];  } __attribute__ ((packed)); +struct ieee80211_disassoc { +	struct ieee80211_hdr_3addr header; +	u16 reason_code; +	struct ieee80211_info_element info_element[0]; +} __attribute__ ((packed)); + +struct ieee80211_probe_request { +	struct ieee80211_hdr_3addr header; +	struct ieee80211_info_element info_element[0]; +} __attribute__ ((packed)); +  struct ieee80211_probe_response {  	struct ieee80211_hdr_3addr header;  	u32 time_stamp[2]; @@ -554,14 +590,25 @@ struct ieee80211_probe_response {  	struct ieee80211_info_element info_element[0];  } __attribute__ ((packed)); -struct ieee80211_assoc_request_frame { +/* Alias beacon for probe_response */ +#define ieee80211_beacon ieee80211_probe_response + +struct ieee80211_assoc_request { +	struct ieee80211_hdr_3addr header; +	u16 capability; +	u16 listen_interval; +	struct ieee80211_info_element info_element[0]; +} __attribute__ ((packed)); + +struct ieee80211_reassoc_request { +	struct ieee80211_hdr_3addr header;  	__le16 capability;  	__le16 listen_interval;  	u8 current_ap[ETH_ALEN];  	struct ieee80211_info_element info_element[0];  } __attribute__ ((packed)); -struct ieee80211_assoc_response_frame { +struct ieee80211_assoc_response {  	struct ieee80211_hdr_3addr header;  	__le16 capability;  	__le16 status; @@ -572,7 +619,8 @@ struct ieee80211_assoc_response_frame {  struct ieee80211_txb {  	u8 nr_frags;  	u8 encrypted; -	u16 reserved; +	u8 rts_included; +	u8 reserved;  	u16 frag_size;  	u16 payload_size;  	struct sk_buff *fragments[0]; @@ -803,6 +851,21 @@ extern inline int ieee80211_get_hdrlen(u16 fc)  	return hdrlen;  } +extern inline u8 *ieee80211_get_payload(struct ieee80211_hdr *hdr) +{ +	switch (ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl))) { +	case IEEE80211_1ADDR_LEN: +		return ((struct ieee80211_hdr_1addr *)hdr)->payload; +	case IEEE80211_2ADDR_LEN: +		return ((struct ieee80211_hdr_2addr *)hdr)->payload; +	case IEEE80211_3ADDR_LEN: +		return ((struct ieee80211_hdr_3addr *)hdr)->payload; +	case IEEE80211_4ADDR_LEN: +		return ((struct ieee80211_hdr_4addr *)hdr)->payload; +	} + +} +  /* ieee80211.c */  extern void free_ieee80211(struct net_device *dev);  extern struct net_device *alloc_ieee80211(int sizeof_priv); @@ -817,7 +880,7 @@ extern void ieee80211_txb_free(struct ieee80211_txb *);  extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,  			struct ieee80211_rx_stats *rx_stats);  extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, -			     struct ieee80211_hdr *header, +			     struct ieee80211_hdr_4addr *header,  			     struct ieee80211_rx_stats *stats);  /* ieee80211_wx.c */ diff --git a/net/ieee80211/ieee80211_crypt_ccmp.c b/net/ieee80211/ieee80211_crypt_ccmp.c index 1e6644b133d..d3b5cdee69e 100644 --- a/net/ieee80211/ieee80211_crypt_ccmp.c +++ b/net/ieee80211/ieee80211_crypt_ccmp.c @@ -119,7 +119,7 @@ static inline void xor_block(u8 * b, u8 * a, size_t len)  }  static void ccmp_init_blocks(struct crypto_tfm *tfm, -			     struct ieee80211_hdr *hdr, +			     struct ieee80211_hdr_4addr *hdr,  			     u8 * pn, size_t dlen, u8 * b0, u8 * auth, u8 * s0)  {  	u8 *pos, qc = 0; @@ -196,7 +196,7 @@ static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv)  	struct ieee80211_ccmp_data *key = priv;  	int data_len, i, blocks, last, len;  	u8 *pos, *mic; -	struct ieee80211_hdr *hdr; +	struct ieee80211_hdr_4addr *hdr;  	u8 *b0 = key->tx_b0;  	u8 *b = key->tx_b;  	u8 *e = key->tx_e; @@ -229,7 +229,7 @@ static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv)  	*pos++ = key->tx_pn[1];  	*pos++ = key->tx_pn[0]; -	hdr = (struct ieee80211_hdr *)skb->data; +	hdr = (struct ieee80211_hdr_4addr *)skb->data;  	ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0);  	blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; @@ -258,7 +258,7 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv)  {  	struct ieee80211_ccmp_data *key = priv;  	u8 keyidx, *pos; -	struct ieee80211_hdr *hdr; +	struct ieee80211_hdr_4addr *hdr;  	u8 *b0 = key->rx_b0;  	u8 *b = key->rx_b;  	u8 *a = key->rx_a; @@ -272,7 +272,7 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv)  		return -1;  	} -	hdr = (struct ieee80211_hdr *)skb->data; +	hdr = (struct ieee80211_hdr_4addr *)skb->data;  	pos = skb->data + hdr_len;  	keyidx = pos[3];  	if (!(keyidx & (1 << 5))) { diff --git a/net/ieee80211/ieee80211_crypt_tkip.c b/net/ieee80211/ieee80211_crypt_tkip.c index 0c495f07e71..f091aacd429 100644 --- a/net/ieee80211/ieee80211_crypt_tkip.c +++ b/net/ieee80211/ieee80211_crypt_tkip.c @@ -265,11 +265,11 @@ static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)  	struct ieee80211_tkip_data *tkey = priv;  	int len;  	u8 rc4key[16], *pos, *icv; -	struct ieee80211_hdr *hdr; +	struct ieee80211_hdr_4addr *hdr;  	u32 crc;  	struct scatterlist sg; -	hdr = (struct ieee80211_hdr *)skb->data; +	hdr = (struct ieee80211_hdr_4addr *)skb->data;  	if (tkey->ieee->tkip_countermeasures) {  		if (net_ratelimit()) { @@ -334,13 +334,13 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)  	u8 keyidx, *pos;  	u32 iv32;  	u16 iv16; -	struct ieee80211_hdr *hdr; +	struct ieee80211_hdr_4addr *hdr;  	u8 icv[4];  	u32 crc;  	struct scatterlist sg;  	int plen; -	hdr = (struct ieee80211_hdr *)skb->data; +	hdr = (struct ieee80211_hdr_4addr *)skb->data;  	if (tkey->ieee->tkip_countermeasures) {  		if (net_ratelimit()) { @@ -466,9 +466,9 @@ static int michael_mic(struct ieee80211_tkip_data *tkey, u8 * key, u8 * hdr,  static void michael_mic_hdr(struct sk_buff *skb, u8 * hdr)  { -	struct ieee80211_hdr *hdr11; +	struct ieee80211_hdr_4addr *hdr11; -	hdr11 = (struct ieee80211_hdr *)skb->data; +	hdr11 = (struct ieee80211_hdr_4addr *)skb->data;  	switch (le16_to_cpu(hdr11->frame_ctl) &  		(IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {  	case IEEE80211_FCTL_TODS: @@ -517,7 +517,8 @@ static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len,  #if WIRELESS_EXT >= 18  static void ieee80211_michael_mic_failure(struct net_device *dev, -					  struct ieee80211_hdr *hdr, int keyidx) +					  struct ieee80211_hdr_4addr *hdr, +					  int keyidx)  {  	union iwreq_data wrqu;  	struct iw_michaelmicfailure ev; @@ -537,7 +538,8 @@ static void ieee80211_michael_mic_failure(struct net_device *dev,  }  #elif WIRELESS_EXT >= 15  static void ieee80211_michael_mic_failure(struct net_device *dev, -					  struct ieee80211_hdr *hdr, int keyidx) +					  struct ieee80211_hdr_4addr *hdr, +					  int keyidx)  {  	union iwreq_data wrqu;  	char buf[128]; @@ -551,9 +553,8 @@ static void ieee80211_michael_mic_failure(struct net_device *dev,  	wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);  }  #else				/* WIRELESS_EXT >= 15 */ -static inline void ieee80211_michael_mic_failure(struct net_device *dev, -						 struct ieee80211_hdr *hdr, -						 int keyidx) +static inline void ieee80211_michael_mic_failure(struct net_device *dev, struct ieee80211_hdr_4addr +						 *hdr, int keyidx)  {  }  #endif				/* WIRELESS_EXT >= 15 */ @@ -572,8 +573,8 @@ static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx,  			skb->data + hdr_len, skb->len - 8 - hdr_len, mic))  		return -1;  	if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { -		struct ieee80211_hdr *hdr; -		hdr = (struct ieee80211_hdr *)skb->data; +		struct ieee80211_hdr_4addr *hdr; +		hdr = (struct ieee80211_hdr_4addr *)skb->data;  		printk(KERN_DEBUG "%s: Michael MIC verification failed for "  		       "MSDU from " MAC_FMT " keyidx=%d\n",  		       skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2), diff --git a/net/ieee80211/ieee80211_rx.c b/net/ieee80211/ieee80211_rx.c index 9a125d45289..71d14c7d915 100644 --- a/net/ieee80211/ieee80211_rx.c +++ b/net/ieee80211/ieee80211_rx.c @@ -87,7 +87,7 @@ static struct ieee80211_frag_entry *ieee80211_frag_cache_find(struct  /* Called only as a tasklet (software IRQ) */  static struct sk_buff *ieee80211_frag_cache_get(struct ieee80211_device *ieee, -						struct ieee80211_hdr *hdr) +						struct ieee80211_hdr_4addr *hdr)  {  	struct sk_buff *skb = NULL;  	u16 sc; @@ -101,7 +101,7 @@ static struct sk_buff *ieee80211_frag_cache_get(struct ieee80211_device *ieee,  	if (frag == 0) {  		/* Reserve enough space to fit maximum frame length */  		skb = dev_alloc_skb(ieee->dev->mtu + -				    sizeof(struct ieee80211_hdr) + +				    sizeof(struct ieee80211_hdr_4addr) +  				    8 /* LLC */  +  				    2 /* alignment */  +  				    8 /* WEP */  + ETH_ALEN /* WDS */ ); @@ -138,7 +138,7 @@ static struct sk_buff *ieee80211_frag_cache_get(struct ieee80211_device *ieee,  /* Called only as a tasklet (software IRQ) */  static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, -					   struct ieee80211_hdr *hdr) +					   struct ieee80211_hdr_4addr *hdr)  {  	u16 sc;  	unsigned int seq; @@ -176,7 +176,7 @@ ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb,  		       ieee->dev->name);  		return 0;  /* -  hostap_update_sta_ps(ieee, (struct hostap_ieee80211_hdr *) +  hostap_update_sta_ps(ieee, (struct hostap_ieee80211_hdr_4addr *)    skb->data);*/  	} @@ -232,13 +232,13 @@ static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee,  {  	struct net_device *dev = ieee->dev;  	u16 fc, ethertype; -	struct ieee80211_hdr *hdr; +	struct ieee80211_hdr_3addr *hdr;  	u8 *pos;  	if (skb->len < 24)  		return 0; -	hdr = (struct ieee80211_hdr *)skb->data; +	hdr = (struct ieee80211_hdr_3addr *)skb->data;  	fc = le16_to_cpu(hdr->frame_ctl);  	/* check that the frame is unicast frame to us */ @@ -271,13 +271,13 @@ static inline int  ieee80211_rx_frame_decrypt(struct ieee80211_device *ieee, struct sk_buff *skb,  			   struct ieee80211_crypt_data *crypt)  { -	struct ieee80211_hdr *hdr; +	struct ieee80211_hdr_3addr *hdr;  	int res, hdrlen;  	if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL)  		return 0; -	hdr = (struct ieee80211_hdr *)skb->data; +	hdr = (struct ieee80211_hdr_3addr *)skb->data;  	hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));  	atomic_inc(&crypt->refcnt); @@ -303,13 +303,13 @@ ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device *ieee,  				struct sk_buff *skb, int keyidx,  				struct ieee80211_crypt_data *crypt)  { -	struct ieee80211_hdr *hdr; +	struct ieee80211_hdr_3addr *hdr;  	int res, hdrlen;  	if (crypt == NULL || crypt->ops->decrypt_msdu == NULL)  		return 0; -	hdr = (struct ieee80211_hdr *)skb->data; +	hdr = (struct ieee80211_hdr_3addr *)skb->data;  	hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));  	atomic_inc(&crypt->refcnt); @@ -332,7 +332,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,  		 struct ieee80211_rx_stats *rx_stats)  {  	struct net_device *dev = ieee->dev; -	struct ieee80211_hdr *hdr; +	struct ieee80211_hdr_4addr *hdr;  	size_t hdrlen;  	u16 fc, type, stype, sc;  	struct net_device_stats *stats; @@ -352,7 +352,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,  	struct ieee80211_crypt_data *crypt = NULL;  	int keyidx = 0; -	hdr = (struct ieee80211_hdr *)skb->data; +	hdr = (struct ieee80211_hdr_4addr *)skb->data;  	stats = &ieee->stats;  	if (skb->len < 10) { @@ -552,7 +552,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,  	    (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0)  		goto rx_dropped; -	hdr = (struct ieee80211_hdr *)skb->data; +	hdr = (struct ieee80211_hdr_4addr *)skb->data;  	/* skb: hdr + (possibly fragmented) plaintext payload */  	// PR: FIXME: hostap has additional conditions in the "if" below: @@ -606,7 +606,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,  		/* this was the last fragment and the frame will be  		 * delivered, so remove skb from fragment cache */  		skb = frag_skb; -		hdr = (struct ieee80211_hdr *)skb->data; +		hdr = (struct ieee80211_hdr_4addr *)skb->data;  		ieee80211_frag_cache_invalidate(ieee, hdr);  	} @@ -616,7 +616,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,  	    ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt))  		goto rx_dropped; -	hdr = (struct ieee80211_hdr *)skb->data; +	hdr = (struct ieee80211_hdr_4addr *)skb->data;  	if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep) {  		if (		/*ieee->ieee802_1x && */  			   ieee80211_is_eapol_frame(ieee, skb)) { @@ -1148,7 +1148,7 @@ static inline void ieee80211_process_probe_response(struct ieee80211_device  }  void ieee80211_rx_mgt(struct ieee80211_device *ieee, -		      struct ieee80211_hdr *header, +		      struct ieee80211_hdr_4addr *header,  		      struct ieee80211_rx_stats *stats)  {  	switch (WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl))) { diff --git a/net/ieee80211/ieee80211_tx.c b/net/ieee80211/ieee80211_tx.c index 785e76f7e4e..29770cfefc3 100644 --- a/net/ieee80211/ieee80211_tx.c +++ b/net/ieee80211/ieee80211_tx.c @@ -227,14 +227,14 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev)  {  	struct ieee80211_device *ieee = netdev_priv(dev);  	struct ieee80211_txb *txb = NULL; -	struct ieee80211_hdr *frag_hdr; +	struct ieee80211_hdr_3addr *frag_hdr;  	int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size;  	unsigned long flags;  	struct net_device_stats *stats = &ieee->stats;  	int ether_type, encrypt, host_encrypt;  	int bytes, fc, hdr_len;  	struct sk_buff *skb_frag; -	struct ieee80211_hdr header = {	/* Ensure zero initialized */ +	struct ieee80211_hdr_3addr header = {	/* Ensure zero initialized */  		.duration_id = 0,  		.seq_ctl = 0  	}; @@ -352,7 +352,8 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev)  		if (host_encrypt)  			skb_reserve(skb_frag, crypt->ops->extra_prefix_len); -		frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len); +		frag_hdr = +		    (struct ieee80211_hdr_3addr *)skb_put(skb_frag, hdr_len);  		memcpy(frag_hdr, &header, hdr_len);  		/* If this is not the last fragment, then add the MOREFRAGS  |