//
// Copyright (C) 2012 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#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"

struct nlattr;

namespace shill {

// U8.

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeDfsRegion);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeKeyIdx);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeMaxMatchSets);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeMaxNumPmkids);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeMaxNumScanSsids);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeMaxNumSchedScanSsids);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeRegType);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyCoverageClass);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyRetryLong);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyRetryShort);
};

// U16.

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeMaxScanIeLen);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeMaxSchedScanIeLen);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeReasonCode);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeStatusCode);
};

// U32.

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeDuration);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeDeviceApSme);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeFeatureFlags);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeGeneration);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeIfindex);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeIftype);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeKeyType);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeMaxRemainOnChannelDuration);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeProbeRespOffload);
};

// 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) {}
  bool InitFromValue(const ByteString& data) override;

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeRegInitiator);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphy);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyAntennaAvailRx);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyAntennaAvailTx);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyAntennaRx);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyAntennaTx);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyFragThreshold);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyFreq);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeChannelType);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeChannelWidth);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeCenterFreq1);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeCenterFreq2);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyRtsThreshold);
};

// U64.

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeCookie);
};

// Flag.

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeControlPortEthertype);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeDisconnectedByAp);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeOffchannelTxOk);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeRoamSupport);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeSupportApUapsd);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeSupportIbssRsn);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeSupportMeshAuth);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeTdlsExternalSetup);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeTdlsSupport);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeTimedOut);
};

// String.

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeRegAlpha2);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyName);
};

// 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();

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

  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeBss);
};

class Nl80211AttributeCqm : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeCqm();

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeCqm);
};

class Nl80211AttributeRegRules : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeRegRules();

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeRegRules);
};

class Nl80211AttributeScanFrequencies : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeScanFrequencies();

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeScanFrequencies);
};

class Nl80211AttributeScanSsids : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeScanSsids();

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeScanSsids);
};

class Nl80211AttributeStaInfo : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeStaInfo();

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeStaInfo);
};

class Nl80211AttributeMPathInfo : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMPathInfo();

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeMPathInfo);
};

class Nl80211AttributeSupportedIftypes : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeSupportedIftypes();

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeSupportedIftypes);
};

class Nl80211AttributeWiphyBands : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWiphyBands();

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWiphyBands);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWowlanTriggers);
};

class Nl80211AttributeWowlanTriggersSupported : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeWowlanTriggersSupported();

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeWowlanTriggersSupported);
};
#endif  // DISABLE_WAKE_ON_WIFI

// Raw.

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeCipherSuites);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeFrame);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeHtCapabilityMask);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeKeySeq);
};

class Nl80211AttributeMac : public NetlinkRawAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeMac() : NetlinkRawAttribute(kName, kNameString) {}
  virtual bool ToString(std::string* value) const;

  // 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);

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeMac);
};

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

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeRespIe);
};

class Nl80211AttributeSurveyInfo : public NetlinkNestedAttribute {
 public:
  static const int kName;
  static const char kNameString[];
  Nl80211AttributeSurveyInfo();

 private:
  DISALLOW_COPY_AND_ASSIGN(Nl80211AttributeSurveyInfo);
};

}  // namespace shill

#endif  // SHILL_NET_NL80211_ATTRIBUTE_H_
