1 // Copyright 2014 The Chromium Authors 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_address_mismatch.h" 6 7 #include "base/check_op.h" 8 #include "net/base/ip_address.h" 9 10 namespace net { 11 GetAddressMismatch(const IPEndPoint & first_address,const IPEndPoint & second_address)12int GetAddressMismatch(const IPEndPoint& first_address, 13 const IPEndPoint& second_address) { 14 if (first_address.address().empty() || second_address.address().empty()) { 15 return -1; 16 } 17 IPAddress first_ip_address = first_address.address(); 18 if (first_ip_address.IsIPv4MappedIPv6()) { 19 first_ip_address = ConvertIPv4MappedIPv6ToIPv4(first_ip_address); 20 } 21 IPAddress second_ip_address = second_address.address(); 22 if (second_ip_address.IsIPv4MappedIPv6()) { 23 second_ip_address = ConvertIPv4MappedIPv6ToIPv4(second_ip_address); 24 } 25 26 int sample; 27 if (first_ip_address != second_ip_address) { 28 sample = QUIC_ADDRESS_MISMATCH_BASE; 29 } else if (first_address.port() != second_address.port()) { 30 sample = QUIC_PORT_MISMATCH_BASE; 31 } else { 32 sample = QUIC_ADDRESS_AND_PORT_MATCH_BASE; 33 } 34 35 // Add an offset to |sample|: 36 // V4_V4: add 0 37 // V6_V6: add 1 38 // V4_V6: add 2 39 // V6_V4: add 3 40 bool first_ipv4 = first_ip_address.IsIPv4(); 41 if (first_ipv4 != second_ip_address.IsIPv4()) { 42 CHECK_EQ(sample, QUIC_ADDRESS_MISMATCH_BASE); 43 sample += 2; 44 } 45 if (!first_ipv4) { 46 sample += 1; 47 } 48 return sample; 49 } 50 51 } // namespace net 52