// 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.

#ifndef SHILL_NET_NL80211_ATTRIBUTE_H_
#define SHILL_NET_NL80211_ATTRIBUTE_H_

#include <string>

#include <base/macros.h>

#include "shill/net/netlink_attribute.h"
#include "shill/net/netlink_message.h"

namespace shill {

// U8.

class Nl80211AttributeDfsRegion : public NetlinkU8Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeDfsRegion() : NetlinkU8Attribute(kName, kNameString) {}
  Nl80211AttributeDfsRegion(const Nl80211AttributeDfsRegion&) = delete;
  Nl80211AttributeDfsRegion& operator=(const Nl80211AttributeDfsRegion&) =
      delete;
};

class Nl80211AttributeKeyIdx : public NetlinkU8Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeKeyIdx() : NetlinkU8Attribute(kName, kNameString) {}
  Nl80211AttributeKeyIdx(const Nl80211AttributeKeyIdx&) = delete;
  Nl80211AttributeKeyIdx& operator=(const Nl80211AttributeKeyIdx&) = delete;
};

class Nl80211AttributeMaxMatchSets : public NetlinkU8Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMaxMatchSets() : NetlinkU8Attribute(kName, kNameString) {}
  Nl80211AttributeMaxMatchSets(const Nl80211AttributeMaxMatchSets&) = delete;
  Nl80211AttributeMaxMatchSets& operator=(const Nl80211AttributeMaxMatchSets&) =
      delete;
};

class Nl80211AttributeMaxNumPmkids : public NetlinkU8Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMaxNumPmkids() : NetlinkU8Attribute(kName, kNameString) {}
  Nl80211AttributeMaxNumPmkids(const Nl80211AttributeMaxNumPmkids&) = delete;
  Nl80211AttributeMaxNumPmkids& operator=(const Nl80211AttributeMaxNumPmkids&) =
      delete;
};

class Nl80211AttributeMaxNumScanSsids : public NetlinkU8Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMaxNumScanSsids() : NetlinkU8Attribute(kName, kNameString) {}
  Nl80211AttributeMaxNumScanSsids(const Nl80211AttributeMaxNumScanSsids&) =
      delete;
  Nl80211AttributeMaxNumScanSsids& operator=(
      const Nl80211AttributeMaxNumScanSsids&) = delete;
};

class Nl80211AttributeMaxNumSchedScanSsids : public NetlinkU8Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMaxNumSchedScanSsids()
      : NetlinkU8Attribute(kName, kNameString) {}
  Nl80211AttributeMaxNumSchedScanSsids(
      const Nl80211AttributeMaxNumSchedScanSsids&) = delete;
  Nl80211AttributeMaxNumSchedScanSsids& operator=(
      const Nl80211AttributeMaxNumSchedScanSsids&) = delete;
};

class Nl80211AttributeRegType : public NetlinkU8Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeRegType() : NetlinkU8Attribute(kName, kNameString) {}
  Nl80211AttributeRegType(const Nl80211AttributeRegType&) = delete;
  Nl80211AttributeRegType& operator=(const Nl80211AttributeRegType&) = delete;
};

class Nl80211AttributeWiphyCoverageClass : public NetlinkU8Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyCoverageClass()
      : NetlinkU8Attribute(kName, kNameString) {}
  Nl80211AttributeWiphyCoverageClass(
      const Nl80211AttributeWiphyCoverageClass&) = delete;
  Nl80211AttributeWiphyCoverageClass& operator=(
      const Nl80211AttributeWiphyCoverageClass&) = delete;
};

class Nl80211AttributeWiphyRetryLong : public NetlinkU8Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyRetryLong() : NetlinkU8Attribute(kName, kNameString) {}
  Nl80211AttributeWiphyRetryLong(const Nl80211AttributeWiphyRetryLong&) =
      delete;
  Nl80211AttributeWiphyRetryLong& operator=(
      const Nl80211AttributeWiphyRetryLong&) = delete;
};

class Nl80211AttributeWiphyRetryShort : public NetlinkU8Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyRetryShort() : NetlinkU8Attribute(kName, kNameString) {}
  Nl80211AttributeWiphyRetryShort(const Nl80211AttributeWiphyRetryShort&) =
      delete;
  Nl80211AttributeWiphyRetryShort& operator=(
      const Nl80211AttributeWiphyRetryShort&) = delete;
};

