blob: 089df3cf529355e98e9f764ae2c082824f5ab551 [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;
18using base::StringPrintf;
19using std::string;
20
Wade Guthrie16196242012-11-20 15:53:52 -080021namespace shill {
22
Wade Guthrie68da97c2013-02-26 13:09:35 -080023const int Nl80211AttributeCookie::kName = NL80211_ATTR_COOKIE;
Wade Guthrie25cdb382012-12-04 14:04:05 -080024const char Nl80211AttributeCookie::kNameString[] = "NL80211_ATTR_COOKIE";
25
Wade Guthrief54872f2013-04-11 15:11:50 -070026const int Nl80211AttributeBss::kName = NL80211_ATTR_BSS;
27const char Nl80211AttributeBss::kNameString[] = "NL80211_ATTR_BSS";
28const int Nl80211AttributeBss::kChannelsAttributeId = 0x24;
29const int Nl80211AttributeBss::kChallengeTextAttributeId = 0x10;
30const int Nl80211AttributeBss::kCountryInfoAttributeId = 0x07;
31const int Nl80211AttributeBss::kDSParameterSetAttributeId = 0x03;
32const int Nl80211AttributeBss::kErpAttributeId = 0x2a;
33const int Nl80211AttributeBss::kExtendedRatesAttributeId = 0x32;
34const int Nl80211AttributeBss::kHtCapAttributeId = 0x2d;
35const int Nl80211AttributeBss::kHtInfoAttributeId = 0x3d;
36const int Nl80211AttributeBss::kPowerCapabilityAttributeId = 0x21;
37const int Nl80211AttributeBss::kPowerConstraintAttributeId = 0x20;
38const int Nl80211AttributeBss::kRequestAttributeId = 0x0a;
39const int Nl80211AttributeBss::kRsnAttributeId = 0x30;
40const int Nl80211AttributeBss::kSsidAttributeId = 0x00;
41const int Nl80211AttributeBss::kSupportedRatesAttributeId = 0x01;
42const int Nl80211AttributeBss::kTcpReportAttributeId = 0x23;
43const int Nl80211AttributeBss::kVendorSpecificAttributeId = 0xdd;
44
45static const char kSsidString[] = "SSID";
46static const char kRatesString[] = "Rates";
47
48Nl80211AttributeBss::Nl80211AttributeBss()
49 : NetlinkNestedAttribute(kName, kNameString) {
50 nested_template_.push_back(NestedData(NLA_U32, "__NL80211_BSS_INVALID",
51 false));
52 nested_template_.push_back(NestedData(NLA_UNSPEC, "NL80211_BSS_BSSID",
53 false));
54 nested_template_.push_back(NestedData(NLA_U32, "NL80211_BSS_FREQUENCY",
55 false));
56 nested_template_.push_back(NestedData(NLA_U64, "NL80211_BSS_TSF", false));
57 nested_template_.push_back(NestedData(NLA_U16, "NL80211_BSS_BEACON_INTERVAL",
58 false));
59 nested_template_.push_back(NestedData(NLA_U16, "NL80211_BSS_CAPABILITY",
60 false));
61 nested_template_.push_back(NestedData(
62 NLA_UNSPEC, "NL80211_BSS_INFORMATION_ELEMENTS", false,
63 Bind(&Nl80211AttributeBss::ParseInformationElements)));
64 nested_template_.push_back(NestedData(NLA_U32, "NL80211_BSS_SIGNAL_MBM",
65 false));
66 nested_template_.push_back(NestedData(NLA_U8, "NL80211_BSS_SIGNAL_UNSPEC",
67 false));
68 nested_template_.push_back(NestedData(NLA_U32, "NL80211_BSS_STATUS",
69 false));
70 nested_template_.push_back(NestedData(NLA_U32, "NL80211_BSS_SEEN_MS_AGO",
71 false));
72 nested_template_.push_back(NestedData(NLA_UNSPEC, "NL80211_BSS_BEACON_IES",
73 false));
74}
75
76bool Nl80211AttributeBss::ParseInformationElements(
77 AttributeList *attribute_list, size_t id, const string &attribute_name,
78 ByteString data) {
79 if (!attribute_list) {
80 LOG(ERROR) << "NULL |attribute_list| parameter";
81 return false;
82 }
83 attribute_list->CreateNestedAttribute(id, attribute_name.c_str());
84
85 // Now, handle the nested data.
86 AttributeListRefPtr ie_attribute;
87 if (!attribute_list->GetNestedAttributeList(id, &ie_attribute) ||
88 !ie_attribute) {
89 LOG(ERROR) << "Couldn't get attribute " << attribute_name
90 << " which we just created.";
91 return false;
92 }
93 while (data.GetLength()) {
94 const uint8_t *sub_attribute = data.GetConstData();
95 const size_t kHeaderBytes = 2;
96 uint8_t type = sub_attribute[0];
97 uint8_t payload_bytes = sub_attribute[1];
98 const uint8_t *payload = &sub_attribute[kHeaderBytes];
99 // See http://dox.ipxe.org/ieee80211_8h_source.html for more info on types
100 // and data inside information elements.
101 switch (type) {
102 case kSsidAttributeId: {
103 ie_attribute->CreateSsidAttribute(type, kSsidString);
104 if (payload_bytes == 0) {
105 ie_attribute->SetStringAttributeValue(type, "");
106 } else {
107 ie_attribute->SetStringAttributeValue(type, string(
108 reinterpret_cast<const char *>(payload), payload_bytes));
109 }
110 break;
111 }
112 case kSupportedRatesAttributeId:
113 case kExtendedRatesAttributeId: {
114 ie_attribute->CreateNestedAttribute(type, kRatesString);
115 AttributeListRefPtr rates_attribute;
116 if (!ie_attribute->GetNestedAttributeList(type, &rates_attribute) ||
117 !rates_attribute) {
118 LOG(ERROR) << "Couldn't get attribute " << attribute_name
119 << " which we just created.";
120 break;
121 }
122 // Extract each rate, add it to the list.
123 for (size_t i = 0; i < payload_bytes; ++i) {
124 string rate_name = StringPrintf("Rate-%zu", i);
125 rates_attribute->CreateU8Attribute(i, rate_name.c_str());
126 rates_attribute->SetU8AttributeValue(i, payload[i]);
127 }
128 ie_attribute->SetNestedAttributeHasAValue(type);
129 break;
130 }
131 case kDSParameterSetAttributeId:
132 case kCountryInfoAttributeId:
133 case kRequestAttributeId:
134 case kChallengeTextAttributeId:
135 case kPowerConstraintAttributeId:
136 case kPowerCapabilityAttributeId:
137 case kTcpReportAttributeId:
138 case kChannelsAttributeId:
139 case kErpAttributeId:
140 case kHtCapAttributeId:
141 case kRsnAttributeId:
142 case kHtInfoAttributeId:
143 case kVendorSpecificAttributeId:
144 default:
145 break;
146 }
147 data.RemovePrefix(kHeaderBytes + payload_bytes);
148 }
149 attribute_list->SetNestedAttributeHasAValue(id);
150 return true;
151}
152
Wade Guthrie1f355e82013-04-11 15:46:12 -0700153const int Nl80211AttributeWiphyBands::kName = NL80211_ATTR_WIPHY_BANDS;
154const char Nl80211AttributeWiphyBands::kNameString[] =
155 "NL80211_ATTR_WIPHY_BANDS";
156
157Nl80211AttributeWiphyBands::Nl80211AttributeWiphyBands()
158 : NetlinkNestedAttribute(kName, kNameString) {
159 // Frequencies
160 NestedData freq(NLA_NESTED, "NL80211_BAND_ATTR_FREQ", true);
161 freq.deeper_nesting.push_back(
162 NestedData(NLA_U32, "__NL80211_FREQUENCY_ATTR_INVALID", false));
163 freq.deeper_nesting.push_back(
164 NestedData(NLA_U32, "NL80211_FREQUENCY_ATTR_FREQ", false));
165 freq.deeper_nesting.push_back(
166 NestedData(NLA_FLAG, "NL80211_FREQUENCY_ATTR_DISABLED", false));
167 freq.deeper_nesting.push_back(
168 NestedData(NLA_FLAG, "NL80211_FREQUENCY_ATTR_PASSIVE_SCAN", false));
169 freq.deeper_nesting.push_back(
170 NestedData(NLA_FLAG, "NL80211_FREQUENCY_ATTR_NO_IBSS", false));
171 freq.deeper_nesting.push_back(
172 NestedData(NLA_FLAG, "NL80211_FREQUENCY_ATTR_RADAR", false));
173 freq.deeper_nesting.push_back(
174 NestedData(NLA_U32, "NL80211_FREQUENCY_ATTR_MAX_TX_POWER", false));
175
176 NestedData freqs(NLA_NESTED, "NL80211_BAND_ATTR_FREQS", false);
177 freqs.deeper_nesting.push_back(freq);
178
179 // Rates
180 NestedData rate(NLA_NESTED, "NL80211_BAND_ATTR_RATE", true);
181 rate.deeper_nesting.push_back(
182 NestedData(NLA_U32, "__NL80211_BITRATE_ATTR_INVALID", false));
183 rate.deeper_nesting.push_back(
184 NestedData(NLA_U32, "NL80211_BITRATE_ATTR_RATE", false));
185 rate.deeper_nesting.push_back(
186 NestedData(NLA_FLAG, "NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE", false));
187
188 NestedData rates(NLA_NESTED, "NL80211_BAND_ATTR_RATES", true);
189 rates.deeper_nesting.push_back(rate);
190
191 // Main body of attribute
192 NestedData bands(NLA_NESTED, "NL80211_ATTR_BANDS", true);
193 bands.deeper_nesting.push_back(
194 NestedData(NLA_U32, "__NL80211_BAND_ATTR_INVALID,", false));
195 bands.deeper_nesting.push_back(freqs);
196 bands.deeper_nesting.push_back(rates);
197 bands.deeper_nesting.push_back(
198 NestedData(NLA_UNSPEC, "NL80211_BAND_ATTR_HT_MCS_SET", false));
199 bands.deeper_nesting.push_back(
200 NestedData(NLA_U16, "NL80211_BAND_ATTR_HT_CAPA", false));
201 bands.deeper_nesting.push_back(
202 NestedData(NLA_U8, "NL80211_BAND_ATTR_HT_AMPDU_FACTOR", false));
203 bands.deeper_nesting.push_back(
204 NestedData(NLA_U8, "NL80211_BAND_ATTR_HT_AMPDU_DENSITY", false));
205
206 nested_template_.push_back(bands);
207}
208
209const int Nl80211AttributeCipherSuites::kName = NL80211_ATTR_CIPHER_SUITES;
210const char Nl80211AttributeCipherSuites::kNameString[] =
211 "NL80211_ATTR_CIPHER_SUITES";
212
213const int Nl80211AttributeControlPortEthertype::kName =
214 NL80211_ATTR_CONTROL_PORT_ETHERTYPE;
215const char Nl80211AttributeControlPortEthertype::kNameString[] =
216 "NL80211_ATTR_CONTROL_PORT_ETHERTYPE";
217
Wade Guthrie68da97c2013-02-26 13:09:35 -0800218const int Nl80211AttributeCqm::kName = NL80211_ATTR_CQM;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800219const char Nl80211AttributeCqm::kNameString[] = "NL80211_ATTR_CQM";
220
repo sync12cca802012-12-19 17:34:22 -0800221Nl80211AttributeCqm::Nl80211AttributeCqm()
Wade Guthrief1b36412013-04-11 14:51:31 -0700222 : NetlinkNestedAttribute(kName, kNameString) {
223 nested_template_.push_back(
224 NestedData(NLA_U32, "__NL80211_ATTR_CQM_INVALID", false));
225 nested_template_.push_back(
226 NestedData(NLA_U32, "NL80211_ATTR_CQM_RSSI_THOLD", false));
227 nested_template_.push_back(
228 NestedData(NLA_U32, "NL80211_ATTR_CQM_RSSI_HYST", false));
229 nested_template_.push_back(
230 NestedData(NLA_U32, "NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT", false));
231 nested_template_.push_back(
232 NestedData(NLA_U32, "NL80211_ATTR_CQM_PKT_LOSS_EVENT", false));
repo sync12cca802012-12-19 17:34:22 -0800233}
234
Wade Guthrie1f355e82013-04-11 15:46:12 -0700235const int Nl80211AttributeDeviceApSme::kName = NL80211_ATTR_DEVICE_AP_SME;
236const char Nl80211AttributeDeviceApSme::kNameString[] =
237 "NL80211_ATTR_DEVICE_AP_SME";
238
Wade Guthrief1b36412013-04-11 14:51:31 -0700239const int Nl80211AttributeDisconnectedByAp::kName =
240 NL80211_ATTR_DISCONNECTED_BY_AP;
241const char Nl80211AttributeDisconnectedByAp::kNameString[] =
242 "NL80211_ATTR_DISCONNECTED_BY_AP";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800243
Wade Guthrie68da97c2013-02-26 13:09:35 -0800244const int Nl80211AttributeDuration::kName = NL80211_ATTR_DURATION;
Wade Guthrie16196242012-11-20 15:53:52 -0800245const char Nl80211AttributeDuration::kNameString[] = "NL80211_ATTR_DURATION";
246
Wade Guthrie1f355e82013-04-11 15:46:12 -0700247const int Nl80211AttributeFeatureFlags::kName = NL80211_ATTR_FEATURE_FLAGS;
248const char Nl80211AttributeFeatureFlags::kNameString[] =
249 "NL80211_ATTR_FEATURE_FLAGS";
250
Wade Guthrie68da97c2013-02-26 13:09:35 -0800251const int Nl80211AttributeFrame::kName = NL80211_ATTR_FRAME;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800252const char Nl80211AttributeFrame::kNameString[] = "NL80211_ATTR_FRAME";
253
Wade Guthrie68da97c2013-02-26 13:09:35 -0800254const int Nl80211AttributeGeneration::kName = NL80211_ATTR_GENERATION;
Wade Guthrief54872f2013-04-11 15:11:50 -0700255const char Nl80211AttributeGeneration::kNameString[] =
256 "NL80211_ATTR_GENERATION";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800257
Wade Guthrie1f355e82013-04-11 15:46:12 -0700258const int Nl80211AttributeHtCapabilityMask::kName =
259 NL80211_ATTR_HT_CAPABILITY_MASK;
260const char Nl80211AttributeHtCapabilityMask::kNameString[] =
261 "NL80211_ATTR_HT_CAPABILITY_MASK";
262
Wade Guthrie68da97c2013-02-26 13:09:35 -0800263const int Nl80211AttributeIfindex::kName = NL80211_ATTR_IFINDEX;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800264const char Nl80211AttributeIfindex::kNameString[] = "NL80211_ATTR_IFINDEX";
265
Paul Stewart2ddf2c62013-04-16 09:47:34 -0700266const int Nl80211AttributeIftype::kName = NL80211_ATTR_IFTYPE;
267const char Nl80211AttributeIftype::kNameString[] = "NL80211_ATTR_IFTYPE";
268
Wade Guthrie68da97c2013-02-26 13:09:35 -0800269const int Nl80211AttributeKeyIdx::kName = NL80211_ATTR_KEY_IDX;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800270const char Nl80211AttributeKeyIdx::kNameString[] = "NL80211_ATTR_KEY_IDX";
271
Wade Guthrie68da97c2013-02-26 13:09:35 -0800272const int Nl80211AttributeKeySeq::kName = NL80211_ATTR_KEY_SEQ;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800273const char Nl80211AttributeKeySeq::kNameString[] = "NL80211_ATTR_KEY_SEQ";
274
Wade Guthrie68da97c2013-02-26 13:09:35 -0800275const int Nl80211AttributeKeyType::kName = NL80211_ATTR_KEY_TYPE;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800276const char Nl80211AttributeKeyType::kNameString[] = "NL80211_ATTR_KEY_TYPE";
277
Wade Guthrie68da97c2013-02-26 13:09:35 -0800278const int Nl80211AttributeMac::kName = NL80211_ATTR_MAC;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800279const char Nl80211AttributeMac::kNameString[] = "NL80211_ATTR_MAC";
280
Wade Guthrie1f355e82013-04-11 15:46:12 -0700281const int Nl80211AttributeMaxMatchSets::kName = NL80211_ATTR_MAX_MATCH_SETS;
282const char Nl80211AttributeMaxMatchSets::kNameString[] =
283 "NL80211_ATTR_MAX_MATCH_SETS";
284
285const int Nl80211AttributeMaxNumPmkids::kName = NL80211_ATTR_MAX_NUM_PMKIDS;
286const char Nl80211AttributeMaxNumPmkids::kNameString[] =
287 "NL80211_ATTR_MAX_NUM_PMKIDS";
288
289const int Nl80211AttributeMaxNumScanSsids::kName =
290 NL80211_ATTR_MAX_NUM_SCAN_SSIDS;
291const char Nl80211AttributeMaxNumScanSsids::kNameString[] =
292 "NL80211_ATTR_MAX_NUM_SCAN_SSIDS";
293
294const int Nl80211AttributeMaxNumSchedScanSsids::kName =
295 NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS;
296const char Nl80211AttributeMaxNumSchedScanSsids::kNameString[] =
297 "NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS";
298
299const int Nl80211AttributeMaxRemainOnChannelDuration::kName =
300 NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION;
301const char Nl80211AttributeMaxRemainOnChannelDuration::kNameString[] =
302 "NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION";
303
304const int Nl80211AttributeMaxScanIeLen::kName = NL80211_ATTR_MAX_SCAN_IE_LEN;
305const char Nl80211AttributeMaxScanIeLen::kNameString[] =
306 "NL80211_ATTR_MAX_SCAN_IE_LEN";
307
308const int Nl80211AttributeMaxSchedScanIeLen::kName =
309 NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN;
310const char Nl80211AttributeMaxSchedScanIeLen::kNameString[] =
311 "NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN";
312
313const int Nl80211AttributeOffchannelTxOk::kName = NL80211_ATTR_OFFCHANNEL_TX_OK;
314const char Nl80211AttributeOffchannelTxOk::kNameString[] =
315 "NL80211_ATTR_OFFCHANNEL_TX_OK";
316
317const int Nl80211AttributeProbeRespOffload::kName =
318 NL80211_ATTR_PROBE_RESP_OFFLOAD;
319const char Nl80211AttributeProbeRespOffload::kNameString[] =
320 "NL80211_ATTR_PROBE_RESP_OFFLOAD";
321
Wade Guthrief1b36412013-04-11 14:51:31 -0700322const int Nl80211AttributeReasonCode::kName =
323 NL80211_ATTR_REASON_CODE;
324const char Nl80211AttributeReasonCode::kNameString[] =
325 "NL80211_ATTR_REASON_CODE";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800326
Wade Guthrie68da97c2013-02-26 13:09:35 -0800327const int Nl80211AttributeRegAlpha2::kName = NL80211_ATTR_REG_ALPHA2;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800328const char Nl80211AttributeRegAlpha2::kNameString[] = "NL80211_ATTR_REG_ALPHA2";
329
Wade Guthrief1b36412013-04-11 14:51:31 -0700330const int Nl80211AttributeRegInitiator::kName =
331 NL80211_ATTR_REG_INITIATOR;
332const char Nl80211AttributeRegInitiator::kNameString[] =
333 "NL80211_ATTR_REG_INITIATOR";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800334
Wade Guthrie68da97c2013-02-26 13:09:35 -0800335const int Nl80211AttributeRegType::kName = NL80211_ATTR_REG_TYPE;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800336const char Nl80211AttributeRegType::kNameString[] = "NL80211_ATTR_REG_TYPE";
337
Wade Guthrie68da97c2013-02-26 13:09:35 -0800338const int Nl80211AttributeRespIe::kName = NL80211_ATTR_RESP_IE;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800339const char Nl80211AttributeRespIe::kNameString[] = "NL80211_ATTR_RESP_IE";
340
Wade Guthrie1f355e82013-04-11 15:46:12 -0700341const int Nl80211AttributeRoamSupport::kName = NL80211_ATTR_ROAM_SUPPORT;
342const char Nl80211AttributeRoamSupport::kNameString[] =
343 "NL80211_ATTR_ROAM_SUPPORT";
344
Wade Guthrief1b36412013-04-11 14:51:31 -0700345const int Nl80211AttributeScanFrequencies::kName =
346 NL80211_ATTR_SCAN_FREQUENCIES;
347const char Nl80211AttributeScanFrequencies::kNameString[] =
348 "NL80211_ATTR_SCAN_FREQUENCIES";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800349
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800350Nl80211AttributeScanFrequencies::Nl80211AttributeScanFrequencies()
Wade Guthrief1b36412013-04-11 14:51:31 -0700351 : NetlinkNestedAttribute(kName, kNameString) {
352 nested_template_.push_back(
353 NestedData(NLA_U32, "NL80211_SCAN_FREQ", true));
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800354}
355
Wade Guthrie68da97c2013-02-26 13:09:35 -0800356const int Nl80211AttributeScanSsids::kName = NL80211_ATTR_SCAN_SSIDS;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800357const char Nl80211AttributeScanSsids::kNameString[] = "NL80211_ATTR_SCAN_SSIDS";
358
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800359Nl80211AttributeScanSsids::Nl80211AttributeScanSsids()
Wade Guthrief1b36412013-04-11 14:51:31 -0700360 : NetlinkNestedAttribute(kName, kNameString) {
361 nested_template_.push_back(
362 NestedData(NLA_STRING, "NL80211_SCAN_SSID", true));
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800363}
364
Wade Guthrie68da97c2013-02-26 13:09:35 -0800365const int Nl80211AttributeStaInfo::kName = NL80211_ATTR_STA_INFO;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800366const char Nl80211AttributeStaInfo::kNameString[] = "NL80211_ATTR_STA_INFO";
367
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800368Nl80211AttributeStaInfo::Nl80211AttributeStaInfo()
Wade Guthrief1b36412013-04-11 14:51:31 -0700369 : NetlinkNestedAttribute(kName, kNameString) {
Wade Guthrief1b36412013-04-11 14:51:31 -0700370 NestedData tx_rates(NLA_NESTED, "NL80211_STA_INFO_TX_BITRATE", false);
371 tx_rates.deeper_nesting.push_back(
372 NestedData(NLA_U32, "__NL80211_RATE_INFO_INVALID", false));
373 tx_rates.deeper_nesting.push_back(
374 NestedData(NLA_U16, "NL80211_RATE_INFO_BITRATE", false));
375 tx_rates.deeper_nesting.push_back(
376 NestedData(NLA_U8, "NL80211_RATE_INFO_MCS", false));
377 tx_rates.deeper_nesting.push_back(
378 NestedData(NLA_FLAG, "NL80211_RATE_INFO_40_MHZ_WIDTH", false));
379 tx_rates.deeper_nesting.push_back(
380 NestedData(NLA_FLAG, "NL80211_RATE_INFO_SHORT_GI", false));
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800381
Wade Guthrief1b36412013-04-11 14:51:31 -0700382 NestedData rx_rates(NLA_NESTED, "NL80211_STA_INFO_RX_BITRATE", false);
383 rx_rates.deeper_nesting = tx_rates.deeper_nesting;
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800384
Wade Guthrief1b36412013-04-11 14:51:31 -0700385 NestedData bss(NLA_NESTED, "NL80211_STA_INFO_BSS_PARAM", false);
386 bss.deeper_nesting.push_back(
387 NestedData(NLA_U32, "__NL80211_STA_BSS_PARAM_INVALID", false));
388 bss.deeper_nesting.push_back(
389 NestedData(NLA_FLAG, "NL80211_STA_BSS_PARAM_CTS_PROT", false));
390 bss.deeper_nesting.push_back(
391 NestedData(NLA_FLAG, "NL80211_STA_BSS_PARAM_SHORT_PREAMBLE",
392 false));
393 bss.deeper_nesting.push_back(
394 NestedData(NLA_FLAG, "NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME",
395 false));
396 bss.deeper_nesting.push_back(
397 NestedData(NLA_U8, "NL80211_STA_BSS_PARAM_DTIM_PERIOD", false));
398 bss.deeper_nesting.push_back(
399 NestedData(NLA_U16, "NL80211_STA_BSS_PARAM_BEACON_INTERVAL", false));
Wade Guthried3dfd6c2013-02-28 17:40:36 -0800400
Wade Guthrief1b36412013-04-11 14:51:31 -0700401 nested_template_.push_back(
402 NestedData(NLA_U32, "__NL80211_STA_INFO_INVALID", false));
403 nested_template_.push_back(
404 NestedData(NLA_U32, "NL80211_STA_INFO_INACTIVE_TIME", false));
405 nested_template_.push_back(
406 NestedData(NLA_U32, "NL80211_STA_INFO_RX_BYTES", false));
407 nested_template_.push_back(
408 NestedData(NLA_U32, "NL80211_STA_INFO_TX_BYTES", false));
409 nested_template_.push_back(
410 NestedData(NLA_U16, "NL80211_STA_INFO_LLID", false));
411 nested_template_.push_back(
412 NestedData(NLA_U16, "NL80211_STA_INFO_PLID", false));
413 nested_template_.push_back(
414 NestedData(NLA_U8, "NL80211_STA_INFO_PLINK_STATE", false));
415 nested_template_.push_back(
416 NestedData(NLA_U8, "NL80211_STA_INFO_SIGNAL", false));
417 nested_template_.push_back(tx_rates);
418 nested_template_.push_back(
419 NestedData(NLA_U32, "NL80211_STA_INFO_RX_PACKETS", false));
420 nested_template_.push_back(
421 NestedData(NLA_U32, "NL80211_STA_INFO_TX_PACKETS", false));
422 nested_template_.push_back(
423 NestedData(NLA_U32, "NL80211_STA_INFO_TX_RETRIES", false));
424 nested_template_.push_back(
425 NestedData(NLA_U32, "NL80211_STA_INFO_TX_FAILED", false));
426 nested_template_.push_back(
427 NestedData(NLA_U8, "NL80211_STA_INFO_SIGNAL_AVG", false));
428 nested_template_.push_back(rx_rates);
429 nested_template_.push_back(bss);
430 nested_template_.push_back(
431 NestedData(NLA_U32, "NL80211_STA_INFO_CONNECTED_TIME", false));
432 nested_template_.push_back(
433 NestedData(NLA_U64, "NL80211_STA_INFO_STA_FLAGS", false));
434 nested_template_.push_back(
435 NestedData(NLA_U32, "NL80211_STA_INFO_BEACON_LOSS", false));
repo sync12cca802012-12-19 17:34:22 -0800436}
437
Wade Guthrief1b36412013-04-11 14:51:31 -0700438const int Nl80211AttributeStatusCode::kName =
439 NL80211_ATTR_STATUS_CODE;
440const char Nl80211AttributeStatusCode::kNameString[] =
441 "NL80211_ATTR_STATUS_CODE";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800442
Wade Guthrie1f355e82013-04-11 15:46:12 -0700443const int Nl80211AttributeSupportApUapsd::kName = NL80211_ATTR_SUPPORT_AP_UAPSD;
444const char Nl80211AttributeSupportApUapsd::kNameString[] =
445 "NL80211_ATTR_SUPPORT_AP_UAPSD";
446
447const int Nl80211AttributeSupportIbssRsn::kName = NL80211_ATTR_SUPPORT_IBSS_RSN;
448const char Nl80211AttributeSupportIbssRsn::kNameString[] =
449 "NL80211_ATTR_SUPPORT_IBSS_RSN";
450
Wade Guthrief1b36412013-04-11 14:51:31 -0700451const int Nl80211AttributeSupportMeshAuth::kName =
452 NL80211_ATTR_SUPPORT_MESH_AUTH;
453const char Nl80211AttributeSupportMeshAuth::kNameString[] =
454 "NL80211_ATTR_SUPPORT_MESH_AUTH";
Wade Guthrie25cdb382012-12-04 14:04:05 -0800455
Wade Guthrie1f355e82013-04-11 15:46:12 -0700456const int Nl80211AttributeTdlsExternalSetup::kName =
457 NL80211_ATTR_TDLS_EXTERNAL_SETUP;
458const char Nl80211AttributeTdlsExternalSetup::kNameString[] =
459 "NL80211_ATTR_TDLS_EXTERNAL_SETUP";
460
461const int Nl80211AttributeTdlsSupport::kName = NL80211_ATTR_TDLS_SUPPORT;
462const char Nl80211AttributeTdlsSupport::kNameString[] =
463 "NL80211_ATTR_TDLS_SUPPORT";
464
Wade Guthrie68da97c2013-02-26 13:09:35 -0800465const int Nl80211AttributeTimedOut::kName = NL80211_ATTR_TIMED_OUT;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800466const char Nl80211AttributeTimedOut::kNameString[] = "NL80211_ATTR_TIMED_OUT";
467
Wade Guthrie1f355e82013-04-11 15:46:12 -0700468const int Nl80211AttributeWiphyAntennaAvailRx::kName =
469 NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX;
470const char Nl80211AttributeWiphyAntennaAvailRx::kNameString[] =
471 "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX";
472
473const int Nl80211AttributeWiphyAntennaAvailTx::kName =
474 NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX;
475const char Nl80211AttributeWiphyAntennaAvailTx::kNameString[] =
476 "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX";
477
478const int Nl80211AttributeWiphyAntennaRx::kName = NL80211_ATTR_WIPHY_ANTENNA_RX;
479const char Nl80211AttributeWiphyAntennaRx::kNameString[] =
480 "NL80211_ATTR_WIPHY_ANTENNA_RX";
481
482const int Nl80211AttributeWiphyAntennaTx::kName = NL80211_ATTR_WIPHY_ANTENNA_TX;
483const char Nl80211AttributeWiphyAntennaTx::kNameString[] =
484 "NL80211_ATTR_WIPHY_ANTENNA_TX";
485
486const int Nl80211AttributeWiphyCoverageClass::kName =
487 NL80211_ATTR_WIPHY_COVERAGE_CLASS;
488const char Nl80211AttributeWiphyCoverageClass::kNameString[] =
489 "NL80211_ATTR_WIPHY_COVERAGE_CLASS";
490
491const int Nl80211AttributeWiphyFragThreshold::kName =
492 NL80211_ATTR_WIPHY_FRAG_THRESHOLD;
493const char Nl80211AttributeWiphyFragThreshold::kNameString[] =
494 "NL80211_ATTR_WIPHY_FRAG_THRESHOLD";
495
Wade Guthrie68da97c2013-02-26 13:09:35 -0800496const int Nl80211AttributeWiphyFreq::kName = NL80211_ATTR_WIPHY_FREQ;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800497const char Nl80211AttributeWiphyFreq::kNameString[] = "NL80211_ATTR_WIPHY_FREQ";
498
Wade Guthrie68da97c2013-02-26 13:09:35 -0800499const int Nl80211AttributeWiphy::kName = NL80211_ATTR_WIPHY;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800500const char Nl80211AttributeWiphy::kNameString[] = "NL80211_ATTR_WIPHY";
501
Wade Guthrie68da97c2013-02-26 13:09:35 -0800502const int Nl80211AttributeWiphyName::kName = NL80211_ATTR_WIPHY_NAME;
Wade Guthrie25cdb382012-12-04 14:04:05 -0800503const char Nl80211AttributeWiphyName::kNameString[] = "NL80211_ATTR_WIPHY_NAME";
504
Wade Guthrie1f355e82013-04-11 15:46:12 -0700505const int Nl80211AttributeWiphyRetryLong::kName = NL80211_ATTR_WIPHY_RETRY_LONG;
506const char Nl80211AttributeWiphyRetryLong::kNameString[] =
507 "NL80211_ATTR_WIPHY_RETRY_LONG";
508
509const int Nl80211AttributeWiphyRetryShort::kName =
510 NL80211_ATTR_WIPHY_RETRY_SHORT;
511const char Nl80211AttributeWiphyRetryShort::kNameString[] =
512 "NL80211_ATTR_WIPHY_RETRY_SHORT";
513
514const int Nl80211AttributeWiphyRtsThreshold::kName =
515 NL80211_ATTR_WIPHY_RTS_THRESHOLD;
516const char Nl80211AttributeWiphyRtsThreshold::kNameString[] =
517 "NL80211_ATTR_WIPHY_RTS_THRESHOLD";
518
Wade Guthrie16196242012-11-20 15:53:52 -0800519} // namespace shill