Add addJumpIfPktAtR0ContainDnsQ() API for multiple qTypes

This commit adds a new API, addJumpIfPktAtR0ContainDnsQ(), to the APF
generators to support matching a single qname with multiple qTypes. This
enhancement prepares the codebase for APFv6.1, which will introduce new
opcodes to improve code density by matching one qname with multiple
qTypes (e.g., SRV/TXT and A/AAAA records sharing the same qname in
mDNS). This commit focuses on creating the API structure; a follow-up
commit will update the Apf61GeneratorBase to utilize the new opcodes
with this API.

Test: TH
Change-Id: I29ff68030651f5a55e10d7ba365f9a595683aa77
diff --git a/src/android/net/apf/ApfFilter.java b/src/android/net/apf/ApfFilter.java
index 8aaed16..56dec67 100644
--- a/src/android/net/apf/ApfFilter.java
+++ b/src/android/net/apf/ApfFilter.java
@@ -3364,12 +3364,10 @@
             final short offloadIPv6Mdns = gen.getUniqueLabel();
 
             for (MdnsOffloadRule.Matcher matcher : rule.mMatchers) {
-                for (int qtype : matcher.mQtypes) {
-                    try {
-                        gen.addJumpIfPktAtR0ContainDnsQ(matcher.mQnames, qtype, ruleMatch);
-                    } catch (IllegalArgumentException e) {
-                        Log.e(TAG, "Failed to generate mDNS offload filter for rule: " + rule, e);
-                    }
+                try {
+                    gen.addJumpIfPktAtR0ContainDnsQ(matcher.mQnames, matcher.mQtypes, ruleMatch);
+                } catch (IllegalArgumentException e) {
+                    Log.e(TAG, "Failed to generate mDNS offload filter for rule: " + rule, e);
                 }
             }
 
diff --git a/src/android/net/apf/ApfV61GeneratorBase.java b/src/android/net/apf/ApfV61GeneratorBase.java
index c92f543..2319c34 100644
--- a/src/android/net/apf/ApfV61GeneratorBase.java
+++ b/src/android/net/apf/ApfV61GeneratorBase.java
@@ -229,4 +229,12 @@
         final short tgt = getUniqueLabel();
         return addJumpIfOneOf(R0, values, tgt).addCountAndDrop(cnt).defineLabel(tgt);
     }
+
+    @Override
+    public final Type addJumpIfPktAtR0ContainDnsQ(byte[] qnames, int[] qtypes, short tgt) {
+        for (int qtype : qtypes) {
+            addJumpIfPktAtR0ContainDnsQ(qnames, qtype, tgt);
+        }
+        return self();
+    }
 }
diff --git a/src/android/net/apf/ApfV6Generator.java b/src/android/net/apf/ApfV6Generator.java
index 500410b..be155b7 100644
--- a/src/android/net/apf/ApfV6Generator.java
+++ b/src/android/net/apf/ApfV6Generator.java
@@ -244,4 +244,12 @@
         final short tgt = getUniqueLabel();
         return addJumpIfOneOf(R0, values, tgt).addCountAndDrop(cnt).defineLabel(tgt);
     }
+
+    @Override
+    public ApfV6Generator addJumpIfPktAtR0ContainDnsQ(byte[] qnames, int[] qtypes, short tgt) {
+        for (int qtype : qtypes) {
+            addJumpIfPktAtR0ContainDnsQ(qnames, qtype, tgt);
+        }
+        return self();
+    }
 }
diff --git a/src/android/net/apf/ApfV6GeneratorBase.java b/src/android/net/apf/ApfV6GeneratorBase.java
index 498d3b3..ccbe8cb 100644
--- a/src/android/net/apf/ApfV6GeneratorBase.java
+++ b/src/android/net/apf/ApfV6GeneratorBase.java
@@ -383,6 +383,15 @@
     /**
      * Appends a conditional jump instruction to the program: Jumps to {@code tgt} if the UDP
      * payload's DNS questions contain the QNAMEs specified in {@code qnames} and qtype
+     * equals any of {@code qtypes}. Examines the payload starting at the offset in R0.
+     * Drops packets if packets are corrupted.
+     */
+    public abstract Type addJumpIfPktAtR0ContainDnsQ(@NonNull byte[] qnames, @NonNull int[] qtypes,
+            short tgt);
+
+    /**
+     * Appends a conditional jump instruction to the program: Jumps to {@code tgt} if the UDP
+     * payload's DNS questions contain the QNAMEs specified in {@code qnames} and qtype
      * equals {@code qtype}. Examines the payload starting at the offset in R0.
      * R = 1 means check for "contain".
      * Drops packets if packets are corrupted.