Home | History | Annotate | Download | only in net
      1 //
      2 // Copyright (C) 2012 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 // This software provides an abstracted interface to the netlink socket
     18 // interface.  In its current implementation it is used, primarily, to
     19 // communicate with the cfg80211 kernel module and mac80211 drivers:
     20 //
     21 //         [shill]--[nl80211 library]
     22 //            |
     23 //     (netlink socket)
     24 //            |
     25 // [cfg80211 kernel module]
     26 //            |
     27 //    [mac80211 drivers]
     28 //
     29 // In order to send a message and handle it's response, do the following:
     30 // - Create a handler (it'll want to verify that it's the kind of message you
     31 //   want, cast it to the appropriate type, and get attributes from the cast
     32 //   message):
     33 //
     34 //    #include "nl80211_message.h"
     35 //    class SomeClass {
     36 //      static void MyMessageHandler(const NetlinkMessage& raw) {
     37 //        if (raw.message_type() != ControlNetlinkMessage::kMessageType)
     38 //          return;
     39 //        const ControlNetlinkMessage* message =
     40 //          reinterpret_cast<const ControlNetlinkMessage*>(&raw);
     41 //        if (message.command() != NewFamilyMessage::kCommand)
     42 //          return;
     43 //        uint16_t my_attribute;
     44 //        message->const_attributes()->GetU16AttributeValue(
     45 //          CTRL_ATTR_FAMILY_ID, &my_attribute);
     46 //      }  // MyMessageHandler.
     47 //    }  // class SomeClass.
     48 //
     49 // - Instantiate a message:
     50 //
     51 //    #include "nl80211_message.h"
     52 //    GetFamilyMessage msg;
     53 //
     54 // - And set attributes:
     55 //
     56 //    msg.attributes()->SetStringAttributeValue(CTRL_ATTR_FAMILY_NAME, "foo");
     57 //
     58 // - Then send the message, passing-in a closure to the handler you created:
     59 //
     60 //    NetlinkManager* netlink_manager = NetlinkManager::GetInstance();
     61 //    netlink_manager->SendMessage(&msg, Bind(&SomeClass::MyMessageHandler));
     62 //
     63 // NetlinkManager will then save your handler and send your message.  When a
     64 // response to your message arrives, it'll call your handler.
     65 //
     66 
     67 #ifndef SHILL_NET_NETLINK_MANAGER_H_
     68 #define SHILL_NET_NETLINK_MANAGER_H_
     69 
     70 #include <list>
     71 #include <map>
     72 #include <memory>
     73 #include <queue>
     74 #include <set>
     75 #include <string>
     76 
     77 #include <base/bind.h>
     78 #include <base/cancelable_callback.h>
     79 #include <base/lazy_instance.h>
     80 #include <base/macros.h>
     81 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
     82 
     83 #include "shill/net/generic_netlink_message.h"
     84 #include "shill/net/io_handler_factory_container.h"
     85 #include "shill/net/netlink_message.h"
     86 #include "shill/net/netlink_socket.h"
     87 #include "shill/net/shill_export.h"
     88 #include "shill/net/shill_time.h"
     89 
     90 namespace shill {
     91 
     92 class ControlNetlinkMessage;
     93 struct InputData;
     94 class NetlinkPacket;
     95 class Nl80211Message;
     96 
     97 // NetlinkManager is a singleton that coordinates sending netlink messages to,
     98 // and receiving netlink messages from, the kernel.  The first use of this is
     99 // to communicate between user-space and the cfg80211 module that manages wifi
    100 // drivers.  Bring NetlinkManager up as follows:
    101 //  NetlinkManager* netlink_manager_ = NetlinkManager::GetInstance();
    102 //  netlink_manager_->Init();  // Initialize the socket.
    103 //  // Get message types for all dynamic message types.
    104 //  Nl80211Message::SetMessageType(
    105 //      netlink_manager_->GetFamily(Nl80211Message::kMessageTypeString,
    106 //                              Bind(&Nl80211Message::CreateMessage)));
    107 //  netlink_manager_->Start();
    108 class SHILL_EXPORT NetlinkManager {
    109  public:
    110   enum AuxilliaryMessageType {
    111     kDone,
    112     kErrorFromKernel,
    113     kTimeoutWaitingForResponse,
    114     kUnexpectedResponseType
    115   };
    116   typedef base::Callback<void(const NetlinkMessage&)> NetlinkMessageHandler;
    117   typedef base::Callback<void(const ControlNetlinkMessage&)>
    118       ControlNetlinkMessageHandler;
    119   typedef base::Callback<void(const Nl80211Message&)> Nl80211MessageHandler;
    120   // NetlinkAuxilliaryMessageHandler handles netlink error messages, things
    121   // like the DoneMessage at the end of a multi-part message, and any errors
    122   // discovered by |NetlinkManager| (which are passed as NULL pointers because
    123   // there is no way to reserve a part of the ErrorAckMessage space for
    124   // non-netlink errors).
    125   typedef base::Callback<void(AuxilliaryMessageType type,
    126                               const NetlinkMessage*)>
    127       NetlinkAuxilliaryMessageHandler;
    128   // NetlinkAckHandler handles netlink Ack messages, which are a special type
    129   // of netlink error message carrying an error code of 0. Since Ack messages
    130   // contain no useful data (other than the error code of 0 to differentiate
    131   // it from an actual error message), the handler is not passed a message.
    132   // as an argument. The boolean value filled in by the handler (via the
    133   // pointer) indicates whether or not the callbacks registered for the message
    134   // (identified by sequence number) that this handler was invoked for should be
    135   // removed after this callback is executed. This allows a sender of an NL80211
    136   // message to handle both an Ack and another response message, rather than
    137   // handle only the first response received.
    138   typedef base::Callback<void(bool*)> NetlinkAckHandler;
    139 
    140   // ResponseHandlers provide a polymorphic context for the base::Callback
    141   // message handlers so that handlers for different types of messages can be
    142   // kept in the same container (namely, |message_handlers_|).
    143   class NetlinkResponseHandler :
    144     public base::RefCounted<NetlinkResponseHandler> {
    145    public:
    146     explicit NetlinkResponseHandler(
    147         const NetlinkAckHandler& ack_handler,
    148         const NetlinkAuxilliaryMessageHandler& error_handler);
    149     virtual ~NetlinkResponseHandler();
    150     // Calls wrapper-type-specific callback for |netlink_message|.  Returns
    151     // false if |netlink_message| is not the correct type.  Calls callback
    152     // (which is declared in the private area of derived classes) with
    153     // properly cast version of |netlink_message|.
    154     virtual bool HandleMessage(const NetlinkMessage& netlink_message) const = 0;
    155     void HandleError(AuxilliaryMessageType type,
    156                      const NetlinkMessage* netlink_message) const;
    157     virtual bool HandleAck() const;
    158     void set_delete_after(const timeval& time) { delete_after_ = time; }
    159     const struct timeval& delete_after() const { return delete_after_; }
    160 
    161    protected:
    162     NetlinkResponseHandler();
    163     NetlinkAckHandler ack_handler_;
    164 
    165    private:
    166     NetlinkAuxilliaryMessageHandler error_handler_;
    167     struct timeval delete_after_;
    168 
    169     DISALLOW_COPY_AND_ASSIGN(NetlinkResponseHandler);
    170   };
    171 
    172   // Encapsulates all the different things we know about a specific message
    173   // type like its name, and its id.
    174   struct MessageType {
    175     MessageType();
    176 
    177     uint16_t family_id;
    178 
    179     // Multicast groups supported by the family.  The string and mapping to
    180     // a group id are extracted from the CTRL_CMD_NEWFAMILY message.
    181     std::map<std::string, uint32_t> groups;
    182   };
    183 
    184   // Various kinds of events to which we can subscribe (and receive) from
    185   // cfg80211.
    186   static const char kEventTypeConfig[];
    187   static const char kEventTypeScan[];
    188   static const char kEventTypeRegulatory[];
    189   static const char kEventTypeMlme[];
    190 
    191   // NetlinkManager is a singleton and this is the way to access it.
    192   static NetlinkManager* GetInstance();
    193 
    194   virtual ~NetlinkManager();
    195 
    196   // Performs non-trivial object initialization of the NetlinkManager singleton.
    197   virtual bool Init();
    198 
    199   // Passes the job of waiting for, and the subsequent reading from, the
    200   // netlink socket to the current message loop.
    201   virtual void Start();
    202 
    203   // The following methods deal with the network family table.  This table
    204   // associates netlink family names with family_ids (also called message
    205   // types).  Note that some families have static ids assigned to them but
    206   // others require the kernel to resolve a string describing the family into
    207   // a dynamically-determined id.
    208 
    209   // Returns the family_id (message type) associated with |family_name|,
    210   // calling the kernel if needed.  Returns
    211   // |NetlinkMessage::kIllegalMessageType| if the message type could not be
    212   // determined.  May block so |GetFamily| should be called before entering the
    213   // event loop.
    214   virtual uint16_t GetFamily(const std::string& family_name,
    215       const NetlinkMessageFactory::FactoryMethod& message_factory);
    216 
    217   // Install a NetlinkManager NetlinkMessageHandler.  The handler is a
    218   // user-supplied object to be called by the system for user-bound messages
    219   // that do not have a corresponding messaage-specific callback.
    220   // |AddBroadcastHandler| should be called before |SubscribeToEvents| since
    221   // the result of this call are used for that call.
    222   virtual bool AddBroadcastHandler(
    223       const NetlinkMessageHandler& message_handler);
    224 
    225   // Uninstall a NetlinkMessage Handler.
    226   virtual bool RemoveBroadcastHandler(
    227       const NetlinkMessageHandler& message_handler);
    228 
    229   // Determines whether a handler is in the list of broadcast handlers.
    230   bool FindBroadcastHandler(const NetlinkMessageHandler& message_handler) const;
    231 
    232   // Uninstall all broadcast netlink message handlers.
    233   void ClearBroadcastHandlers();
    234 
    235   // Sends a netlink message to the kernel using the NetlinkManager socket after
    236   // installing a handler to deal with the kernel's response to the message.
    237   // TODO(wdg): Eventually, this should also include a timeout and a callback
    238   // to call in case of timeout.
    239   virtual bool SendControlMessage(
    240       ControlNetlinkMessage* message,
    241       const ControlNetlinkMessageHandler& message_handler,
    242       const NetlinkAckHandler& ack_handler,
    243       const NetlinkAuxilliaryMessageHandler& error_handler);
    244   virtual bool SendNl80211Message(
    245       Nl80211Message* message,
    246       const Nl80211MessageHandler& message_handler,
    247       const NetlinkAckHandler& ack_handler,
    248       const NetlinkAuxilliaryMessageHandler& error_handler);
    249 
    250   // Generic erroneous message handler everyone can use.
    251   static void OnNetlinkMessageError(AuxilliaryMessageType type,
    252                                     const NetlinkMessage* raw_message);
    253 
    254   // Generic Ack handler that does nothing. Other callbacks registered for the
    255   // message are not deleted after this function is executed.
    256   static void OnAckDoNothing(bool* remove_callbacks) {
    257     *remove_callbacks = false;
    258   }
    259 
    260   // Uninstall the handler for a specific netlink message.
    261   bool RemoveMessageHandler(const NetlinkMessage& message);
    262 
    263   // Sign-up to receive and log multicast events of a specific type (once wifi
    264   // is up).
    265   virtual bool SubscribeToEvents(const std::string& family,
    266                                  const std::string& group);
    267 
    268   // Gets the next sequence number for a NetlinkMessage to be sent over
    269   // NetlinkManager's netlink socket.
    270   uint32_t GetSequenceNumber();
    271 
    272  protected:
    273   friend struct base::DefaultLazyInstanceTraits<NetlinkManager>;
    274 
    275   NetlinkManager();
    276 
    277  private:
    278   friend class NetlinkManagerTest;
    279   friend class NetlinkMessageTest;
    280   friend class ShillDaemonTest;
    281   friend class ChromeosDaemonTest;
    282   FRIEND_TEST(NetlinkManagerTest, AddLinkTest);
    283   FRIEND_TEST(NetlinkManagerTest, BroadcastHandler);
    284   FRIEND_TEST(NetlinkManagerTest, GetFamilyOneInterstitialMessage);
    285   FRIEND_TEST(NetlinkManagerTest, GetFamilyTimeout);
    286   FRIEND_TEST(NetlinkManagerTest, MessageHandler);
    287   FRIEND_TEST(NetlinkManagerTest, AckHandler);
    288   FRIEND_TEST(NetlinkManagerTest, ErrorHandler);
    289   FRIEND_TEST(NetlinkManagerTest, MultipartMessageHandler);
    290   FRIEND_TEST(NetlinkManagerTest, OnInvalidRawNlMessageReceived);
    291   FRIEND_TEST(NetlinkManagerTest, TimeoutResponseHandlers);
    292   FRIEND_TEST(NetlinkManagerTest, PendingDump);
    293   FRIEND_TEST(NetlinkManagerTest, PendingDump_Timeout);
    294   FRIEND_TEST(NetlinkManagerTest, PendingDump_Retry);
    295   FRIEND_TEST(NetlinkMessageTest, Parse_NL80211_CMD_ASSOCIATE);
    296   FRIEND_TEST(NetlinkMessageTest, Parse_NL80211_CMD_AUTHENTICATE);
    297   FRIEND_TEST(NetlinkMessageTest, Parse_NL80211_CMD_CONNECT);
    298   FRIEND_TEST(NetlinkMessageTest, Parse_NL80211_CMD_DEAUTHENTICATE);
    299   FRIEND_TEST(NetlinkMessageTest, Parse_NL80211_CMD_DISASSOCIATE);
    300   FRIEND_TEST(NetlinkMessageTest, Parse_NL80211_CMD_DISCONNECT);
    301   FRIEND_TEST(NetlinkMessageTest, Parse_NL80211_CMD_NEW_SCAN_RESULTS);
    302   FRIEND_TEST(NetlinkMessageTest, Parse_NL80211_CMD_NEW_STATION);
    303   FRIEND_TEST(NetlinkMessageTest, Parse_NL80211_CMD_NOTIFY_CQM);
    304   FRIEND_TEST(NetlinkMessageTest, Parse_NL80211_CMD_TRIGGER_SCAN);
    305 
    306   typedef scoped_refptr<NetlinkResponseHandler> NetlinkResponseHandlerRefPtr;
    307 
    308   // Container for information we need to send a netlink message out on a
    309   // netlink socket.
    310   struct NetlinkPendingMessage {
    311     NetlinkPendingMessage(uint32_t sequence_number_arg,
    312                           bool is_dump_request_arg,
    313                           ByteString message_string_arg,
    314                           NetlinkResponseHandlerRefPtr handler_arg)
    315         : retries_left(kMaxNlMessageRetries),
    316           sequence_number(sequence_number_arg),
    317           is_dump_request(is_dump_request_arg),
    318           message_string(message_string_arg),
    319           handler(handler_arg) {}
    320 
    321     int retries_left;
    322     uint32_t sequence_number;
    323     bool is_dump_request;
    324     ByteString message_string;
    325     NetlinkResponseHandlerRefPtr handler;
    326     uint32_t last_received_error;
    327   };
    328 
    329   // These need to be member variables, even though they're only used once in
    330   // the code, since they're needed for unittests.
    331   static const long kMaximumNewFamilyWaitSeconds;  // NOLINT
    332   static const long kMaximumNewFamilyWaitMicroSeconds;  // NOLINT
    333   static const long kResponseTimeoutSeconds;  // NOLINT
    334   static const long kResponseTimeoutMicroSeconds;  // NOLINT
    335   static const long kPendingDumpTimeoutMilliseconds;  // NOLINT
    336   static const long kNlMessageRetryDelayMilliseconds;  // NOLINT
    337   static const int kMaxNlMessageRetries;  // NOLINT
    338 
    339   // Returns the file descriptor of socket used to read wifi data.
    340   int file_descriptor() const;
    341 
    342   // MessageLoop calls this when data is available on our socket.  This
    343   // method passes each, individual, message in the input to
    344   // |OnNlMessageReceived|.  Each part of a multipart message gets handled,
    345   // individually, by this method.
    346   void OnRawNlMessageReceived(InputData* data);
    347 
    348   // This method processes a message from |OnRawNlMessageReceived| by passing
    349   // the message to either the NetlinkManager callback that matches the sequence
    350   // number of the message or, if there isn't one, to all of the default
    351   // NetlinkManager callbacks in |broadcast_handlers_|.
    352   void OnNlMessageReceived(NetlinkPacket* packet);
    353 
    354   // Sends the pending dump message, and decrement the message's retry count if
    355   // it was resent successfully.
    356   void ResendPendingDumpMessage();
    357 
    358   // If a NetlinkResponseHandler registered for the message identified by
    359   // |sequence_number| exists, calls the error handler with the arguments |type|
    360   // and |netlink_message|, then erases the NetlinkResponseHandler from
    361   // |message_handlers_|.
    362   void CallErrorHandler(uint32_t sequence_number, AuxilliaryMessageType type,
    363                         const NetlinkMessage* netlink_message);
    364 
    365   // Called by InputHandler on exceptional events.
    366   void OnReadError(const std::string& error_msg);
    367 
    368   // Utility function that posts a task to the message loop to call
    369   // NetlinkManager::ResendPendingDumpMessage kNlMessageRetryDelayMilliseconds
    370   // from now.
    371   void ResendPendingDumpMessageAfterDelay();
    372 
    373   // Just for tests, this method turns off WiFi and clears the subscribed
    374   // events list. If |full| is true, also clears state set by Init.
    375   void Reset(bool full);
    376 
    377   // Handles a CTRL_CMD_NEWFAMILY message from the kernel.
    378   void OnNewFamilyMessage(const ControlNetlinkMessage& message);
    379 
    380   // Sends a netlink message if |pending_dump_| is false. Otherwise, post
    381   // a message to |pending_messages_| to be sent later.
    382   bool SendOrPostMessage(
    383       NetlinkMessage* message,
    384       NetlinkResponseHandler* message_wrapper);  // Passes ownership.
    385 
    386   // Install a handler to deal with kernel's response to the message contained
    387   // in |pending_message|, then sends the message by calling
    388   // NetlinkManager::SendMessageInternal.
    389   bool RegisterHandlersAndSendMessage(
    390       const NetlinkPendingMessage& pending_message);
    391 
    392   // Sends the netlink message whose bytes are contained in |pending_message| to
    393   // the kernel using the NetlinkManager socket. If |pending_message| is a dump
    394   // request and the message is sent successfully, a timeout timer is started to
    395   // limit the amount of time we wait for responses to that message. Adds a
    396   // serial number to |message| before it is sent.
    397   bool SendMessageInternal(const NetlinkPendingMessage& pending_message);
    398 
    399   // Given a netlink packet |packet|, infers the context of this netlink
    400   // message (for message parsing purposes) and returns a MessageContext
    401   // describing this context.
    402   NetlinkMessage::MessageContext InferMessageContext(
    403       const NetlinkPacket& packet);
    404 
    405   // Called when we time out waiting for a response to a netlink dump message.
    406   // Invokes the error handler with kTimeoutWaitingForResponse, deletes the
    407   // error handler, then calls NetlinkManager::OnPendingDumpComplete.
    408   void OnPendingDumpTimeout();
    409 
    410   // Cancels |pending_dump_timeout_callback_|, deletes the currently pending
    411   // dump request message from the front of |pending_messages_| since we have
    412   // finished waiting for replies, then sends the next message in
    413   // |pending_messages_| (if any).
    414   void OnPendingDumpComplete();
    415 
    416   // Returns true iff there we are waiting for replies to a netlink dump
    417   // message, false otherwise.
    418   bool IsDumpPending();
    419 
    420   // Returns the sequence number of the pending netlink dump request message iff
    421   // there is a pending dump. Otherwise, returns 0.
    422   uint32_t PendingDumpSequenceNumber();
    423 
    424   // NetlinkManager Handlers, OnRawNlMessageReceived invokes each of these
    425   // User-supplied callback object when _it_ gets called to read netlink data.
    426   std::list<NetlinkMessageHandler> broadcast_handlers_;
    427 
    428   // Message-specific callbacks, mapped by message ID.
    429   std::map<uint32_t, NetlinkResponseHandlerRefPtr> message_handlers_;
    430 
    431   // Netlink messages due to be sent to the kernel. If a dump is pending,
    432   // the first element in this queue will contain the netlink dump request
    433   // message that we are waiting on replies for.
    434   std::queue<NetlinkPendingMessage> pending_messages_;
    435 
    436   base::WeakPtrFactory<NetlinkManager> weak_ptr_factory_;
    437   base::CancelableClosure pending_dump_timeout_callback_;
    438   base::CancelableClosure resend_dump_message_callback_;
    439   base::Callback<void(InputData*)> dispatcher_callback_;
    440   std::unique_ptr<IOHandler> dispatcher_handler_;
    441 
    442   std::unique_ptr<NetlinkSocket> sock_;
    443   std::map<const std::string, MessageType> message_types_;
    444   NetlinkMessageFactory message_factory_;
    445   Time* time_;
    446   IOHandlerFactory* io_handler_factory_;
    447   bool dump_pending_;
    448 
    449   DISALLOW_COPY_AND_ASSIGN(NetlinkManager);
    450 };
    451 
    452 }  // namespace shill
    453 
    454 #endif  // SHILL_NET_NETLINK_MANAGER_H_
    455