1 // Copyright 2014 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 #include "net/quic/quic_socket_address_coder.h"
6
7 using std::string;
8
9 namespace net {
10
11 namespace {
12
13 // For convenience, the values of these constants match the values of AF_INET
14 // and AF_INET6 on Linux.
15 const uint16 kIPv4 = 2;
16 const uint16 kIPv6 = 10;
17
18 } // namespace
19
QuicSocketAddressCoder()20 QuicSocketAddressCoder::QuicSocketAddressCoder() {
21 }
22
QuicSocketAddressCoder(const IPEndPoint & address)23 QuicSocketAddressCoder::QuicSocketAddressCoder(const IPEndPoint& address)
24 : address_(address) {
25 }
26
~QuicSocketAddressCoder()27 QuicSocketAddressCoder::~QuicSocketAddressCoder() {
28 }
29
Encode() const30 string QuicSocketAddressCoder::Encode() const {
31 string serialized;
32 uint16 address_family;
33 switch (address_.GetSockAddrFamily()) {
34 case AF_INET:
35 address_family = kIPv4;
36 break;
37 case AF_INET6:
38 address_family = kIPv6;
39 break;
40 default:
41 return serialized;
42 }
43 serialized.append(reinterpret_cast<const char*>(&address_family),
44 sizeof(address_family));
45 serialized.append(IPAddressToPackedString(address_.address()));
46 uint16 port = address_.port();
47 serialized.append(reinterpret_cast<const char*>(&port), sizeof(port));
48 return serialized;
49 }
50
Decode(const char * data,size_t length)51 bool QuicSocketAddressCoder::Decode(const char* data, size_t length) {
52 uint16 address_family;
53 if (length < sizeof(address_family)) {
54 return false;
55 }
56 memcpy(&address_family, data, sizeof(address_family));
57 data += sizeof(address_family);
58 length -= sizeof(address_family);
59
60 size_t ip_length;
61 switch (address_family) {
62 case kIPv4:
63 ip_length = kIPv4AddressSize;
64 break;
65 case kIPv6:
66 ip_length = kIPv6AddressSize;
67 break;
68 default:
69 return false;
70 }
71 if (length < ip_length) {
72 return false;
73 }
74 IPAddressNumber ip(ip_length);
75 memcpy(&ip[0], data, ip_length);
76 data += ip_length;
77 length -= ip_length;
78
79 uint16 port;
80 if (length != sizeof(port)) {
81 return false;
82 }
83 memcpy(&port, data, length);
84
85 address_ = IPEndPoint(ip, port);
86 return true;
87 }
88
89 } // namespace net
90