diff --git a/build.xml b/build.xml
index c0fb6b135..db4267299 100644
--- a/build.xml
+++ b/build.xml
@@ -3009,6 +3009,11 @@
+
+
@@ -3079,6 +3084,11 @@
+
+
diff --git a/history.txt b/history.txt
index c8a9f5d45..a44d0b42f 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,8 @@
+2026-02-08 zzz
+ * Debian: Remove resolute jars from jammy source
+ * Router: More robustness fixes
+ * SSU2: Increase IP table size
+
2026-02-06 zzz
* Debian: Resolute/trixie fixes
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 60e19a327..63114b17b 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -20,7 +20,7 @@ public class RouterVersion {
public final static String VERSION = CoreVersion.VERSION;
/** for example: "beta", "alpha", "rc" */
public final static String QUALIFIER = "-rc";
- public final static long BUILD = 10;
+ public final static long BUILD = 11;
/** for example "-test" */
public final static String EXTRA = "";
public final static String FULL_VERSION = VERSION + "-" + BUILD + QUALIFIER + EXTRA;
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
index bb0515fec..2ab7b01d2 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
@@ -256,6 +256,7 @@ class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
if (count > LIMIT_ROUTERS) {
String caps = ri.getCapabilities();
boolean isU = caps.indexOf(Router.CAPABILITY_UNREACHABLE) >= 0;
+ boolean isG = caps.indexOf(Router.CAPABILITY_NO_TUNNELS) >= 0;
boolean isFF = caps.indexOf(FloodfillNetworkDatabaseFacade.CAPABILITY_FLOODFILL) >= 0;
boolean notFrom = !key.equals(_fromHash);
boolean isSlow = caps.indexOf(Router.CAPABILITY_BW32) >= 0;
@@ -277,6 +278,8 @@ class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
int pdrop = Math.min(110, (128 * count / LIMIT_ROUTERS) - 128);
if (isU)
pdrop *= 3;
+ if (isG)
+ pdrop *= 3;
if (isFF)
pdrop *= 3;
if (notFrom)
@@ -333,6 +336,8 @@ class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
int pdrop = (128 * count / LIMIT_ROUTERS) - 128;
if (isU)
pdrop *= 3;
+ if (isG)
+ pdrop *= 3;
if (isFF)
pdrop *= 3;
if (notFrom)
diff --git a/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java b/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java
index 163c9c4ae..b710ea81a 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/InboundEstablishState.java
@@ -715,6 +715,17 @@ class InboundEstablishState extends EstablishBase implements NTCP2Payload.Payloa
throw new DataFormatException("Old and slow: " + h);
}
+ if (ri.getCapabilities().indexOf('G') >= 0 &&
+ ri.getCapabilities().indexOf('X') >= 0 &&
+ ri.getCapabilities().indexOf('f') >= 0 &&
+ ri.getVersion().equals("0.9.67")) {
+ long time = _context.netDb().floodfillEnabled() ? 30*60*1000 : 60*60*1000;
+ _context.banlist().banlistRouter(h, "Refuses tunnels", null,
+ null, _context.clock().now() + time);
+ _msg3p2FailReason = NTCPConnection.REASON_BANNED;
+ throw new DataFormatException("Refuses tunnels: " + h);
+ }
+
try {
RouterInfo old = _context.netDb().store(h, ri);
if (flood && !ri.equals(old)) {
diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
index b5833c7d5..485ec0ac5 100644
--- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
@@ -189,7 +189,7 @@ class EstablishmentManager {
_liveIntroductions = new ConcurrentHashMap();
_outboundByClaimedAddress = new ConcurrentHashMap();
_outboundByHash = new ConcurrentHashMap();
- _inboundBans = new LHMCache(32);
+ _inboundBans = new LHMCache(128);
// roughly scale based on expected traffic
int tokenCacheSize = Math.max(MIN_TOKENS, Math.min(MAX_TOKENS, 3 * _transport.getMaxConnections() / 4));
_inboundTokens = new InboundTokens(tokenCacheSize);
diff --git a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java
index 27f4e0c2b..dea02a05c 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState2.java
@@ -374,6 +374,18 @@ class InboundEstablishState2 extends InboundEstablishState implements SSU2Payloa
throw new RIException("Old and slow: " + h, REASON_BANNED);
}
+ if (ri.getCapabilities().indexOf('G') >= 0 &&
+ ri.getCapabilities().indexOf('X') >= 0 &&
+ ri.getCapabilities().indexOf('f') >= 0 &&
+ ri.getVersion().equals("0.9.67")) {
+ long time = _context.netDb().floodfillEnabled() ? 30*60*1000 : 60*60*1000;
+ _context.banlist().banlistRouter(h, "Refuses tunnels", null,
+ null, _context.clock().now() + time);
+ if (ri.verifySignature())
+ _context.blocklist().add(_aliceIP);
+ throw new RIException("Refuses tunnels: " + h, REASON_BANNED);
+ }
+
String smtu = ra.getOption(UDPAddress.PROP_MTU);
int mtu = 0;
try {