1 //------------------------------------------------------------------------------
2 // <copyright file="wlan_recv_beacon.c" company="Atheros">
3 // Copyright (c) 2004-2010 Atheros Corporation. All rights reserved.
6 // Permission to use, copy, modify, and/or distribute this software for any
7 // purpose with or without fee is hereby granted, provided that the above
8 // copyright notice and this permission notice appear in all copies.
10 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 //------------------------------------------------------------------------------
20 //==============================================================================
21 // IEEE 802.11 input handling.
23 // Author(s): ="Atheros"
24 //==============================================================================
31 #include <ieee80211.h>
34 #define IEEE80211_VERIFY_LENGTH(_len, _minlen) do { \
35 if ((_len) < (_minlen)) { \
40 #define IEEE80211_VERIFY_ELEMENT(__elem, __maxlen) do { \
41 if ((__elem) == NULL) { \
44 if ((__elem)[1] > (__maxlen)) { \
50 /* unaligned little endian access */
51 #define LE_READ_2(p) \
53 ((((A_UINT8 *)(p))[0] ) | (((A_UINT8 *)(p))[1] << 8)))
55 #define LE_READ_4(p) \
57 ((((A_UINT8 *)(p))[0] ) | (((A_UINT8 *)(p))[1] << 8) | \
58 (((A_UINT8 *)(p))[2] << 16) | (((A_UINT8 *)(p))[3] << 24)))
62 iswpaoui(const A_UINT8
*frm
)
64 return frm
[1] > 3 && LE_READ_4(frm
+2) == ((WPA_OUI_TYPE
<<24)|WPA_OUI
);
68 iswmmoui(const A_UINT8
*frm
)
70 return frm
[1] > 3 && LE_READ_4(frm
+2) == ((WMM_OUI_TYPE
<<24)|WMM_OUI
);
73 /* unused functions for now */
76 iswmmparam(const A_UINT8
*frm
)
78 return frm
[1] > 5 && frm
[6] == WMM_PARAM_OUI_SUBTYPE
;
82 iswmminfo(const A_UINT8
*frm
)
84 return frm
[1] > 5 && frm
[6] == WMM_INFO_OUI_SUBTYPE
;
89 isatherosoui(const A_UINT8
*frm
)
91 return frm
[1] > 3 && LE_READ_4(frm
+2) == ((ATH_OUI_TYPE
<<24)|ATH_OUI
);
95 iswscoui(const A_UINT8
*frm
)
97 return frm
[1] > 3 && LE_READ_4(frm
+2) == ((0x04<<24)|WPA_OUI
);
101 wlan_parse_beacon(A_UINT8
*buf
, int framelen
, struct ieee80211_common_ie
*cie
)
104 A_UINT8 elemid_ssid
= FALSE
;
107 efrm
= (A_UINT8
*) (frm
+ framelen
);
110 * beacon/probe response frame format
112 * [2] beacon interval
113 * [2] capability information
115 * [tlv] supported rates
116 * [tlv] country information
117 * [tlv] parameter set (FH/DS)
118 * [tlv] erp information
119 * [tlv] extended supported rates
122 * [tlv] Atheros Advanced Capabilities
124 IEEE80211_VERIFY_LENGTH(efrm
- frm
, 12);
125 A_MEMZERO(cie
, sizeof(*cie
));
127 cie
->ie_tstamp
= frm
; frm
+= 8;
128 cie
->ie_beaconInt
= A_LE2CPU16(*(A_UINT16
*)frm
); frm
+= 2;
129 cie
->ie_capInfo
= A_LE2CPU16(*(A_UINT16
*)frm
); frm
+= 2;
134 case IEEE80211_ELEMID_SSID
:
140 case IEEE80211_ELEMID_RATES
:
143 case IEEE80211_ELEMID_COUNTRY
:
144 cie
->ie_country
= frm
;
146 case IEEE80211_ELEMID_FHPARMS
:
148 case IEEE80211_ELEMID_DSPARMS
:
149 cie
->ie_chan
= frm
[2];
151 case IEEE80211_ELEMID_TIM
:
154 case IEEE80211_ELEMID_IBSSPARMS
:
156 case IEEE80211_ELEMID_XRATES
:
157 cie
->ie_xrates
= frm
;
159 case IEEE80211_ELEMID_ERP
:
161 //A_PRINTF("Discarding ERP Element - Bad Len\n");
164 cie
->ie_erp
= frm
[2];
166 case IEEE80211_ELEMID_RSN
:
169 case IEEE80211_ELEMID_HTCAP_ANA
:
172 case IEEE80211_ELEMID_HTINFO_ANA
:
176 case IEEE80211_ELEMID_WAPI
:
180 case IEEE80211_ELEMID_VENDOR
:
183 } else if (iswmmoui(frm
)) {
185 } else if (isatherosoui(frm
)) {
187 } else if(iswscoui(frm
)) {
196 IEEE80211_VERIFY_ELEMENT(cie
->ie_rates
, IEEE80211_RATE_MAXSIZE
);
197 IEEE80211_VERIFY_ELEMENT(cie
->ie_ssid
, IEEE80211_NWID_LEN
);