Use JBSMATCH opcode for improved code density.

This commit refactors the remaining code to utilize the JBSMATCH opcode,
enhancing code density and potentially reducing the size of the
generated APF programs.

After:
03-22 09:59:53.027  8310  8324 I ApfFilterTest: all feature on, program size: 4342

Test: TH
Change-Id: Id9e617edb489a8c608bdb15ff9abb0c536cdcbac
diff --git a/src/android/net/apf/ApfFilter.java b/src/android/net/apf/ApfFilter.java
index 57307c9..fdc1752 100644
--- a/src/android/net/apf/ApfFilter.java
+++ b/src/android/net/apf/ApfFilter.java
@@ -1812,8 +1812,8 @@
         }
 
         // Drop if not ARP IPv4.
-        gen.addLoadImmediate(R0, ARP_HEADER_OFFSET);
-        gen.addCountAndDropIfBytesAtR0NotEqual(ARP_IPV4_HEADER, DROPPED_ARP_NON_IPV4);
+        gen.addCountAndDropIfBytesAtOffsetNotEqual(ARP_HEADER_OFFSET, ARP_IPV4_HEADER,
+                DROPPED_ARP_NON_IPV4);
 
         final short checkArpRequest = gen.getUniqueLabel();
 
@@ -3590,11 +3590,13 @@
         //   pass
         // insert IPv6 filter to drop, pass, or fall off the end for ICMPv6 packets
 
-        gen.addLoadImmediate(R0, ETHER_SRC_ADDR_OFFSET);
         if (NetworkStackUtils.isAtLeast25Q2()) {
-            gen.addCountAndDropIfBytesAtR0Equal(mHardwareAddress, DROPPED_ETHER_OUR_SRC_MAC);
+            gen.addCountAndDropIfBytesAtOffsetEqual(ETHER_SRC_ADDR_OFFSET, mHardwareAddress,
+                    DROPPED_ETHER_OUR_SRC_MAC);
         } else {
-            gen.addCountAndPassIfBytesAtR0Equal(mHardwareAddress, PASSED_ETHER_OUR_SRC_MAC);
+            // TODO: we don't have test coverage for this line
+            gen.addCountAndPassIfBytesAtOffsetEqual(ETHER_SRC_ADDR_OFFSET, mHardwareAddress,
+                    PASSED_ETHER_OUR_SRC_MAC);
         }
 
         gen.addLoad16intoR0(ETH_ETHERTYPE_OFFSET);
@@ -3743,8 +3745,12 @@
         preloadedIPv6Address.add(IPV6_ADDR_ALL_NODES_MULTICAST.getAddress());
         preloadedIPv6Address.add(MDNS_IPV6_ADDR);
         preloadedIPv6Address.add(IPV6_ADDR_ANY.getAddress());
-        final int preloadDataSize =
-                preloadedIPv6Address.size() * 16 + preloadedMacAddress.size() * 6;
+        int preloadDataSize = preloadedIPv6Address.size() * 16 + preloadedMacAddress.size() * 6;
+
+        if (enableArpOffload()) {
+            preloadDataSize += FIXED_ARP_REPLY_HEADER.length;
+        }
+
         final byte[] preloadData = new byte[preloadDataSize];
         int offset = 0;
         for (byte[] addr : preloadedMacAddress) {
@@ -3755,6 +3761,12 @@
             System.arraycopy(addr, 0, preloadData, offset, 16);
             offset += 16;
         }
+        if (enableArpOffload()) {
+            System.arraycopy(FIXED_ARP_REPLY_HEADER, 0, preloadData, offset,
+                    FIXED_ARP_REPLY_HEADER.length);
+            offset += FIXED_ARP_REPLY_HEADER.length;
+        }
+
         if (preloadDataSize > 0) {
             gen.addPreloadData(preloadData);
         }