| 85 | } |
| 86 | |
| 87 | static bool NatpmpMapping(natpmp_t* natpmp, const struct in_addr& external_ipv4_addr, uint16_t private_port, bool& external_ip_discovered) |
| 88 | { |
| 89 | const uint16_t suggested_external_port = g_mapport_external_port ? g_mapport_external_port : private_port; |
| 90 | const int r_send = sendnewportmappingrequest(natpmp, NATPMP_PROTOCOL_TCP, private_port, suggested_external_port, 3600 /*seconds*/); |
| 91 | if (r_send == 12 /* OK */) { |
| 92 | int r_read; |
| 93 | natpmpresp_t response; |
| 94 | do { |
| 95 | r_read = readnatpmpresponseorretry(natpmp, &response); |
| 96 | } while (r_read == NATPMP_TRYAGAIN); |
| 97 | |
| 98 | if (r_read == 0) { |
| 99 | auto pm = response.pnu.newportmapping; |
| 100 | if (private_port == pm.privateport && pm.lifetime > 0) { |
| 101 | g_mapport_external_port = pm.mappedpublicport; |
| 102 | const CService external{external_ipv4_addr, pm.mappedpublicport}; |
| 103 | if (!external_ip_discovered && fDiscover) { |
| 104 | AddLocal(external, LOCAL_MAPPED); |
| 105 | external_ip_discovered = true; |
| 106 | } |
| 107 | LogPrintf("natpmp: Port mapping successful. External address = %s\n", external.ToString()); |
| 108 | return true; |
| 109 | } else { |
| 110 | LogPrintf("natpmp: Port mapping failed.\n"); |
| 111 | } |
| 112 | } else if (r_read == NATPMP_ERR_NOGATEWAYSUPPORT) { |
| 113 | LogPrintf("natpmp: The gateway does not support NAT-PMP.\n"); |
| 114 | } else { |
| 115 | LogPrintf("natpmp: readnatpmpresponseorretry() for port mapping failed with %d error.\n", r_read); |
| 116 | } |
| 117 | } else { |
| 118 | LogPrintf("natpmp: sendnewportmappingrequest() failed with %d error.\n", r_send); |
| 119 | } |
| 120 | |
| 121 | return false; |
| 122 | } |
| 123 | |
| 124 | static bool ProcessNatpmp() |
| 125 | { |
no test coverage detected