func renewUPnP(port int) { for { opts := cfg.Options() time.Sleep(time.Duration(opts.UPnPRenewal) * time.Minute) igd, err := upnp.Discover() if err != nil { continue } // Just renew the same port that we already have if externalPort != 0 { err = igd.AddPortMapping(upnp.TCP, externalPort, port, "syncthing", opts.UPnPLease*60) if err == nil { l.Infoln("Renewed UPnP port mapping - external port", externalPort) continue } } // Something strange has happened. We didn't have an external port before? // Or perhaps the gateway has changed? // Retry the same port sequence from the beginning. r := setupExternalPort(igd, port) if r != 0 { externalPort = r l.Infoln("Updated UPnP port mapping - external port", externalPort) discoverer.StopGlobal() discoverer.StartGlobal(opts.GlobalAnnServer, uint16(r)) continue } l.Warnln("Failed to update UPnP port mapping - external port", externalPort) } }
func setupUPnP() { if opts := cfg.Options(); len(opts.ListenAddress) == 1 { _, portStr, err := net.SplitHostPort(opts.ListenAddress[0]) if err != nil { l.Warnln("Bad listen address:", err) } else { // Set up incoming port forwarding, if necessary and possible port, _ := strconv.Atoi(portStr) igds := upnp.Discover() if len(igds) > 0 { // Configure the first discovered IGD only. This is a work-around until we have a better mechanism // for handling multiple IGDs, which will require changes to the global discovery service igd = &igds[0] externalPort = setupExternalPort(igd, port) if externalPort == 0 { l.Warnln("Failed to create UPnP port mapping") } else { l.Infof("Created UPnP port mapping for external port %d on UPnP device %s.", externalPort, igd.FriendlyIdentifier()) if opts.UPnPRenewal > 0 { go renewUPnP(port) } } } } } else { l.Warnln("Multiple listening addresses; not attempting UPnP port mapping") } }
func setupUPnP() { if opts := cfg.Options(); len(opts.ListenAddress) == 1 { _, portStr, err := net.SplitHostPort(opts.ListenAddress[0]) if err != nil { l.Warnln("Bad listen address:", err) } else { // Set up incoming port forwarding, if necessary and possible port, _ := strconv.Atoi(portStr) igd, err := upnp.Discover() if err == nil { externalPort = setupExternalPort(igd, port) if externalPort == 0 { l.Warnln("Failed to create UPnP port mapping") } else { l.Infoln("Created UPnP port mapping - external port", externalPort) } } else { l.Infof("No UPnP gateway detected") if debugNet { l.Debugf("UPnP: %v", err) } } if opts.UPnPRenewal > 0 { go renewUPnP(port) } } } else { l.Warnln("Multiple listening addresses; not attempting UPnP port mapping") } }
func renewUPnP(port int) { for { opts := cfg.Options() time.Sleep(time.Duration(opts.UPnPRenewal) * time.Minute) // Make sure our IGD reference isn't nil if igd == nil { if debugNet { l.Debugln("Undefined IGD during UPnP port renewal. Re-discovering...") } igds := upnp.Discover() if len(igds) > 0 { // Configure the first discovered IGD only. This is a work-around until we have a better mechanism // for handling multiple IGDs, which will require changes to the global discovery service igd = &igds[0] } else { if debugNet { l.Debugln("Failed to discover IGD during UPnP port mapping renewal.") } continue } } // Just renew the same port that we already have if externalPort != 0 { err := igd.AddPortMapping(upnp.TCP, externalPort, port, "syncthing", opts.UPnPLease*60) if err != nil { l.Warnf("Error renewing UPnP port mapping for external port %d on device %s: %s", externalPort, igd.FriendlyIdentifier(), err.Error()) } else if debugNet { l.Debugf("Renewed UPnP port mapping for external port %d on device %s.", externalPort, igd.FriendlyIdentifier()) } continue } // Something strange has happened. We didn't have an external port before? // Or perhaps the gateway has changed? // Retry the same port sequence from the beginning. if debugNet { l.Debugln("No UPnP port mapping defined, updating...") } forwardedPort := setupExternalPort(igd, port) if forwardedPort != 0 { externalPort = forwardedPort discoverer.StopGlobal() discoverer.StartGlobal(opts.GlobalAnnServers, uint16(forwardedPort)) if debugNet { l.Debugf("Updated UPnP port mapping for external port %d on device %s.", forwardedPort, igd.FriendlyIdentifier()) } } else { l.Warnf("Failed to update UPnP port mapping for external port on device " + igd.FriendlyIdentifier() + ".") } } }