| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "shill/net/nl80211_attribute.h" |
| |
| #include <string> |
| |
| #include <base/bind.h> |
| #include <base/format_macros.h> |
| #include <base/logging.h> |
| #include <base/strings/stringprintf.h> |
| |
| #include "shill/net/ieee80211.h" |
| #include "shill/net/netlink_message.h" |
| |
| using base::Bind; |
| using base::StringPrintf; |
| using std::string; |
| |
| namespace shill { |
| |
| const int Nl80211AttributeCookie::kName = NL80211_ATTR_COOKIE; |
| const char Nl80211AttributeCookie::kNameString[] = "NL80211_ATTR_COOKIE"; |
| |
| const int Nl80211AttributeBss::kName = NL80211_ATTR_BSS; |
| const char Nl80211AttributeBss::kNameString[] = "NL80211_ATTR_BSS"; |
| const int Nl80211AttributeBss::kChannelsAttributeId = |
| IEEE_80211::kElemIdChannels; |
| const int Nl80211AttributeBss::kChallengeTextAttributeId = |
| IEEE_80211::kElemIdChallengeText; |
| const int Nl80211AttributeBss::kCountryInfoAttributeId = |
| IEEE_80211::kElemIdCountry; |
| const int Nl80211AttributeBss::kDSParameterSetAttributeId = |
| IEEE_80211::kElemIdDSParameterSet; |
| const int Nl80211AttributeBss::kErpAttributeId = IEEE_80211::kElemIdErp; |
| const int Nl80211AttributeBss::kExtendedRatesAttributeId = |
| IEEE_80211::kElemIdExtendedRates; |
| const int Nl80211AttributeBss::kHtCapAttributeId = IEEE_80211::kElemIdHTCap; |
| const int Nl80211AttributeBss::kHtInfoAttributeId = IEEE_80211::kElemIdHTInfo; |
| const int Nl80211AttributeBss::kPowerCapabilityAttributeId = |
| IEEE_80211::kElemIdPowerCapability; |
| const int Nl80211AttributeBss::kPowerConstraintAttributeId = |
| IEEE_80211::kElemIdPowerConstraint; |
| const int Nl80211AttributeBss::kRequestAttributeId = IEEE_80211::kElemIdRequest; |
| const int Nl80211AttributeBss::kRsnAttributeId = IEEE_80211::kElemIdRSN; |
| const int Nl80211AttributeBss::kSsidAttributeId = IEEE_80211::kElemIdSsid; |
| const int Nl80211AttributeBss::kSupportedRatesAttributeId = |
| IEEE_80211::kElemIdSupportedRates; |
| const int Nl80211AttributeBss::kTpcReportAttributeId = |
| IEEE_80211::kElemIdTpcReport; |
| const int Nl80211AttributeBss::kVendorSpecificAttributeId = |
| IEEE_80211::kElemIdVendor; |
| const int Nl80211AttributeBss::kVhtCapAttributeId = IEEE_80211::kElemIdVHTCap; |
| const int Nl80211AttributeBss::kVhtInfoAttributeId = |
| IEEE_80211::kElemIdVHTOperation; |
| const int Nl80211AttributeBss::kMeshIdAttributeId = IEEE_80211::kElemIdMeshId; |
| |
| static const char kSsidString[] = "SSID"; |
| static const char kRatesString[] = "Rates"; |
| static const char kHtCapString[] = "HTCapabilities"; |
| static const char kHtOperString[] = "HTOperation"; |
| static const char kVhtCapString[] = "VHTCapabilities"; |
| static const char kVhtOperString[] = "VHTOperation"; |
| static const char kMeshIdString[] = "MeshID"; |
| |
| Nl80211AttributeBss::Nl80211AttributeBss() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| nested_template_.insert( |
| AttrDataPair(__NL80211_BSS_INVALID, |
| NestedData(kTypeU32, "__NL80211_BSS_INVALID", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_BSS_BSSID, NestedData(kTypeRaw, "NL80211_BSS_BSSID", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_BSS_FREQUENCY, |
| NestedData(kTypeU32, "NL80211_BSS_FREQUENCY", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_BSS_TSF, NestedData(kTypeU64, "NL80211_BSS_TSF", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_BSS_BEACON_INTERVAL, |
| NestedData(kTypeU16, "NL80211_BSS_BEACON_INTERVAL", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_BSS_CAPABILITY, |
| NestedData(kTypeU16, "NL80211_BSS_CAPABILITY", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_BSS_INFORMATION_ELEMENTS, |
| NestedData(kTypeRaw, "NL80211_BSS_INFORMATION_ELEMENTS", false, |
| Bind(&Nl80211AttributeBss::ParseInformationElements)))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_BSS_SIGNAL_MBM, |
| NestedData(kTypeU32, "NL80211_BSS_SIGNAL_MBM", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_BSS_SIGNAL_UNSPEC, |
| NestedData(kTypeU8, "NL80211_BSS_SIGNAL_UNSPEC", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_BSS_STATUS, NestedData(kTypeU32, "NL80211_BSS_STATUS", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_BSS_SEEN_MS_AGO, |
| NestedData(kTypeU32, "NL80211_BSS_SEEN_MS_AGO", false))); |
| } |
| |
| bool Nl80211AttributeBss::ParseInformationElements( |
| AttributeList* attribute_list, |
| size_t id, |
| const string& attribute_name, |
| ByteString data) { |
| if (!attribute_list) { |
| LOG(ERROR) << "NULL |attribute_list| parameter"; |
| return false; |
| } |
| attribute_list->CreateNestedAttribute(id, attribute_name.c_str()); |
| |
| // Now, handle the nested data. |
| AttributeListRefPtr ie_attribute; |
| if (!attribute_list->GetNestedAttributeList(id, &ie_attribute) || |
| !ie_attribute) { |
| LOG(ERROR) << "Couldn't get attribute " << attribute_name |
| << " which we just created."; |
| return false; |
| } |
| const uint8_t* sub_attribute = data.GetConstData(); |
| const uint8_t* end = sub_attribute + data.GetLength(); |
| const int kHeaderBytes = 2; |
| while (end - sub_attribute > kHeaderBytes) { |
| uint8_t type = sub_attribute[0]; |
| uint8_t payload_bytes = sub_attribute[1]; |
| const uint8_t* payload = &sub_attribute[kHeaderBytes]; |
| if (payload + payload_bytes > end) { |
| LOG(ERROR) << "Found malformed IE data."; |
| return false; |
| } |
| // See http://dox.ipxe.org/ieee80211_8h_source.html for more info on types |
| // and data inside information elements. |
| switch (type) { |
| case kSsidAttributeId: { |
| ie_attribute->CreateSsidAttribute(type, kSsidString); |
| if (payload_bytes == 0) { |
| ie_attribute->SetStringAttributeValue(type, ""); |
| } else { |
| ie_attribute->SetStringAttributeValue( |
| type, |
| string(reinterpret_cast<const char*>(payload), payload_bytes)); |
| } |
| break; |
| } |
| case kSupportedRatesAttributeId: |
| case kExtendedRatesAttributeId: { |
| ie_attribute->CreateNestedAttribute(type, kRatesString); |
| AttributeListRefPtr rates_attribute; |
| if (!ie_attribute->GetNestedAttributeList(type, &rates_attribute) || |
| !rates_attribute) { |
| LOG(ERROR) << "Couldn't get attribute " << attribute_name |
| << " which we just created."; |
| break; |
| } |
| // Extract each rate, add it to the list. |
| for (size_t i = 0; i < payload_bytes; ++i) { |
| string rate_name = StringPrintf("Rate-%zu", i); |
| rates_attribute->CreateU8Attribute(i, rate_name.c_str()); |
| rates_attribute->SetU8AttributeValue(i, payload[i]); |
| } |
| ie_attribute->SetNestedAttributeHasAValue(type); |
| break; |
| } |
| case kHtCapAttributeId: { |
| ie_attribute->CreateRawAttribute(type, kHtCapString); |
| ie_attribute->SetRawAttributeValue( |
| type, |
| ByteString(reinterpret_cast<const char*>(payload), payload_bytes)); |
| break; |
| } |
| case kHtInfoAttributeId: { |
| ie_attribute->CreateRawAttribute(type, kHtOperString); |
| ie_attribute->SetRawAttributeValue( |
| type, |
| ByteString(reinterpret_cast<const char*>(payload), payload_bytes)); |
| break; |
| } |
| case kVhtCapAttributeId: { |
| ie_attribute->CreateRawAttribute(type, kVhtCapString); |
| ie_attribute->SetRawAttributeValue( |
| type, |
| ByteString(reinterpret_cast<const char*>(payload), payload_bytes)); |
| break; |
| } |
| case kVhtInfoAttributeId: { |
| ie_attribute->CreateRawAttribute(type, kVhtOperString); |
| ie_attribute->SetRawAttributeValue( |
| type, |
| ByteString(reinterpret_cast<const char*>(payload), payload_bytes)); |
| break; |
| } |
| case kMeshIdAttributeId: { |
| ie_attribute->CreateStringAttribute(type, kMeshIdString); |
| if (payload_bytes == 0) { |
| ie_attribute->SetStringAttributeValue(type, ""); |
| } else { |
| ie_attribute->SetStringAttributeValue( |
| type, |
| string(reinterpret_cast<const char*>(payload), payload_bytes)); |
| } |
| break; |
| } |
| case kDSParameterSetAttributeId: |
| case kCountryInfoAttributeId: |
| case kRequestAttributeId: |
| case kChallengeTextAttributeId: |
| case kPowerConstraintAttributeId: |
| case kPowerCapabilityAttributeId: |
| case kTpcReportAttributeId: |
| case kChannelsAttributeId: |
| case kErpAttributeId: |
| case kRsnAttributeId: |
| case kVendorSpecificAttributeId: |
| default: |
| break; |
| } |
| sub_attribute += kHeaderBytes + payload_bytes; |
| } |
| attribute_list->SetNestedAttributeHasAValue(id); |
| return true; |
| } |
| |
| const int Nl80211AttributeWiphyBands::kName = NL80211_ATTR_WIPHY_BANDS; |
| const char Nl80211AttributeWiphyBands::kNameString[] = |
| "NL80211_ATTR_WIPHY_BANDS"; |
| |
| Nl80211AttributeWiphyBands::Nl80211AttributeWiphyBands() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| // Frequencies |
| NestedData freq(kTypeNested, "NL80211_BAND_ATTR_FREQ", true); |
| freq.deeper_nesting.insert(AttrDataPair( |
| __NL80211_FREQUENCY_ATTR_INVALID, |
| NestedData(kTypeU32, "__NL80211_FREQUENCY_ATTR_INVALID", false))); |
| freq.deeper_nesting.insert( |
| AttrDataPair(NL80211_FREQUENCY_ATTR_FREQ, |
| NestedData(kTypeU32, "NL80211_FREQUENCY_ATTR_FREQ", false))); |
| freq.deeper_nesting.insert(AttrDataPair( |
| NL80211_FREQUENCY_ATTR_DISABLED, |
| NestedData(kTypeFlag, "NL80211_FREQUENCY_ATTR_DISABLED", false))); |
| freq.deeper_nesting.insert(AttrDataPair( |
| NL80211_FREQUENCY_ATTR_PASSIVE_SCAN, |
| NestedData(kTypeFlag, "NL80211_FREQUENCY_ATTR_PASSIVE_SCAN", false))); |
| freq.deeper_nesting.insert(AttrDataPair( |
| NL80211_FREQUENCY_ATTR_NO_IBSS, |
| NestedData(kTypeFlag, "NL80211_FREQUENCY_ATTR_NO_IBSS", false))); |
| freq.deeper_nesting.insert(AttrDataPair( |
| NL80211_FREQUENCY_ATTR_RADAR, |
| NestedData(kTypeFlag, "NL80211_FREQUENCY_ATTR_RADAR", false))); |
| freq.deeper_nesting.insert(AttrDataPair( |
| NL80211_FREQUENCY_ATTR_MAX_TX_POWER, |
| NestedData(kTypeU32, "NL80211_FREQUENCY_ATTR_MAX_TX_POWER", false))); |
| |
| NestedData freqs(kTypeNested, "NL80211_BAND_ATTR_FREQS", false); |
| freqs.deeper_nesting.insert(AttrDataPair(kArrayAttrEnumVal, freq)); |
| |
| // Rates |
| NestedData rate(kTypeNested, "NL80211_BAND_ATTR_RATE", true); |
| rate.deeper_nesting.insert(AttrDataPair( |
| __NL80211_BITRATE_ATTR_INVALID, |
| NestedData(kTypeU32, "__NL80211_BITRATE_ATTR_INVALID", false))); |
| rate.deeper_nesting.insert( |
| AttrDataPair(NL80211_BITRATE_ATTR_RATE, |
| NestedData(kTypeU32, "NL80211_BITRATE_ATTR_RATE", false))); |
| rate.deeper_nesting.insert(AttrDataPair( |
| NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE, |
| NestedData(kTypeFlag, "NL80211_BITRATE_ATTR_2GHZ_SHORTPREAMBLE", false))); |
| |
| NestedData rates(kTypeNested, "NL80211_BAND_ATTR_RATES", true); |
| rates.deeper_nesting.insert(AttrDataPair(kArrayAttrEnumVal, rate)); |
| |
| // Main body of attribute |
| NestedData bands(kTypeNested, "NL80211_ATTR_BANDS", true); |
| bands.deeper_nesting.insert(AttrDataPair( |
| __NL80211_BAND_ATTR_INVALID, |
| NestedData(kTypeU32, "__NL80211_BAND_ATTR_INVALID,", false))); |
| bands.deeper_nesting.insert(AttrDataPair(NL80211_BAND_ATTR_FREQS, freqs)); |
| bands.deeper_nesting.insert(AttrDataPair(NL80211_BAND_ATTR_RATES, rates)); |
| bands.deeper_nesting.insert(AttrDataPair( |
| NL80211_BAND_ATTR_HT_MCS_SET, |
| NestedData(kTypeRaw, "NL80211_BAND_ATTR_HT_MCS_SET", false))); |
| bands.deeper_nesting.insert( |
| AttrDataPair(NL80211_BAND_ATTR_HT_CAPA, |
| NestedData(kTypeU16, "NL80211_BAND_ATTR_HT_CAPA", false))); |
| bands.deeper_nesting.insert(AttrDataPair( |
| NL80211_BAND_ATTR_HT_AMPDU_FACTOR, |
| NestedData(kTypeU8, "NL80211_BAND_ATTR_HT_AMPDU_FACTOR", false))); |
| bands.deeper_nesting.insert(AttrDataPair( |
| NL80211_BAND_ATTR_HT_AMPDU_DENSITY, |
| NestedData(kTypeU8, "NL80211_BAND_ATTR_HT_AMPDU_DENSITY", false))); |
| |
| nested_template_.insert(AttrDataPair(kArrayAttrEnumVal, bands)); |
| } |
| |
| #if !defined(DISABLE_WAKE_ON_WIFI) |
| const int Nl80211AttributeWowlanTriggers::kName = NL80211_ATTR_WOWLAN_TRIGGERS; |
| const char Nl80211AttributeWowlanTriggers::kNameString[] = |
| "NL80211_ATTR_WOWLAN_TRIGGERS"; |
| |
| Nl80211AttributeWowlanTriggers::Nl80211AttributeWowlanTriggers( |
| NetlinkMessage::MessageContext context) |
| : NetlinkNestedAttribute(kName, kNameString) { |
| // Pattern matching trigger attribute. |
| if (context.nl80211_cmd == NL80211_CMD_SET_WOWLAN && context.is_broadcast) { |
| // If this attribute occurs in a wakeup report, parse |
| // NL80211_WOWLAN_TRIG_PKT_PATTERN as a U32 reporting the index of the |
| // pattern that caused the wake. |
| nested_template_.insert(AttrDataPair( |
| NL80211_WOWLAN_TRIG_PKT_PATTERN, |
| NestedData(kTypeU32, "NL80211_WOWLAN_TRIG_PKT_PATTERN", false))); |
| } else { |
| // Otherwise, this attribute is meant to program the NIC, so parse it as |
| // a nested attribute. |
| NestedData patterns(kTypeNested, "NL80211_WOWLAN_TRIG_PKT_PATTERN", false); |
| NestedData individual_pattern(kTypeNested, "Pattern Match Info", true); |
| individual_pattern.deeper_nesting.insert( |
| AttrDataPair(NL80211_PKTPAT_MASK, |
| NestedData(kTypeRaw, "NL80211_PKTPAT_MASK", false))); |
| individual_pattern.deeper_nesting.insert( |
| AttrDataPair(NL80211_PKTPAT_PATTERN, |
| NestedData(kTypeRaw, "NL80211_PKTPAT_PATTERN", false))); |
| individual_pattern.deeper_nesting.insert( |
| AttrDataPair(NL80211_PKTPAT_OFFSET, |
| NestedData(kTypeU32, "NL80211_PKTPAT_OFFSET", false))); |
| patterns.deeper_nesting.insert( |
| AttrDataPair(kArrayAttrEnumVal, individual_pattern)); |
| nested_template_.insert( |
| AttrDataPair(NL80211_WOWLAN_TRIG_PKT_PATTERN, patterns)); |
| } |
| |
| // Net detect SSID matching trigger attribute. |
| NestedData net_detect(kTypeNested, "NL80211_WOWLAN_TRIG_NET_DETECT", false); |
| NestedData scan_freqs(kTypeNested, "NL80211_ATTR_SCAN_FREQUENCIES", true); |
| scan_freqs.deeper_nesting.insert(AttrDataPair( |
| kArrayAttrEnumVal, NestedData(kTypeU32, "Frequency match", false))); |
| net_detect.deeper_nesting.insert( |
| AttrDataPair(NL80211_ATTR_SCAN_FREQUENCIES, scan_freqs)); |
| net_detect.deeper_nesting.insert(AttrDataPair( |
| NL80211_ATTR_SCHED_SCAN_INTERVAL, |
| NestedData(kTypeU32, "NL80211_ATTR_SCHED_SCAN_INTERVAL", false))); |
| NestedData scan_matches(kTypeNested, "NL80211_ATTR_SCHED_SCAN_MATCH", false); |
| NestedData individual_scan_match( |
| kTypeNested, "NL80211_ATTR_SCHED_SCAN_MATCH_SINGLE", true); |
| individual_scan_match.deeper_nesting.insert(AttrDataPair( |
| NL80211_SCHED_SCAN_MATCH_ATTR_SSID, |
| NestedData(kTypeRaw, "NL80211_SCHED_SCAN_MATCH_ATTR_SSID", false))); |
| scan_matches.deeper_nesting.insert( |
| AttrDataPair(kArrayAttrEnumVal, individual_scan_match)); |
| net_detect.deeper_nesting.insert( |
| AttrDataPair(NL80211_ATTR_SCHED_SCAN_MATCH, scan_matches)); |
| |
| // Net detect results attribute |
| NestedData net_detect_results( |
| kTypeNested, "NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS", false); |
| NestedData single_result(kTypeNested, "NL80211_WOWLAN_TRIG_NET_DETECT_RESULT", |
| true); |
| NestedData freq_list(kTypeNested, "NL80211_ATTR_SCAN_FREQUENCIES", false); |
| freq_list.deeper_nesting.insert(AttrDataPair( |
| kArrayAttrEnumVal, NestedData(kTypeU32, "Frequency match", true))); |
| single_result.deeper_nesting.insert( |
| AttrDataPair(NL80211_ATTR_SCAN_FREQUENCIES, freq_list)); |
| single_result.deeper_nesting.insert(AttrDataPair( |
| NL80211_ATTR_SSID, NestedData(kTypeRaw, "NL80211_ATTR_SSID", false))); |
| net_detect_results.deeper_nesting.insert( |
| AttrDataPair(kArrayAttrEnumVal, single_result)); |
| |
| // Main body of the triggers attribute. |
| nested_template_.insert(AttrDataPair( |
| NL80211_WOWLAN_TRIG_DISCONNECT, |
| NestedData(kTypeFlag, "NL80211_WOWLAN_TRIG_DISCONNECT", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_WOWLAN_TRIG_NET_DETECT, net_detect)); |
| nested_template_.insert( |
| AttrDataPair(NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS, net_detect_results)); |
| } |
| |
| const int Nl80211AttributeWowlanTriggersSupported::kName = |
| NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED; |
| const char Nl80211AttributeWowlanTriggersSupported::kNameString[] = |
| "NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED"; |
| |
| Nl80211AttributeWowlanTriggersSupported:: |
| Nl80211AttributeWowlanTriggersSupported() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| nested_template_.insert(AttrDataPair( |
| NL80211_WOWLAN_TRIG_DISCONNECT, |
| NestedData(kTypeFlag, "NL80211_WOWLAN_TRIG_DISCONNECT", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_WOWLAN_TRIG_PKT_PATTERN, |
| NestedData(kTypeRaw, "NL80211_WOWLAN_TRIG_PKT_PATTERN", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_WOWLAN_TRIG_NET_DETECT, |
| NestedData(kTypeU32, "NL80211_WOWLAN_TRIG_NET_DETECT", false))); |
| } |
| #endif // DISABLE_WAKE_ON_WIFI |
| |
| const int Nl80211AttributeCipherSuites::kName = NL80211_ATTR_CIPHER_SUITES; |
| const char Nl80211AttributeCipherSuites::kNameString[] = |
| "NL80211_ATTR_CIPHER_SUITES"; |
| |
| const int Nl80211AttributeControlPortEthertype::kName = |
| NL80211_ATTR_CONTROL_PORT_ETHERTYPE; |
| const char Nl80211AttributeControlPortEthertype::kNameString[] = |
| "NL80211_ATTR_CONTROL_PORT_ETHERTYPE"; |
| |
| const int Nl80211AttributeCqm::kName = NL80211_ATTR_CQM; |
| const char Nl80211AttributeCqm::kNameString[] = "NL80211_ATTR_CQM"; |
| |
| Nl80211AttributeCqm::Nl80211AttributeCqm() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| nested_template_.insert( |
| AttrDataPair(__NL80211_ATTR_CQM_INVALID, |
| NestedData(kTypeU32, "__NL80211_ATTR_CQM_INVALID", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_ATTR_CQM_RSSI_THOLD, |
| NestedData(kTypeU32, "NL80211_ATTR_CQM_RSSI_THOLD", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_ATTR_CQM_RSSI_HYST, |
| NestedData(kTypeU32, "NL80211_ATTR_CQM_RSSI_HYST", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT, |
| NestedData(kTypeU32, "NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_ATTR_CQM_PKT_LOSS_EVENT, |
| NestedData(kTypeU32, "NL80211_ATTR_CQM_PKT_LOSS_EVENT", false))); |
| } |
| |
| const int Nl80211AttributeDeviceApSme::kName = NL80211_ATTR_DEVICE_AP_SME; |
| const char Nl80211AttributeDeviceApSme::kNameString[] = |
| "NL80211_ATTR_DEVICE_AP_SME"; |
| |
| const int Nl80211AttributeDfsRegion::kName = NL80211_ATTR_DFS_REGION; |
| const char Nl80211AttributeDfsRegion::kNameString[] = "NL80211_ATTR_DFS_REGION"; |
| |
| const int Nl80211AttributeDisconnectedByAp::kName = |
| NL80211_ATTR_DISCONNECTED_BY_AP; |
| const char Nl80211AttributeDisconnectedByAp::kNameString[] = |
| "NL80211_ATTR_DISCONNECTED_BY_AP"; |
| |
| const int Nl80211AttributeDuration::kName = NL80211_ATTR_DURATION; |
| const char Nl80211AttributeDuration::kNameString[] = "NL80211_ATTR_DURATION"; |
| |
| const int Nl80211AttributeFeatureFlags::kName = NL80211_ATTR_FEATURE_FLAGS; |
| const char Nl80211AttributeFeatureFlags::kNameString[] = |
| "NL80211_ATTR_FEATURE_FLAGS"; |
| |
| const int Nl80211AttributeFrame::kName = NL80211_ATTR_FRAME; |
| const char Nl80211AttributeFrame::kNameString[] = "NL80211_ATTR_FRAME"; |
| |
| const int Nl80211AttributeGeneration::kName = NL80211_ATTR_GENERATION; |
| const char Nl80211AttributeGeneration::kNameString[] = |
| "NL80211_ATTR_GENERATION"; |
| |
| const int Nl80211AttributeHtCapabilityMask::kName = |
| NL80211_ATTR_HT_CAPABILITY_MASK; |
| const char Nl80211AttributeHtCapabilityMask::kNameString[] = |
| "NL80211_ATTR_HT_CAPABILITY_MASK"; |
| |
| const int Nl80211AttributeIfindex::kName = NL80211_ATTR_IFINDEX; |
| const char Nl80211AttributeIfindex::kNameString[] = "NL80211_ATTR_IFINDEX"; |
| |
| const int Nl80211AttributeIftype::kName = NL80211_ATTR_IFTYPE; |
| const char Nl80211AttributeIftype::kNameString[] = "NL80211_ATTR_IFTYPE"; |
| |
| const int Nl80211AttributeKeyIdx::kName = NL80211_ATTR_KEY_IDX; |
| const char Nl80211AttributeKeyIdx::kNameString[] = "NL80211_ATTR_KEY_IDX"; |
| |
| const int Nl80211AttributeKeySeq::kName = NL80211_ATTR_KEY_SEQ; |
| const char Nl80211AttributeKeySeq::kNameString[] = "NL80211_ATTR_KEY_SEQ"; |
| |
| const int Nl80211AttributeKeyType::kName = NL80211_ATTR_KEY_TYPE; |
| const char Nl80211AttributeKeyType::kNameString[] = "NL80211_ATTR_KEY_TYPE"; |
| |
| const int Nl80211AttributeMac::kName = NL80211_ATTR_MAC; |
| const char Nl80211AttributeMac::kNameString[] = "NL80211_ATTR_MAC"; |
| |
| bool Nl80211AttributeMac::ToString(std::string* value) const { |
| if (!value) { |
| LOG(ERROR) << "Null |value| parameter"; |
| return false; |
| } |
| *value = StringFromMacAddress(data_.GetConstData()); |
| return true; |
| } |
| |
| // static |
| string Nl80211AttributeMac::StringFromMacAddress(const uint8_t* arg) { |
| string output; |
| |
| if (!arg) { |
| static const char kBogusMacAddress[] = "XX:XX:XX:XX:XX:XX"; |
| output = kBogusMacAddress; |
| LOG(ERROR) << "|arg| parameter is NULL."; |
| } else { |
| output = StringPrintf("%02x:%02x:%02x:%02x:%02x:%02x", arg[0], arg[1], |
| arg[2], arg[3], arg[4], arg[5]); |
| } |
| return output; |
| } |
| |
| const int Nl80211AttributeMaxMatchSets::kName = NL80211_ATTR_MAX_MATCH_SETS; |
| const char Nl80211AttributeMaxMatchSets::kNameString[] = |
| "NL80211_ATTR_MAX_MATCH_SETS"; |
| |
| const int Nl80211AttributeMaxNumPmkids::kName = NL80211_ATTR_MAX_NUM_PMKIDS; |
| const char Nl80211AttributeMaxNumPmkids::kNameString[] = |
| "NL80211_ATTR_MAX_NUM_PMKIDS"; |
| |
| const int Nl80211AttributeMaxNumScanSsids::kName = |
| NL80211_ATTR_MAX_NUM_SCAN_SSIDS; |
| const char Nl80211AttributeMaxNumScanSsids::kNameString[] = |
| "NL80211_ATTR_MAX_NUM_SCAN_SSIDS"; |
| |
| const int Nl80211AttributeMaxNumSchedScanSsids::kName = |
| NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS; |
| const char Nl80211AttributeMaxNumSchedScanSsids::kNameString[] = |
| "NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS"; |
| |
| const int Nl80211AttributeMaxRemainOnChannelDuration::kName = |
| NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION; |
| const char Nl80211AttributeMaxRemainOnChannelDuration::kNameString[] = |
| "NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION"; |
| |
| const int Nl80211AttributeMaxScanIeLen::kName = NL80211_ATTR_MAX_SCAN_IE_LEN; |
| const char Nl80211AttributeMaxScanIeLen::kNameString[] = |
| "NL80211_ATTR_MAX_SCAN_IE_LEN"; |
| |
| const int Nl80211AttributeMaxSchedScanIeLen::kName = |
| NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN; |
| const char Nl80211AttributeMaxSchedScanIeLen::kNameString[] = |
| "NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN"; |
| |
| const int Nl80211AttributeOffchannelTxOk::kName = NL80211_ATTR_OFFCHANNEL_TX_OK; |
| const char Nl80211AttributeOffchannelTxOk::kNameString[] = |
| "NL80211_ATTR_OFFCHANNEL_TX_OK"; |
| |
| const int Nl80211AttributeProbeRespOffload::kName = |
| NL80211_ATTR_PROBE_RESP_OFFLOAD; |
| const char Nl80211AttributeProbeRespOffload::kNameString[] = |
| "NL80211_ATTR_PROBE_RESP_OFFLOAD"; |
| |
| const int Nl80211AttributeReasonCode::kName = NL80211_ATTR_REASON_CODE; |
| const char Nl80211AttributeReasonCode::kNameString[] = |
| "NL80211_ATTR_REASON_CODE"; |
| |
| const int Nl80211AttributeRegAlpha2::kName = NL80211_ATTR_REG_ALPHA2; |
| const char Nl80211AttributeRegAlpha2::kNameString[] = "NL80211_ATTR_REG_ALPHA2"; |
| |
| const int Nl80211AttributeRegInitiator::kName = NL80211_ATTR_REG_INITIATOR; |
| const char Nl80211AttributeRegInitiator::kNameString[] = |
| "NL80211_ATTR_REG_INITIATOR"; |
| |
| // The RegInitiator type can be interpreted as either a U8 or U32 depending |
| // on context. Override the default InitFromValue implementation to be |
| // flexible to either encoding. |
| bool Nl80211AttributeRegInitiator::InitFromValue(const ByteString& input) { |
| uint8_t u8_data; |
| if (input.GetLength() != sizeof(u8_data)) |
| return NetlinkU32Attribute::InitFromValue(input); |
| |
| if (!input.CopyData(sizeof(u8_data), &u8_data)) { |
| LOG(ERROR) << "Invalid |input| parameter."; |
| return false; |
| } |
| |
| SetU32Value(static_cast<uint32_t>(u8_data)); |
| return NetlinkAttribute::InitFromValue(input); |
| } |
| |
| const int Nl80211AttributeRegRules::kName = NL80211_ATTR_REG_RULES; |
| const char Nl80211AttributeRegRules::kNameString[] = "NL80211_ATTR_REG_RULES"; |
| |
| Nl80211AttributeRegRules::Nl80211AttributeRegRules() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| NestedData reg_rules(kTypeNested, "NL80211_REG_RULES", true); |
| reg_rules.deeper_nesting.insert(AttrDataPair( |
| __NL80211_REG_RULE_ATTR_INVALID, |
| NestedData(kTypeU32, "__NL80211_ATTR_REG_RULE_INVALID", false))); |
| reg_rules.deeper_nesting.insert( |
| AttrDataPair(NL80211_ATTR_REG_RULE_FLAGS, |
| NestedData(kTypeU32, "NL80211_ATTR_REG_RULE_FLAGS", false))); |
| reg_rules.deeper_nesting.insert(AttrDataPair( |
| NL80211_ATTR_FREQ_RANGE_START, |
| NestedData(kTypeU32, "NL80211_ATTR_FREQ_RANGE_START", false))); |
| reg_rules.deeper_nesting.insert( |
| AttrDataPair(NL80211_ATTR_FREQ_RANGE_END, |
| NestedData(kTypeU32, "NL80211_ATTR_FREQ_RANGE_END", false))); |
| reg_rules.deeper_nesting.insert(AttrDataPair( |
| NL80211_ATTR_FREQ_RANGE_MAX_BW, |
| NestedData(kTypeU32, "NL80211_ATTR_FREQ_RANGE_MAX_BW", false))); |
| reg_rules.deeper_nesting.insert(AttrDataPair( |
| NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, |
| NestedData(kTypeU32, "NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN", false))); |
| reg_rules.deeper_nesting.insert(AttrDataPair( |
| NL80211_ATTR_POWER_RULE_MAX_EIRP, |
| NestedData(kTypeU32, "NL80211_ATTR_POWER_RULE_MAX_EIRP", false))); |
| |
| nested_template_.insert(AttrDataPair(kArrayAttrEnumVal, reg_rules)); |
| } |
| |
| const int Nl80211AttributeRegType::kName = NL80211_ATTR_REG_TYPE; |
| const char Nl80211AttributeRegType::kNameString[] = "NL80211_ATTR_REG_TYPE"; |
| |
| const int Nl80211AttributeRespIe::kName = NL80211_ATTR_RESP_IE; |
| const char Nl80211AttributeRespIe::kNameString[] = "NL80211_ATTR_RESP_IE"; |
| |
| const int Nl80211AttributeRoamSupport::kName = NL80211_ATTR_ROAM_SUPPORT; |
| const char Nl80211AttributeRoamSupport::kNameString[] = |
| "NL80211_ATTR_ROAM_SUPPORT"; |
| |
| const int Nl80211AttributeScanFrequencies::kName = |
| NL80211_ATTR_SCAN_FREQUENCIES; |
| const char Nl80211AttributeScanFrequencies::kNameString[] = |
| "NL80211_ATTR_SCAN_FREQUENCIES"; |
| |
| Nl80211AttributeScanFrequencies::Nl80211AttributeScanFrequencies() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| nested_template_.insert(AttrDataPair( |
| kArrayAttrEnumVal, NestedData(kTypeU32, "NL80211_SCAN_FREQ", true))); |
| } |
| |
| const int Nl80211AttributeScanSsids::kName = NL80211_ATTR_SCAN_SSIDS; |
| const char Nl80211AttributeScanSsids::kNameString[] = "NL80211_ATTR_SCAN_SSIDS"; |
| |
| Nl80211AttributeScanSsids::Nl80211AttributeScanSsids() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| nested_template_.insert(AttrDataPair( |
| kArrayAttrEnumVal, NestedData(kTypeString, "NL80211_SCAN_SSID", true))); |
| } |
| |
| const int Nl80211AttributeMPathInfo::kName = NL80211_ATTR_MPATH_INFO; |
| const char Nl80211AttributeMPathInfo::kNameString[] = "NL80211_ATTR_MPATH_INFO"; |
| |
| Nl80211AttributeMPathInfo::Nl80211AttributeMPathInfo() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| nested_template_.insert(AttrDataPair( |
| __NL80211_MPATH_INFO_INVALID, |
| NestedData(kTypeU32, "__NL80211_MPATH_INFO_INVALID", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_MPATH_INFO_FRAME_QLEN, |
| NestedData(kTypeU32, "NL80211_MPATH_INFO_FRAME_QLEN", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_MPATH_INFO_SN, |
| NestedData(kTypeU32, "NL80211_MPATH_INFO_SN", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_MPATH_INFO_METRIC, |
| NestedData(kTypeU32, "NL80211_MPATH_INFO_METRIC", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_MPATH_INFO_EXPTIME, |
| NestedData(kTypeU32, "NL80211_MPATH_INFO_EXPTIME", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_MPATH_INFO_FLAGS, |
| NestedData(kTypeU8, "NL80211_MPATH_INFO_FLAGS", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_MPATH_INFO_DISCOVERY_TIMEOUT, |
| NestedData(kTypeU32, "NL80211_MPATH_INFO_DISCOVERY_TIMEOUT", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_MPATH_INFO_DISCOVERY_RETRIES, |
| NestedData(kTypeU8, "NL80211_MPATH_INFO_DISCOVERY_RETRIES", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_MPATH_INFO_HOP_COUNT, |
| NestedData(kTypeU8, "NL80211_MPATH_INFO_HOP_COUNT", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_MPATH_INFO_PATH_CHANGE, |
| NestedData(kTypeU32, "NL80211_MPATH_INFO_PATH_CHANGE", false))); |
| } |
| |
| const int Nl80211AttributeStaInfo::kName = NL80211_ATTR_STA_INFO; |
| const char Nl80211AttributeStaInfo::kNameString[] = "NL80211_ATTR_STA_INFO"; |
| |
| Nl80211AttributeStaInfo::Nl80211AttributeStaInfo() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| NestedData tx_rates(kTypeNested, "NL80211_STA_INFO_TX_BITRATE", false); |
| tx_rates.deeper_nesting.insert( |
| AttrDataPair(__NL80211_RATE_INFO_INVALID, |
| NestedData(kTypeU32, "__NL80211_RATE_INFO_INVALID", false))); |
| tx_rates.deeper_nesting.insert( |
| AttrDataPair(NL80211_RATE_INFO_BITRATE, |
| NestedData(kTypeU16, "NL80211_RATE_INFO_BITRATE", false))); |
| tx_rates.deeper_nesting.insert( |
| AttrDataPair(NL80211_RATE_INFO_MCS, |
| NestedData(kTypeU8, "NL80211_RATE_INFO_MCS", false))); |
| tx_rates.deeper_nesting.insert(AttrDataPair( |
| NL80211_RATE_INFO_40_MHZ_WIDTH, |
| NestedData(kTypeFlag, "NL80211_RATE_INFO_40_MHZ_WIDTH", false))); |
| tx_rates.deeper_nesting.insert( |
| AttrDataPair(NL80211_RATE_INFO_SHORT_GI, |
| NestedData(kTypeFlag, "NL80211_RATE_INFO_SHORT_GI", false))); |
| tx_rates.deeper_nesting.insert( |
| AttrDataPair(NL80211_RATE_INFO_BITRATE32, |
| NestedData(kTypeU32, "NL80211_RATE_INFO_BITRATE32", false))); |
| tx_rates.deeper_nesting.insert( |
| AttrDataPair(NL80211_RATE_INFO_VHT_MCS, |
| NestedData(kTypeU8, "NL80211_RATE_INFO_VHT_MCS", false))); |
| tx_rates.deeper_nesting.insert( |
| AttrDataPair(NL80211_RATE_INFO_VHT_NSS, |
| NestedData(kTypeU8, "NL80211_RATE_INFO_VHT_NSS", false))); |
| tx_rates.deeper_nesting.insert(AttrDataPair( |
| NL80211_RATE_INFO_80_MHZ_WIDTH, |
| NestedData(kTypeFlag, "NL80211_RATE_INFO_80_MHZ_WIDTH", false))); |
| tx_rates.deeper_nesting.insert(AttrDataPair( |
| NL80211_RATE_INFO_80P80_MHZ_WIDTH, |
| NestedData(kTypeFlag, "NL80211_RATE_INFO_80P80_MHZ_WIDTH", false))); |
| tx_rates.deeper_nesting.insert(AttrDataPair( |
| NL80211_RATE_INFO_160_MHZ_WIDTH, |
| NestedData(kTypeFlag, "NL80211_RATE_INFO_160_MHZ_WIDTH", false))); |
| |
| NestedData rx_rates(kTypeNested, "NL80211_STA_INFO_RX_BITRATE", false); |
| rx_rates.deeper_nesting = tx_rates.deeper_nesting; |
| |
| NestedData bss(kTypeNested, "NL80211_STA_INFO_BSS_PARAM", false); |
| bss.deeper_nesting.insert(AttrDataPair( |
| __NL80211_STA_BSS_PARAM_INVALID, |
| NestedData(kTypeU32, "__NL80211_STA_BSS_PARAM_INVALID", false))); |
| bss.deeper_nesting.insert(AttrDataPair( |
| NL80211_STA_BSS_PARAM_CTS_PROT, |
| NestedData(kTypeFlag, "NL80211_STA_BSS_PARAM_CTS_PROT", false))); |
| bss.deeper_nesting.insert(AttrDataPair( |
| NL80211_STA_BSS_PARAM_SHORT_PREAMBLE, |
| NestedData(kTypeFlag, "NL80211_STA_BSS_PARAM_SHORT_PREAMBLE", false))); |
| bss.deeper_nesting.insert(AttrDataPair( |
| NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME, |
| NestedData(kTypeFlag, "NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME", false))); |
| bss.deeper_nesting.insert(AttrDataPair( |
| NL80211_STA_BSS_PARAM_DTIM_PERIOD, |
| NestedData(kTypeU8, "NL80211_STA_BSS_PARAM_DTIM_PERIOD", false))); |
| bss.deeper_nesting.insert(AttrDataPair( |
| NL80211_STA_BSS_PARAM_BEACON_INTERVAL, |
| NestedData(kTypeU16, "NL80211_STA_BSS_PARAM_BEACON_INTERVAL", false))); |
| |
| nested_template_.insert( |
| AttrDataPair(__NL80211_STA_INFO_INVALID, |
| NestedData(kTypeU32, "__NL80211_STA_INFO_INVALID", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_STA_INFO_INACTIVE_TIME, |
| NestedData(kTypeU32, "NL80211_STA_INFO_INACTIVE_TIME", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_RX_BYTES, |
| NestedData(kTypeU32, "NL80211_STA_INFO_RX_BYTES", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_TX_BYTES, |
| NestedData(kTypeU32, "NL80211_STA_INFO_TX_BYTES", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_RX_BYTES64, |
| NestedData(kTypeU64, "NL80211_STA_INFO_RX_BYTES64", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_TX_BYTES64, |
| NestedData(kTypeU64, "NL80211_STA_INFO_TX_BYTES64", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_LLID, |
| NestedData(kTypeU16, "NL80211_STA_INFO_LLID", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_PLID, |
| NestedData(kTypeU16, "NL80211_STA_INFO_PLID", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_PLINK_STATE, |
| NestedData(kTypeU8, "NL80211_STA_INFO_PLINK_STATE", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_SIGNAL, |
| NestedData(kTypeU8, "NL80211_STA_INFO_SIGNAL", false))); |
| nested_template_.insert(AttrDataPair(NL80211_STA_INFO_TX_BITRATE, tx_rates)); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_RX_PACKETS, |
| NestedData(kTypeU32, "NL80211_STA_INFO_RX_PACKETS", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_TX_PACKETS, |
| NestedData(kTypeU32, "NL80211_STA_INFO_TX_PACKETS", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_TX_RETRIES, |
| NestedData(kTypeU32, "NL80211_STA_INFO_TX_RETRIES", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_TX_FAILED, |
| NestedData(kTypeU32, "NL80211_STA_INFO_TX_FAILED", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_SIGNAL_AVG, |
| NestedData(kTypeU8, "NL80211_STA_INFO_SIGNAL_AVG", false))); |
| nested_template_.insert(AttrDataPair(NL80211_STA_INFO_RX_BITRATE, rx_rates)); |
| nested_template_.insert(AttrDataPair(NL80211_STA_INFO_BSS_PARAM, bss)); |
| nested_template_.insert(AttrDataPair( |
| NL80211_STA_INFO_CONNECTED_TIME, |
| NestedData(kTypeU32, "NL80211_STA_INFO_CONNECTED_TIME", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_STA_INFO_STA_FLAGS, |
| NestedData(kTypeU64, "NL80211_STA_INFO_STA_FLAGS", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_STA_INFO_BEACON_LOSS, |
| NestedData(kTypeU32, "NL80211_STA_INFO_BEACON_LOSS", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_STA_INFO_BEACON_SIGNAL_AVG, |
| NestedData(kTypeU8, "NL80211_STA_INFO_BEACON_SIGNAL_AVG", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_STA_INFO_AIRTIME_LINK_METRIC, |
| NestedData(kTypeU32, "NL80211_STA_INFO_AIRTIME_LINK_METRIC", false))); |
| } |
| |
| const int Nl80211AttributeSupportedCommands::kName = |
| NL80211_ATTR_SUPPORTED_COMMANDS; |
| const char Nl80211AttributeSupportedCommands::kNameString[] = |
| "NL80211_ATTR_SUPPORTED_COMMANDS"; |
| |
| Nl80211AttributeSupportedCommands::Nl80211AttributeSupportedCommands() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| nested_template_.insert(AttrDataPair( |
| NL80211_ATTR_SUPPORTED_COMMANDS, |
| NestedData(kTypeU32, "NL80211_ATTR_SUPPORTED_COMMANDS", true))); |
| } |
| |
| const int Nl80211AttributeSurveyInfo::kName = NL80211_ATTR_SURVEY_INFO; |
| const char Nl80211AttributeSurveyInfo::kNameString[] = |
| "NL80211_ATTR_SURVEY_INFO"; |
| |
| Nl80211AttributeSurveyInfo::Nl80211AttributeSurveyInfo() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| nested_template_.insert(AttrDataPair( |
| NL80211_SURVEY_INFO_FREQUENCY, |
| NestedData(kTypeU32, "NL80211_SURVEY_INFO_FREQUENCY", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_SURVEY_INFO_NOISE, |
| NestedData(kTypeU8, "NL80211_SURVEY_INFO_NOISE", false))); |
| nested_template_.insert( |
| AttrDataPair(NL80211_SURVEY_INFO_IN_USE, |
| NestedData(kTypeFlag, "NL80211_SURVEY_INFO_IN_USE", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_SURVEY_INFO_CHANNEL_TIME, |
| NestedData(kTypeU64, "NL80211_SURVEY_INFO_CHANNEL_TIME", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY, |
| NestedData(kTypeU64, "NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY, |
| NestedData(kTypeU64, "NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY", |
| false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_SURVEY_INFO_CHANNEL_TIME_RX, |
| NestedData(kTypeU64, "NL80211_SURVEY_INFO_CHANNEL_TIME_RX", false))); |
| nested_template_.insert(AttrDataPair( |
| NL80211_SURVEY_INFO_CHANNEL_TIME_TX, |
| NestedData(kTypeU64, "NL80211_SURVEY_INFO_CHANNEL_TIME_TX", false))); |
| } |
| |
| const int Nl80211AttributeSupportedIftypes::kName = |
| NL80211_ATTR_SUPPORTED_IFTYPES; |
| const char Nl80211AttributeSupportedIftypes::kNameString[] = |
| "NL80211_ATTR_SUPPORTED_IFTYPES"; |
| Nl80211AttributeSupportedIftypes::Nl80211AttributeSupportedIftypes() |
| : NetlinkNestedAttribute(kName, kNameString) { |
| nested_template_.insert(AttrDataPair( |
| kArrayAttrEnumVal, |
| NestedData(kTypeFlag, "NL80211_SUPPORTED_IFTYPES_IFTYPE", true))); |
| } |
| |
| const int Nl80211AttributeStatusCode::kName = NL80211_ATTR_STATUS_CODE; |
| const char Nl80211AttributeStatusCode::kNameString[] = |
| "NL80211_ATTR_STATUS_CODE"; |
| |
| const int Nl80211AttributeSupportApUapsd::kName = NL80211_ATTR_SUPPORT_AP_UAPSD; |
| const char Nl80211AttributeSupportApUapsd::kNameString[] = |
| "NL80211_ATTR_SUPPORT_AP_UAPSD"; |
| |
| const int Nl80211AttributeSupportIbssRsn::kName = NL80211_ATTR_SUPPORT_IBSS_RSN; |
| const char Nl80211AttributeSupportIbssRsn::kNameString[] = |
| "NL80211_ATTR_SUPPORT_IBSS_RSN"; |
| |
| const int Nl80211AttributeSupportMeshAuth::kName = |
| NL80211_ATTR_SUPPORT_MESH_AUTH; |
| const char Nl80211AttributeSupportMeshAuth::kNameString[] = |
| "NL80211_ATTR_SUPPORT_MESH_AUTH"; |
| |
| const int Nl80211AttributeTdlsExternalSetup::kName = |
| NL80211_ATTR_TDLS_EXTERNAL_SETUP; |
| const char Nl80211AttributeTdlsExternalSetup::kNameString[] = |
| "NL80211_ATTR_TDLS_EXTERNAL_SETUP"; |
| |
| const int Nl80211AttributeTdlsSupport::kName = NL80211_ATTR_TDLS_SUPPORT; |
| const char Nl80211AttributeTdlsSupport::kNameString[] = |
| "NL80211_ATTR_TDLS_SUPPORT"; |
| |
| const int Nl80211AttributeTimedOut::kName = NL80211_ATTR_TIMED_OUT; |
| const char Nl80211AttributeTimedOut::kNameString[] = "NL80211_ATTR_TIMED_OUT"; |
| |
| const int Nl80211AttributeWiphyAntennaAvailRx::kName = |
| NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX; |
| const char Nl80211AttributeWiphyAntennaAvailRx::kNameString[] = |
| "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX"; |
| |
| const int Nl80211AttributeWiphyAntennaAvailTx::kName = |
| NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX; |
| const char Nl80211AttributeWiphyAntennaAvailTx::kNameString[] = |
| "NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX"; |
| |
| const int Nl80211AttributeWiphyAntennaRx::kName = NL80211_ATTR_WIPHY_ANTENNA_RX; |
| const char Nl80211AttributeWiphyAntennaRx::kNameString[] = |
| "NL80211_ATTR_WIPHY_ANTENNA_RX"; |
| |
| const int Nl80211AttributeWiphyAntennaTx::kName = NL80211_ATTR_WIPHY_ANTENNA_TX; |
| const char Nl80211AttributeWiphyAntennaTx::kNameString[] = |
| "NL80211_ATTR_WIPHY_ANTENNA_TX"; |
| |
| const int Nl80211AttributeWiphyCoverageClass::kName = |
| NL80211_ATTR_WIPHY_COVERAGE_CLASS; |
| const char Nl80211AttributeWiphyCoverageClass::kNameString[] = |
| "NL80211_ATTR_WIPHY_COVERAGE_CLASS"; |
| |
| const int Nl80211AttributeWiphyFragThreshold::kName = |
| NL80211_ATTR_WIPHY_FRAG_THRESHOLD; |
| const char Nl80211AttributeWiphyFragThreshold::kNameString[] = |
| "NL80211_ATTR_WIPHY_FRAG_THRESHOLD"; |
| |
| const int Nl80211AttributeWiphyFreq::kName = NL80211_ATTR_WIPHY_FREQ; |
| const char Nl80211AttributeWiphyFreq::kNameString[] = "NL80211_ATTR_WIPHY_FREQ"; |
| |
| const int Nl80211AttributeChannelType::kName = NL80211_ATTR_WIPHY_CHANNEL_TYPE; |
| const char Nl80211AttributeChannelType::kNameString[] = |
| "NL80211_ATTR_WIPHY_CHANNEL_TYPE"; |
| |
| const int Nl80211AttributeChannelWidth::kName = NL80211_ATTR_CHANNEL_WIDTH; |
| const char Nl80211AttributeChannelWidth::kNameString[] = |
| "NL80211_ATTR_CHANNEL_WIDTH"; |
| |
| const int Nl80211AttributeCenterFreq1::kName = NL80211_ATTR_CENTER_FREQ1; |
| const char Nl80211AttributeCenterFreq1::kNameString[] = |
| "NL80211_ATTR_CENTER_FREQ1"; |
| |
| const int Nl80211AttributeCenterFreq2::kName = NL80211_ATTR_CENTER_FREQ2; |
| const char Nl80211AttributeCenterFreq2::kNameString[] = |
| "NL80211_ATTR_CENTER_FREQ2"; |
| |
| const int Nl80211AttributeWiphy::kName = NL80211_ATTR_WIPHY; |
| const char Nl80211AttributeWiphy::kNameString[] = "NL80211_ATTR_WIPHY"; |
| |
| const int Nl80211AttributeWiphyName::kName = NL80211_ATTR_WIPHY_NAME; |
| const char Nl80211AttributeWiphyName::kNameString[] = "NL80211_ATTR_WIPHY_NAME"; |
| |
| const int Nl80211AttributeWiphyRetryLong::kName = NL80211_ATTR_WIPHY_RETRY_LONG; |
| const char Nl80211AttributeWiphyRetryLong::kNameString[] = |
| "NL80211_ATTR_WIPHY_RETRY_LONG"; |
| |
| const int Nl80211AttributeWiphyRetryShort::kName = |
| NL80211_ATTR_WIPHY_RETRY_SHORT; |
| const char Nl80211AttributeWiphyRetryShort::kNameString[] = |
| "NL80211_ATTR_WIPHY_RETRY_SHORT"; |
| |
| const int Nl80211AttributeWiphyRtsThreshold::kName = |
| NL80211_ATTR_WIPHY_RTS_THRESHOLD; |
| const char Nl80211AttributeWiphyRtsThreshold::kNameString[] = |
| "NL80211_ATTR_WIPHY_RTS_THRESHOLD"; |
| |
| } // namespace shill |