1 //
2 // Copyright (C) 2012 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #ifndef SHILL_NET_IEEE80211_H_
18 #define SHILL_NET_IEEE80211_H_
19 
20 namespace shill {
21 
22 namespace IEEE_80211 {
23 // Information Element Ids from IEEE 802.11-2012 Section 8.4.2
24 const uint8_t kElemIdChannels = 0x24;
25 const uint8_t kElemIdChallengeText = 0x10;
26 const uint8_t kElemIdCountry = 0x07;
27 const uint8_t kElemIdDSParameterSet = 0x03;
28 const uint8_t kElemIdErp = 0x2a;
29 const uint8_t kElemIdExtendedRates = 0x32;
30 const uint8_t kElemIdHTCap = 0x2d;
31 const uint8_t kElemIdHTInfo = 0x3d;
32 const uint8_t kElemIdPowerCapability = 0x21;
33 const uint8_t kElemIdPowerConstraint = 0x20;
34 const uint8_t kElemIdRequest = 0x0a;
35 const uint8_t kElemIdRSN = 0x30;
36 const uint8_t kElemIdSsid = 0x00;
37 const uint8_t kElemIdSupportedRates = 0x01;
38 const uint8_t kElemIdTpcReport = 0x23;
39 const uint8_t kElemIdVendor = 0xdd;
40 const uint8_t kElemIdVHTCap = 0xbf;
41 const uint8_t kElemIdVHTOperation = 0xc0;
42 
43 const unsigned int kMaxSSIDLen = 32;
44 
45 const unsigned int kWEP40AsciiLen = 5;
46 const unsigned int kWEP40HexLen = 10;
47 const unsigned int kWEP104AsciiLen = 13;
48 const unsigned int kWEP104HexLen = 26;
49 
50 const unsigned int kWPAAsciiMinLen = 8;
51 const unsigned int kWPAAsciiMaxLen = 63;
52 const unsigned int kWPAHexLen = 64;
53 
54 const uint32_t kOUIVendorEpigram = 0x00904c;
55 const uint32_t kOUIVendorMicrosoft = 0x0050f2;
56 
57 const uint8_t kOUIMicrosoftWPA = 1;
58 const uint8_t kOUIMicrosoftWPS = 4;
59 const uint16_t kWPSElementManufacturer = 0x1021;
60 const uint16_t kWPSElementModelName = 0x1023;
61 const uint16_t kWPSElementModelNumber = 0x1024;
62 const uint16_t kWPSElementDeviceName = 0x1011;
63 
64 const int kRSNIEVersionLen = 2;
65 const int kRSNIESelectorLen = 4;
66 const int kRSNIECipherCountOffset = kRSNIEVersionLen + kRSNIESelectorLen;
67 const int kRSNIECipherCountLen = 2;
68 const int kRSNIENumCiphers = 2;
69 const int kRSNIECapabilitiesLen = 2;
70 const uint16_t kRSNCapabilityPreAuth = 0x0001;
71 const uint16_t kRSNCapabilityPairwise = 0x0002;
72 const uint16_t kRSNCapabilityPTKSA = 0x000c;
73 const uint16_t kRSNCapabilityGTKSA = 0x0030;
74 const uint16_t kRSNCapabilityFrameProtectionRequired = 0x0040;
75 const uint16_t kRSNCapabilityFrameProtectionCapable = 0x0080;
76 const uint16_t kRSNCapabilityPeerKey = 0x0200;
77 
78 /* 802.11n HT capabilities masks (for cap_info) */
79 const uint16_t kHTCapMaskLdpcCoding = 0x0001;
80 const uint16_t kHTCapMaskSupWidth2040 = 0x0002;
81 const uint16_t kHTCapMaskSmPs = 0x000c;
82 const uint16_t kHTCapMaskSmPsShift = 2;
83 const uint16_t kHTCapMaskGrnFld = 0x0010;
84 const uint16_t kHTCapMaskSgi20 = 0x0020;
85 const uint16_t kHTCapMaskSgi40 = 0x0040;
86 const uint16_t kHTCapMaskTxStbc = 0x0080;
87 const uint16_t kHTCapMaskRxStbc = 0x0300;
88 const uint16_t kHTCapMaskRxStbcShift = 8;
89 const uint16_t kHTCapMaskDelayBA = 0x0400;
90 const uint16_t kHTCapMaskMaxAmsdu = 0x0800;
91 const uint16_t kHTCapMaskDsssCck40 = 0x1000;
92 const uint16_t kHTCapMask40MHzIntolerant = 0x4000;
93 const uint16_t kHTCapMaskLsigTxopProt = 0x8000;
94 
95 // Beacon and Probe Response Capability Information field masks from
96 // IEEE 802.11-2012 Section 8.4.1.4
97 const uint16_t kWlanCapMaskEss = 0x0001;
98 const uint16_t kWlanCapMaskIbss = 0x0002;
99 const uint16_t kWlanCapMaskContentionFreePollable = 0x0004;
100 const uint16_t kWlanCapMaskContentionFreePollRequest = 0x0008;
101 const uint16_t kWlanCapMaskPrivacy = 0x0010;
102 const uint16_t kWlanCapMaskShortPreamble = 0x0020;
103 const uint16_t kWlanCapMaskPbcc = 0x0040;
104 const uint16_t kWlanCapMaskChannelAgility = 0x0080;
105 const uint16_t kWlanCapMaskSpectrumMgmt = 0x0100;
106 const uint16_t kWlanCapMaskQoS = 0x0200;
107 const uint16_t kWlanCapMaskShortSlotTime = 0x0400;
108 const uint16_t kWlanCapMaskApsd = 0x0800;
109 const uint16_t kWlanCapMaskRadioMeasurement = 0x1000;
110 const uint16_t kWlanCapMaskDsssOfdm = 0x2000;
111 const uint16_t kWlanCapMaskDelayedBlockAck = 0x4000;
112 const uint16_t kWlanCapMaskImmediateBlockAck = 0x8000;
113 
114 
115 // This structure is incomplete.  Fields will be added as necessary.
116 //
117 // NOTE: the uint16_t stuff is in little-endian format so conversions are
118 // required.
119 struct ieee80211_frame {
120   uint16_t frame_control;
121   uint16_t duration_usec;
122   uint8_t destination_mac[6];
123   uint8_t source_mac[6];
124   uint8_t address[6];
125   uint16_t sequence_control;
126   union {
127     struct {
128       uint16_t reserved_1;
129       uint16_t reserved_2;
130       uint16_t status_code;
131     } authentiate_message;
132     struct {
133       uint16_t reason_code;
134     } deauthentiate_message;
135     struct {
136       uint16_t reserved_1;
137       uint16_t status_code;
138     } associate_response;
139   } u;
140 };
141 
142 // Status/reason code returned by nl80211 messages: Authenticate,
143 // Deauthenticate, Associate, and Reassociate.
144 enum WiFiReasonCode {
145   kReasonCodeReserved0 = 0,  // 0 is reserved.
146   kReasonCodeUnspecified = 1,
147   kReasonCodePreviousAuthenticationInvalid = 2,
148   kReasonCodeSenderHasLeft = 3,
149   kReasonCodeInactivity = 4,
150   kReasonCodeTooManySTAs = 5,
151   kReasonCodeNonAuthenticated = 6,
152   kReasonCodeNonAssociated = 7,
153   kReasonCodeDisassociatedHasLeft = 8,
154   kReasonCodeReassociationNotAuthenticated = 9,
155   kReasonCodeUnacceptablePowerCapability = 10,
156   kReasonCodeUnacceptableSupportedChannelInfo = 11,
157   kReasonCodeReserved12 = 12,  // 12 is reserved.
158   kReasonCodeInvalidInfoElement = 13,
159   kReasonCodeMICFailure = 14,
160   kReasonCode4WayTimeout = 15,
161   kReasonCodeGroupKeyHandshakeTimeout = 16,
162   kReasonCodeDifferenIE = 17,
163   kReasonCodeGroupCipherInvalid = 18,
164   kReasonCodePairwiseCipherInvalid = 19,
165   kReasonCodeAkmpInvalid = 20,
166   kReasonCodeUnsupportedRsnIeVersion = 21,
167   kReasonCodeInvalidRsnIeCaps = 22,
168   kReasonCode8021XAuth = 23,
169   kReasonCodeCipherSuiteRejected = 24,
170   kReasonCodeReservedBegin25 = 25,   // 25-31 are reserved.
171   kReasonCodeReservedEnd31 = 31,
172   kReasonCodeUnspecifiedQoS = 32,
173   kReasonCodeQoSBandwidth = 33,
174   kReasonCodeiPoorConditions = 34,
175   kReasonCodeOutsideTxop = 35,
176   kReasonCodeStaLeaving = 36,
177   kReasonCodeUnacceptableMechanism = 37,
178   kReasonCodeSetupRequired = 38,
179   kReasonCodeTimeout = 39,
180   kReasonCodeReservedBegin40 = 40,  // 40-44 are reserved.
181   kReasonCodeReservedEnd44 = 44,
182   kReasonCodeCipherSuiteNotSupported = 45,
183   kReasonCodeMax,
184   kReasonCodeInvalid = UINT16_MAX
185 };
186 
187 enum WiFiStatusCode {
188   kStatusCodeSuccessful = 0,
189   kStatusCodeFailure = 1,
190   // 2-9 are reserved.
191   kStatusCodeAllCapabilitiesNotSupported = 10,
192   kStatusCodeCantConfirmAssociation = 11,
193   kStatusCodeAssociationDenied = 12,
194   kStatusCodeAuthenticationUnsupported = 13,
195   kStatusCodeOutOfSequence = 14,
196   kStatusCodeChallengeFailure = 15,
197   kStatusCodeFrameTimeout = 16,
198   kStatusCodeMaxSta = 17,
199   kStatusCodeDataRateUnsupported = 18,
200   kStatusCodeShortPreambleUnsupported = 19,
201   kStatusCodePbccUnsupported = 20,
202   kStatusCodeChannelAgilityUnsupported = 21,
203   kStatusCodeNeedSpectrumManagement = 22,
204   kStatusCodeUnacceptablePowerCapability = 23,
205   kStatusCodeUnacceptableSupportedChannelInfo = 24,
206   kStatusCodeShortTimeSlotRequired = 25,
207   kStatusCodeDssOfdmRequired = 26,
208   // 27-31 are reserved.
209   kStatusCodeQosFailure = 32,
210   kStatusCodeInsufficientBandwithForQsta = 33,
211   kStatusCodePoorConditions = 34,
212   kStatusCodeQosNotSupported = 35,
213   // 36 is reserved.
214   kStatusCodeDeclined = 37,
215   kStatusCodeInvalidParameterValues = 38,
216   kStatusCodeCannotBeHonored = 39,
217   kStatusCodeInvalidInfoElement = 40,
218   kStatusCodeGroupCipherInvalid = 41,
219   kStatusCodePairwiseCipherInvalid = 42,
220   kStatusCodeAkmpInvalid = 43,
221   kStatusCodeUnsupportedRsnIeVersion = 44,
222   kStatusCodeInvalidRsnIeCaps = 45,
223   kStatusCodeCipherSuiteRejected = 46,
224   kStatusCodeTsDelayNotMet = 47,
225   kStatusCodeDirectLinkIllegal = 48,
226   kStatusCodeStaNotInBss = 49,
227   kStatusCodeStaNotInQsta = 50,
228   kStatusCodeExcessiveListenInterval = 51,
229   kStatusCodeMax,
230   kStatusCodeInvalid = UINT16_MAX
231 };
232 
233 }  // namespace IEEE_80211
234 
235 }  // namespace shill
236 
237 #endif  // SHILL_NET_IEEE80211_H_
238