1 // Copyright (c) 2019 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 #ifndef NET_QUIC_ADDRESS_UTILS_H_
6 #define NET_QUIC_ADDRESS_UTILS_H_
7
8 #include <string.h>
9
10 #include "net/base/ip_address.h"
11 #include "net/base/ip_endpoint.h"
12 #include "net/third_party/quiche/src/quic/platform/api/quic_ip_address.h"
13 #include "net/third_party/quiche/src/quic/platform/api/quic_ip_address_family.h"
14 #include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h"
15
16 namespace net {
17
ToIPEndPoint(quic::QuicSocketAddress address)18 inline IPEndPoint ToIPEndPoint(quic::QuicSocketAddress address) {
19 if (!address.IsInitialized()) {
20 return IPEndPoint();
21 }
22
23 IPEndPoint result;
24 sockaddr_storage storage = address.generic_address();
25 const bool success = result.FromSockAddr(
26 reinterpret_cast<const sockaddr*>(&storage), sizeof(storage));
27 DCHECK(success);
28 return result;
29 }
30
ToIPAddress(quic::QuicIpAddress address)31 inline IPAddress ToIPAddress(quic::QuicIpAddress address) {
32 if (!address.IsInitialized()) {
33 return IPAddress();
34 }
35
36 switch (address.address_family()) {
37 case quic::IpAddressFamily::IP_V4: {
38 in_addr raw_address = address.GetIPv4();
39 return IPAddress(reinterpret_cast<const uint8_t*>(&raw_address),
40 sizeof(raw_address));
41 }
42 case quic::IpAddressFamily::IP_V6: {
43 in6_addr raw_address = address.GetIPv6();
44 return IPAddress(reinterpret_cast<const uint8_t*>(&raw_address),
45 sizeof(raw_address));
46 }
47 default:
48 DCHECK_EQ(address.address_family(), quic::IpAddressFamily::IP_UNSPEC);
49 return IPAddress();
50 }
51 }
52
ToQuicSocketAddress(IPEndPoint address)53 inline quic::QuicSocketAddress ToQuicSocketAddress(IPEndPoint address) {
54 if (address.address().empty()) {
55 return quic::QuicSocketAddress();
56 }
57
58 sockaddr_storage result;
59 socklen_t size = sizeof(result);
60 bool success =
61 address.ToSockAddr(reinterpret_cast<sockaddr*>(&result), &size);
62 DCHECK(success);
63 return quic::QuicSocketAddress(result);
64 }
65
ToQuicIpAddress(net::IPAddress address)66 inline quic::QuicIpAddress ToQuicIpAddress(net::IPAddress address) {
67 if (address.IsIPv4()) {
68 in_addr result;
69 static_assert(sizeof(result) == IPAddress::kIPv4AddressSize,
70 "Address size mismatch");
71 memcpy(&result, address.bytes().data(), IPAddress::kIPv4AddressSize);
72 return quic::QuicIpAddress(result);
73 }
74 if (address.IsIPv6()) {
75 in6_addr result;
76 static_assert(sizeof(result) == IPAddress::kIPv6AddressSize,
77 "Address size mismatch");
78 memcpy(&result, address.bytes().data(), IPAddress::kIPv6AddressSize);
79 return quic::QuicIpAddress(result);
80 }
81
82 DCHECK(address.empty());
83 return quic::QuicIpAddress();
84 }
85
86 } // namespace net
87
88 #endif // NET_QUIC_ADDRESS_UTILS_H_
89