diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/android/net/ip/IpClient.java | 39 | ||||
-rw-r--r-- | src/com/android/server/util/NetworkStackConstants.java | 2 |
2 files changed, 38 insertions, 3 deletions
diff --git a/src/android/net/ip/IpClient.java b/src/android/net/ip/IpClient.java index 799184e..bff30b6 100644 --- a/src/android/net/ip/IpClient.java +++ b/src/android/net/ip/IpClient.java @@ -19,6 +19,7 @@ package android.net.ip; import static android.net.RouteInfo.RTN_UNICAST; import static android.net.shared.IpConfigurationParcelableUtil.toStableParcelable; +import static com.android.server.util.NetworkStackConstants.ETHER_MTU; import static com.android.server.util.PermissionUtil.checkNetworkStackCallingPermission; import android.annotation.NonNull; @@ -48,6 +49,7 @@ import android.os.ConditionVariable; import android.os.IBinder; import android.os.Message; import android.os.RemoteException; +import android.os.ServiceSpecificException; import android.os.SystemClock; import android.text.TextUtils; import android.util.LocalLog; @@ -69,6 +71,8 @@ import com.android.server.NetworkStackService.NetworkStackServiceManager; import java.io.FileDescriptor; import java.io.PrintWriter; import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; import java.util.Collection; import java.util.List; import java.util.Objects; @@ -380,6 +384,8 @@ public class IpClient extends StateMachine { private final ConditionVariable mApfDataSnapshotComplete = new ConditionVariable(); public static class Dependencies { + private static final String TAG = "IpClient.Dependencies"; + /** * Get interface parameters for the specified interface. */ @@ -388,6 +394,18 @@ public class IpClient extends StateMachine { } /** + * Get the current MTU for the specified interface. + */ + public int getInterfaceMtu(String ifname) { + try { + return NetworkInterface.getByName(ifname).getMTU(); + } catch (SocketException e) { + Log.e(TAG, "unexpected failure to get the interface MTU"); + return ETHER_MTU; + } + } + + /** * Get a INetd connector. */ public INetd getNetd(Context context) { @@ -850,10 +868,14 @@ public class IpClient extends StateMachine { return shouldLog; } - private void logError(String fmt, Object... args) { + private void logError(String fmt, Throwable e, Object... args) { final String msg = "ERROR " + String.format(fmt, args); - Log.e(mTag, msg); - mLog.log(msg); + Log.e(mTag, msg, e); + mLog.e(msg, e); + } + + private void logError(String fmt, Object... args) { + logError(fmt, null, args); } // This needs to be called with care to ensure that our LinkProperties @@ -1351,6 +1373,17 @@ public class IpClient extends StateMachine { // There's no DHCPv4 for which to wait; proceed to stopped. deferMessage(obtainMessage(CMD_JUMP_STOPPING_TO_STOPPED)); } + + // Restore the interface MTU to initial value if it has changed. + final int mtu = mDependencies.getInterfaceMtu(mInterfaceName); + try { + if (mtu != mInterfaceParams.defaultMtu) { + mNetd.interfaceSetMtu(mInterfaceName, mInterfaceParams.defaultMtu); + } + } catch (RemoteException | ServiceSpecificException e) { + logError("Couldn't reset MTU from " + + mtu + " to " + mInterfaceParams.defaultMtu + ": " + e); + } } @Override diff --git a/src/com/android/server/util/NetworkStackConstants.java b/src/com/android/server/util/NetworkStackConstants.java index 804765e..3174a9b 100644 --- a/src/com/android/server/util/NetworkStackConstants.java +++ b/src/com/android/server/util/NetworkStackConstants.java @@ -54,6 +54,7 @@ public final class NetworkStackConstants { public static final int ETHER_TYPE_IPV4 = 0x0800; public static final int ETHER_TYPE_IPV6 = 0x86dd; public static final int ETHER_HEADER_LEN = 14; + public static final int ETHER_MTU = 1500; /** * ARP constants. @@ -97,6 +98,7 @@ public final class NetworkStackConstants { public static final int IPV6_PROTOCOL_OFFSET = 6; public static final int IPV6_SRC_ADDR_OFFSET = 8; public static final int IPV6_DST_ADDR_OFFSET = 24; + public static final int IPV6_MIN_MTU = 1280; /** * ICMPv6 constants. |