- Tweak UPnP warning messages

- Remove unused verifyupdate.jsp
- Start of callbacks from UPnP to transports
- Tell UDP local addresses at startup
This commit is contained in:
zzz
2009-04-29 18:23:15 +00:00
parent 35b5eb74f6
commit b61861f840
10 changed files with 148 additions and 50 deletions

View File

@ -241,7 +241,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
public void notifyReplaceAddress(RouterAddress UDPAddr) {
if (UDPAddr == null)
return;
NTCPTransport t = (NTCPTransport) _manager.getNTCPTransport();
NTCPTransport t = (NTCPTransport) _manager.getTransport(NTCPTransport.STYLE);
if (t == null)
return;
Properties UDPProps = UDPAddr.getOptions();

View File

@ -35,6 +35,11 @@ public interface Transport {
public RouterAddress startListening();
public void stopListening();
public RouterAddress getCurrentAddress();
public static final String SOURCE_UPNP = "UPnP";
public static final String SOURCE_INTERFACE = "Local interface";
public static final String SOURCE_CONFIG = "Configuration change";
public void externalAddressReceived(String source, byte[] ip, int port);
public void forwardPortStatus(int port, boolean success, String reason);
public void setListener(TransportEventListener listener);
public String getStyle();

View File

@ -422,6 +422,29 @@ public abstract class TransportImpl implements Transport {
_context.commSystem().notifyReplaceAddress(address);
}
/**
* Notify a transport of an external address change.
* This may be from a local interface, UPnP, a config change, etc.
* This should not be called if the ip didn't change
* (from that source's point of view), or is a local address,
* or if the ip is IPv6, but the transport should check anyway.
* The transport should also do its own checking on whether to accept
* notifications from this source.
*
* This can be called before startListening() to set an initial address,
* or after the transport is running.
*
* @param source defined in Transport.java
* @param ip typ. IPv4 non-local
* @param port 0 for unknown or unchanged
*/
public void externalAddressReceived(String source, byte[] ip, int port) {}
/**
* Notify a transport of the results of trying to forward a port
*/
public void forwardPortStatus(int port, boolean success, String reason) {}
/** Who to notify on message availability */
public void setListener(TransportEventListener listener) { _listener = listener; }
/** Make this stuff pretty (only used in the old console) */

View File

@ -10,6 +10,8 @@ package net.i2p.router.transport;
import java.io.IOException;
import java.io.Writer;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -54,7 +56,7 @@ public class TransportManager implements TransportEventListener {
_context.statManager().createRateStat("transport.bidFailAllTransports", "Could not attempt to bid on message, as all of the transports had failed", "Transport", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
_transports = new ArrayList();
if (Boolean.valueOf(_context.getProperty(PROP_ENABLE_UPNP)).booleanValue())
_upnpManager = new UPnPManager(context);
_upnpManager = new UPnPManager(context, this);
}
public void addTransport(Transport transport) {
@ -75,14 +77,11 @@ public class TransportManager implements TransportEventListener {
enableUDP = DEFAULT_ENABLE_UDP;
if ("true".equalsIgnoreCase(enableUDP)) {
UDPTransport udp = new UDPTransport(_context);
udp.setListener(this);
_transports.add(udp);
}
if (enableNTCP(_context)) {
NTCPTransport ntcp = new NTCPTransport(_context);
ntcp.setListener(this);
_transports.add(ntcp);
addTransport(udp);
initializeAddress(udp);
}
if (enableNTCP(_context))
addTransport(new NTCPTransport(_context));
if (_transports.size() <= 0)
_log.log(Log.CRIT, "No transports are enabled");
}
@ -94,6 +93,41 @@ public class TransportManager implements TransportEventListener {
return "true".equalsIgnoreCase(enableNTCP);
}
private static void initializeAddress(Transport t) {
String ips = Addresses.getAnyAddress();
if (ips == null)
return;
InetAddress ia = null;
try {
ia = InetAddress.getByName(ips);
} catch (UnknownHostException e) {return;}
if (ia == null)
return;
byte[] ip = ia.getAddress();
t.externalAddressReceived(Transport.SOURCE_INTERFACE, ip, 0);
}
/**
* callback from UPnP
* Only tell SSU, it will tell NTCP
*
*/
public void externalAddressReceived(String source, byte[] ip, int port) {
Transport t = getTransport(UDPTransport.STYLE);
if (t != null)
t.externalAddressReceived(source, ip, port);
}
/**
* callback from UPnP
*
*/
public void forwardPortStatus(String style, int port, boolean success, String reason) {
Transport t = getTransport(style);
if (t != null)
t.forwardPortStatus(port, success, reason);
}
public void startListening() {
if (_upnpManager != null)
_upnpManager.start();
@ -102,7 +136,8 @@ public class TransportManager implements TransportEventListener {
for (int i = 0; i < _transports.size(); i++) {
Transport t = (Transport)_transports.get(i);
RouterAddress addr = t.startListening();
_log.debug("Transport " + i + " (" + t.getStyle() + ") started");
if (_log.shouldLog(Log.DEBUG))
_log.debug("Transport " + i + " (" + t.getStyle() + ") started");
}
_log.debug("Done start listening on transports");
_context.router().rebuildRouterInfo();
@ -123,10 +158,10 @@ public class TransportManager implements TransportEventListener {
_transports.clear();
}
public Transport getNTCPTransport() {
public Transport getTransport(String style) {
for (int i = 0; i < _transports.size(); i++) {
Transport t = (Transport)_transports.get(i);
if("NTCP".equals(t.getStyle()))
if(style.equals(t.getStyle()))
return t;
}
return null;

View File

@ -4,6 +4,7 @@ package net.i2p.router.transport;
* public domain
*/
import java.net.InetAddress;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
@ -23,9 +24,7 @@ import org.freenetproject.ForwardPortStatus;
* Bridge from the I2P RouterAddress data structure to
* the freenet data structures
*
* No disable option yet.
* UPnP listens on ports 1900, 8008, and 8058 - no config option yet.
* No routerconsole support yet.
*
* @author zzz
*/
@ -35,9 +34,12 @@ public class UPnPManager {
private UPnP _upnp;
private UPnPCallback _upnpCallback;
private boolean _isRunning;
private InetAddress _detectedAddress;
private TransportManager _manager;
public UPnPManager(RouterContext context) {
public UPnPManager(RouterContext context, TransportManager manager) {
_context = context;
_manager = manager;
_log = _context.logManager().getLog(UPnPManager.class);
_upnp = new UPnP(context);
_upnpCallback = new UPnPCallback();
@ -60,6 +62,7 @@ public class UPnPManager {
if (_isRunning)
_upnp.terminate();
_isRunning = false;
_detectedAddress = null;
}
/** call when the ports might have changed */
@ -98,7 +101,10 @@ public class UPnPManager {
_upnp.onChangePublicPorts(forwards, _upnpCallback);
}
/** just logs for now */
/**
* This is the callback from UPnP.
* It calls the TransportManager callbacks.
*/
private class UPnPCallback implements ForwardPortCallback {
/** Called to indicate status on one or more forwarded ports. */
@ -107,10 +113,19 @@ public class UPnPManager {
_log.debug("UPnP Callback:");
DetectedIP[] ips = _upnp.getAddress();
byte[] detected = null;
if (ips != null) {
for (DetectedIP ip : ips) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("External address: " + ip.publicAddress + " type: " + ip.natType);
// store the first public one and tell the transport manager if it changed
if (TransportImpl.isPubliclyRoutable(ip.publicAddress.getAddress())) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("External address: " + ip.publicAddress + " type: " + ip.natType);
if (!ip.publicAddress.equals(_detectedAddress)) {
_detectedAddress = ip.publicAddress;
_manager.externalAddressReceived(Transport.SOURCE_UPNP, _detectedAddress.getAddress(), 0);
}
break;
}
}
} else {
if (_log.shouldLog(Log.DEBUG))
@ -122,6 +137,15 @@ public class UPnPManager {
if (_log.shouldLog(Log.DEBUG))
_log.debug(fp.name + " " + fp.protocol + " " + fp.portNumber +
" status: " + fps.status + " reason: " + fps.reasonString + " ext port: " + fps.externalPort);
String style;
if (fp.protocol == ForwardPort.PROTOCOL_UDP_IPV4)
style = "SSU";
else if (fp.protocol == ForwardPort.PROTOCOL_TCP_IPV4)
style = "NTCP";
else
continue;
boolean success = fps.status >= ForwardPortStatus.PROBABLE_SUCCESS;
_manager.forwardPortStatus(style, fp.portNumber, success, fps.reasonString);
}
}
}

View File

@ -539,6 +539,19 @@ public class NTCPTransport extends TransportImpl {
}
}
/**
* If we didn't used to be forwarded, and we have an address,
* and we are configured to use UPnP, update our RouterAddress
*/
public void forwardPortStatus(int port, boolean success, String reason) {
if (_log.shouldLog(Log.WARN)) {
if (success)
_log.warn("UPnP has opened the NTCP port: " + port);
else
_log.warn("UPnP has failed to open the NTCP port: " + port + " reason: " + reason);
}
}
/**
* This doesn't (completely) block, caller should check isAlive()
* before calling startListening() or restartListening()

View File

@ -326,6 +326,15 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
_lastInboundReceivedOn = System.currentTimeMillis();
}
/**
* From config, UPnP, local i/f, ...
*/
public void externalAddressReceived(String source, byte[] ip, int port) {
String s = RemoteHostId.toString(ip);
if (_log.shouldLog(Log.WARN))
_log.warn("Received address: " + s + " port: " + port + " from: " + source);
}
/**
* Someone we tried to contact gave us what they think our IP address is.
* Right now, we just blindly trust them, changing our IP and port on a

View File

@ -3,7 +3,7 @@
* CyberUtil for Java
*
* Copyright (C) Satoshi Konno 2002
*
*
* File: Debug.java
*
* Revision;
@ -12,40 +12,40 @@
* - first revision.
*
******************************************************************/
package org.cybergarage.util;
public final class Debug
{
public static boolean enabled = false;
public static final void on() {
enabled = true;
}
}
public static final void off() {
enabled = false;
}
}
public static boolean isOn() {
return enabled;
}
public static final void message(String s) {
if (enabled == true)
System.out.println("CyberGarage message : " + s);
}
}
public static final void message(String s) {
if (enabled == true)
System.out.println("UPnP message : " + s);
}
public static final void message(String m1, String m2) {
if (enabled == true)
System.out.println("CyberGarage message : ");
System.out.println("UPnP message : ");
System.out.println(m1);
System.out.println(m2);
}
public static final void warning(String s) {
System.out.println("CyberGarage warning : " + s);
}
public static final void warning(String s) {
System.out.println("UPnP warning : " + s);
}
public static final void warning(String m, Exception e) {
System.out.println("CyberGarage warning : " + m + " (" + e.getMessage() + ")");
System.out.println("UPnP warning : " + m + " (" + e.getMessage() + ")");
}
public static final void warning(Exception e) {
warning(e.getMessage());
warning(e.getMessage());
e.printStackTrace();
}
}
}
}