Home | History | Annotate | Download | only in quic
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 //
      5 // Some socket related helper methods for quic.
      6 
      7 #ifndef NET_TOOLS_QUIC_QUIC_SOCKET_UTILS_H_
      8 #define NET_TOOLS_QUIC_QUIC_SOCKET_UTILS_H_
      9 
     10 #include <stddef.h>
     11 #include <sys/socket.h>
     12 #include <string>
     13 
     14 #include "base/basictypes.h"
     15 #include "net/base/ip_endpoint.h"
     16 #include "net/quic/quic_types.h"
     17 
     18 namespace net {
     19 namespace tools {
     20 
     21 class QuicSocketUtils {
     22  public:
     23   // If the msghdr contains IP_PKTINFO or IPV6_PKTINFO, this will return the
     24   // IPAddressNumber in that header.  Returns an uninitialized IPAddress on
     25   // failure.
     26   static IPAddressNumber GetAddressFromMsghdr(struct msghdr *hdr);
     27 
     28   // If the msghdr contains an SO_RXQ_OVFL entry, this will set dropped_packets
     29   // to the correct value and return true. Otherwise it will return false.
     30   static bool GetOverflowFromMsghdr(struct msghdr *hdr,
     31                                     uint32 *dropped_packets);
     32 
     33   // Sets either IP_PKTINFO or IPV6_PKTINFO on the socket, based on
     34   // address_family.  Returns the return code from setsockopt.
     35   static int SetGetAddressInfo(int fd, int address_family);
     36 
     37   // Sets the send buffer size to |size| and returns false if it fails.
     38   static bool SetSendBufferSize(int fd, size_t size);
     39 
     40   // Sets the receive buffer size to |size| and returns false if it fails.
     41   static bool SetReceiveBufferSize(int fd, size_t size);
     42 
     43   // Reads buf_len from the socket.  If reading is successful, returns bytes
     44   // read and sets peer_address to the peer address.  Otherwise returns -1.
     45   //
     46   // If dropped_packets is non-null, it will be set to the number of packets
     47   // dropped on the socket since the socket was created, assuming the kernel
     48   // supports this feature.
     49   //
     50   // If self_address is non-null, it will be set to the address the peer sent
     51   // packets to, assuming a packet was read.
     52   static int ReadPacket(int fd,
     53                         char* buffer,
     54                         size_t buf_len,
     55                         uint32* dropped_packets,
     56                         IPAddressNumber* self_address,
     57                         IPEndPoint* peer_address);
     58 
     59   // Writes buf_len to the socket. If writing is successful, sets the result's
     60   // status to WRITE_STATUS_OK and sets bytes_written.  Otherwise sets the
     61   // result's status to WRITE_STATUS_BLOCKED or WRITE_STATUS_ERROR and sets
     62   // error_code to errno.
     63   static WriteResult WritePacket(int fd,
     64                                  const char* buffer,
     65                                  size_t buf_len,
     66                                  const IPAddressNumber& self_address,
     67                                  const IPEndPoint& peer_address);
     68 
     69   // A helper for WritePacket which fills in the cmsg with the supplied self
     70   // address.
     71   // Returns the length of the packet info structure used.
     72   static size_t SetIpInfoInCmsg(const IPAddressNumber& self_address,
     73                                 cmsghdr* cmsg);
     74 
     75  private:
     76   DISALLOW_COPY_AND_ASSIGN(QuicSocketUtils);
     77 };
     78 
     79 }  // namespace tools
     80 }  // namespace net
     81 
     82 #endif  // NET_TOOLS_QUIC_QUIC_SOCKET_UTILS_H_
     83