Wade Guthrie | 1619624 | 2012-11-20 15:53:52 -0800 | [diff] [blame] | 1 | // 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 Guthrie | 1619624 | 2012-11-20 15:53:52 -0800 | [diff] [blame] | 7 | #include <netlink/attr.h> |
Wade Guthrie | 1619624 | 2012-11-20 15:53:52 -0800 | [diff] [blame] | 8 | |
Wade Guthrie | f54872f | 2013-04-11 15:11:50 -0700 | [diff] [blame] | 9 | #include <string> |
| 10 | |
| 11 | #include <base/bind.h> |
| 12 | #include <base/format_macros.h> |
| 13 | #include <base/stringprintf.h> |
| 14 | |
Wade Guthrie | 1619624 | 2012-11-20 15:53:52 -0800 | [diff] [blame] | 15 | #include "shill/logging.h" |
Wade Guthrie | 1619624 | 2012-11-20 15:53:52 -0800 | [diff] [blame] | 16 | |
Wade Guthrie | f54872f | 2013-04-11 15:11:50 -0700 | [diff] [blame] | 17 | using base::Bind; |
Wade Guthrie | 2193b23 | 2013-06-05 17:09:07 -0700 | [diff] [blame] | 18 | using base::StringAppendF; |
Wade Guthrie | f54872f | 2013-04-11 15:11:50 -0700 | [diff] [blame] | 19 | using base::StringPrintf; |
| 20 | using std::string; |
| 21 | |
Wade Guthrie | 1619624 | 2012-11-20 15:53:52 -0800 | [diff] [blame] | 22 | namespace shill { |
| 23 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 24 | const int Nl80211AttributeCookie::kName = NL80211_ATTR_COOKIE; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 25 | const char Nl80211AttributeCookie::kNameString[] = "NL80211_ATTR_COOKIE"; |
| 26 | |
Wade Guthrie | f54872f | 2013-04-11 15:11:50 -0700 | [diff] [blame] | 27 | const int Nl80211AttributeBss::kName = NL80211_ATTR_BSS; |
| 28 | const char Nl80211AttributeBss::kNameString[] = "NL80211_ATTR_BSS"; |
| 29 | const int Nl80211AttributeBss::kChannelsAttributeId = 0x24; |
| 30 | const int Nl80211AttributeBss::kChallengeTextAttributeId = 0x10; |
| 31 | const int Nl80211AttributeBss::kCountryInfoAttributeId = 0x07; |
| 32 | const int Nl80211AttributeBss::kDSParameterSetAttributeId = 0x03; |
| 33 | const int Nl80211AttributeBss::kErpAttributeId = 0x2a; |
| 34 | const int Nl80211AttributeBss::kExtendedRatesAttributeId = 0x32; |
| 35 | const int Nl80211AttributeBss::kHtCapAttributeId = 0x2d; |
| 36 | const int Nl80211AttributeBss::kHtInfoAttributeId = 0x3d; |
| 37 | const int Nl80211AttributeBss::kPowerCapabilityAttributeId = 0x21; |
| 38 | const int Nl80211AttributeBss::kPowerConstraintAttributeId = 0x20; |
| 39 | const int Nl80211AttributeBss::kRequestAttributeId = 0x0a; |
| 40 | const int Nl80211AttributeBss::kRsnAttributeId = 0x30; |
| 41 | const int Nl80211AttributeBss::kSsidAttributeId = 0x00; |
| 42 | const int Nl80211AttributeBss::kSupportedRatesAttributeId = 0x01; |
| 43 | const int Nl80211AttributeBss::kTcpReportAttributeId = 0x23; |
| 44 | const int Nl80211AttributeBss::kVendorSpecificAttributeId = 0xdd; |
| 45 | |
| 46 | static const char kSsidString[] = "SSID"; |
| 47 | static const char kRatesString[] = "Rates"; |
| 48 | |
| 49 | Nl80211AttributeBss::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 | |
| 77 | bool 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 Guthrie | 1f355e8 | 2013-04-11 15:46:12 -0700 | [diff] [blame] | 154 | const int Nl80211AttributeWiphyBands::kName = NL80211_ATTR_WIPHY_BANDS; |
| 155 | const char Nl80211AttributeWiphyBands::kNameString[] = |
| 156 | "NL80211_ATTR_WIPHY_BANDS"; |
| 157 | |
| 158 | Nl80211AttributeWiphyBands::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 | |
| 210 | const int Nl80211AttributeCipherSuites::kName = NL80211_ATTR_CIPHER_SUITES; |
| 211 | const char Nl80211AttributeCipherSuites::kNameString[] = |
| 212 | "NL80211_ATTR_CIPHER_SUITES"; |
| 213 | |
| 214 | const int Nl80211AttributeControlPortEthertype::kName = |
| 215 | NL80211_ATTR_CONTROL_PORT_ETHERTYPE; |
| 216 | const char Nl80211AttributeControlPortEthertype::kNameString[] = |
| 217 | "NL80211_ATTR_CONTROL_PORT_ETHERTYPE"; |
| 218 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 219 | const int Nl80211AttributeCqm::kName = NL80211_ATTR_CQM; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 220 | const char Nl80211AttributeCqm::kNameString[] = "NL80211_ATTR_CQM"; |
| 221 | |
repo sync | 12cca80 | 2012-12-19 17:34:22 -0800 | [diff] [blame] | 222 | Nl80211AttributeCqm::Nl80211AttributeCqm() |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 223 | : 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 sync | 12cca80 | 2012-12-19 17:34:22 -0800 | [diff] [blame] | 234 | } |
| 235 | |
Wade Guthrie | 1f355e8 | 2013-04-11 15:46:12 -0700 | [diff] [blame] | 236 | const int Nl80211AttributeDeviceApSme::kName = NL80211_ATTR_DEVICE_AP_SME; |
| 237 | const char Nl80211AttributeDeviceApSme::kNameString[] = |
| 238 | "NL80211_ATTR_DEVICE_AP_SME"; |
| 239 | |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 240 | const int Nl80211AttributeDisconnectedByAp::kName = |
| 241 | NL80211_ATTR_DISCONNECTED_BY_AP; |
| 242 | const char Nl80211AttributeDisconnectedByAp::kNameString[] = |
| 243 | "NL80211_ATTR_DISCONNECTED_BY_AP"; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 244 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 245 | const int Nl80211AttributeDuration::kName = NL80211_ATTR_DURATION; |
Wade Guthrie | 1619624 | 2012-11-20 15:53:52 -0800 | [diff] [blame] | 246 | const char Nl80211AttributeDuration::kNameString[] = "NL80211_ATTR_DURATION"; |
| 247 | |
Wade Guthrie | 1f355e8 | 2013-04-11 15:46:12 -0700 | [diff] [blame] | 248 | const int Nl80211AttributeFeatureFlags::kName = NL80211_ATTR_FEATURE_FLAGS; |
| 249 | const char Nl80211AttributeFeatureFlags::kNameString[] = |
| 250 | "NL80211_ATTR_FEATURE_FLAGS"; |
| 251 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 252 | const int Nl80211AttributeFrame::kName = NL80211_ATTR_FRAME; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 253 | const char Nl80211AttributeFrame::kNameString[] = "NL80211_ATTR_FRAME"; |
| 254 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 255 | const int Nl80211AttributeGeneration::kName = NL80211_ATTR_GENERATION; |
Wade Guthrie | f54872f | 2013-04-11 15:11:50 -0700 | [diff] [blame] | 256 | const char Nl80211AttributeGeneration::kNameString[] = |
| 257 | "NL80211_ATTR_GENERATION"; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 258 | |
Wade Guthrie | 1f355e8 | 2013-04-11 15:46:12 -0700 | [diff] [blame] | 259 | const int Nl80211AttributeHtCapabilityMask::kName = |
| 260 | NL80211_ATTR_HT_CAPABILITY_MASK; |
| 261 | const char Nl80211AttributeHtCapabilityMask::kNameString[] = |
| 262 | "NL80211_ATTR_HT_CAPABILITY_MASK"; |
| 263 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 264 | const int Nl80211AttributeIfindex::kName = NL80211_ATTR_IFINDEX; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 265 | const char Nl80211AttributeIfindex::kNameString[] = "NL80211_ATTR_IFINDEX"; |
| 266 | |
Paul Stewart | 2ddf2c6 | 2013-04-16 09:47:34 -0700 | [diff] [blame] | 267 | const int Nl80211AttributeIftype::kName = NL80211_ATTR_IFTYPE; |
| 268 | const char Nl80211AttributeIftype::kNameString[] = "NL80211_ATTR_IFTYPE"; |
| 269 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 270 | const int Nl80211AttributeKeyIdx::kName = NL80211_ATTR_KEY_IDX; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 271 | const char Nl80211AttributeKeyIdx::kNameString[] = "NL80211_ATTR_KEY_IDX"; |
| 272 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 273 | const int Nl80211AttributeKeySeq::kName = NL80211_ATTR_KEY_SEQ; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 274 | const char Nl80211AttributeKeySeq::kNameString[] = "NL80211_ATTR_KEY_SEQ"; |
| 275 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 276 | const int Nl80211AttributeKeyType::kName = NL80211_ATTR_KEY_TYPE; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 277 | const char Nl80211AttributeKeyType::kNameString[] = "NL80211_ATTR_KEY_TYPE"; |
| 278 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 279 | const int Nl80211AttributeMac::kName = NL80211_ATTR_MAC; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 280 | const char Nl80211AttributeMac::kNameString[] = "NL80211_ATTR_MAC"; |
| 281 | |
Wade Guthrie | 2193b23 | 2013-06-05 17:09:07 -0700 | [diff] [blame] | 282 | bool 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 |
| 292 | string 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 Guthrie | 1f355e8 | 2013-04-11 15:46:12 -0700 | [diff] [blame] | 306 | const int Nl80211AttributeMaxMatchSets::kName = NL80211_ATTR_MAX_MATCH_SETS; |
| 307 | const char Nl80211AttributeMaxMatchSets::kNameString[] = |
| 308 | "NL80211_ATTR_MAX_MATCH_SETS"; |
| 309 | |
| 310 | const int Nl80211AttributeMaxNumPmkids::kName = NL80211_ATTR_MAX_NUM_PMKIDS; |
| 311 | const char Nl80211AttributeMaxNumPmkids::kNameString[] = |
| 312 | "NL80211_ATTR_MAX_NUM_PMKIDS"; |
| 313 | |
| 314 | const int Nl80211AttributeMaxNumScanSsids::kName = |
| 315 | NL80211_ATTR_MAX_NUM_SCAN_SSIDS; |
| 316 | const char Nl80211AttributeMaxNumScanSsids::kNameString[] = |
| 317 | "NL80211_ATTR_MAX_NUM_SCAN_SSIDS"; |
| 318 | |
| 319 | const int Nl80211AttributeMaxNumSchedScanSsids::kName = |
| 320 | NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS; |
| 321 | const char Nl80211AttributeMaxNumSchedScanSsids::kNameString[] = |
| 322 | "NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS"; |
| 323 | |
| 324 | const int Nl80211AttributeMaxRemainOnChannelDuration::kName = |
| 325 | NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION; |
| 326 | const char Nl80211AttributeMaxRemainOnChannelDuration::kNameString[] = |
| 327 | "NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION"; |
| 328 | |
| 329 | const int Nl80211AttributeMaxScanIeLen::kName = NL80211_ATTR_MAX_SCAN_IE_LEN; |
| 330 | const char Nl80211AttributeMaxScanIeLen::kNameString[] = |
| 331 | "NL80211_ATTR_MAX_SCAN_IE_LEN"; |
| 332 | |
| 333 | const int Nl80211AttributeMaxSchedScanIeLen::kName = |
| 334 | NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN; |
| 335 | const char Nl80211AttributeMaxSchedScanIeLen::kNameString[] = |
| 336 | "NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN"; |
| 337 | |
| 338 | const int Nl80211AttributeOffchannelTxOk::kName = NL80211_ATTR_OFFCHANNEL_TX_OK; |
| 339 | const char Nl80211AttributeOffchannelTxOk::kNameString[] = |
| 340 | "NL80211_ATTR_OFFCHANNEL_TX_OK"; |
| 341 | |
| 342 | const int Nl80211AttributeProbeRespOffload::kName = |
| 343 | NL80211_ATTR_PROBE_RESP_OFFLOAD; |
| 344 | const char Nl80211AttributeProbeRespOffload::kNameString[] = |
| 345 | "NL80211_ATTR_PROBE_RESP_OFFLOAD"; |
| 346 | |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 347 | const int Nl80211AttributeReasonCode::kName = |
| 348 | NL80211_ATTR_REASON_CODE; |
| 349 | const char Nl80211AttributeReasonCode::kNameString[] = |
| 350 | "NL80211_ATTR_REASON_CODE"; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 351 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 352 | const int Nl80211AttributeRegAlpha2::kName = NL80211_ATTR_REG_ALPHA2; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 353 | const char Nl80211AttributeRegAlpha2::kNameString[] = "NL80211_ATTR_REG_ALPHA2"; |
| 354 | |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 355 | const int Nl80211AttributeRegInitiator::kName = |
| 356 | NL80211_ATTR_REG_INITIATOR; |
| 357 | const char Nl80211AttributeRegInitiator::kNameString[] = |
| 358 | "NL80211_ATTR_REG_INITIATOR"; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 359 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 360 | const int Nl80211AttributeRegType::kName = NL80211_ATTR_REG_TYPE; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 361 | const char Nl80211AttributeRegType::kNameString[] = "NL80211_ATTR_REG_TYPE"; |
| 362 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 363 | const int Nl80211AttributeRespIe::kName = NL80211_ATTR_RESP_IE; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 364 | const char Nl80211AttributeRespIe::kNameString[] = "NL80211_ATTR_RESP_IE"; |
| 365 | |
Wade Guthrie | 1f355e8 | 2013-04-11 15:46:12 -0700 | [diff] [blame] | 366 | const int Nl80211AttributeRoamSupport::kName = NL80211_ATTR_ROAM_SUPPORT; |
| 367 | const char Nl80211AttributeRoamSupport::kNameString[] = |
| 368 | "NL80211_ATTR_ROAM_SUPPORT"; |
| 369 | |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 370 | const int Nl80211AttributeScanFrequencies::kName = |
| 371 | NL80211_ATTR_SCAN_FREQUENCIES; |
| 372 | const char Nl80211AttributeScanFrequencies::kNameString[] = |
| 373 | "NL80211_ATTR_SCAN_FREQUENCIES"; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 374 | |
Wade Guthrie | d3dfd6c | 2013-02-28 17:40:36 -0800 | [diff] [blame] | 375 | Nl80211AttributeScanFrequencies::Nl80211AttributeScanFrequencies() |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 376 | : NetlinkNestedAttribute(kName, kNameString) { |
| 377 | nested_template_.push_back( |
| 378 | NestedData(NLA_U32, "NL80211_SCAN_FREQ", true)); |
Wade Guthrie | d3dfd6c | 2013-02-28 17:40:36 -0800 | [diff] [blame] | 379 | } |
| 380 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 381 | const int Nl80211AttributeScanSsids::kName = NL80211_ATTR_SCAN_SSIDS; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 382 | const char Nl80211AttributeScanSsids::kNameString[] = "NL80211_ATTR_SCAN_SSIDS"; |
| 383 | |
Wade Guthrie | d3dfd6c | 2013-02-28 17:40:36 -0800 | [diff] [blame] | 384 | Nl80211AttributeScanSsids::Nl80211AttributeScanSsids() |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 385 | : NetlinkNestedAttribute(kName, kNameString) { |
| 386 | nested_template_.push_back( |
| 387 | NestedData(NLA_STRING, "NL80211_SCAN_SSID", true)); |
Wade Guthrie | d3dfd6c | 2013-02-28 17:40:36 -0800 | [diff] [blame] | 388 | } |
| 389 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 390 | const int Nl80211AttributeStaInfo::kName = NL80211_ATTR_STA_INFO; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 391 | const char Nl80211AttributeStaInfo::kNameString[] = "NL80211_ATTR_STA_INFO"; |
| 392 | |
Wade Guthrie | d3dfd6c | 2013-02-28 17:40:36 -0800 | [diff] [blame] | 393 | Nl80211AttributeStaInfo::Nl80211AttributeStaInfo() |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 394 | : NetlinkNestedAttribute(kName, kNameString) { |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 395 | 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 Guthrie | d3dfd6c | 2013-02-28 17:40:36 -0800 | [diff] [blame] | 406 | |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 407 | NestedData rx_rates(NLA_NESTED, "NL80211_STA_INFO_RX_BITRATE", false); |
| 408 | rx_rates.deeper_nesting = tx_rates.deeper_nesting; |
Wade Guthrie | d3dfd6c | 2013-02-28 17:40:36 -0800 | [diff] [blame] | 409 | |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 410 | 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 Guthrie | d3dfd6c | 2013-02-28 17:40:36 -0800 | [diff] [blame] | 425 | |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 426 | 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 sync | 12cca80 | 2012-12-19 17:34:22 -0800 | [diff] [blame] | 461 | } |
| 462 | |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 463 | const int Nl80211AttributeStatusCode::kName = |
| 464 | NL80211_ATTR_STATUS_CODE; |
| 465 | const char Nl80211AttributeStatusCode::kNameString[] = |
| 466 | "NL80211_ATTR_STATUS_CODE"; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 467 | |
Wade Guthrie | 1f355e8 | 2013-04-11 15:46:12 -0700 | [diff] [blame] | 468 | const int Nl80211AttributeSupportApUapsd::kName = NL80211_ATTR_SUPPORT_AP_UAPSD; |
| 469 | const char Nl80211AttributeSupportApUapsd::kNameString[] = |
| 470 | "NL80211_ATTR_SUPPORT_AP_UAPSD"; |
| 471 | |
| 472 | const int Nl80211AttributeSupportIbssRsn::kName = NL80211_ATTR_SUPPORT_IBSS_RSN; |
| 473 | const char Nl80211AttributeSupportIbssRsn::kNameString[] = |
| 474 | "NL80211_ATTR_SUPPORT_IBSS_RSN"; |
| 475 | |
Wade Guthrie | f1b3641 | 2013-04-11 14:51:31 -0700 | [diff] [blame] | 476 | const int Nl80211AttributeSupportMeshAuth::kName = |
| 477 | NL80211_ATTR_SUPPORT_MESH_AUTH; |
| 478 | const char Nl80211AttributeSupportMeshAuth::kNameString[] = |
| 479 | "NL80211_ATTR_SUPPORT_MESH_AUTH"; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 480 | |
Wade Guthrie | 1f355e8 | 2013-04-11 15:46:12 -0700 | [diff] [blame] | 481 | const int Nl80211AttributeTdlsExternalSetup::kName = |
| 482 | NL80211_ATTR_TDLS_EXTERNAL_SETUP; |
| 483 | const char Nl80211AttributeTdlsExternalSetup::kNameString[] = |
| 484 | "NL80211_ATTR_TDLS_EXTERNAL_SETUP"; |
| 485 | |
| 486 | const int Nl80211AttributeTdlsSupport::kName = NL80211_ATTR_TDLS_SUPPORT; |
| 487 | const char Nl80211AttributeTdlsSupport::kNameString[] = |
| 488 | "NL80211_ATTR_TDLS_SUPPORT"; |
| 489 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 490 | const int Nl80211AttributeTimedOut::kName = NL80211_ATTR_TIMED_OUT; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 491 | const char Nl80211AttributeTimedOut::kNameString[] = "NL80211_ATTR_TIMED_OUT"; |
| 492 | |
Wade Guthrie | 1f355e8 | 2013-04-11 15:46:12 -0700 | [diff] [blame] | 493 | const int Nl80211AttributeWiphyAntennaAvailRx::kName = |
| 494 | NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX; |
| 495 | const char Nl80211AttributeWiphyAntennaAvailRx::kNameString[] = |
| 496 | "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX"; |
| 497 | |
| 498 | const int Nl80211AttributeWiphyAntennaAvailTx::kName = |
| 499 | NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX; |
| 500 | const char Nl80211AttributeWiphyAntennaAvailTx::kNameString[] = |
| 501 | "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX"; |
| 502 | |
| 503 | const int Nl80211AttributeWiphyAntennaRx::kName = NL80211_ATTR_WIPHY_ANTENNA_RX; |
| 504 | const char Nl80211AttributeWiphyAntennaRx::kNameString[] = |
| 505 | "NL80211_ATTR_WIPHY_ANTENNA_RX"; |
| 506 | |
| 507 | const int Nl80211AttributeWiphyAntennaTx::kName = NL80211_ATTR_WIPHY_ANTENNA_TX; |
| 508 | const char Nl80211AttributeWiphyAntennaTx::kNameString[] = |
| 509 | "NL80211_ATTR_WIPHY_ANTENNA_TX"; |
| 510 | |
| 511 | const int Nl80211AttributeWiphyCoverageClass::kName = |
| 512 | NL80211_ATTR_WIPHY_COVERAGE_CLASS; |
| 513 | const char Nl80211AttributeWiphyCoverageClass::kNameString[] = |
| 514 | "NL80211_ATTR_WIPHY_COVERAGE_CLASS"; |
| 515 | |
| 516 | const int Nl80211AttributeWiphyFragThreshold::kName = |
| 517 | NL80211_ATTR_WIPHY_FRAG_THRESHOLD; |
| 518 | const char Nl80211AttributeWiphyFragThreshold::kNameString[] = |
| 519 | "NL80211_ATTR_WIPHY_FRAG_THRESHOLD"; |
| 520 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 521 | const int Nl80211AttributeWiphyFreq::kName = NL80211_ATTR_WIPHY_FREQ; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 522 | const char Nl80211AttributeWiphyFreq::kNameString[] = "NL80211_ATTR_WIPHY_FREQ"; |
| 523 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 524 | const int Nl80211AttributeWiphy::kName = NL80211_ATTR_WIPHY; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 525 | const char Nl80211AttributeWiphy::kNameString[] = "NL80211_ATTR_WIPHY"; |
| 526 | |
Wade Guthrie | 68da97c | 2013-02-26 13:09:35 -0800 | [diff] [blame] | 527 | const int Nl80211AttributeWiphyName::kName = NL80211_ATTR_WIPHY_NAME; |
Wade Guthrie | 25cdb38 | 2012-12-04 14:04:05 -0800 | [diff] [blame] | 528 | const char Nl80211AttributeWiphyName::kNameString[] = "NL80211_ATTR_WIPHY_NAME"; |
| 529 | |
Wade Guthrie | 1f355e8 | 2013-04-11 15:46:12 -0700 | [diff] [blame] | 530 | const int Nl80211AttributeWiphyRetryLong::kName = NL80211_ATTR_WIPHY_RETRY_LONG; |
| 531 | const char Nl80211AttributeWiphyRetryLong::kNameString[] = |
| 532 | "NL80211_ATTR_WIPHY_RETRY_LONG"; |
| 533 | |
| 534 | const int Nl80211AttributeWiphyRetryShort::kName = |
| 535 | NL80211_ATTR_WIPHY_RETRY_SHORT; |
| 536 | const char Nl80211AttributeWiphyRetryShort::kNameString[] = |
| 537 | "NL80211_ATTR_WIPHY_RETRY_SHORT"; |
| 538 | |
| 539 | const int Nl80211AttributeWiphyRtsThreshold::kName = |
| 540 | NL80211_ATTR_WIPHY_RTS_THRESHOLD; |
| 541 | const char Nl80211AttributeWiphyRtsThreshold::kNameString[] = |
| 542 | "NL80211_ATTR_WIPHY_RTS_THRESHOLD"; |
| 543 | |
Wade Guthrie | 1619624 | 2012-11-20 15:53:52 -0800 | [diff] [blame] | 544 | } // namespace shill |