diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/android/net/ip/IpClientLinkObserver.java | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/android/net/ip/IpClientLinkObserver.java b/src/android/net/ip/IpClientLinkObserver.java index dc58e7b..ee7f18b 100644 --- a/src/android/net/ip/IpClientLinkObserver.java +++ b/src/android/net/ip/IpClientLinkObserver.java @@ -238,6 +238,7 @@ public class IpClientLinkObserver implements NetworkObserver { // while interfaceDnsServerInfo() is being called, we'll end up with no DNS servers in // mLinkProperties, as desired. mDnsServerRepository = new DnsServerRepository(mConfig.minRdnssLifetime); + mNetlinkMonitor.clearAlarms(); mLinkProperties.clear(); mLinkProperties.setInterfaceName(mInterfaceName); } @@ -281,18 +282,27 @@ public class IpClientLinkObserver implements NetworkObserver { mIfindex = ifindex; } + void clearAlarms() { + cancelPref64Alarm(); + } + private final AlarmManager.OnAlarmListener mExpirePref64Alarm = () -> { + // Ignore the alarm if cancelPref64Alarm has already been called. + // // TODO: in the rare case where the alarm fires and posts the lambda to the handler // thread while we are processing an RA that changes the lifetime of the same prefix, // this code will run anyway even if the alarm is rescheduled or cancelled. If the - // lifetime in the RA is zero this doesn't matter (we just harmlessly cancel the alarm - // one extra time) but if the lifetime is nonzero then the prefix will be added and - // immediately removed by this code. + // lifetime in the RA is zero this code will correctly do nothing, but if the lifetime + // is nonzero then the prefix will be added and immediately removed by this code. + if (mNat64PrefixExpiry == 0) return; updatePref64(mShim.getNat64Prefix(mLinkProperties), mNat64PrefixExpiry, mNat64PrefixExpiry); }; private void cancelPref64Alarm() { + // Clear the expiry in case the alarm just fired and has not been processed yet. + if (mNat64PrefixExpiry == 0) return; + mNat64PrefixExpiry = 0; mAlarmManager.cancel(mExpirePref64Alarm); } @@ -342,7 +352,6 @@ public class IpClientLinkObserver implements NetworkObserver { schedulePref64Alarm(); } else { mShim.setNat64Prefix(mLinkProperties, null); - mNat64PrefixExpiry = 0; cancelPref64Alarm(); } |