| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "net/quic/quic_address_mismatch.h" | 
 |  | 
 | #include "base/logging.h" | 
 | #include "net/base/ip_address.h" | 
 |  | 
 | namespace net { | 
 |  | 
 | int GetAddressMismatch(const IPEndPoint& first_address, | 
 |                        const IPEndPoint& second_address) { | 
 |   if (first_address.address().empty() || second_address.address().empty()) { | 
 |     return -1; | 
 |   } | 
 |   IPAddress first_ip_address = first_address.address(); | 
 |   if (first_ip_address.IsIPv4MappedIPv6()) { | 
 |     first_ip_address = ConvertIPv4MappedIPv6ToIPv4(first_ip_address); | 
 |   } | 
 |   IPAddress second_ip_address = second_address.address(); | 
 |   if (second_ip_address.IsIPv4MappedIPv6()) { | 
 |     second_ip_address = ConvertIPv4MappedIPv6ToIPv4(second_ip_address); | 
 |   } | 
 |  | 
 |   int sample; | 
 |   if (first_ip_address != second_ip_address) { | 
 |     sample = QUIC_ADDRESS_MISMATCH_BASE; | 
 |   } else if (first_address.port() != second_address.port()) { | 
 |     sample = QUIC_PORT_MISMATCH_BASE; | 
 |   } else { | 
 |     sample = QUIC_ADDRESS_AND_PORT_MATCH_BASE; | 
 |   } | 
 |  | 
 |   // Add an offset to |sample|: | 
 |   //   V4_V4: add 0 | 
 |   //   V6_V6: add 1 | 
 |   //   V4_V6: add 2 | 
 |   //   V6_V4: add 3 | 
 |   bool first_ipv4 = first_ip_address.IsIPv4(); | 
 |   if (first_ipv4 != second_ip_address.IsIPv4()) { | 
 |     CHECK_EQ(sample, QUIC_ADDRESS_MISMATCH_BASE); | 
 |     sample += 2; | 
 |   } | 
 |   if (!first_ipv4) { | 
 |     sample += 1; | 
 |   } | 
 |   return sample; | 
 | } | 
 |  | 
 | }  // namespace net |