1 // Copyright 2022 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 // Internal socket tools shared between Windows and POSIX implementations. 6 7 #ifndef QUICHE_QUIC_CORE_IO_SOCKET_INTERNAL_H_ 8 #define QUICHE_QUIC_CORE_IO_SOCKET_INTERNAL_H_ 9 10 #include "absl/status/status.h" 11 #include "absl/status/statusor.h" 12 #include "quiche/quic/core/io/socket.h" 13 #include "quiche/quic/platform/api/quic_socket_address.h" 14 #include "quiche/common/platform/api/quiche_logging.h" 15 16 namespace quic::socket_api { 17 ToPlatformSocketType(SocketProtocol protocol)18inline int ToPlatformSocketType(SocketProtocol protocol) { 19 switch (protocol) { 20 case SocketProtocol::kUdp: 21 return SOCK_DGRAM; 22 case SocketProtocol::kTcp: 23 return SOCK_STREAM; 24 case SocketProtocol::kRawIp: 25 return SOCK_RAW; 26 } 27 28 QUICHE_NOTREACHED(); 29 return -1; 30 } 31 ToPlatformProtocol(SocketProtocol protocol)32inline int ToPlatformProtocol(SocketProtocol protocol) { 33 switch (protocol) { 34 case SocketProtocol::kUdp: 35 return IPPROTO_UDP; 36 case SocketProtocol::kTcp: 37 return IPPROTO_TCP; 38 case SocketProtocol::kRawIp: 39 return IPPROTO_RAW; 40 } 41 42 QUICHE_NOTREACHED(); 43 return -1; 44 } 45 46 // A wrapper around QuicSocketAddress(sockaddr_storage) constructor that 47 // validates the supplied address. ValidateAndConvertAddress(const sockaddr_storage & addr,socklen_t addr_len)48inline absl::StatusOr<QuicSocketAddress> ValidateAndConvertAddress( 49 const sockaddr_storage& addr, socklen_t addr_len) { 50 if (addr.ss_family != AF_INET && addr.ss_family != AF_INET6) { 51 QUICHE_DVLOG(1) << "Socket did not have recognized address family: " 52 << addr.ss_family; 53 return absl::UnimplementedError("Unrecognized address family."); 54 } 55 56 if ((addr.ss_family == AF_INET && addr_len != sizeof(sockaddr_in)) || 57 (addr.ss_family == AF_INET6 && addr_len != sizeof(sockaddr_in6))) { 58 QUICHE_DVLOG(1) << "Socket did not have expected address size (" 59 << (addr.ss_family == AF_INET ? sizeof(sockaddr_in) 60 : sizeof(sockaddr_in6)) 61 << "), had: " << addr_len; 62 return absl::UnimplementedError("Unhandled address size."); 63 } 64 65 return QuicSocketAddress(addr); 66 } 67 GetAddrlen(IpAddressFamily family)68inline socklen_t GetAddrlen(IpAddressFamily family) { 69 switch (family) { 70 case IpAddressFamily::IP_V4: 71 return sizeof(sockaddr_in); 72 case IpAddressFamily::IP_V6: 73 return sizeof(sockaddr_in6); 74 default: 75 QUICHE_NOTREACHED(); 76 return 0; 77 } 78 } 79 80 } // namespace quic::socket_api 81 82 #endif // QUICHE_QUIC_CORE_IO_SOCKET_INTERNAL_H_ 83