Calculates a metric for how reachable (*this) is from a given partner */
| 848 | |
| 849 | /** Calculates a metric for how reachable (*this) is from a given partner */ |
| 850 | int CNetAddr::GetReachabilityFrom(const CNetAddr *paddrPartner) const |
| 851 | { |
| 852 | enum Reachability { |
| 853 | REACH_UNREACHABLE, |
| 854 | REACH_DEFAULT, |
| 855 | REACH_TEREDO, |
| 856 | REACH_IPV6_WEAK, |
| 857 | REACH_IPV4, |
| 858 | REACH_IPV6_STRONG, |
| 859 | REACH_PRIVATE |
| 860 | }; |
| 861 | |
| 862 | if (!IsRoutable() || IsInternal()) |
| 863 | return REACH_UNREACHABLE; |
| 864 | |
| 865 | int ourNet = GetExtNetwork(this); |
| 866 | int theirNet = GetExtNetwork(paddrPartner); |
| 867 | bool fTunnel = IsRFC3964() || IsRFC6052() || IsRFC6145(); |
| 868 | |
| 869 | switch(theirNet) { |
| 870 | case NET_IPV4: |
| 871 | switch(ourNet) { |
| 872 | default: return REACH_DEFAULT; |
| 873 | case NET_IPV4: return REACH_IPV4; |
| 874 | } |
| 875 | case NET_IPV6: |
| 876 | switch(ourNet) { |
| 877 | default: return REACH_DEFAULT; |
| 878 | case NET_TEREDO: return REACH_TEREDO; |
| 879 | case NET_IPV4: return REACH_IPV4; |
| 880 | case NET_IPV6: return fTunnel ? REACH_IPV6_WEAK : REACH_IPV6_STRONG; // only prefer giving our IPv6 address if it's not tunnelled |
| 881 | } |
| 882 | case NET_ONION: |
| 883 | switch(ourNet) { |
| 884 | default: return REACH_DEFAULT; |
| 885 | case NET_IPV4: return REACH_IPV4; // Tor users can connect to IPv4 as well |
| 886 | case NET_ONION: return REACH_PRIVATE; |
| 887 | } |
| 888 | case NET_I2P: |
| 889 | switch (ourNet) { |
| 890 | case NET_I2P: return REACH_PRIVATE; |
| 891 | default: return REACH_DEFAULT; |
| 892 | } |
| 893 | case NET_CJDNS: |
| 894 | switch (ourNet) { |
| 895 | case NET_CJDNS: return REACH_PRIVATE; |
| 896 | default: return REACH_DEFAULT; |
| 897 | } |
| 898 | case NET_TEREDO: |
| 899 | switch(ourNet) { |
| 900 | default: return REACH_DEFAULT; |
| 901 | case NET_TEREDO: return REACH_TEREDO; |
| 902 | case NET_IPV6: return REACH_IPV6_WEAK; |
| 903 | case NET_IPV4: return REACH_IPV4; |
| 904 | } |
| 905 | case NET_UNKNOWN: |
| 906 | case NET_UNROUTABLE: |
| 907 | default: |