Calculates a metric for how reachable (*this) is from a given partner */
| 711 | |
| 712 | /** Calculates a metric for how reachable (*this) is from a given partner */ |
| 713 | int CNetAddr::GetReachabilityFrom(const CNetAddr& paddrPartner) const |
| 714 | { |
| 715 | enum Reachability { |
| 716 | REACH_UNREACHABLE, |
| 717 | REACH_DEFAULT, |
| 718 | REACH_TEREDO, |
| 719 | REACH_IPV6_WEAK, |
| 720 | REACH_IPV4, |
| 721 | REACH_IPV6_STRONG, |
| 722 | REACH_PRIVATE |
| 723 | }; |
| 724 | |
| 725 | if (!IsRoutable() || IsInternal()) |
| 726 | return REACH_UNREACHABLE; |
| 727 | |
| 728 | int ourNet = GetExtNetwork(*this); |
| 729 | int theirNet = GetExtNetwork(paddrPartner); |
| 730 | bool fTunnel = IsRFC3964() || IsRFC6052() || IsRFC6145(); |
| 731 | |
| 732 | switch(theirNet) { |
| 733 | case NET_IPV4: |
| 734 | switch(ourNet) { |
| 735 | default: return REACH_DEFAULT; |
| 736 | case NET_IPV4: return REACH_IPV4; |
| 737 | } |
| 738 | case NET_IPV6: |
| 739 | switch(ourNet) { |
| 740 | default: return REACH_DEFAULT; |
| 741 | case NET_TEREDO: return REACH_TEREDO; |
| 742 | case NET_IPV4: return REACH_IPV4; |
| 743 | case NET_IPV6: return fTunnel ? REACH_IPV6_WEAK : REACH_IPV6_STRONG; // only prefer giving our IPv6 address if it's not tunnelled |
| 744 | } |
| 745 | case NET_ONION: |
| 746 | switch(ourNet) { |
| 747 | default: return REACH_DEFAULT; |
| 748 | case NET_IPV4: return REACH_IPV4; // Tor users can connect to IPv4 as well |
| 749 | case NET_ONION: return REACH_PRIVATE; |
| 750 | } |
| 751 | case NET_I2P: |
| 752 | switch (ourNet) { |
| 753 | case NET_I2P: return REACH_PRIVATE; |
| 754 | default: return REACH_DEFAULT; |
| 755 | } |
| 756 | case NET_CJDNS: |
| 757 | switch (ourNet) { |
| 758 | case NET_CJDNS: return REACH_PRIVATE; |
| 759 | default: return REACH_DEFAULT; |
| 760 | } |
| 761 | case NET_TEREDO: |
| 762 | switch(ourNet) { |
| 763 | default: return REACH_DEFAULT; |
| 764 | case NET_TEREDO: return REACH_TEREDO; |
| 765 | case NET_IPV6: return REACH_IPV6_WEAK; |
| 766 | case NET_IPV4: return REACH_IPV4; |
| 767 | } |
| 768 | case NET_UNROUTABLE: |
| 769 | default: |
| 770 | switch(ourNet) { |