// U16.

class Nl80211AttributeMaxScanIeLen : public NetlinkU16Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMaxScanIeLen() : NetlinkU16Attribute(kName, kNameString) {}
  Nl80211AttributeMaxScanIeLen(const Nl80211AttributeMaxScanIeLen&) = delete;
  Nl80211AttributeMaxScanIeLen& operator=(const Nl80211AttributeMaxScanIeLen&) =
      delete;
};

class Nl80211AttributeMaxSchedScanIeLen : public NetlinkU16Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMaxSchedScanIeLen()
      : NetlinkU16Attribute(kName, kNameString) {}
  Nl80211AttributeMaxSchedScanIeLen(const Nl80211AttributeMaxSchedScanIeLen&) =
      delete;
  Nl80211AttributeMaxSchedScanIeLen& operator=(
      const Nl80211AttributeMaxSchedScanIeLen&) = delete;
};

class Nl80211AttributeReasonCode : public NetlinkU16Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeReasonCode() : NetlinkU16Attribute(kName, kNameString) {}
  Nl80211AttributeReasonCode(const Nl80211AttributeReasonCode&) = delete;
  Nl80211AttributeReasonCode& operator=(const Nl80211AttributeReasonCode&) =
      delete;
};

class Nl80211AttributeStatusCode : public NetlinkU16Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeStatusCode() : NetlinkU16Attribute(kName, kNameString) {}
  Nl80211AttributeStatusCode(const Nl80211AttributeStatusCode&) = delete;
  Nl80211AttributeStatusCode& operator=(const Nl80211AttributeStatusCode&) =
      delete;
};

// U32.

class Nl80211AttributeDuration : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeDuration() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeDuration(const Nl80211AttributeDuration&) = delete;
  Nl80211AttributeDuration& operator=(const Nl80211AttributeDuration&) = delete;
};

class Nl80211AttributeDeviceApSme : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeDeviceApSme() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeDeviceApSme(const Nl80211AttributeDeviceApSme&) = delete;
  Nl80211AttributeDeviceApSme& operator=(const Nl80211AttributeDeviceApSme&) =
      delete;
};

class Nl80211AttributeFeatureFlags : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeFeatureFlags() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeFeatureFlags(const Nl80211AttributeFeatureFlags&) = delete;
  Nl80211AttributeFeatureFlags& operator=(const Nl80211AttributeFeatureFlags&) =
      delete;
};

class Nl80211AttributeGeneration : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeGeneration() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeGeneration(const Nl80211AttributeGeneration&) = delete;
  Nl80211AttributeGeneration& operator=(const Nl80211AttributeGeneration&) =
      delete;
};

class Nl80211AttributeIfindex : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeIfindex() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeIfindex(const Nl80211AttributeIfindex&) = delete;
  Nl80211AttributeIfindex& operator=(const Nl80211AttributeIfindex&) = delete;
};

class Nl80211AttributeIftype : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeIftype() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeIftype(const Nl80211AttributeIftype&) = delete;
  Nl80211AttributeIftype& operator=(const Nl80211AttributeIftype&) = delete;
};

class Nl80211AttributeKeyType : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeKeyType() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeKeyType(const Nl80211AttributeKeyType&) = delete;
  Nl80211AttributeKeyType& operator=(const Nl80211AttributeKeyType&) = delete;
};

class Nl80211AttributeMaxRemainOnChannelDuration : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMaxRemainOnChannelDuration()
      : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeMaxRemainOnChannelDuration(
      const Nl80211AttributeMaxRemainOnChannelDuration&) = delete;
  Nl80211AttributeMaxRemainOnChannelDuration& operator=(
      const Nl80211AttributeMaxRemainOnChannelDuration&) = delete;
};

class Nl80211AttributeProbeRespOffload : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeProbeRespOffload()
      : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeProbeRespOffload(const Nl80211AttributeProbeRespOffload&) =
      delete;
  Nl80211AttributeProbeRespOffload& operator=(
      const Nl80211AttributeProbeRespOffload&) = delete;
};

