netlink_socket.h revision 57282d5403b23162de1ded91ec8d73bdc19c922a
10d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
20d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// Use of this source code is governed by a BSD-style license that can be
30d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// found in the LICENSE file.
40d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie//
50d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// This code is derived from the 'iw' source code.  The copyright and license
60d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// of that code is as follows:
70d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie//
80d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// Copyright (c) 2007, 2008  Johannes Berg
90d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// Copyright (c) 2007  Andy Lutomirski
100d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// Copyright (c) 2007  Mike Kershaw
110d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// Copyright (c) 2008-2009  Luis R. Rodriguez
120d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie//
130d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// Permission to use, copy, modify, and/or distribute this software for any
140d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// purpose with or without fee is hereby granted, provided that the above
150d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// copyright notice and this permission notice appear in all copies.
160d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie//
170d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
180d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
190d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
200d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
210d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
220d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
230d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
240d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
2502e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#ifndef SHILL_NET_NETLINK_SOCKET_H_
2602e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#define SHILL_NET_NETLINK_SOCKET_H_
270d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
28879f25f654d864eab44a758d8321d589c167258eBen Chan#include <memory>
29879f25f654d864eab44a758d8321d589c167258eBen Chan
300d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie#include <base/bind.h>
310d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie#include <base/logging.h>
32cc67c52a2c00f90e877971d552208dd99825d84eBen Chan#include <base/macros.h>
33cc53f236c0696383151105337f50993c71e5b443Wade Guthrie#include <gtest/gtest_prod.h>  // for FRIEND_TEST
340d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
35ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu#include "shill/shill_export.h"
36ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiu
370d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrienamespace shill {
380d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
39cc53f236c0696383151105337f50993c71e5b443Wade Guthrieclass Sockets;
40bee87c282fc49beeceaa0f5bbce34c639ac03816Wade Guthrieclass ByteString;
41dc085c8d2c50e71e230b594b2472da7498705fa4repo sync
420d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie// Provides an abstraction to a netlink socket.  See
43cc53f236c0696383151105337f50993c71e5b443Wade Guthrie// http://www.infradead.org/~tgr/libnl/doc/core.html#core_netlink_fundamentals
44cc53f236c0696383151105337f50993c71e5b443Wade Guthrie// for documentation on how netlink sockets work (note that most of the rest of
4557282d5403b23162de1ded91ec8d73bdc19c922aPaul Stewart// this document discusses libnl -- something not used by this code).
46ba24e6fd0f0f2b974e0e73039d7d92bb475f6857Peter Qiuclass SHILL_EXPORT NetlinkSocket {
470d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie public:
48cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  static const int kReceiveBufferSize;
49cc53f236c0696383151105337f50993c71e5b443Wade Guthrie
50cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  NetlinkSocket();
510d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie  virtual ~NetlinkSocket();
520d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
530d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie  // Non-trivial initialization.
540d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie  bool Init();
550d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
560d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie  // Returns the file descriptor used by the socket.
57fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie  virtual int file_descriptor() const { return file_descriptor_; }
580d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
59cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  // Get the next message sequence number for this socket.
60cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  // |GetSequenceNumber| won't return zero because that is the 'broadcast'
61cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  // sequence number.
62dc085c8d2c50e71e230b594b2472da7498705fa4repo sync  virtual uint32_t GetSequenceNumber();
630d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
64cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  // Reads data from the socket into |message| and returns true if successful.
65cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  // The |message| parameter will be resized to hold the entirety of the read
66cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  // message (and any data in |message| will be overwritten).
67e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart  virtual bool RecvMessage(ByteString* message);
680d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
69dc085c8d2c50e71e230b594b2472da7498705fa4repo sync  // Sends a message, returns true if successful.
70e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart  virtual bool SendMessage(const ByteString& message);
71393b93f3a7684828f32a481b34cc2e94c6825f50Christopher Wiley
72bee87c282fc49beeceaa0f5bbce34c639ac03816Wade Guthrie  // Subscribes to netlink broadcast events.
73bee87c282fc49beeceaa0f5bbce34c639ac03816Wade Guthrie  virtual bool SubscribeToEvents(uint32_t group_id);
74bee87c282fc49beeceaa0f5bbce34c639ac03816Wade Guthrie
75e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart  virtual const Sockets* sockets() const { return sockets_.get(); }
76fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie
77dc085c8d2c50e71e230b594b2472da7498705fa4repo sync protected:
78cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  uint32_t sequence_number_;
790d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
800d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie private:
81fa2100e878bb51d2c51b68a2f5b34124e73b4aa0Wade Guthrie  friend class NetlinkManagerTest;
82cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  friend class NetlinkSocketTest;
83cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  FRIEND_TEST(NetlinkSocketTest, SequenceNumberTest);
840d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
85879f25f654d864eab44a758d8321d589c167258eBen Chan  std::unique_ptr<Sockets> sockets_;
86cc53f236c0696383151105337f50993c71e5b443Wade Guthrie  int file_descriptor_;
870d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
880d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie  DISALLOW_COPY_AND_ASSIGN(NetlinkSocket);
890d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie};
900d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
910d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie}  // namespace shill
920d43853b1b7aa82afbcbddb6c68bcfd72e98d950Wade Guthrie
9302e3dc3bc6e9fdb475bd13944f1c6764c921abbbPeter Qiu#endif  // SHILL_NET_NETLINK_SOCKET_H_
94