diff options
Diffstat (limited to 'drivers/staging/rtl8187se/ieee80211')
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/dot11d.c | 22 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/dot11d.h | 2 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211.h | 665 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c | 17 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_ccmp.c | 88 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_tkip.c | 324 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_wep.c | 125 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211_module.c | 88 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c | 512 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211_softmac.c | 1033 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211_softmac_wx.c | 30 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c | 270 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/ieee80211_wx.c | 129 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/internal.h | 115 | ||||
-rw-r--r-- | drivers/staging/rtl8187se/ieee80211/rtl_crypto.h | 399 |
15 files changed, 333 insertions, 3486 deletions
diff --git a/drivers/staging/rtl8187se/ieee80211/dot11d.c b/drivers/staging/rtl8187se/ieee80211/dot11d.c index 54bcdcf..309bb8b 100644 --- a/drivers/staging/rtl8187se/ieee80211/dot11d.c +++ b/drivers/staging/rtl8187se/ieee80211/dot11d.c @@ -1,4 +1,3 @@ -#ifdef ENABLE_DOT11D //----------------------------------------------------------------------------- // File: // Dot11d.c @@ -130,16 +129,6 @@ Dot11d_UpdateCountryIe( pDot11dInfo->State = DOT11D_STATE_LEARNED; } -void dump_chnl_map(u8 * channel_map) -{ - int i; - printk("Channel List:"); - for(i=1; i<= MAX_CHANNEL_NUMBER; i++) - if(channel_map[i] > 0) - printk(" %d(%d)", i, channel_map[i]); - printk("\n"); -} - u8 DOT11D_GetMaxTxPwrInDbm( struct ieee80211_device *dev, @@ -233,14 +222,3 @@ int ToLegalChannel( return default_chn; } - -#if 0 -EXPORT_SYMBOL(Dot11d_Init); -EXPORT_SYMBOL(Dot11d_Reset); -EXPORT_SYMBOL(Dot11d_UpdateCountryIe); -EXPORT_SYMBOL(DOT11D_GetMaxTxPwrInDbm); -EXPORT_SYMBOL(DOT11D_ScanComplete); -EXPORT_SYMBOL(IsLegalChannel); -EXPORT_SYMBOL(ToLegalChannel); -#endif -#endif diff --git a/drivers/staging/rtl8187se/ieee80211/dot11d.h b/drivers/staging/rtl8187se/ieee80211/dot11d.h index 82576b5..029c2ca 100644 --- a/drivers/staging/rtl8187se/ieee80211/dot11d.h +++ b/drivers/staging/rtl8187se/ieee80211/dot11d.h @@ -97,6 +97,4 @@ int ToLegalChannel( struct ieee80211_device * dev, u8 channel ); - -void dump_chnl_map(u8 * channel_map); #endif // #ifndef __INC_DOT11D_H diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211.h b/drivers/staging/rtl8187se/ieee80211/ieee80211.h index 5833608..3222c22 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211.h +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211.h @@ -29,37 +29,14 @@ #include <linux/jiffies.h> #include <linux/timer.h> #include <linux/sched.h> - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)) #include <linux/wireless.h> -#endif - -/* -#ifndef bool -#define bool int -#endif - -#ifndef true -#define true 1 -#endif +#include <linux/ieee80211.h> -#ifndef false -#define false 0 -#endif -*/ -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) -#ifndef bool -typedef enum{false = 0, true} bool; -#endif -#endif -//#ifdef JOHN_HWSEC #define KEY_TYPE_NA 0x0 #define KEY_TYPE_WEP40 0x1 #define KEY_TYPE_TKIP 0x2 #define KEY_TYPE_CCMP 0x4 #define KEY_TYPE_WEP104 0x5 -//#endif - #define aSifsTime 10 @@ -112,58 +89,6 @@ typedef enum{false = 0, true} bool; #define IEEE_CRYPT_ALG_NAME_LEN 16 -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10)) -#define ieee80211_wx_get_scan ieee80211_wx_get_scan_rtl -#define ieee80211_wx_set_encode ieee80211_wx_set_encode_rtl -#define ieee80211_wx_get_encode ieee80211_wx_get_encode_rtl -//////////////////////////////// -// added for kernel conflict under FC5 -#define ieee80211_wx_get_name ieee80211_wx_get_name_rtl -#define free_ieee80211 free_ieee80211_rtl -#define alloc_ieee80211 alloc_ieee80211_rtl -/////////////////////////////// -#endif -//error in ubuntu2.6.22,so add these -#define ieee80211_wake_queue ieee80211_wake_queue_rtl -#define ieee80211_stop_queue ieee80211_stop_queue_rtl - -#define ieee80211_rx ieee80211_rx_rtl - -#define ieee80211_register_crypto_ops ieee80211_register_crypto_ops_rtl -#define ieee80211_unregister_crypto_ops ieee80211_unregister_crypto_ops_rtl -#define ieee80211_get_crypto_ops ieee80211_get_crypto_ops_rtl -#define ieee80211_crypt_deinit_entries ieee80211_crypt_deinit_entries_rtl -#define ieee80211_crypt_deinit_handler ieee80211_crypt_deinit_handler_rtl -#define ieee80211_crypt_delayed_deinit ieee80211_crypt_delayed_deinit_rtl - -#define ieee80211_txb_free ieee80211_txb_free_rtl -#define ieee80211_wx_get_essid ieee80211_wx_get_essid_rtl -#define ieee80211_wx_set_essid ieee80211_wx_set_essid_rtl -#define ieee80211_wx_set_rate ieee80211_wx_set_rate_rtl -#define ieee80211_wx_get_rate ieee80211_wx_get_rate_rtl -#define ieee80211_wx_set_wap ieee80211_wx_set_wap_rtl -#define ieee80211_wx_get_wap ieee80211_wx_get_wap_rtl -#define ieee80211_wx_set_mode ieee80211_wx_set_mode_rtl -#define ieee80211_wx_get_mode ieee80211_wx_get_mode_rtl -#define ieee80211_wx_set_scan ieee80211_wx_set_scan_rtl -#define ieee80211_wx_get_freq ieee80211_wx_get_freq_rtl -#define ieee80211_wx_set_freq ieee80211_wx_set_freq_rtl -#define ieee80211_wx_set_rawtx ieee80211_wx_set_rawtx_rtl -#define ieee80211_wx_set_power ieee80211_wx_set_power_rtl -#define ieee80211_wx_get_power ieee80211_wx_get_power_rtl -#define ieee80211_wlan_frequencies ieee80211_wlan_frequencies_rtl -#define ieee80211_softmac_stop_protocol ieee80211_softmac_stop_protocol_rtl -#define ieee80211_softmac_start_protocol ieee80211_softmac_start_protocol_rtl -#define ieee80211_start_protocol ieee80211_start_protocol_rtl -#define ieee80211_stop_protocol ieee80211_stop_protocol_rtl -#define ieee80211_rx_mgt ieee80211_rx_mgt_rtl - -#define ieee80211_wx_set_auth ieee80211_wx_set_auth_rtl -//by amy for ps -#define notify_wx_assoc_event notify_wx_assoc_event_rtl -#define ieee80211_stop_send_beacons ieee80211_stop_send_beacons_rtl -#define ieee80211_disassociate ieee80211_disassociate_rtl -#define ieee80211_start_scan ieee80211_start_scan_rtl //by amy for ps typedef struct ieee_param { u32 cmd; @@ -196,32 +121,8 @@ typedef struct ieee_param { }ieee_param; -#if WIRELESS_EXT < 17 -#define IW_QUAL_QUAL_INVALID 0x10 -#define IW_QUAL_LEVEL_INVALID 0x20 -#define IW_QUAL_NOISE_INVALID 0x40 -#define IW_QUAL_QUAL_UPDATED 0x1 -#define IW_QUAL_LEVEL_UPDATED 0x2 -#define IW_QUAL_NOISE_UPDATED 0x4 -#endif - -// linux under 2.6.9 release may not support it, so modify it for common use -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9)) -#define MSECS(t) (1000 * ((t) / HZ) + 1000 * ((t) % HZ) / HZ) -static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) -{ - unsigned long timeout = MSECS(msecs) + 1; - - while (timeout) { - set_current_state(TASK_UNINTERRUPTIBLE); - timeout = schedule_timeout(timeout); - } - return timeout; -} -#else #define MSECS(t) msecs_to_jiffies(t) #define msleep_interruptible_rtl msleep_interruptible -#endif #define IEEE80211_DATA_LEN 2304 /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section @@ -232,162 +133,21 @@ static inline unsigned long msleep_interruptible_rtl(unsigned int msecs) 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) - -/* this is stolen and modified from the madwifi driver*/ -#define IEEE80211_FC0_TYPE_MASK 0x0c -#define IEEE80211_FC0_TYPE_DATA 0x08 -#define IEEE80211_FC0_SUBTYPE_MASK 0xB0 -#define IEEE80211_FC0_SUBTYPE_QOS 0x80 - -#define IEEE80211_QOS_HAS_SEQ(fc) \ - (((fc) & (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == \ - (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS)) - -/* this is stolen from ipw2200 driver */ -#define IEEE_IBSS_MAC_HASH_SIZE 31 -struct ieee_ibss_seq { - u8 mac[ETH_ALEN]; - u16 seq_num[17]; - u16 frag_num[17]; - unsigned long packet_time[17]; - struct list_head list; -}; - -struct ieee80211_hdr { - 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]; -} __attribute__ ((packed)); - -struct ieee80211_hdr_QOS { - 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]; - u16 QOS_ctl; -} __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; -} __attribute__ ((packed)); - -struct ieee80211_hdr_3addr_QOS { - u16 frame_ctl; - u16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; - u16 QOS_ctl; -} __attribute__ ((packed)); - -enum eap_type { - EAP_PACKET = 0, - EAPOL_START, - EAPOL_LOGOFF, - EAPOL_KEY, - EAPOL_ENCAP_ASF_ALERT -}; - -static const char *eap_types[] = { - [EAP_PACKET] = "EAP-Packet", - [EAPOL_START] = "EAPOL-Start", - [EAPOL_LOGOFF] = "EAPOL-Logoff", - [EAPOL_KEY] = "EAPOL-Key", - [EAPOL_ENCAP_ASF_ALERT] = "EAPOL-Encap-ASF-Alert" -}; - -static inline const char *eap_get_type(int type) -{ - return (type >= ARRAY_SIZE(eap_types)) ? "Unknown" : eap_types[type]; -} - -struct eapol { - u8 snap[6]; - u16 ethertype; - u8 version; - u8 type; - u16 length; -} __attribute__ ((packed)); - #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 IEEE80211_MGMT_HDR_LEN 24 +#define IEEE80211_DATA_HDR3_LEN 24 +#define IEEE80211_DATA_HDR4_LEN 30 #define MIN_FRAG_THRESHOLD 256U #define MAX_FRAG_THRESHOLD 2346U /* Frame control field constants */ -#define IEEE80211_FCTL_VERS 0x0002 -#define IEEE80211_FCTL_FTYPE 0x000c -#define IEEE80211_FCTL_STYPE 0x00f0 -#define IEEE80211_FCTL_TODS 0x0100 -#define IEEE80211_FCTL_FROMDS 0x0200 #define IEEE80211_FCTL_DSTODS 0x0300 //added by david -#define IEEE80211_FCTL_MOREFRAGS 0x0400 -#define IEEE80211_FCTL_RETRY 0x0800 -#define IEEE80211_FCTL_PM 0x1000 -#define IEEE80211_FCTL_MOREDATA 0x2000 #define IEEE80211_FCTL_WEP 0x4000 -#define IEEE80211_FCTL_ORDER 0x8000 - -#define IEEE80211_FTYPE_MGMT 0x0000 -#define IEEE80211_FTYPE_CTL 0x0004 -#define IEEE80211_FTYPE_DATA 0x0008 - -/* management */ -#define IEEE80211_STYPE_ASSOC_REQ 0x0000 -#define IEEE80211_STYPE_ASSOC_RESP 0x0010 -#define IEEE80211_STYPE_REASSOC_REQ 0x0020 -#define IEEE80211_STYPE_REASSOC_RESP 0x0030 -#define IEEE80211_STYPE_PROBE_REQ 0x0040 -#define IEEE80211_STYPE_PROBE_RESP 0x0050 -#define IEEE80211_STYPE_BEACON 0x0080 -#define IEEE80211_STYPE_ATIM 0x0090 -#define IEEE80211_STYPE_DISASSOC 0x00A0 -#define IEEE80211_STYPE_AUTH 0x00B0 -#define IEEE80211_STYPE_DEAUTH 0x00C0 -#define IEEE80211_STYPE_MANAGE_ACT 0x00D0 - -/* control */ -#define IEEE80211_STYPE_PSPOLL 0x00A0 -#define IEEE80211_STYPE_RTS 0x00B0 -#define IEEE80211_STYPE_CTS 0x00C0 -#define IEEE80211_STYPE_ACK 0x00D0 -#define IEEE80211_STYPE_CFEND 0x00E0 -#define IEEE80211_STYPE_CFENDACK 0x00F0 - -/* data */ -#define IEEE80211_STYPE_DATA 0x0000 -#define IEEE80211_STYPE_DATA_CFACK 0x0010 -#define IEEE80211_STYPE_DATA_CFPOLL 0x0020 -#define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030 -#define IEEE80211_STYPE_NULLFUNC 0x0040 -#define IEEE80211_STYPE_CFACK 0x0050 -#define IEEE80211_STYPE_CFPOLL 0x0060 -#define IEEE80211_STYPE_CFACKPOLL 0x0070 -#define IEEE80211_STYPE_QOS_DATA 0x0080 //added for WMM 2006/8/2 -#define IEEE80211_STYPE_QOS_NULL 0x00C0 - - -#define IEEE80211_SCTL_FRAG 0x000F -#define IEEE80211_SCTL_SEQ 0xFFF0 - /* debug macros */ @@ -401,6 +161,10 @@ do { if (ieee80211_debug_level & (level)) \ #define IEEE80211_DEBUG(level, fmt, args...) do {} while (0) #endif /* CONFIG_IEEE80211_DEBUG */ +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" +#define MAC_ARG(x) ((u8 *)(x))[0], ((u8 *)(x))[1], ((u8 *)(x))[2], \ + ((u8 *)(x))[3], ((u8 *)(x))[4], ((u8 *)(x))[5] + /* * To use the debug system; * @@ -493,68 +257,9 @@ struct ieee80211_snap_hdr { #define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG) #define WLAN_GET_SEQ_SEQ(seq) ((seq) & IEEE80211_SCTL_SEQ) -/* Authentication algorithms */ -#define WLAN_AUTH_OPEN 0 -#define WLAN_AUTH_SHARED_KEY 1 - -#define WLAN_AUTH_CHALLENGE_LEN 128 - #define WLAN_CAPABILITY_BSS (1<<0) -#define WLAN_CAPABILITY_IBSS (1<<1) -#define WLAN_CAPABILITY_CF_POLLABLE (1<<2) -#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3) -#define WLAN_CAPABILITY_PRIVACY (1<<4) -#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5) -#define WLAN_CAPABILITY_PBCC (1<<6) -#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7) #define WLAN_CAPABILITY_SHORT_SLOT (1<<10) -/* Status codes */ -#define WLAN_STATUS_SUCCESS 0 -#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 -#define WLAN_STATUS_CAPS_UNSUPPORTED 10 -#define WLAN_STATUS_REASSOC_NO_ASSOC 11 -#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 -#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 -#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 -#define WLAN_STATUS_CHALLENGE_FAIL 15 -#define WLAN_STATUS_AUTH_TIMEOUT 16 -#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 -#define WLAN_STATUS_ASSOC_DENIED_RATES 18 -/* 802.11b */ -#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 -#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 -#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 - -/* Reason codes */ -#define WLAN_REASON_UNSPECIFIED 1 -#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 -#define WLAN_REASON_DEAUTH_LEAVING 3 -#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 -#define WLAN_REASON_DISASSOC_AP_BUSY 5 -#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 -#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 -#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 -#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 - - -/* Information Element IDs */ -#define WLAN_EID_SSID 0 -#define WLAN_EID_SUPP_RATES 1 -#define WLAN_EID_FH_PARAMS 2 -#define WLAN_EID_DS_PARAMS 3 -#define WLAN_EID_CF_PARAMS 4 -#define WLAN_EID_TIM 5 -#define WLAN_EID_IBSS_PARAMS 6 -#define WLAN_EID_CHALLENGE 16 -#define WLAN_EID_RSN 48 -#define WLAN_EID_GENERIC 221 - -#define IEEE80211_MGMT_HDR_LEN 24 -#define IEEE80211_DATA_HDR3_LEN 24 -#define IEEE80211_DATA_HDR4_LEN 30 - - #define IEEE80211_STATMASK_SIGNAL (1<<0) #define IEEE80211_STATMASK_RSSI (1<<1) #define IEEE80211_STATMASK_NOISE (1<<2) @@ -621,8 +326,25 @@ struct ieee80211_snap_hdr { #define IEEE80211_NUM_CCK_RATES 4 #define IEEE80211_OFDM_SHIFT_MASK_A 4 +/* this is stolen and modified from the madwifi driver*/ +#define IEEE80211_FC0_TYPE_MASK 0x0c +#define IEEE80211_FC0_TYPE_DATA 0x08 +#define IEEE80211_FC0_SUBTYPE_MASK 0xB0 +#define IEEE80211_FC0_SUBTYPE_QOS 0x80 +#define IEEE80211_QOS_HAS_SEQ(fc) \ + (((fc) & (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == \ + (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS)) +/* this is stolen from ipw2200 driver */ +#define IEEE_IBSS_MAC_HASH_SIZE 31 +struct ieee_ibss_seq { + u8 mac[ETH_ALEN]; + u16 seq_num[17]; + u16 frag_num[17]; + unsigned long packet_time[17]; + struct list_head list; +}; /* NOTE: This data is for statistical purposes; not all hardware provides this * information for frames received. Not setting these will not cause @@ -681,26 +403,6 @@ struct ieee80211_stats { unsigned int rx_message_in_bad_msg_fragments; }; -struct ieee80211_softmac_stats{ - unsigned int rx_ass_ok; - unsigned int rx_ass_err; - unsigned int rx_probe_rq; - unsigned int tx_probe_rs; - unsigned int tx_beacons; - unsigned int rx_auth_rq; - unsigned int rx_auth_rs_ok; - unsigned int rx_auth_rs_err; - unsigned int tx_auth_rq; - unsigned int no_auth_rs; - unsigned int no_ass_rs; - unsigned int tx_ass_rq; - unsigned int rx_ass_rq; - unsigned int tx_probe_rq; - unsigned int reassoc; - unsigned int swtxstop; - unsigned int swtxawake; -}; - struct ieee80211_device; #include "ieee80211_crypt.h" @@ -754,6 +456,23 @@ Total: 28-2340 bytes */ +/* Management Frame Information Element Types */ +enum { + MFIE_TYPE_SSID = 0, + MFIE_TYPE_RATES = 1, + MFIE_TYPE_FH_SET = 2, + MFIE_TYPE_DS_SET = 3, + MFIE_TYPE_CF_SET = 4, + MFIE_TYPE_TIM = 5, + MFIE_TYPE_IBSS_SET = 6, + MFIE_TYPE_COUNTRY = 7, + MFIE_TYPE_CHALLENGE = 16, + MFIE_TYPE_ERP = 42, + MFIE_TYPE_RSN = 48, + MFIE_TYPE_RATES_EX = 50, + MFIE_TYPE_GENERIC = 221, +}; + struct ieee80211_header_data { u16 frame_ctl; u16 duration_id; @@ -763,39 +482,45 @@ struct ieee80211_header_data { u16 seq_ctrl; }; -#define BEACON_PROBE_SSID_ID_POSITION 12 +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; +} __attribute__ ((packed)); -/* Management Frame Information Element Types */ -#define MFIE_TYPE_SSID 0 -#define MFIE_TYPE_RATES 1 -#define MFIE_TYPE_FH_SET 2 -#define MFIE_TYPE_DS_SET 3 -#define MFIE_TYPE_CF_SET 4 -#define MFIE_TYPE_TIM 5 -#define MFIE_TYPE_IBSS_SET 6 -#define MFIE_TYPE_COUNTRY 7 //+YJ,080625 -#define MFIE_TYPE_CHALLENGE 16 -#define MFIE_TYPE_ERP 42 -#define MFIE_TYPE_RSN 48 -#define MFIE_TYPE_RATES_EX 50 -#define MFIE_TYPE_GENERIC 221 - -#ifdef ENABLE_DOT11D -typedef enum -{ - COUNTRY_CODE_FCC = 0, - COUNTRY_CODE_IC = 1, - COUNTRY_CODE_ETSI = 2, - COUNTRY_CODE_SPAIN = 3, - COUNTRY_CODE_FRANCE = 4, - COUNTRY_CODE_MKK = 5, - COUNTRY_CODE_MKK1 = 6, - COUNTRY_CODE_ISRAEL = 7, - COUNTRY_CODE_TELEC = 8, - COUNTRY_CODE_GLOBAL_DOMAIN = 9, - COUNTRY_CODE_WORLD_WIDE_13_INDEX = 10 -}country_code_type_t; -#endif +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]; +} __attribute__ ((packed)); + +struct ieee80211_hdr_3addrqos { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u16 qos_ctl; +} __attribute__ ((packed)); + +struct ieee80211_hdr_4addrqos { + 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]; + u16 qos_ctl; +} __attribute__ ((packed)); struct ieee80211_info_element_hdr { u8 id; @@ -808,26 +533,6 @@ struct ieee80211_info_element { u8 data[0]; } __attribute__ ((packed)); -/* - * These are the data types that can make up management packets - * - u16 auth_algorithm; - u16 auth_sequence; - u16 beacon_interval; - u16 capability; - u8 current_ap[ETH_ALEN]; - u16 listen_interval; - struct { - u16 association_id:14, reserved:2; - } __attribute__ ((packed)); - u32 time_stamp[2]; - u16 reason; - u16 status; -*/ - -#define IEEE80211_DEFAULT_TX_ESSID "Penguin" -#define IEEE80211_DEFAULT_BASIC_RATE 10 - struct ieee80211_authentication { struct ieee80211_header_data header; u16 algorithm; @@ -836,6 +541,15 @@ struct ieee80211_authentication { //struct ieee80211_info_element_hdr info_element; } __attribute__ ((packed)); +struct ieee80211_disassoc_frame { + struct ieee80211_hdr_3addr header; + u16 reasoncode; +} __attribute__ ((packed)); + +struct ieee80211_probe_request { + struct ieee80211_header_data header; + /* struct ieee80211_info_element info_element; */ +} __attribute__ ((packed)); struct ieee80211_probe_response { struct ieee80211_header_data header; @@ -845,11 +559,6 @@ struct ieee80211_probe_response { struct ieee80211_info_element info_element; } __attribute__ ((packed)); -struct ieee80211_probe_request { - struct ieee80211_header_data header; - /*struct ieee80211_info_element info_element;*/ -} __attribute__ ((packed)); - struct ieee80211_assoc_request_frame { struct ieee80211_hdr_3addr header; u16 capability; @@ -866,11 +575,6 @@ struct ieee80211_assoc_response_frame { struct ieee80211_info_element info_element; /* supported rates */ } __attribute__ ((packed)); -struct ieee80211_disassoc_frame{ - struct ieee80211_hdr_3addr header; - u16 reasoncode; -}__attribute__ ((packed)); - struct ieee80211_txb { u8 nr_frags; u8 encrypted; @@ -880,6 +584,32 @@ struct ieee80211_txb { struct sk_buff *fragments[0]; }; +/* SWEEP TABLE ENTRIES NUMBER */ +#define MAX_SWEEP_TAB_ENTRIES 42 +#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 + +/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs + * only use 8, and then use extended rates for the remaining supported + * rates. Other APs, however, stick all of their supported rates on the + * main rates information element... */ +#define MAX_RATES_LENGTH ((u8)12) +#define MAX_RATES_EX_LENGTH ((u8)16) + +#define MAX_NETWORK_COUNT 128 + +#define MAX_CHANNEL_NUMBER 165 + +#define IEEE80211_SOFTMAC_SCAN_TIME 100 /* (HZ / 2) */ +#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2) + +#define CRC_LENGTH 4U + +#define MAX_WPA_IE_LEN 64 + +#define NETWORK_EMPTY_ESSID (1 << 0) +#define NETWORK_HAS_OFDM (1 << 1) +#define NETWORK_HAS_CCK (1 << 2) + struct ieee80211_wmm_ac_param { u8 ac_aci_acm_aifsn; u8 ac_ecwmin_ecwmax; @@ -911,23 +641,82 @@ struct ieee80211_wmm_tspec_elem { u16 medium_time; }__attribute__((packed)); +enum eap_type { + EAP_PACKET = 0, + EAPOL_START, + EAPOL_LOGOFF, + EAPOL_KEY, + EAPOL_ENCAP_ASF_ALERT +}; + +static const char *eap_types[] = { + [EAP_PACKET] = "EAP-Packet", + [EAPOL_START] = "EAPOL-Start", + [EAPOL_LOGOFF] = "EAPOL-Logoff", + [EAPOL_KEY] = "EAPOL-Key", + [EAPOL_ENCAP_ASF_ALERT] = "EAPOL-Encap-ASF-Alert" +}; + +static inline const char *eap_get_type(int type) +{ + return (type >= ARRAY_SIZE(eap_types)) ? "Unknown" : eap_types[type]; +} + +struct eapol { + u8 snap[6]; + u16 ethertype; + u8 version; + u8 type; + u16 length; +} __attribute__ ((packed)); + +struct ieee80211_softmac_stats { + unsigned int rx_ass_ok; + unsigned int rx_ass_err; + unsigned int rx_probe_rq; + unsigned int tx_probe_rs; + unsigned int tx_beacons; + unsigned int rx_auth_rq; + unsigned int rx_auth_rs_ok; + unsigned int rx_auth_rs_err; + unsigned int tx_auth_rq; + unsigned int no_auth_rs; + unsigned int no_ass_rs; + unsigned int tx_ass_rq; + unsigned int rx_ass_rq; + unsigned int tx_probe_rq; + unsigned int reassoc; + unsigned int swtxstop; + unsigned int swtxawake; +}; + +#define BEACON_PROBE_SSID_ID_POSITION 12 + +/* + * These are the data types that can make up management packets + * + u16 auth_algorithm; + u16 auth_sequence; + u16 beacon_interval; + u16 capability; + u8 current_ap[ETH_ALEN]; + u16 listen_interval; + struct { + u16 association_id:14, reserved:2; + } __attribute__ ((packed)); + u32 time_stamp[2]; + u16 reason; + u16 status; +*/ + +#define IEEE80211_DEFAULT_TX_ESSID "Penguin" +#define IEEE80211_DEFAULT_BASIC_RATE 10 + enum {WMM_all_frame, WMM_two_frame, WMM_four_frame, WMM_six_frame}; #define MAX_SP_Len (WMM_all_frame << 4) #define IEEE80211_QOS_TID 0x0f #define QOS_CTL_NOTCONTAIN_ACK (0x01 << 5) -/* SWEEP TABLE ENTRIES NUMBER*/ -#define MAX_SWEEP_TAB_ENTRIES 42 -#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 -/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs - * only use 8, and then use extended rates for the remaining supported - * rates. Other APs, however, stick all of their supported rates on the - * main rates information element... */ -#define MAX_RATES_LENGTH ((u8)12) -#define MAX_RATES_EX_LENGTH ((u8)16) -#define MAX_NETWORK_COUNT 128 -//#define MAX_CHANNEL_NUMBER 161 -#define MAX_CHANNEL_NUMBER 165 //YJ,modified,080625 #define MAX_IE_LEN 0xFF //+YJ,080625 typedef struct _CHANNEL_LIST{ @@ -935,23 +724,12 @@ typedef struct _CHANNEL_LIST{ u8 Len; }CHANNEL_LIST, *PCHANNEL_LIST; -#define IEEE80211_SOFTMAC_SCAN_TIME 100//400 -//(HZ / 2) //by amy for ps #define IEEE80211_WATCH_DOG_TIME 2000 //by amy for ps //by amy for antenna #define ANTENNA_DIVERSITY_TIMER_PERIOD 1000 // 1000 m //by amy for antenna -#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2) - -#define CRC_LENGTH 4U - -#define MAX_WPA_IE_LEN 64 - -#define NETWORK_EMPTY_ESSID (1<<0) -#define NETWORK_HAS_OFDM (1<<1) -#define NETWORK_HAS_CCK (1<<2) #define IEEE80211_DTIM_MBCAST 4 #define IEEE80211_DTIM_UCAST 2 @@ -1044,13 +822,9 @@ struct ieee80211_network { //by amy 080312 u8 HighestOperaRate; //by amy 080312 -#ifdef THOMAS_TURBO u8 Turbo_Enable;//enable turbo mode, added by thomas -#endif -#ifdef ENABLE_DOT11D u16 CountryIeLen; u8 CountryIeBuf[MAX_IE_LEN]; -#endif }; enum ieee80211_state { @@ -1094,24 +868,6 @@ enum ieee80211_state { #define DEFAULT_MAX_SCAN_AGE (15 * HZ) #define DEFAULT_FTS 2346 -#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" -#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5] - - -#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11)) -extern inline int is_multicast_ether_addr(const u8 *addr) -{ - return ((addr[0] != 0xff) && (0x01 & addr[0])); -} -#endif - -#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)) -extern inline int is_broadcast_ether_addr(const u8 *addr) -{ - return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ - (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); -} -#endif #define CFG_IEEE80211_RESERVE_FCS (1<<0) #define CFG_IEEE80211_COMPUTE_FCS (1<<1) @@ -1121,6 +877,19 @@ typedef struct tx_pending_t{ struct ieee80211_txb *txb; }tx_pending_t; +enum { + COUNTRY_CODE_FCC = 0, + COUNTRY_CODE_IC = 1, + COUNTRY_CODE_ETSI = 2, + COUNTRY_CODE_SPAIN = 3, + COUNTRY_CODE_FRANCE = 4, + COUNTRY_CODE_MKK = 5, + COUNTRY_CODE_MKK1 = 6, + COUNTRY_CODE_ISRAEL = 7, + COUNTRY_CODE_TELEC = 8, + COUNTRY_CODE_GLOBAL_DOMAIN = 9, + COUNTRY_CODE_WORLD_WIDE_13_INDEX = 10 +}; struct ieee80211_device { struct net_device *dev; @@ -1207,18 +976,12 @@ struct ieee80211_device { */ short sync_scan_hurryup; -#ifdef ENABLE_DOT11D void * pDot11dInfo; bool bGlobalDomain; // For Liteon Ch12~13 passive scan u8 MinPassiveChnlNum; u8 IbssStartChnl; -#else - /* map of allowed channels. 0 is dummy */ - // FIXME: remeber to default to a basic channel plan depending of the PHY type - int channel_map[MAX_CHANNEL_NUMBER+1]; -#endif int rate; /* current rate */ int basic_rate; @@ -1313,7 +1076,6 @@ struct ieee80211_device { unsigned long NumRxOkTotal; unsigned long NumRxUnicast;//YJ,add,080828,for keep alive bool bHwRadioOff; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) struct delayed_work softmac_scan_wq; struct delayed_work associate_retry_wq; struct delayed_work hw_wakeup_wq; @@ -1329,24 +1091,7 @@ struct ieee80211_device { //Added for RF power on power off by lizhaoming 080512 struct delayed_work GPIOChangeRFWorkItem; -#else - - struct work_struct start_ibss_wq; - struct work_struct softmac_scan_wq; - struct work_struct associate_retry_wq; - struct work_struct hw_wakeup_wq; - struct work_struct hw_sleep_wq; - struct work_struct watch_dog_wq; - struct work_struct sw_antenna_wq; -//by amy for rate adaptive 080312 - struct work_struct rate_adapter_wq; -//by amy for rate adaptive - struct work_struct hw_dig_wq; - struct work_struct tx_pw_wq; -//Added for RF power on power off by lizhaoming 080512 - struct work_struct GPIOChangeRFWorkItem; -#endif struct workqueue_struct *wq; /* Callback functions */ @@ -1582,7 +1327,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 */ @@ -1690,12 +1435,8 @@ extern int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_reques extern int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + extern void ieee80211_wx_sync_scan_wq(struct work_struct *work); -#else - extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); -#endif -//extern void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee); extern int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee, struct iw_request_info *info, diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c index 7370296..013c3e1 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c @@ -19,10 +19,6 @@ #include <asm/string.h> #include <asm/errno.h> -#if (LINUX_VERSION_CODE<KERNEL_VERSION(2,6,18)) -#include<linux/config.h> -#endif - #include "ieee80211.h" MODULE_AUTHOR("Jouni Malinen"); @@ -251,16 +247,3 @@ void ieee80211_crypto_deinit(void) } kfree(hcrypt); } - -#if 0 -EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); -EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); -EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); - -EXPORT_SYMBOL(ieee80211_register_crypto_ops); -EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); -EXPORT_SYMBOL(ieee80211_get_crypto_ops); -#endif - -//module_init(ieee80211_crypto_init); -//module_exit(ieee80211_crypto_deinit); diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_ccmp.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_ccmp.c index 08add38..172e8f3 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_ccmp.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_ccmp.c @@ -24,28 +24,13 @@ #include "ieee80211.h" -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) -#include "rtl_crypto.h" -#else #include <linux/crypto.h> -#endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) - #include <asm/scatterlist.h> -#else - #include <linux/scatterlist.h> -#endif - -//#include <asm/scatterlist.h> +#include <linux/scatterlist.h> MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: CCMP"); MODULE_LICENSE("GPL"); -#ifdef OPENSUSE_SLED -#ifndef IN_OPENSUSE_SLED -#define IN_OPENSUSE_SLED 1 -#endif -#endif #define AES_BLOCK_LEN 16 #define CCMP_HDR_LEN 8 @@ -77,21 +62,7 @@ struct ieee80211_ccmp_data { void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, const u8 pt[16], u8 ct[16]) { - #if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))||(IN_OPENSUSE_SLED)) crypto_cipher_encrypt_one((void *)tfm, ct, pt); - #else - struct scatterlist src, dst; - - src.page = virt_to_page(pt); - src.offset = offset_in_page(pt); - src.length = AES_BLOCK_LEN; - - dst.page = virt_to_page(ct); - dst.offset = offset_in_page(ct); - dst.length = AES_BLOCK_LEN; - - crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); - #endif } static void * ieee80211_ccmp_init(int key_idx) @@ -104,33 +75,20 @@ static void * ieee80211_ccmp_init(int key_idx) memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!IN_OPENSUSE_SLED)) - priv->tfm = crypto_alloc_tfm("aes", 0); - if (priv->tfm == NULL) { - printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " - "crypto API aes\n"); - goto fail; - } - #else - priv->tfm = (void *)crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); + priv->tfm = (void *)crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); if (IS_ERR(priv->tfm)) { printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " "crypto API aes\n"); priv->tfm = NULL; goto fail; } - #endif + return priv; fail: if (priv) { if (priv->tfm) - //#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!IN_OPENSUSE_SLED)) - crypto_free_tfm(priv->tfm); - #else crypto_free_cipher((void *)priv->tfm); - #endif kfree(priv); } @@ -141,13 +99,9 @@ fail: static void ieee80211_ccmp_deinit(void *priv) { struct ieee80211_ccmp_data *_priv = priv; + if (_priv && _priv->tfm) - //#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!IN_OPENSUSE_SLED)) - crypto_free_tfm(_priv->tfm); - #else crypto_free_cipher((void *)_priv->tfm); - #endif kfree(priv); } @@ -159,9 +113,8 @@ static inline void xor_block(u8 *b, u8 *a, size_t len) b[i] ^= a[i]; } -#ifndef JOHN_CCMP 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) { @@ -237,22 +190,20 @@ static void ccmp_init_blocks(struct crypto_tfm *tfm, b0[14] = b0[15] = 0; ieee80211_ccmp_aes_encrypt(tfm, b0, s0); } -#endif static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_ccmp_data *key = priv; int data_len, i; u8 *pos; - struct ieee80211_hdr *hdr; -#ifndef JOHN_CCMP + struct ieee80211_hdr_4addr *hdr; int blocks, last, len; u8 *mic; u8 *b0 = key->tx_b0; u8 *b = key->tx_b; u8 *e = key->tx_e; u8 *s0 = key->tx_s0; -#endif + if (skb_headroom(skb) < CCMP_HDR_LEN || skb_tailroom(skb) < CCMP_MIC_LEN || skb->len < hdr_len) @@ -281,8 +232,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; -#ifndef JOHN_CCMP + hdr = (struct ieee80211_hdr_4addr *)skb->data; //mic is moved to here by john mic = skb_put(skb, CCMP_MIC_LEN); @@ -306,7 +256,7 @@ static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) for (i = 0; i < CCMP_MIC_LEN; i++) mic[i] = b[i] ^ s0[i]; -#endif + return 0; } @@ -315,22 +265,21 @@ 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 pn[6]; -#ifndef JOHN_CCMP size_t data_len = skb->len - hdr_len - CCMP_HDR_LEN - CCMP_MIC_LEN; u8 *mic = skb->data + skb->len - CCMP_MIC_LEN; u8 *b0 = key->rx_b0; u8 *b = key->rx_b; u8 *a = key->rx_a; int i, blocks, last, len; -#endif + if (skb->len < hdr_len + CCMP_HDR_LEN + CCMP_MIC_LEN) { key->dot11RSNAStatsCCMPFormatErrors++; 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))) { @@ -376,7 +325,6 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) return -4; } -#ifndef JOHN_CCMP ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); xor_block(mic, b, CCMP_MIC_LEN); @@ -407,7 +355,6 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) memcpy(key->rx_pn, pn, CCMP_PN_LEN); -#endif /* Remove hdr and MIC */ memmove(skb->data + CCMP_HDR_LEN, skb->data, hdr_len); skb_pull(skb, CCMP_HDR_LEN); @@ -520,14 +467,3 @@ void ieee80211_crypto_ccmp_exit(void) { ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); } - -#if 0 -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) -EXPORT_SYMBOL(ieee80211_ccmp_null); -#else -EXPORT_SYMBOL_NOVERS(ieee80211_ccmp_null); -#endif -#endif - -//module_init(ieee80211_crypto_ccmp_init); -//module_exit(ieee80211_crypto_ccmp_exit); diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_tkip.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_tkip.c index de97bbe..e6d8385 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_tkip.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_tkip.c @@ -23,29 +23,14 @@ #include "ieee80211.h" -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) -#include "rtl_crypto.h" -#else #include <linux/crypto.h> -#endif -//#include <asm/scatterlist.h> -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) - #include <asm/scatterlist.h> -#else - #include <linux/scatterlist.h> -#endif - +#include <linux/scatterlist.h> #include <linux/crc32.h> MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: TKIP"); MODULE_LICENSE("GPL"); -#ifdef OPENSUSE_SLED -#ifndef IN_OPENSUSE_SLED -#define IN_OPENSUSE_SLED 1 -#endif -#endif struct ieee80211_tkip_data { #define TKIP_KEY_LEN 32 @@ -70,13 +55,10 @@ struct ieee80211_tkip_data { int key_idx; - #if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))||(IN_OPENSUSE_SLED)) - struct crypto_blkcipher *rx_tfm_arc4; - struct crypto_hash *rx_tfm_michael; - struct crypto_blkcipher *tx_tfm_arc4; - struct crypto_hash *tx_tfm_michael; - #endif - + struct crypto_blkcipher *rx_tfm_arc4; + struct crypto_hash *rx_tfm_michael; + struct crypto_blkcipher *tx_tfm_arc4; + struct crypto_hash *tx_tfm_michael; struct crypto_tfm *tfm_arc4; struct crypto_tfm *tfm_michael; @@ -94,22 +76,6 @@ static void * ieee80211_tkip_init(int key_idx) memset(priv, 0, sizeof(*priv)); priv->key_idx = key_idx; - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); - if (priv->tfm_arc4 == NULL) { - printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " - "crypto API arc4\n"); - goto fail; - } - - priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); - if (priv->tfm_michael == NULL) { - printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " - "crypto API michael_mic\n"); - goto fail; - } - - #else priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); if (IS_ERR(priv->tx_tfm_arc4)) { @@ -145,17 +111,11 @@ static void * ieee80211_tkip_init(int key_idx) priv->rx_tfm_michael = NULL; goto fail; } - #endif + return priv; fail: if (priv) { - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - if (priv->tfm_michael) - crypto_free_tfm(priv->tfm_michael); - if (priv->tfm_arc4) - crypto_free_tfm(priv->tfm_arc4); - #else if (priv->tx_tfm_michael) crypto_free_hash(priv->tx_tfm_michael); if (priv->tx_tfm_arc4) @@ -164,7 +124,6 @@ fail: crypto_free_hash(priv->rx_tfm_michael); if (priv->rx_tfm_arc4) crypto_free_blkcipher(priv->rx_tfm_arc4); - #endif kfree(priv); } @@ -175,12 +134,7 @@ fail: static void ieee80211_tkip_deinit(void *priv) { struct ieee80211_tkip_data *_priv = priv; - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - if (_priv && _priv->tfm_michael) - crypto_free_tfm(_priv->tfm_michael); - if (_priv && _priv->tfm_arc4) - crypto_free_tfm(_priv->tfm_arc4); - #else + if (_priv) { if (_priv->tx_tfm_michael) crypto_free_hash(_priv->tx_tfm_michael); @@ -191,7 +145,6 @@ static void ieee80211_tkip_deinit(void *priv) if (_priv->rx_tfm_arc4) crypto_free_blkcipher(_priv->rx_tfm_arc4); } - #endif kfree(priv); } @@ -281,7 +234,6 @@ static inline u16 _S_(u16 v) return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8)); } -#ifndef JOHN_TKIP #define PHASE1_LOOP_COUNT 8 static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) @@ -351,21 +303,17 @@ static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, } #endif } -#endif + static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; - #if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))||(IN_OPENSUSE_SLED)) struct blkcipher_desc desc = {.tfm = tkey->tx_tfm_arc4}; - #endif int len; u8 *pos; - struct ieee80211_hdr *hdr; -#ifndef JOHN_TKIP + struct ieee80211_hdr_4addr *hdr; u8 rc4key[16],*icv; u32 crc; struct scatterlist sg; -#endif int ret; ret = 0; @@ -373,20 +321,8 @@ static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) skb->len < hdr_len) return -1; - hdr = (struct ieee80211_hdr *) skb->data; -#if 0 -printk("@@ tkey\n"); -printk("%x|", ((u32*)tkey->key)[0]); -printk("%x|", ((u32*)tkey->key)[1]); -printk("%x|", ((u32*)tkey->key)[2]); -printk("%x|", ((u32*)tkey->key)[3]); -printk("%x|", ((u32*)tkey->key)[4]); -printk("%x|", ((u32*)tkey->key)[5]); -printk("%x|", ((u32*)tkey->key)[6]); -printk("%x\n", ((u32*)tkey->key)[7]); -#endif + hdr = (struct ieee80211_hdr_4addr *)skb->data; -#ifndef JOHN_TKIP if (!tkey->tx_phase1_done) { tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, tkey->tx_iv32); @@ -394,95 +330,56 @@ printk("%x\n", ((u32*)tkey->key)[7]); } tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); -#else - tkey->tx_phase1_done = 1; -#endif /*JOHN_TKIP*/ - len = skb->len - hdr_len; pos = skb_push(skb, 8); memmove(pos, pos + 8, hdr_len); pos += hdr_len; -#ifdef JOHN_TKIP - *pos++ = Hi8(tkey->tx_iv16); - *pos++ = (Hi8(tkey->tx_iv16) | 0x20) & 0x7F; - *pos++ = Lo8(tkey->tx_iv16); -#else *pos++ = rc4key[0]; *pos++ = rc4key[1]; *pos++ = rc4key[2]; -#endif *pos++ = (tkey->key_idx << 6) | (1 << 5) /* Ext IV included */; *pos++ = tkey->tx_iv32 & 0xff; *pos++ = (tkey->tx_iv32 >> 8) & 0xff; *pos++ = (tkey->tx_iv32 >> 16) & 0xff; *pos++ = (tkey->tx_iv32 >> 24) & 0xff; -#ifndef JOHN_TKIP + icv = skb_put(skb, 4); -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) crc = ~crc32_le(~0, pos, len); -#else - crc = ~ether_crc_le(len, pos); -#endif icv[0] = crc; icv[1] = crc >> 8; icv[2] = crc >> 16; icv[3] = crc >> 24; - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); - sg.page = virt_to_page(pos); - sg.offset = offset_in_page(pos); - sg.length = len + 4; - crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); - #else crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); - #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) - sg.page = virt_to_page(pos); - sg.offset = offset_in_page(pos); - sg.length = len + 4; - #else - sg_init_one(&sg, pos, len+4); - #endif + sg_init_one(&sg, pos, len + 4); ret= crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); - #endif -#endif + tkey->tx_iv16++; if (tkey->tx_iv16 == 0) { tkey->tx_phase1_done = 0; tkey->tx_iv32++; } -#ifndef JOHN_TKIP - #if((LINUX_VERSION_CODE <KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - return 0; - #else return ret; - #endif -#else - return 0; -#endif } static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) { - struct ieee80211_tkip_data *tkey = priv; - #if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) ||(IN_OPENSUSE_SLED)) - struct blkcipher_desc desc = {.tfm = tkey->rx_tfm_arc4}; - #endif + struct ieee80211_tkip_data *tkey = priv; + struct blkcipher_desc desc = { .tfm = tkey->rx_tfm_arc4 }; u8 keyidx, *pos; u32 iv32; u16 iv16; - struct ieee80211_hdr *hdr; -#ifndef JOHN_TKIP + struct ieee80211_hdr_4addr *hdr; u8 icv[4]; u32 crc; struct scatterlist sg; u8 rc4key[16]; int plen; -#endif + if (skb->len < hdr_len + 8 + 4) 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))) { @@ -509,7 +406,6 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) iv16 = (pos[0] << 8) | pos[2]; iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24); pos += 8; -#ifndef JOHN_TKIP if (iv32 < tkey->rx_iv32 || (iv32 == tkey->rx_iv32 && iv16 <= tkey->rx_iv16)) { @@ -530,21 +426,8 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); plen = skb->len - hdr_len - 12; - #if((LINUX_VERSION_CODE <KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); - sg.page = virt_to_page(pos); - sg.offset = offset_in_page(pos); - sg.length = plen + 4; - crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); - #else crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); - #if(LINUX_VERSION_CODE <KERNEL_VERSION(2,6,24)) - sg.page = virt_to_page(pos); - sg.offset = offset_in_page(pos); - sg.length = plen + 4; - #else - sg_init_one(&sg, pos, plen+4); - #endif + sg_init_one(&sg, pos, plen + 4); if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) { if (net_ratelimit()) { printk(KERN_DEBUG ": TKIP: failed to decrypt " @@ -553,13 +436,8 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) } return -7; } - #endif -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) crc = ~crc32_le(~0, pos, plen); -#else - crc = ~ether_crc_le(plen, pos); -#endif icv[0] = crc; icv[1] = crc >> 8; icv[2] = crc >> 16; @@ -578,8 +456,6 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) return -5; } -#endif /* JOHN_TKIP */ - /* Update real counters only after Michael MIC verification has * completed */ tkey->rx_iv32_new = iv32; @@ -590,67 +466,9 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) skb_pull(skb, 8); skb_trim(skb, skb->len - 4); -//john's test -#ifdef JOHN_DUMP -if( ((u16*)skb->data)[0] & 0x4000){ - printk("@@ rx decrypted skb->data"); - int i; - for(i=0;i<skb->len;i++){ - if( (i%24)==0 ) printk("\n"); - printk("%2x ", ((u8*)skb->data)[i]); - } - printk("\n"); -} -#endif /*JOHN_DUMP*/ return keyidx; } -#if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!IN_OPENSUSE_SLED)) -static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, - u8 *data, size_t data_len, u8 *mic) -{ - struct scatterlist sg[2]; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) - struct hash_desc desc; - int ret=0; -#endif - if (tkey->tfm_michael == NULL) { - printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); - return -1; - } - sg[0].page = virt_to_page(hdr); - sg[0].offset = offset_in_page(hdr); - sg[0].length = 16; - - sg[1].page = virt_to_page(data); - sg[1].offset = offset_in_page(data); - sg[1].length = data_len; - - //crypto_digest_init(tkey->tfm_michael); - //crypto_digest_setkey(tkey->tfm_michael, key, 8); - //crypto_digest_update(tkey->tfm_michael, sg, 2); - //crypto_digest_final(tkey->tfm_michael, mic); - - //return 0; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) - crypto_digest_init(tkey->tfm_michael); - crypto_digest_setkey(tkey->tfm_michael, key, 8); - crypto_digest_update(tkey->tfm_michael, sg, 2); - crypto_digest_final(tkey->tfm_michael, mic); - - return 0; -#else -if (crypto_hash_setkey(tkey->tfm_michael, key, 8)) - return -1; - -// return 0; - desc.tfm = tkey->tfm_michael; - desc.flags = 0; - ret = crypto_hash_digest(&desc, sg, data_len + 16, mic); - return ret; -#endif -} -#else static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr, u8 * data, size_t data_len, u8 * mic) { @@ -661,18 +479,10 @@ static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr, printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); return -1; } - #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) - sg[0].page = virt_to_page(hdr); - sg[0].offset = offset_in_page(hdr); - sg[0].length = 16; - sg[1].page = virt_to_page(data); - sg[1].offset = offset_in_page(data); - sg[1].length = data_len; - #else - sg_init_table(sg, 2); - sg_set_buf(&sg[0], hdr, 16); - sg_set_buf(&sg[1], data, data_len); - #endif + + sg_init_table(sg, 2); + sg_set_buf(&sg[0], hdr, 16); + sg_set_buf(&sg[1], data, data_len); if (crypto_hash_setkey(tfm_michael, key, 8)) return -1; @@ -681,15 +491,12 @@ static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr, desc.flags = 0; return crypto_hash_digest(&desc, sg, data_len + 16, mic); } -#endif - - 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: @@ -720,9 +527,9 @@ static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *pri { struct ieee80211_tkip_data *tkey = priv; u8 *pos; - struct ieee80211_hdr *hdr; + struct ieee80211_hdr_4addr *hdr; - hdr = (struct ieee80211_hdr *) skb->data; + hdr = (struct ieee80211_hdr_4addr *)skb->data; if (skb_tailroom(skb) < 8 || skb->len < hdr_len) { printk(KERN_DEBUG "Invalid packet for Michael MIC add " @@ -740,22 +547,16 @@ static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *pri } // } pos = skb_put(skb, 8); - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, + + if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) - #else - if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, - skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) - #endif return -1; return 0; } - -#if WIRELESS_EXT >= 18 static void ieee80211_michael_mic_failure(struct net_device *dev, - struct ieee80211_hdr *hdr, + struct ieee80211_hdr_4addr *hdr, int keyidx) { union iwreq_data wrqu; @@ -774,39 +575,15 @@ static void ieee80211_michael_mic_failure(struct net_device *dev, wrqu.data.length = sizeof(ev); wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); } -#elif WIRELESS_EXT >= 15 -static void ieee80211_michael_mic_failure(struct net_device *dev, - struct ieee80211_hdr *hdr, - int keyidx) -{ - union iwreq_data wrqu; - char buf[128]; - - /* TODO: needed parameters: count, keyid, key type, TSC */ - sprintf(buf, "MLME-MICHAELMICFAILURE.indication(keyid=%d %scast addr=" - MAC_FMT ")", keyidx, hdr->addr1[0] & 0x01 ? "broad" : "uni", - MAC_ARG(hdr->addr2)); - memset(&wrqu, 0, sizeof(wrqu)); - wrqu.data.length = strlen(buf); - 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) -{ -} -#endif /* WIRELESS_EXT >= 15 */ - static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, int hdr_len, void *priv) { struct ieee80211_tkip_data *tkey = priv; u8 mic[8]; - struct ieee80211_hdr *hdr; + struct ieee80211_hdr_4addr *hdr; - hdr = (struct ieee80211_hdr *) skb->data; + hdr = (struct ieee80211_hdr_4addr *)skb->data; if (!tkey->key_set) return -1; @@ -818,17 +595,14 @@ static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, tkey->rx_hdr[12] = *(skb->data + hdr_len - 2) & 0x07; } // } - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, - skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) - #else + if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, - skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) - #endif - return -1; + 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), @@ -854,29 +628,19 @@ static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) { struct ieee80211_tkip_data *tkey = priv; int keyidx; - #if ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - struct crypto_tfm *tfm = tkey->tfm_michael; - struct crypto_tfm *tfm2 = tkey->tfm_arc4; - #else struct crypto_hash *tfm = tkey->tx_tfm_michael; struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4; struct crypto_hash *tfm3 = tkey->rx_tfm_michael; struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4; - #endif keyidx = tkey->key_idx; memset(tkey, 0, sizeof(*tkey)); tkey->key_idx = keyidx; - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - tkey->tfm_michael = tfm; - tkey->tfm_arc4 = tfm2; - #else tkey->tx_tfm_michael = tfm; tkey->tx_tfm_arc4 = tfm2; tkey->rx_tfm_michael = tfm3; tkey->rx_tfm_arc4 = tfm4; - #endif if (len == TKIP_KEY_LEN) { memcpy(tkey->key, key, TKIP_KEY_LEN); @@ -987,15 +751,3 @@ void ieee80211_tkip_null(void) // printk("============>%s()\n", __func__); return; } - -#if 0 -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) -EXPORT_SYMBOL(ieee80211_tkip_null); -#else -EXPORT_SYMBOL_NOVERS(ieee80211_tkip_null); -#endif -#endif - - -//module_init(ieee80211_crypto_tkip_init); -//module_exit(ieee80211_crypto_tkip_exit); diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_wep.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_wep.c index 68a22b3..c6c3bc3 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_wep.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt_wep.c @@ -20,29 +20,14 @@ #include "ieee80211.h" -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) -#include "rtl_crypto.h" -#else #include <linux/crypto.h> -#endif - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) - #include <asm/scatterlist.h> -#else - #include <linux/scatterlist.h> -#endif -//#include <asm/scatterlist.h> +#include <linux/scatterlist.h> #include <linux/crc32.h> MODULE_AUTHOR("Jouni Malinen"); MODULE_DESCRIPTION("Host AP crypt: WEP"); MODULE_LICENSE("GPL"); -#ifdef OPENSUSE_SLED -#ifndef IN_OPENSUSE_SLED -#define IN_OPENSUSE_SLED 1 -#endif -#endif struct prism2_wep_data { @@ -51,12 +36,8 @@ struct prism2_wep_data { u8 key[WEP_KEY_LEN + 1]; u8 key_len; u8 key_idx; - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - struct crypto_tfm *tfm; - #else struct crypto_blkcipher *tx_tfm; struct crypto_blkcipher *rx_tfm; - #endif }; @@ -69,14 +50,6 @@ static void * prism2_wep_init(int keyidx) goto fail; memset(priv, 0, sizeof(*priv)); priv->key_idx = keyidx; - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - priv->tfm = crypto_alloc_tfm("arc4", 0); - if (priv->tfm == NULL) { - printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " - "crypto API arc4\n"); - goto fail; - } - #else priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC); if (IS_ERR(priv->tx_tfm)) { printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " @@ -91,7 +64,6 @@ static void * prism2_wep_init(int keyidx) priv->rx_tfm = NULL; goto fail; } - #endif /* start WEP IV from a random value */ get_random_bytes(&priv->iv, 4); @@ -99,14 +71,6 @@ static void * prism2_wep_init(int keyidx) return priv; fail: - //#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - if (priv) { - if (priv->tfm) - crypto_free_tfm(priv->tfm); - kfree(priv); - } - #else if (priv) { if (priv->tx_tfm) crypto_free_blkcipher(priv->tx_tfm); @@ -114,7 +78,7 @@ fail: crypto_free_blkcipher(priv->rx_tfm); kfree(priv); } - #endif + return NULL; } @@ -122,18 +86,14 @@ fail: static void prism2_wep_deinit(void *priv) { struct prism2_wep_data *_priv = priv; - //#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - if (_priv && _priv->tfm) - crypto_free_tfm(_priv->tfm); - #else + if (_priv) { if (_priv->tx_tfm) crypto_free_blkcipher(_priv->tx_tfm); if (_priv->rx_tfm) crypto_free_blkcipher(_priv->rx_tfm); } - #endif + kfree(priv); } @@ -147,18 +107,14 @@ static void prism2_wep_deinit(void *priv) static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; -//#if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))||(IN_OPENSUSE_SLED)) - struct blkcipher_desc desc = {.tfm = wep->tx_tfm}; -#endif + struct blkcipher_desc desc = { .tfm = wep->tx_tfm }; u32 klen, len; u8 key[WEP_KEY_LEN + 3]; u8 *pos; -#ifndef JOHN_HWSEC u32 crc; u8 *icv; struct scatterlist sg; -#endif + if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || skb->len < hdr_len) return -1; @@ -190,41 +146,18 @@ static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) /* Copy rest of the WEP key (the secret part) */ memcpy(key + 3, wep->key, wep->key_len); -#ifndef JOHN_HWSEC /* Append little-endian CRC32 and encrypt it to produce ICV */ -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) crc = ~crc32_le(~0, pos, len); -#else - crc = ~ether_crc_le(len, pos); -#endif icv = skb_put(skb, 4); icv[0] = crc; icv[1] = crc >> 8; icv[2] = crc >> 16; icv[3] = crc >> 24; - //#if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) - #if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - crypto_cipher_setkey(wep->tfm, key, klen); - sg.page = virt_to_page(pos); - sg.offset = offset_in_page(pos); - sg.length = len + 4; - crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); - - return 0; - #else crypto_blkcipher_setkey(wep->tx_tfm, key, klen); - #if(LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) - sg.page = virt_to_page(pos); - sg.offset = offset_in_page(pos); - sg.length = len + 4; - #else - sg_init_one(&sg, pos, len+4); - #endif + sg_init_one(&sg, pos, len + 4); + return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4); - #endif -#endif /* JOHN_HWSEC */ - return 0; } @@ -238,18 +171,14 @@ static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) { struct prism2_wep_data *wep = priv; - //#if(LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) - #if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))||(IN_OPENSUSE_SLED)) - struct blkcipher_desc desc = {.tfm = wep->rx_tfm}; - #endif + struct blkcipher_desc desc = { .tfm = wep->rx_tfm }; u32 klen, plen; u8 key[WEP_KEY_LEN + 3]; u8 keyidx, *pos; -#ifndef JOHN_HWSEC u32 crc; u8 icv[4]; struct scatterlist sg; -#endif + if (skb->len < hdr_len + 8) return -1; @@ -268,32 +197,14 @@ static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) /* Apply RC4 to data and compute CRC32 over decrypted data */ plen = skb->len - hdr_len - 8; -#ifndef JOHN_HWSEC -//#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) -#if((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))&&(!IN_OPENSUSE_SLED)) - crypto_cipher_setkey(wep->tfm, key, klen); - sg.page = virt_to_page(pos); - sg.offset = offset_in_page(pos); - sg.length = plen + 4; - crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); -#else + crypto_blkcipher_setkey(wep->rx_tfm, key, klen); - #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)) - sg.page = virt_to_page(pos); - sg.offset = offset_in_page(pos); - sg.length = plen + 4; - #else - sg_init_one(&sg, pos, plen+4); - #endif + sg_init_one(&sg, pos, plen + 4); + if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) return -7; -#endif -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) crc = ~crc32_le(~0, pos, plen); -#else - crc = ~ether_crc_le(plen, pos); -#endif icv[0] = crc; icv[1] = crc >> 8; icv[2] = crc >> 16; @@ -303,7 +214,6 @@ static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) /* ICV mismatch - drop frame */ return -2; } -#endif /* JOHN_HWSEC */ /* Remove IV and ICV */ memmove(skb->data + 4, skb->data, hdr_len); @@ -383,12 +293,3 @@ void ieee80211_wep_null(void) // printk("============>%s()\n", __func__); return; } -#if 0 -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) -EXPORT_SYMBOL(ieee80211_wep_null); -#else -EXPORT_SYMBOL_NOVERS(ieee80211_wep_null); -#endif -#endif -//module_init(ieee80211_crypto_wep_init); -//module_exit(ieee80211_crypto_wep_exit); diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_module.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_module.c index c2b61e6..6fbe489 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_module.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_module.c @@ -210,91 +210,3 @@ void free_ieee80211(struct net_device *dev) free_netdev(dev); } - -//#ifdef CONFIG_IEEE80211_DEBUG -#if 0 - -static int debug = 0; -u32 ieee80211_debug_level = 0; -struct proc_dir_entry *ieee80211_proc = NULL; - -static int show_debug_level(char *page, char **start, off_t offset, - int count, int *eof, void *data) -{ - return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); -} - -static int store_debug_level(struct file *file, const char *buffer, - unsigned long count, void *data) -{ - char buf[] = "0x00000000"; - unsigned long len = min(sizeof(buf) - 1, (u32)count); - char *p = (char *)buf; - unsigned long val; - - if (copy_from_user(buf, buffer, len)) - return count; - buf[len] = 0; - if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') { - p++; - if (p[0] == 'x' || p[0] == 'X') - p++; - val = simple_strtoul(p, &p, 16); - } else - val = simple_strtoul(p, &p, 10); - if (p == buf) - printk(KERN_INFO DRV_NAME - ": %s is not in hex or decimal form.\n", buf); - else - ieee80211_debug_level = val; - - return strnlen(buf, count); -} - -static int __init ieee80211_init(void) -{ - struct proc_dir_entry *e; - - ieee80211_debug_level = debug; - ieee80211_proc = create_proc_entry(DRV_NAME, S_IFDIR, proc_net); - if (ieee80211_proc == NULL) { - IEEE80211_ERROR("Unable to create " DRV_NAME - " proc directory\n"); - return -EIO; - } - e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR, - ieee80211_proc); - if (!e) { - remove_proc_entry(DRV_NAME, proc_net); - ieee80211_proc = NULL; - return -EIO; - } - e->read_proc = show_debug_level; - e->write_proc = store_debug_level; - e->data = NULL; - - return 0; -} - -static void __exit ieee80211_exit(void) -{ - if (ieee80211_proc) { - remove_proc_entry("debug_level", ieee80211_proc); - remove_proc_entry(DRV_NAME, proc_net); - ieee80211_proc = NULL; - } -} - -#include <linux/moduleparam.h> -module_param(debug, int, 0444); -MODULE_PARM_DESC(debug, "debug output mask"); - - -module_exit(ieee80211_exit); -module_init(ieee80211_init); -#endif - -#if 0 -EXPORT_SYMBOL(alloc_ieee80211); -EXPORT_SYMBOL(free_ieee80211); -#endif diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c index 4d4ee56..5e2e79b 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_rx.c @@ -44,22 +44,17 @@ #include <linux/ctype.h> #include "ieee80211.h" -#ifdef ENABLE_DOT11D #include "dot11d.h" -#endif static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats) { - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; + struct ieee80211_hdr_4addr *hdr = + (struct ieee80211_hdr_4addr *)skb->data; u16 fc = le16_to_cpu(hdr->frame_ctl); skb->dev = ieee->dev; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) - skb_reset_mac_header(skb); -#else - skb->mac.raw = skb->data; -#endif + skb_reset_mac_header(skb); skb_pull(skb, ieee80211_get_hdrlen(fc)); skb->pkt_type = PACKET_OTHERHOST; skb->protocol = __constant_htons(ETH_P_80211_RAW); @@ -101,7 +96,7 @@ ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, /* 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 fc = le16_to_cpu(hdr->frame_ctl); @@ -109,25 +104,18 @@ ieee80211_frag_cache_get(struct ieee80211_device *ieee, unsigned int frag = WLAN_GET_SEQ_FRAG(sc); unsigned int seq = WLAN_GET_SEQ_SEQ(sc); struct ieee80211_frag_entry *entry; - struct ieee80211_hdr_3addr_QOS *hdr_3addr_QoS; - struct ieee80211_hdr_QOS *hdr_4addr_QoS; + struct ieee80211_hdr_3addrqos *hdr_3addrqos; + struct ieee80211_hdr_4addrqos *hdr_4addrqos; u8 tid; -#ifdef _RTL8187_EXT_PATCH_ - if(ieee->iw_mode == ieee->iw_ext_mode) - { - tid = (hdr->addr2[ETH_ALEN-2] ^ hdr->addr2[ETH_ALEN-1]) & IEEE80211_QOS_TID; - } - else -#endif if (((fc & IEEE80211_FCTL_DSTODS) == IEEE80211_FCTL_DSTODS)&&IEEE80211_QOS_HAS_SEQ(fc)) { - hdr_4addr_QoS = (struct ieee80211_hdr_QOS *)hdr; - tid = le16_to_cpu(hdr_4addr_QoS->QOS_ctl) & IEEE80211_QOS_TID; + hdr_4addrqos = (struct ieee80211_hdr_4addrqos *)hdr; + tid = le16_to_cpu(hdr_4addrqos->qos_ctl) & IEEE80211_QOS_TID; tid = UP2AC(tid); tid ++; } else if (IEEE80211_QOS_HAS_SEQ(fc)) { - hdr_3addr_QoS = (struct ieee80211_hdr_3addr_QOS *)hdr; - tid = le16_to_cpu(hdr_3addr_QoS->QOS_ctl) & IEEE80211_QOS_TID; + hdr_3addrqos = (struct ieee80211_hdr_3addrqos *)hdr; + tid = le16_to_cpu(hdr_3addrqos->qos_ctl) & IEEE80211_QOS_TID; tid = UP2AC(tid); tid ++; } else { @@ -137,7 +125,7 @@ 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 */ + @@ -177,31 +165,24 @@ 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 fc = le16_to_cpu(hdr->frame_ctl); u16 sc = le16_to_cpu(hdr->seq_ctl); unsigned int seq = WLAN_GET_SEQ_SEQ(sc); struct ieee80211_frag_entry *entry; - struct ieee80211_hdr_3addr_QOS *hdr_3addr_QoS; - struct ieee80211_hdr_QOS *hdr_4addr_QoS; + struct ieee80211_hdr_3addrqos *hdr_3addrqos; + struct ieee80211_hdr_4addrqos *hdr_4addrqos; u8 tid; -#ifdef _RTL8187_EXT_PATCH_ - if(ieee->iw_mode == ieee->iw_ext_mode) - { - tid = (hdr->addr2[ETH_ALEN-2] ^ hdr->addr2[ETH_ALEN-1]) & IEEE80211_QOS_TID; - } - else -#endif if(((fc & IEEE80211_FCTL_DSTODS) == IEEE80211_FCTL_DSTODS)&&IEEE80211_QOS_HAS_SEQ(fc)) { - hdr_4addr_QoS = (struct ieee80211_hdr_QOS *)hdr; - tid = le16_to_cpu(hdr_4addr_QoS->QOS_ctl) & IEEE80211_QOS_TID; + hdr_4addrqos = (struct ieee80211_hdr_4addrqos *)hdr; + tid = le16_to_cpu(hdr_4addrqos->qos_ctl) & IEEE80211_QOS_TID; tid = UP2AC(tid); tid ++; } else if (IEEE80211_QOS_HAS_SEQ(fc)) { - hdr_3addr_QoS = (struct ieee80211_hdr_3addr_QOS *)hdr; - tid = le16_to_cpu(hdr_3addr_QoS->QOS_ctl) & IEEE80211_QOS_TID; + hdr_3addrqos = (struct ieee80211_hdr_3addrqos *)hdr; + tid = le16_to_cpu(hdr_3addrqos->qos_ctl) & IEEE80211_QOS_TID; tid = UP2AC(tid); tid ++; } else { @@ -234,17 +215,18 @@ ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, struct ieee80211_rx_stats *rx_stats, u16 type, u16 stype) { - struct ieee80211_hdr *hdr; + struct ieee80211_hdr_4addr *hdr; // cheat the the hdr type - hdr = (struct ieee80211_hdr *)skb->data; + hdr = (struct ieee80211_hdr_4addr *)skb->data; /* On the struct stats definition there is written that * this is not mandatory.... but seems that the probe * response parser uses it */ rx_stats->len = skb->len; - ieee80211_rx_mgt(ieee,(struct ieee80211_hdr *)skb->data,rx_stats); + ieee80211_rx_mgt(ieee, (struct ieee80211_hdr_4addr *)skb->data, + rx_stats); if((ieee->state == IEEE80211_LINKED)&&(memcmp(hdr->addr3,ieee->current_network.bssid,ETH_ALEN))) { dev_kfree_skb_any(skb); @@ -257,51 +239,6 @@ ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, return 0; - #ifdef NOT_YET - if (ieee->iw_mode == IW_MODE_MASTER) { - printk(KERN_DEBUG "%s: Master mode not yet suppported.\n", - ieee->dev->name); - return 0; -/* - hostap_update_sta_ps(ieee, (struct hostap_ieee80211_hdr *) - skb->data);*/ - } - - if (ieee->hostapd && type == IEEE80211_TYPE_MGMT) { - if (stype == WLAN_FC_STYPE_BEACON && - ieee->iw_mode == IW_MODE_MASTER) { - struct sk_buff *skb2; - /* Process beacon frames also in kernel driver to - * update STA(AP) table statistics */ - skb2 = skb_clone(skb, GFP_ATOMIC); - if (skb2) - hostap_rx(skb2->dev, skb2, rx_stats); - } - - /* send management frames to the user space daemon for - * processing */ - ieee->apdevstats.rx_packets++; - ieee->apdevstats.rx_bytes += skb->len; - prism2_rx_80211(ieee->apdev, skb, rx_stats, PRISM2_RX_MGMT); - return 0; - } - - if (ieee->iw_mode == IW_MODE_MASTER) { - if (type != WLAN_FC_TYPE_MGMT && type != WLAN_FC_TYPE_CTRL) { - printk(KERN_DEBUG "%s: unknown management frame " - "(type=0x%02x, stype=0x%02x) dropped\n", - skb->dev->name, type, stype); - return -1; - } - - hostap_rx(skb->dev, skb, rx_stats); - return 0; - } - - printk(KERN_DEBUG "%s: hostap_rx_frame_mgmt: management frame " - "received in non-Host AP mode\n", skb->dev->name); - return -1; - #endif } @@ -321,13 +258,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_4addr *hdr; u8 *pos; if (skb->len < 24) return 0; - hdr = (struct ieee80211_hdr *) skb->data; + hdr = (struct ieee80211_hdr_4addr *)skb->data; fc = le16_to_cpu(hdr->frame_ctl); /* check that the frame is unicast frame to us */ @@ -361,20 +298,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_4addr *hdr; int res, hdrlen; if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL) return 0; - hdr = (struct ieee80211_hdr *) skb->data; -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && (ieee->ext_patch_ieee80211_rx_frame_get_hdrlen)) - { - hdrlen = ieee->ext_patch_ieee80211_rx_frame_get_hdrlen(ieee, skb); - } - else -#endif + hdr = (struct ieee80211_hdr_4addr *)skb->data; hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); #ifdef CONFIG_IEEE80211_CRYPT_TKIP @@ -413,20 +343,13 @@ static inline int 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_4addr *hdr; int res, hdrlen; if (crypt == NULL || crypt->ops->decrypt_msdu == NULL) return 0; - hdr = (struct ieee80211_hdr *) skb->data; -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && (ieee->ext_patch_ieee80211_rx_frame_get_hdrlen)) - { - hdrlen = ieee->ext_patch_ieee80211_rx_frame_get_hdrlen(ieee, skb); - } - else -#endif + hdr = (struct ieee80211_hdr_4addr *)skb->data; hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); @@ -446,7 +369,7 @@ ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *s /* this function is stolen from ipw2200 driver*/ #define IEEE_PACKET_RETRY_TIME (5*HZ) static int is_duplicate_packet(struct ieee80211_device *ieee, - struct ieee80211_hdr *header) + struct ieee80211_hdr_4addr *header) { u16 fc = le16_to_cpu(header->frame_ctl); u16 sc = le16_to_cpu(header->seq_ctl); @@ -454,26 +377,19 @@ static int is_duplicate_packet(struct ieee80211_device *ieee, u16 frag = WLAN_GET_SEQ_FRAG(sc); u16 *last_seq, *last_frag; unsigned long *last_time; - struct ieee80211_hdr_3addr_QOS *hdr_3addr_QoS; - struct ieee80211_hdr_QOS *hdr_4addr_QoS; + struct ieee80211_hdr_3addrqos *hdr_3addrqos; + struct ieee80211_hdr_4addrqos *hdr_4addrqos; u8 tid; -#ifdef _RTL8187_EXT_PATCH_ - if(ieee->iw_mode == ieee->iw_ext_mode) - { - tid = (header->addr2[ETH_ALEN-2] ^ header->addr2[ETH_ALEN-1]) & IEEE80211_QOS_TID; - } - else -#endif //TO2DS and QoS if(((fc & IEEE80211_FCTL_DSTODS) == IEEE80211_FCTL_DSTODS)&&IEEE80211_QOS_HAS_SEQ(fc)) { - hdr_4addr_QoS = (struct ieee80211_hdr_QOS *)header; - tid = le16_to_cpu(hdr_4addr_QoS->QOS_ctl) & IEEE80211_QOS_TID; + hdr_4addrqos = (struct ieee80211_hdr_4addrqos *)header; + tid = le16_to_cpu(hdr_4addrqos->qos_ctl) & IEEE80211_QOS_TID; tid = UP2AC(tid); tid ++; } else if(IEEE80211_QOS_HAS_SEQ(fc)) { //QoS - hdr_3addr_QoS = (struct ieee80211_hdr_3addr_QOS*)header; - tid = le16_to_cpu(hdr_3addr_QoS->QOS_ctl) & IEEE80211_QOS_TID; + hdr_3addrqos = (struct ieee80211_hdr_3addrqos *)header; + tid = le16_to_cpu(hdr_3addrqos->qos_ctl) & IEEE80211_QOS_TID; tid = UP2AC(tid); tid ++; } else { // no QoS @@ -519,16 +435,6 @@ static int is_duplicate_packet(struct ieee80211_device *ieee, break; default: -#ifdef _RTL8187_EXT_PATCH_ - if(ieee->iw_mode == ieee->iw_ext_mode) - { - last_seq = &ieee->last_rxseq_num[tid]; - last_frag = &ieee->last_rxfrag_num[tid]; - last_time = &ieee->last_packet_time[tid]; - break; - } - else -#endif return 0; } @@ -569,8 +475,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, { struct net_device *dev = ieee->dev; //struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); - struct ieee80211_hdr *hdr; - //struct ieee80211_hdr_3addr_QOS *hdr; + struct ieee80211_hdr_4addr *hdr; size_t hdrlen; u16 fc, type, stype, sc; @@ -578,28 +483,14 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, unsigned int frag; u8 *payload; u16 ethertype; -#ifdef NOT_YET - struct net_device *wds = NULL; - struct sk_buff *skb2 = NULL; - struct net_device *wds = NULL; - int frame_authorized = 0; - int from_assoc_ap = 0; - void *sta = NULL; -#endif -// u16 QOS_ctl = 0; u8 dst[ETH_ALEN]; u8 src[ETH_ALEN]; u8 bssid[ETH_ALEN]; struct ieee80211_crypt_data *crypt = NULL; int keyidx = 0; - //Added for mesh by Lawrence. -#ifdef _RTL8187_EXT_PATCH_ - u8 status; - u32 flags; -#endif // cheat the the hdr type - hdr = (struct ieee80211_hdr *)skb->data; + hdr = (struct ieee80211_hdr_4addr *)skb->data; stats = &ieee->stats; if (skb->len < 10) { @@ -632,63 +523,21 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, } //YJ,add,080828,for keep alive,end -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && (ieee->ext_patch_ieee80211_rx_frame_get_hdrlen)) - { - hdrlen = ieee->ext_patch_ieee80211_rx_frame_get_hdrlen(ieee, skb); - if(skb->len < hdrlen) - goto rx_dropped; - } - else -#endif hdrlen = ieee80211_get_hdrlen(fc); -#ifdef NOT_YET -#if WIRELESS_EXT > 15 - /* Put this code here so that we avoid duplicating it in all - * Rx paths. - Jean II */ -#ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ - /* If spy monitoring on */ - if (iface->spy_data.spy_number > 0) { - struct iw_quality wstats; - wstats.level = rx_stats->signal; - wstats.noise = rx_stats->noise; - wstats.updated = 6; /* No qual value */ - /* Update spy records */ - wireless_spy_update(dev, hdr->addr2, &wstats); - } -#endif /* IW_WIRELESS_SPY */ -#endif /* WIRELESS_EXT > 15 */ - hostap_update_rx_stats(local->ap, hdr, rx_stats); -#endif -#if WIRELESS_EXT > 15 if (ieee->iw_mode == IW_MODE_MONITOR) { ieee80211_monitor_rx(ieee, skb, rx_stats); stats->rx_packets++; stats->rx_bytes += skb->len; return 1; } -#endif + if (ieee->host_decrypt) { int idx = 0; if (skb->len >= hdrlen + 3) idx = skb->data[hdrlen + 3] >> 6; crypt = ieee->crypt[idx]; -#ifdef NOT_YET - sta = NULL; - - /* Use station specific key to override default keys if the - * receiver address is a unicast address ("individual RA"). If - * bcrx_sta_key parameter is set, station specific key is used - * even with broad/multicast targets (this is against IEEE - * 802.11, but makes it easier to use different keys with - * stations that do not support WEP key mapping). */ - - if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) - (void) hostap_handle_sta_crypto(local, hdr, &crypt, - &sta); -#endif /* allow NULL decrypt to indicate an station specific override * for default encryption */ @@ -712,47 +561,17 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, if (skb->len < IEEE80211_DATA_HDR3_LEN) goto rx_dropped; -#ifdef _RTL8187_EXT_PATCH_ - if( ieee->iw_mode == ieee->iw_ext_mode && ieee->ext_patch_ieee80211_rx_mgt_update_expire ) - ieee->ext_patch_ieee80211_rx_mgt_update_expire( ieee, skb ); -#endif - // if QoS enabled, should check the sequence for each of the AC if (is_duplicate_packet(ieee, hdr)) goto rx_dropped; if (type == IEEE80211_FTYPE_MGMT) { - - #if 0 - if ( stype == IEEE80211_STYPE_AUTH && - fc & IEEE80211_FCTL_WEP && ieee->host_decrypt && - (keyidx = hostap_rx_frame_decrypt(ieee, skb, crypt)) < 0) - { - printk(KERN_DEBUG "%s: failed to decrypt mgmt::auth " - "from " MAC_FMT "\n", dev->name, - MAC_ARG(hdr->addr2)); - /* TODO: could inform hostapd about this so that it - * could send auth failure report */ - goto rx_dropped; - } - #endif - - if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) goto rx_dropped; else goto rx_exit; } -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_on_rx) - { - if(ieee->ext_patch_ieee80211_rx_on_rx(ieee, skb, rx_stats, type, stype)==0) - { - goto rx_exit; - } - } -#endif /* Data frame - extract src/dst addresses */ switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { @@ -780,55 +599,10 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, break; } -#ifdef NOT_YET - if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) - goto rx_dropped; - if (wds) { - skb->dev = dev = wds; - stats = hostap_get_stats(dev); - } - - if (ieee->iw_mode == IW_MODE_MASTER && !wds && - (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == IEEE80211_FCTL_FROMDS && - ieee->stadev && - memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { - /* Frame from BSSID of the AP for which we are a client */ - skb->dev = dev = ieee->stadev; - stats = hostap_get_stats(dev); - from_assoc_ap = 1; - } -#endif dev->last_rx = jiffies; -#ifdef NOT_YET - if ((ieee->iw_mode == IW_MODE_MASTER || - ieee->iw_mode == IW_MODE_REPEAT) && - !from_assoc_ap) { - switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, - wds != NULL)) { - case AP_RX_CONTINUE_NOT_AUTHORIZED: - frame_authorized = 0; - break; - case AP_RX_CONTINUE: - frame_authorized = 1; - break; - case AP_RX_DROP: - goto rx_dropped; - case AP_RX_EXIT: - goto rx_exit; - } - } -#endif -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_is_valid_framectl) - { - if(ieee->ext_patch_ieee80211_rx_is_valid_framectl(ieee, fc, type, stype)==0) - goto rx_dropped; - } - else -#endif /* Nullfunc frames may have PS-bit set, so they must be passed to * hostap_handle_sta_rx() before being dropped here. */ if (stype != IEEE80211_STYPE_DATA && @@ -857,7 +631,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: @@ -910,7 +684,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); } @@ -920,7 +694,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_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ ieee80211_is_eapol_frame(ieee, skb, hdrlen)) { @@ -970,47 +744,6 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, payload = skb->data + hdrlen; ethertype = (payload[6] << 8) | payload[7]; -#ifdef NOT_YET - /* If IEEE 802.1X is used, check whether the port is authorized to send - * the received frame. */ - if (ieee->ieee802_1x && ieee->iw_mode == IW_MODE_MASTER) { - if (ethertype == ETH_P_PAE) { - printk(KERN_DEBUG "%s: RX: IEEE 802.1X frame\n", - dev->name); - if (ieee->hostapd && ieee->apdev) { - /* Send IEEE 802.1X frames to the user - * space daemon for processing */ - prism2_rx_80211(ieee->apdev, skb, rx_stats, - PRISM2_RX_MGMT); - ieee->apdevstats.rx_packets++; - ieee->apdevstats.rx_bytes += skb->len; - goto rx_exit; - } - } else if (!frame_authorized) { - printk(KERN_DEBUG "%s: dropped frame from " - "unauthorized port (IEEE 802.1X): " - "ethertype=0x%04x\n", - dev->name, ethertype); - goto rx_dropped; - } - } -#endif - -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_process_dataframe) - { - //Added for mesh rx interrupt. - //spin_lock_irqsave(&ieee->lock,flags); - status = ieee->ext_patch_ieee80211_rx_process_dataframe(ieee, skb, rx_stats); - //spin_unlock_irqrestore(&ieee->lock,flags); - - if(status) -// if(ieee->ext_patch_ieee80211_rx_process_dataframe(ieee, skb, rx_stats)) - goto rx_exit; - else - goto rx_dropped; - } -#endif /* convert hdr + possible LLC headers into Ethernet header */ if (skb->len - hdrlen >= 8 && @@ -1032,51 +765,10 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN); } -#ifdef NOT_YET - if (wds && ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == - IEEE80211_FCTL_TODS) && - skb->len >= ETH_HLEN + ETH_ALEN) { - /* Non-standard frame: get addr4 from its bogus location after - * the payload */ - memcpy(skb->data + ETH_ALEN, - skb->data + skb->len - ETH_ALEN, ETH_ALEN); - skb_trim(skb, skb->len - ETH_ALEN); - } -#endif stats->rx_packets++; stats->rx_bytes += skb->len; -#ifdef NOT_YET - if (ieee->iw_mode == IW_MODE_MASTER && !wds && - ieee->ap->bridge_packets) { - if (dst[0] & 0x01) { - /* copy multicast frame both to the higher layers and - * to the wireless media */ - ieee->ap->bridged_multicast++; - skb2 = skb_clone(skb, GFP_ATOMIC); - if (skb2 == NULL) - printk(KERN_DEBUG "%s: skb_clone failed for " - "multicast frame\n", dev->name); - } else if (hostap_is_sta_assoc(ieee->ap, dst)) { - /* send frame directly to the associated STA using - * wireless media and not passing to higher layers */ - ieee->ap->bridged_unicast++; - skb2 = skb; - skb = NULL; - } - } - - if (skb2 != NULL) { - /* send to wireless media */ - skb2->protocol = __constant_htons(ETH_P_802_3); - skb2->mac.raw = skb2->nh.raw = skb2->data; - /* skb2->nh.raw = skb2->data + ETH_HLEN; */ - skb2->dev = dev; - dev_queue_xmit(skb2); - } - -#endif if (skb) { skb->protocol = eth_type_trans(skb, dev); memset(skb->cb, 0, sizeof(skb->cb)); @@ -1087,10 +779,6 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, } rx_exit: -#ifdef NOT_YET - if (sta) - hostap_handle_sta_release(sta); -#endif return 1; rx_dropped: @@ -1102,41 +790,6 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, return 0; } -#ifdef _RTL8187_EXT_PATCH_ -int ieee_ext_skb_p80211_to_ether(struct sk_buff *skb, int hdrlen, u8 *dst, u8 *src) -{ - u8 *payload; - u16 ethertype; - - /* skb: hdr + (possible reassembled) full plaintext payload */ - payload = skb->data + hdrlen; - ethertype = (payload[6] << 8) | payload[7]; - - /* convert hdr + possible LLC headers into Ethernet header */ - if (skb->len - hdrlen >= 8 && - ((memcmp(payload, rfc1042_header, SNAP_SIZE) == 0 && - ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) || - memcmp(payload, bridge_tunnel_header, SNAP_SIZE) == 0)) { - /* remove RFC1042 or Bridge-Tunnel encapsulation and - * replace EtherType */ - skb_pull(skb, hdrlen + SNAP_SIZE); - memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN); - memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN); - } else { - u16 len; - /* Leave Ethernet header part of hdr and full payload */ - skb_pull(skb, hdrlen); - len = htons(skb->len); - memcpy(skb_push(skb, 2), &len, 2); - memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN); - memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN); - } - - return 1; -} -#endif // _RTL8187_EXT_PATCH_ - - #define MGMT_FRAME_FIXED_PART_LENGTH 0x24 static inline int ieee80211_is_ofdm_rate(u8 rate) @@ -1211,7 +864,6 @@ static inline int ieee80211_SignalStrengthTranslate( return RetSS; } -#ifdef ENABLE_DOT11D static inline void ieee80211_extract_country_ie( struct ieee80211_device *ieee, struct ieee80211_info_element *info_element, @@ -1219,15 +871,6 @@ static inline void ieee80211_extract_country_ie( u8 * addr2 ) { -#if 0 - u32 i = 0; - u8 * p = (u8*)info_element->data; - printk("-----------------------\n"); - printk("%s Country IE:", network->ssid); - for(i=0; i<info_element->len; i++) - printk("\t%2.2x", *(p+i)); - printk("\n-----------------------\n"); -#endif if(IS_DOT11D_ENABLE(ieee)) { if(info_element->len!= 0) @@ -1253,7 +896,6 @@ static inline void ieee80211_extract_country_ie( } } -#endif int ieee80211_TranslateToDbm( @@ -1302,13 +944,9 @@ inline int ieee80211_network_init( //by amy 080312 network->HighestOperaRate = 0; //by amy 080312 -#ifdef THOMAS_TURBO network->Turbo_Enable = 0; -#endif -#ifdef ENABLE_DOT11D network->CountryIeLen = 0; memset(network->CountryIeBuf, 0, MAX_IE_LEN); -#endif if (stats->freq == IEEE80211_52GHZ_BAND) { /* for A band (No DS info) */ @@ -1424,11 +1062,8 @@ inline int ieee80211_network_init( if(ieee->state != IEEE80211_LINKED) break; -#if 0 - network->last_dtim_sta_time[0] = stats->mac_time[0]; -#else + network->last_dtim_sta_time[0] = jiffies; -#endif network->last_dtim_sta_time[1] = stats->mac_time[1]; network->dtim_data = IEEE80211_DTIM_VALID; @@ -1483,7 +1118,6 @@ inline int ieee80211_network_init( network->wpa_ie_len); } -#ifdef THOMAS_TURBO if (info_element->len == 7 && info_element->data[0] == 0x00 && info_element->data[1] == 0xe0 && @@ -1492,7 +1126,6 @@ inline int ieee80211_network_init( info_element->data[4] == 0x02) { network->Turbo_Enable = 1; } -#endif if (1 == stats->nic_type) {//nic 87 break; } @@ -1533,14 +1166,12 @@ inline int ieee80211_network_init( memcpy(network->rsn_ie, info_element, network->rsn_ie_len); break; -#ifdef ENABLE_DOT11D case MFIE_TYPE_COUNTRY: IEEE80211_DEBUG_SCAN("MFIE_TYPE_COUNTRY: %d bytes\n", info_element->len); // printk("=====>Receive <%s> Country IE\n",network->ssid); ieee80211_extract_country_ie(ieee, info_element, network, beacon->header.addr2); break; -#endif default: IEEE80211_DEBUG_SCAN("unsupported IE %d\n", info_element->id); @@ -1576,9 +1207,7 @@ inline int ieee80211_network_init( if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) network->flags |= NETWORK_EMPTY_ESSID; -#if 0 - stats->signal = ieee80211_SignalStrengthTranslate(stats->signal); -#endif + stats->signal = ieee80211_TranslateToDbm(stats->signalstrength); //stats->noise = stats->signal - stats->noise; stats->noise = ieee80211_TranslateToDbm(100 - stats->signalstrength) - 25; @@ -1688,13 +1317,9 @@ inline void update_network(struct ieee80211_network *dst, dst->QoS_Enable = 1;//for Rtl8187 simulation #endif dst->SignalStrength = src->SignalStrength; -#ifdef THOMAS_TURBO dst->Turbo_Enable = src->Turbo_Enable; -#endif -#ifdef ENABLE_DOT11D dst->CountryIeLen = src->CountryIeLen; memcpy(dst->CountryIeBuf, src->CountryIeBuf, src->CountryIeLen); -#endif } @@ -1715,13 +1340,6 @@ inline void ieee80211_process_probe_response( u8 is_beacon = (WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_BEACON)? 1:0; //YJ,add,080819,for hidden ap memset(&network, 0, sizeof(struct ieee80211_network)); -//rz -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_process_probe_response_1) { - ieee->ext_patch_ieee80211_process_probe_response_1(ieee, beacon, stats); - return; - } -#endif IEEE80211_DEBUG_SCAN( "'%s' (" MAC_FMT "): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n", @@ -1743,21 +1361,7 @@ inline void ieee80211_process_probe_response( (beacon->capability & (1<<0x2)) ? '1' : '0', (beacon->capability & (1<<0x1)) ? '1' : '0', (beacon->capability & (1<<0x0)) ? '1' : '0'); -#if 0 - if(strcmp(escape_essid(beacon->info_element.data, beacon->info_element.len), "rtl_softap") == 0) - { - if(WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_BEACON) - { - u32 i = 0, len = stats->len; - u8 * p = (u8*)beacon; - printk("-----------------------\n"); - printk("rtl_softap Beacon:"); - for(i=0; i<len; i++) - printk("\t%2.2x", *(p+i)); - printk("\n-----------------------\n"); - } - } -#endif + if (ieee80211_network_init(ieee, beacon, &network, stats)) { IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", escape_essid(info_element->data, @@ -1769,7 +1373,6 @@ inline void ieee80211_process_probe_response( return; } -#ifdef ENABLE_DOT11D // For Asus EeePc request, // (1) if wireless adapter receive get any 802.11d country code in AP beacon, // wireless adapter should follow the country code. @@ -1823,7 +1426,6 @@ inline void ieee80211_process_probe_response( } } } -#endif /* The network parsed correctly -- so now we scan our known networks * to see if we can find it in our list. * @@ -1886,9 +1488,6 @@ inline void ieee80211_process_probe_response( "PROBE RESPONSE" : "BEACON"); #endif -#ifdef _RTL8187_EXT_PATCH_ - network.ext_entry = target->ext_entry; -#endif memcpy(target, &network, sizeof(*target)); list_add_tail(&target->list, &ieee->network_list); if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) @@ -1926,7 +1525,7 @@ inline void ieee80211_process_probe_response( } 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(header->frame_ctl)) { @@ -1946,26 +1545,5 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, ieee80211_process_probe_response( ieee, (struct ieee80211_probe_response *)header, stats); break; -//rz -#ifdef _RTL8187_EXT_PATCH_ - case IEEE80211_STYPE_PROBE_REQ: - IEEE80211_DEBUG_MGMT("received PROBE REQUEST (%d)\n", - WLAN_FC_GET_STYPE(header->frame_ctl)); - IEEE80211_DEBUG_SCAN("Probe request\n"); - /// - if( ieee->iw_mode == ieee->iw_ext_mode && ieee->ext_patch_ieee80211_rx_mgt_on_probe_req ) - ieee->ext_patch_ieee80211_rx_mgt_on_probe_req( ieee, (struct ieee80211_probe_request *)header, stats); - break; -#endif // _RTL8187_EXT_PATCH_ - } } - -#if 0 -EXPORT_SYMBOL(ieee80211_rx_mgt); -EXPORT_SYMBOL(ieee80211_rx); -EXPORT_SYMBOL(ieee80211_network_init); -#ifdef _RTL8187_EXT_PATCH_ -EXPORT_SYMBOL(ieee_ext_skb_p80211_to_ether); -#endif -#endif diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac.c index 80f9cc7..59b2ab4 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac.c @@ -21,9 +21,7 @@ #include <linux/version.h> #include <asm/uaccess.h> -#ifdef ENABLE_DOT11D #include "dot11d.h" -#endif u8 rsn_authen_cipher_suite[16][4] = { {0x00,0x0F,0xAC,0x00}, //Use group key, //Reserved {0x00,0x0F,0xAC,0x01}, //WEP-40 //RSNA default @@ -129,7 +127,6 @@ void ieee80211_WMM_Info(struct ieee80211_device *ieee, u8 **tag_p) { *tag_p = tag; } -#ifdef THOMAS_TURBO void ieee80211_TURBO_Info(struct ieee80211_device *ieee, u8 **tag_p) { u8 *tag = *tag_p; @@ -146,7 +143,6 @@ void ieee80211_TURBO_Info(struct ieee80211_device *ieee, u8 **tag_p) { *tag_p = tag; printk(KERN_ALERT "This is enable turbo mode IE process\n"); } -#endif void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb) { @@ -325,27 +321,12 @@ inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) struct sk_buff *skb; struct ieee80211_probe_request *req; -#ifdef _RTL8187_EXT_PATCH_ - short extMore = 0; - if(ieee->ext_patch_ieee80211_probe_req_1) - extMore = ieee->ext_patch_ieee80211_probe_req_1(ieee); -#endif - len = ieee->current_network.ssid_len; rate_len = ieee80211_MFIE_rate_len(ieee); -#ifdef _RTL8187_EXT_PATCH_ - if(!extMore) -#endif skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + 2 + len + rate_len); -#ifdef _RTL8187_EXT_PATCH_ - else - skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + - 2 + len + rate_len+128); // MESHID + CAP -#endif - if (!skb) return NULL; @@ -366,24 +347,13 @@ inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee) ieee80211_MFIE_Brate(ieee,&tag); ieee80211_MFIE_Grate(ieee,&tag); -#ifdef _RTL8187_EXT_PATCH_ - if(extMore) - ieee->ext_patch_ieee80211_probe_req_2(ieee, skb, tag); -#endif return skb; } struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee); -//#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) -//void ext_ieee80211_send_beacon_wq(struct work_struct *work) -//{ -// struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, ext_send_beacon_wq); -//#else void ext_ieee80211_send_beacon_wq(struct ieee80211_device *ieee) { -//#endif - struct sk_buff *skb; //unsigned long flags; @@ -443,79 +413,10 @@ void ieee80211_send_beacon_cb(unsigned long _ieee) spin_unlock_irqrestore(&ieee->beacon_lock, flags); } -#ifdef _RTL8187_EXT_PATCH_ - -inline struct sk_buff *ieee80211_probe_req_with_SSID(struct ieee80211_device *ieee, char *ssid, int len_ssid) -{ - unsigned int len,rate_len; - u8 *tag; - struct sk_buff *skb; - struct ieee80211_probe_request *req; - -#ifdef _RTL8187_EXT_PATCH_ - short extMore = 0; - if(ieee->ext_patch_ieee80211_probe_req_1) - extMore = ieee->ext_patch_ieee80211_probe_req_1(ieee); -#endif - - len = len_ssid; - - rate_len = ieee80211_MFIE_rate_len(ieee); - -#ifdef _RTL8187_EXT_PATCH_ - if(!extMore) -#endif - skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + - 2 + len + rate_len); -#ifdef _RTL8187_EXT_PATCH_ - else - skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) + - 2 + len + rate_len+128); // MESHID + CAP -#endif - - if (!skb) - return NULL; - - req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request)); - req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ); - req->header.duration_id = 0; //FIXME: is this OK ? - - memset(req->header.addr1, 0xff, ETH_ALEN); - memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - memset(req->header.addr3, 0xff, ETH_ALEN); - - tag = (u8 *) skb_put(skb,len+2+rate_len); - - *tag++ = MFIE_TYPE_SSID; - *tag++ = len; - if(len) - { - memcpy(tag, ssid, len); - tag += len; - } - - ieee80211_MFIE_Brate(ieee,&tag); - ieee80211_MFIE_Grate(ieee,&tag); - -#ifdef _RTL8187_EXT_PATCH_ - if(extMore) - ieee->ext_patch_ieee80211_probe_req_2(ieee, skb, tag); -#endif - return skb; -} - -#endif // _RTL8187_EXT_PATCH_ - - void ieee80211_send_probe(struct ieee80211_device *ieee) { struct sk_buff *skb; -#ifdef _RTL8187_EXT_PATCH_ - if(ieee->iw_mode == ieee->iw_ext_mode) - skb = ieee80211_probe_req_with_SSID(ieee, NULL, 0); - else -#endif skb = ieee80211_probe_req(ieee); if (skb){ softmac_mgmt_xmit(skb, ieee); @@ -538,13 +439,10 @@ void ieee80211_send_probe_requests(struct ieee80211_device *ieee) void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) { short ch = 0; -#ifdef ENABLE_DOT11D u8 channel_map[MAX_CHANNEL_NUMBER+1]; memcpy(channel_map, GET_DOT11D_INFO(ieee)->channel_map, MAX_CHANNEL_NUMBER+1); -#endif down(&ieee->scan_sem); // printk("==================> Sync scan\n"); -// dump_chnl_map(channel_map); while(1) { @@ -554,11 +452,7 @@ void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) if (ch > MAX_CHANNEL_NUMBER) goto out; /* scan completed */ -#ifdef ENABLE_DOT11D }while(!channel_map[ch]); -#else - }while(!ieee->channel_map[ch]); -#endif /* this fuction can be called in two situations * 1- We have switched to ad-hoc mode and we are * performing a complete syncro scan before conclude @@ -583,9 +477,7 @@ void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) ieee->set_chan(ieee->dev, ch); // printk("=====>channel=%d ",ch); -#ifdef ENABLE_DOT11D if(channel_map[ch] == 1) -#endif { // printk("====send probe request\n"); ieee80211_send_probe_requests(ieee); @@ -603,20 +495,16 @@ void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee) out: ieee->sync_scan_hurryup = 0; up(&ieee->scan_sem); -#ifdef ENABLE_DOT11D if(IS_DOT11D_ENABLE(ieee)) DOT11D_ScanComplete(ieee); -#endif } void ieee80211_softmac_ips_scan_syncro(struct ieee80211_device *ieee) { int ch; unsigned int watch_dog = 0; -#ifdef ENABLE_DOT11D u8 channel_map[MAX_CHANNEL_NUMBER+1]; memcpy(channel_map, GET_DOT11D_INFO(ieee)->channel_map, MAX_CHANNEL_NUMBER+1); -#endif down(&ieee->scan_sem); ch = ieee->current_network.channel; // if(ieee->sync_scan_hurryup) @@ -650,16 +538,12 @@ void ieee80211_softmac_ips_scan_syncro(struct ieee80211_device *ieee) { goto out; } -#ifdef ENABLE_DOT11D if(channel_map[ieee->current_network.channel] > 0) -#endif { ieee->set_chan(ieee->dev, ieee->current_network.channel); // printk("======>channel=%d ",ieee->current_network.channel); } -#ifdef ENABLE_DOT11D if(channel_map[ieee->current_network.channel] == 1) -#endif { // printk("====send probe request\n"); ieee80211_send_probe_requests(ieee); @@ -678,11 +562,7 @@ void ieee80211_softmac_ips_scan_syncro(struct ieee80211_device *ieee) goto out; /* scan completed */ ieee->current_network.channel = (ieee->current_network.channel + 1)%MAX_CHANNEL_NUMBER; -#ifdef ENABLE_DOT11D }while(!channel_map[ieee->current_network.channel]); -#else - }while(!ieee->channel_map[ieee->current_network.channel]); -#endif } out: //ieee->sync_scan_hurryup = 0; @@ -690,46 +570,17 @@ out: //ieee->current_network.channel = ch; ieee->actscanning = false; up(&ieee->scan_sem); -#ifdef ENABLE_DOT11D if(IS_DOT11D_ENABLE(ieee)) DOT11D_ScanComplete(ieee); -#endif } - -#if 0 -/* called both by wq with ieee->lock held */ -void ieee80211_softmac_scan(struct ieee80211_device *ieee) -{ - short watchdog = 0; - - do{ - ieee->current_network.channel = - (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) - return; /* no good chans */ - - }while(!ieee->channel_map[ieee->current_network.channel]); - - - schedule_work(&ieee->softmac_scan_wq); -} -#endif -#ifdef ENABLE_IPS -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) void ieee80211_softmac_scan_wq(struct work_struct *work) { struct delayed_work *dwork = to_delayed_work(work); struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq); -#else -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ -#endif static short watchdog = 0; -#ifdef ENABLE_DOT11D u8 channel_map[MAX_CHANNEL_NUMBER+1]; memcpy(channel_map, GET_DOT11D_INFO(ieee)->channel_map, MAX_CHANNEL_NUMBER+1); -#endif // printk("ieee80211_softmac_scan_wq ENABLE_IPS\n"); // printk("in %s\n",__func__); down(&ieee->scan_sem); @@ -740,11 +591,7 @@ void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) if (watchdog++ > MAX_CHANNEL_NUMBER) goto out; /* no good chans */ -#ifdef ENABLE_DOT11D }while(!channel_map[ieee->current_network.channel]); -#else - }while(!ieee->channel_map[ieee->current_network.channel]); -#endif //printk("current_network.channel:%d\n", ieee->current_network.channel); if (ieee->scanning == 0 ) @@ -753,9 +600,7 @@ void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) goto out; } ieee->set_chan(ieee->dev, ieee->current_network.channel); -#ifdef ENABLE_DOT11D if(channel_map[ieee->current_network.channel] == 1) -#endif ieee80211_send_probe_requests(ieee); queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); @@ -767,77 +612,10 @@ out: ieee->scanning = 0; up(&ieee->scan_sem); -#ifdef ENABLE_DOT11D if(IS_DOT11D_ENABLE(ieee)) DOT11D_ScanComplete(ieee); -#endif return; } -#else -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) -void ieee80211_softmac_scan_wq(struct work_struct *work) -{ - struct delayed_work *dwork = to_delayed_work(work); - struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, softmac_scan_wq); -#else -void ieee80211_softmac_scan_wq(struct ieee80211_device *ieee) -{ -#endif - - short watchdog = 0; -#ifdef ENABLE_DOT11D - u8 channel_map[MAX_CHANNEL_NUMBER+1]; - memcpy(channel_map, GET_DOT11D_INFO(ieee)->channel_map, MAX_CHANNEL_NUMBER+1); -#endif -// printk("enter scan wq,watchdog is %d\n",watchdog); - down(&ieee->scan_sem); - - do{ - ieee->current_network.channel = - (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER; - if (watchdog++ > MAX_CHANNEL_NUMBER) - goto out; /* no good chans */ - -#ifdef ENABLE_DOT11D - }while(!channel_map[ieee->current_network.channel]); -#else - }while(!ieee->channel_map[ieee->current_network.channel]); -#endif - -// printk("current_network.channel:%d\n", ieee->current_network.channel); - if (ieee->scanning == 0 ) - { - printk("error out, scanning = 0\n"); - goto out; - } - ieee->set_chan(ieee->dev, ieee->current_network.channel); -#ifdef ENABLE_DOT11D - if(channel_map[ieee->current_network.channel] == 1) -#endif - ieee80211_send_probe_requests(ieee); - - queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME); -out: - up(&ieee->scan_sem); -#ifdef ENABLE_DOT11D - if(IS_DOT11D_ENABLE(ieee)) - DOT11D_ScanComplete(ieee); -#endif -} - -#endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -void ieee80211_softmac_scan_cb(unsigned long _dev) -{ - unsigned long flags; - struct ieee80211_device *ieee = (struct ieee80211_device *)_dev; - - spin_lock_irqsave(&ieee->lock, flags); - ieee80211_softmac_scan(ieee); - spin_unlock_irqrestore(&ieee->lock, flags); -} -#endif - void ieee80211_beacons_start(struct ieee80211_device *ieee) { @@ -913,7 +691,6 @@ void ieee80211_stop_scan(struct ieee80211_device *ieee) /* called with ieee->lock held */ void ieee80211_start_scan(struct ieee80211_device *ieee) { -#ifdef ENABLE_DOT11D if(IS_DOT11D_ENABLE(ieee) ) { if(IS_COUNTRY_IE_VALID(ieee)) @@ -921,7 +698,6 @@ void ieee80211_start_scan(struct ieee80211_device *ieee) RESET_CIE_WATCHDOG(ieee); } } -#endif if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){ if (ieee->scanning == 0) { @@ -941,7 +717,6 @@ void ieee80211_start_scan(struct ieee80211_device *ieee) /* called with wx_sem held */ void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) { -#ifdef ENABLE_DOT11D if(IS_DOT11D_ENABLE(ieee) ) { if(IS_COUNTRY_IE_VALID(ieee)) @@ -949,7 +724,6 @@ void ieee80211_start_scan_syncro(struct ieee80211_device *ieee) RESET_CIE_WATCHDOG(ieee); } } -#endif ieee->sync_scan_hurryup = 0; if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) @@ -1110,138 +884,6 @@ static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *d skb->dev = ieee->dev; return skb; } -#ifdef _RTL8187_EXT_PATCH_ -struct sk_buff* ieee80211_ext_probe_resp_by_net(struct ieee80211_device *ieee, u8 *dest, struct ieee80211_network *net) -{ - u8 *tag; - int beacon_size; - struct ieee80211_probe_response *beacon_buf; - struct sk_buff *skb; - int encrypt; - int atim_len,erp_len; - struct ieee80211_crypt_data* crypt; - u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff}; - int wpa_ie_len = ieee->wpa_ie_len; - char *ssid = net->ssid; - int ssid_len = net->ssid_len; - - int rate_len = ieee->current_network.rates_len+2; - int rate_ex_len = ieee->current_network.rates_ex_len; - if(rate_ex_len > 0) rate_ex_len+=2; - - if( ieee->meshScanMode&4) - ieee->current_network.channel = ieee->ext_patch_ieee80211_ext_stop_scan_wq_set_channel(ieee); - if( ieee->meshScanMode&6) - { - -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) - queue_work(ieee->wq, &ieee->ext_stop_scan_wq); -#else - schedule_task(&ieee->ext_stop_scan_wq); -#endif - } - if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS) // use current_network here - atim_len = 4; - else - atim_len = 0; - - if(ieee80211_is_54g(*net)) - erp_len = 3; - else - erp_len = 0; - - beacon_size = sizeof(struct ieee80211_probe_response)+ - ssid_len - +3 //channel - +rate_len - +rate_ex_len - +atim_len - +erp_len; -//b - skb = dev_alloc_skb(beacon_size+196); - - if (!skb) - return NULL; - - beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, beacon_size); - - memcpy (beacon_buf->header.addr1, dest,ETH_ALEN); - memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN); - - beacon_buf->header.duration_id = 0; //FIXME - - beacon_buf->beacon_interval = - cpu_to_le16(ieee->current_network.beacon_interval); // use current_network here - beacon_buf->capability = - cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS); - - if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT)) - cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT)); - - crypt = ieee->crypt[ieee->tx_keyidx]; - - encrypt = ieee->host_encrypt && crypt && crypt->ops && - ((0 == strcmp(crypt->ops->name, "WEP"))||wpa_ie_len); - - if (encrypt) - beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - - beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP); - - beacon_buf->info_element.id = MFIE_TYPE_SSID; - beacon_buf->info_element.len = ssid_len; - - tag = (u8*) beacon_buf->info_element.data; - - // brocad cast / probe rsp - if(memcmp(dest, broadcast_addr, ETH_ALEN )) - memcpy(tag, ssid, ssid_len); - else - ssid_len=0; - - tag += ssid_len; - -//get_bssrate_set(priv, _SUPPORTEDRATES_IE_, &pbssrate, &bssrate_len); -//pbuf = set_ie(pbuf, _SUPPORTEDRATES_IE_, bssrate_len, pbssrate, &frlen); - - *(tag++) = MFIE_TYPE_RATES; - *(tag++) = rate_len-2; - memcpy(tag,ieee->current_network.rates,rate_len-2); - tag+=rate_len-2; - - *(tag++) = MFIE_TYPE_DS_SET; - *(tag++) = 1; - *(tag++) = ieee->current_network.channel; // use current_network here - - - if(atim_len){ - *(tag++) = MFIE_TYPE_IBSS_SET; - *(tag++) = 2; - *((u16*)(tag)) = cpu_to_le16(ieee->current_network.atim_window); // use current_network here - tag+=2; - } - - if(erp_len){ - *(tag++) = MFIE_TYPE_ERP; - *(tag++) = 1; - *(tag++) = 0; - } - - if(rate_ex_len){ - *(tag++) = MFIE_TYPE_RATES_EX; - *(tag++) = rate_ex_len-2; - memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2); - tag+=rate_ex_len-2; - } - if (wpa_ie_len) - memcpy(tag, ieee->wpa_ie, ieee->wpa_ie_len); - - skb->dev = ieee->dev; - return skb; -} -#endif // _RTL8187_EXT_PATCH_ struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest) { @@ -1314,12 +956,7 @@ struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 auth->transaction = cpu_to_le16(2); auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN); -#ifdef _RTL8187_EXT_PATCH_ - if(ieee->iw_mode == ieee->iw_ext_mode) - memcpy(auth->header.addr3, dest, ETH_ALEN); -#else memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN); -#endif memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN); memcpy(auth->header.addr1, dest, ETH_ALEN); auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH); @@ -1412,9 +1049,7 @@ inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beaco #endif unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); unsigned int wmm_info_len = beacon->QoS_Enable?9:0; -#ifdef THOMAS_TURBO unsigned int turbo_info_len = beacon->Turbo_Enable?9:0; -#endif u8 encry_proto = ieee->wpax_type_notify & 0xff; //u8 pairwise_type = (ieee->wpax_type_notify >> 8) & 0xff; @@ -1432,7 +1067,6 @@ inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beaco wpa_len = 0; } } -#ifdef THOMAS_TURBO len = sizeof(struct ieee80211_assoc_request_frame)+ + beacon->ssid_len//essid tagged val + rate_len//rates tagged val @@ -1440,20 +1074,7 @@ inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beaco + rsn_len + wmm_info_len + turbo_info_len; -#else - len = sizeof(struct ieee80211_assoc_request_frame)+ - + beacon->ssid_len//essid tagged val - + rate_len//rates tagged val - + wpa_len - + rsn_len - + wmm_info_len; -#endif -#ifdef _RTL8187_EXT_PATCH_ - if(ieee->iw_mode == ieee->iw_ext_mode) - skb = dev_alloc_skb(len+256); // stanley - else -#endif skb = dev_alloc_skb(len); if (!skb) @@ -1479,11 +1100,6 @@ inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beaco if(ieee->short_slot) hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_association_req_1) - ieee->ext_patch_ieee80211_association_req_1(hdr); -#endif - hdr->listen_interval = 0xa; //FIXME hdr->info_element.id = MFIE_TYPE_SSID; @@ -1499,221 +1115,18 @@ inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beaco //add rsn==0 condition for ap's mix security mode(wpa+wpa2), john2007.8.9 //choose AES encryption as default algorithm while using mixed mode -#if 0 - if(rsn_len == 0){ - - tag = skb_put(skb,wpa_len); - - if(wpa_len) { - - //{add by david. 2006.8.31 - //fix linksys compatibility bug - //} - if(wpa_len > 24) {//22+2, mean include the capability - beacon->wpa_ie[wpa_len - 2] = 0; - } - //multicast cipher OUI - if( beacon->wpa_ie[11]==0x2 ){ //0x0050f202 is the oui of tkip - ieee->broadcast_key_type = KEY_TYPE_TKIP; - } - else if( beacon->wpa_ie[11]==0x4 ){//0x0050f204 is the oui of ccmp - ieee->broadcast_key_type = KEY_TYPE_CCMP; - } - //unicast cipher OUI - if( beacon->wpa_ie[14]==0 - && beacon->wpa_ie[15]==0x50 - && beacon->wpa_ie[16]==0xf2 - && beacon->wpa_ie[17]==0x2 ){ //0x0050f202 is the oui of tkip - ieee->pairwise_key_type = KEY_TYPE_TKIP; - } - - else if( beacon->wpa_ie[14]==0 - && beacon->wpa_ie[15]==0x50 - && beacon->wpa_ie[16]==0xf2 - && beacon->wpa_ie[17]==0x4 ){//0x0050f204 is the oui of ccmp - ieee->pairwise_key_type = KEY_TYPE_CCMP; - } - //indicate the wpa_ie content to WPA_SUPPLICANT - buff = kmalloc(IW_CUSTOM_MAX, GFP_ATOMIC); - memset(buff, 0, IW_CUSTOM_MAX); - p=buff; - p += sprintf(p, "ASSOCINFO(ReqIEs="); - for(i=0;i<wpa_len;i++){ - p += sprintf(p, "%02x", beacon->wpa_ie[i]); - } - p += sprintf(p, ")"); - memset(&wrqu, 0, sizeof(wrqu) ); - wrqu.data.length = p - buff; - - wireless_send_event(dev, IWEVCUSTOM, &wrqu, buff); - memcpy(tag,beacon->wpa_ie,wpa_len); - } - - } - - if(rsn_len > 22) { - - if( beacon->rsn_ie[4]==0x0 && - beacon->rsn_ie[5]==0xf && - beacon->rsn_ie[6]==0xac){ - - switch(beacon->rsn_ie[7]){ - case 0x1: - ieee->broadcast_key_type = KEY_TYPE_WEP40; - break; - case 0x2: - ieee->broadcast_key_type = KEY_TYPE_TKIP; - break; - case 0x4: - ieee->broadcast_key_type = KEY_TYPE_CCMP; - break; - case 0x5: - ieee->broadcast_key_type = KEY_TYPE_WEP104; - break; - default: - printk("fault suite type in RSN broadcast key\n"); - break; - } - } - - if( beacon->rsn_ie[10]==0x0 && - beacon->rsn_ie[11]==0xf && - beacon->rsn_ie[12]==0xac){ - if(beacon->rsn_ie[8]==1){//not mixed mode - switch(beacon->rsn_ie[13]){ - case 0x2: - ieee->pairwise_key_type = KEY_TYPE_TKIP; - break; - case 0x4: - ieee->pairwise_key_type = KEY_TYPE_CCMP; - break; - default: - printk("fault suite type in RSN pairwise key\n"); - break; - } - } - else if(beacon->rsn_ie[8]==2){//mixed mode - ieee->pairwise_key_type = KEY_TYPE_CCMP; - } - } - - - - tag = skb_put(skb,22); - memcpy(tag,(beacon->rsn_ie + info_addr),8); - tag[1] = 20; - tag += 8; - info_addr += 8; - - spin_lock_irqsave(&ieee->wpax_suitlist_lock,flags); - for (i = 0; i < 2; i++) { - tag[0] = 1; - tag[1] = 0; - tag += 2; - suite_count = beacon->rsn_ie[info_addr] + \ - (beacon->rsn_ie[info_addr + 1] << 8); - info_addr += 2; - if(1 == suite_count) { - memcpy(tag,(beacon->rsn_ie + info_addr),4); - info_addr += 4; - } else { - // if the wpax_type_notify has been set by the application, - // just use it, otherwise just use the default one. - if(ieee->wpax_type_set) { - suit_select = ((0 == i) ? pairwise_type:authen_type)&0x0f ; - memcpy(tag,rsn_authen_cipher_suite[suit_select],4); - } else { - //default set as ccmp, or none authentication - if(i == 0) { - memcpy(tag,rsn_authen_cipher_suite[4],4); - } else { - memcpy(tag,rsn_authen_cipher_suite[2],4); - } - - } - - info_addr += (suite_count * 4); - } - tag += 4; - } - spin_unlock_irqrestore(&ieee->wpax_suitlist_lock,flags); - - tag[0] = 0; - tag[1] = beacon->rsn_ie[info_addr+1]; - - } else { - tag = skb_put(skb,rsn_len); - if(rsn_len) { - - - if( beacon->rsn_ie[4]==0x0 && - beacon->rsn_ie[5]==0xf && - beacon->rsn_ie[6]==0xac){ - switch(beacon->rsn_ie[7]){ - case 0x1: - ieee->broadcast_key_type = KEY_TYPE_WEP40; - break; - case 0x2: - ieee->broadcast_key_type = KEY_TYPE_TKIP; - break; - case 0x4: - ieee->broadcast_key_type = KEY_TYPE_CCMP; - break; - case 0x5: - ieee->broadcast_key_type = KEY_TYPE_WEP104; - break; - default: - printk("fault suite type in RSN broadcast key\n"); - break; - } - } - if( beacon->rsn_ie[10]==0x0 && - beacon->rsn_ie[11]==0xf && - beacon->rsn_ie[12]==0xac){ - if(beacon->rsn_ie[8]==1){//not mixed mode - switch(beacon->rsn_ie[13]){ - case 0x2: - ieee->pairwise_key_type = KEY_TYPE_TKIP; - break; - case 0x4: - ieee->pairwise_key_type = KEY_TYPE_CCMP; - break; - default: - printk("fault suite type in RSN pairwise key\n"); - break; - } - - } - else if(beacon->rsn_ie[8]==2){//mixed mode - ieee->pairwise_key_type = KEY_TYPE_CCMP; - } - } - - - beacon->rsn_ie[rsn_len - 2] = 0; - memcpy(tag,beacon->rsn_ie,rsn_len); - } - } -#else tag = skb_put(skb,ieee->wpa_ie_len); memcpy(tag,ieee->wpa_ie,ieee->wpa_ie_len); -#endif + tag = skb_put(skb,wmm_info_len); if(wmm_info_len) { ieee80211_WMM_Info(ieee, &tag); } -#ifdef THOMAS_TURBO tag = skb_put(skb,turbo_info_len); if(turbo_info_len) { ieee80211_TURBO_Info(ieee, &tag); } -#endif - -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_association_req_2) - ieee->ext_patch_ieee80211_association_req_2(ieee, beacon, skb); -#endif return skb; } @@ -1761,13 +1174,6 @@ void ieee80211_associate_step1(struct ieee80211_device *ieee) IEEE80211_DEBUG_MGMT("Stopping scan\n"); ieee->softmac_stats.tx_auth_rq++; skb=ieee80211_authentication_req(beacon, ieee, 0); -#ifdef _RTL8187_EXT_PATCH_ - if(ieee->iw_mode == ieee->iw_ext_mode ) { - if(skb) - softmac_mgmt_xmit(skb, ieee); - return; - }else -#endif if (!skb){ ieee80211_associate_abort(ieee); @@ -1824,105 +1230,6 @@ void ieee80211_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int kfree(challenge); } -#ifdef _RTL8187_EXT_PATCH_ - -// based on ieee80211_assoc_resp -struct sk_buff* ieee80211_assoc_resp_by_net(struct ieee80211_device *ieee, u8 *dest, unsigned short status, struct ieee80211_network *pstat, int pkt_type) -{ - struct sk_buff *skb; - u8* tag; - - struct ieee80211_crypt_data* crypt; - struct ieee80211_assoc_response_frame *assoc; - short encrypt; - - unsigned int rate_len = ieee80211_MFIE_rate_len(ieee); - int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len; - - if(ieee->iw_mode == ieee->iw_ext_mode) - skb = dev_alloc_skb(len+256); // stanley - else - skb = dev_alloc_skb(len); - - if (!skb) - return NULL; - - assoc = (struct ieee80211_assoc_response_frame *) - skb_put(skb,sizeof(struct ieee80211_assoc_response_frame)); - - assoc->header.frame_ctl = cpu_to_le16(pkt_type); - - memcpy(assoc->header.addr1, dest,ETH_ALEN); - memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN); - memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN); - assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ? - WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS); - - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_assoc_resp_by_net_1) - ieee->ext_patch_ieee80211_assoc_resp_by_net_1(assoc); - - if(ieee->short_slot) - assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT); - - if (ieee->host_encrypt) - crypt = ieee->crypt[ieee->tx_keyidx]; - else crypt = NULL; - - encrypt = ( crypt && crypt->ops); - - if (encrypt) - assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY); - - assoc->status = 0; - assoc->aid = cpu_to_le16(ieee->assoc_id); - if (ieee->assoc_id == 0x2007) ieee->assoc_id=0; - else ieee->assoc_id++; - - assoc->info_element.id = 230; // Stanley, an unused id (just a hot fix) - assoc->info_element.len = 0; - - tag = (u8*) skb_put(skb, rate_len); - - ieee80211_MFIE_Brate(ieee, &tag); - ieee80211_MFIE_Grate(ieee, &tag); - - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_assoc_resp_by_net_2) - ieee->ext_patch_ieee80211_assoc_resp_by_net_2(ieee, pstat, pkt_type, skb); - - return skb; -} - -// based on ieee80211_resp_to_assoc_rq -void ieee80211_ext_issue_assoc_rsp(struct ieee80211_device *ieee, u8 *dest, unsigned short status, struct ieee80211_network *pstat, int pkt_type) -{ - struct sk_buff *buf = ieee80211_assoc_resp_by_net(ieee, dest, status, pstat, pkt_type); - - if (buf) - softmac_mgmt_xmit(buf, ieee); -} - -// based on ieee80211_associate_step2 -void ieee80211_ext_issue_assoc_req(struct ieee80211_device *ieee, struct ieee80211_network *pstat) -{ - - struct sk_buff* skb; - - // printk("@@@@@ ieee80211_ext_issue_assoc_req on channel: %d\n", ieee->current_network.channel); - - ieee->softmac_stats.tx_ass_rq++; - skb=ieee80211_association_req(pstat, ieee); - if (skb) - softmac_mgmt_xmit(skb, ieee); -} - -void ieee80211_ext_issue_disassoc(struct ieee80211_device *ieee, struct ieee80211_network *pstat, int reason, unsigned char extReason) -{ - // do nothing - // printk("@@@@@ ieee80211_ext_issue_disassoc\n"); - return; -} -#endif // _RTL8187_EXT_PATCH_ - void ieee80211_associate_step2(struct ieee80211_device *ieee) { struct sk_buff* skb; @@ -1945,14 +1252,10 @@ void ieee80211_associate_step2(struct ieee80211_device *ieee) } } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) void ieee80211_associate_complete_wq(struct work_struct *work) { struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq); -#else -void ieee80211_associate_complete_wq(struct ieee80211_device *ieee) -{ -#endif + printk(KERN_INFO "Associated successfully\n"); if(ieee80211_is_54g(ieee->current_network) && (ieee->modulation & IEEE80211_OFDM_MODULATION)){ @@ -1984,14 +1287,10 @@ void ieee80211_associate_complete(struct ieee80211_device *ieee) queue_work(ieee->wq, &ieee->associate_complete_wq); } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) void ieee80211_associate_procedure_wq(struct work_struct *work) { struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq); -#else -void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) -{ -#endif + ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); @@ -2006,55 +1305,6 @@ void ieee80211_associate_procedure_wq(struct ieee80211_device *ieee) up(&ieee->wx_sem); } -#ifdef _RTL8187_EXT_PATCH_ -// based on ieee80211_associate_procedure_wq - -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) -void ieee80211_ext_stop_scan_wq(struct work_struct *work) -{ - struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, ext_stop_scan_wq); -#else -void ieee80211_ext_stop_scan_wq(struct ieee80211_device *ieee) -{ -#endif - if (ieee->scanning == 0) - { - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_ext_stop_scan_wq_set_channel - && ( ieee->current_network.channel == ieee->ext_patch_ieee80211_ext_stop_scan_wq_set_channel(ieee) ) ) - return; - } - - ieee->sync_scan_hurryup = 1; - - down(&ieee->wx_sem); - - // printk("@@@@@@@@@@ ieee80211_ext_stop_scan_wq\n"); - if (ieee->data_hard_stop) - ieee->data_hard_stop(ieee->dev); - - ieee80211_stop_scan(ieee); - - // set channel - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_ext_stop_scan_wq_set_channel) - ieee->set_chan(ieee->dev, ieee->ext_patch_ieee80211_ext_stop_scan_wq_set_channel(ieee)); - else - ieee->set_chan(ieee->dev, ieee->current_network.channel); - // - up(&ieee->wx_sem); -} - - -void ieee80211_ext_send_11s_beacon(struct ieee80211_device *ieee) -{ - #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) - queue_work(ieee->wq, &ieee->ext_send_beacon_wq); - #else - schedule_task(&ieee->ext_send_beacon_wq); - #endif - -} - -#endif // _RTL8187_EXT_PATCH_ inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net) { @@ -2324,12 +1574,6 @@ ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb) } printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest)); - //FIXME - #if 0 - spin_lock_irqsave(&ieee->lock,flags); - add_associate(ieee,dest); - spin_unlock_irqrestore(&ieee->lock,flags); - #endif } @@ -2347,11 +1591,8 @@ void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr) short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l) { -#if 0 - int timeout = ieee->ps_timeout; -#else int timeout = 0; -#endif + u8 dtim; /*if(ieee->ps == IEEE80211_PS_DISABLED || ieee->iw_mode != IW_MODE_INFRA || @@ -2382,13 +1623,7 @@ short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *ti if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) && (ieee->mgmt_queue_tail != ieee->mgmt_queue_head)) return 0; -#if 0 - if(time_l){ - *time_l = ieee->current_network.last_dtim_sta_time[0] - + (ieee->current_network.beacon_interval - * ieee->current_network.dtim_period) * 1000; - } -#else + if(time_l){ *time_l = ieee->current_network.last_dtim_sta_time[0] + MSECS((ieee->current_network.beacon_interval)); @@ -2396,7 +1631,6 @@ short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *ti //printk("beacon_interval:%x, dtim_period:%x, totol to Msecs:%x, HZ:%x\n", ieee->current_network.beacon_interval, ieee->current_network.dtim_period, MSECS(((ieee->current_network.beacon_interval * ieee->current_network.dtim_period))), HZ); } -#endif if(time_h){ *time_h = ieee->current_network.last_dtim_sta_time[1]; if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0]) @@ -2638,12 +1872,6 @@ associate_complete: ieee80211_associate_abort(ieee); } } -#ifdef _RTL8187_EXT_PATCH_ - else if ((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_frame_softmac_on_assoc_rsp) - { - ieee->ext_patch_ieee80211_rx_frame_softmac_on_assoc_rsp(ieee, skb); - } -#endif break; case IEEE80211_STYPE_ASSOC_REQ: @@ -2653,21 +1881,10 @@ associate_complete: ieee->iw_mode == IW_MODE_MASTER) ieee80211_rx_assoc_rq(ieee, skb); -#ifdef _RTL8187_EXT_PATCH_ - else if ((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_frame_softmac_on_assoc_req) - { - ieee->ext_patch_ieee80211_rx_frame_softmac_on_assoc_req(ieee, skb); - } -#endif break; case IEEE80211_STYPE_AUTH: -#ifdef _RTL8187_EXT_PATCH_ -printk("IEEE80211_STYPE_AUTH\n"); - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_frame_softmac_on_auth) - if( ieee->ext_patch_ieee80211_rx_frame_softmac_on_auth(ieee, skb, rx_stats) ); -#endif if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){ if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING && ieee->iw_mode == IW_MODE_INFRA){ @@ -2707,11 +1924,6 @@ printk("IEEE80211_STYPE_AUTH\n"); case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DEAUTH: -#ifdef _RTL8187_EXT_PATCH_ -printk("IEEE80211_STYPE_DEAUTH\n"); - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_rx_frame_softmac_on_deauth) - if( ieee->ext_patch_ieee80211_rx_frame_softmac_on_deauth(ieee, skb, rx_stats) ) ; -#endif /* FIXME for now repeat all the association procedure * both for disassociation and deauthentication */ @@ -2764,41 +1976,9 @@ void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device * unsigned long flags; int i; -#ifdef _RTL8187_EXT_PATCH_ - int rate = ieee->rate; -#endif spin_lock_irqsave(&ieee->lock,flags); - #if 0 - if(ieee->queue_stop){ - IEEE80211DMESG("EE: IEEE hard_start_xmit invoked when kernel queue should be stopped"); - netif_stop_queue(ieee->dev); - ieee->ieee_stats.swtxstop++; - //dev_kfree_skb_any(skb); - err = 1; - goto exit; - } - - ieee->stats.tx_bytes+=skb->len; - - - txb=ieee80211_skb_to_txb(ieee,skb); - - - if(txb==NULL){ - IEEE80211DMESG("WW: IEEE stack failed to provide txb"); - //dev_kfree_skb_any(skb); - err = 1; - goto exit; - } - #endif -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_ieee80211_softmac_xmit_get_rate && txb->nr_frags) - { - rate = ieee->ext_patch_ieee80211_softmac_xmit_get_rate(ieee, txb->fragments[0]); - } -#endif /* called with 2nd parm 0, no tx mgmt lock required */ ieee80211_sta_wakeup(ieee,0); @@ -2811,11 +1991,7 @@ void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device * }else{ ieee->softmac_data_hard_start_xmit( txb->fragments[i], -#ifdef _RTL8187_EXT_PATCH_ - ieee->dev, rate); -#else ieee->dev,ieee->rate); -#endif //(i+1)<txb->nr_frags); ieee->stats.tx_packets++; ieee->stats.tx_bytes += txb->fragments[i]->len; @@ -2977,15 +2153,11 @@ void ieee80211_start_monitor_mode(struct ieee80211_device *ieee) netif_carrier_on(ieee->dev); } } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + void ieee80211_start_ibss_wq(struct work_struct *work) { struct delayed_work *dwork = to_delayed_work(work); struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, start_ibss_wq); -#else -void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) -{ -#endif /* iwconfig mode ad-hoc will schedule this and return * on the other hand this will block further iwconfig SET @@ -3007,10 +2179,8 @@ void ieee80211_start_ibss_wq(struct ieee80211_device *ieee) /* check if we have this cell in our network list */ ieee80211_softmac_check_all_nets(ieee); -#ifdef ENABLE_DOT11D if(ieee->state == IEEE80211_NOLINK) ieee->current_network.channel = 10; -#endif /* if not then the state is not linked. Maybe the user swithced to * ad-hoc mode just after being in monitor mode, or just after * being very few time in managed mode (so the card have had no @@ -3099,7 +2269,6 @@ inline void ieee80211_start_ibss(struct ieee80211_device *ieee) void ieee80211_start_bss(struct ieee80211_device *ieee) { unsigned long flags; -#ifdef ENABLE_DOT11D // // Ref: 802.11d 11.1.3.3 // STA shall not start a BSS unless properly formed Beacon frame including a Country IE. @@ -3111,7 +2280,6 @@ void ieee80211_start_bss(struct ieee80211_device *ieee) return; } } -#endif /* check if we have already found the net we * are interested in (if any). * if not (we are disassociated and we are not @@ -3150,24 +2318,17 @@ void ieee80211_disassociate(struct ieee80211_device *ieee) if (ieee->data_hard_stop) ieee->data_hard_stop(ieee->dev); -#ifdef ENABLE_DOT11D if(IS_DOT11D_ENABLE(ieee)) Dot11d_Reset(ieee); -#endif ieee->state = IEEE80211_NOLINK; ieee->link_change(ieee->dev); notify_wx_assoc_event(ieee); } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) void ieee80211_associate_retry_wq(struct work_struct *work) { struct delayed_work *dwork = to_delayed_work(work); struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq); -#else -void ieee80211_associate_retry_wq(struct ieee80211_device *ieee) -{ -#endif unsigned long flags; down(&ieee->wx_sem); if(!ieee->proto_started) @@ -3217,16 +2378,7 @@ struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee) struct sk_buff *skb = NULL; struct ieee80211_probe_response *b; -//rz -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) && ieee->ext_patch_get_beacon_get_probersp ) - skb = ieee->ext_patch_get_beacon_get_probersp(ieee, broadcast_addr, &(ieee->current_network)); - else - skb = ieee80211_probe_resp(ieee, broadcast_addr); -#else skb = ieee80211_probe_resp(ieee, broadcast_addr); -#endif -// if (!skb) return NULL; @@ -3273,17 +2425,6 @@ void ieee80211_stop_protocol(struct ieee80211_device *ieee) ieee->proto_started = 0; -#ifdef _RTL8187_EXT_PATCH_ - if(ieee->ext_patch_ieee80211_stop_protocol) - ieee->ext_patch_ieee80211_stop_protocol(ieee); -//if call queue_delayed_work,can call this,or do nothing.. -//edit by lawrence,20071118 -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) -// cancel_delayed_work(&ieee->ext_stop_scan_wq); -// cancel_delayed_work(&ieee->ext_send_beacon_wq); -#endif -#endif // _RTL8187_EXT_PATCH_ - ieee80211_stop_send_beacons(ieee); if((ieee->iw_mode == IW_MODE_INFRA)&&(ieee->state == IEEE80211_LINKED)) { SendDisassociation(ieee,NULL,WLAN_REASON_DISASSOC_STA_HAS_LEFT); @@ -3320,11 +2461,7 @@ void ieee80211_start_protocol(struct ieee80211_device *ieee) if (ch > MAX_CHANNEL_NUMBER) return; /* no channel found */ -#ifdef ENABLE_DOT11D }while(!GET_DOT11D_INFO(ieee)->channel_map[ch]); -#else - }while(!ieee->channel_map[ch]); -#endif ieee->current_network.channel = ch; } @@ -3368,92 +2505,8 @@ void ieee80211_start_protocol(struct ieee80211_device *ieee) break; default: -#ifdef _RTL8187_EXT_PATCH_ - if((ieee->iw_mode == ieee->iw_ext_mode) &&\ - ieee->ext_patch_ieee80211_start_protocol &&\ - ieee->ext_patch_ieee80211_start_protocol(ieee)) { -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) - queue_work(ieee->wq, &ieee->ext_stop_scan_wq); -#endif - // By default, WMM function will be disabled in - // EXTENSION mode - ieee->current_network.QoS_Enable = 0; - - if(ieee->modulation & IEEE80211_CCK_MODULATION){ - ieee->current_network.rates_len = 4; - ieee->current_network.rates[0] = \ - IEEE80211_BASIC_RATE_MASK | \ - IEEE80211_CCK_RATE_1MB; - ieee->current_network.rates[1] = \ - IEEE80211_BASIC_RATE_MASK |\ - IEEE80211_CCK_RATE_2MB; - ieee->current_network.rates[2] = \ - IEEE80211_BASIC_RATE_MASK |\ - IEEE80211_CCK_RATE_5MB; - ieee->current_network.rates[3] = \ - IEEE80211_BASIC_RATE_MASK |\ - IEEE80211_CCK_RATE_11MB; - }else - ieee->current_network.rates_len = 0; - - if(ieee->modulation & IEEE80211_OFDM_MODULATION){ - ieee->current_network.rates_ex_len = 8; - ieee->current_network.rates_ex[0] = \ - IEEE80211_BASIC_RATE_MASK |\ - IEEE80211_OFDM_RATE_6MB; - ieee->current_network.rates_ex[1] = \ - IEEE80211_BASIC_RATE_MASK |\ - IEEE80211_OFDM_RATE_9MB; - ieee->current_network.rates_ex[2] = \ - IEEE80211_BASIC_RATE_MASK |\ - IEEE80211_OFDM_RATE_12MB; - ieee->current_network.rates_ex[3] = \ - IEEE80211_BASIC_RATE_MASK | \ - IEEE80211_OFDM_RATE_18MB; - ieee->current_network.rates_ex[4] =\ - IEEE80211_BASIC_RATE_MASK |\ - IEEE80211_OFDM_RATE_24MB; - ieee->current_network.rates_ex[5] =\ - IEEE80211_BASIC_RATE_MASK |\ - IEEE80211_OFDM_RATE_36MB; - ieee->current_network.rates_ex[6] = \ - IEEE80211_BASIC_RATE_MASK |\ - IEEE80211_OFDM_RATE_48MB; - ieee->current_network.rates_ex[7] =\ - IEEE80211_BASIC_RATE_MASK |\ - IEEE80211_OFDM_RATE_54MB; - ieee->rate = 540; - }else{ - ieee->current_network.rates_ex_len = 0; - ieee->rate = 110; - } - - /* - spin_lock_irqsave(&ieee->lock, flags); - if (ieee->state == IEEE80211_NOLINK) - ieee80211_start_scan(ieee); - // ieee->set_chan(ieee->dev, 8); - - spin_unlock_irqrestore(&ieee->lock, flags); - */ - memcpy(ieee->current_network.bssid, ieee->dev->dev_addr,\ - ETH_ALEN); - ieee->link_change(ieee->dev); - notify_wx_assoc_event(ieee); - - if (ieee->data_hard_resume) - ieee->data_hard_resume(ieee->dev); - - netif_carrier_on(ieee->dev); - } else { - ieee->iw_mode = IW_MODE_INFRA; - ieee80211_start_bss(ieee); - } -#else ieee->iw_mode = IW_MODE_INFRA; ieee80211_start_bss(ieee); - -#endif break; } } @@ -3497,16 +2550,9 @@ void ieee80211_softmac_init(struct ieee80211_device *ieee) ieee->beinretry = false; ieee->bHwRadioOff = false; //by amy -#ifdef _RTL8187_EXT_PATCH_ - ieee->iw_ext_mode = 999; -#endif init_mgmt_queue(ieee); -#if 0 - init_timer(&ieee->scan_timer); - ieee->scan_timer.data = (unsigned long)ieee; - ieee->scan_timer.function = ieee80211_softmac_scan_cb; -#endif + ieee->tx_pending.txb = NULL; init_timer(&ieee->associate_timer); @@ -3522,7 +2568,6 @@ void ieee80211_softmac_init(struct ieee80211_device *ieee) #else ieee->wq = create_workqueue(DRV_NAME); #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)//added by lawrence,070702 INIT_DELAYED_WORK(&ieee->start_ibss_wq,(void*) ieee80211_start_ibss_wq); INIT_WORK(&ieee->associate_complete_wq,(void*) ieee80211_associate_complete_wq); INIT_WORK(&ieee->associate_procedure_wq,(void*) ieee80211_associate_procedure_wq); @@ -3530,26 +2575,7 @@ void ieee80211_softmac_init(struct ieee80211_device *ieee) INIT_DELAYED_WORK(&ieee->associate_retry_wq,(void*) ieee80211_associate_retry_wq); INIT_WORK(&ieee->wx_sync_scan_wq,(void*) ieee80211_wx_sync_scan_wq); // INIT_WORK(&ieee->watch_dog_wq,(void*) ieee80211_watch_dog_wq); -//added by lawrence,20071118 -#ifdef _RTL8187_EXT_PATCH_ - INIT_WORK(&ieee->ext_stop_scan_wq,(void*) ieee80211_ext_stop_scan_wq); - //INIT_WORK(&ieee->ext_send_beacon_wq,(void*) ieee80211_beacons_start,ieee); - INIT_WORK(&ieee->ext_send_beacon_wq,(void*) ext_ieee80211_send_beacon_wq); -#endif //_RTL8187_EXT_PATCH_ -#else - INIT_WORK(&ieee->start_ibss_wq,(void*) ieee80211_start_ibss_wq,ieee); - INIT_WORK(&ieee->associate_retry_wq,(void*) ieee80211_associate_retry_wq,ieee); - INIT_WORK(&ieee->associate_complete_wq,(void*) ieee80211_associate_complete_wq,ieee); - INIT_WORK(&ieee->associate_procedure_wq,(void*) ieee80211_associate_procedure_wq,ieee); - INIT_WORK(&ieee->softmac_scan_wq,(void*) ieee80211_softmac_scan_wq,ieee); - INIT_WORK(&ieee->wx_sync_scan_wq,(void*) ieee80211_wx_sync_scan_wq,ieee); -// INIT_WORK(&ieee->watch_dog_wq,(void*) ieee80211_watch_dog_wq,ieee); -#ifdef _RTL8187_EXT_PATCH_ - INIT_WORK(&ieee->ext_stop_scan_wq,(void*) ieee80211_ext_stop_scan_wq,ieee); - //INIT_WORK(&ieee->ext_send_beacon_wq,(void*) ieee80211_beacons_start,ieee); - INIT_WORK(&ieee->ext_send_beacon_wq,(void*) ext_ieee80211_send_beacon_wq,ieee); -#endif -#endif + sema_init(&ieee->wx_sem, 1); sema_init(&ieee->scan_sem, 1); @@ -3559,9 +2585,7 @@ void ieee80211_softmac_init(struct ieee80211_device *ieee) tasklet_init(&ieee->ps_task, (void(*)(unsigned long)) ieee80211_sta_ps, (unsigned long)ieee); -#ifdef ENABLE_DOT11D ieee->pDot11dInfo = kmalloc(sizeof(RT_DOT11D_INFO), GFP_ATOMIC); -#endif } void ieee80211_softmac_free(struct ieee80211_device *ieee) @@ -3575,15 +2599,9 @@ void ieee80211_softmac_free(struct ieee80211_device *ieee) //add for RF power on power of by lizhaoming 080512 cancel_delayed_work(&ieee->GPIOChangeRFWorkItem); -#ifdef _RTL8187_EXT_PATCH_ - cancel_delayed_work(&ieee->ext_stop_scan_wq); - cancel_delayed_work(&ieee->ext_send_beacon_wq); -#endif destroy_workqueue(ieee->wq); -#ifdef ENABLE_DOT11D if(NULL != ieee->pDot11dInfo) kfree(ieee->pDot11dInfo); -#endif up(&ieee->wx_sem); } @@ -3992,38 +3010,3 @@ void notify_wx_assoc_event(struct ieee80211_device *ieee) memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); wireless_send_event(ieee->dev, SIOCGIWAP, &wrqu, NULL); } - - -#if 0 -EXPORT_SYMBOL(ieee80211_get_beacon); -EXPORT_SYMBOL(ieee80211_wake_queue); -EXPORT_SYMBOL(ieee80211_stop_queue); -EXPORT_SYMBOL(ieee80211_reset_queue); -EXPORT_SYMBOL(ieee80211_softmac_stop_protocol); -EXPORT_SYMBOL(ieee80211_softmac_start_protocol); -EXPORT_SYMBOL(ieee80211_is_shortslot); -EXPORT_SYMBOL(ieee80211_is_54g); -EXPORT_SYMBOL(ieee80211_wpa_supplicant_ioctl); -EXPORT_SYMBOL(ieee80211_ps_tx_ack); -EXPORT_SYMBOL(ieee80211_start_protocol); -EXPORT_SYMBOL(ieee80211_stop_protocol); -EXPORT_SYMBOL(notify_wx_assoc_event); -EXPORT_SYMBOL(ieee80211_stop_send_beacons); -EXPORT_SYMBOL(SendDisassociation); -EXPORT_SYMBOL(ieee80211_disassociate); -EXPORT_SYMBOL(ieee80211_start_scan); -EXPORT_SYMBOL(ieee80211_softmac_ips_scan_syncro); -#ifdef _RTL8187_EXT_PATCH_ -EXPORT_SYMBOL(ieee80211_ext_issue_assoc_req); -EXPORT_SYMBOL(ieee80211_ext_issue_disassoc); -EXPORT_SYMBOL(ieee80211_ext_issue_assoc_rsp); -EXPORT_SYMBOL(softmac_mgmt_xmit); -EXPORT_SYMBOL(ieee80211_ext_probe_resp_by_net); -EXPORT_SYMBOL(ieee80211_start_scan); -EXPORT_SYMBOL(ieee80211_stop_scan); -EXPORT_SYMBOL(ieee80211_ext_send_11s_beacon); -EXPORT_SYMBOL(ieee80211_rx_auth_rq); -EXPORT_SYMBOL(ieee80211_associate_step1); -#endif // _RTL8187_EXT_PATCH_ -EXPORT_SYMBOL(ieee80211_sta_ps_send_null_frame); -#endif diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac_wx.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac_wx.c index 54b4b71..f1d6cb4 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac_wx.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac_wx.c @@ -270,16 +270,9 @@ out: } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) void ieee80211_wx_sync_scan_wq(struct work_struct *work) { struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq); -#else -void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) -{ -#endif -//void ieee80211_wx_sync_scan_wq(struct ieee80211_device *ieee) -//{ short chan; chan = ieee->current_network.channel; @@ -379,11 +372,7 @@ int ieee80211_wx_set_essid(struct ieee80211_device *ieee, if (wrqu->essid.flags && wrqu->essid.length) { //YJ,modified,080819 -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) - len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; -#else len = (wrqu->essid.length < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length) : IW_ESSID_MAX_SIZE; -#endif memset(ieee->current_network.ssid, 0, ieee->current_network.ssid_len); //YJ,add,080819 strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; @@ -581,22 +570,3 @@ exit: return ret; } - -#if 0 -EXPORT_SYMBOL(ieee80211_wx_get_essid); -EXPORT_SYMBOL(ieee80211_wx_set_essid); -EXPORT_SYMBOL(ieee80211_wx_set_rate); -EXPORT_SYMBOL(ieee80211_wx_get_rate); -EXPORT_SYMBOL(ieee80211_wx_set_wap); -EXPORT_SYMBOL(ieee80211_wx_get_wap); -EXPORT_SYMBOL(ieee80211_wx_set_mode); -EXPORT_SYMBOL(ieee80211_wx_get_mode); -EXPORT_SYMBOL(ieee80211_wx_set_scan); -EXPORT_SYMBOL(ieee80211_wx_get_freq); -EXPORT_SYMBOL(ieee80211_wx_set_freq); -EXPORT_SYMBOL(ieee80211_wx_set_rawtx); -EXPORT_SYMBOL(ieee80211_wx_get_name); -EXPORT_SYMBOL(ieee80211_wx_set_power); -EXPORT_SYMBOL(ieee80211_wx_get_power); -EXPORT_SYMBOL(ieee80211_wlan_frequencies); -#endif diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c index 1b77460..e2945db 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_tx.c @@ -192,11 +192,11 @@ int ieee80211_encrypt_fragment( return -1; #ifdef CONFIG_IEEE80211_CRYPT_TKIP - struct ieee80211_hdr *header; + struct ieee80211_hdr_4addr *header; if (ieee->tkip_countermeasures && crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) { - header = (struct ieee80211_hdr *) frag->data; + header = (struct ieee80211_hdr_4addr *)frag->data; if (net_ratelimit()) { printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " "TX packet to " MAC_FMT "\n", @@ -304,245 +304,23 @@ ieee80211_classify(struct sk_buff *skb, struct ieee80211_network *network) return(wme_UP); } -#ifdef _RTL8187_EXT_PATCH_ -// based on part of ieee80211_xmit. Mainly allocate txb. ieee->lock is held -struct ieee80211_txb *ieee80211_ext_alloc_txb(struct sk_buff *skb, struct net_device *dev, struct ieee80211_hdr_3addr *header, int hdr_len, u8 isQoS, u16 *pQOS_ctl, int isEncrypt, struct ieee80211_crypt_data* crypt) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)) - struct ieee80211_device *ieee = netdev_priv(dev); -#else - struct ieee80211_device *ieee = (struct ieee80211_device *)dev->priv; -#endif - struct ieee80211_txb *txb = NULL; - struct ieee80211_hdr_3addr *frag_hdr; - int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size; - int ether_type; - int bytes, QOS_ctl; - struct sk_buff *skb_frag; - - ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); - - /* Advance the SKB to the start of the payload */ - skb_pull(skb, sizeof(struct ethhdr)); - - /* Determine total amount of storage required for TXB packets */ - bytes = skb->len + SNAP_SIZE + sizeof(u16); - - /* Determine fragmentation size based on destination (multicast - * and broadcast are not fragmented) */ - // if (is_multicast_ether_addr(dest) || - // is_broadcast_ether_addr(dest)) { - if (is_multicast_ether_addr(header->addr1) || - is_broadcast_ether_addr(header->addr1)) { - frag_size = MAX_FRAG_THRESHOLD; - QOS_ctl = QOS_CTL_NOTCONTAIN_ACK; - } - else { - //printk(KERN_WARNING "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&frag_size = %d\n", frag_size); - frag_size = ieee->fts;//default:392 - QOS_ctl = 0; - } - - if(isQoS) { - QOS_ctl |= skb->priority; //set in the ieee80211_classify - *pQOS_ctl = cpu_to_le16(QOS_ctl); - } - //printk(KERN_WARNING "header size = %d, QOS_ctl = %x\n", hdr_len,QOS_ctl); - /* Determine amount of payload per fragment. Regardless of if - * this stack is providing the full 802.11 header, one will - * eventually be affixed to this fragment -- so we must account for - * it when determining the amount of payload space. */ - //bytes_per_frag = frag_size - (IEEE80211_3ADDR_LEN + (ieee->current_network->QoS_Enable ? 2:0)); - bytes_per_frag = frag_size - hdr_len; - if (ieee->config & - (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) - bytes_per_frag -= IEEE80211_FCS_LEN; - - /* Each fragment may need to have room for encryptiong pre/postfix */ - if (isEncrypt) - bytes_per_frag -= crypt->ops->extra_prefix_len + - crypt->ops->extra_postfix_len; - - /* Number of fragments is the total bytes_per_frag / - * payload_per_fragment */ - nr_frags = bytes / bytes_per_frag; - bytes_last_frag = bytes % bytes_per_frag; - if (bytes_last_frag) - nr_frags++; - else - bytes_last_frag = bytes_per_frag; - - /* When we allocate the TXB we allocate enough space for the reserve - * and full fragment bytes (bytes_per_frag doesn't include prefix, - * postfix, header, FCS, etc.) */ - txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC); - if (unlikely(!txb)) { - printk(KERN_WARNING "%s: Could not allocate TXB\n", - ieee->dev->name); - return NULL; - } - txb->encrypted = isEncrypt; - txb->payload_size = bytes; - - for (i = 0; i < nr_frags; i++) { - skb_frag = txb->fragments[i]; - skb_frag->priority = UP2AC(skb->priority); - if (isEncrypt) - skb_reserve(skb_frag, crypt->ops->extra_prefix_len); - - frag_hdr = (struct ieee80211_hdr_3addr *)skb_put(skb_frag, hdr_len); - memcpy(frag_hdr, (void *)header, hdr_len); - - /* If this is not the last fragment, then add the MOREFRAGS - * bit to the frame control */ - if (i != nr_frags - 1) { - frag_hdr->frame_ctl = cpu_to_le16( - header->frame_ctl | IEEE80211_FCTL_MOREFRAGS); - bytes = bytes_per_frag; - - } else { - /* The last fragment takes the remaining length */ - bytes = bytes_last_frag; - } - - frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4 | i); - //frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl<<4 | i); - // - - /* Put a SNAP header on the first fragment */ - if (i == 0) { - ieee80211_put_snap( - skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ether_type); - bytes -= SNAP_SIZE + sizeof(u16); - } - - memcpy(skb_put(skb_frag, bytes), skb->data, bytes); - - /* Advance the SKB... */ - skb_pull(skb, bytes); - - /* Encryption routine will move the header forward in order - * to insert the IV between the header and the payload */ - if (isEncrypt) - ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); - if (ieee->config & - (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS)) - skb_put(skb_frag, 4); - } - // Advance sequence number in data frame. - //printk(KERN_WARNING "QoS Enalbed? %s\n", ieee->current_network.QoS_Enable?"Y":"N"); - if (ieee->seq_ctrl[0] == 0xFFF) - ieee->seq_ctrl[0] = 0; - else - ieee->seq_ctrl[0]++; - // stanley, just for debug -/* -{ - int j=0; - for(j=0;j<nr_frags;j++) - { - int i; - struct sk_buff *skb = txb->fragments[j]; - printk("send(%d): ", j); - for (i=0;i<skb->len;i++) - printk("%02X ", skb->data[i]&0xff); - printk("\n"); - } -} -*/ - - return txb; -} - - -// based on part of ieee80211_xmit. Mainly allocate txb. ieee->lock is held -// Assume no encryption, no FCS computing -struct ieee80211_txb *ieee80211_ext_reuse_txb(struct sk_buff *skb, struct net_device *dev, struct ieee80211_hdr_3addr *header, int hdr_len, u8 isQoS, u16 *pQOS_ctl, int isEncrypt, struct ieee80211_crypt_data* crypt) -{ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)) - struct ieee80211_device *ieee = netdev_priv(dev); -#else - struct ieee80211_device *ieee = (struct ieee80211_device *)dev->priv; -#endif - struct ieee80211_txb *txb = NULL; - struct ieee80211_hdr_3addr *frag_hdr; - int ether_type; - int bytes, QOS_ctl; - - ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); - - /* Advance the SKB to the start of the payload */ - skb_pull(skb, sizeof(struct ethhdr)); - - /* Determine total amount of storage required for TXB packets */ - bytes = skb->len + SNAP_SIZE + sizeof(u16); - - if (is_multicast_ether_addr(header->addr1) || - is_broadcast_ether_addr(header->addr1)) { - QOS_ctl = QOS_CTL_NOTCONTAIN_ACK; - } - else { - QOS_ctl = 0; - } - - if(isQoS) { - QOS_ctl |= skb->priority; //set in the ieee80211_classify - *pQOS_ctl = cpu_to_le16(QOS_ctl); - } - - txb = kmalloc( sizeof(struct ieee80211_txb) + sizeof(u8*), GFP_ATOMIC ); - if (unlikely(!txb)) { - printk(KERN_WARNING "%s: Could not allocate TXB\n", - ieee->dev->name); - return NULL; - } - - txb->nr_frags = 1; - txb->frag_size = bytes; - txb->encrypted = isEncrypt; - txb->payload_size = bytes; - - txb->fragments[0] = skb; - ieee80211_put_snap( - skb_push(skb, SNAP_SIZE + sizeof(u16)), ether_type); - frag_hdr = (struct ieee80211_hdr_3addr *)skb_push(skb, hdr_len); - memcpy(frag_hdr, (void *)header, hdr_len); - frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4 | 0); - skb->priority = UP2AC(skb->priority); - - // Advance sequence number in data frame. - //printk(KERN_WARNING "QoS Enalbed? %s\n", ieee->current_network.QoS_Enable?"Y":"N"); - if (ieee->seq_ctrl[0] == 0xFFF) - ieee->seq_ctrl[0] = 0; - else - ieee->seq_ctrl[0]++; - - return txb; -} - -#endif // _RTL8187_EXT_PATCH_ - /* SKBs are added to the ieee->tx_queue. */ 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_3addr_QOS *frag_hdr; + struct ieee80211_hdr_3addrqos *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; - int bytes, fc, QOS_ctl, hdr_len; + int bytes, fc, qos_ctl, hdr_len; struct sk_buff *skb_frag; - //struct ieee80211_hdr header = { /* Ensure zero initialized */ - // .duration_id = 0, - // .seq_ctl = 0 - //}; - struct ieee80211_hdr_3addr_QOS header = { /* Ensure zero initialized */ + struct ieee80211_hdr_3addrqos header = { /* Ensure zero initialized */ .duration_id = 0, .seq_ctl = 0, - .QOS_ctl = 0 + .qos_ctl = 0 }; u8 dest[ETH_ALEN], src[ETH_ALEN]; @@ -569,16 +347,6 @@ int ieee80211_xmit(struct sk_buff *skb, goto success; } - -#ifdef _RTL8187_EXT_PATCH_ - // note, skb->priority which was set by ieee80211_classify, and used by physical tx - if((ieee->iw_mode == ieee->iw_ext_mode) && (ieee->ext_patch_ieee80211_xmit)) - { - txb = ieee->ext_patch_ieee80211_xmit(skb, dev); - goto success; - } -#endif - ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); crypt = ieee->crypt[ieee->tx_keyidx]; @@ -651,22 +419,23 @@ int ieee80211_xmit(struct sk_buff *skb, if (is_multicast_ether_addr(header.addr1) || is_broadcast_ether_addr(header.addr1)) { frag_size = MAX_FRAG_THRESHOLD; - QOS_ctl = QOS_CTL_NOTCONTAIN_ACK; + qos_ctl = QOS_CTL_NOTCONTAIN_ACK; } else { //printk(KERN_WARNING "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&frag_size = %d\n", frag_size); frag_size = ieee->fts;//default:392 - QOS_ctl = 0; + qos_ctl = 0; } if (ieee->current_network.QoS_Enable) { hdr_len = IEEE80211_3ADDR_LEN + 2; - QOS_ctl |= skb->priority; //set in the ieee80211_classify - header.QOS_ctl = cpu_to_le16(QOS_ctl); + /* skb->priority is set in the ieee80211_classify() */ + qos_ctl |= skb->priority; + header.qos_ctl = cpu_to_le16(qos_ctl); } else { hdr_len = IEEE80211_3ADDR_LEN; } - //printk(KERN_WARNING "header size = %d, QOS_ctl = %x\n", hdr_len,QOS_ctl); + /* Determine amount of payload per fragment. Regardless of if * this stack is providing the full 802.11 header, one will * eventually be affixed to this fragment -- so we must account for @@ -709,7 +478,7 @@ int ieee80211_xmit(struct sk_buff *skb, if (encrypt) skb_reserve(skb_frag, crypt->ops->extra_prefix_len); - frag_hdr = (struct ieee80211_hdr_3addr_QOS *)skb_put(skb_frag, hdr_len); + frag_hdr = (struct ieee80211_hdr_3addrqos *)skb_put(skb_frag, hdr_len); memcpy(frag_hdr, &header, hdr_len); /* If this is not the last fragment, then add the MOREFRAGS @@ -790,10 +559,6 @@ int ieee80211_xmit(struct sk_buff *skb, success: spin_unlock_irqrestore(&ieee->lock, flags); -#ifdef _RTL8187_EXT_PATCH_ - // Sometimes, extension mode can reuse skb (by txb->fragments[0]) - if( ! ((ieee->iw_mode == ieee->iw_ext_mode) && txb && (txb->fragments[0] == skb)) ) -#endif dev_kfree_skb_any(skb); if (txb) { if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){ @@ -817,12 +582,3 @@ int ieee80211_xmit(struct sk_buff *skb, return NETDEV_TX_BUSY; } - -#if 0 -EXPORT_SYMBOL(ieee80211_txb_free); -#ifdef _RTL8187_EXT_PATCH_ -EXPORT_SYMBOL(ieee80211_alloc_txb); -EXPORT_SYMBOL(ieee80211_ext_alloc_txb); -EXPORT_SYMBOL(ieee80211_ext_reuse_txb); -#endif // _RTL8187_EXT_PATCH_ -#endif diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_wx.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_wx.c index d1295e5..8d8bdd0 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_wx.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_wx.c @@ -39,12 +39,6 @@ static const char *ieee80211_modes[] = { "?", "a", "b", "ab", "g", "ag", "bg", "abg" }; -#ifdef FEDORACORE_9 -#define IN_FEDORACORE_9 1 -#else -#define IN_FEDORACORE_9 0 -#endif - #define MAX_CUSTOM_LEN 64 static inline char *rtl818x_translate_scan(struct ieee80211_device *ieee, char *start, char *stop, @@ -61,11 +55,7 @@ static inline char *rtl818x_translate_scan(struct ieee80211_device *ieee, iwe.cmd = SIOCGIWAP; iwe.u.ap_addr.sa_family = ARPHRD_ETHER; memcpy(iwe.u.ap_addr.sa_data, network->bssid, ETH_ALEN); -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_ADDR_LEN); -#else - start = iwe_stream_add_event(start, stop, &iwe, IW_EV_ADDR_LEN); -#endif /* Remaining entries will be displayed in the order we provide them */ @@ -77,28 +67,16 @@ static inline char *rtl818x_translate_scan(struct ieee80211_device *ieee, if (network->ssid_len == 0) { //YJ,modified,080903,end iwe.u.data.length = sizeof("<hidden>"); -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_point(info, start, stop, &iwe, "<hidden>"); -#else - start = iwe_stream_add_point(start, stop, &iwe, "<hidden>"); -#endif } else { iwe.u.data.length = min(network->ssid_len, (u8)32); -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_point(info, start, stop, &iwe, network->ssid); -#else - start = iwe_stream_add_point(start, stop, &iwe, network->ssid); -#endif } //printk("ESSID: %s\n",network->ssid); /* Add the protocol name */ iwe.cmd = SIOCGIWNAME; snprintf(iwe.u.name, IFNAMSIZ, "IEEE 802.11%s", ieee80211_modes[network->mode]); -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_CHAR_LEN); -#else - start = iwe_stream_add_event(start, stop, &iwe, IW_EV_CHAR_LEN); -#endif /* Add mode */ iwe.cmd = SIOCGIWMODE; @@ -109,11 +87,7 @@ static inline char *rtl818x_translate_scan(struct ieee80211_device *ieee, else iwe.u.mode = IW_MODE_ADHOC; -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_UINT_LEN); -#else - start = iwe_stream_add_event(start, stop, &iwe, IW_EV_UINT_LEN); -#endif } /* Add frequency/channel */ @@ -123,11 +97,7 @@ static inline char *rtl818x_translate_scan(struct ieee80211_device *ieee, iwe.u.freq.m = network->channel; iwe.u.freq.e = 0; iwe.u.freq.i = 0; -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_FREQ_LEN); -#else - start = iwe_stream_add_event(start, stop, &iwe, IW_EV_FREQ_LEN); -#endif /* Add encryption capability */ iwe.cmd = SIOCGIWENCODE; @@ -136,11 +106,7 @@ static inline char *rtl818x_translate_scan(struct ieee80211_device *ieee, else iwe.u.data.flags = IW_ENCODE_DISABLED; iwe.u.data.length = 0; -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_point(info, start, stop, &iwe, network->ssid); -#else - start = iwe_stream_add_point(start, stop, &iwe, network->ssid); -#endif /* Add basic and extended rates */ max_rate = 0; @@ -169,20 +135,12 @@ static inline char *rtl818x_translate_scan(struct ieee80211_device *ieee, iwe.cmd = SIOCGIWRATE; iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; iwe.u.bitrate.value = max_rate * 500000; -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_PARAM_LEN); -#else - start = iwe_stream_add_event(start, stop, &iwe, IW_EV_PARAM_LEN); -#endif iwe.cmd = IWEVCUSTOM; iwe.u.data.length = p - custom; if (iwe.u.data.length) -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_point(info, start, stop, &iwe, custom); -#else - start = iwe_stream_add_point(start, stop, &iwe, custom); -#endif /* Add quality statistics */ /* TODO: Fix these values... */ @@ -201,92 +159,35 @@ static inline char *rtl818x_translate_scan(struct ieee80211_device *ieee, if (!(network->stats.mask & IEEE80211_STATMASK_SIGNAL)) iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID; iwe.u.qual.updated = 7; -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_event(info, start, stop, &iwe, IW_EV_QUAL_LEN); -#else - start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN); -#endif iwe.cmd = IWEVCUSTOM; p = custom; iwe.u.data.length = p - custom; if (iwe.u.data.length) -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_point(info, start, stop, &iwe, custom); -#else - start = iwe_stream_add_point(start, stop, &iwe, custom); -#endif - -#if 0 - if (ieee->wpa_enabled && network->wpa_ie_len){ - char buf[MAX_WPA_IE_LEN * 2 + 30]; - // printk("WPA IE\n"); - u8 *p = buf; - p += sprintf(p, "wpa_ie="); - for (i = 0; i < network->wpa_ie_len; i++) { - p += sprintf(p, "%02x", network->wpa_ie[i]); - } memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = IWEVCUSTOM; - iwe.u.data.length = strlen(buf); -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) - start = iwe_stream_add_point(info, start, stop, &iwe, buf); -#else - start = iwe_stream_add_point(start, stop, &iwe, buf); -#endif - } - - if (ieee->wpa_enabled && network->rsn_ie_len){ - char buf[MAX_WPA_IE_LEN * 2 + 30]; - - u8 *p = buf; - p += sprintf(p, "rsn_ie="); - for (i = 0; i < network->rsn_ie_len; i++) { - p += sprintf(p, "%02x", network->rsn_ie[i]); - } - - -#else - memset(&iwe, 0, sizeof(iwe)); if (network->wpa_ie_len) { // printk("wpa_ie_len:%d\n", network->wpa_ie_len); char buf[MAX_WPA_IE_LEN]; memcpy(buf, network->wpa_ie, network->wpa_ie_len); iwe.cmd = IWEVGENIE; iwe.u.data.length = network->wpa_ie_len; -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_point(info, start, stop, &iwe, buf); -#else - start = iwe_stream_add_point(start, stop, &iwe, buf); -#endif } memset(&iwe, 0, sizeof(iwe)); if (network->rsn_ie_len) { // printk("=====>rsn_ie_len:\n", network->rsn_ie_len); - #if 0 - { - int i; - for (i=0; i<network->rsn_ie_len; i++); - printk("%2x ", network->rsn_ie[i]); - printk("\n"); - } - #endif char buf[MAX_WPA_IE_LEN]; memcpy(buf, network->rsn_ie, network->rsn_ie_len); iwe.cmd = IWEVGENIE; iwe.u.data.length = network->rsn_ie_len; -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_point(info, start, stop, &iwe, buf); -#else - start = iwe_stream_add_point(start, stop, &iwe, buf); -#endif } -#endif - /* Add EXTRA: Age to display seconds since last beacon/probe response * for given network. */ iwe.cmd = IWEVCUSTOM; @@ -295,11 +196,7 @@ static inline char *rtl818x_translate_scan(struct ieee80211_device *ieee, " Last beacon: %lums ago", (jiffies - network->last_scanned) / (HZ / 100)); iwe.u.data.length = p - custom; if (iwe.u.data.length) -#if((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))||IN_FEDORACORE_9) start = iwe_stream_add_point(info, start, stop, &iwe, custom); -#else - start = iwe_stream_add_point(start, stop, &iwe, custom); -#endif return start; } @@ -638,12 +535,7 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, sec.enabled = 1; // sec.encrypt = 1; -#if 0 - if (group_key ? !ieee->host_mc_decrypt : - !(ieee->host_encrypt || ieee->host_decrypt || - ieee->host_encrypt_msdu)) - goto skip_host_crypt; -#endif + switch (ext->alg) { case IW_ENCODE_ALG_WEP: alg = "WEP"; @@ -829,15 +721,6 @@ int ieee80211_wx_set_auth(struct ieee80211_device *ieee, #if 1 int ieee80211_wx_set_gen_ie(struct ieee80211_device *ieee, u8 *ie, size_t len) { -#if 0 - printk("====>%s()\n", __func__); - { - int i; - for (i=0; i<len; i++) - printk("%2x ", ie[i]&0xff); - printk("\n"); - } -#endif u8 *buf = NULL; if (len>MAX_WPA_IE_LEN || (len && ie == NULL)) @@ -872,13 +755,3 @@ int ieee80211_wx_set_gen_ie(struct ieee80211_device *ieee, u8 *ie, size_t len) } #endif - -#if 0 -EXPORT_SYMBOL(ieee80211_wx_set_gen_ie); -EXPORT_SYMBOL(ieee80211_wx_set_mlme); -EXPORT_SYMBOL(ieee80211_wx_set_auth); -EXPORT_SYMBOL(ieee80211_wx_set_encode_ext); -EXPORT_SYMBOL(ieee80211_wx_get_scan); -EXPORT_SYMBOL(ieee80211_wx_set_encode); -EXPORT_SYMBOL(ieee80211_wx_get_encode); -#endif diff --git a/drivers/staging/rtl8187se/ieee80211/internal.h b/drivers/staging/rtl8187se/ieee80211/internal.h deleted file mode 100644 index ddc2235..0000000 --- a/drivers/staging/rtl8187se/ieee80211/internal.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Cryptographic API. - * - * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - */ -#ifndef _CRYPTO_INTERNAL_H -#define _CRYPTO_INTERNAL_H - - -//#include <linux/crypto.h> -#include "rtl_crypto.h" -#include <linux/mm.h> -#include <linux/highmem.h> -#include <linux/init.h> -#include <asm/hardirq.h> -#include <asm/softirq.h> -#include <asm/kmap_types.h> - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20)) -#define list_for_each_entry(pos, head, member) \ - for (pos = list_entry((head)->next, typeof(*pos), member), \ - prefetch(pos->member.next); \ - &pos->member != (head); \ - pos = list_entry(pos->member.next, typeof(*pos), member), \ - prefetch(pos->member.next)) - -static inline void cond_resched(void) -{ - if (need_resched()) { - set_current_state(TASK_RUNNING); - schedule(); - } -} -#endif - -extern enum km_type crypto_km_types[]; - -static inline enum km_type crypto_kmap_type(int out) -{ - return crypto_km_types[(in_softirq() ? 2 : 0) + out]; -} - -static inline void *crypto_kmap(struct page *page, int out) -{ - return kmap_atomic(page, crypto_kmap_type(out)); -} - -static inline void crypto_kunmap(void *vaddr, int out) -{ - kunmap_atomic(vaddr, crypto_kmap_type(out)); -} - -static inline void crypto_yield(struct crypto_tfm *tfm) -{ - if (!in_softirq()) - cond_resched(); -} - -static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm) -{ - return (void *)&tfm[1]; -} - -struct crypto_alg *crypto_alg_lookup(const char *name); - -#ifdef CONFIG_KMOD -void crypto_alg_autoload(const char *name); -struct crypto_alg *crypto_alg_mod_lookup(const char *name); -#else -static inline struct crypto_alg *crypto_alg_mod_lookup(const char *name) -{ - return crypto_alg_lookup(name); -} -#endif - -#ifdef CONFIG_CRYPTO_HMAC -int crypto_alloc_hmac_block(struct crypto_tfm *tfm); -void crypto_free_hmac_block(struct crypto_tfm *tfm); -#else -static inline int crypto_alloc_hmac_block(struct crypto_tfm *tfm) -{ - return 0; -} - -static inline void crypto_free_hmac_block(struct crypto_tfm *tfm) -{ } -#endif - -#ifdef CONFIG_PROC_FS -void __init crypto_init_proc(void); -#else -static inline void crypto_init_proc(void) -{ } -#endif - -int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags); -int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags); -int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags); - -int crypto_init_digest_ops(struct crypto_tfm *tfm); -int crypto_init_cipher_ops(struct crypto_tfm *tfm); -int crypto_init_compress_ops(struct crypto_tfm *tfm); - -void crypto_exit_digest_ops(struct crypto_tfm *tfm); -void crypto_exit_cipher_ops(struct crypto_tfm *tfm); -void crypto_exit_compress_ops(struct crypto_tfm *tfm); - -#endif /* _CRYPTO_INTERNAL_H */ - diff --git a/drivers/staging/rtl8187se/ieee80211/rtl_crypto.h b/drivers/staging/rtl8187se/ieee80211/rtl_crypto.h deleted file mode 100644 index 9ed0ca4..0000000 --- a/drivers/staging/rtl8187se/ieee80211/rtl_crypto.h +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Scatterlist Cryptographic API. - * - * Copyright (c) 2002 James Morris <jmorris@intercode.com.au> - * Copyright (c) 2002 David S. Miller (davem@redhat.com) - * - * Portions derived from Cryptoapi, by Alexander Kjeldaas <astor@fast.no> - * and Nettle, by Niels Mé°ˆler. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - */ -#ifndef _LINUX_CRYPTO_H -#define _LINUX_CRYPTO_H - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/types.h> -#include <linux/list.h> -#include <linux/string.h> -#include <asm/page.h> -#include <asm/errno.h> - -#define crypto_register_alg crypto_register_alg_rtl -#define crypto_unregister_alg crypto_unregister_alg_rtl -#define crypto_alloc_tfm crypto_alloc_tfm_rtl -#define crypto_free_tfm crypto_free_tfm_rtl -#define crypto_alg_available crypto_alg_available_rtl - -/* - * Algorithm masks and types. - */ -#define CRYPTO_ALG_TYPE_MASK 0x000000ff -#define CRYPTO_ALG_TYPE_CIPHER 0x00000001 -#define CRYPTO_ALG_TYPE_DIGEST 0x00000002 -#define CRYPTO_ALG_TYPE_COMPRESS 0x00000004 - -/* - * Transform masks and values (for crt_flags). - */ -#define CRYPTO_TFM_MODE_MASK 0x000000ff -#define CRYPTO_TFM_REQ_MASK 0x000fff00 -#define CRYPTO_TFM_RES_MASK 0xfff00000 - -#define CRYPTO_TFM_MODE_ECB 0x00000001 -#define CRYPTO_TFM_MODE_CBC 0x00000002 -#define CRYPTO_TFM_MODE_CFB 0x00000004 -#define CRYPTO_TFM_MODE_CTR 0x00000008 - -#define CRYPTO_TFM_REQ_WEAK_KEY 0x00000100 -#define CRYPTO_TFM_RES_WEAK_KEY 0x00100000 -#define CRYPTO_TFM_RES_BAD_KEY_LEN 0x00200000 -#define CRYPTO_TFM_RES_BAD_KEY_SCHED 0x00400000 -#define CRYPTO_TFM_RES_BAD_BLOCK_LEN 0x00800000 -#define CRYPTO_TFM_RES_BAD_FLAGS 0x01000000 - -/* - * Miscellaneous stuff. - */ -#define CRYPTO_UNSPEC 0 -#define CRYPTO_MAX_ALG_NAME 64 - -struct scatterlist; - -/* - * Algorithms: modular crypto algorithm implementations, managed - * via crypto_register_alg() and crypto_unregister_alg(). - */ -struct cipher_alg { - unsigned int cia_min_keysize; - unsigned int cia_max_keysize; - int (*cia_setkey)(void *ctx, const u8 *key, - unsigned int keylen, u32 *flags); - void (*cia_encrypt)(void *ctx, u8 *dst, const u8 *src); - void (*cia_decrypt)(void *ctx, u8 *dst, const u8 *src); -}; - -struct digest_alg { - unsigned int dia_digestsize; - void (*dia_init)(void *ctx); - void (*dia_update)(void *ctx, const u8 *data, unsigned int len); - void (*dia_final)(void *ctx, u8 *out); - int (*dia_setkey)(void *ctx, const u8 *key, - unsigned int keylen, u32 *flags); -}; - -struct compress_alg { - int (*coa_init)(void *ctx); - void (*coa_exit)(void *ctx); - int (*coa_compress)(void *ctx, const u8 *src, unsigned int slen, - u8 *dst, unsigned int *dlen); - int (*coa_decompress)(void *ctx, const u8 *src, unsigned int slen, - u8 *dst, unsigned int *dlen); -}; - -#define cra_cipher cra_u.cipher -#define cra_digest cra_u.digest -#define cra_compress cra_u.compress - -struct crypto_alg { - struct list_head cra_list; - u32 cra_flags; - unsigned int cra_blocksize; - unsigned int cra_ctxsize; - const char cra_name[CRYPTO_MAX_ALG_NAME]; - - union { - struct cipher_alg cipher; - struct digest_alg digest; - struct compress_alg compress; - } cra_u; - - struct module *cra_module; -}; - -/* - * Algorithm registration interface. - */ -int crypto_register_alg(struct crypto_alg *alg); -int crypto_unregister_alg(struct crypto_alg *alg); - -/* - * Algorithm query interface. - */ -int crypto_alg_available(const char *name, u32 flags); - -/* - * Transforms: user-instantiated objects which encapsulate algorithms - * and core processing logic. Managed via crypto_alloc_tfm() and - * crypto_free_tfm(), as well as the various helpers below. - */ -struct crypto_tfm; - -struct cipher_tfm { - void *cit_iv; - unsigned int cit_ivsize; - u32 cit_mode; - int (*cit_setkey)(struct crypto_tfm *tfm, - const u8 *key, unsigned int keylen); - int (*cit_encrypt)(struct crypto_tfm *tfm, - struct scatterlist *dst, - struct scatterlist *src, - unsigned int nbytes); - int (*cit_encrypt_iv)(struct crypto_tfm *tfm, - struct scatterlist *dst, - struct scatterlist *src, - unsigned int nbytes, u8 *iv); - int (*cit_decrypt)(struct crypto_tfm *tfm, - struct scatterlist *dst, - struct scatterlist *src, - unsigned int nbytes); - int (*cit_decrypt_iv)(struct crypto_tfm *tfm, - struct scatterlist *dst, - struct scatterlist *src, - unsigned int nbytes, u8 *iv); - void (*cit_xor_block)(u8 *dst, const u8 *src); -}; - -struct digest_tfm { - void (*dit_init)(struct crypto_tfm *tfm); - void (*dit_update)(struct crypto_tfm *tfm, - struct scatterlist *sg, unsigned int nsg); - void (*dit_final)(struct crypto_tfm *tfm, u8 *out); - void (*dit_digest)(struct crypto_tfm *tfm, struct scatterlist *sg, - unsigned int nsg, u8 *out); - int (*dit_setkey)(struct crypto_tfm *tfm, - const u8 *key, unsigned int keylen); -#ifdef CONFIG_CRYPTO_HMAC - void *dit_hmac_block; -#endif -}; - -struct compress_tfm { - int (*cot_compress)(struct crypto_tfm *tfm, - const u8 *src, unsigned int slen, - u8 *dst, unsigned int *dlen); - int (*cot_decompress)(struct crypto_tfm *tfm, - const u8 *src, unsigned int slen, - u8 *dst, unsigned int *dlen); -}; - -#define crt_cipher crt_u.cipher -#define crt_digest crt_u.digest -#define crt_compress crt_u.compress - -struct crypto_tfm { - - u32 crt_flags; - - union { - struct cipher_tfm cipher; - struct digest_tfm digest; - struct compress_tfm compress; - } crt_u; - - struct crypto_alg *__crt_alg; -}; - -/* - * Transform user interface. - */ - -/* - * crypto_alloc_tfm() will first attempt to locate an already loaded algorithm. - * If that fails and the kernel supports dynamically loadable modules, it - * will then attempt to load a module of the same name or alias. A refcount - * is grabbed on the algorithm which is then associated with the new transform. - * - * crypto_free_tfm() frees up the transform and any associated resources, - * then drops the refcount on the associated algorithm. - */ -struct crypto_tfm *crypto_alloc_tfm(const char *alg_name, u32 tfm_flags); -void crypto_free_tfm(struct crypto_tfm *tfm); - -/* - * Transform helpers which query the underlying algorithm. - */ -static inline const char *crypto_tfm_alg_name(struct crypto_tfm *tfm) -{ - return tfm->__crt_alg->cra_name; -} - -static inline const char *crypto_tfm_alg_modname(struct crypto_tfm *tfm) -{ - struct crypto_alg *alg = tfm->__crt_alg; - - if (alg->cra_module) - return alg->cra_module->name; - else - return NULL; -} - -static inline u32 crypto_tfm_alg_type(struct crypto_tfm *tfm) -{ - return tfm->__crt_alg->cra_flags & CRYPTO_ALG_TYPE_MASK; -} - -static inline unsigned int crypto_tfm_alg_min_keysize(struct crypto_tfm *tfm) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); - return tfm->__crt_alg->cra_cipher.cia_min_keysize; -} - -static inline unsigned int crypto_tfm_alg_max_keysize(struct crypto_tfm *tfm) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); - return tfm->__crt_alg->cra_cipher.cia_max_keysize; -} - -static inline unsigned int crypto_tfm_alg_ivsize(struct crypto_tfm *tfm) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); - return tfm->crt_cipher.cit_ivsize; -} - -static inline unsigned int crypto_tfm_alg_blocksize(struct crypto_tfm *tfm) -{ - return tfm->__crt_alg->cra_blocksize; -} - -static inline unsigned int crypto_tfm_alg_digestsize(struct crypto_tfm *tfm) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST); - return tfm->__crt_alg->cra_digest.dia_digestsize; -} - -/* - * API wrappers. - */ -static inline void crypto_digest_init(struct crypto_tfm *tfm) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST); - tfm->crt_digest.dit_init(tfm); -} - -static inline void crypto_digest_update(struct crypto_tfm *tfm, - struct scatterlist *sg, - unsigned int nsg) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST); - tfm->crt_digest.dit_update(tfm, sg, nsg); -} - -static inline void crypto_digest_final(struct crypto_tfm *tfm, u8 *out) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST); - tfm->crt_digest.dit_final(tfm, out); -} - -static inline void crypto_digest_digest(struct crypto_tfm *tfm, - struct scatterlist *sg, - unsigned int nsg, u8 *out) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST); - tfm->crt_digest.dit_digest(tfm, sg, nsg, out); -} - -static inline int crypto_digest_setkey(struct crypto_tfm *tfm, - const u8 *key, unsigned int keylen) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST); - if (tfm->crt_digest.dit_setkey == NULL) - return -ENOSYS; - return tfm->crt_digest.dit_setkey(tfm, key, keylen); -} - -static inline int crypto_cipher_setkey(struct crypto_tfm *tfm, - const u8 *key, unsigned int keylen) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); - return tfm->crt_cipher.cit_setkey(tfm, key, keylen); -} - -static inline int crypto_cipher_encrypt(struct crypto_tfm *tfm, - struct scatterlist *dst, - struct scatterlist *src, - unsigned int nbytes) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); - return tfm->crt_cipher.cit_encrypt(tfm, dst, src, nbytes); -} - -static inline int crypto_cipher_encrypt_iv(struct crypto_tfm *tfm, - struct scatterlist *dst, - struct scatterlist *src, - unsigned int nbytes, u8 *iv) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); - BUG_ON(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB); - return tfm->crt_cipher.cit_encrypt_iv(tfm, dst, src, nbytes, iv); -} - -static inline int crypto_cipher_decrypt(struct crypto_tfm *tfm, - struct scatterlist *dst, - struct scatterlist *src, - unsigned int nbytes) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); - return tfm->crt_cipher.cit_decrypt(tfm, dst, src, nbytes); -} - -static inline int crypto_cipher_decrypt_iv(struct crypto_tfm *tfm, - struct scatterlist *dst, - struct scatterlist *src, - unsigned int nbytes, u8 *iv) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); - BUG_ON(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB); - return tfm->crt_cipher.cit_decrypt_iv(tfm, dst, src, nbytes, iv); -} - -static inline void crypto_cipher_set_iv(struct crypto_tfm *tfm, - const u8 *src, unsigned int len) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); - memcpy(tfm->crt_cipher.cit_iv, src, len); -} - -static inline void crypto_cipher_get_iv(struct crypto_tfm *tfm, - u8 *dst, unsigned int len) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER); - memcpy(dst, tfm->crt_cipher.cit_iv, len); -} - -static inline int crypto_comp_compress(struct crypto_tfm *tfm, - const u8 *src, unsigned int slen, - u8 *dst, unsigned int *dlen) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS); - return tfm->crt_compress.cot_compress(tfm, src, slen, dst, dlen); -} - -static inline int crypto_comp_decompress(struct crypto_tfm *tfm, - const u8 *src, unsigned int slen, - u8 *dst, unsigned int *dlen) -{ - BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS); - return tfm->crt_compress.cot_decompress(tfm, src, slen, dst, dlen); -} - -/* - * HMAC support. - */ -#ifdef CONFIG_CRYPTO_HMAC -void crypto_hmac_init(struct crypto_tfm *tfm, u8 *key, unsigned int *keylen); -void crypto_hmac_update(struct crypto_tfm *tfm, - struct scatterlist *sg, unsigned int nsg); -void crypto_hmac_final(struct crypto_tfm *tfm, u8 *key, - unsigned int *keylen, u8 *out); -void crypto_hmac(struct crypto_tfm *tfm, u8 *key, unsigned int *keylen, - struct scatterlist *sg, unsigned int nsg, u8 *out); -#endif /* CONFIG_CRYPTO_HMAC */ - -#endif /* _LINUX_CRYPTO_H */ - |