Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 632092bb authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Stop prefix discovery if an RA prefix arrives in DISCOVERING

Currently, if a prefix is learned from an RA while prefix
discovery is running, clatd will be correctly started, but
prefix discovery will be stopped.

In order to fix this, make it possible to call
stopPrefixDiscovery without transitioning to IDLE state (which
is obviously necessary in this case), by moving the assignment of
the next state from that method to its callers. For consistency,
do the same for startPrefixDiscovery.

Bug: 150648313
Test: new test coverage
Change-Id: I3803fa3d9806848b331c35ee8bac256934bd1f21
parent 0a9b1b6a
Loading
Loading
Loading
Loading
+8 −6
Original line number Original line Diff line number Diff line
@@ -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;
+16 −0
Original line number Original line Diff line number Diff line
@@ -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);