p2p/nat: do not reset external port on UPnP refresh failure

Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
This commit is contained in:
Csaba Kiraly 2025-04-03 08:54:43 +02:00
parent 77dc1acafa
commit fe9056f29f
No known key found for this signature in database
GPG key ID: 0FE274EE8C95166E

View file

@ -154,28 +154,40 @@ func (srv *Server) portMappingLoop() {
log.Trace("Attempting port mapping") log.Trace("Attempting port mapping")
p, err := srv.NAT.AddMapping(m.protocol, m.extPort, m.port, m.name, portMapDuration) p, err := srv.NAT.AddMapping(m.protocol, m.extPort, m.port, m.name, portMapDuration)
if err != nil { if err != nil {
log.Debug("Couldn't add port mapping", "err", err) // Failed to add or refresh port mapping.
m.extPort = 0 if m.extPort == 0 {
log.Debug("Couldn't add port mapping", "err", err)
} else {
// Since UPnP implementation are often buggy,
// and lifetime is larger than the retry interval, this does not mean we lost our
// existing mapping. We do not reset the external port, as it is still our best chance,
// but we do retry soon.
// TODO: we could check the error code, but again, UPnP implementations are buggy.
log.Debug("Couldn't refresh port mapping", "err", err)
}
m.nextTime = srv.clock.Now().Add(portMapRetryInterval) m.nextTime = srv.clock.Now().Add(portMapRetryInterval)
continue continue
} }
// It was mapped! // It was mapped!
m.extPort = int(p) log = newLogger(m.protocol, int(p), m.port)
m.nextTime = srv.clock.Now().Add(portMapRefreshInterval) if int(p) != m.extPort {
log = newLogger(m.protocol, m.extPort, m.port) m.extPort = int(p)
if m.port != m.extPort { if m.port != m.extPort {
log.Info("NAT mapped alternative port") log.Info("NAT mapped alternative port")
} else { } else {
log.Info("NAT mapped port") log.Info("NAT mapped port")
} }
// Update port in local ENR. // Update port in local ENR.
switch m.protocol { switch m.protocol {
case "TCP": case "TCP":
srv.localnode.Set(enr.TCP(m.extPort)) srv.localnode.Set(enr.TCP(m.extPort))
case "UDP": case "UDP":
srv.localnode.SetFallbackUDP(m.extPort) srv.localnode.SetFallbackUDP(m.extPort)
}
} }
m.nextTime = srv.clock.Now().Add(portMapRefreshInterval)
} }
} }
} }