DO NOT MERGE: DscpPolicy: remove post-T dependencies from test

The DscpPolicyTest needs to be merged into CTS13 R2, so it cannot
always use APIs that were introduced after the T cutoff.

Run the test when the new APIs are available, but skip it otherwise as
the feature is known to be broken unless the device is using a newer
connectivity module.

DO NOT MERGE: should not be used for U+ tests.

Test: atest DscpPolicyTest
Bug: 243891394
Bug: 243120975
Change-Id: I86eeb7a008c6e299fdf7cb709844bc336f09bdfa
diff --git a/tests/cts/net/src/android/net/cts/DscpPolicyTest.kt b/tests/cts/net/src/android/net/cts/DscpPolicyTest.kt
index faf6943..ad7e536 100644
--- a/tests/cts/net/src/android/net/cts/DscpPolicyTest.kt
+++ b/tests/cts/net/src/android/net/cts/DscpPolicyTest.kt
@@ -43,9 +43,10 @@
 import android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED
 import android.net.NetworkCapabilities.TRANSPORT_TEST
 import android.net.NetworkRequest
+import android.net.RouteInfo
 import android.net.TestNetworkInterface
 import android.net.TestNetworkManager
-import android.net.RouteInfo
+import android.os.Build
 import android.os.HandlerThread
 import android.os.SystemClock
 import android.platform.test.annotations.AppModeFull
@@ -161,8 +162,27 @@
 
             // Only statically configure the IPv4 address; for IPv6, use the SLAAC generated
             // address.
-            iface = tnm.createTapInterface(true /* disableIpv6ProvisioningDelay */,
-                    arrayOf(LinkAddress(LOCAL_IPV4_ADDRESS, IP4_PREFIX_LEN)))
+            iface = try {
+                // createTapInterface(LinkAddress[]) only exists on T devices using a recent
+                // connectivity module
+                val addresses = arrayOf(LinkAddress(LOCAL_IPV4_ADDRESS, IP4_PREFIX_LEN))
+                TestNetworkManager::class.java.getMethod("createTapInterface",
+                        Boolean::class.javaPrimitiveType, Array<LinkAddress>::class.java)
+                    .invoke(tnm,
+                        true /* disableIpv6ProvisioningDelay */, addresses) as TestNetworkInterface
+            } catch (e: NoSuchMethodException) {
+                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) throw e
+                // The DSCP policy feature does not work on T without an updated module, because
+                // without change ID Ib40d4575455f34a8970eca8751b590319e2ee1ad which fixes checksum
+                // calculation for non-TUN interfaces, the device would send packets with wrong
+                // checksums.
+                // The feature only worked on TUN interfaces because they have an empty L2 header,
+                // and this is what the old test tested, but is not actually useful.
+                // Here this is a T device using an old module, so just skip the test.
+                assumeTrue("Known-broken DscpPolicy implementation used by this device", false);
+                // Unreachable, but necessary for this branch to return Nothing
+                throw e
+            }
             assertNotNull(iface)
         }
 
@@ -185,6 +205,10 @@
         if (!kernelIsAtLeast(5, 15)) {
             return;
         }
+        if (!this::iface.isInitialized) {
+            // Test was skipped or crashed in setUp
+            return
+        }
         raResponder.stop()
         arpResponder.stop()