Merge "Stop prefix discovery if an RA prefix arrives in DISCOVERING" into rvc-dev

This commit is contained in:
Lorenzo Colitti
2020-04-20 14:29:29 +00:00
committed by Android (Google) Code Review
2 changed files with 24 additions and 6 deletions

View File

@@ -195,6 +195,9 @@ public class Nat464Xlat extends BaseNetworkObserver {
} catch (ClassCastException | IllegalArgumentException | NullPointerException e) { } catch (ClassCastException | IllegalArgumentException | NullPointerException e) {
Slog.e(TAG, "Invalid IPv6 address " + addrStr); Slog.e(TAG, "Invalid IPv6 address " + addrStr);
} }
if (mPrefixDiscoveryRunning && !isPrefixDiscoveryNeeded()) {
stopPrefixDiscovery();
}
} }
/** /**
@@ -221,12 +224,11 @@ public class Nat464Xlat extends BaseNetworkObserver {
if (isPrefixDiscoveryNeeded()) { if (isPrefixDiscoveryNeeded()) {
if (!mPrefixDiscoveryRunning) { if (!mPrefixDiscoveryRunning) {
startPrefixDiscovery(); startPrefixDiscovery();
} else {
// Prefix discovery is already running. Nothing to do.
mState = State.DISCOVERING;
} }
mState = State.DISCOVERING;
} else { } else {
stopPrefixDiscovery(); // Enters IDLE state. stopPrefixDiscovery();
mState = State.IDLE;
} }
} }
@@ -287,7 +289,6 @@ public class Nat464Xlat extends BaseNetworkObserver {
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
Slog.e(TAG, "Error starting prefix discovery on netId " + getNetId() + ": " + e); Slog.e(TAG, "Error starting prefix discovery on netId " + getNetId() + ": " + e);
} }
mState = State.DISCOVERING;
mPrefixDiscoveryRunning = true; mPrefixDiscoveryRunning = true;
} }
@@ -297,7 +298,6 @@ public class Nat464Xlat extends BaseNetworkObserver {
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
Slog.e(TAG, "Error stopping prefix discovery on netId " + getNetId() + ": " + e); Slog.e(TAG, "Error stopping prefix discovery on netId " + getNetId() + ": " + e);
} }
mState = State.IDLE;
mPrefixDiscoveryRunning = false; mPrefixDiscoveryRunning = false;
} }
@@ -330,6 +330,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
case IDLE: case IDLE:
if (isPrefixDiscoveryNeeded()) { if (isPrefixDiscoveryNeeded()) {
startPrefixDiscovery(); // Enters DISCOVERING state. startPrefixDiscovery(); // Enters DISCOVERING state.
mState = State.DISCOVERING;
} else if (requiresClat(mNetwork)) { } else if (requiresClat(mNetwork)) {
start(); // Enters STARTING state. start(); // Enters STARTING state.
} }
@@ -344,6 +345,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
if (!requiresClat(mNetwork)) { if (!requiresClat(mNetwork)) {
// IPv4 address added. Go back to IDLE state. // IPv4 address added. Go back to IDLE state.
stopPrefixDiscovery(); stopPrefixDiscovery();
mState = State.IDLE;
return; return;
} }
break; break;

View File

@@ -6228,6 +6228,22 @@ public class ConnectivityServiceTest {
inOrder.verify(mMockNetd).clatdStop(iface); inOrder.verify(mMockNetd).clatdStop(iface);
inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId); inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId);
// If the RA prefix appears while DNS discovery is in progress, discovery is stopped and
// clatd is started with the prefix from the RA.
lp.setNat64Prefix(pref64FromRa);
mCellNetworkAgent.sendLinkProperties(lp);
expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromRa);
inOrder.verify(mMockNetd).clatdStart(iface, pref64FromRa.toString());
inOrder.verify(mMockDnsResolver).stopPrefix64Discovery(netId);
// Withdraw the RA prefix so we can test the case where an RA prefix appears after DNS
// discovery has succeeded.
lp.setNat64Prefix(null);
mCellNetworkAgent.sendLinkProperties(lp);
expectNat64PrefixChange(callback, mCellNetworkAgent, null);
inOrder.verify(mMockNetd).clatdStop(iface);
inOrder.verify(mMockDnsResolver).startPrefix64Discovery(netId);
mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */, mService.mNetdEventCallback.onNat64PrefixEvent(netId, true /* added */,
pref64FromDnsStr, 96); pref64FromDnsStr, 96);
expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromDns); expectNat64PrefixChange(callback, mCellNetworkAgent, pref64FromDns);