Use ALLOC_XMIT_OPCODE in ApfV61Generator
This commit refactors the ApfV61Generator to utilize the
ALLOC_XMIT_OPCODE for buffer allocation.
Before:
03-20 20:58:57.975 17833 17847 I ApfFilterTest: all feature on, program size: 4648
After:
03-20 21:14:08.987 18721 18735 I ApfFilterTest: all feature on, program size: 4597
Test: TH
Change-Id: I80ab159280f7ae79f3feb14c4e81d9633ee50a22
diff --git a/src/android/net/apf/ApfV61GeneratorBase.java b/src/android/net/apf/ApfV61GeneratorBase.java
index e5859e7..416b69f 100644
--- a/src/android/net/apf/ApfV61GeneratorBase.java
+++ b/src/android/net/apf/ApfV61GeneratorBase.java
@@ -199,6 +199,12 @@
return self();
}
+ @Override
+ public Type addAllocate(int size) {
+ final int imm = (int) Math.ceil(Math.max(0, size - 266) / 8.0);
+ return append(new Instruction(Opcodes.ALLOC_XMIT, Rbit1).addUnsigned(imm));
+ }
+
/**
* 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
diff --git a/src/android/net/apf/ApfV6Generator.java b/src/android/net/apf/ApfV6Generator.java
index ccd5490..cb95fbe 100644
--- a/src/android/net/apf/ApfV6Generator.java
+++ b/src/android/net/apf/ApfV6Generator.java
@@ -15,6 +15,7 @@
*/
package android.net.apf;
+import static android.net.apf.BaseApfGenerator.Rbit.Rbit1;
import static android.net.apf.BaseApfGenerator.Register.R0;
import android.annotation.NonNull;
@@ -252,4 +253,10 @@
}
return self();
}
+
+ @Override
+ public ApfV6Generator addAllocate(int size) {
+ // Rbit1 means the extra be16 immediate is present
+ return append(new Instruction(ExtendedOpcodes.ALLOCATE, Rbit1).addU16(size));
+ }
}
diff --git a/src/android/net/apf/ApfV6GeneratorBase.java b/src/android/net/apf/ApfV6GeneratorBase.java
index 658e4d1..00f05c0 100644
--- a/src/android/net/apf/ApfV6GeneratorBase.java
+++ b/src/android/net/apf/ApfV6GeneratorBase.java
@@ -114,10 +114,7 @@
*
* @param size the buffer length to be allocated.
*/
- public final Type addAllocate(int size) {
- // Rbit1 means the extra be16 immediate is present
- return append(new Instruction(ExtendedOpcodes.ALLOCATE, Rbit1).addU16(size));
- }
+ public abstract Type addAllocate(int size);
/**
* Add an instruction to the beginning of the program to reserve the empty data region.