From d2f7b652827a86de2664f7f68f25578fbd0a4a9a Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 25 Oct 2016 13:39:33 +0000
Subject: [PATCH] SSU: Increase max IPv6 MTU (proposal #127)

---
 .../i2p/router/transport/udp/PacketBuilder.java  |  3 ++-
 .../net/i2p/router/transport/udp/PeerState.java  | 16 +++++++++++++---
 .../net/i2p/router/transport/udp/UDPSender.java  |  2 +-
 .../i2p/router/transport/udp/UDPTransport.java   |  2 +-
 4 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
index 0f7e0ac804..6c8e0195e0 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
@@ -551,7 +551,8 @@ class PacketBuilder {
         
         // the packet could have been built before the current mtu got lowered, so
         // compare to LARGE_MTU
-        if (off + (ipHeaderSize + UDP_HEADER_SIZE) > PeerState.LARGE_MTU) {
+        int maxMTU = peer.isIPv6() ? PeerState.MAX_IPV6_MTU : PeerState.LARGE_MTU;
+        if (off + (ipHeaderSize + UDP_HEADER_SIZE) > maxMTU) {
             _log.error("Size is " + off + " for " + packet +
                        " data size " + dataSize +
                        " pkt size " + (off + (ipHeaderSize + UDP_HEADER_SIZE)) +
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java
index dcaa7527bc..626774d3e8 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java
@@ -253,7 +253,9 @@ class PeerState {
      */
     private static final int MAX_SEND_MSGS_PENDING = 128;
 
-    /*
+    /**
+     * IPv4 Min MTU
+     *
      * 596 gives us 588 IP byes, 568 UDP bytes, and with an SSU data message, 
      * 522 fragment bytes, which is enough to send a tunnel data message in 2 
      * packets. A tunnel data message sent over the wire is 1044 bytes, meaning 
@@ -277,10 +279,12 @@ class PeerState {
      * IPv6/UDP header is 48 bytes, so we want MTU % 16 == 0.
      */
     public static final int MIN_IPV6_MTU = 1280;
-    public static final int MAX_IPV6_MTU = 1472;  // TODO 1488
+    public static final int MAX_IPV6_MTU = 1488;
     private static final int DEFAULT_MTU = MIN_MTU;
 
-    /* 
+    /**
+     * IPv4 Max MTU
+     *
      * based on measurements, 1350 fits nearly all reasonably small I2NP messages
      * (larger I2NP messages may be up to 1900B-4500B, which isn't going to fit
      * into a live network MTU anyway)
@@ -301,6 +305,12 @@ class PeerState {
      */
     public static final int LARGE_MTU = 1484;
     
+    /**
+     *  Max of IPv4 and IPv6 max MTUs
+     *  @since 0.9.28
+     */
+    public static final int MAX_MTU = Math.max(LARGE_MTU, MAX_IPV6_MTU);
+    
     private static final int MIN_RTO = 100 + ACKSender.ACK_FREQUENCY;
     private static final int INIT_RTO = 3*1000;
     public static final int INIT_RTT = INIT_RTO / 2;
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPSender.java b/router/java/src/net/i2p/router/transport/udp/UDPSender.java
index 0eef2361ae..dc6078da5c 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPSender.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPSender.java
@@ -189,7 +189,7 @@ class UDPSender {
     public void add(UDPPacket packet) {
         if (packet == null || !_keepRunning) return;
         int psz = packet.getPacket().getLength();
-        if (psz > PeerState.LARGE_MTU) {
+        if (psz > PeerState.MAX_MTU) {
             _log.error("Dropping large UDP packet " + psz + " bytes: " + packet);
             return;
         }
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
index 162e64acd7..760e132ea6 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -2143,7 +2143,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                 mtu = _mtu;
             }
         }
-        if (mtu < PeerState.LARGE_MTU)
+        if (mtu != PeerState.LARGE_MTU)
             options.setProperty(UDPAddress.PROP_MTU, Integer.toString(mtu));
 
         if (directIncluded || introducersIncluded) {
-- 
GitLab