2 * IEEE 802.11 Common routines
3 * Copyright (c) 2002-2008, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
18 #include "ieee802_11_defs.h"
19 #include "ieee802_11_common.h"
22 static int ieee802_11_parse_vendor_specific(u8
*pos
, size_t elen
,
23 struct ieee802_11_elems
*elems
,
28 /* first 3 bytes in vendor specific information element are the IEEE
29 * OUI of the vendor. The following byte is used a vendor specific
33 wpa_printf(MSG_MSGDUMP
, "short vendor specific "
34 "information element ignored (len=%lu)",
35 (unsigned long) elen
);
40 oui
= WPA_GET_BE24(pos
);
43 /* Microsoft/Wi-Fi information elements are further typed and
47 /* Microsoft OUI (00:50:F2) with OUI Type 1:
48 * real WPA information element */
50 elems
->wpa_ie_len
= elen
;
52 case WME_OUI_TYPE
: /* this is a Wi-Fi WME info. element */
54 wpa_printf(MSG_MSGDUMP
, "short WME "
55 "information element ignored "
57 (unsigned long) elen
);
61 case WME_OUI_SUBTYPE_INFORMATION_ELEMENT
:
62 case WME_OUI_SUBTYPE_PARAMETER_ELEMENT
:
64 elems
->wme_len
= elen
;
66 case WME_OUI_SUBTYPE_TSPEC_ELEMENT
:
67 elems
->wme_tspec
= pos
;
68 elems
->wme_tspec_len
= elen
;
71 wpa_printf(MSG_MSGDUMP
, "unknown WME "
72 "information element ignored "
73 "(subtype=%d len=%lu)",
74 pos
[4], (unsigned long) elen
);
79 /* Wi-Fi Protected Setup (WPS) IE */
81 elems
->wps_ie_len
= elen
;
84 wpa_printf(MSG_MSGDUMP
, "Unknown Microsoft "
85 "information element ignored "
86 "(type=%d len=%lu)\n",
87 pos
[3], (unsigned long) elen
);
93 wpa_printf(MSG_MSGDUMP
, "unknown vendor specific information "
94 "element ignored (vendor OUI %02x:%02x:%02x "
96 pos
[0], pos
[1], pos
[2], (unsigned long) elen
);
104 ParseRes
ieee802_11_parse_elems(u8
*start
, size_t len
,
105 struct ieee802_11_elems
*elems
,
112 os_memset(elems
, 0, sizeof(*elems
));
123 wpa_printf(MSG_DEBUG
, "IEEE 802.11 element "
124 "parse failed (id=%d elen=%d "
126 id
, elen
, (unsigned long) left
);
127 wpa_hexdump(MSG_MSGDUMP
, "IEs", start
, len
);
135 elems
->ssid_len
= elen
;
137 case WLAN_EID_SUPP_RATES
:
138 elems
->supp_rates
= pos
;
139 elems
->supp_rates_len
= elen
;
141 case WLAN_EID_FH_PARAMS
:
142 elems
->fh_params
= pos
;
143 elems
->fh_params_len
= elen
;
145 case WLAN_EID_DS_PARAMS
:
146 elems
->ds_params
= pos
;
147 elems
->ds_params_len
= elen
;
149 case WLAN_EID_CF_PARAMS
:
150 elems
->cf_params
= pos
;
151 elems
->cf_params_len
= elen
;
155 elems
->tim_len
= elen
;
157 case WLAN_EID_IBSS_PARAMS
:
158 elems
->ibss_params
= pos
;
159 elems
->ibss_params_len
= elen
;
161 case WLAN_EID_CHALLENGE
:
162 elems
->challenge
= pos
;
163 elems
->challenge_len
= elen
;
165 case WLAN_EID_ERP_INFO
:
166 elems
->erp_info
= pos
;
167 elems
->erp_info_len
= elen
;
169 case WLAN_EID_EXT_SUPP_RATES
:
170 elems
->ext_supp_rates
= pos
;
171 elems
->ext_supp_rates_len
= elen
;
173 case WLAN_EID_VENDOR_SPECIFIC
:
174 if (ieee802_11_parse_vendor_specific(pos
, elen
,
181 elems
->rsn_ie_len
= elen
;
183 case WLAN_EID_PWR_CAPABILITY
:
184 elems
->power_cap
= pos
;
185 elems
->power_cap_len
= elen
;
187 case WLAN_EID_SUPPORTED_CHANNELS
:
188 elems
->supp_channels
= pos
;
189 elems
->supp_channels_len
= elen
;
191 case WLAN_EID_MOBILITY_DOMAIN
:
193 elems
->mdie_len
= elen
;
195 case WLAN_EID_FAST_BSS_TRANSITION
:
197 elems
->ftie_len
= elen
;
199 case WLAN_EID_HT_CAP
:
200 elems
->ht_capabilities
= pos
;
201 elems
->ht_capabilities_len
= elen
;
203 case WLAN_EID_HT_OPERATION
:
204 elems
->ht_operation
= pos
;
205 elems
->ht_operation_len
= elen
;
207 case WLAN_EID_ASSOC_COMEBACK_TIME
:
208 elems
->assoc_comeback
= pos
;
209 elems
->assoc_comeback_len
= elen
;
215 wpa_printf(MSG_MSGDUMP
, "IEEE 802.11 element parse "
216 "ignored unknown element (id=%d elen=%d)",
228 return unknown
? ParseUnknown
: ParseOK
;