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);