Reset R0 after generateIPv6MdnsFilter() to avoid clobbering
This commit ensures the correct value of R0 is maintained in the IPv6
filter logic by resetting it to IPV6_NEXT_HEADER_OFFSET after the
generateIPv6MdnsFilter() call. This prevents unintended modification of
R0, which could disrupt subsequent operations.
Test: TH
Change-Id: I2c7bd65d539d157e01fcf4ff7c5ea31ca177da56
diff --git a/src/android/net/apf/ApfFilter.java b/src/android/net/apf/ApfFilter.java
index 676fc38..6d6368d 100644
--- a/src/android/net/apf/ApfFilter.java
+++ b/src/android/net/apf/ApfFilter.java
@@ -2658,6 +2658,7 @@
if (enableMdns6Offload()) {
generateIPv6MdnsFilter((ApfV6GeneratorBase<?>) gen, labelCheckMdnsQueryPayload);
+ gen.addLoad8intoR0(IPV6_NEXT_HEADER_OFFSET);
}
// Drop multicast if the multicast filter is enabled.
diff --git a/tests/unit/src/android/net/apf/ApfFilterTest.kt b/tests/unit/src/android/net/apf/ApfFilterTest.kt
index 9b44915..e7e3fa0 100644
--- a/tests/unit/src/android/net/apf/ApfFilterTest.kt
+++ b/tests/unit/src/android/net/apf/ApfFilterTest.kt
@@ -58,6 +58,7 @@
import android.net.apf.ApfCounterTracker.Counter.DROPPED_IPV6_NS_REPLIED_NON_DAD
import android.net.apf.ApfCounterTracker.Counter.DROPPED_MDNS
import android.net.apf.ApfCounterTracker.Counter.DROPPED_MDNS_REPLIED
+import android.net.apf.ApfCounterTracker.Counter.DROPPED_RA
import android.net.apf.ApfCounterTracker.Counter.PASSED_ARP_BROADCAST_REPLY
import android.net.apf.ApfCounterTracker.Counter.PASSED_ARP_REQUEST
import android.net.apf.ApfCounterTracker.Counter.PASSED_ARP_UNICAST_REPLY
@@ -4635,6 +4636,83 @@
PASSED_MDNS
)
}
+ @IgnoreUpTo(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+ @Test
+ fun testRaFilterWorksWhenMdnsOffloadEnabled() {
+ var (apfFilter, program) = getApfWithMdnsOffloadEnabled()
+ // ###[ Ethernet ]###
+ // dst = 33:33:00:00:00:01
+ // src = f4:34:f0:64:52:fe
+ // type = IPv6
+ // ###[ IPv6 ]###
+ // version = 6
+ // tc = 0
+ // fl = 68608
+ // plen = 80
+ // nh = ICMPv6
+ // hlim = 255
+ // src = fe80::1cb6:b5bc:353b:7cfd
+ // dst = ff02::1
+ // ###[ ICMPv6 Neighbor Discovery - Router Advertisement ]###
+ // type = Router Advertisement
+ // code = 0
+ // cksum = 0xfab
+ // chlim = 0
+ // M = 0
+ // O = 0
+ // H = 0
+ // prf = Medium (default)
+ // P = 0
+ // res = 0
+ // routerlifetime= 0
+ // reachabletime= 0
+ // retranstimer= 0
+ // ###[ ICMPv6 Neighbor Discovery Option - Prefix Information ]###
+ // type = 3
+ // len = 4
+ // prefixlen = 64
+ // L = 1
+ // A = 1
+ // R = 0
+ // res1 = 0
+ // validlifetime= 0x708
+ // preferredlifetime= 0x708
+ // res2 = 0x0
+ // prefix = fdee:d0c4:7546:5344::
+ // ###[ ICMPv6 Neighbor Discovery Option - Route Information Option ]###
+ // type = 24
+ // len = 2
+ // plen = 64
+ // res1 = 0
+ // prf = Medium (default)
+ // res2 = 0
+ // rtlifetime= 1800
+ // prefix = fd0c:8be6:43ee::
+ // ###[ ICMPv6 Neighbor Discovery Option - Expanded Flags Option ]###
+ // type = 26
+ // len = 1
+ // res = 140737488355328
+ // ###[ ICMPv6 Neighbor Discovery Option - Source Link-Layer Address ]###
+ // type = 1
+ // len = 1
+ // lladdr = f4:34:f0:64:52:fe
+ val ra = """
+ 333300000001f434f06452fe86dd60010c0000503afffe800000000000001cb6b5bc353b7cfdff0
+ 2000000000000000000000000000186000fab000000000000000000000000030440c00000070800
+ 00070800000000fdeed0c47546534400000000000000001802400000000708fd0c8be643ee00001
+ a018000000000000101f434f06452fe
+ """.replace("\\s+".toRegex(), "").trim()
+ val raBytes = HexDump.hexStringToByteArray(ra)
+ Os.write(writerSocket, raBytes, 0, raBytes.size)
+
+ program = apfTestHelpers.consumeInstalledProgram(apfController, installCnt = 1)
+ apfTestHelpers.verifyProgramRun(
+ apfFilter.mApfVersionSupported,
+ program,
+ raBytes,
+ DROPPED_RA
+ )
+ }
@IgnoreUpTo(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
@Test