| /*********************************************************************** |
| ** Copyright (C) 2003 ACX100 Open Source Project |
| ** |
| ** The contents of this file are subject to the Mozilla Public |
| ** License Version 1.1 (the "License"); you may not use this file |
| ** except in compliance with the License. You may obtain a copy of |
| ** the License at http://www.mozilla.org/MPL/ |
| ** |
| ** Software distributed under the License is distributed on an "AS |
| ** IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or |
| ** implied. See the License for the specific language governing |
| ** rights and limitations under the License. |
| ** |
| ** Alternatively, the contents of this file may be used under the |
| ** terms of the GNU Public License version 2 (the "GPL"), in which |
| ** case the provisions of the GPL are applicable instead of the |
| ** above. If you wish to allow the use of your version of this file |
| ** only under the terms of the GPL and not to allow others to use |
| ** your version of this file under the MPL, indicate your decision |
| ** by deleting the provisions above and replace them with the notice |
| ** and other provisions required by the GPL. If you do not delete |
| ** the provisions above, a recipient may use your version of this |
| ** file under either the MPL or the GPL. |
| ** --------------------------------------------------------------------- |
| ** Inquiries regarding the ACX100 Open Source Project can be |
| ** made directly to: |
| ** |
| ** acx100-users@lists.sf.net |
| ** http://acx100.sf.net |
| ** --------------------------------------------------------------------- |
| */ |
| |
| /*********************************************************************** |
| ** This code is based on elements which are |
| ** Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. |
| ** info@linux-wlan.com |
| ** http://www.linux-wlan.com |
| */ |
| |
| /* mini-doc |
| |
| Here are all 11b/11g/11a rates and modulations: |
| |
| 11b 11g 11a |
| --- --- --- |
| 1 |B |B | |
| 2 |Q |Q | |
| 5.5|Cp |C p| |
| 6 | |Od |O |
| 9 | |od |o |
| 11 |Cp |C p| |
| 12 | |Od |O |
| 18 | |od |o |
| 22 | | p| |
| 24 | |Od |O |
| 33 | | p| |
| 36 | |od |o |
| 48 | |od |o |
| 54 | |od |o |
| |
| Mandatory: |
| B - DBPSK (Differential Binary Phase Shift Keying) |
| Q - DQPSK (Differential Quaternary Phase Shift Keying) |
| C - CCK (Complementary Code Keying, a form of DSSS |
| (Direct Sequence Spread Spectrum) modulation) |
| O - OFDM (Orthogonal Frequency Division Multiplexing) |
| Optional: |
| o - OFDM |
| d - CCK-OFDM (also known as DSSS-OFDM) |
| p - PBCC (Packet Binary Convolutional Coding) |
| |
| The term CCK-OFDM may be used interchangeably with DSSS-OFDM |
| (the IEEE 802.11g-2003 standard uses the latter terminology). |
| In the CCK-OFDM, the PLCP header of the frame uses the CCK form of DSSS, |
| while the PLCP payload (the MAC frame) is modulated using OFDM. |
| |
| Basically, you must use CCK-OFDM if you have mixed 11b/11g environment, |
| or else (pure OFDM) 11b equipment may not realize that AP |
| is sending a packet and start sending its own one. |
| Sadly, looks like acx111 does not support CCK-OFDM, only pure OFDM. |
| |
| Re PBCC: avoid using it. It makes sense only if you have |
| TI "11b+" hardware. You _must_ use PBCC in order to reach 22Mbps on it. |
| |
| Preambles: |
| |
| Long preamble (at 1Mbit rate, takes 144 us): |
| 16 bytes ones |
| 2 bytes 0xF3A0 (lsb sent first) |
| PLCP header follows (at 1Mbit also): |
| 1 byte Signal: speed, in 0.1Mbit units, except for: |
| 33Mbit: 33 (instead of 330 - doesn't fit in octet) |
| all CCK-OFDM rates: 30 |
| 1 byte Service |
| 0,1,4: reserved |
| 2: 1=locked clock |
| 3: 1=PBCC |
| 5: Length Extension (PBCC 22,33Mbit (11g only)) <- |
| 6: Length Extension (PBCC 22,33Mbit (11g only)) <- BLACK MAGIC HERE |
| 7: Length Extension <- |
| 2 bytes Length (time needed to tx this frame) |
| a) 5.5 Mbit/s CCK |
| Length = octets*8/5.5, rounded up to integer |
| b) 11 Mbit/s CCK |
| Length = octets*8/11, rounded up to integer |
| Service bit 7: |
| 0 = rounding took less than 8/11 |
| 1 = rounding took more than or equal to 8/11 |
| c) 5.5 Mbit/s PBCC |
| Length = (octets+1)*8/5.5, rounded up to integer |
| d) 11 Mbit/s PBCC |
| Length = (octets+1)*8/11, rounded up to integer |
| Service bit 7: |
| 0 = rounding took less than 8/11 |
| 1 = rounding took more than or equal to 8/11 |
| e) 22 Mbit/s PBCC |
| Length = (octets+1)*8/22, rounded up to integer |
| Service bits 6,7: |
| 00 = rounding took less than 8/22ths |
| 01 = rounding took 8/22...15/22ths |
| 10 = rounding took 16/22ths or more. |
| f) 33 Mbit/s PBCC |
| Length = (octets+1)*8/33, rounded up to integer |
| Service bits 5,6,7: |
| 000 rounding took less than 8/33 |
| 001 rounding took 8/33...15/33 |
| 010 rounding took 16/33...23/33 |
| 011 rounding took 24/33...31/33 |
| 100 rounding took 32/33 or more |
| 2 bytes CRC |
| |
| PSDU follows (up to 2346 bytes at selected rate) |
| |
| While Signal value alone is not enough to determine rate and modulation, |
| Signal+Service is always sufficient. |
| |
| Short preamble (at 1Mbit rate, takes 72 us): |
| 7 bytes zeroes |
| 2 bytes 0x05CF (lsb sent first) |
| PLCP header follows *at 2Mbit/s*. Format is the same as in long preamble. |
| PSDU follows (up to 2346 bytes at selected rate) |
| |
| OFDM preamble is completely different, uses OFDM |
| modulation from the start and thus easily identifiable. |
| Not shown here. |
| */ |
| |
| |
| /*********************************************************************** |
| */ |
| #define WLAN_PACKED __attribute__ ((packed)) |
| |
| #ifdef __LITTLE_ENDIAN |
| #define IEEE16(a,n) a = n, a##i = n, |
| #else |
| #ifdef __BIG_ENDIAN |
| /* shifts would produce gcc warnings. Oh well... */ |
| #define IEEE16(a,n) a = n, a##i = ((n&0xff)*256 + ((n&0xff00)/256)), |
| #else |
| #error give me endianness or give me death |
| #endif |
| #endif |
| |
| /*********************************************************************** |
| ** Constants |
| */ |
| |
| #define WLAN_HDR_A3_LEN 24 |
| #define WLAN_HDR_A4_LEN 30 |
| /* IV structure: |
| ** 3 bytes: Initialization Vector (24 bits) |
| ** 1 byte: 0..5: padding, must be 0; 6..7: key selector (0-3) |
| */ |
| #define WLAN_WEP_IV_LEN 4 |
| /* 802.11 says 2312 but looks like 2312 is a max size of _WEPed data_ */ |
| #define WLAN_DATA_MAXLEN 2304 |
| #define WLAN_WEP_ICV_LEN 4 |
| #define WLAN_FCS_LEN 4 |
| #define WLAN_A3FR_MAXLEN (WLAN_HDR_A3_LEN + WLAN_DATA_MAXLEN) |
| #define WLAN_A4FR_MAXLEN (WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN) |
| #define WLAN_A3FR_MAXLEN_FCS (WLAN_HDR_A3_LEN + WLAN_DATA_MAXLEN + 4) |
| #define WLAN_A4FR_MAXLEN_FCS (WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN + 4) |
| #define WLAN_A3FR_MAXLEN_WEP (WLAN_A3FR_MAXLEN + 8) |
| #define WLAN_A4FR_MAXLEN_WEP (WLAN_A4FR_MAXLEN + 8) |
| #define WLAN_A3FR_MAXLEN_WEP_FCS (WLAN_A3FR_MAXLEN_FCS + 8) |
| #define WLAN_A4FR_MAXLEN_WEP_FCS (WLAN_A4FR_MAXLEN_FCS + 8) |
| |
| #define WLAN_BSS_TS_LEN 8 |
| #define WLAN_SSID_MAXLEN 32 |
| #define WLAN_BEACON_FR_MAXLEN (WLAN_HDR_A3_LEN + 334) |
| #define WLAN_ATIM_FR_MAXLEN (WLAN_HDR_A3_LEN + 0) |
| #define WLAN_DISASSOC_FR_MAXLEN (WLAN_HDR_A3_LEN + 2) |
| #define WLAN_ASSOCREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 48) |
| #define WLAN_ASSOCRESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 16) |
| #define WLAN_REASSOCREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 54) |
| #define WLAN_REASSOCRESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 16) |
| #define WLAN_PROBEREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 44) |
| #define WLAN_PROBERESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 78) |
| #define WLAN_AUTHEN_FR_MAXLEN (WLAN_HDR_A3_LEN + 261) |
| #define WLAN_DEAUTHEN_FR_MAXLEN (WLAN_HDR_A3_LEN + 2) |
| #define WLAN_CHALLENGE_IE_LEN 130 |
| #define WLAN_CHALLENGE_LEN 128 |
| #define WLAN_WEP_MAXKEYLEN 13 |
| #define WLAN_WEP_NKEYS 4 |
| |
| /*--- Frame Control Field -------------------------------------*/ |
| /* Frame Types */ |
| #define WLAN_FTYPE_MGMT 0x00 |
| #define WLAN_FTYPE_CTL 0x01 |
| #define WLAN_FTYPE_DATA 0x02 |
| |
| /* Frame subtypes */ |
| /* Management */ |
| #define WLAN_FSTYPE_ASSOCREQ 0x00 |
| #define WLAN_FSTYPE_ASSOCRESP 0x01 |
| #define WLAN_FSTYPE_REASSOCREQ 0x02 |
| #define WLAN_FSTYPE_REASSOCRESP 0x03 |
| #define WLAN_FSTYPE_PROBEREQ 0x04 |
| #define WLAN_FSTYPE_PROBERESP 0x05 |
| #define WLAN_FSTYPE_BEACON 0x08 |
| #define WLAN_FSTYPE_ATIM 0x09 |
| #define WLAN_FSTYPE_DISASSOC 0x0a |
| #define WLAN_FSTYPE_AUTHEN 0x0b |
| #define WLAN_FSTYPE_DEAUTHEN 0x0c |
| |
| /* Control */ |
| #define WLAN_FSTYPE_PSPOLL 0x0a |
| #define WLAN_FSTYPE_RTS 0x0b |
| #define WLAN_FSTYPE_CTS 0x0c |
| #define WLAN_FSTYPE_ACK 0x0d |
| #define WLAN_FSTYPE_CFEND 0x0e |
| #define WLAN_FSTYPE_CFENDCFACK 0x0f |
| |
| /* Data */ |
| #define WLAN_FSTYPE_DATAONLY 0x00 |
| #define WLAN_FSTYPE_DATA_CFACK 0x01 |
| #define WLAN_FSTYPE_DATA_CFPOLL 0x02 |
| #define WLAN_FSTYPE_DATA_CFACK_CFPOLL 0x03 |
| #define WLAN_FSTYPE_NULL 0x04 |
| #define WLAN_FSTYPE_CFACK 0x05 |
| #define WLAN_FSTYPE_CFPOLL 0x06 |
| #define WLAN_FSTYPE_CFACK_CFPOLL 0x07 |
| |
| /*--- FC Constants v. 2.0 ------------------------------------*/ |
| /* Each constant is defined twice: WF_CONST is in host */ |
| /* byteorder, WF_CONSTi is in ieee byteorder. */ |
| /* Usage: */ |
| /* printf("the frame subtype is %X", WF_FC_FTYPEi & rx.fc); */ |
| /* tx.fc = WF_FTYPE_CTLi | WF_FSTYPE_RTSi; */ |
| /*------------------------------------------------------------*/ |
| |
| enum { |
| /*--- Frame Control Field -------------------------------------*/ |
| /* Protocol version: always 0 for current 802.11 standards */ |
| IEEE16(WF_FC_PVER, 0x0003) |
| IEEE16(WF_FC_FTYPE, 0x000c) |
| IEEE16(WF_FC_FSTYPE, 0x00f0) |
| IEEE16(WF_FC_TODS, 0x0100) |
| IEEE16(WF_FC_FROMDS, 0x0200) |
| IEEE16(WF_FC_FROMTODS, 0x0300) |
| IEEE16(WF_FC_MOREFRAG, 0x0400) |
| IEEE16(WF_FC_RETRY, 0x0800) |
| /* Indicates PS mode in which STA will be after successful completion |
| ** of current frame exchange sequence. Always 0 for AP frames */ |
| IEEE16(WF_FC_PWRMGT, 0x1000) |
| /* What MoreData=1 means: |
| ** From AP to STA in PS mode: don't sleep yet, I have more frames for you |
| ** From Contention-Free (CF) Pollable STA in response to a CF-Poll: |
| ** STA has buffered frames for transmission in response to next CF-Poll |
| ** Bcast/mcast frames transmitted from AP: |
| ** when additional bcast/mcast frames remain to be transmitted by AP |
| ** during this beacon interval |
| ** In all other cases MoreData=0 */ |
| IEEE16(WF_FC_MOREDATA, 0x2000) |
| IEEE16(WF_FC_ISWEP, 0x4000) |
| IEEE16(WF_FC_ORDER, 0x8000) |
| |
| /* Frame Types */ |
| IEEE16(WF_FTYPE_MGMT, 0x00) |
| IEEE16(WF_FTYPE_CTL, 0x04) |
| IEEE16(WF_FTYPE_DATA, 0x08) |
| |
| /* Frame subtypes */ |
| /* Management */ |
| IEEE16(WF_FSTYPE_ASSOCREQ, 0x00) |
| IEEE16(WF_FSTYPE_ASSOCRESP, 0x10) |
| IEEE16(WF_FSTYPE_REASSOCREQ, 0x20) |
| IEEE16(WF_FSTYPE_REASSOCRESP, 0x30) |
| IEEE16(WF_FSTYPE_PROBEREQ, 0x40) |
| IEEE16(WF_FSTYPE_PROBERESP, 0x50) |
| IEEE16(WF_FSTYPE_BEACON, 0x80) |
| IEEE16(WF_FSTYPE_ATIM, 0x90) |
| IEEE16(WF_FSTYPE_DISASSOC, 0xa0) |
| IEEE16(WF_FSTYPE_AUTHEN, 0xb0) |
| IEEE16(WF_FSTYPE_DEAUTHEN, 0xc0) |
| |
| /* Control */ |
| IEEE16(WF_FSTYPE_PSPOLL, 0xa0) |
| IEEE16(WF_FSTYPE_RTS, 0xb0) |
| IEEE16(WF_FSTYPE_CTS, 0xc0) |
| IEEE16(WF_FSTYPE_ACK, 0xd0) |
| IEEE16(WF_FSTYPE_CFEND, 0xe0) |
| IEEE16(WF_FSTYPE_CFENDCFACK, 0xf0) |
| |
| /* Data */ |
| IEEE16(WF_FSTYPE_DATAONLY, 0x00) |
| IEEE16(WF_FSTYPE_DATA_CFACK, 0x10) |
| IEEE16(WF_FSTYPE_DATA_CFPOLL, 0x20) |
| IEEE16(WF_FSTYPE_DATA_CFACK_CFPOLL, 0x30) |
| IEEE16(WF_FSTYPE_NULL, 0x40) |
| IEEE16(WF_FSTYPE_CFACK, 0x50) |
| IEEE16(WF_FSTYPE_CFPOLL, 0x60) |
| IEEE16(WF_FSTYPE_CFACK_CFPOLL, 0x70) |
| }; |
| |
| |
| /*********************************************************************** |
| ** Types |
| */ |
| |
| /* Prism header emulation (monitor mode) */ |
| typedef struct wlanitem_u32 { |
| u32 did; |
| u16 status; |
| u16 len; |
| u32 data; |
| } WLAN_PACKED wlanitem_u32_t; |
| #define WLANITEM_STATUS_data_ok 0 |
| #define WLANITEM_STATUS_no_value 1 |
| #define WLANITEM_STATUS_invalid_itemname 2 |
| #define WLANITEM_STATUS_invalid_itemdata 3 |
| #define WLANITEM_STATUS_missing_itemdata 4 |
| #define WLANITEM_STATUS_incomplete_itemdata 5 |
| #define WLANITEM_STATUS_invalid_msg_did 6 |
| #define WLANITEM_STATUS_invalid_mib_did 7 |
| #define WLANITEM_STATUS_missing_conv_func 8 |
| #define WLANITEM_STATUS_string_too_long 9 |
| #define WLANITEM_STATUS_data_out_of_range 10 |
| #define WLANITEM_STATUS_string_too_short 11 |
| #define WLANITEM_STATUS_missing_valid_func 12 |
| #define WLANITEM_STATUS_unknown 13 |
| #define WLANITEM_STATUS_invalid_did 14 |
| #define WLANITEM_STATUS_missing_print_func 15 |
| |
| #define WLAN_DEVNAMELEN_MAX 16 |
| typedef struct wlansniffrm { |
| u32 msgcode; |
| u32 msglen; |
| u8 devname[WLAN_DEVNAMELEN_MAX]; |
| wlanitem_u32_t hosttime; |
| wlanitem_u32_t mactime; |
| wlanitem_u32_t channel; |
| wlanitem_u32_t rssi; |
| wlanitem_u32_t sq; |
| wlanitem_u32_t signal; |
| wlanitem_u32_t noise; |
| wlanitem_u32_t rate; |
| wlanitem_u32_t istx; /* tx? 0:no 1:yes */ |
| wlanitem_u32_t frmlen; |
| } WLAN_PACKED wlansniffrm_t; |
| #define WLANSNIFFFRM 0x0041 |
| #define WLANSNIFFFRM_hosttime 0x1041 |
| #define WLANSNIFFFRM_mactime 0x2041 |
| #define WLANSNIFFFRM_channel 0x3041 |
| #define WLANSNIFFFRM_rssi 0x4041 |
| #define WLANSNIFFFRM_sq 0x5041 |
| #define WLANSNIFFFRM_signal 0x6041 |
| #define WLANSNIFFFRM_noise 0x7041 |
| #define WLANSNIFFFRM_rate 0x8041 |
| #define WLANSNIFFFRM_istx 0x9041 |
| #define WLANSNIFFFRM_frmlen 0xA041 |