Configure MTU based on network MTU parameter

Add logic to obtain the mtu from the network PCO parameter and set it to kernel
when the mobile data connection is established. When there is no PCO mtu configured
from the network, the mtu size defined in the corresponding APN will be used. In case
no mtu size is defined for an APN used for data connection, the MCC/MNC based MTU
defined  in the framework overaly will be applied.

bug:17046179
Change-Id: I6465d4b8f2076aaa380ae3617fb3f24adbe136d4
This commit is contained in:
w19976
2014-08-05 15:18:11 -07:00
committed by Robert Greenwalt
parent eeb0c785b1
commit e714f1daa6
2 changed files with 24 additions and 1 deletions

View File

@@ -55,6 +55,10 @@ public final class LinkProperties implements Parcelable {
private ProxyInfo mHttpProxy; private ProxyInfo mHttpProxy;
private int mMtu; private int mMtu;
private static final int MIN_MTU = 68;
private static final int MIN_MTU_V6 = 1280;
private static final int MAX_MTU = 10000;
// Stores the properties of links that are "stacked" above this link. // Stores the properties of links that are "stacked" above this link.
// Indexed by interface name to allow modification and to prevent duplicates being added. // Indexed by interface name to allow modification and to prevent duplicates being added.
private Hashtable<String, LinkProperties> mStackedLinks = private Hashtable<String, LinkProperties> mStackedLinks =
@@ -995,4 +999,17 @@ public final class LinkProperties implements Parcelable {
return new LinkProperties[size]; return new LinkProperties[size];
} }
}; };
/**
* Check the valid MTU range based on IPv4 or IPv6.
* @hide
*/
public static boolean isValidMtu(int mtu, boolean ipv6) {
if (ipv6) {
if ((mtu >= MIN_MTU_V6 && mtu <= MAX_MTU)) return true;
} else {
if ((mtu >= MIN_MTU && mtu <= MAX_MTU)) return true;
}
return false;
}
} }

View File

@@ -1534,11 +1534,17 @@ public class ConnectivityService extends IConnectivityManager.Stub {
return; return;
} }
if (mtu < 68 || mtu > 10000) { if (LinkProperties.isValidMtu(mtu, newLp.hasGlobalIPv6Address())) {
loge("Unexpected mtu value: " + mtu + ", " + iface); loge("Unexpected mtu value: " + mtu + ", " + iface);
return; return;
} }
// Cannot set MTU without interface name
if (TextUtils.isEmpty(iface)) {
loge("Setting MTU size with null iface.");
return;
}
try { try {
if (VDBG) log("Setting MTU size: " + iface + ", " + mtu); if (VDBG) log("Setting MTU size: " + iface + ", " + mtu);
mNetd.setMtu(iface, mtu); mNetd.setMtu(iface, mtu);