// Set SHILL_EXPORT to allow unit tests to instantiate these.
class SHILL_EXPORT Nl80211AttributeRegInitiator : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeRegInitiator() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeRegInitiator(const Nl80211AttributeRegInitiator&) = delete;
  Nl80211AttributeRegInitiator& operator=(const Nl80211AttributeRegInitiator&) =
      delete;

  bool InitFromValue(const ByteString& data) override;
};

class Nl80211AttributeWiphy : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphy() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeWiphy(const Nl80211AttributeWiphy&) = delete;
  Nl80211AttributeWiphy& operator=(const Nl80211AttributeWiphy&) = delete;
};

class Nl80211AttributeWiphyAntennaAvailRx : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyAntennaAvailRx()
      : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeWiphyAntennaAvailRx(
      const Nl80211AttributeWiphyAntennaAvailRx&) = delete;
  Nl80211AttributeWiphyAntennaAvailRx& operator=(
      const Nl80211AttributeWiphyAntennaAvailRx&) = delete;
};

class Nl80211AttributeWiphyAntennaAvailTx : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyAntennaAvailTx()
      : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeWiphyAntennaAvailTx(
      const Nl80211AttributeWiphyAntennaAvailTx&) = delete;
  Nl80211AttributeWiphyAntennaAvailTx& operator=(
      const Nl80211AttributeWiphyAntennaAvailTx&) = delete;
};

class Nl80211AttributeWiphyAntennaRx : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyAntennaRx() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeWiphyAntennaRx(const Nl80211AttributeWiphyAntennaRx&) =
      delete;
  Nl80211AttributeWiphyAntennaRx& operator=(
      const Nl80211AttributeWiphyAntennaRx&) = delete;
};

class Nl80211AttributeWiphyAntennaTx : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyAntennaTx() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeWiphyAntennaTx(const Nl80211AttributeWiphyAntennaTx&) =
      delete;
  Nl80211AttributeWiphyAntennaTx& operator=(
      const Nl80211AttributeWiphyAntennaTx&) = delete;
};

class Nl80211AttributeWiphyFragThreshold : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyFragThreshold()
      : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeWiphyFragThreshold(
      const Nl80211AttributeWiphyFragThreshold&) = delete;
  Nl80211AttributeWiphyFragThreshold& operator=(
      const Nl80211AttributeWiphyFragThreshold&) = delete;
};

class Nl80211AttributeWiphyFreq : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyFreq() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeWiphyFreq(const Nl80211AttributeWiphyFreq&) = delete;
  Nl80211AttributeWiphyFreq& operator=(const Nl80211AttributeWiphyFreq&) =
      delete;
};

class Nl80211AttributeChannelType : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeChannelType() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeChannelType(const Nl80211AttributeChannelType&) = delete;
  Nl80211AttributeChannelType& operator=(const Nl80211AttributeChannelType&) =
      delete;
};

class Nl80211AttributeChannelWidth : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeChannelWidth() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeChannelWidth(const Nl80211AttributeChannelWidth&) = delete;
  Nl80211AttributeChannelWidth& operator=(const Nl80211AttributeChannelWidth&) =
      delete;
};

class Nl80211AttributeCenterFreq1 : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeCenterFreq1() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeCenterFreq1(const Nl80211AttributeCenterFreq1&) = delete;
  Nl80211AttributeCenterFreq1& operator=(const Nl80211AttributeCenterFreq1&) =
      delete;
};

class Nl80211AttributeCenterFreq2 : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeCenterFreq2() : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeCenterFreq2(const Nl80211AttributeCenterFreq2&) = delete;
  Nl80211AttributeCenterFreq2& operator=(const Nl80211AttributeCenterFreq2&) =
      delete;
};

class Nl80211AttributeWiphyRtsThreshold : public NetlinkU32Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyRtsThreshold()
      : NetlinkU32Attribute(kName, kNameString) {}
  Nl80211AttributeWiphyRtsThreshold(const Nl80211AttributeWiphyRtsThreshold&) =
      delete;
  Nl80211AttributeWiphyRtsThreshold& operator=(
      const Nl80211AttributeWiphyRtsThreshold&) = delete;
};

// U64.

