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; set_delete_after(const timeval & time)158 void set_delete_after(const timeval& time) { delete_after_ = time; } delete_after()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. OnAckDoNothing(bool * remove_callbacks)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