diff options
author | 2018-09-06 11:10:03 +0900 | |
---|---|---|
committer | 2018-09-06 11:41:39 +0900 | |
commit | 5b43cea3c8185425fa43cb817ab26fecfd13708c (patch) | |
tree | a98c7cef8aea365230ca7ac8b6b3f54c17bc7288 | |
parent | 460a52947192febdf99f37cb761710a46c63fd46 (diff) |
Tighten up neighbor timers if IpReachabilityMonitor is in use
Currently the kernel sends 3 probes, 1000ms apart when a neighbor is
in NUD_PROBE state (either naturally or artificially moved to that
state when, for example, confirming network configuration following
an AP association/roam).
With this change the device sends 5 probes at 750ms apart. This
gives the network infrastructure a chance to respond to any of
5 probes instead of any of only 3, at a cost of increasing the total
probe time from 3s to 3.75s.
Future changes may read these values from settings (or from somewhere
else) so that experiments may be conducted or values adjusted based on
other information.
Test: as follows
- built, flashed, booted
- runtest frameworks-net passes
- examinaton of /proc settings on wifi shows updated values
- connected to a test network, disconnected the backhaul, ran
"adb shell dumpsys wifi ipclient confirm" while watching
"adb shell tcpdump -n -i wlan0 -l -vv arp", and observed
5 ARP who-has ("solicits") ~750ms apart.
Bug: 62476366
Bug: 62845299
Change-Id: Ib805531b08624805bb63703a5b338b9ff48171d4
-rw-r--r-- | services/net/java/android/net/ip/IpClient.java | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java index 3cdef1e73ae4..ccc092d3b0e7 100644 --- a/services/net/java/android/net/ip/IpClient.java +++ b/services/net/java/android/net/ip/IpClient.java @@ -1385,6 +1385,20 @@ public class IpClient extends StateMachine { private boolean startIpReachabilityMonitor() { try { + // TODO: Fetch these parameters from settings, and install a + // settings observer to watch for update and re-program these + // parameters (Q: is this level of dynamic updatability really + // necessary or does reading from settings at startup suffice?). + final int NUM_SOLICITS = 5; + final int INTER_SOLICIT_INTERVAL_MS = 750; + setNeighborParameters(mDependencies.getNetd(), mInterfaceName, + NUM_SOLICITS, INTER_SOLICIT_INTERVAL_MS); + } catch (Exception e) { + mLog.e("Failed to adjust neighbor parameters", e); + // Carry on using the system defaults (currently: 3, 1000); + } + + try { mIpReachabilityMonitor = new IpReachabilityMonitor( mContext, mInterfaceParams, @@ -1863,6 +1877,20 @@ public class IpClient extends StateMachine { } } + private static void setNeighborParameters( + INetd netd, String ifName, int num_solicits, int inter_solicit_interval_ms) + throws RemoteException, IllegalArgumentException { + Preconditions.checkNotNull(netd); + Preconditions.checkArgument(!TextUtils.isEmpty(ifName)); + Preconditions.checkArgument(num_solicits > 0); + Preconditions.checkArgument(inter_solicit_interval_ms > 0); + + for (int family : new Integer[]{INetd.IPV4, INetd.IPV6}) { + netd.setProcSysNet(family, INetd.NEIGH, ifName, "retrans_time_ms", Integer.toString(inter_solicit_interval_ms)); + netd.setProcSysNet(family, INetd.NEIGH, ifName, "ucast_solicit", Integer.toString(num_solicits)); + } + } + // TODO: extract out into CollectionUtils. static <T> boolean any(Iterable<T> coll, Predicate<T> fn) { for (T t : coll) { |