mirror of
https://github.com/monero-project/monero.git
synced 2024-11-18 00:37:43 +00:00
Delete UPnP port mapping on exit
This commit is contained in:
parent
72b5f37f58
commit
a1ea475fff
2 changed files with 97 additions and 43 deletions
|
@ -218,6 +218,8 @@ namespace nodetool
|
|||
bool is_peer_used(const peerlist_entry& peer);
|
||||
bool is_peer_used(const anchor_peerlist_entry& peer);
|
||||
bool is_addr_connected(const epee::net_utils::network_address& peer);
|
||||
void add_upnp_port_mapping(uint32_t port);
|
||||
void delete_upnp_port_mapping(uint32_t port);
|
||||
template<class t_callback>
|
||||
bool try_ping(basic_node_data& node_data, p2p_connection_context& context, t_callback cb);
|
||||
bool try_get_support_flags(const p2p_connection_context& context, std::function<void(p2p_connection_context&, const uint32_t&)> f);
|
||||
|
|
|
@ -578,50 +578,10 @@ namespace nodetool
|
|||
if(m_external_port)
|
||||
MDEBUG("External port defined as " << m_external_port);
|
||||
|
||||
// Add UPnP port mapping
|
||||
if(m_no_igd == false) {
|
||||
MDEBUG("Attempting to add IGD port mapping.");
|
||||
int result;
|
||||
#if MINIUPNPC_API_VERSION > 13
|
||||
// default according to miniupnpc.h
|
||||
unsigned char ttl = 2;
|
||||
UPNPDev* deviceList = upnpDiscover(1000, NULL, NULL, 0, 0, ttl, &result);
|
||||
#else
|
||||
UPNPDev* deviceList = upnpDiscover(1000, NULL, NULL, 0, 0, &result);
|
||||
#endif
|
||||
UPNPUrls urls;
|
||||
IGDdatas igdData;
|
||||
char lanAddress[64];
|
||||
result = UPNP_GetValidIGD(deviceList, &urls, &igdData, lanAddress, sizeof lanAddress);
|
||||
freeUPNPDevlist(deviceList);
|
||||
if (result != 0) {
|
||||
if (result == 1) {
|
||||
std::ostringstream portString;
|
||||
portString << m_listenning_port;
|
||||
// add UPnP port mapping
|
||||
if(!m_no_igd)
|
||||
add_upnp_port_mapping(m_listenning_port);
|
||||
|
||||
// Delete the port mapping before we create it, just in case we have dangling port mapping from the daemon not being shut down correctly
|
||||
UPNP_DeletePortMapping(urls.controlURL, igdData.first.servicetype, portString.str().c_str(), "TCP", 0);
|
||||
|
||||
int portMappingResult;
|
||||
portMappingResult = UPNP_AddPortMapping(urls.controlURL, igdData.first.servicetype, portString.str().c_str(), portString.str().c_str(), lanAddress, CRYPTONOTE_NAME, "TCP", 0, "0");
|
||||
if (portMappingResult != 0) {
|
||||
LOG_ERROR("UPNP_AddPortMapping failed, error: " << strupnperror(portMappingResult));
|
||||
} else {
|
||||
MLOG_GREEN(el::Level::Info, "Added IGD port mapping.");
|
||||
}
|
||||
} else if (result == 2) {
|
||||
MWARNING("IGD was found but reported as not connected.");
|
||||
} else if (result == 3) {
|
||||
MWARNING("UPnP device was found but not recognized as IGD.");
|
||||
} else {
|
||||
MWARNING("UPNP_GetValidIGD returned an unknown result code.");
|
||||
}
|
||||
|
||||
FreeUPNPUrls(&urls);
|
||||
} else {
|
||||
MINFO("No IGD was found.");
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
//-----------------------------------------------------------------------------------
|
||||
|
@ -688,6 +648,9 @@ namespace nodetool
|
|||
kill();
|
||||
m_peerlist.deinit();
|
||||
m_net_server.deinit_server();
|
||||
// remove UPnP port mapping
|
||||
if(!m_no_igd)
|
||||
delete_upnp_port_mapping(m_listenning_port);
|
||||
return store_config();
|
||||
}
|
||||
//-----------------------------------------------------------------------------------
|
||||
|
@ -1973,4 +1936,93 @@ namespace nodetool
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
template<class t_payload_net_handler>
|
||||
void node_server<t_payload_net_handler>::add_upnp_port_mapping(uint32_t port)
|
||||
{
|
||||
MDEBUG("Attempting to add IGD port mapping.");
|
||||
int result;
|
||||
#if MINIUPNPC_API_VERSION > 13
|
||||
// default according to miniupnpc.h
|
||||
unsigned char ttl = 2;
|
||||
UPNPDev* deviceList = upnpDiscover(1000, NULL, NULL, 0, 0, ttl, &result);
|
||||
#else
|
||||
UPNPDev* deviceList = upnpDiscover(1000, NULL, NULL, 0, 0, &result);
|
||||
#endif
|
||||
UPNPUrls urls;
|
||||
IGDdatas igdData;
|
||||
char lanAddress[64];
|
||||
result = UPNP_GetValidIGD(deviceList, &urls, &igdData, lanAddress, sizeof lanAddress);
|
||||
freeUPNPDevlist(deviceList);
|
||||
if (result != 0) {
|
||||
if (result == 1) {
|
||||
std::ostringstream portString;
|
||||
portString << port;
|
||||
|
||||
// Delete the port mapping before we create it, just in case we have dangling port mapping from the daemon not being shut down correctly
|
||||
UPNP_DeletePortMapping(urls.controlURL, igdData.first.servicetype, portString.str().c_str(), "TCP", 0);
|
||||
|
||||
int portMappingResult;
|
||||
portMappingResult = UPNP_AddPortMapping(urls.controlURL, igdData.first.servicetype, portString.str().c_str(), portString.str().c_str(), lanAddress, CRYPTONOTE_NAME, "TCP", 0, "0");
|
||||
if (portMappingResult != 0) {
|
||||
LOG_ERROR("UPNP_AddPortMapping failed, error: " << strupnperror(portMappingResult));
|
||||
} else {
|
||||
MLOG_GREEN(el::Level::Info, "Added IGD port mapping.");
|
||||
}
|
||||
} else if (result == 2) {
|
||||
MWARNING("IGD was found but reported as not connected.");
|
||||
} else if (result == 3) {
|
||||
MWARNING("UPnP device was found but not recognized as IGD.");
|
||||
} else {
|
||||
MWARNING("UPNP_GetValidIGD returned an unknown result code.");
|
||||
}
|
||||
|
||||
FreeUPNPUrls(&urls);
|
||||
} else {
|
||||
MINFO("No IGD was found.");
|
||||
}
|
||||
}
|
||||
|
||||
template<class t_payload_net_handler>
|
||||
void node_server<t_payload_net_handler>::delete_upnp_port_mapping(uint32_t port)
|
||||
{
|
||||
MDEBUG("Attempting to delete IGD port mapping.");
|
||||
int result;
|
||||
#if MINIUPNPC_API_VERSION > 13
|
||||
// default according to miniupnpc.h
|
||||
unsigned char ttl = 2;
|
||||
UPNPDev* deviceList = upnpDiscover(1000, NULL, NULL, 0, 0, ttl, &result);
|
||||
#else
|
||||
UPNPDev* deviceList = upnpDiscover(1000, NULL, NULL, 0, 0, &result);
|
||||
#endif
|
||||
UPNPUrls urls;
|
||||
IGDdatas igdData;
|
||||
char lanAddress[64];
|
||||
result = UPNP_GetValidIGD(deviceList, &urls, &igdData, lanAddress, sizeof lanAddress);
|
||||
freeUPNPDevlist(deviceList);
|
||||
if (result != 0) {
|
||||
if (result == 1) {
|
||||
std::ostringstream portString;
|
||||
portString << port;
|
||||
|
||||
int portMappingResult;
|
||||
portMappingResult = UPNP_DeletePortMapping(urls.controlURL, igdData.first.servicetype, portString.str().c_str(), "TCP", 0);
|
||||
if (portMappingResult != 0) {
|
||||
LOG_ERROR("UPNP_DeletePortMapping failed, error: " << strupnperror(portMappingResult));
|
||||
} else {
|
||||
MLOG_GREEN(el::Level::Info, "Deleted IGD port mapping.");
|
||||
}
|
||||
} else if (result == 2) {
|
||||
MWARNING("IGD was found but reported as not connected.");
|
||||
} else if (result == 3) {
|
||||
MWARNING("UPnP device was found but not recognized as IGD.");
|
||||
} else {
|
||||
MWARNING("UPNP_GetValidIGD returned an unknown result code.");
|
||||
}
|
||||
|
||||
FreeUPNPUrls(&urls);
|
||||
} else {
|
||||
MINFO("No IGD was found.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue