diff --git a/src/ice_transport.cpp b/src/ice_transport.cpp index 093e9a431c1aeb3451311e5082a03e2150e56832..914b756806d07da7d8fb6f5e6d9782fca7a16dd3 100644 --- a/src/ice_transport.cpp +++ b/src/ice_transport.cpp @@ -800,6 +800,7 @@ IceTransport::Impl::requestUpnpMappings() } } else { JAMI_ERR("[ice:%p]: UPNP mapping request failed!", this); + upnp_->releaseMapping(requestedMap); } } } diff --git a/src/upnp/upnp_context.cpp b/src/upnp/upnp_context.cpp index 70024ddae66e35d83a84d8a93d52a0ce5dcdbf58..7c881616240c5f70d184134ab916749ace6ee064 100644 --- a/src/upnp/upnp_context.cpp +++ b/src/upnp/upnp_context.cpp @@ -115,9 +115,7 @@ UPnPContext::StopUpnp() for (auto const& map : toRemoveList) { map->cancelTimeoutTimer(); updateMappingState(map, MappingState::FAILED); - if (map->isAvailable()) { - unregisterMapping(map); - } + unregisterMapping(map); } for (auto const& [_, protocol] : protocolList_) { @@ -529,6 +527,18 @@ UPnPContext::updateMappingList(bool async) status.inProgressCount_, status.failedCount_); + if (status.failedCount_ > 0) { + std::lock_guard<std::mutex> lock(mappingMutex_); + auto const& mappingList = getMappingList(type); + for (auto const& [_, map] : mappingList) { + if (map->getState() == MappingState::FAILED) { + JAMI_DBG("Mapping status [%s] - Available [%s]", + map->toString(true).c_str(), + map->isAvailable() ? "YES" : "NO"); + } + } + } + int toRequestCount = (int) minOpenPortLimit_[idx] - (int) (status.readyCount_ + status.inProgressCount_ + status.pendingCount_); @@ -626,10 +636,7 @@ UPnPContext::pruneUnMatchedMappings(const std::shared_ptr<IGD>& igd, for (auto const& map : toRemoveList) { updateMappingState(map, MappingState::FAILED); - // Remove if not used. - if (map->isAvailable()) { - unregisterMapping(map); - } + unregisterMapping(map); } } } @@ -695,9 +702,7 @@ UPnPContext::pruneMappingsWithInvalidIgds(const std::shared_ptr<IGD>& igd) igd->getProtocolName()); map->cancelTimeoutTimer(); updateMappingState(map, MappingState::FAILED); - if (map->isAvailable()) { - unregisterMapping(map); - } + unregisterMapping(map); } } @@ -922,10 +927,7 @@ UPnPContext::onMappingAdded(const std::shared_ptr<IGD>& igd, const Mapping& mapR map->toString().c_str(), igd->getLocalIp().toString().c_str()); updateMappingState(map, MappingState::FAILED); - // Remove if not used. - if (map->isAvailable()) { - unregisterMapping(map); - } + unregisterMapping(map); } // We have a response, so cancel the time-out. @@ -1195,11 +1197,7 @@ UPnPContext::onRequestTimeOut(const std::shared_ptr<IGD>& igd, const Mapping::sh // Considere time-out as failure. updateMappingState(map, MappingState::FAILED); - - // Remove it if not used. - if (map->isAvailable()) { - unregisterMapping(map); - } + unregisterMapping(map); } void