blob: 20411810dbd20977d17fe88400e87e300da70fd5 [file] [log] [blame]
Wade Guthrie16196242012-11-20 15:53:52 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/nl80211_attribute.h"
6
Wade Guthrie16196242012-11-20 15:53:52 -08007#include <netlink/attr.h>
Wade Guthrie16196242012-11-20 15:53:52 -08008
Wade Guthrief54872f2013-04-11 15:11:50 -07009#include <string>
10
11#include <base/bind.h>
12#include <base/format_macros.h>
13#include <base/stringprintf.h>
14
Wade Guthrie16196242012-11-20 15:53:52 -080015#include "shill/logging.h"
Wade Guthrie16196242012-11-20 15:53:52 -080016
Wade Guthrief54872f2013-04-11 15:11:50 -070017using base::Bind;
Wade Guthrie2193b232013-06-05 17:09:07 -070018using base::StringAppendF;
Wade Guthrief54872f2013-04-11 15:11:50 -070019using base::StringPrintf;
20using std::string;
21
Wade Guthrie16196242012-11-20 15:53:52 -080022namespace shill {
23
Wade Guthrie68da97c2013-02-26 13:09:35 -080024const int Nl80211AttributeCookie::kName = NL80211_ATTR_COOKIE;
Wade Guthrie25cdb382012-12-04 14:04:05 -080025const char Nl80211AttributeCookie::kNameString[] = "NL80211_ATTR_COOKIE";
26
Wade Guthrief54872f2013-04-11 15:11:50 -070027const int Nl80211AttributeBss::kName = NL80211_ATTR_BSS;
28const char Nl80211AttributeBss::kNameString[] = "NL80211_ATTR_BSS";
29const int Nl80211AttributeBss::kChannelsAttributeId = 0x24;
30const int Nl80211AttributeBss::kChallengeTextAttributeId = 0x10;
31const int Nl80211AttributeBss::kCountryInfoAttributeId = 0x07;
32const int Nl80211AttributeBss::kDSParameterSetAttributeId = 0x03;
33const int Nl80211AttributeBss::kErpAttributeId = 0x2a;
34const int Nl80211AttributeBss::kExtendedRatesAttributeId = 0x32;
35const int Nl80211AttributeBss::kHtCapAttributeId = 0x2d;
36const int Nl80211AttributeBss::kHtInfoAttributeId = 0x3d;
37const int Nl80211AttributeBss::kPowerCapabilityAttributeId = 0x21;
38const int Nl80211AttributeBss::kPowerConstraintAttributeId = 0x20;
39const int Nl80211AttributeBss::kRequestAttributeId = 0x0a;
40const int Nl80211AttributeBss::kRsnAttributeId = 0x30;
41const int Nl80211AttributeBss::kSsidAttributeId = 0x00;
42const int Nl80211AttributeBss::kSupportedRatesAttributeId = 0x01;
43const int Nl80211AttributeBss::kTcpReportAttributeId = 0x23;
44const int Nl80211AttributeBss::kVendorSpecificAttributeId = 0xdd;
45
46static const char kSsidString[] = "SSID";
47static const char kRatesString[] = "Rates";
48
49Nl80211AttributeBss::Nl80211AttributeBss()
50 : NetlinkNestedAttribute(kName, kNameString) {
51 nested_template_.push_back(NestedData(NLA_U32, "__NL80211_BSS_INVALID",
52 false));
53 nested_template_.push_back(NestedData(NLA_UNSPEC, "NL80211_BSS_BSSID",
54 false));
55 nested_template_.push_back(NestedData(NLA_U32, "NL80211_BSS_FREQUENCY",
56 false));
57 nested_template_.push_back(NestedData(NLA_U64, "NL80211_BSS_TSF", false));
58 nested_template_.push_back(NestedData(NLA_U16, "NL80211_BSS_BEACON_INTERVAL",
59 false));
60 nested_template_.push_back(NestedData(NLA_U16, "NL80211_BSS_CAPABILITY",
61 false));
62 nested_template_.push_back(NestedData(
63 NLA_UNSPEC, "NL80211_BSS_INFORMATION_ELEMENTS", false,
64 Bind(&Nl80211AttributeBss::ParseInformationElements)));
65 nested_template_.push_back(NestedData(NLA_U32, "NL80211_BSS_SIGNAL_MBM",
66 false));
67 nested_template_.push_back(NestedData(NLA_U8, "NL80211_BSS_SIGNAL_UNSPEC",
68 false));
69 nested_template_.push_back(NestedData(NLA_U32, "NL80211_BSS_STATUS",
70 false));
71 nested_template_.push_back(NestedData(NLA_U32, "NL80211_BSS_SEEN_MS_AGO",
72 false));
73 nested_template_.push_back(NestedData(NLA_UNSPEC, "NL80211_BSS_BEACON_IES",
74 false));
75}
76
77bool Nl80211AttributeBss::ParseInformationElements(
78 AttributeList *attribute_list, size_t id, const string &attribute_name,
79 ByteString data) {
80 if (!attribute_list) {
81 LOG(ERROR) << "NULL |attribute_list| parameter";
82 return false;
83 }
84 attribute_list->CreateNestedAttribute(id, attribute_name.c_str());
85
86 // Now, handle the nested data.
87 AttributeListRefPtr ie_attribute;
88 if (!attribute_list->GetNestedAttributeList(id, &ie_attribute) ||
89 !ie_attribute) {
90 LOG(ERROR) << "Couldn't get attribute " << attribute_name
91 << " which we just created.";
92 return false;
93 }
94 while (data.GetLength()) {
95 const uint8_t *sub_attribute = data.GetConstData();
96 const size_t kHeaderBytes = 2;
97 uint8_t type = sub_attribute[0];
98 uint8_t payload_bytes = sub_attribute[1];
99 const uint8_t *payload = &sub_attribute[kHeaderBytes];
100 // See http://dox.ipxe.org/ieee80211_8h_source.html for more info on types
101 // and data inside information elements.
102 switch (type) {
103 case kSsidAttributeId: {
104 ie_attribute->CreateSsidAttribute(type, kSsidString);
105 if (payload_bytes == 0) {
106 ie_attribute->SetStringAttributeValue(type, "");
107 } else {
108 ie_attribute->SetStringAttributeValue(type, string(
109 reinterpret_cast<const char *>(payload), payload_bytes));
110 }
111 break;
112 }
113 case kSupportedRatesAttributeId:
114 case kExtendedRatesAttributeId: {
115 ie_attribute->CreateNestedAttribute(type, kRatesString);
116 AttributeListRefPtr rates_attribute;
117 if (!ie_attribute->GetNestedAttributeList(type, &rates_attribute) ||
118 !rates_attribute) {
119 LOG(ERROR) << "Couldn't get attribute " << attribute_name
120 << " which we just created.";
121 break;
122 }
123 // Extract each rate, add it to the list.
124 for (size_t i = 0; i < payload_bytes; ++i) {
125 string rate_name = StringPrintf("Rate-%zu", i);
126 rates_attribute->CreateU8Attribute(i, rate_name.c_str());
127 rates_attribute->SetU8AttributeValue(i, payload[i]);
128 }
129 ie_attribute->SetNestedAttributeHasAValue(type);
130 break;
131 }
132 case kDSParameterSetAttributeId:
133 case kCountryInfoAttributeId:
134 case kRequestAttributeId:
135 case kChallengeTextAttributeId:
136 case kPowerConstraintAttributeId:
137 case kPowerCapabilityAttributeId:
138 case kTcpReportAttributeId:
139 case kChannelsAttributeId:
140 case kErpAttributeId:
141 case kHtCapAttributeId:
142 case kRsnAttributeId:
143 case kHtInfoAttributeId:
144 case kVendorSpecificAttributeId:
145 default:
146 break;
147 }
148 data.RemovePrefix(kHeaderBytes + payload_bytes);
149 }
150 attribute_list->SetNestedAttributeHasAValue(id);
151 return true;
152}
153
Wade Guthrie1f355e82013-04-11 15:46:12 -0700154const int Nl80211AttributeWiphyBands::kName = NL80211_ATTR_WIPHY_BANDS;
155const char Nl80211AttributeWiphyBands::kNameString[] =
156 "NL80211_ATTR_WIPHY_BANDS";
157
158Nl80211AttributeWiphyBands::Nl80211AttributeWiphyBands()
159 : NetlinkNestedAttribute(kName, kNameString) {
160 // Frequencies
161 NestedData freq(NLA_NESTED, "NL80211_BAND_ATTR_FREQ", true);
162 freq.deeper_nesting.push_back(
163 NestedData(NLA_U32, "__NL80211_FREQUENCY_ATTR_INVALID", false));
164 freq.deeper_nesting.push_back(
165 NestedData(NLA_U32, "NL80211_FREQUENCY_ATTR_FREQ", false));
166 freq.deeper_nesting.push_back(
167 NestedData(NLA_FLAG, "NL80211_FREQUENCY_ATTR_DISABLED", false));
168 freq.deeper_nesting.push_back(
169 NestedData(NLA_FLAG, "NL80211_FREQUENCY_ATTR_PASSIVE_SCAN", false));
170 freq.deeper_nesting.push_back(
171 NestedData(NLA_FLAG, "NL80211_FREQUENCY_ATTR_NO_IBSS", false));
172 freq.deeper_nesting.push_back(
173 NestedData(NLA_FLAG, "NL80211_FREQUENCY_ATTR_RADAR", false));
174 freq.deeper_nesting.push_back(
175 NestedData(NLA_U32, "NL80211_FREQUENCY_ATTR_MAX_TX_POWER", false));
176
177 NestedData freqs(NLA_NESTED, "NL80211_BAND_ATTR_FREQS", false);
178 freqs.deeper_nesting.push_back(freq);
179
180 // Rates
181 NestedData rate(NLA_NESTED, "NL80211_BAND_ATTR_RATE", true);
182 rate.deeper_nesting.push_back(
183 NestedData(NLA_U32, "__NL80211_BITRATE_ATTR_INVALID", false));
184 rate.deeper_nesting.push_back(
185 NestedData(NLA_U32, "NL80211_BITRATE_ATTR_RATE", false));
186 rate.deeper_nesting.push_back(
187 NestedData(NLA_FLAG, "NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE", false));
188
189 NestedData rates(NLA_NESTED, "NL80211_BAND_ATTR_RATES", true);
190 rates.deeper_nesting.push_back(rate);
191
192 // Main body of attribute
193 NestedData bands(NLA_NESTED, "NL80211_ATTR_BANDS", true);
194 bands.deeper_nesting.push_back(
195 NestedData(NLA_U32, "__NL80211_BAND_ATTR_INVALID,", false));
196 bands.deeper_nesting.push_back(freqs);
197 bands.deeper_nesting.push_back(rates);
198 bands.deeper_nesting.push_back(
199 NestedData(NLA_UNSPEC, "NL80211_BAND_ATTR_HT_MCS_SET", false));
200 bands.deeper_nesting.push_back(
201 NestedData(NLA_U16, "NL80211_BAND_ATTR_HT_CAPA", false));
202 bands.deeper_nesting.push_back(
203 NestedData(NLA_U8, "NL80211_BAND_ATTR_HT_AMPDU_FACTOR", false));
204 bands.deeper_nesting.push_back(
205 NestedData(NLA_U8, "NL80211_BAND_ATTR_HT_AMPDU_DENSITY", false));
206
207 nested_template_.push_back(bands);
208}
209
210const int Nl80211AttributeCipherSuites::kName = NL80211_ATTR_CIPHER_SUITES;
211const char Nl80211AttributeCipherSuites::kNameString[] =
212 "NL80211_ATTR_CIPHER_SUITES";
213
214const int Nl80211AttributeControlPortEthertype::kName =
215 NL80211_ATTR_CONTROL_PORT_ETHERTYPE;
216const char Nl80211AttributeControlPortEthertype::kNameString[] =
217 "NL80211_ATTR_CONTROL_PORT_ETHERTYPE";
218
Wade Guthrie68da97c2013-02-26 13:09:35 -0800219const int Nl80211AttributeCqm::kName = NL80211_ATTR_CQM;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800220const char Nl80211AttributeCqm::kNameString[] = "NL80211_ATTR_CQM";
221
repo sync12cca802012-12-19 17:34:22 -0800222Nl80211AttributeCqm::Nl80211AttributeCqm()
Wade Guthrief1b36412013-04-11 14:51:31 -0700223 : NetlinkNestedAttribute(kName, kNameString) {
224 nested_template_.push_back(
225 NestedData(NLA_U32, "__NL80211_ATTR_CQM_INVALID", false));
226 nested_template_.push_back(
227 NestedData(NLA_U32, "NL80211_ATTR_CQM_RSSI_THOLD", false));
228 nested_template_.push_back(
229 NestedData(NLA_U32, "NL80211_ATTR_CQM_RSSI_HYST", false));
230 nested_template_.push_back(
231 NestedData(NLA_U32, "NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT", false));
232 nested_template_.push_back(
233 NestedData(NLA_U32, "NL80211_ATTR_CQM_PKT_LOSS_EVENT", false));
repo sync12cca802012-12-19 17:34:22 -0800234}
235
Wade Guthrie1f355e82013-04-11 15:46:12 -0700236const int Nl80211AttributeDeviceApSme::kName = NL80211_ATTR_DEVICE_AP_SME;
237const char Nl80211AttributeDeviceApSme::kNameString[] =
238 "NL80211_ATTR_DEVICE_AP_SME";
239
Wade Guthrief1b36412013-04-11 14:51:31 -0700240const int Nl80211AttributeDisconnectedByAp::kName =
241 NL80211_ATTR_DISCONNECTED_BY_AP;
242const char Nl80211AttributeDisconnectedByAp::kNameString[] =
243 "NL80211_ATTR_DISCONNECTED_BY_AP";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800244
Wade Guthrie68da97c2013-02-26 13:09:35 -0800245const int Nl80211AttributeDuration::kName = NL80211_ATTR_DURATION;
Wade Guthrie16196242012-11-20 15:53:52 -0800246const char Nl80211AttributeDuration::kNameString[] = "NL80211_ATTR_DURATION";
247
Wade Guthrie1f355e82013-04-11 15:46:12 -0700248const int Nl80211AttributeFeatureFlags::kName = NL80211_ATTR_FEATURE_FLAGS;
249const char Nl80211AttributeFeatureFlags::kNameString[] =
250 "NL80211_ATTR_FEATURE_FLAGS";
251
Wade Guthrie68da97c2013-02-26 13:09:35 -0800252const int Nl80211AttributeFrame::kName = NL80211_ATTR_FRAME;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800253const char Nl80211AttributeFrame::kNameString[] = "NL80211_ATTR_FRAME";
254
Wade Guthrie68da97c2013-02-26 13:09:35 -0800255const int Nl80211AttributeGeneration::kName = NL80211_ATTR_GENERATION;
Wade Guthrief54872f2013-04-11 15:11:50 -0700256const char Nl80211AttributeGeneration::kNameString[] =
257 "NL80211_ATTR_GENERATION";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800258
Wade Guthrie1f355e82013-04-11 15:46:12 -0700259const int Nl80211AttributeHtCapabilityMask::kName =
260 NL80211_ATTR_HT_CAPABILITY_MASK;
261const char Nl80211AttributeHtCapabilityMask::kNameString[] =
262 "NL80211_ATTR_HT_CAPABILITY_MASK";
263
Wade Guthrie68da97c2013-02-26 13:09:35 -0800264const int Nl80211AttributeIfindex::kName = NL80211_ATTR_IFINDEX;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800265const char Nl80211AttributeIfindex::kNameString[] = "NL80211_ATTR_IFINDEX";
266
Paul Stewart2ddf2c62013-04-16 09:47:34 -0700267const int Nl80211AttributeIftype::kName = NL80211_ATTR_IFTYPE;
268const char Nl80211AttributeIftype::kNameString[] = "NL80211_ATTR_IFTYPE";
269
Wade Guthrie68da97c2013-02-26 13:09:35 -0800270const int Nl80211AttributeKeyIdx::kName = NL80211_ATTR_KEY_IDX;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800271const char Nl80211AttributeKeyIdx::kNameString[] = "NL80211_ATTR_KEY_IDX";
272
Wade Guthrie68da97c2013-02-26 13:09:35 -0800273const int Nl80211AttributeKeySeq::kName = NL80211_ATTR_KEY_SEQ;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800274const char Nl80211AttributeKeySeq::kNameString[] = "NL80211_ATTR_KEY_SEQ";
275
Wade Guthrie68da97c2013-02-26 13:09:35 -0800276const int Nl80211AttributeKeyType::kName = NL80211_ATTR_KEY_TYPE;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800277const char Nl80211AttributeKeyType::kNameString[] = "NL80211_ATTR_KEY_TYPE";
278
Wade Guthrie68da97c2013-02-26 13:09:35 -0800279const int Nl80211AttributeMac::kName = NL80211_ATTR_MAC;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800280const char Nl80211AttributeMac::kNameString[] = "NL80211_ATTR_MAC";
281
Wade Guthrie2193b232013-06-05 17:09:07 -0700282bool Nl80211AttributeMac::ToString(std::string *value) const {
283 if (!value) {
284 LOG(ERROR) << "Null |value| parameter";
285 return false;
286 }
287 *value = StringFromMacAddress(data_.GetConstData());
288 return true;
289}
290
291// static
292string Nl80211AttributeMac::StringFromMacAddress(const uint8_t *arg) {
293 string output;
294
295 if (!arg) {
296 static const char kBogusMacAddress[] = "XX:XX:XX:XX:XX:XX";
297 output = kBogusMacAddress;
298 LOG(ERROR) << "|arg| parameter is NULL.";
299 } else {
300 output = StringPrintf("%02x:%02x:%02x:%02x:%02x:%02x",
301 arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]);
302 }
303 return output;
304}
305
Wade Guthrie1f355e82013-04-11 15:46:12 -0700306const int Nl80211AttributeMaxMatchSets::kName = NL80211_ATTR_MAX_MATCH_SETS;
307const char Nl80211AttributeMaxMatchSets::kNameString[] =
308 "NL80211_ATTR_MAX_MATCH_SETS";
309
310const int Nl80211AttributeMaxNumPmkids::kName = NL80211_ATTR_MAX_NUM_PMKIDS;
311const char Nl80211AttributeMaxNumPmkids::kNameString[] =
312 "NL80211_ATTR_MAX_NUM_PMKIDS";
313
314const int Nl80211AttributeMaxNumScanSsids::kName =
315 NL80211_ATTR_MAX_NUM_SCAN_SSIDS;
316const char Nl80211AttributeMaxNumScanSsids::kNameString[] =
317 "NL80211_ATTR_MAX_NUM_SCAN_SSIDS";
318
319const int Nl80211AttributeMaxNumSchedScanSsids::kName =
320 NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS;
321const char Nl80211AttributeMaxNumSchedScanSsids::kNameString[] =
322 "NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS";
323
324const int Nl80211AttributeMaxRemainOnChannelDuration::kName =
325 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION;
326const char Nl80211AttributeMaxRemainOnChannelDuration::kNameString[] =
327 "NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION";
328
329const int Nl80211AttributeMaxScanIeLen::kName = NL80211_ATTR_MAX_SCAN_IE_LEN;
330const char Nl80211AttributeMaxScanIeLen::kNameString[] =
331 "NL80211_ATTR_MAX_SCAN_IE_LEN";
332
333const int Nl80211AttributeMaxSchedScanIeLen::kName =
334 NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN;
335const char Nl80211AttributeMaxSchedScanIeLen::kNameString[] =
336 "NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN";
337
338const int Nl80211AttributeOffchannelTxOk::kName = NL80211_ATTR_OFFCHANNEL_TX_OK;
339const char Nl80211AttributeOffchannelTxOk::kNameString[] =
340 "NL80211_ATTR_OFFCHANNEL_TX_OK";
341
342const int Nl80211AttributeProbeRespOffload::kName =
343 NL80211_ATTR_PROBE_RESP_OFFLOAD;
344const char Nl80211AttributeProbeRespOffload::kNameString[] =
345 "NL80211_ATTR_PROBE_RESP_OFFLOAD";
346
Wade Guthrief1b36412013-04-11 14:51:31 -0700347const int Nl80211AttributeReasonCode::kName =
348 NL80211_ATTR_REASON_CODE;
349const char Nl80211AttributeReasonCode::kNameString[] =
350 "NL80211_ATTR_REASON_CODE";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800351
Wade Guthrie68da97c2013-02-26 13:09:35 -0800352const int Nl80211AttributeRegAlpha2::kName = NL80211_ATTR_REG_ALPHA2;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800353const char Nl80211AttributeRegAlpha2::kNameString[] = "NL80211_ATTR_REG_ALPHA2";
354
Wade Guthrief1b36412013-04-11 14:51:31 -0700355const int Nl80211AttributeRegInitiator::kName =
356 NL80211_ATTR_REG_INITIATOR;
357const char Nl80211AttributeRegInitiator::kNameString[] =
358 "NL80211_ATTR_REG_INITIATOR";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800359
Wade Guthrie68da97c2013-02-26 13:09:35 -0800360const int Nl80211AttributeRegType::kName = NL80211_ATTR_REG_TYPE;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800361const char Nl80211AttributeRegType::kNameString[] = "NL80211_ATTR_REG_TYPE";
362
Wade Guthrie68da97c2013-02-26 13:09:35 -0800363const int Nl80211AttributeRespIe::kName = NL80211_ATTR_RESP_IE;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800364const char Nl80211AttributeRespIe::kNameString[] = "NL80211_ATTR_RESP_IE";
365
Wade Guthrie1f355e82013-04-11 15:46:12 -0700366const int Nl80211AttributeRoamSupport::kName = NL80211_ATTR_ROAM_SUPPORT;
367const char Nl80211AttributeRoamSupport::kNameString[] =
368 "NL80211_ATTR_ROAM_SUPPORT";
369
Wade Guthrief1b36412013-04-11 14:51:31 -0700370const int Nl80211AttributeScanFrequencies::kName =
371 NL80211_ATTR_SCAN_FREQUENCIES;
372const char Nl80211AttributeScanFrequencies::kNameString[] =
373 "NL80211_ATTR_SCAN_FREQUENCIES";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800374
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800375Nl80211AttributeScanFrequencies::Nl80211AttributeScanFrequencies()
Wade Guthrief1b36412013-04-11 14:51:31 -0700376 : NetlinkNestedAttribute(kName, kNameString) {
377 nested_template_.push_back(
378 NestedData(NLA_U32, "NL80211_SCAN_FREQ", true));
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800379}
380
Wade Guthrie68da97c2013-02-26 13:09:35 -0800381const int Nl80211AttributeScanSsids::kName = NL80211_ATTR_SCAN_SSIDS;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800382const char Nl80211AttributeScanSsids::kNameString[] = "NL80211_ATTR_SCAN_SSIDS";
383
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800384Nl80211AttributeScanSsids::Nl80211AttributeScanSsids()
Wade Guthrief1b36412013-04-11 14:51:31 -0700385 : NetlinkNestedAttribute(kName, kNameString) {
386 nested_template_.push_back(
387 NestedData(NLA_STRING, "NL80211_SCAN_SSID", true));
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800388}
389
Wade Guthrie68da97c2013-02-26 13:09:35 -0800390const int Nl80211AttributeStaInfo::kName = NL80211_ATTR_STA_INFO;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800391const char Nl80211AttributeStaInfo::kNameString[] = "NL80211_ATTR_STA_INFO";
392
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800393Nl80211AttributeStaInfo::Nl80211AttributeStaInfo()
Wade Guthrief1b36412013-04-11 14:51:31 -0700394 : NetlinkNestedAttribute(kName, kNameString) {
Wade Guthrief1b36412013-04-11 14:51:31 -0700395 NestedData tx_rates(NLA_NESTED, "NL80211_STA_INFO_TX_BITRATE", false);
396 tx_rates.deeper_nesting.push_back(
397 NestedData(NLA_U32, "__NL80211_RATE_INFO_INVALID", false));
398 tx_rates.deeper_nesting.push_back(
399 NestedData(NLA_U16, "NL80211_RATE_INFO_BITRATE", false));
400 tx_rates.deeper_nesting.push_back(
401 NestedData(NLA_U8, "NL80211_RATE_INFO_MCS", false));
402 tx_rates.deeper_nesting.push_back(
403 NestedData(NLA_FLAG, "NL80211_RATE_INFO_40_MHZ_WIDTH", false));
404 tx_rates.deeper_nesting.push_back(
405 NestedData(NLA_FLAG, "NL80211_RATE_INFO_SHORT_GI", false));
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800406
Wade Guthrief1b36412013-04-11 14:51:31 -0700407 NestedData rx_rates(NLA_NESTED, "NL80211_STA_INFO_RX_BITRATE", false);
408 rx_rates.deeper_nesting = tx_rates.deeper_nesting;
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800409
Wade Guthrief1b36412013-04-11 14:51:31 -0700410 NestedData bss(NLA_NESTED, "NL80211_STA_INFO_BSS_PARAM", false);
411 bss.deeper_nesting.push_back(
412 NestedData(NLA_U32, "__NL80211_STA_BSS_PARAM_INVALID", false));
413 bss.deeper_nesting.push_back(
414 NestedData(NLA_FLAG, "NL80211_STA_BSS_PARAM_CTS_PROT", false));
415 bss.deeper_nesting.push_back(
416 NestedData(NLA_FLAG, "NL80211_STA_BSS_PARAM_SHORT_PREAMBLE",
417 false));
418 bss.deeper_nesting.push_back(
419 NestedData(NLA_FLAG, "NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME",
420 false));
421 bss.deeper_nesting.push_back(
422 NestedData(NLA_U8, "NL80211_STA_BSS_PARAM_DTIM_PERIOD", false));
423 bss.deeper_nesting.push_back(
424 NestedData(NLA_U16, "NL80211_STA_BSS_PARAM_BEACON_INTERVAL", false));
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800425
Wade Guthrief1b36412013-04-11 14:51:31 -0700426 nested_template_.push_back(
427 NestedData(NLA_U32, "__NL80211_STA_INFO_INVALID", false));
428 nested_template_.push_back(
429 NestedData(NLA_U32, "NL80211_STA_INFO_INACTIVE_TIME", false));
430 nested_template_.push_back(
431 NestedData(NLA_U32, "NL80211_STA_INFO_RX_BYTES", false));
432 nested_template_.push_back(
433 NestedData(NLA_U32, "NL80211_STA_INFO_TX_BYTES", false));
434 nested_template_.push_back(
435 NestedData(NLA_U16, "NL80211_STA_INFO_LLID", false));
436 nested_template_.push_back(
437 NestedData(NLA_U16, "NL80211_STA_INFO_PLID", false));
438 nested_template_.push_back(
439 NestedData(NLA_U8, "NL80211_STA_INFO_PLINK_STATE", false));
440 nested_template_.push_back(
441 NestedData(NLA_U8, "NL80211_STA_INFO_SIGNAL", false));
442 nested_template_.push_back(tx_rates);
443 nested_template_.push_back(
444 NestedData(NLA_U32, "NL80211_STA_INFO_RX_PACKETS", false));
445 nested_template_.push_back(
446 NestedData(NLA_U32, "NL80211_STA_INFO_TX_PACKETS", false));
447 nested_template_.push_back(
448 NestedData(NLA_U32, "NL80211_STA_INFO_TX_RETRIES", false));
449 nested_template_.push_back(
450 NestedData(NLA_U32, "NL80211_STA_INFO_TX_FAILED", false));
451 nested_template_.push_back(
452 NestedData(NLA_U8, "NL80211_STA_INFO_SIGNAL_AVG", false));
453 nested_template_.push_back(rx_rates);
454 nested_template_.push_back(bss);
455 nested_template_.push_back(
456 NestedData(NLA_U32, "NL80211_STA_INFO_CONNECTED_TIME", false));
457 nested_template_.push_back(
458 NestedData(NLA_U64, "NL80211_STA_INFO_STA_FLAGS", false));
459 nested_template_.push_back(
460 NestedData(NLA_U32, "NL80211_STA_INFO_BEACON_LOSS", false));
repo sync12cca802012-12-19 17:34:22 -0800461}
462
Wade Guthrief1b36412013-04-11 14:51:31 -0700463const int Nl80211AttributeStatusCode::kName =
464 NL80211_ATTR_STATUS_CODE;
465const char Nl80211AttributeStatusCode::kNameString[] =
466 "NL80211_ATTR_STATUS_CODE";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800467
Wade Guthrie1f355e82013-04-11 15:46:12 -0700468const int Nl80211AttributeSupportApUapsd::kName = NL80211_ATTR_SUPPORT_AP_UAPSD;
469const char Nl80211AttributeSupportApUapsd::kNameString[] =
470 "NL80211_ATTR_SUPPORT_AP_UAPSD";
471
472const int Nl80211AttributeSupportIbssRsn::kName = NL80211_ATTR_SUPPORT_IBSS_RSN;
473const char Nl80211AttributeSupportIbssRsn::kNameString[] =
474 "NL80211_ATTR_SUPPORT_IBSS_RSN";
475
Wade Guthrief1b36412013-04-11 14:51:31 -0700476const int Nl80211AttributeSupportMeshAuth::kName =
477 NL80211_ATTR_SUPPORT_MESH_AUTH;
478const char Nl80211AttributeSupportMeshAuth::kNameString[] =
479 "NL80211_ATTR_SUPPORT_MESH_AUTH";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800480
Wade Guthrie1f355e82013-04-11 15:46:12 -0700481const int Nl80211AttributeTdlsExternalSetup::kName =
482 NL80211_ATTR_TDLS_EXTERNAL_SETUP;
483const char Nl80211AttributeTdlsExternalSetup::kNameString[] =
484 "NL80211_ATTR_TDLS_EXTERNAL_SETUP";
485
486const int Nl80211AttributeTdlsSupport::kName = NL80211_ATTR_TDLS_SUPPORT;
487const char Nl80211AttributeTdlsSupport::kNameString[] =
488 "NL80211_ATTR_TDLS_SUPPORT";
489
Wade Guthrie68da97c2013-02-26 13:09:35 -0800490const int Nl80211AttributeTimedOut::kName = NL80211_ATTR_TIMED_OUT;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800491const char Nl80211AttributeTimedOut::kNameString[] = "NL80211_ATTR_TIMED_OUT";
492
Wade Guthrie1f355e82013-04-11 15:46:12 -0700493const int Nl80211AttributeWiphyAntennaAvailRx::kName =
494 NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX;
495const char Nl80211AttributeWiphyAntennaAvailRx::kNameString[] =
496 "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX";
497
498const int Nl80211AttributeWiphyAntennaAvailTx::kName =
499 NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX;
500const char Nl80211AttributeWiphyAntennaAvailTx::kNameString[] =
501 "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX";
502
503const int Nl80211AttributeWiphyAntennaRx::kName = NL80211_ATTR_WIPHY_ANTENNA_RX;
504const char Nl80211AttributeWiphyAntennaRx::kNameString[] =
505 "NL80211_ATTR_WIPHY_ANTENNA_RX";
506
507const int Nl80211AttributeWiphyAntennaTx::kName = NL80211_ATTR_WIPHY_ANTENNA_TX;
508const char Nl80211AttributeWiphyAntennaTx::kNameString[] =
509 "NL80211_ATTR_WIPHY_ANTENNA_TX";
510
511const int Nl80211AttributeWiphyCoverageClass::kName =
512 NL80211_ATTR_WIPHY_COVERAGE_CLASS;
513const char Nl80211AttributeWiphyCoverageClass::kNameString[] =
514 "NL80211_ATTR_WIPHY_COVERAGE_CLASS";
515
516const int Nl80211AttributeWiphyFragThreshold::kName =
517 NL80211_ATTR_WIPHY_FRAG_THRESHOLD;
518const char Nl80211AttributeWiphyFragThreshold::kNameString[] =
519 "NL80211_ATTR_WIPHY_FRAG_THRESHOLD";
520
Wade Guthrie68da97c2013-02-26 13:09:35 -0800521const int Nl80211AttributeWiphyFreq::kName = NL80211_ATTR_WIPHY_FREQ;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800522const char Nl80211AttributeWiphyFreq::kNameString[] = "NL80211_ATTR_WIPHY_FREQ";
523
Wade Guthrie68da97c2013-02-26 13:09:35 -0800524const int Nl80211AttributeWiphy::kName = NL80211_ATTR_WIPHY;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800525const char Nl80211AttributeWiphy::kNameString[] = "NL80211_ATTR_WIPHY";
526
Wade Guthrie68da97c2013-02-26 13:09:35 -0800527const int Nl80211AttributeWiphyName::kName = NL80211_ATTR_WIPHY_NAME;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800528const char Nl80211AttributeWiphyName::kNameString[] = "NL80211_ATTR_WIPHY_NAME";
529
Wade Guthrie1f355e82013-04-11 15:46:12 -0700530const int Nl80211AttributeWiphyRetryLong::kName = NL80211_ATTR_WIPHY_RETRY_LONG;
531const char Nl80211AttributeWiphyRetryLong::kNameString[] =
532 "NL80211_ATTR_WIPHY_RETRY_LONG";
533
534const int Nl80211AttributeWiphyRetryShort::kName =
535 NL80211_ATTR_WIPHY_RETRY_SHORT;
536const char Nl80211AttributeWiphyRetryShort::kNameString[] =
537 "NL80211_ATTR_WIPHY_RETRY_SHORT";
538
539const int Nl80211AttributeWiphyRtsThreshold::kName =
540 NL80211_ATTR_WIPHY_RTS_THRESHOLD;
541const char Nl80211AttributeWiphyRtsThreshold::kNameString[] =
542 "NL80211_ATTR_WIPHY_RTS_THRESHOLD";
543
Wade Guthrie16196242012-11-20 15:53:52 -0800544} // namespace shill