162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Merged with mainline ieee80211.h in Aug 2004. Original ieee802_11 462306a36Sopenharmony_ci * remains copyright by the original authors 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Portions of the merged code are based on Host AP (software wireless 762306a36Sopenharmony_ci * LAN access point) driver for Intersil Prism2/2.5/3. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen 1062306a36Sopenharmony_ci * <j@w1.fi> 1162306a36Sopenharmony_ci * Copyright (c) 2002-2003, Jouni Malinen <j@w1.fi> 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * Adaption to a generic IEEE 802.11 stack by James Ketrenos 1462306a36Sopenharmony_ci * <jketreno@linux.intel.com> 1562306a36Sopenharmony_ci * Copyright (c) 2004-2005, Intel Corporation 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * API Version History 1862306a36Sopenharmony_ci * 1.0.x -- Initial version 1962306a36Sopenharmony_ci * 1.1.x -- Added radiotap, QoS, TIM, libipw_geo APIs, 2062306a36Sopenharmony_ci * various structure changes, and crypto API init method 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci#ifndef LIBIPW_H 2362306a36Sopenharmony_ci#define LIBIPW_H 2462306a36Sopenharmony_ci#include <linux/if_ether.h> /* ETH_ALEN */ 2562306a36Sopenharmony_ci#include <linux/kernel.h> /* ARRAY_SIZE */ 2662306a36Sopenharmony_ci#include <linux/wireless.h> 2762306a36Sopenharmony_ci#include <linux/ieee80211.h> 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#include <net/lib80211.h> 3062306a36Sopenharmony_ci#include <net/cfg80211.h> 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define LIBIPW_VERSION "git-1.1.13" 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define LIBIPW_DATA_LEN 2304 3562306a36Sopenharmony_ci/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section 3662306a36Sopenharmony_ci 6.2.1.1.2. 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci The figure in section 7.1.2 suggests a body size of up to 2312 3962306a36Sopenharmony_ci bytes is allowed, which is a bit confusing, I suspect this 4062306a36Sopenharmony_ci represents the 2304 bytes of real data, plus a possible 8 bytes of 4162306a36Sopenharmony_ci WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define LIBIPW_1ADDR_LEN 10 4462306a36Sopenharmony_ci#define LIBIPW_2ADDR_LEN 16 4562306a36Sopenharmony_ci#define LIBIPW_3ADDR_LEN 24 4662306a36Sopenharmony_ci#define LIBIPW_4ADDR_LEN 30 4762306a36Sopenharmony_ci#define LIBIPW_FCS_LEN 4 4862306a36Sopenharmony_ci#define LIBIPW_HLEN (LIBIPW_4ADDR_LEN) 4962306a36Sopenharmony_ci#define LIBIPW_FRAME_LEN (LIBIPW_DATA_LEN + LIBIPW_HLEN) 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define MIN_FRAG_THRESHOLD 256U 5262306a36Sopenharmony_ci#define MAX_FRAG_THRESHOLD 2346U 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* QOS control */ 5562306a36Sopenharmony_ci#define LIBIPW_QCTL_TID 0x000F 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* debug macros */ 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#ifdef CONFIG_LIBIPW_DEBUG 6062306a36Sopenharmony_ciextern u32 libipw_debug_level; 6162306a36Sopenharmony_ci#define LIBIPW_DEBUG(level, fmt, args...) \ 6262306a36Sopenharmony_cido { if (libipw_debug_level & (level)) \ 6362306a36Sopenharmony_ci printk(KERN_DEBUG "libipw: %s " fmt, __func__ , ## args); } while (0) 6462306a36Sopenharmony_ci#else 6562306a36Sopenharmony_ci#define LIBIPW_DEBUG(level, fmt, args...) do {} while (0) 6662306a36Sopenharmony_ci#endif /* CONFIG_LIBIPW_DEBUG */ 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/* 6962306a36Sopenharmony_ci * To use the debug system: 7062306a36Sopenharmony_ci * 7162306a36Sopenharmony_ci * If you are defining a new debug classification, simply add it to the #define 7262306a36Sopenharmony_ci * list here in the form of: 7362306a36Sopenharmony_ci * 7462306a36Sopenharmony_ci * #define LIBIPW_DL_xxxx VALUE 7562306a36Sopenharmony_ci * 7662306a36Sopenharmony_ci * shifting value to the left one bit from the previous entry. xxxx should be 7762306a36Sopenharmony_ci * the name of the classification (for example, WEP) 7862306a36Sopenharmony_ci * 7962306a36Sopenharmony_ci * You then need to either add a LIBIPW_xxxx_DEBUG() macro definition for your 8062306a36Sopenharmony_ci * classification, or use LIBIPW_DEBUG(LIBIPW_DL_xxxx, ...) whenever you want 8162306a36Sopenharmony_ci * to send output to that classification. 8262306a36Sopenharmony_ci * 8362306a36Sopenharmony_ci * To add your debug level to the list of levels seen when you perform 8462306a36Sopenharmony_ci * 8562306a36Sopenharmony_ci * % cat /proc/net/ieee80211/debug_level 8662306a36Sopenharmony_ci * 8762306a36Sopenharmony_ci * you simply need to add your entry to the libipw_debug_level array. 8862306a36Sopenharmony_ci * 8962306a36Sopenharmony_ci * If you do not see debug_level in /proc/net/ieee80211 then you do not have 9062306a36Sopenharmony_ci * CONFIG_LIBIPW_DEBUG defined in your kernel configuration 9162306a36Sopenharmony_ci * 9262306a36Sopenharmony_ci */ 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#define LIBIPW_DL_INFO (1<<0) 9562306a36Sopenharmony_ci#define LIBIPW_DL_WX (1<<1) 9662306a36Sopenharmony_ci#define LIBIPW_DL_SCAN (1<<2) 9762306a36Sopenharmony_ci#define LIBIPW_DL_STATE (1<<3) 9862306a36Sopenharmony_ci#define LIBIPW_DL_MGMT (1<<4) 9962306a36Sopenharmony_ci#define LIBIPW_DL_FRAG (1<<5) 10062306a36Sopenharmony_ci#define LIBIPW_DL_DROP (1<<7) 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci#define LIBIPW_DL_TX (1<<8) 10362306a36Sopenharmony_ci#define LIBIPW_DL_RX (1<<9) 10462306a36Sopenharmony_ci#define LIBIPW_DL_QOS (1<<31) 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci#define LIBIPW_ERROR(f, a...) printk(KERN_ERR "libipw: " f, ## a) 10762306a36Sopenharmony_ci#define LIBIPW_WARNING(f, a...) printk(KERN_WARNING "libipw: " f, ## a) 10862306a36Sopenharmony_ci#define LIBIPW_DEBUG_INFO(f, a...) LIBIPW_DEBUG(LIBIPW_DL_INFO, f, ## a) 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci#define LIBIPW_DEBUG_WX(f, a...) LIBIPW_DEBUG(LIBIPW_DL_WX, f, ## a) 11162306a36Sopenharmony_ci#define LIBIPW_DEBUG_SCAN(f, a...) LIBIPW_DEBUG(LIBIPW_DL_SCAN, f, ## a) 11262306a36Sopenharmony_ci#define LIBIPW_DEBUG_STATE(f, a...) LIBIPW_DEBUG(LIBIPW_DL_STATE, f, ## a) 11362306a36Sopenharmony_ci#define LIBIPW_DEBUG_MGMT(f, a...) LIBIPW_DEBUG(LIBIPW_DL_MGMT, f, ## a) 11462306a36Sopenharmony_ci#define LIBIPW_DEBUG_FRAG(f, a...) LIBIPW_DEBUG(LIBIPW_DL_FRAG, f, ## a) 11562306a36Sopenharmony_ci#define LIBIPW_DEBUG_DROP(f, a...) LIBIPW_DEBUG(LIBIPW_DL_DROP, f, ## a) 11662306a36Sopenharmony_ci#define LIBIPW_DEBUG_TX(f, a...) LIBIPW_DEBUG(LIBIPW_DL_TX, f, ## a) 11762306a36Sopenharmony_ci#define LIBIPW_DEBUG_RX(f, a...) LIBIPW_DEBUG(LIBIPW_DL_RX, f, ## a) 11862306a36Sopenharmony_ci#define LIBIPW_DEBUG_QOS(f, a...) LIBIPW_DEBUG(LIBIPW_DL_QOS, f, ## a) 11962306a36Sopenharmony_ci#include <linux/netdevice.h> 12062306a36Sopenharmony_ci#include <linux/if_arp.h> /* ARPHRD_ETHER */ 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci#ifndef WIRELESS_SPY 12362306a36Sopenharmony_ci#define WIRELESS_SPY /* enable iwspy support */ 12462306a36Sopenharmony_ci#endif 12562306a36Sopenharmony_ci#include <net/iw_handler.h> /* new driver API */ 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci#ifndef ETH_P_80211_RAW 13062306a36Sopenharmony_ci#define ETH_P_80211_RAW (ETH_P_ECONET + 1) 13162306a36Sopenharmony_ci#endif 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci/* IEEE 802.11 defines */ 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci#define P80211_OUI_LEN 3 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct libipw_snap_hdr { 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci u8 dsap; /* always 0xAA */ 14062306a36Sopenharmony_ci u8 ssap; /* always 0xAA */ 14162306a36Sopenharmony_ci u8 ctrl; /* always 0x03 */ 14262306a36Sopenharmony_ci u8 oui[P80211_OUI_LEN]; /* organizational universal id */ 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci} __packed; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#define SNAP_SIZE sizeof(struct libipw_snap_hdr) 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci#define WLAN_FC_GET_VERS(fc) ((fc) & IEEE80211_FCTL_VERS) 14962306a36Sopenharmony_ci#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE) 15062306a36Sopenharmony_ci#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE) 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG) 15362306a36Sopenharmony_ci#define WLAN_GET_SEQ_SEQ(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4) 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci#define LIBIPW_STATMASK_SIGNAL (1<<0) 15662306a36Sopenharmony_ci#define LIBIPW_STATMASK_RSSI (1<<1) 15762306a36Sopenharmony_ci#define LIBIPW_STATMASK_NOISE (1<<2) 15862306a36Sopenharmony_ci#define LIBIPW_STATMASK_RATE (1<<3) 15962306a36Sopenharmony_ci#define LIBIPW_STATMASK_WEMASK 0x7 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci#define LIBIPW_CCK_MODULATION (1<<0) 16262306a36Sopenharmony_ci#define LIBIPW_OFDM_MODULATION (1<<1) 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci#define LIBIPW_24GHZ_BAND (1<<0) 16562306a36Sopenharmony_ci#define LIBIPW_52GHZ_BAND (1<<1) 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci#define LIBIPW_CCK_RATE_1MB 0x02 16862306a36Sopenharmony_ci#define LIBIPW_CCK_RATE_2MB 0x04 16962306a36Sopenharmony_ci#define LIBIPW_CCK_RATE_5MB 0x0B 17062306a36Sopenharmony_ci#define LIBIPW_CCK_RATE_11MB 0x16 17162306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_6MB 0x0C 17262306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_9MB 0x12 17362306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_12MB 0x18 17462306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_18MB 0x24 17562306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_24MB 0x30 17662306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_36MB 0x48 17762306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_48MB 0x60 17862306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_54MB 0x6C 17962306a36Sopenharmony_ci#define LIBIPW_BASIC_RATE_MASK 0x80 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci#define LIBIPW_CCK_RATE_1MB_MASK (1<<0) 18262306a36Sopenharmony_ci#define LIBIPW_CCK_RATE_2MB_MASK (1<<1) 18362306a36Sopenharmony_ci#define LIBIPW_CCK_RATE_5MB_MASK (1<<2) 18462306a36Sopenharmony_ci#define LIBIPW_CCK_RATE_11MB_MASK (1<<3) 18562306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_6MB_MASK (1<<4) 18662306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_9MB_MASK (1<<5) 18762306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_12MB_MASK (1<<6) 18862306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_18MB_MASK (1<<7) 18962306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_24MB_MASK (1<<8) 19062306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_36MB_MASK (1<<9) 19162306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_48MB_MASK (1<<10) 19262306a36Sopenharmony_ci#define LIBIPW_OFDM_RATE_54MB_MASK (1<<11) 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci#define LIBIPW_CCK_RATES_MASK 0x0000000F 19562306a36Sopenharmony_ci#define LIBIPW_CCK_BASIC_RATES_MASK (LIBIPW_CCK_RATE_1MB_MASK | \ 19662306a36Sopenharmony_ci LIBIPW_CCK_RATE_2MB_MASK) 19762306a36Sopenharmony_ci#define LIBIPW_CCK_DEFAULT_RATES_MASK (LIBIPW_CCK_BASIC_RATES_MASK | \ 19862306a36Sopenharmony_ci LIBIPW_CCK_RATE_5MB_MASK | \ 19962306a36Sopenharmony_ci LIBIPW_CCK_RATE_11MB_MASK) 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci#define LIBIPW_OFDM_RATES_MASK 0x00000FF0 20262306a36Sopenharmony_ci#define LIBIPW_OFDM_BASIC_RATES_MASK (LIBIPW_OFDM_RATE_6MB_MASK | \ 20362306a36Sopenharmony_ci LIBIPW_OFDM_RATE_12MB_MASK | \ 20462306a36Sopenharmony_ci LIBIPW_OFDM_RATE_24MB_MASK) 20562306a36Sopenharmony_ci#define LIBIPW_OFDM_DEFAULT_RATES_MASK (LIBIPW_OFDM_BASIC_RATES_MASK | \ 20662306a36Sopenharmony_ci LIBIPW_OFDM_RATE_9MB_MASK | \ 20762306a36Sopenharmony_ci LIBIPW_OFDM_RATE_18MB_MASK | \ 20862306a36Sopenharmony_ci LIBIPW_OFDM_RATE_36MB_MASK | \ 20962306a36Sopenharmony_ci LIBIPW_OFDM_RATE_48MB_MASK | \ 21062306a36Sopenharmony_ci LIBIPW_OFDM_RATE_54MB_MASK) 21162306a36Sopenharmony_ci#define LIBIPW_DEFAULT_RATES_MASK (LIBIPW_OFDM_DEFAULT_RATES_MASK | \ 21262306a36Sopenharmony_ci LIBIPW_CCK_DEFAULT_RATES_MASK) 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci#define LIBIPW_NUM_OFDM_RATES 8 21562306a36Sopenharmony_ci#define LIBIPW_NUM_CCK_RATES 4 21662306a36Sopenharmony_ci#define LIBIPW_OFDM_SHIFT_MASK_A 4 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci/* NOTE: This data is for statistical purposes; not all hardware provides this 21962306a36Sopenharmony_ci * information for frames received. 22062306a36Sopenharmony_ci * For libipw_rx_mgt, you need to set at least the 'len' parameter. 22162306a36Sopenharmony_ci */ 22262306a36Sopenharmony_cistruct libipw_rx_stats { 22362306a36Sopenharmony_ci u32 mac_time; 22462306a36Sopenharmony_ci s8 rssi; 22562306a36Sopenharmony_ci u8 signal; 22662306a36Sopenharmony_ci u8 noise; 22762306a36Sopenharmony_ci u16 rate; /* in 100 kbps */ 22862306a36Sopenharmony_ci u8 received_channel; 22962306a36Sopenharmony_ci u8 control; 23062306a36Sopenharmony_ci u8 mask; 23162306a36Sopenharmony_ci u8 freq; 23262306a36Sopenharmony_ci u16 len; 23362306a36Sopenharmony_ci u64 tsf; 23462306a36Sopenharmony_ci u32 beacon_time; 23562306a36Sopenharmony_ci}; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci/* IEEE 802.11 requires that STA supports concurrent reception of at least 23862306a36Sopenharmony_ci * three fragmented frames. This define can be increased to support more 23962306a36Sopenharmony_ci * concurrent frames, but it should be noted that each entry can consume about 24062306a36Sopenharmony_ci * 2 kB of RAM and increasing cache size will slow down frame reassembly. */ 24162306a36Sopenharmony_ci#define LIBIPW_FRAG_CACHE_LEN 4 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_cistruct libipw_frag_entry { 24462306a36Sopenharmony_ci unsigned long first_frag_time; 24562306a36Sopenharmony_ci unsigned int seq; 24662306a36Sopenharmony_ci unsigned int last_frag; 24762306a36Sopenharmony_ci struct sk_buff *skb; 24862306a36Sopenharmony_ci u8 src_addr[ETH_ALEN]; 24962306a36Sopenharmony_ci u8 dst_addr[ETH_ALEN]; 25062306a36Sopenharmony_ci}; 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_cistruct libipw_stats { 25362306a36Sopenharmony_ci unsigned int tx_unicast_frames; 25462306a36Sopenharmony_ci unsigned int tx_multicast_frames; 25562306a36Sopenharmony_ci unsigned int tx_fragments; 25662306a36Sopenharmony_ci unsigned int tx_unicast_octets; 25762306a36Sopenharmony_ci unsigned int tx_multicast_octets; 25862306a36Sopenharmony_ci unsigned int tx_deferred_transmissions; 25962306a36Sopenharmony_ci unsigned int tx_single_retry_frames; 26062306a36Sopenharmony_ci unsigned int tx_multiple_retry_frames; 26162306a36Sopenharmony_ci unsigned int tx_retry_limit_exceeded; 26262306a36Sopenharmony_ci unsigned int tx_discards; 26362306a36Sopenharmony_ci unsigned int rx_unicast_frames; 26462306a36Sopenharmony_ci unsigned int rx_multicast_frames; 26562306a36Sopenharmony_ci unsigned int rx_fragments; 26662306a36Sopenharmony_ci unsigned int rx_unicast_octets; 26762306a36Sopenharmony_ci unsigned int rx_multicast_octets; 26862306a36Sopenharmony_ci unsigned int rx_fcs_errors; 26962306a36Sopenharmony_ci unsigned int rx_discards_no_buffer; 27062306a36Sopenharmony_ci unsigned int tx_discards_wrong_sa; 27162306a36Sopenharmony_ci unsigned int rx_discards_undecryptable; 27262306a36Sopenharmony_ci unsigned int rx_message_in_msg_fragments; 27362306a36Sopenharmony_ci unsigned int rx_message_in_bad_msg_fragments; 27462306a36Sopenharmony_ci}; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cistruct libipw_device; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci#define SEC_KEY_1 (1<<0) 27962306a36Sopenharmony_ci#define SEC_KEY_2 (1<<1) 28062306a36Sopenharmony_ci#define SEC_KEY_3 (1<<2) 28162306a36Sopenharmony_ci#define SEC_KEY_4 (1<<3) 28262306a36Sopenharmony_ci#define SEC_ACTIVE_KEY (1<<4) 28362306a36Sopenharmony_ci#define SEC_AUTH_MODE (1<<5) 28462306a36Sopenharmony_ci#define SEC_UNICAST_GROUP (1<<6) 28562306a36Sopenharmony_ci#define SEC_LEVEL (1<<7) 28662306a36Sopenharmony_ci#define SEC_ENABLED (1<<8) 28762306a36Sopenharmony_ci#define SEC_ENCRYPT (1<<9) 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci#define SEC_LEVEL_0 0 /* None */ 29062306a36Sopenharmony_ci#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ 29162306a36Sopenharmony_ci#define SEC_LEVEL_2 2 /* Level 1 + TKIP */ 29262306a36Sopenharmony_ci#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ 29362306a36Sopenharmony_ci#define SEC_LEVEL_3 4 /* Level 2 + CCMP */ 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci#define SEC_ALG_NONE 0 29662306a36Sopenharmony_ci#define SEC_ALG_WEP 1 29762306a36Sopenharmony_ci#define SEC_ALG_TKIP 2 29862306a36Sopenharmony_ci#define SEC_ALG_CCMP 3 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci#define WEP_KEYS 4 30162306a36Sopenharmony_ci#define WEP_KEY_LEN 13 30262306a36Sopenharmony_ci#define SCM_KEY_LEN 32 30362306a36Sopenharmony_ci#define SCM_TEMPORAL_KEY_LENGTH 16 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_cistruct libipw_security { 30662306a36Sopenharmony_ci u16 active_key:2, enabled:1, unicast_uses_group:1, encrypt:1; 30762306a36Sopenharmony_ci u8 auth_mode; 30862306a36Sopenharmony_ci u8 encode_alg[WEP_KEYS]; 30962306a36Sopenharmony_ci u8 key_sizes[WEP_KEYS]; 31062306a36Sopenharmony_ci u8 keys[WEP_KEYS][SCM_KEY_LEN]; 31162306a36Sopenharmony_ci u8 level; 31262306a36Sopenharmony_ci u16 flags; 31362306a36Sopenharmony_ci} __packed; 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci/* 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci 802.11 data frame from AP 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci ,-------------------------------------------------------------------. 32062306a36Sopenharmony_ciBytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 | 32162306a36Sopenharmony_ci |------|------|---------|---------|---------|------|---------|------| 32262306a36Sopenharmony_ciDesc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs | 32362306a36Sopenharmony_ci | | tion | (BSSID) | | | ence | data | | 32462306a36Sopenharmony_ci `-------------------------------------------------------------------' 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ciTotal: 28-2340 bytes 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci*/ 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci#define BEACON_PROBE_SSID_ID_POSITION 12 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistruct libipw_hdr_1addr { 33362306a36Sopenharmony_ci __le16 frame_ctl; 33462306a36Sopenharmony_ci __le16 duration_id; 33562306a36Sopenharmony_ci u8 addr1[ETH_ALEN]; 33662306a36Sopenharmony_ci u8 payload[]; 33762306a36Sopenharmony_ci} __packed; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistruct libipw_hdr_2addr { 34062306a36Sopenharmony_ci __le16 frame_ctl; 34162306a36Sopenharmony_ci __le16 duration_id; 34262306a36Sopenharmony_ci u8 addr1[ETH_ALEN]; 34362306a36Sopenharmony_ci u8 addr2[ETH_ALEN]; 34462306a36Sopenharmony_ci u8 payload[]; 34562306a36Sopenharmony_ci} __packed; 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_cistruct libipw_hdr_3addr { 34862306a36Sopenharmony_ci __le16 frame_ctl; 34962306a36Sopenharmony_ci __le16 duration_id; 35062306a36Sopenharmony_ci u8 addr1[ETH_ALEN]; 35162306a36Sopenharmony_ci u8 addr2[ETH_ALEN]; 35262306a36Sopenharmony_ci u8 addr3[ETH_ALEN]; 35362306a36Sopenharmony_ci __le16 seq_ctl; 35462306a36Sopenharmony_ci u8 payload[]; 35562306a36Sopenharmony_ci} __packed; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cistruct libipw_hdr_4addr { 35862306a36Sopenharmony_ci __le16 frame_ctl; 35962306a36Sopenharmony_ci __le16 duration_id; 36062306a36Sopenharmony_ci u8 addr1[ETH_ALEN]; 36162306a36Sopenharmony_ci u8 addr2[ETH_ALEN]; 36262306a36Sopenharmony_ci u8 addr3[ETH_ALEN]; 36362306a36Sopenharmony_ci __le16 seq_ctl; 36462306a36Sopenharmony_ci u8 addr4[ETH_ALEN]; 36562306a36Sopenharmony_ci u8 payload[]; 36662306a36Sopenharmony_ci} __packed; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cistruct libipw_hdr_3addrqos { 36962306a36Sopenharmony_ci __le16 frame_ctl; 37062306a36Sopenharmony_ci __le16 duration_id; 37162306a36Sopenharmony_ci u8 addr1[ETH_ALEN]; 37262306a36Sopenharmony_ci u8 addr2[ETH_ALEN]; 37362306a36Sopenharmony_ci u8 addr3[ETH_ALEN]; 37462306a36Sopenharmony_ci __le16 seq_ctl; 37562306a36Sopenharmony_ci u8 payload[0]; 37662306a36Sopenharmony_ci __le16 qos_ctl; 37762306a36Sopenharmony_ci} __packed; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_cistruct libipw_info_element { 38062306a36Sopenharmony_ci u8 id; 38162306a36Sopenharmony_ci u8 len; 38262306a36Sopenharmony_ci u8 data[]; 38362306a36Sopenharmony_ci} __packed; 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci/* 38662306a36Sopenharmony_ci * These are the data types that can make up management packets 38762306a36Sopenharmony_ci * 38862306a36Sopenharmony_ci u16 auth_algorithm; 38962306a36Sopenharmony_ci u16 auth_sequence; 39062306a36Sopenharmony_ci u16 beacon_interval; 39162306a36Sopenharmony_ci u16 capability; 39262306a36Sopenharmony_ci u8 current_ap[ETH_ALEN]; 39362306a36Sopenharmony_ci u16 listen_interval; 39462306a36Sopenharmony_ci struct { 39562306a36Sopenharmony_ci u16 association_id:14, reserved:2; 39662306a36Sopenharmony_ci } __packed; 39762306a36Sopenharmony_ci u32 time_stamp[2]; 39862306a36Sopenharmony_ci u16 reason; 39962306a36Sopenharmony_ci u16 status; 40062306a36Sopenharmony_ci*/ 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_cistruct libipw_auth { 40362306a36Sopenharmony_ci struct libipw_hdr_3addr header; 40462306a36Sopenharmony_ci __le16 algorithm; 40562306a36Sopenharmony_ci __le16 transaction; 40662306a36Sopenharmony_ci __le16 status; 40762306a36Sopenharmony_ci /* challenge */ 40862306a36Sopenharmony_ci u8 variable[]; 40962306a36Sopenharmony_ci} __packed; 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_cistruct libipw_channel_switch { 41262306a36Sopenharmony_ci u8 id; 41362306a36Sopenharmony_ci u8 len; 41462306a36Sopenharmony_ci u8 mode; 41562306a36Sopenharmony_ci u8 channel; 41662306a36Sopenharmony_ci u8 count; 41762306a36Sopenharmony_ci} __packed; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_cistruct libipw_action { 42062306a36Sopenharmony_ci struct libipw_hdr_3addr header; 42162306a36Sopenharmony_ci u8 category; 42262306a36Sopenharmony_ci u8 action; 42362306a36Sopenharmony_ci union { 42462306a36Sopenharmony_ci struct libipw_action_exchange { 42562306a36Sopenharmony_ci u8 token; 42662306a36Sopenharmony_ci } exchange; 42762306a36Sopenharmony_ci struct libipw_channel_switch channel_switch; 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci } format; 43062306a36Sopenharmony_ci} __packed; 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_cistruct libipw_disassoc { 43362306a36Sopenharmony_ci struct libipw_hdr_3addr header; 43462306a36Sopenharmony_ci __le16 reason; 43562306a36Sopenharmony_ci} __packed; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci/* Alias deauth for disassoc */ 43862306a36Sopenharmony_ci#define libipw_deauth libipw_disassoc 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_cistruct libipw_probe_request { 44162306a36Sopenharmony_ci struct libipw_hdr_3addr header; 44262306a36Sopenharmony_ci /* SSID, supported rates */ 44362306a36Sopenharmony_ci u8 variable[]; 44462306a36Sopenharmony_ci} __packed; 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_cistruct libipw_probe_response { 44762306a36Sopenharmony_ci struct libipw_hdr_3addr header; 44862306a36Sopenharmony_ci __le32 time_stamp[2]; 44962306a36Sopenharmony_ci __le16 beacon_interval; 45062306a36Sopenharmony_ci __le16 capability; 45162306a36Sopenharmony_ci /* SSID, supported rates, FH params, DS params, 45262306a36Sopenharmony_ci * CF params, IBSS params, TIM (if beacon), RSN */ 45362306a36Sopenharmony_ci u8 variable[]; 45462306a36Sopenharmony_ci} __packed; 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci/* Alias beacon for probe_response */ 45762306a36Sopenharmony_ci#define libipw_beacon libipw_probe_response 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_cistruct libipw_assoc_request { 46062306a36Sopenharmony_ci struct libipw_hdr_3addr header; 46162306a36Sopenharmony_ci __le16 capability; 46262306a36Sopenharmony_ci __le16 listen_interval; 46362306a36Sopenharmony_ci /* SSID, supported rates, RSN */ 46462306a36Sopenharmony_ci u8 variable[]; 46562306a36Sopenharmony_ci} __packed; 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_cistruct libipw_reassoc_request { 46862306a36Sopenharmony_ci struct libipw_hdr_3addr header; 46962306a36Sopenharmony_ci __le16 capability; 47062306a36Sopenharmony_ci __le16 listen_interval; 47162306a36Sopenharmony_ci u8 current_ap[ETH_ALEN]; 47262306a36Sopenharmony_ci u8 variable[]; 47362306a36Sopenharmony_ci} __packed; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_cistruct libipw_assoc_response { 47662306a36Sopenharmony_ci struct libipw_hdr_3addr header; 47762306a36Sopenharmony_ci __le16 capability; 47862306a36Sopenharmony_ci __le16 status; 47962306a36Sopenharmony_ci __le16 aid; 48062306a36Sopenharmony_ci /* supported rates */ 48162306a36Sopenharmony_ci u8 variable[]; 48262306a36Sopenharmony_ci} __packed; 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_cistruct libipw_txb { 48562306a36Sopenharmony_ci u8 nr_frags; 48662306a36Sopenharmony_ci u8 encrypted; 48762306a36Sopenharmony_ci u8 rts_included; 48862306a36Sopenharmony_ci u8 reserved; 48962306a36Sopenharmony_ci u16 frag_size; 49062306a36Sopenharmony_ci u16 payload_size; 49162306a36Sopenharmony_ci struct sk_buff *fragments[]; 49262306a36Sopenharmony_ci}; 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci/* SWEEP TABLE ENTRIES NUMBER */ 49562306a36Sopenharmony_ci#define MAX_SWEEP_TAB_ENTRIES 42 49662306a36Sopenharmony_ci#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 49762306a36Sopenharmony_ci/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs 49862306a36Sopenharmony_ci * only use 8, and then use extended rates for the remaining supported 49962306a36Sopenharmony_ci * rates. Other APs, however, stick all of their supported rates on the 50062306a36Sopenharmony_ci * main rates information element... */ 50162306a36Sopenharmony_ci#define MAX_RATES_LENGTH ((u8)12) 50262306a36Sopenharmony_ci#define MAX_RATES_EX_LENGTH ((u8)16) 50362306a36Sopenharmony_ci#define MAX_NETWORK_COUNT 128 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci#define CRC_LENGTH 4U 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_ci#define MAX_WPA_IE_LEN 64 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_ci#define NETWORK_HAS_OFDM (1<<1) 51062306a36Sopenharmony_ci#define NETWORK_HAS_CCK (1<<2) 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ci/* QoS structure */ 51362306a36Sopenharmony_ci#define NETWORK_HAS_QOS_PARAMETERS (1<<3) 51462306a36Sopenharmony_ci#define NETWORK_HAS_QOS_INFORMATION (1<<4) 51562306a36Sopenharmony_ci#define NETWORK_HAS_QOS_MASK (NETWORK_HAS_QOS_PARAMETERS | \ 51662306a36Sopenharmony_ci NETWORK_HAS_QOS_INFORMATION) 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci/* 802.11h */ 51962306a36Sopenharmony_ci#define NETWORK_HAS_POWER_CONSTRAINT (1<<5) 52062306a36Sopenharmony_ci#define NETWORK_HAS_CSA (1<<6) 52162306a36Sopenharmony_ci#define NETWORK_HAS_QUIET (1<<7) 52262306a36Sopenharmony_ci#define NETWORK_HAS_IBSS_DFS (1<<8) 52362306a36Sopenharmony_ci#define NETWORK_HAS_TPC_REPORT (1<<9) 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci#define NETWORK_HAS_ERP_VALUE (1<<10) 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci#define QOS_QUEUE_NUM 4 52862306a36Sopenharmony_ci#define QOS_OUI_LEN 3 52962306a36Sopenharmony_ci#define QOS_OUI_TYPE 2 53062306a36Sopenharmony_ci#define QOS_ELEMENT_ID 221 53162306a36Sopenharmony_ci#define QOS_OUI_INFO_SUB_TYPE 0 53262306a36Sopenharmony_ci#define QOS_OUI_PARAM_SUB_TYPE 1 53362306a36Sopenharmony_ci#define QOS_VERSION_1 1 53462306a36Sopenharmony_ci#define QOS_AIFSN_MIN_VALUE 2 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_cistruct libipw_qos_information_element { 53762306a36Sopenharmony_ci u8 elementID; 53862306a36Sopenharmony_ci u8 length; 53962306a36Sopenharmony_ci u8 qui[QOS_OUI_LEN]; 54062306a36Sopenharmony_ci u8 qui_type; 54162306a36Sopenharmony_ci u8 qui_subtype; 54262306a36Sopenharmony_ci u8 version; 54362306a36Sopenharmony_ci u8 ac_info; 54462306a36Sopenharmony_ci} __packed; 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_cistruct libipw_qos_ac_parameter { 54762306a36Sopenharmony_ci u8 aci_aifsn; 54862306a36Sopenharmony_ci u8 ecw_min_max; 54962306a36Sopenharmony_ci __le16 tx_op_limit; 55062306a36Sopenharmony_ci} __packed; 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_cistruct libipw_qos_parameter_info { 55362306a36Sopenharmony_ci struct libipw_qos_information_element info_element; 55462306a36Sopenharmony_ci u8 reserved; 55562306a36Sopenharmony_ci struct libipw_qos_ac_parameter ac_params_record[QOS_QUEUE_NUM]; 55662306a36Sopenharmony_ci} __packed; 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_cistruct libipw_qos_parameters { 55962306a36Sopenharmony_ci __le16 cw_min[QOS_QUEUE_NUM]; 56062306a36Sopenharmony_ci __le16 cw_max[QOS_QUEUE_NUM]; 56162306a36Sopenharmony_ci u8 aifs[QOS_QUEUE_NUM]; 56262306a36Sopenharmony_ci u8 flag[QOS_QUEUE_NUM]; 56362306a36Sopenharmony_ci __le16 tx_op_limit[QOS_QUEUE_NUM]; 56462306a36Sopenharmony_ci} __packed; 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_cistruct libipw_qos_data { 56762306a36Sopenharmony_ci struct libipw_qos_parameters parameters; 56862306a36Sopenharmony_ci int active; 56962306a36Sopenharmony_ci int supported; 57062306a36Sopenharmony_ci u8 param_count; 57162306a36Sopenharmony_ci u8 old_param_count; 57262306a36Sopenharmony_ci}; 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_cistruct libipw_tim_parameters { 57562306a36Sopenharmony_ci u8 tim_count; 57662306a36Sopenharmony_ci u8 tim_period; 57762306a36Sopenharmony_ci} __packed; 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci/*******************************************************/ 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_cistruct libipw_tpc_report { 58262306a36Sopenharmony_ci u8 transmit_power; 58362306a36Sopenharmony_ci u8 link_margin; 58462306a36Sopenharmony_ci} __packed; 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_cistruct libipw_channel_map { 58762306a36Sopenharmony_ci u8 channel; 58862306a36Sopenharmony_ci u8 map; 58962306a36Sopenharmony_ci} __packed; 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_cistruct libipw_ibss_dfs { 59262306a36Sopenharmony_ci struct libipw_info_element ie; 59362306a36Sopenharmony_ci u8 owner[ETH_ALEN]; 59462306a36Sopenharmony_ci u8 recovery_interval; 59562306a36Sopenharmony_ci struct libipw_channel_map channel_map[]; 59662306a36Sopenharmony_ci}; 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_cistruct libipw_csa { 59962306a36Sopenharmony_ci u8 mode; 60062306a36Sopenharmony_ci u8 channel; 60162306a36Sopenharmony_ci u8 count; 60262306a36Sopenharmony_ci} __packed; 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_cistruct libipw_quiet { 60562306a36Sopenharmony_ci u8 count; 60662306a36Sopenharmony_ci u8 period; 60762306a36Sopenharmony_ci u8 duration; 60862306a36Sopenharmony_ci u8 offset; 60962306a36Sopenharmony_ci} __packed; 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_cistruct libipw_network { 61262306a36Sopenharmony_ci /* These entries are used to identify a unique network */ 61362306a36Sopenharmony_ci u8 bssid[ETH_ALEN]; 61462306a36Sopenharmony_ci u8 channel; 61562306a36Sopenharmony_ci /* Ensure null-terminated for any debug msgs */ 61662306a36Sopenharmony_ci u8 ssid[IW_ESSID_MAX_SIZE + 1]; 61762306a36Sopenharmony_ci u8 ssid_len; 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci struct libipw_qos_data qos_data; 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_ci /* These are network statistics */ 62262306a36Sopenharmony_ci struct libipw_rx_stats stats; 62362306a36Sopenharmony_ci u16 capability; 62462306a36Sopenharmony_ci u8 rates[MAX_RATES_LENGTH]; 62562306a36Sopenharmony_ci u8 rates_len; 62662306a36Sopenharmony_ci u8 rates_ex[MAX_RATES_EX_LENGTH]; 62762306a36Sopenharmony_ci u8 rates_ex_len; 62862306a36Sopenharmony_ci unsigned long last_scanned; 62962306a36Sopenharmony_ci u8 mode; 63062306a36Sopenharmony_ci u32 flags; 63162306a36Sopenharmony_ci u32 last_associate; 63262306a36Sopenharmony_ci u32 time_stamp[2]; 63362306a36Sopenharmony_ci u16 beacon_interval; 63462306a36Sopenharmony_ci u16 listen_interval; 63562306a36Sopenharmony_ci u16 atim_window; 63662306a36Sopenharmony_ci u8 erp_value; 63762306a36Sopenharmony_ci u8 wpa_ie[MAX_WPA_IE_LEN]; 63862306a36Sopenharmony_ci size_t wpa_ie_len; 63962306a36Sopenharmony_ci u8 rsn_ie[MAX_WPA_IE_LEN]; 64062306a36Sopenharmony_ci size_t rsn_ie_len; 64162306a36Sopenharmony_ci struct libipw_tim_parameters tim; 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_ci /* 802.11h info */ 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_ci /* Power Constraint - mandatory if spctrm mgmt required */ 64662306a36Sopenharmony_ci u8 power_constraint; 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_ci /* TPC Report - mandatory if spctrm mgmt required */ 64962306a36Sopenharmony_ci struct libipw_tpc_report tpc_report; 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci /* Channel Switch Announcement - optional if spctrm mgmt required */ 65262306a36Sopenharmony_ci struct libipw_csa csa; 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci /* Quiet - optional if spctrm mgmt required */ 65562306a36Sopenharmony_ci struct libipw_quiet quiet; 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_ci struct list_head list; 65862306a36Sopenharmony_ci}; 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_cienum libipw_state { 66162306a36Sopenharmony_ci LIBIPW_UNINITIALIZED = 0, 66262306a36Sopenharmony_ci LIBIPW_INITIALIZED, 66362306a36Sopenharmony_ci LIBIPW_ASSOCIATING, 66462306a36Sopenharmony_ci LIBIPW_ASSOCIATED, 66562306a36Sopenharmony_ci LIBIPW_AUTHENTICATING, 66662306a36Sopenharmony_ci LIBIPW_AUTHENTICATED, 66762306a36Sopenharmony_ci LIBIPW_SHUTDOWN 66862306a36Sopenharmony_ci}; 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci#define DEFAULT_MAX_SCAN_AGE (15 * HZ) 67162306a36Sopenharmony_ci#define DEFAULT_FTS 2346 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_ci#define CFG_LIBIPW_RESERVE_FCS (1<<0) 67462306a36Sopenharmony_ci#define CFG_LIBIPW_COMPUTE_FCS (1<<1) 67562306a36Sopenharmony_ci#define CFG_LIBIPW_RTS (1<<2) 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci#define LIBIPW_24GHZ_MIN_CHANNEL 1 67862306a36Sopenharmony_ci#define LIBIPW_24GHZ_MAX_CHANNEL 14 67962306a36Sopenharmony_ci#define LIBIPW_24GHZ_CHANNELS (LIBIPW_24GHZ_MAX_CHANNEL - \ 68062306a36Sopenharmony_ci LIBIPW_24GHZ_MIN_CHANNEL + 1) 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_ci#define LIBIPW_52GHZ_MIN_CHANNEL 34 68362306a36Sopenharmony_ci#define LIBIPW_52GHZ_MAX_CHANNEL 165 68462306a36Sopenharmony_ci#define LIBIPW_52GHZ_CHANNELS (LIBIPW_52GHZ_MAX_CHANNEL - \ 68562306a36Sopenharmony_ci LIBIPW_52GHZ_MIN_CHANNEL + 1) 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_cienum { 68862306a36Sopenharmony_ci LIBIPW_CH_PASSIVE_ONLY = (1 << 0), 68962306a36Sopenharmony_ci LIBIPW_CH_80211H_RULES = (1 << 1), 69062306a36Sopenharmony_ci LIBIPW_CH_B_ONLY = (1 << 2), 69162306a36Sopenharmony_ci LIBIPW_CH_NO_IBSS = (1 << 3), 69262306a36Sopenharmony_ci LIBIPW_CH_UNIFORM_SPREADING = (1 << 4), 69362306a36Sopenharmony_ci LIBIPW_CH_RADAR_DETECT = (1 << 5), 69462306a36Sopenharmony_ci LIBIPW_CH_INVALID = (1 << 6), 69562306a36Sopenharmony_ci}; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_cistruct libipw_channel { 69862306a36Sopenharmony_ci u32 freq; /* in MHz */ 69962306a36Sopenharmony_ci u8 channel; 70062306a36Sopenharmony_ci u8 flags; 70162306a36Sopenharmony_ci u8 max_power; /* in dBm */ 70262306a36Sopenharmony_ci}; 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_cistruct libipw_geo { 70562306a36Sopenharmony_ci u8 name[4]; 70662306a36Sopenharmony_ci u8 bg_channels; 70762306a36Sopenharmony_ci u8 a_channels; 70862306a36Sopenharmony_ci struct libipw_channel bg[LIBIPW_24GHZ_CHANNELS]; 70962306a36Sopenharmony_ci struct libipw_channel a[LIBIPW_52GHZ_CHANNELS]; 71062306a36Sopenharmony_ci}; 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_cistruct libipw_device { 71362306a36Sopenharmony_ci struct net_device *dev; 71462306a36Sopenharmony_ci struct wireless_dev wdev; 71562306a36Sopenharmony_ci struct libipw_security sec; 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_ci /* Bookkeeping structures */ 71862306a36Sopenharmony_ci struct libipw_stats ieee_stats; 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci struct libipw_geo geo; 72162306a36Sopenharmony_ci struct ieee80211_supported_band bg_band; 72262306a36Sopenharmony_ci struct ieee80211_supported_band a_band; 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_ci /* Probe / Beacon management */ 72562306a36Sopenharmony_ci struct list_head network_free_list; 72662306a36Sopenharmony_ci struct list_head network_list; 72762306a36Sopenharmony_ci struct libipw_network *networks[MAX_NETWORK_COUNT]; 72862306a36Sopenharmony_ci int scans; 72962306a36Sopenharmony_ci int scan_age; 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci int iw_mode; /* operating mode (IW_MODE_*) */ 73262306a36Sopenharmony_ci struct iw_spy_data spy_data; /* iwspy support */ 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci spinlock_t lock; 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_ci int tx_headroom; /* Set to size of any additional room needed at front 73762306a36Sopenharmony_ci * of allocated Tx SKBs */ 73862306a36Sopenharmony_ci u32 config; 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_ci /* WEP and other encryption related settings at the device level */ 74162306a36Sopenharmony_ci int open_wep; /* Set to 1 to allow unencrypted frames */ 74262306a36Sopenharmony_ci 74362306a36Sopenharmony_ci /* If the host performs {en,de}cryption, then set to 1 */ 74462306a36Sopenharmony_ci int host_encrypt; 74562306a36Sopenharmony_ci int host_encrypt_msdu; 74662306a36Sopenharmony_ci int host_decrypt; 74762306a36Sopenharmony_ci /* host performs multicast decryption */ 74862306a36Sopenharmony_ci int host_mc_decrypt; 74962306a36Sopenharmony_ci 75062306a36Sopenharmony_ci /* host should strip IV and ICV from protected frames */ 75162306a36Sopenharmony_ci /* meaningful only when hardware decryption is being used */ 75262306a36Sopenharmony_ci int host_strip_iv_icv; 75362306a36Sopenharmony_ci 75462306a36Sopenharmony_ci int host_open_frag; 75562306a36Sopenharmony_ci int ieee802_1x; /* is IEEE 802.1X used */ 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci /* WPA data */ 75862306a36Sopenharmony_ci int wpa_enabled; 75962306a36Sopenharmony_ci int drop_unencrypted; 76062306a36Sopenharmony_ci int privacy_invoked; 76162306a36Sopenharmony_ci size_t wpa_ie_len; 76262306a36Sopenharmony_ci u8 *wpa_ie; 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci struct lib80211_crypt_info crypt_info; 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_ci int bcrx_sta_key; /* use individual keys to override default keys even 76762306a36Sopenharmony_ci * with RX of broad/multicast frames */ 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_ci /* Fragmentation structures */ 77062306a36Sopenharmony_ci struct libipw_frag_entry frag_cache[LIBIPW_FRAG_CACHE_LEN]; 77162306a36Sopenharmony_ci unsigned int frag_next_idx; 77262306a36Sopenharmony_ci u16 fts; /* Fragmentation Threshold */ 77362306a36Sopenharmony_ci u16 rts; /* RTS threshold */ 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci /* Association info */ 77662306a36Sopenharmony_ci u8 bssid[ETH_ALEN]; 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ci enum libipw_state state; 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_ci int mode; /* A, B, G */ 78162306a36Sopenharmony_ci int modulation; /* CCK, OFDM */ 78262306a36Sopenharmony_ci int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ 78362306a36Sopenharmony_ci int abg_true; /* ABG flag */ 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_ci int perfect_rssi; 78662306a36Sopenharmony_ci int worst_rssi; 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci u16 prev_seq_ctl; /* used to drop duplicate frames */ 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_ci /* Callback functions */ 79162306a36Sopenharmony_ci void (*set_security) (struct net_device * dev, 79262306a36Sopenharmony_ci struct libipw_security * sec); 79362306a36Sopenharmony_ci netdev_tx_t (*hard_start_xmit) (struct libipw_txb * txb, 79462306a36Sopenharmony_ci struct net_device * dev, int pri); 79562306a36Sopenharmony_ci int (*is_queue_full) (struct net_device * dev, int pri); 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_ci int (*handle_management) (struct net_device * dev, 79862306a36Sopenharmony_ci struct libipw_network * network, u16 type); 79962306a36Sopenharmony_ci int (*is_qos_active) (struct net_device *dev, struct sk_buff *skb); 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci /* Typical STA methods */ 80262306a36Sopenharmony_ci int (*handle_auth) (struct net_device * dev, 80362306a36Sopenharmony_ci struct libipw_auth * auth); 80462306a36Sopenharmony_ci int (*handle_deauth) (struct net_device * dev, 80562306a36Sopenharmony_ci struct libipw_deauth * auth); 80662306a36Sopenharmony_ci int (*handle_action) (struct net_device * dev, 80762306a36Sopenharmony_ci struct libipw_action * action, 80862306a36Sopenharmony_ci struct libipw_rx_stats * stats); 80962306a36Sopenharmony_ci int (*handle_disassoc) (struct net_device * dev, 81062306a36Sopenharmony_ci struct libipw_disassoc * assoc); 81162306a36Sopenharmony_ci int (*handle_beacon) (struct net_device * dev, 81262306a36Sopenharmony_ci struct libipw_beacon * beacon, 81362306a36Sopenharmony_ci struct libipw_network * network); 81462306a36Sopenharmony_ci int (*handle_probe_response) (struct net_device * dev, 81562306a36Sopenharmony_ci struct libipw_probe_response * resp, 81662306a36Sopenharmony_ci struct libipw_network * network); 81762306a36Sopenharmony_ci int (*handle_probe_request) (struct net_device * dev, 81862306a36Sopenharmony_ci struct libipw_probe_request * req, 81962306a36Sopenharmony_ci struct libipw_rx_stats * stats); 82062306a36Sopenharmony_ci int (*handle_assoc_response) (struct net_device * dev, 82162306a36Sopenharmony_ci struct libipw_assoc_response * resp, 82262306a36Sopenharmony_ci struct libipw_network * network); 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_ci /* Typical AP methods */ 82562306a36Sopenharmony_ci int (*handle_assoc_request) (struct net_device * dev); 82662306a36Sopenharmony_ci int (*handle_reassoc_request) (struct net_device * dev, 82762306a36Sopenharmony_ci struct libipw_reassoc_request * req); 82862306a36Sopenharmony_ci 82962306a36Sopenharmony_ci /* This must be the last item so that it points to the data 83062306a36Sopenharmony_ci * allocated beyond this structure by alloc_libipw */ 83162306a36Sopenharmony_ci u8 priv[]; 83262306a36Sopenharmony_ci}; 83362306a36Sopenharmony_ci 83462306a36Sopenharmony_ci#define IEEE_A (1<<0) 83562306a36Sopenharmony_ci#define IEEE_B (1<<1) 83662306a36Sopenharmony_ci#define IEEE_G (1<<2) 83762306a36Sopenharmony_ci#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G) 83862306a36Sopenharmony_ci 83962306a36Sopenharmony_cistatic inline void *libipw_priv(struct net_device *dev) 84062306a36Sopenharmony_ci{ 84162306a36Sopenharmony_ci return ((struct libipw_device *)netdev_priv(dev))->priv; 84262306a36Sopenharmony_ci} 84362306a36Sopenharmony_ci 84462306a36Sopenharmony_cistatic inline int libipw_is_valid_mode(struct libipw_device *ieee, 84562306a36Sopenharmony_ci int mode) 84662306a36Sopenharmony_ci{ 84762306a36Sopenharmony_ci /* 84862306a36Sopenharmony_ci * It is possible for both access points and our device to support 84962306a36Sopenharmony_ci * combinations of modes, so as long as there is one valid combination 85062306a36Sopenharmony_ci * of ap/device supported modes, then return success 85162306a36Sopenharmony_ci * 85262306a36Sopenharmony_ci */ 85362306a36Sopenharmony_ci if ((mode & IEEE_A) && 85462306a36Sopenharmony_ci (ieee->modulation & LIBIPW_OFDM_MODULATION) && 85562306a36Sopenharmony_ci (ieee->freq_band & LIBIPW_52GHZ_BAND)) 85662306a36Sopenharmony_ci return 1; 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_ci if ((mode & IEEE_G) && 85962306a36Sopenharmony_ci (ieee->modulation & LIBIPW_OFDM_MODULATION) && 86062306a36Sopenharmony_ci (ieee->freq_band & LIBIPW_24GHZ_BAND)) 86162306a36Sopenharmony_ci return 1; 86262306a36Sopenharmony_ci 86362306a36Sopenharmony_ci if ((mode & IEEE_B) && 86462306a36Sopenharmony_ci (ieee->modulation & LIBIPW_CCK_MODULATION) && 86562306a36Sopenharmony_ci (ieee->freq_band & LIBIPW_24GHZ_BAND)) 86662306a36Sopenharmony_ci return 1; 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_ci return 0; 86962306a36Sopenharmony_ci} 87062306a36Sopenharmony_ci 87162306a36Sopenharmony_cistatic inline int libipw_get_hdrlen(u16 fc) 87262306a36Sopenharmony_ci{ 87362306a36Sopenharmony_ci int hdrlen = LIBIPW_3ADDR_LEN; 87462306a36Sopenharmony_ci u16 stype = WLAN_FC_GET_STYPE(fc); 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci switch (WLAN_FC_GET_TYPE(fc)) { 87762306a36Sopenharmony_ci case IEEE80211_FTYPE_DATA: 87862306a36Sopenharmony_ci if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS)) 87962306a36Sopenharmony_ci hdrlen = LIBIPW_4ADDR_LEN; 88062306a36Sopenharmony_ci if (stype & IEEE80211_STYPE_QOS_DATA) 88162306a36Sopenharmony_ci hdrlen += 2; 88262306a36Sopenharmony_ci break; 88362306a36Sopenharmony_ci case IEEE80211_FTYPE_CTL: 88462306a36Sopenharmony_ci switch (WLAN_FC_GET_STYPE(fc)) { 88562306a36Sopenharmony_ci case IEEE80211_STYPE_CTS: 88662306a36Sopenharmony_ci case IEEE80211_STYPE_ACK: 88762306a36Sopenharmony_ci hdrlen = LIBIPW_1ADDR_LEN; 88862306a36Sopenharmony_ci break; 88962306a36Sopenharmony_ci default: 89062306a36Sopenharmony_ci hdrlen = LIBIPW_2ADDR_LEN; 89162306a36Sopenharmony_ci break; 89262306a36Sopenharmony_ci } 89362306a36Sopenharmony_ci break; 89462306a36Sopenharmony_ci } 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_ci return hdrlen; 89762306a36Sopenharmony_ci} 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_cistatic inline u8 *libipw_get_payload(struct ieee80211_hdr *hdr) 90062306a36Sopenharmony_ci{ 90162306a36Sopenharmony_ci switch (libipw_get_hdrlen(le16_to_cpu(hdr->frame_control))) { 90262306a36Sopenharmony_ci case LIBIPW_1ADDR_LEN: 90362306a36Sopenharmony_ci return ((struct libipw_hdr_1addr *)hdr)->payload; 90462306a36Sopenharmony_ci case LIBIPW_2ADDR_LEN: 90562306a36Sopenharmony_ci return ((struct libipw_hdr_2addr *)hdr)->payload; 90662306a36Sopenharmony_ci case LIBIPW_3ADDR_LEN: 90762306a36Sopenharmony_ci return ((struct libipw_hdr_3addr *)hdr)->payload; 90862306a36Sopenharmony_ci case LIBIPW_4ADDR_LEN: 90962306a36Sopenharmony_ci return ((struct libipw_hdr_4addr *)hdr)->payload; 91062306a36Sopenharmony_ci } 91162306a36Sopenharmony_ci return NULL; 91262306a36Sopenharmony_ci} 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_cistatic inline int libipw_is_ofdm_rate(u8 rate) 91562306a36Sopenharmony_ci{ 91662306a36Sopenharmony_ci switch (rate & ~LIBIPW_BASIC_RATE_MASK) { 91762306a36Sopenharmony_ci case LIBIPW_OFDM_RATE_6MB: 91862306a36Sopenharmony_ci case LIBIPW_OFDM_RATE_9MB: 91962306a36Sopenharmony_ci case LIBIPW_OFDM_RATE_12MB: 92062306a36Sopenharmony_ci case LIBIPW_OFDM_RATE_18MB: 92162306a36Sopenharmony_ci case LIBIPW_OFDM_RATE_24MB: 92262306a36Sopenharmony_ci case LIBIPW_OFDM_RATE_36MB: 92362306a36Sopenharmony_ci case LIBIPW_OFDM_RATE_48MB: 92462306a36Sopenharmony_ci case LIBIPW_OFDM_RATE_54MB: 92562306a36Sopenharmony_ci return 1; 92662306a36Sopenharmony_ci } 92762306a36Sopenharmony_ci return 0; 92862306a36Sopenharmony_ci} 92962306a36Sopenharmony_ci 93062306a36Sopenharmony_cistatic inline int libipw_is_cck_rate(u8 rate) 93162306a36Sopenharmony_ci{ 93262306a36Sopenharmony_ci switch (rate & ~LIBIPW_BASIC_RATE_MASK) { 93362306a36Sopenharmony_ci case LIBIPW_CCK_RATE_1MB: 93462306a36Sopenharmony_ci case LIBIPW_CCK_RATE_2MB: 93562306a36Sopenharmony_ci case LIBIPW_CCK_RATE_5MB: 93662306a36Sopenharmony_ci case LIBIPW_CCK_RATE_11MB: 93762306a36Sopenharmony_ci return 1; 93862306a36Sopenharmony_ci } 93962306a36Sopenharmony_ci return 0; 94062306a36Sopenharmony_ci} 94162306a36Sopenharmony_ci 94262306a36Sopenharmony_ci/* libipw.c */ 94362306a36Sopenharmony_civoid free_libipw(struct net_device *dev, int monitor); 94462306a36Sopenharmony_cistruct net_device *alloc_libipw(int sizeof_priv, int monitor); 94562306a36Sopenharmony_ci 94662306a36Sopenharmony_civoid libipw_networks_age(struct libipw_device *ieee, unsigned long age_secs); 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ciint libipw_set_encryption(struct libipw_device *ieee); 94962306a36Sopenharmony_ci 95062306a36Sopenharmony_ci/* libipw_tx.c */ 95162306a36Sopenharmony_cinetdev_tx_t libipw_xmit(struct sk_buff *skb, struct net_device *dev); 95262306a36Sopenharmony_civoid libipw_txb_free(struct libipw_txb *); 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_ci/* libipw_rx.c */ 95562306a36Sopenharmony_civoid libipw_rx_any(struct libipw_device *ieee, struct sk_buff *skb, 95662306a36Sopenharmony_ci struct libipw_rx_stats *stats); 95762306a36Sopenharmony_ciint libipw_rx(struct libipw_device *ieee, struct sk_buff *skb, 95862306a36Sopenharmony_ci struct libipw_rx_stats *rx_stats); 95962306a36Sopenharmony_ci/* make sure to set stats->len */ 96062306a36Sopenharmony_civoid libipw_rx_mgt(struct libipw_device *ieee, struct libipw_hdr_4addr *header, 96162306a36Sopenharmony_ci struct libipw_rx_stats *stats); 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci/* libipw_geo.c */ 96462306a36Sopenharmony_ciconst struct libipw_geo *libipw_get_geo(struct libipw_device *ieee); 96562306a36Sopenharmony_civoid libipw_set_geo(struct libipw_device *ieee, const struct libipw_geo *geo); 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_ciint libipw_is_valid_channel(struct libipw_device *ieee, u8 channel); 96862306a36Sopenharmony_ciint libipw_channel_to_index(struct libipw_device *ieee, u8 channel); 96962306a36Sopenharmony_ciu8 libipw_freq_to_channel(struct libipw_device *ieee, u32 freq); 97062306a36Sopenharmony_ciu8 libipw_get_channel_flags(struct libipw_device *ieee, u8 channel); 97162306a36Sopenharmony_ciconst struct libipw_channel *libipw_get_channel(struct libipw_device *ieee, 97262306a36Sopenharmony_ci u8 channel); 97362306a36Sopenharmony_ciu32 libipw_channel_to_freq(struct libipw_device *ieee, u8 channel); 97462306a36Sopenharmony_ci 97562306a36Sopenharmony_ci/* libipw_wx.c */ 97662306a36Sopenharmony_ciint libipw_wx_get_scan(struct libipw_device *ieee, struct iw_request_info *info, 97762306a36Sopenharmony_ci union iwreq_data *wrqu, char *key); 97862306a36Sopenharmony_ciint libipw_wx_set_encode(struct libipw_device *ieee, 97962306a36Sopenharmony_ci struct iw_request_info *info, union iwreq_data *wrqu, 98062306a36Sopenharmony_ci char *key); 98162306a36Sopenharmony_ciint libipw_wx_get_encode(struct libipw_device *ieee, 98262306a36Sopenharmony_ci struct iw_request_info *info, union iwreq_data *wrqu, 98362306a36Sopenharmony_ci char *key); 98462306a36Sopenharmony_ciint libipw_wx_set_encodeext(struct libipw_device *ieee, 98562306a36Sopenharmony_ci struct iw_request_info *info, 98662306a36Sopenharmony_ci union iwreq_data *wrqu, char *extra); 98762306a36Sopenharmony_ciint libipw_wx_get_encodeext(struct libipw_device *ieee, 98862306a36Sopenharmony_ci struct iw_request_info *info, 98962306a36Sopenharmony_ci union iwreq_data *wrqu, char *extra); 99062306a36Sopenharmony_ci 99162306a36Sopenharmony_cistatic inline void libipw_increment_scans(struct libipw_device *ieee) 99262306a36Sopenharmony_ci{ 99362306a36Sopenharmony_ci ieee->scans++; 99462306a36Sopenharmony_ci} 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_cistatic inline int libipw_get_scans(struct libipw_device *ieee) 99762306a36Sopenharmony_ci{ 99862306a36Sopenharmony_ci return ieee->scans; 99962306a36Sopenharmony_ci} 100062306a36Sopenharmony_ci 100162306a36Sopenharmony_ci#endif /* LIBIPW_H */ 1002