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 code is derived from the 'iw' source code.  The copyright and license
     18 // of that code is as follows:
     19 //
     20 // Copyright (c) 2007, 2008  Johannes Berg
     21 // Copyright (c) 2007  Andy Lutomirski
     22 // Copyright (c) 2007  Mike Kershaw
     23 // Copyright (c) 2008-2009  Luis R. Rodriguez
     24 //
     25 // Permission to use, copy, modify, and/or distribute this software for any
     26 // purpose with or without fee is hereby granted, provided that the above
     27 // copyright notice and this permission notice appear in all copies.
     28 //
     29 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     30 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     31 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     32 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     33 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     34 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     35 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     36 
     37 #ifndef SHILL_NET_NETLINK_SOCKET_H_
     38 #define SHILL_NET_NETLINK_SOCKET_H_
     39 
     40 #include <memory>
     41 
     42 #include <base/bind.h>
     43 #include <base/logging.h>
     44 #include <base/macros.h>
     45 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
     46 
     47 #include "shill/net/shill_export.h"
     48 
     49 namespace shill {
     50 
     51 class Sockets;
     52 class ByteString;
     53 
     54 // Provides an abstraction to a netlink socket.  See
     55 // http://www.infradead.org/~tgr/libnl/doc/core.html#core_netlink_fundamentals
     56 // for documentation on how netlink sockets work (note that most of the rest of
     57 // this document discusses libnl -- something not used by this code).
     58 class SHILL_EXPORT NetlinkSocket {
     59  public:
     60   static const int kReceiveBufferSize;
     61 
     62   NetlinkSocket();
     63   virtual ~NetlinkSocket();
     64 
     65   // Non-trivial initialization.
     66   bool Init();
     67 
     68   // Returns the file descriptor used by the socket.
     69   virtual int file_descriptor() const { return file_descriptor_; }
     70 
     71   // Get the next message sequence number for this socket.
     72   // |GetSequenceNumber| won't return zero because that is the 'broadcast'
     73   // sequence number.
     74   virtual uint32_t GetSequenceNumber();
     75 
     76   // Reads data from the socket into |message| and returns true if successful.
     77   // The |message| parameter will be resized to hold the entirety of the read
     78   // message (and any data in |message| will be overwritten).
     79   virtual bool RecvMessage(ByteString* message);
     80 
     81   // Sends a message, returns true if successful.
     82   virtual bool SendMessage(const ByteString& message);
     83 
     84   // Subscribes to netlink broadcast events.
     85   virtual bool SubscribeToEvents(uint32_t group_id);
     86 
     87   virtual const Sockets* sockets() const { return sockets_.get(); }
     88 
     89  protected:
     90   uint32_t sequence_number_;
     91 
     92  private:
     93   friend class NetlinkManagerTest;
     94   friend class NetlinkSocketTest;
     95   FRIEND_TEST(NetlinkSocketTest, SequenceNumberTest);
     96 
     97   std::unique_ptr<Sockets> sockets_;
     98   int file_descriptor_;
     99 
    100   DISALLOW_COPY_AND_ASSIGN(NetlinkSocket);
    101 };
    102 
    103 }  // namespace shill
    104 
    105 #endif  // SHILL_NET_NETLINK_SOCKET_H_
    106