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.