| // Copyright (c) 2012 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_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/shill_export.h" |
| |
| struct nlmsghdr; |
| |
| namespace shill { |
| |
| // 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 InitFromNlmsg(const nlmsghdr *msg, 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 libnl (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 nlmsghdr *const_msg); |
| |
| 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_; } |
| |
| 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); |
| }; |
| |
| // 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, nlmsghdr *msg); |
| |
| 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_ |