/* rtwlan.h * * This file is a rtnet adaption from ieee80211/ieee80211.h used by the * rt2x00-2.0.0-b3 sourceforge project * * Merged with mainline ieee80211.h in Aug 2004. Original ieee802_11 * remains copyright by the original authors * * Portions of the merged code are based on Host AP (software wireless * LAN access point) driver for Intersil Prism2/2.5/3. * * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen * * Copyright (c) 2002-2003, Jouni Malinen * * Adaption to a generic IEEE 802.11 stack by James Ketrenos * * Copyright (c) 2004-2005, Intel Corporation * * Adaption to rtnet * Copyright (c) 2006, Daniel Gregorek * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef RTWLAN_H #define RTWLAN_H #include /* ETH_ALEN */ #include /* ARRAY_SIZE */ #include #include #define IEEE80211_1ADDR_LEN 10 #define IEEE80211_2ADDR_LEN 16 #define IEEE80211_3ADDR_LEN 24 #define IEEE80211_4ADDR_LEN 30 #define IEEE80211_FCS_LEN 4 #define IEEE80211_HLEN (IEEE80211_4ADDR_LEN) #define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) #define MIN_FRAG_THRESHOLD 256U #define MAX_FRAG_THRESHOLD 2346U /* Frame control field constants */ #define IEEE80211_FCTL_VERS 0x0003 #define IEEE80211_FCTL_FTYPE 0x000c #define IEEE80211_FCTL_STYPE 0x00f0 #define IEEE80211_FCTL_TODS 0x0100 #define IEEE80211_FCTL_FROMDS 0x0200 #define IEEE80211_FCTL_MOREFRAGS 0x0400 #define IEEE80211_FCTL_RETRY 0x0800 #define IEEE80211_FCTL_PM 0x1000 #define IEEE80211_FCTL_MOREDATA 0x2000 #define IEEE80211_FCTL_PROTECTED 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_ACTION 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 #define RTWLAN_SCTL_SEQ 0xFFF0 #define WLAN_FC_GET_VERS(fc) ((fc)&IEEE80211_FCTL_VERS) #define WLAN_FC_GET_TYPE(fc) ((fc)&IEEE80211_FCTL_FTYPE) #define WLAN_FC_GET_STYPE(fc) ((fc)&IEEE80211_FCTL_STYPE) #define IEEE80211_DSSS_RATE_1MB 0x02 #define IEEE80211_DSSS_RATE_2MB 0x04 #define IEEE80211_DSSS_RATE_5MB 0x0B #define IEEE80211_DSSS_RATE_11MB 0x16 #define IEEE80211_OFDM_RATE_6MB 0x0C #define IEEE80211_OFDM_RATE_9MB 0x12 #define IEEE80211_OFDM_RATE_12MB 0x18 #define IEEE80211_OFDM_RATE_18MB 0x24 #define IEEE80211_OFDM_RATE_24MB 0x30 #define IEEE80211_OFDM_RATE_36MB 0x48 #define IEEE80211_OFDM_RATE_48MB 0x60 #define IEEE80211_OFDM_RATE_54MB 0x6C #define IEEE80211_BASIC_RATE_MASK 0x80 #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] #ifdef CONFIG_RTWLAN_DEBUG #define RTWLAN_DEBUG_PRINTK(__message...) \ do { \ rtdm_printk(__message); \ } while (0) #define RTWLAN_DEBUG(__message, __args...) \ RTWLAN_DEBUG_PRINTK(KERN_DEBUG "rtwlan->%s: Debug - " __message, \ __FUNCTION__, ##__args); #else #define RTWLAN_DEBUG(__message...) \ do { \ } while (0) #endif struct rtwlan_stats { unsigned long rx_packets; /* total packets received */ unsigned long tx_packets; /* total packets transmitted */ unsigned long tx_retry; /* total packets transmitted with retry */ }; struct rtwlan_device { struct rtwlan_stats stats; struct rtskb_pool skb_pool; int mode; int (*hard_start_xmit)(struct rtskb *rtskb, struct rtnet_device *rtnet_dev); /* This must be the last item */ u8 priv[0]; }; /* Minimal header; can be used for passing 802.11 frames with sufficient * information to determine what type of underlying data type is actually * stored in the data. */ struct ieee80211_hdr { u16 frame_ctl; u16 duration_id; u8 payload[0]; } __attribute__((packed)); struct ieee80211_hdr_3addr { u16 frame_ctl; u16 duration_id; u8 addr1[ETH_ALEN]; u8 addr2[ETH_ALEN]; u8 addr3[ETH_ALEN]; u16 seq_ctl; u8 payload[0]; } __attribute__((packed)); static inline int ieee80211_get_hdrlen(u16 fc) { int hdrlen = IEEE80211_3ADDR_LEN; u16 stype = WLAN_FC_GET_STYPE(fc); switch (WLAN_FC_GET_TYPE(fc)) { case IEEE80211_FTYPE_DATA: if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS)) hdrlen = IEEE80211_4ADDR_LEN; if (stype & IEEE80211_STYPE_QOS_DATA) hdrlen += 2; break; case IEEE80211_FTYPE_CTL: switch (WLAN_FC_GET_STYPE(fc)) { case IEEE80211_STYPE_CTS: case IEEE80211_STYPE_ACK: hdrlen = IEEE80211_1ADDR_LEN; break; default: hdrlen = IEEE80211_2ADDR_LEN; break; } break; } return hdrlen; } static inline int ieee80211_is_ofdm_rate(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_OFDM_RATE_6MB: case IEEE80211_OFDM_RATE_9MB: case IEEE80211_OFDM_RATE_12MB: case IEEE80211_OFDM_RATE_18MB: case IEEE80211_OFDM_RATE_24MB: case IEEE80211_OFDM_RATE_36MB: case IEEE80211_OFDM_RATE_48MB: case IEEE80211_OFDM_RATE_54MB: return 1; } return 0; } static inline int ieee80211_is_dsss_rate(u8 rate) { switch (rate & ~IEEE80211_BASIC_RATE_MASK) { case IEEE80211_DSSS_RATE_1MB: case IEEE80211_DSSS_RATE_2MB: case IEEE80211_DSSS_RATE_5MB: case IEEE80211_DSSS_RATE_11MB: return 1; } return 0; } static inline void *rtwlan_priv(struct rtwlan_device *rtwlan_dev) { return (void *)rtwlan_dev + sizeof(struct rtwlan_device); } struct rtnet_device *rtwlan_alloc_dev(unsigned sizeof_priv, unsigned dev_pool_size); int rtwlan_rx(struct rtskb *rtskb, struct rtnet_device *rtnet_dev); int rtwlan_tx(struct rtskb *rtskb, struct rtnet_device *rtnet_dev); #ifdef CONFIG_XENO_DRIVERS_NET_RTWLAN int __init rtwlan_init(void); void rtwlan_exit(void); #else /* !CONFIG_XENO_DRIVERS_NET_RTWLAN */ #define rtwlan_init() 0 #define rtwlan_exit() #endif /* CONFIG_XENO_DRIVERS_NET_RTWLAN */ #endif