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

Commit b8eaac8c authored by Xiao Ma's avatar Xiao Ma
Browse files

Use fine-grained enums to represent MAC_ADDRESS_CHANGED failure.

Currently as long as the neighbor is reachable but the default gateway's
mac address has changed, NUD_MAC_ADDRESS_CHANGED will be used as the
event type of neighbor loss. However, in fact we don't know the cause of
neighbor's mac changes, e.g. it happened after roaming or after confirm
or orgnaic probes. Replace NUD_MAC_ADDRESS_CHANGED with new constants.

Bug: 162944199
Test: atest NetworkStackTests NetworkStackIntegrationTests
Change-Id: Ica7f87051ef9e0718e5bda54c33d492729382e78
parent 10ab4c90
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -410,7 +410,8 @@ public class IpReachabilityMonitor {
                    + " to: " + event.macAddr;
            mLog.w(logMsg);
            mCallback.notifyLost(event.ip, logMsg);
            logNudFailed(event, NudEventType.NUD_MAC_ADDRESS_CHANGED);
            logNudFailed(event,
                    getMacAddressChangedEventType(isFromProbe(), isNudFailureDueToRoam()));
            return;
        }
        maybeRestoreNeighborParameters();
@@ -645,6 +646,19 @@ public class IpReachabilityMonitor {
                        : NudEventType.NUD_CONFIRM_FAILED;
    }

    /**
     * Returns the NUD failure event type code due to neighbor's MAC address has changed
     * corresponding to the given conditions.
     */
    private static NudEventType getMacAddressChangedEventType(boolean isFromProbe,
            boolean isDueToRoam) {
        return isFromProbe
                ? isDueToRoam
                        ? NudEventType.NUD_POST_ROAMING_MAC_ADDRESS_CHANGED
                        : NudEventType.NUD_CONFIRM_MAC_ADDRESS_CHANGED
                : NudEventType.NUD_ORGANIC_MAC_ADDRESS_CHANGED;
    }

    /**
     * Log NUD failure metrics with new Westworld APIs while the function using mMetricsLog API
     * still sends the legacy metrics, @see #logNudFailed.
+41 −15
Original line number Diff line number Diff line
@@ -37,11 +37,13 @@ import android.stats.connectivity.IpType.IPV6
import android.stats.connectivity.NudEventType
import android.stats.connectivity.NudEventType.NUD_CONFIRM_FAILED
import android.stats.connectivity.NudEventType.NUD_CONFIRM_FAILED_CRITICAL
import android.stats.connectivity.NudEventType.NUD_MAC_ADDRESS_CHANGED
import android.stats.connectivity.NudEventType.NUD_CONFIRM_MAC_ADDRESS_CHANGED
import android.stats.connectivity.NudEventType.NUD_POST_ROAMING_FAILED
import android.stats.connectivity.NudEventType.NUD_POST_ROAMING_FAILED_CRITICAL
import android.stats.connectivity.NudEventType.NUD_POST_ROAMING_MAC_ADDRESS_CHANGED
import android.stats.connectivity.NudEventType.NUD_ORGANIC_FAILED
import android.stats.connectivity.NudEventType.NUD_ORGANIC_FAILED_CRITICAL
import android.stats.connectivity.NudEventType.NUD_ORGANIC_MAC_ADDRESS_CHANGED
import android.stats.connectivity.NudNeighborType
import android.stats.connectivity.NudNeighborType.NUD_NEIGHBOR_BOTH
import android.stats.connectivity.NudNeighborType.NUD_NEIGHBOR_DNS
@@ -329,10 +331,9 @@ class IpReachabilityMonitorTest {
        verifyNudFailureMetrics(eventType, ipType, lostNeighborType)
    }

    private fun runNeighborReachableButMacAddrChangedTest(
    private fun prepareNeighborReachableButMacAddrChangedTest(
        newLp: LinkProperties,
        neighbor: InetAddress,
        ipType: IpType
        neighbor: InetAddress
    ) {
        doReturn(true).`when`(dependencies).isFeatureEnabled(anyObject(),
                eq(IP_REACHABILITY_MCAST_RESOLICIT_VERSION), anyBoolean())
@@ -343,13 +344,6 @@ class IpReachabilityMonitorTest {
                "001122334455" /* oldMac */))
        handlerThread.waitForIdle(TEST_TIMEOUT_MS)
        verify(callback, never()).notifyLost(eq(neighbor), anyString())

        reachabilityMonitor.probeAll(true /* dueToRoam */)

        neighborMonitor.enqueuePacket(makeNewNeighMessage(neighbor, NUD_REACHABLE,
                "1122334455aa" /* newMac */))
        verify(callback, timeout(TEST_TIMEOUT_MS)).notifyLost(eq(neighbor), anyString())
        verifyNudFailureMetrics(NUD_MAC_ADDRESS_CHANGED, ipType, NUD_NEIGHBOR_GATEWAY)
    }

    @Test
