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.