From 31cd726b7b38a12ea4dfbea64adbae8bfce746f7 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Wed, 20 May 2009 15:01:43 +0000 Subject: [PATCH] * UPnP: - Fix up port handling, add some logging on bind fails - Force IPv4 only for binds --- .../net/i2p/router/transport/UPnPManager.java | 5 ++++- .../src/org/cybergarage/http/HTTPServer.java | 1 + .../org/cybergarage/upnp/ControlPoint.java | 19 ++++++++++++++----- .../java/src/org/cybergarage/upnp/UPnP.java | 3 ++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java index 121fc59909..4231bb2497 100644 --- a/router/java/src/net/i2p/router/transport/UPnPManager.java +++ b/router/java/src/net/i2p/router/transport/UPnPManager.java @@ -48,6 +48,9 @@ public class UPnPManager { _context = context; _manager = manager; _log = _context.logManager().getLog(UPnPManager.class); + // UPnP wants to bind to IPv6 link local interfaces by default, but what UPnP router + // is going to want to talk IPv6 anyway? Just make it easy and force IPv4 only + org.cybergarage.upnp.UPnP.setEnable(org.cybergarage.upnp.UPnP.USE_ONLY_IPV4_ADDR); _upnp = new UPnP(context); _upnp.setHTTPPort(_context.getProperty(PROP_HTTP_PORT, DEFAULT_HTTP_PORT)); _upnp.setSSDPPort(_context.getProperty(PROP_SSDP_PORT, DEFAULT_SSDP_PORT)); @@ -150,7 +153,7 @@ public class UPnPManager { public String renderStatusHTML() { if (!_isRunning) - return "<a name=\"upnp\"><<b>UPnP is not enabled</b>\n"; + return "<a name=\"upnp\"><b>UPnP is not enabled</b>\n"; return _upnp.renderStatusHTML(); } } diff --git a/router/java/src/org/cybergarage/http/HTTPServer.java b/router/java/src/org/cybergarage/http/HTTPServer.java index 1e44b6f8b8..75c88c2b8b 100644 --- a/router/java/src/org/cybergarage/http/HTTPServer.java +++ b/router/java/src/org/cybergarage/http/HTTPServer.java @@ -91,6 +91,7 @@ public class HTTPServer implements Runnable serverSock.setSoTimeout(10*1000); } catch (IOException e) { + Debug.warning("HTTP server open failed " + addr + " " + port, e); return false; } return true; diff --git a/router/java/src/org/cybergarage/upnp/ControlPoint.java b/router/java/src/org/cybergarage/upnp/ControlPoint.java index 03cc372647..f1d56f44bc 100644 --- a/router/java/src/org/cybergarage/upnp/ControlPoint.java +++ b/router/java/src/org/cybergarage/upnp/ControlPoint.java @@ -786,9 +786,13 @@ public class ControlPoint implements HTTPRequestListener HTTPServerList httpServerList = getHTTPServerList(); while (httpServerList.open(bindPort) == false) { retryCnt++; - if (UPnP.SERVER_RETRY_COUNT < retryCnt) + if (UPnP.SERVER_RETRY_COUNT < retryCnt) { + Debug.warning("Failed to open HTTP event listener port " + bindPort); + // I2P do we really need this, or can we just break ? return false; - setHTTPPort(bindPort + 1); + } + // I2P go down not up so we don't run into other I2P things + setHTTPPort(bindPort - 1); bindPort = getHTTPPort(); } httpServerList.addRequestListener(this); @@ -799,8 +803,10 @@ public class ControlPoint implements HTTPRequestListener //////////////////////////////////////// SSDPNotifySocketList ssdpNotifySocketList = getSSDPNotifySocketList(); - if (ssdpNotifySocketList.open() == false) + if (ssdpNotifySocketList.open() == false) { + Debug.warning("Failed to open SSDP notify port 1900"); return false; + } ssdpNotifySocketList.setControlPoint(this); ssdpNotifySocketList.start(); @@ -813,9 +819,12 @@ public class ControlPoint implements HTTPRequestListener SSDPSearchResponseSocketList ssdpSearchResponseSocketList = getSSDPSearchResponseSocketList(); while (ssdpSearchResponseSocketList.open(ssdpPort) == false) { retryCnt++; - if (UPnP.SERVER_RETRY_COUNT < retryCnt) + if (UPnP.SERVER_RETRY_COUNT < retryCnt) { + Debug.warning("Failed to open SSDP search response port " + ssdpPort); return false; - setSSDPPort(ssdpPort + 1); + } + // I2P go down not up so we don't run into other I2P things + setSSDPPort(ssdpPort - 1); ssdpPort = getSSDPPort(); } ssdpSearchResponseSocketList.setControlPoint(this); diff --git a/router/java/src/org/cybergarage/upnp/UPnP.java b/router/java/src/org/cybergarage/upnp/UPnP.java index e27a5db40e..22f209d6a3 100644 --- a/router/java/src/org/cybergarage/upnp/UPnP.java +++ b/router/java/src/org/cybergarage/upnp/UPnP.java @@ -37,7 +37,8 @@ public class UPnP public final static String NAME = "CyberLink"; public final static String VERSION = "1.7"; - public final static int SERVER_RETRY_COUNT = 100; + // I2P was 100 + public final static int SERVER_RETRY_COUNT = 4; public final static int DEFAULT_EXPIRED_DEVICE_EXTRA_TIME = 60; public final static String getServerName() -- GitLab