class Nl80211AttributeCookie : public NetlinkU64Attribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeCookie() : NetlinkU64Attribute(kName, kNameString) {}
  Nl80211AttributeCookie(const Nl80211AttributeCookie&) = delete;
  Nl80211AttributeCookie& operator=(const Nl80211AttributeCookie&) = delete;
};

// Flag.

class Nl80211AttributeControlPortEthertype : public NetlinkFlagAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeControlPortEthertype()
      : NetlinkFlagAttribute(kName, kNameString) {}
  Nl80211AttributeControlPortEthertype(
      const Nl80211AttributeControlPortEthertype&) = delete;
  Nl80211AttributeControlPortEthertype& operator=(
      const Nl80211AttributeControlPortEthertype&) = delete;
};

class Nl80211AttributeDisconnectedByAp : public NetlinkFlagAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeDisconnectedByAp()
      : NetlinkFlagAttribute(kName, kNameString) {}
  Nl80211AttributeDisconnectedByAp(const Nl80211AttributeDisconnectedByAp&) =
      delete;
  Nl80211AttributeDisconnectedByAp& operator=(
      const Nl80211AttributeDisconnectedByAp&) = delete;
};

class Nl80211AttributeOffchannelTxOk : public NetlinkFlagAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeOffchannelTxOk() : NetlinkFlagAttribute(kName, kNameString) {}
  Nl80211AttributeOffchannelTxOk(const Nl80211AttributeOffchannelTxOk&) =
      delete;
  Nl80211AttributeOffchannelTxOk& operator=(
      const Nl80211AttributeOffchannelTxOk&) = delete;
};

class Nl80211AttributeRoamSupport : public NetlinkFlagAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeRoamSupport() : NetlinkFlagAttribute(kName, kNameString) {}
  Nl80211AttributeRoamSupport(const Nl80211AttributeRoamSupport&) = delete;
  Nl80211AttributeRoamSupport& operator=(const Nl80211AttributeRoamSupport&) =
      delete;
};

class Nl80211AttributeSupportApUapsd : public NetlinkFlagAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeSupportApUapsd() : NetlinkFlagAttribute(kName, kNameString) {}
  Nl80211AttributeSupportApUapsd(const Nl80211AttributeSupportApUapsd&) =
      delete;
  Nl80211AttributeSupportApUapsd& operator=(
      const Nl80211AttributeSupportApUapsd&) = delete;
};

class Nl80211AttributeSupportIbssRsn : public NetlinkFlagAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeSupportIbssRsn() : NetlinkFlagAttribute(kName, kNameString) {}
  Nl80211AttributeSupportIbssRsn(const Nl80211AttributeSupportIbssRsn&) =
      delete;
  Nl80211AttributeSupportIbssRsn& operator=(
      const Nl80211AttributeSupportIbssRsn&) = delete;
};

class Nl80211AttributeSupportMeshAuth : public NetlinkFlagAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeSupportMeshAuth()
      : NetlinkFlagAttribute(kName, kNameString) {}
  Nl80211AttributeSupportMeshAuth(const Nl80211AttributeSupportMeshAuth&) =
      delete;
  Nl80211AttributeSupportMeshAuth& operator=(
      const Nl80211AttributeSupportMeshAuth&) = delete;
};

class Nl80211AttributeTdlsExternalSetup : public NetlinkFlagAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeTdlsExternalSetup()
      : NetlinkFlagAttribute(kName, kNameString) {}
  Nl80211AttributeTdlsExternalSetup(const Nl80211AttributeTdlsExternalSetup&) =
      delete;
  Nl80211AttributeTdlsExternalSetup& operator=(
      const Nl80211AttributeTdlsExternalSetup&) = delete;
};

class Nl80211AttributeTdlsSupport : public NetlinkFlagAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeTdlsSupport() : NetlinkFlagAttribute(kName, kNameString) {}
  Nl80211AttributeTdlsSupport(const Nl80211AttributeTdlsSupport&) = delete;
  Nl80211AttributeTdlsSupport& operator=(const Nl80211AttributeTdlsSupport&) =
      delete;
};

class Nl80211AttributeTimedOut : public NetlinkFlagAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeTimedOut() : NetlinkFlagAttribute(kName, kNameString) {}
  Nl80211AttributeTimedOut(const Nl80211AttributeTimedOut&) = delete;
  Nl80211AttributeTimedOut& operator=(const Nl80211AttributeTimedOut&) = delete;
};

