|
|
1.1 root 1: /* src/include/wlan/p80211hdr.h
2: *
3: * Macros, types, and functions for handling 802.11 MAC headers
4: *
5: * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved.
6: * --------------------------------------------------------------------
7: *
8: * linux-wlan
9: *
10: * The contents of this file are subject to the Mozilla Public
11: * License Version 1.1 (the "License"); you may not use this file
12: * except in compliance with the License. You may obtain a copy of
13: * the License at http://www.mozilla.org/MPL/
14: *
15: * Software distributed under the License is distributed on an "AS
16: * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
17: * implied. See the License for the specific language governing
18: * rights and limitations under the License.
19: *
20: * Alternatively, the contents of this file may be used under the
21: * terms of the GNU Public License version 2 (the "GPL"), in which
22: * case the provisions of the GPL are applicable instead of the
23: * above. If you wish to allow the use of your version of this file
24: * only under the terms of the GPL and not to allow others to use
25: * your version of this file under the MPL, indicate your decision
26: * by deleting the provisions above and replace them with the notice
27: * and other provisions required by the GPL. If you do not delete
28: * the provisions above, a recipient may use your version of this
29: * file under either the MPL or the GPL.
30: *
31: * --------------------------------------------------------------------
32: *
33: * Inquiries regarding the linux-wlan Open Source project can be
34: * made directly to:
35: *
36: * AbsoluteValue Systems Inc.
37: * [email protected]
38: * http://www.linux-wlan.com
39: *
40: * --------------------------------------------------------------------
41: *
42: * Portions of the development of this software were funded by
43: * Intersil Corporation as part of PRISM(R) chipset product development.
44: *
45: * --------------------------------------------------------------------
46: *
47: * This file declares the constants and types used in the interface
48: * between a wlan driver and the user mode utilities.
49: *
50: * Note:
51: * - Constant values are always in HOST byte order. To assign
52: * values to multi-byte fields they _must_ be converted to
53: * ieee byte order. To retrieve multi-byte values from incoming
54: * frames, they must be converted to host order.
55: *
56: * All functions declared here are implemented in p80211.c
57: * --------------------------------------------------------------------
58: */
59:
60: FILE_LICENCE ( GPL2_ONLY );
61:
62: #ifndef _P80211HDR_H
63: #define _P80211HDR_H
64:
65: /*================================================================*/
66: /* System Includes */
67:
68: /*================================================================*/
69: /* Project Includes */
70:
71: #ifndef _WLAN_COMPAT_H
72: #include <wlan/wlan_compat.h>
73: #endif
74:
75:
76: /*================================================================*/
77: /* Constants */
78:
79: /*--- Sizes -----------------------------------------------*/
80: #define WLAN_ADDR_LEN 6
81: #define WLAN_CRC_LEN 4
82: #define WLAN_BSSID_LEN 6
83: #define WLAN_BSS_TS_LEN 8
84: #define WLAN_HDR_A3_LEN 24
85: #define WLAN_HDR_A4_LEN 30
86: #define WLAN_SSID_MAXLEN 32
87: #define WLAN_DATA_MAXLEN 2312
88: #define WLAN_A3FR_MAXLEN (WLAN_HDR_A3_LEN + WLAN_DATA_MAXLEN + WLAN_CRC_LEN)
89: #define WLAN_A4FR_MAXLEN (WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN + WLAN_CRC_LEN)
90: #define WLAN_BEACON_FR_MAXLEN (WLAN_HDR_A3_LEN + 334)
91: #define WLAN_ATIM_FR_MAXLEN (WLAN_HDR_A3_LEN + 0)
92: #define WLAN_DISASSOC_FR_MAXLEN (WLAN_HDR_A3_LEN + 2)
93: #define WLAN_ASSOCREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 48)
94: #define WLAN_ASSOCRESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 16)
95: #define WLAN_REASSOCREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 54)
96: #define WLAN_REASSOCRESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 16)
97: #define WLAN_PROBEREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 44)
98: #define WLAN_PROBERESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 78)
99: #define WLAN_AUTHEN_FR_MAXLEN (WLAN_HDR_A3_LEN + 261)
100: #define WLAN_DEAUTHEN_FR_MAXLEN (WLAN_HDR_A3_LEN + 2)
101: #define WLAN_WEP_NKEYS 4
102: #define WLAN_WEP_MAXKEYLEN 13
103: #define WLAN_CHALLENGE_IE_LEN 130
104: #define WLAN_CHALLENGE_LEN 128
105: #define WLAN_WEP_IV_LEN 4
106: #define WLAN_WEP_ICV_LEN 4
107:
108: /*--- Frame Control Field -------------------------------------*/
109: /* Frame Types */
110: #define WLAN_FTYPE_MGMT 0x00
111: #define WLAN_FTYPE_CTL 0x01
112: #define WLAN_FTYPE_DATA 0x02
113:
114: /* Frame subtypes */
115: /* Management */
116: #define WLAN_FSTYPE_ASSOCREQ 0x00
117: #define WLAN_FSTYPE_ASSOCRESP 0x01
118: #define WLAN_FSTYPE_REASSOCREQ 0x02
119: #define WLAN_FSTYPE_REASSOCRESP 0x03
120: #define WLAN_FSTYPE_PROBEREQ 0x04
121: #define WLAN_FSTYPE_PROBERESP 0x05
122: #define WLAN_FSTYPE_BEACON 0x08
123: #define WLAN_FSTYPE_ATIM 0x09
124: #define WLAN_FSTYPE_DISASSOC 0x0a
125: #define WLAN_FSTYPE_AUTHEN 0x0b
126: #define WLAN_FSTYPE_DEAUTHEN 0x0c
127:
128: /* Control */
129: #define WLAN_FSTYPE_BLOCKACKREQ 0x8
130: #define WLAN_FSTYPE_BLOCKACK 0x9
131: #define WLAN_FSTYPE_PSPOLL 0x0a
132: #define WLAN_FSTYPE_RTS 0x0b
133: #define WLAN_FSTYPE_CTS 0x0c
134: #define WLAN_FSTYPE_ACK 0x0d
135: #define WLAN_FSTYPE_CFEND 0x0e
136: #define WLAN_FSTYPE_CFENDCFACK 0x0f
137:
138: /* Data */
139: #define WLAN_FSTYPE_DATAONLY 0x00
140: #define WLAN_FSTYPE_DATA_CFACK 0x01
141: #define WLAN_FSTYPE_DATA_CFPOLL 0x02
142: #define WLAN_FSTYPE_DATA_CFACK_CFPOLL 0x03
143: #define WLAN_FSTYPE_NULL 0x04
144: #define WLAN_FSTYPE_CFACK 0x05
145: #define WLAN_FSTYPE_CFPOLL 0x06
146: #define WLAN_FSTYPE_CFACK_CFPOLL 0x07
147:
148:
149: /*================================================================*/
150: /* Macros */
151:
152: /*--- FC Macros ----------------------------------------------*/
153: /* Macros to get/set the bitfields of the Frame Control Field */
154: /* GET_FC_??? - takes the host byte-order value of an FC */
155: /* and retrieves the value of one of the */
156: /* bitfields and moves that value so its lsb is */
157: /* in bit 0. */
158: /* SET_FC_??? - takes a host order value for one of the FC */
159: /* bitfields and moves it to the proper bit */
160: /* location for ORing into a host order FC. */
161: /* To send the FC produced from SET_FC_???, */
162: /* one must put the bytes in IEEE order. */
163: /* e.g. */
164: /* printf("the frame subtype is %x", */
165: /* GET_FC_FTYPE( ieee2host( rx.fc ))) */
166: /* */
167: /* tx.fc = host2ieee( SET_FC_FTYPE(WLAN_FTYP_CTL) | */
168: /* SET_FC_FSTYPE(WLAN_FSTYPE_RTS) ); */
169: /*------------------------------------------------------------*/
170:
171: #define WLAN_GET_FC_PVER(n) (((UINT16)(n)) & (BIT0 | BIT1))
172: #define WLAN_GET_FC_FTYPE(n) ((((UINT16)(n)) & (BIT2 | BIT3)) >> 2)
173: #define WLAN_GET_FC_FSTYPE(n) ((((UINT16)(n)) & (BIT4|BIT5|BIT6|BIT7)) >> 4)
174: #define WLAN_GET_FC_TODS(n) ((((UINT16)(n)) & (BIT8)) >> 8)
175: #define WLAN_GET_FC_FROMDS(n) ((((UINT16)(n)) & (BIT9)) >> 9)
176: #define WLAN_GET_FC_MOREFRAG(n) ((((UINT16)(n)) & (BIT10)) >> 10)
177: #define WLAN_GET_FC_RETRY(n) ((((UINT16)(n)) & (BIT11)) >> 11)
178: #define WLAN_GET_FC_PWRMGT(n) ((((UINT16)(n)) & (BIT12)) >> 12)
179: #define WLAN_GET_FC_MOREDATA(n) ((((UINT16)(n)) & (BIT13)) >> 13)
180: #define WLAN_GET_FC_ISWEP(n) ((((UINT16)(n)) & (BIT14)) >> 14)
181: #define WLAN_GET_FC_ORDER(n) ((((UINT16)(n)) & (BIT15)) >> 15)
182:
183: #define WLAN_SET_FC_PVER(n) ((UINT16)(n))
184: #define WLAN_SET_FC_FTYPE(n) (((UINT16)(n)) << 2)
185: #define WLAN_SET_FC_FSTYPE(n) (((UINT16)(n)) << 4)
186: #define WLAN_SET_FC_TODS(n) (((UINT16)(n)) << 8)
187: #define WLAN_SET_FC_FROMDS(n) (((UINT16)(n)) << 9)
188: #define WLAN_SET_FC_MOREFRAG(n) (((UINT16)(n)) << 10)
189: #define WLAN_SET_FC_RETRY(n) (((UINT16)(n)) << 11)
190: #define WLAN_SET_FC_PWRMGT(n) (((UINT16)(n)) << 12)
191: #define WLAN_SET_FC_MOREDATA(n) (((UINT16)(n)) << 13)
192: #define WLAN_SET_FC_ISWEP(n) (((UINT16)(n)) << 14)
193: #define WLAN_SET_FC_ORDER(n) (((UINT16)(n)) << 15)
194:
195: /*--- Duration Macros ----------------------------------------*/
196: /* Macros to get/set the bitfields of the Duration Field */
197: /* - the duration value is only valid when bit15 is zero */
198: /* - the firmware handles these values, so I'm not going */
199: /* these macros right now. */
200: /*------------------------------------------------------------*/
201:
202: /*--- Sequence Control Macros -------------------------------*/
203: /* Macros to get/set the bitfields of the Sequence Control */
204: /* Field. */
205: /*------------------------------------------------------------*/
206: #define WLAN_GET_SEQ_FRGNUM(n) (((UINT16)(n)) & (BIT0|BIT1|BIT2|BIT3))
207: #define WLAN_GET_SEQ_SEQNUM(n) ((((UINT16)(n)) & (~(BIT0|BIT1|BIT2|BIT3))) >> 4)
208:
209: /*--- Data ptr macro -----------------------------------------*/
210: /* Creates a UINT8* to the data portion of a frame */
211: /* Assumes you're passing in a ptr to the beginning of the hdr*/
212: /*------------------------------------------------------------*/
213: #define WLAN_HDR_A3_DATAP(p) (((UINT8*)(p)) + WLAN_HDR_A3_LEN)
214: #define WLAN_HDR_A4_DATAP(p) (((UINT8*)(p)) + WLAN_HDR_A4_LEN)
215:
216: #define DOT11_RATE5_ISBASIC_GET(r) (((UINT8)(r)) & BIT7)
217:
218: /*================================================================*/
219: /* Types */
220:
221: /* BSS Timestamp */
222: typedef UINT8 wlan_bss_ts_t[WLAN_BSS_TS_LEN];
223:
224: /* Generic 802.11 Header types */
225:
226: typedef struct p80211_hdr_a3
227: {
228: UINT16 fc;
229: UINT16 dur;
230: UINT8 a1[WLAN_ADDR_LEN];
231: UINT8 a2[WLAN_ADDR_LEN];
232: UINT8 a3[WLAN_ADDR_LEN];
233: UINT16 seq;
234: } __WLAN_ATTRIB_PACK__ p80211_hdr_a3_t;
235:
236: typedef struct p80211_hdr_a4
237: {
238: UINT16 fc;
239: UINT16 dur;
240: UINT8 a1[WLAN_ADDR_LEN];
241: UINT8 a2[WLAN_ADDR_LEN];
242: UINT8 a3[WLAN_ADDR_LEN];
243: UINT16 seq;
244: UINT8 a4[WLAN_ADDR_LEN];
245: } __WLAN_ATTRIB_PACK__ p80211_hdr_a4_t;
246:
247: typedef union p80211_hdr
248: {
249: p80211_hdr_a3_t a3;
250: p80211_hdr_a4_t a4;
251: } __WLAN_ATTRIB_PACK__ p80211_hdr_t;
252:
253:
254: /*================================================================*/
255: /* Extern Declarations */
256:
257:
258: /*================================================================*/
259: /* Function Declarations */
260:
261: /* Frame and header lenght macros */
262:
263: #define WLAN_CTL_FRAMELEN(fstype) (\
264: (fstype) == WLAN_FSTYPE_BLOCKACKREQ ? 24 : \
265: (fstype) == WLAN_FSTYPE_BLOCKACK ? 152 : \
266: (fstype) == WLAN_FSTYPE_PSPOLL ? 20 : \
267: (fstype) == WLAN_FSTYPE_RTS ? 20 : \
268: (fstype) == WLAN_FSTYPE_CTS ? 14 : \
269: (fstype) == WLAN_FSTYPE_ACK ? 14 : \
270: (fstype) == WLAN_FSTYPE_CFEND ? 20 : \
271: (fstype) == WLAN_FSTYPE_CFENDCFACK ? 20 : 4)
272:
273: #define WLAN_FCS_LEN 4
274:
275: /* ftcl in HOST order */
276: inline static UINT16 p80211_headerlen(UINT16 fctl)
277: {
278: UINT16 hdrlen = 0;
279:
280: switch ( WLAN_GET_FC_FTYPE(fctl) ) {
281: case WLAN_FTYPE_MGMT:
282: hdrlen = WLAN_HDR_A3_LEN;
283: break;
284: case WLAN_FTYPE_DATA:
285: hdrlen = WLAN_HDR_A3_LEN;
286: if ( WLAN_GET_FC_TODS(fctl) && WLAN_GET_FC_FROMDS(fctl) ) {
287: hdrlen += WLAN_ADDR_LEN;
288: }
289: break;
290: case WLAN_FTYPE_CTL:
291: hdrlen = WLAN_CTL_FRAMELEN(WLAN_GET_FC_FSTYPE(fctl)) -
292: WLAN_FCS_LEN;
293: break;
294: default:
295: hdrlen = WLAN_HDR_A3_LEN;
296: }
297:
298: return hdrlen;
299: }
300:
301: #endif /* _P80211HDR_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.