Add PacketFilter utilities for DNS testing

Add packet filters that are useful for filtering / testing DNS queries
and ARP requests.

This change is a prerequisite for tests verifying DNS and validation
metrics.

Test: tests using these utilities
Bug: 160617623
Bug: 160656765
Change-Id: I4216f4ec60d1a427f60fad6eb8017e36b082665f
diff --git a/staticlibs/hostdevice/com/android/testutils/PacketFilter.kt b/staticlibs/hostdevice/com/android/testutils/PacketFilter.kt
index cd8d6a5..7c615d0 100644
--- a/staticlibs/hostdevice/com/android/testutils/PacketFilter.kt
+++ b/staticlibs/hostdevice/com/android/testutils/PacketFilter.kt
@@ -16,19 +16,28 @@
 
 package com.android.testutils
 
+import java.net.Inet4Address
 import java.util.function.Predicate
 
 const val ETHER_TYPE_OFFSET = 12
 const val ETHER_HEADER_LENGTH = 14
 const val IPV4_PROTOCOL_OFFSET = ETHER_HEADER_LENGTH + 9
 const val IPV4_CHECKSUM_OFFSET = ETHER_HEADER_LENGTH + 10
+const val IPV4_DST_OFFSET = ETHER_HEADER_LENGTH + 16
 const val IPV4_HEADER_LENGTH = 20
 const val IPV4_UDP_OFFSET = ETHER_HEADER_LENGTH + IPV4_HEADER_LENGTH
-const val BOOTP_OFFSET = IPV4_UDP_OFFSET + 8
+const val IPV4_UDP_SRCPORT_OFFSET = IPV4_UDP_OFFSET
+const val IPV4_UDP_DSTPORT_OFFSET = IPV4_UDP_OFFSET + 2
+const val UDP_HEADER_LENGTH = 8
+const val BOOTP_OFFSET = IPV4_UDP_OFFSET + UDP_HEADER_LENGTH
 const val BOOTP_TID_OFFSET = BOOTP_OFFSET + 4
 const val BOOTP_CLIENT_MAC_OFFSET = BOOTP_OFFSET + 28
 const val DHCP_OPTIONS_OFFSET = BOOTP_OFFSET + 240
 
+const val ARP_OPCODE_OFFSET = ETHER_HEADER_LENGTH + 6
+const val ARP_SENDER_MAC_OFFSET = ETHER_HEADER_LENGTH + 8
+const val ARP_TARGET_IPADDR_OFFSET = ETHER_HEADER_LENGTH + 24
+
 /**
  * A [Predicate] that matches a [ByteArray] if it contains the specified [bytes] at the specified
  * [offset].
@@ -48,12 +57,29 @@
 }
 
 /**
+ * A [Predicate] that matches ethernet-encapped packets sent to the specified IPv4 destination.
+ */
+class IPv4DstFilter(dst: Inet4Address) : Predicate<ByteArray> {
+    private val impl = OffsetFilter(IPV4_DST_OFFSET, *dst.address)
+    override fun test(t: ByteArray) = impl.test(t)
+}
+
+/**
+ * A [Predicate] that matches ethernet-encapped ARP requests.
+ */
+class ArpRequestFilter : Predicate<ByteArray> {
+    private val impl = OffsetFilter(ETHER_TYPE_OFFSET, 0x08, 0x06 /* ARP */)
+            .and(OffsetFilter(ARP_OPCODE_OFFSET, 0x00, 0x01 /* request */))
+    override fun test(t: ByteArray) = impl.test(t)
+}
+
+/**
  * A [Predicate] that matches ethernet-encapped DHCP packets sent from a DHCP client.
  */
 class DhcpClientPacketFilter : Predicate<ByteArray> {
     private val impl = IPv4UdpFilter()
-            .and(OffsetFilter(IPV4_UDP_OFFSET /* source port */, 0x00, 0x44 /* 68 */))
-            .and(OffsetFilter(IPV4_UDP_OFFSET + 2 /* dest port */, 0x00, 0x43 /* 67 */))
+            .and(OffsetFilter(IPV4_UDP_SRCPORT_OFFSET, 0x00, 0x44 /* 68 */))
+            .and(OffsetFilter(IPV4_UDP_DSTPORT_OFFSET, 0x00, 0x43 /* 67 */))
     override fun test(t: ByteArray) = impl.test(t)
 }