quic_socket_utils.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Some socket related helper methods for quic.
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef NET_TOOLS_QUIC_QUIC_SOCKET_UTILS_H_
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define NET_TOOLS_QUIC_QUIC_SOCKET_UTILS_H_
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <stddef.h>
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <sys/socket.h>
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/basictypes.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/ip_endpoint.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/quic/quic_types.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools {
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class QuicSocketUtils {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If the msghdr contains IP_PKTINFO or IPV6_PKTINFO, this will return the
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // IPAddressNumber in that header.  Returns an uninitialized IPAddress on
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // failure.
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static IPAddressNumber GetAddressFromMsghdr(struct msghdr *hdr);
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If the msghdr contains an SO_RXQ_OVFL entry, this will set dropped_packets
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to the correct value and return true. Otherwise it will return false.
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static bool GetOverflowFromMsghdr(struct msghdr *hdr,
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    uint32 *dropped_packets);
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Sets either IP_PKTINFO or IPV6_PKTINFO on the socket, based on
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // address_family.  Returns the return code from setsockopt.
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static int SetGetAddressInfo(int fd, int address_family);
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Sets the send buffer size to |size| and returns false if it fails.
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static bool SetSendBufferSize(int fd, size_t size);
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Sets the receive buffer size to |size| and returns false if it fails.
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static bool SetReceiveBufferSize(int fd, size_t size);
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Reads buf_len from the socket.  If reading is successful, returns bytes
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // read and sets peer_address to the peer address.  Otherwise returns -1.
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If dropped_packets is non-null, it will be set to the number of packets
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // dropped on the socket since the socket was created, assuming the kernel
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // supports this feature.
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If self_address is non-null, it will be set to the address the peer sent
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // packets to, assuming a packet was read.
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  static int ReadPacket(int fd,
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        char* buffer,
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        size_t buf_len,
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        uint32* dropped_packets,
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        IPAddressNumber* self_address,
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        IPEndPoint* peer_address);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Writes buf_len to the socket. If writing is successful, sets the result's
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // status to WRITE_STATUS_OK and sets bytes_written.  Otherwise sets the
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // result's status to WRITE_STATUS_BLOCKED or WRITE_STATUS_ERROR and sets
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // error_code to errno.
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static WriteResult WritePacket(int fd, const char* buffer, size_t buf_len,
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 const IPAddressNumber& self_address,
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 const IPEndPoint& peer_address);
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // A helper for WritePacket which fills in the cmsg with the supplied self
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // address.
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static void SetIpInfoInCmsg(const IPAddressNumber& self_address,
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              cmsghdr* cmsg);
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private:
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DISALLOW_COPY_AND_ASSIGN(QuicSocketUtils);
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace tools
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace net
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // NET_TOOLS_QUIC_QUIC_SOCKET_UTILS_H_
80