// String.

class Nl80211AttributeRegAlpha2 : public NetlinkStringAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeRegAlpha2() : NetlinkStringAttribute(kName, kNameString) {}
  Nl80211AttributeRegAlpha2(const Nl80211AttributeRegAlpha2&) = delete;
  Nl80211AttributeRegAlpha2& operator=(const Nl80211AttributeRegAlpha2&) =
      delete;
};

class Nl80211AttributeWiphyName : public NetlinkStringAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyName() : NetlinkStringAttribute(kName, kNameString) {}
  Nl80211AttributeWiphyName(const Nl80211AttributeWiphyName&) = delete;
  Nl80211AttributeWiphyName& operator=(const Nl80211AttributeWiphyName&) =
      delete;
};

// Nested.

class Nl80211AttributeBss : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  // These are sorted alphabetically.
  static const int kChallengeTextAttributeId;
  static const int kChannelsAttributeId;
  static const int kCountryInfoAttributeId;
  static const int kDSParameterSetAttributeId;
  static const int kErpAttributeId;
  static const int kExtendedRatesAttributeId;
  static const int kHtCapAttributeId;
  static const int kHtInfoAttributeId;
  static const int kMeshIdAttributeId;
  static const int kPowerCapabilityAttributeId;
  static const int kPowerConstraintAttributeId;
  static const int kRequestAttributeId;
  static const int kRsnAttributeId;
  static const int kSsidAttributeId;
  static const int kSupportedRatesAttributeId;
  static const int kTpcReportAttributeId;
  static const int kVendorSpecificAttributeId;
  static const int kVhtCapAttributeId;
  static const int kVhtInfoAttributeId;

  Nl80211AttributeBss();
  Nl80211AttributeBss(const Nl80211AttributeBss&) = delete;
  Nl80211AttributeBss& operator=(const Nl80211AttributeBss&) = delete;

 private:
  static bool ParseInformationElements(AttributeList* attribute_list,
                                       size_t id,
                                       const std::string& attribute_name,
                                       ByteString data);
};

class Nl80211AttributeCqm : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeCqm();
  Nl80211AttributeCqm(const Nl80211AttributeCqm&) = delete;
  Nl80211AttributeCqm& operator=(const Nl80211AttributeCqm&) = delete;
};

class Nl80211AttributeRegRules : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeRegRules();
  Nl80211AttributeRegRules(const Nl80211AttributeRegRules&) = delete;
  Nl80211AttributeRegRules& operator=(const Nl80211AttributeRegRules&) = delete;
};

class Nl80211AttributeScanFrequencies : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeScanFrequencies();
  Nl80211AttributeScanFrequencies(const Nl80211AttributeScanFrequencies&) =
      delete;
  Nl80211AttributeScanFrequencies& operator=(
      const Nl80211AttributeScanFrequencies&) = delete;
};

class Nl80211AttributeScanSsids : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeScanSsids();
  Nl80211AttributeScanSsids(const Nl80211AttributeScanSsids&) = delete;
  Nl80211AttributeScanSsids& operator=(const Nl80211AttributeScanSsids&) =
      delete;
};

class Nl80211AttributeStaInfo : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeStaInfo();
  Nl80211AttributeStaInfo(const Nl80211AttributeStaInfo&) = delete;
  Nl80211AttributeStaInfo& operator=(const Nl80211AttributeStaInfo&) = delete;
};

class Nl80211AttributeMPathInfo : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMPathInfo();
  Nl80211AttributeMPathInfo(const Nl80211AttributeMPathInfo&) = delete;
  Nl80211AttributeMPathInfo& operator=(const Nl80211AttributeMPathInfo&) =
      delete;
};

class Nl80211AttributeSupportedIftypes : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeSupportedIftypes();
  Nl80211AttributeSupportedIftypes(const Nl80211AttributeSupportedIftypes&) =
      delete;
  Nl80211AttributeSupportedIftypes& operator=(
      const Nl80211AttributeSupportedIftypes&) = delete;
};

