| // 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 |