| // 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_MESSAGE_H_ |
| #define SHILL_NET_NL80211_MESSAGE_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <string> |
| |
| #include <base/macros.h> |
| #include <base/no_destructor.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(const Nl80211Message&) = delete; |
| Nl80211Message& operator=(const Nl80211Message&) = delete; |
| |
| ~Nl80211Message() override = default; |
| |
| // 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; } |
| |
| // Message factory for all types of Nl80211 message. |
| static std::unique_ptr<NetlinkMessage> CreateMessage( |
| const NetlinkPacket& packet); |
| |
| private: |
| static uint16_t nl80211_message_type_; |
| }; |
| |
| 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); |
| Nl80211Frame(const Nl80211Frame&) = delete; |
| Nl80211Frame& operator=(const Nl80211Frame&) = delete; |
| |
| std::string ToString() 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 kFrameTypeMask; |
| |
| std::string mac_from_; |
| std::string mac_to_; |
| uint8_t frame_type_; |
| uint16_t reason_; |
| uint16_t status_; |
| ByteString frame_; |
| }; |
| |
| // |
| // Specific Nl80211Message types. |
| // |
| |
| class SHILL_EXPORT AssociateMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| AssociateMessage() : Nl80211Message(kCommand, kCommandString) {} |
| AssociateMessage(const AssociateMessage&) = delete; |
| AssociateMessage& operator=(const AssociateMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT AuthenticateMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| AuthenticateMessage() : Nl80211Message(kCommand, kCommandString) {} |
| AuthenticateMessage(const AuthenticateMessage&) = delete; |
| AuthenticateMessage& operator=(const AuthenticateMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT CancelRemainOnChannelMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| CancelRemainOnChannelMessage() : Nl80211Message(kCommand, kCommandString) {} |
| CancelRemainOnChannelMessage(const CancelRemainOnChannelMessage&) = delete; |
| CancelRemainOnChannelMessage& operator=(const CancelRemainOnChannelMessage&) = |
| delete; |
| }; |
| |
| class SHILL_EXPORT ConnectMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| ConnectMessage() : Nl80211Message(kCommand, kCommandString) {} |
| ConnectMessage(const ConnectMessage&) = delete; |
| ConnectMessage& operator=(const ConnectMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT DeauthenticateMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| DeauthenticateMessage() : Nl80211Message(kCommand, kCommandString) {} |
| DeauthenticateMessage(const DeauthenticateMessage&) = delete; |
| DeauthenticateMessage& operator=(const DeauthenticateMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT DelInterfaceMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| DelInterfaceMessage() : Nl80211Message(kCommand, kCommandString) {} |
| DelInterfaceMessage(const DelInterfaceMessage&) = delete; |
| DelInterfaceMessage& operator=(const DelInterfaceMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT DeleteStationMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| DeleteStationMessage() : Nl80211Message(kCommand, kCommandString) {} |
| DeleteStationMessage(const DeleteStationMessage&) = delete; |
| DeleteStationMessage& operator=(const DeleteStationMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT DisassociateMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| DisassociateMessage() : Nl80211Message(kCommand, kCommandString) {} |
| DisassociateMessage(const DisassociateMessage&) = delete; |
| DisassociateMessage& operator=(const DisassociateMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT DisconnectMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| DisconnectMessage() : Nl80211Message(kCommand, kCommandString) {} |
| DisconnectMessage(const DisconnectMessage&) = delete; |
| DisconnectMessage& operator=(const DisconnectMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT FrameTxStatusMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| FrameTxStatusMessage() : Nl80211Message(kCommand, kCommandString) {} |
| FrameTxStatusMessage(const FrameTxStatusMessage&) = delete; |
| FrameTxStatusMessage& operator=(const FrameTxStatusMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT GetRegMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| GetRegMessage(); |
| GetRegMessage(const GetRegMessage&) = delete; |
| GetRegMessage& operator=(const GetRegMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT GetStationMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| GetStationMessage(); |
| GetStationMessage(const GetStationMessage&) = delete; |
| GetStationMessage& operator=(const GetStationMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT SetWakeOnPacketConnMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| SetWakeOnPacketConnMessage() : Nl80211Message(kCommand, kCommandString) {} |
| SetWakeOnPacketConnMessage(const SetWakeOnPacketConnMessage&) = delete; |
| SetWakeOnPacketConnMessage& operator=(const SetWakeOnPacketConnMessage&) = |
| delete; |
| }; |
| |
| class SHILL_EXPORT GetWakeOnPacketConnMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| GetWakeOnPacketConnMessage() : Nl80211Message(kCommand, kCommandString) {} |
| GetWakeOnPacketConnMessage(const GetWakeOnPacketConnMessage&) = delete; |
| GetWakeOnPacketConnMessage& operator=(const GetWakeOnPacketConnMessage&) = |
| delete; |
| }; |
| |
| class SHILL_EXPORT GetWiphyMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| GetWiphyMessage(); |
| GetWiphyMessage(const GetWiphyMessage&) = delete; |
| GetWiphyMessage& operator=(const GetWiphyMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT JoinIbssMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| JoinIbssMessage() : Nl80211Message(kCommand, kCommandString) {} |
| JoinIbssMessage(const JoinIbssMessage&) = delete; |
| JoinIbssMessage& operator=(const JoinIbssMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT MichaelMicFailureMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| MichaelMicFailureMessage() : Nl80211Message(kCommand, kCommandString) {} |
| MichaelMicFailureMessage(const MichaelMicFailureMessage&) = delete; |
| MichaelMicFailureMessage& operator=(const MichaelMicFailureMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT NewScanResultsMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| NewScanResultsMessage() : Nl80211Message(kCommand, kCommandString) {} |
| NewScanResultsMessage(const NewScanResultsMessage&) = delete; |
| NewScanResultsMessage& operator=(const NewScanResultsMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT NewStationMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| NewStationMessage() : Nl80211Message(kCommand, kCommandString) {} |
| NewStationMessage(const NewStationMessage&) = delete; |
| NewStationMessage& operator=(const NewStationMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT NewWiphyMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| NewWiphyMessage() : Nl80211Message(kCommand, kCommandString) {} |
| NewWiphyMessage(const NewWiphyMessage&) = delete; |
| NewWiphyMessage& operator=(const NewWiphyMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT NotifyCqmMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| NotifyCqmMessage() : Nl80211Message(kCommand, kCommandString) {} |
| NotifyCqmMessage(const NotifyCqmMessage&) = delete; |
| NotifyCqmMessage& operator=(const NotifyCqmMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT PmksaCandidateMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| PmksaCandidateMessage() : Nl80211Message(kCommand, kCommandString) {} |
| PmksaCandidateMessage(const PmksaCandidateMessage&) = delete; |
| PmksaCandidateMessage& operator=(const PmksaCandidateMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT ProbeMeshLinkMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| ProbeMeshLinkMessage(); |
| ProbeMeshLinkMessage(const ProbeMeshLinkMessage&) = delete; |
| ProbeMeshLinkMessage& operator=(const ProbeMeshLinkMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT RegBeaconHintMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| RegBeaconHintMessage() : Nl80211Message(kCommand, kCommandString) {} |
| RegBeaconHintMessage(const RegBeaconHintMessage&) = delete; |
| RegBeaconHintMessage& operator=(const RegBeaconHintMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT RegChangeMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| RegChangeMessage(); |
| RegChangeMessage(const RegChangeMessage&) = delete; |
| RegChangeMessage& operator=(const RegChangeMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT RemainOnChannelMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| RemainOnChannelMessage() : Nl80211Message(kCommand, kCommandString) {} |
| RemainOnChannelMessage(const RemainOnChannelMessage&) = delete; |
| RemainOnChannelMessage& operator=(const RemainOnChannelMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT RoamMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| RoamMessage() : Nl80211Message(kCommand, kCommandString) {} |
| RoamMessage(const RoamMessage&) = delete; |
| RoamMessage& operator=(const RoamMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT ScanAbortedMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| ScanAbortedMessage() : Nl80211Message(kCommand, kCommandString) {} |
| ScanAbortedMessage(const ScanAbortedMessage&) = delete; |
| ScanAbortedMessage& operator=(const ScanAbortedMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT GetScanMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| GetScanMessage(); |
| GetScanMessage(const GetScanMessage&) = delete; |
| GetScanMessage& operator=(const GetScanMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT TriggerScanMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| TriggerScanMessage(); |
| TriggerScanMessage(const TriggerScanMessage&) = delete; |
| TriggerScanMessage& operator=(const TriggerScanMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT UnknownNl80211Message : public Nl80211Message { |
| public: |
| explicit UnknownNl80211Message(uint8_t command) |
| : Nl80211Message(command, "<UNKNOWN NL80211 MESSAGE>") {} |
| UnknownNl80211Message(const UnknownNl80211Message&) = delete; |
| UnknownNl80211Message& operator=(const UnknownNl80211Message&) = delete; |
| }; |
| |
| class SHILL_EXPORT UnprotDeauthenticateMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| UnprotDeauthenticateMessage() : Nl80211Message(kCommand, kCommandString) {} |
| UnprotDeauthenticateMessage(const UnprotDeauthenticateMessage&) = delete; |
| UnprotDeauthenticateMessage& operator=(const UnprotDeauthenticateMessage&) = |
| delete; |
| }; |
| |
| class SHILL_EXPORT UnprotDisassociateMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| UnprotDisassociateMessage() : Nl80211Message(kCommand, kCommandString) {} |
| UnprotDisassociateMessage(const UnprotDisassociateMessage&) = delete; |
| UnprotDisassociateMessage& operator=(const UnprotDisassociateMessage&) = |
| delete; |
| }; |
| |
| class SHILL_EXPORT WiphyRegChangeMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| WiphyRegChangeMessage(); |
| WiphyRegChangeMessage(const WiphyRegChangeMessage&) = delete; |
| WiphyRegChangeMessage& operator=(const WiphyRegChangeMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT GetInterfaceMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| GetInterfaceMessage(); |
| GetInterfaceMessage(const GetInterfaceMessage&) = delete; |
| GetInterfaceMessage& operator=(const GetInterfaceMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT NewInterfaceMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| NewInterfaceMessage() : Nl80211Message(kCommand, kCommandString) {} |
| NewInterfaceMessage(const NewInterfaceMessage&) = delete; |
| NewInterfaceMessage& operator=(const NewInterfaceMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT GetSurveyMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| GetSurveyMessage(); |
| GetSurveyMessage(const GetSurveyMessage&) = delete; |
| GetSurveyMessage& operator=(const GetSurveyMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT SurveyResultsMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| SurveyResultsMessage() : Nl80211Message(kCommand, kCommandString) {} |
| SurveyResultsMessage(const SurveyResultsMessage&) = delete; |
| SurveyResultsMessage& operator=(const SurveyResultsMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT GetMeshPathInfoMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| GetMeshPathInfoMessage(); |
| GetMeshPathInfoMessage(const GetMeshPathInfoMessage&) = delete; |
| GetMeshPathInfoMessage& operator=(const GetMeshPathInfoMessage&) = delete; |
| }; |
| |
| class SHILL_EXPORT GetMeshProxyPathMessage : public Nl80211Message { |
| public: |
| static const uint8_t kCommand; |
| static const char kCommandString[]; |
| |
| GetMeshProxyPathMessage(); |
| GetMeshProxyPathMessage(const GetMeshProxyPathMessage&) = delete; |
| GetMeshProxyPathMessage& operator=(const GetMeshProxyPathMessage&) = delete; |
| }; |
| |
| } // namespace shill |
| |
| #endif // SHILL_NET_NL80211_MESSAGE_H_ |