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. 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static WriteResult WritePacket(int fd, 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* buffer, 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t buf_len, 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const IPAddressNumber& self_address, 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const IPEndPoint& peer_address); 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // A helper for WritePacket which fills in the cmsg with the supplied self 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // address. 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Returns the length of the packet info structure used. 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static size_t SetIpInfoInCmsg(const IPAddressNumber& self_address, 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cmsghdr* cmsg); 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private: 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DISALLOW_COPY_AND_ASSIGN(QuicSocketUtils); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace tools 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace net 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // NET_TOOLS_QUIC_QUIC_SOCKET_UTILS_H_ 83