quic_socket_utils.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/ip_endpoint.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net { 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools { 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class QuicSocketUtils { 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the msghdr contains IP_PKTINFO or IPV6_PKTINFO, this will return the 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // IPAddressNumber in that header. Returns an uninitialized IPAddress on 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // failure. 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static IPAddressNumber GetAddressFromMsghdr(struct msghdr *hdr); 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the msghdr contains an SO_RXQ_OVFL entry, this will set dropped_packets 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // to the correct value and return true. Otherwise it will return false. 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool GetOverflowFromMsghdr(struct msghdr *hdr, int *dropped_packets); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sets either IP_PKTINFO or IPV6_PKTINFO on the socket, based on 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // address_family. Returns the return code from setsockopt. 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int SetGetAddressInfo(int fd, int address_family); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Reads buf_len from the socket. If reading is successful, returns bytes 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // read and sets peer_address to the peer address. Otherwise returns -1. 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If dropped_packets is non-null, it will be set to the number of packets 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // dropped on the socket since the socket was created, assuming the kernel 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // supports this feature. 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If self_address is non-null, it will be set to the address the peer sent 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // packets to, assuming a packet was read. 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int ReadPacket(int fd, char* buffer, size_t buf_len, 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* dropped_packets, 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPAddressNumber* self_address, 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPEndPoint* peer_address); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Writes buf_len to the socket. If writing is successful returns the number 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of bytes written otherwise returns -1 and sets error to errno. 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static int WritePacket(int fd, const char* buffer, size_t buf_len, 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IPAddressNumber& self_address, 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IPEndPoint& peer_address, 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int* error); 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace tools 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace net 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // NET_TOOLS_QUIC_QUIC_SOCKET_UTILS_H_ 60