diff --git a/build.xml b/build.xml index 3b82c868c2..6caac71705 100644 --- a/build.xml +++ b/build.xml @@ -1292,20 +1292,29 @@ - + - - + + + + + + + + + + + diff --git a/router/java/build.xml b/router/java/build.xml index f473abf0cb..46ec22e491 100644 --- a/router/java/build.xml +++ b/router/java/build.xml @@ -258,7 +258,10 @@ + + + diff --git a/router/java/src/net/i2p/router/transport/GeoIPv6.java b/router/java/src/net/i2p/router/transport/GeoIPv6.java index 605bd0f38a..93affec888 100644 --- a/router/java/src/net/i2p/router/transport/GeoIPv6.java +++ b/router/java/src/net/i2p/router/transport/GeoIPv6.java @@ -31,6 +31,8 @@ import net.i2p.util.Log; /** * Generate compressed geoipv6.dat.gz file, and * lookup entries in it. + * + * @since IPv6 */ class GeoIPv6 { diff --git a/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java b/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java index 7170a7fcb0..206eaee7bd 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java @@ -1,5 +1,6 @@ package net.i2p.router.transport.udp; +import java.io.IOException; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Inet4Address; @@ -25,6 +26,7 @@ class UDPEndpoint { private final boolean _isIPv4, _isIPv6; /** + * @param transport may be null for unit testing ONLY * @param listenPort -1 or the requested port, may not be honored * @param bindAddress null ok */ @@ -49,9 +51,11 @@ class UDPEndpoint { throw new SocketException("SSU Unable to bind to a port on " + _bindAddress); } _sender = new UDPSender(_context, _socket, "UDPSender"); - _receiver = new UDPReceiver(_context, _transport, _socket, "UDPReceiver"); _sender.startup(); - _receiver.startup(); + if (_transport != null) { + _receiver = new UDPReceiver(_context, _transport, _socket, "UDPReceiver"); + _receiver.startup(); + } } public synchronized void shutdown() { @@ -157,6 +161,25 @@ class UDPEndpoint { public void send(UDPPacket packet) { _sender.add(packet); } + + /** + * Blocking call to receive the next inbound UDP packet from any peer. + * + * UNIT TESTING ONLY. Direct from the socket. + * In normal operation, UDPReceiver thread injects to PacketHandler queue. + * + * @return null if we have shut down, or on failure + */ + public UDPPacket receive() { + UDPPacket packet = UDPPacket.acquire(_context, true); + try { + _socket.receive(packet.getPacket()); + return packet; + } catch (IOException ioe) { + packet.release(); + return null; + } + } /** * Clear outbound queue, probably in preparation for sending destroy() to everybody. diff --git a/router/java/test/junit/net/i2p/router/transport/udp/UDPEndpointTestStandalone.java b/router/java/test/junit/net/i2p/router/transport/udp/UDPEndpointTestStandalone.java index 5b9d3de59c..6f83404d55 100644 --- a/router/java/test/junit/net/i2p/router/transport/udp/UDPEndpointTestStandalone.java +++ b/router/java/test/junit/net/i2p/router/transport/udp/UDPEndpointTestStandalone.java @@ -38,7 +38,11 @@ public class UDPEndpointTestStandalone { _log.debug("Building " + i); UDPEndpoint endpoint = new UDPEndpoint(_context, null, base + i, null); _endpoints[i] = endpoint; - endpoint.startup(); + try { + endpoint.startup(); + } catch (SocketException se) { + throw new RuntimeException(se); + } I2PThread read = new I2PThread(new TestRead(endpoint), "Test read " + i); I2PThread write = new I2PThread(new TestWrite(endpoint), "Test write " + i); //read.setDaemon(true);