MCPcopy Create free account
hub / github.com/ElementsProject/elements / NatpmpMapping

Function NatpmpMapping

src/mapport.cpp:87–122  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

85}
86
87static 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
124static bool ProcessNatpmp()
125{

Callers 1

ProcessNatpmpFunction · 0.85

Calls 2

AddLocalFunction · 0.85
ToStringMethod · 0.45

Tested by

no test coverage detected