xref: /aosp_15_r20/external/cronet/net/quic/quic_address_mismatch.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 Worker int 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