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