class Nl80211AttributeWiphyBands : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyBands();
  Nl80211AttributeWiphyBands(const Nl80211AttributeWiphyBands&) = delete;
  Nl80211AttributeWiphyBands& operator=(const Nl80211AttributeWiphyBands&) =
      delete;
};

#if !defined(DISABLE_WAKE_ON_WIFI)
class Nl80211AttributeWowlanTriggers : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  explicit Nl80211AttributeWowlanTriggers(
      NetlinkMessage::MessageContext context);
  Nl80211AttributeWowlanTriggers(const Nl80211AttributeWowlanTriggers&) =
      delete;
  Nl80211AttributeWowlanTriggers& operator=(
      const Nl80211AttributeWowlanTriggers&) = delete;
};

class Nl80211AttributeWowlanTriggersSupported : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWowlanTriggersSupported();
  Nl80211AttributeWowlanTriggersSupported(
      const Nl80211AttributeWowlanTriggersSupported&) = delete;
  Nl80211AttributeWowlanTriggersSupported& operator=(
      const Nl80211AttributeWowlanTriggersSupported&) = delete;
};
#endif  // DISABLE_WAKE_ON_WIFI

// Raw.

class Nl80211AttributeCipherSuites : public NetlinkRawAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeCipherSuites() : NetlinkRawAttribute(kName, kNameString) {}
  Nl80211AttributeCipherSuites(const Nl80211AttributeCipherSuites&) = delete;
  Nl80211AttributeCipherSuites& operator=(const Nl80211AttributeCipherSuites&) =
      delete;
};

class Nl80211AttributeFrame : public NetlinkRawAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeFrame() : NetlinkRawAttribute(kName, kNameString) {}
  Nl80211AttributeFrame(const Nl80211AttributeFrame&) = delete;
  Nl80211AttributeFrame& operator=(const Nl80211AttributeFrame&) = delete;
};

class Nl80211AttributeHtCapabilityMask : public NetlinkRawAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeHtCapabilityMask()
      : NetlinkRawAttribute(kName, kNameString) {}
  Nl80211AttributeHtCapabilityMask(const Nl80211AttributeHtCapabilityMask&) =
      delete;
  Nl80211AttributeHtCapabilityMask& operator=(
      const Nl80211AttributeHtCapabilityMask&) = delete;
};

class Nl80211AttributeKeySeq : public NetlinkRawAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeKeySeq() : NetlinkRawAttribute(kName, kNameString) {}
  Nl80211AttributeKeySeq(const Nl80211AttributeKeySeq&) = delete;
  Nl80211AttributeKeySeq& operator=(const Nl80211AttributeKeySeq&) = delete;
};

class Nl80211AttributeMac : public NetlinkRawAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMac() : NetlinkRawAttribute(kName, kNameString) {}
  Nl80211AttributeMac(const Nl80211AttributeMac&) = delete;
  Nl80211AttributeMac& operator=(const Nl80211AttributeMac&) = delete;

  bool ToString(std::string* value) const override;

  // Stringizes the MAC address found in 'arg'.  If there are problems (such
  // as a NULL |arg|), |value| is set to a bogus MAC address.
  static std::string StringFromMacAddress(const uint8_t* arg);
};

class Nl80211AttributeRespIe : public NetlinkRawAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeRespIe() : NetlinkRawAttribute(kName, kNameString) {}
  Nl80211AttributeRespIe(const Nl80211AttributeRespIe&) = delete;
  Nl80211AttributeRespIe& operator=(const Nl80211AttributeRespIe&) = delete;
};

class Nl80211AttributeSurveyInfo : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeSurveyInfo();
  Nl80211AttributeSurveyInfo(const Nl80211AttributeSurveyInfo&) = delete;
  Nl80211AttributeSurveyInfo& operator=(const Nl80211AttributeSurveyInfo&) =
      delete;
};

class Nl80211AttributeSupportedCommands : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeSupportedCommands();
  Nl80211AttributeSupportedCommands(const Nl80211AttributeSupportedCommands&) =
      delete;
  Nl80211AttributeSupportedCommands& operator=(
      const Nl80211AttributeSupportedCommands&) = delete;
};

}  // namespace shill

#endif  // SHILL_NET_NL80211_ATTRIBUTE_H_
