1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "net/quic/quic_address_mismatch.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h" 8*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_address.h" 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker namespace net { 11*6777b538SAndroid Build Coastguard Worker GetAddressMismatch(const IPEndPoint & first_address,const IPEndPoint & second_address)12*6777b538SAndroid Build Coastguard Workerint GetAddressMismatch(const IPEndPoint& first_address, 13*6777b538SAndroid Build Coastguard Worker const IPEndPoint& second_address) { 14*6777b538SAndroid Build Coastguard Worker if (first_address.address().empty() || second_address.address().empty()) { 15*6777b538SAndroid Build Coastguard Worker return -1; 16*6777b538SAndroid Build Coastguard Worker } 17*6777b538SAndroid Build Coastguard Worker IPAddress first_ip_address = first_address.address(); 18*6777b538SAndroid Build Coastguard Worker if (first_ip_address.IsIPv4MappedIPv6()) { 19*6777b538SAndroid Build Coastguard Worker first_ip_address = ConvertIPv4MappedIPv6ToIPv4(first_ip_address); 20*6777b538SAndroid Build Coastguard Worker } 21*6777b538SAndroid Build Coastguard Worker IPAddress second_ip_address = second_address.address(); 22*6777b538SAndroid Build Coastguard Worker if (second_ip_address.IsIPv4MappedIPv6()) { 23*6777b538SAndroid Build Coastguard Worker second_ip_address = ConvertIPv4MappedIPv6ToIPv4(second_ip_address); 24*6777b538SAndroid Build Coastguard Worker } 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker int sample; 27*6777b538SAndroid Build Coastguard Worker if (first_ip_address != second_ip_address) { 28*6777b538SAndroid Build Coastguard Worker sample = QUIC_ADDRESS_MISMATCH_BASE; 29*6777b538SAndroid Build Coastguard Worker } else if (first_address.port() != second_address.port()) { 30*6777b538SAndroid Build Coastguard Worker sample = QUIC_PORT_MISMATCH_BASE; 31*6777b538SAndroid Build Coastguard Worker } else { 32*6777b538SAndroid Build Coastguard Worker sample = QUIC_ADDRESS_AND_PORT_MATCH_BASE; 33*6777b538SAndroid Build Coastguard Worker } 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // Add an offset to |sample|: 36*6777b538SAndroid Build Coastguard Worker // V4_V4: add 0 37*6777b538SAndroid Build Coastguard Worker // V6_V6: add 1 38*6777b538SAndroid Build Coastguard Worker // V4_V6: add 2 39*6777b538SAndroid Build Coastguard Worker // V6_V4: add 3 40*6777b538SAndroid Build Coastguard Worker bool first_ipv4 = first_ip_address.IsIPv4(); 41*6777b538SAndroid Build Coastguard Worker if (first_ipv4 != second_ip_address.IsIPv4()) { 42*6777b538SAndroid Build Coastguard Worker CHECK_EQ(sample, QUIC_ADDRESS_MISMATCH_BASE); 43*6777b538SAndroid Build Coastguard Worker sample += 2; 44*6777b538SAndroid Build Coastguard Worker } 45*6777b538SAndroid Build Coastguard Worker if (!first_ipv4) { 46*6777b538SAndroid Build Coastguard Worker sample += 1; 47*6777b538SAndroid Build Coastguard Worker } 48*6777b538SAndroid Build Coastguard Worker return sample; 49*6777b538SAndroid Build Coastguard Worker } 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker } // namespace net 52