552 lines
14 KiB
C++
552 lines
14 KiB
C++
//
|
|
// 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_MESSAGE_H_
|
|
#define SHILL_NET_NL80211_MESSAGE_H_
|
|
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <base/lazy_instance.h>
|
|
|
|
#include "shill/net/byte_string.h"
|
|
#include "shill/net/generic_netlink_message.h"
|
|
#include "shill/net/shill_export.h"
|
|
|
|
namespace shill {
|
|
|
|
class NetlinkPacket;
|
|
|
|
// Class for messages received from the mac80211 drivers by way of the
|
|
// cfg80211 kernel module.
|
|
class SHILL_EXPORT Nl80211Message : public GenericNetlinkMessage {
|
|
public:
|
|
static const char kMessageTypeString[];
|
|
|
|
Nl80211Message(uint8_t command, const char* command_string)
|
|
: GenericNetlinkMessage(nl80211_message_type_, command, command_string) {}
|
|
~Nl80211Message() override {}
|
|
|
|
// Gets the family_id / message_type for all Nl80211 messages.
|
|
static uint16_t GetMessageType();
|
|
|
|
// Sets the family_id / message_type for all Nl80211 messages.
|
|
static void SetMessageType(uint16_t message_type);
|
|
|
|
bool InitFromPacket(NetlinkPacket* packet, MessageContext context) override;
|
|
|
|
uint8_t command() const { return command_; }
|
|
const char* command_string() const { return command_string_; }
|
|
uint16_t message_type() const { return message_type_; }
|
|
uint32_t sequence_number() const { return sequence_number_; }
|
|
void set_sequence_number(uint32_t seq) { sequence_number_ = seq; }
|
|
|
|
// Returns a string representing the passed-in |status| or |reason|, the
|
|
// value of which has been acquired from the kernel (for example, from the
|
|
// NL80211_ATTR_STATUS_CODE or NL80211_ATTR_REASON_CODE attribute).
|
|
static std::string StringFromReason(uint16_t reason);
|
|
static std::string StringFromStatus(uint16_t status);
|
|
|
|
// Message factory for all types of Nl80211 message.
|
|
static NetlinkMessage* CreateMessage(const NetlinkPacket& packet);
|
|
|
|
private:
|
|
static std::map<uint16_t, std::string>* reason_code_string_;
|
|
static std::map<uint16_t, std::string>* status_code_string_;
|
|
static uint16_t nl80211_message_type_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(Nl80211Message);
|
|
};
|
|
|
|
class SHILL_EXPORT Nl80211Frame {
|
|
public:
|
|
enum Type {
|
|
kAssocResponseFrameType = 0x10,
|
|
kReassocResponseFrameType = 0x30,
|
|
kAssocRequestFrameType = 0x00,
|
|
kReassocRequestFrameType = 0x20,
|
|
kAuthFrameType = 0xb0,
|
|
kDisassocFrameType = 0xa0,
|
|
kDeauthFrameType = 0xc0,
|
|
kIllegalFrameType = 0xff
|
|
};
|
|
|
|
explicit Nl80211Frame(const ByteString& init);
|
|
bool ToString(std::string* output) const;
|
|
bool IsEqual(const Nl80211Frame& other) const;
|
|
uint16_t reason() const { return reason_; }
|
|
uint16_t status() const { return status_; }
|
|
uint8_t frame_type() const { return frame_type_; }
|
|
|
|
private:
|
|
static const uint8_t kMinimumFrameByteCount;
|
|
static const uint8_t kFrameTypeMask;
|
|
|
|
std::string mac_from_;
|
|
std::string mac_to_;
|
|
uint8_t frame_type_;
|
|
uint16_t reason_;
|
|
uint16_t status_;
|
|
ByteString frame_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(Nl80211Frame);
|
|
};
|
|
|
|
//
|
|
// Specific Nl80211Message types.
|
|
//
|
|
|
|
class SHILL_EXPORT AssociateMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
AssociateMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(AssociateMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT AuthenticateMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
AuthenticateMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(AuthenticateMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT CancelRemainOnChannelMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
CancelRemainOnChannelMessage()
|
|
: Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(CancelRemainOnChannelMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT ConnectMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
ConnectMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(ConnectMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT DeauthenticateMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
DeauthenticateMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(DeauthenticateMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT DeleteStationMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
DeleteStationMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(DeleteStationMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT DisassociateMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
DisassociateMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(DisassociateMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT DisconnectMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
DisconnectMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(DisconnectMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT FrameTxStatusMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
FrameTxStatusMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(FrameTxStatusMessage);
|
|
};
|
|
|
|
class SHILL_EXPORT GetRegMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
GetRegMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(GetRegMessage);
|
|
};
|
|
|
|
class SHILL_EXPORT GetStationMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
GetStationMessage();
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(GetStationMessage);
|
|
};
|
|
|
|
class SHILL_EXPORT SetWakeOnPacketConnMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
SetWakeOnPacketConnMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(SetWakeOnPacketConnMessage);
|
|
};
|
|
|
|
class SHILL_EXPORT GetWakeOnPacketConnMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
GetWakeOnPacketConnMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(GetWakeOnPacketConnMessage);
|
|
};
|
|
|
|
class SHILL_EXPORT GetWiphyMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
GetWiphyMessage();
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(GetWiphyMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT JoinIbssMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
JoinIbssMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(JoinIbssMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT MichaelMicFailureMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
MichaelMicFailureMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(MichaelMicFailureMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT NewScanResultsMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
NewScanResultsMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(NewScanResultsMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT NewStationMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
NewStationMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(NewStationMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT NewWiphyMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
NewWiphyMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(NewWiphyMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT NotifyCqmMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
NotifyCqmMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(NotifyCqmMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT PmksaCandidateMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
PmksaCandidateMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(PmksaCandidateMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT RegBeaconHintMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
RegBeaconHintMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(RegBeaconHintMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT RegChangeMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
RegChangeMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(RegChangeMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT RemainOnChannelMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
RemainOnChannelMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(RemainOnChannelMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT RoamMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
RoamMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(RoamMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT ScanAbortedMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
ScanAbortedMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(ScanAbortedMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT GetScanMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
GetScanMessage();
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(GetScanMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT TriggerScanMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
TriggerScanMessage();
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(TriggerScanMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT UnknownNl80211Message : public Nl80211Message {
|
|
public:
|
|
explicit UnknownNl80211Message(uint8_t command)
|
|
: Nl80211Message(command, "<UNKNOWN NL80211 MESSAGE>"),
|
|
command_(command) {}
|
|
|
|
private:
|
|
uint8_t command_;
|
|
DISALLOW_COPY_AND_ASSIGN(UnknownNl80211Message);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT UnprotDeauthenticateMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
UnprotDeauthenticateMessage()
|
|
: Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(UnprotDeauthenticateMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT UnprotDisassociateMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
UnprotDisassociateMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(UnprotDisassociateMessage);
|
|
};
|
|
|
|
|
|
class SHILL_EXPORT GetInterfaceMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
GetInterfaceMessage();
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(GetInterfaceMessage);
|
|
};
|
|
|
|
class SHILL_EXPORT NewInterfaceMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
NewInterfaceMessage() : Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(NewInterfaceMessage);
|
|
};
|
|
|
|
class SHILL_EXPORT GetSurveyMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
GetSurveyMessage();
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(GetSurveyMessage);
|
|
};
|
|
|
|
class SHILL_EXPORT SurveyResultsMessage : public Nl80211Message {
|
|
public:
|
|
static const uint8_t kCommand;
|
|
static const char kCommandString[];
|
|
|
|
SurveyResultsMessage(): Nl80211Message(kCommand, kCommandString) {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(SurveyResultsMessage);
|
|
};
|
|
|
|
// Nl80211MessageDataCollector - this class is used to collect data to be
|
|
// used for unit tests. It is only invoked in this case.
|
|
|
|
class Nl80211MessageDataCollector {
|
|
public:
|
|
static Nl80211MessageDataCollector* GetInstance();
|
|
|
|
void CollectDebugData(
|
|
const Nl80211Message& message, const NetlinkPacket& packet);
|
|
|
|
protected:
|
|
friend struct
|
|
base::DefaultLazyInstanceTraits<Nl80211MessageDataCollector>;
|
|
|
|
Nl80211MessageDataCollector();
|
|
|
|
private:
|
|
// In order to limit the output from this class, I keep track of types I
|
|
// haven't yet printed.
|
|
std::map<uint8_t, bool> need_to_print;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(Nl80211MessageDataCollector);
|
|
};
|
|
|
|
} // namespace shill
|
|
|
|
#endif // SHILL_NET_NL80211_MESSAGE_H_
|