@@ -548,13 +542,45 @@ class IpReachabilityMonitorTest {
        verifyNudFailureMetrics(NUD_CONFIRM_FAILED_CRITICAL, IPV6, NUD_NEIGHBOR_GATEWAY)
    }

    private fun verifyNudMacAddrChangedType(
        neighbor: InetAddress,
        eventType: NudEventType,
        ipType: IpType
    ) {
        neighborMonitor.enqueuePacket(makeNewNeighMessage(neighbor, NUD_REACHABLE,
                "1122334455aa" /* newMac */))
        verify(callback, timeout(TEST_TIMEOUT_MS)).notifyLost(eq(neighbor), anyString())
        verifyNudFailureMetrics(eventType, ipType, NUD_NEIGHBOR_GATEWAY)
    }

    @Test
    fun testNudProbeFailedMetrics_defaultIPv6GatewayMacAddrChanged() {
        runNeighborReachableButMacAddrChangedTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY, IPV6)
    fun testNudProbeFailedMetrics_defaultIPv6GatewayMacAddrChangedAfterRoaming() {
        prepareNeighborReachableButMacAddrChangedTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY)

        reachabilityMonitor.probeAll(true /* dueToRoam */)
        verifyNudMacAddrChangedType(TEST_IPV6_GATEWAY, NUD_POST_ROAMING_MAC_ADDRESS_CHANGED, IPV6)
    }

    @Test
    fun testNudProbeFailedMetrics_defaultIPv4GatewayMacAddrChanged() {
        runNeighborReachableButMacAddrChangedTest(TEST_LINK_PROPERTIES, TEST_IPV4_GATEWAY, IPV4)
    fun testNudProbeFailedMetrics_defaultIPv4GatewayMacAddrChangedAfterRoaming() {
        prepareNeighborReachableButMacAddrChangedTest(TEST_LINK_PROPERTIES, TEST_IPV4_GATEWAY)

        reachabilityMonitor.probeAll(true /* dueToRoam */)
        verifyNudMacAddrChangedType(TEST_IPV4_GATEWAY, NUD_POST_ROAMING_MAC_ADDRESS_CHANGED, IPV4)
    }

    @Test
    fun testNudProbeFailedMetrics_defaultIPv6GatewayMacAddrChangedAfterConfirm() {
        prepareNeighborReachableButMacAddrChangedTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY)

        reachabilityMonitor.probeAll(false /* dueToRoam */)
        verifyNudMacAddrChangedType(TEST_IPV6_GATEWAY, NUD_CONFIRM_MAC_ADDRESS_CHANGED, IPV6)
    }

    @Test
    fun testNudProbeFailedMetrics_defaultIPv6GatewayMacAddrChangedAfterOrganic() {
        prepareNeighborReachableButMacAddrChangedTest(TEST_LINK_PROPERTIES, TEST_IPV6_GATEWAY)

        verifyNudMacAddrChangedType(TEST_IPV6_GATEWAY, NUD_ORGANIC_MAC_ADDRESS_CHANGED, IPV6)
    }
}