apf2java: check-in problematic packet (new logic with clamping)

From a test network with the following periodic RA:
  33 33 00 00 00 01 28 C6 8E 23 67 2C 86 DD 60 05 4C 6B 00 60 3A FF FE 80 00 00 00 00 00 00 2A C6 8E FF FE 23 67 2C FF 02 00 00 00 00 00 00 00 00 00 00 00 00 00 01 86 00 0A CD 40 C0 1B 58 00 00 00 00 00 00 00 00 01 01 28 C6 8E 23 67 2C 05 01 00 00 00 00 05 DC 03 04 40 C0 FF FF FF FF FF FF FF FF 00 00 00 00 24 01 FA 00 04 80 F0 00 00 00 00 00 00 00 00 00 19 03 00 00 00 00 1B 58 24 01 FA 00 04 80 F0 00 00 00 00 00 00 00 00 01 07 01 00 00 00 09 27 C0

We see:
  IpClient.wlan0 APF dump:
    Capabilities: ApfCapabilities{version: 4, maxSize: 4096, format: 1}
    Receive thread: RUNNING
    Multicast: DROP
    Minimum RDNSS lifetime: 120
    IPv4 address: 192.168.1.236
    Program updates: 3
    Last program length 588, installed 13s ago, lifetime 1166s
    Denylisted Ethertypes: 88a2 88a4 88b8 88cd 88e1 88e3
    RA filters:
      RA fe80::2ac6:8eff:fe23:672c -> fe80::7c90:46ff:febc:7008 7000s 2401:fa00:480:f000::/64 4294967295s/4294967295s DNS 7000s 2401:fa00:480:f000::1

Test: N/A
Signed-off-by: Maciej Żenczykowski <[email protected]>
Change-Id: I440297350a5c6b780e21fafd5bc083448ab49b6f
diff --git a/apf2java/apf2java.out b/apf2java/apf2java.out
index ff7ba96..596a8d4 100644
--- a/apf2java/apf2java.out
+++ b/apf2java/apf2java.out
@@ -1,134 +1,171 @@
     @Test
     public void testFullApfV4ProgramGeneration() throws IllegalInstructionException {
         ApfV4Generator gen = new ApfV4Generator(APF_VERSION_4);
-        gen.addLoadImmediate(R1, -4);
+        gen.addLoadImmediate(R1, -8);
         gen.addLoadData(R0, 0);
         gen.addAdd(1);
         gen.addStoreData(R0, 0);
         gen.addLoad16(R0, 12);
-        gen.addLoadImmediate(R1, -108);
-        gen.addJumpIfR0LessThan(0x600, "LABEL_345");
-        gen.addLoadImmediate(R1, -112);
-        gen.addJumpIfR0Equals(0x88a2, "LABEL_345");
-        gen.addJumpIfR0Equals(0x88a4, "LABEL_345");
-        gen.addJumpIfR0Equals(0x88b8, "LABEL_345");
-        gen.addJumpIfR0Equals(0x88cd, "LABEL_345");
-        gen.addJumpIfR0Equals(0x88e1, "LABEL_345");
-        gen.addJumpIfR0Equals(0x88e3, "LABEL_345");
-        gen.addJumpIfR0NotEquals(0x806, "LABEL_115");
+        gen.addLoadImmediate(R1, -120);
+        gen.addJumpIfR0LessThan(0x600, "LABEL_582");
+        gen.addLoadImmediate(R1, -124);
+        gen.addJumpIfR0Equals(0x88a2, "LABEL_582");
+        gen.addJumpIfR0Equals(0x88a4, "LABEL_582");
+        gen.addJumpIfR0Equals(0x88b8, "LABEL_582");
+        gen.addJumpIfR0Equals(0x88cd, "LABEL_582");
+        gen.addJumpIfR0Equals(0x88e1, "LABEL_582");
+        gen.addJumpIfR0Equals(0x88e3, "LABEL_582");
+        gen.addJumpIfR0NotEquals(0x806, "LABEL_122");
         gen.addLoadImmediate(R0, 14);
-        gen.addLoadImmediate(R1, -36);
-        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("000108000604"), "LABEL_339");
+        gen.addLoadImmediate(R1, -152);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("000108000604"), "LABEL_582");
         gen.addLoad16(R0, 20);
-        gen.addJumpIfR0Equals(0x1, "LABEL_100");
-        gen.addLoadImmediate(R1, -40);
-        gen.addJumpIfR0NotEquals(0x2, "LABEL_339");
+        gen.addJumpIfR0Equals(0x1, "LABEL_104");
+        gen.addLoadImmediate(R1, -156);
+        gen.addJumpIfR0NotEquals(0x2, "LABEL_582");
         gen.addLoad32(R0, 28);
-        gen.addLoadImmediate(R1, -116);
-        gen.addJumpIfR0Equals(0x0, "LABEL_345");
+        gen.addLoadImmediate(R1, -128);
+        gen.addJumpIfR0Equals(0x0, "LABEL_582");
         gen.addLoadImmediate(R0, 0);
-        gen.addLoadImmediate(R1, -44);
-        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_339");
+        gen.addLoadImmediate(R1, -56);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_576");
 
-        gen.defineLabel("LABEL_100");
+        gen.defineLabel("LABEL_104");
         gen.addLoadImmediate(R0, 38);
-        gen.addLoadImmediate(R1, -68);
-        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("c0a801be"), "LABEL_345");
-        gen.addLoadImmediate(R1, -8);
-        gen.addJump("LABEL_339");
+        gen.addLoadImmediate(R1, -80);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("c0a801ec"), "LABEL_582");
+        gen.addLoadImmediate(R1, -20);
+        gen.addJump("LABEL_576");
 
-        gen.defineLabel("LABEL_115");
+        gen.defineLabel("LABEL_122");
         gen.addLoad16(R0, 12);
-        gen.addJumpIfR0NotEquals(0x800, "LABEL_263");
+        gen.addJumpIfR0NotEquals(0x800, "LABEL_249");
         gen.addLoad8(R0, 23);
-        gen.addJumpIfR0NotEquals(0x11, "LABEL_157");
+        gen.addJumpIfR0NotEquals(0x11, "LABEL_165");
         gen.addLoad16(R0, 20);
-        gen.addJumpIfR0AnyBitsSet(0x1fff, "LABEL_157");
+        gen.addJumpIfR0AnyBitsSet(0x1fff, "LABEL_165");
         gen.addLoadFromMemory(R1, 13);
         gen.addLoad16Indexed(R0, 16);
-        gen.addJumpIfR0NotEquals(0x44, "LABEL_157");
+        gen.addJumpIfR0NotEquals(0x44, "LABEL_165");
         gen.addLoadImmediate(R0, 50);
         gen.addAddR1();
-        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ea42226789c0"), "LABEL_157");
-        gen.addLoadImmediate(R1, -12);
-        gen.addJump("LABEL_339");
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("7e9046bc7008"), "LABEL_165");
+        gen.addLoadImmediate(R1, -24);
+        gen.addJump("LABEL_576");
 
-        gen.defineLabel("LABEL_157");
+        gen.defineLabel("LABEL_165");
         gen.addLoad8(R0, 30);
         gen.addAnd(240);
-        gen.addLoadImmediate(R1, -84);
-        gen.addJumpIfR0Equals(0xe0, "LABEL_345");
-        gen.addLoadImmediate(R1, -76);
-        gen.addLoad32(R0, 30);
-        gen.addJumpIfR0Equals(0xffffffff, "LABEL_345");
-        gen.addLoadImmediate(R1, -80);
-        gen.addJumpIfR0Equals(0xc0a801ff, "LABEL_345");
-        gen.addLoad8(R0, 23);
-        gen.addJumpIfR0NotEquals(0x11, "LABEL_243");
-        gen.addLoadImmediate(R0, 26);
-        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("6b7a1f1fc0a801be"), "LABEL_243");
-        gen.addLoadFromMemory(R0, 13);
-        gen.addAdd(8);
-        gen.addSwap();
-        gen.addLoad16(R0, 16);
-        gen.addNeg(R1);
-        gen.addAddR1();
-        gen.addJumpIfR0NotEquals(0x1, "LABEL_243");
-        gen.addLoadFromMemory(R0, 13);
-        gen.addAdd(14);
-        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("1194ceca"), "LABEL_243");
-        gen.addAdd(8);
-        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ff"), "LABEL_243");
-        gen.addLoadImmediate(R1, -128);
-        gen.addJump("LABEL_345");
-
-        gen.defineLabel("LABEL_243");
-        gen.addLoadImmediate(R1, -24);
-        gen.addLoadImmediate(R0, 0);
-        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_339");
-        gen.addLoadImmediate(R1, -72);
-        gen.addJump("LABEL_345");
-        gen.addLoadImmediate(R1, -16);
-        gen.addJump("LABEL_339");
-
-        gen.defineLabel("LABEL_263");
-        gen.addJumpIfR0Equals(0x86dd, "LABEL_284");
-        gen.addLoadImmediate(R0, 0);
-        gen.addLoadImmediate(R1, -48);
-        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_339");
-        gen.addLoadImmediate(R1, -56);
-        gen.addJump("LABEL_345");
-
-        gen.defineLabel("LABEL_284");
-        gen.addLoad8(R0, 20);
-        gen.addJumpIfR0Equals(0x0, "LABEL_339");
-        gen.addJumpIfR0Equals(0x3a, "LABEL_303");
-        gen.addLoadImmediate(R1, -104);
-        gen.addLoad8(R0, 38);
-        gen.addJumpIfR0Equals(0xff, "LABEL_345");
-        gen.addLoadImmediate(R1, -32);
-        gen.addJump("LABEL_339");
-
-        gen.defineLabel("LABEL_303");
-        gen.addLoad8(R0, 54);
+        gen.addLoadImmediate(R1, -96);
+        gen.addJumpIfR0Equals(0xe0, "LABEL_582");
         gen.addLoadImmediate(R1, -88);
-        gen.addJumpIfR0Equals(0x85, "LABEL_345");
-        gen.addJumpIfR0NotEquals(0x88, "LABEL_337");
-        gen.addLoadImmediate(R0, 38);
-        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ff0200000000000000000000000000"), "LABEL_337");
+        gen.addLoad32(R0, 30);
+        gen.addJumpIfR0Equals(0xffffffff, "LABEL_582");
         gen.addLoadImmediate(R1, -92);
-        gen.addJump("LABEL_345");
+        gen.addJumpIfR0Equals(0xc0a801ff, "LABEL_582");
+        gen.addLoad8(R0, 23);
+        gen.addJumpIfR0NotEquals(0x6, "LABEL_225");
+        gen.addLoad16(R0, 20);
+        gen.addJumpIfR0AnyBitsSet(0x1fff, "LABEL_225");
+        gen.addLoadFromMemory(R1, 13);
+        gen.addLoad16Indexed(R0, 16);
+        gen.addJumpIfR0NotEquals(0x7, "LABEL_225");
+        gen.addLoadImmediate(R1, -148);
+        gen.addJump("LABEL_582");
 
-        gen.defineLabel("LABEL_337");
+        gen.defineLabel("LABEL_225");
+        gen.addLoadImmediate(R1, -36);
+        gen.addLoadImmediate(R0, 0);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_576");
+        gen.addLoadImmediate(R1, -84);
+        gen.addJump("LABEL_582");
         gen.addLoadImmediate(R1, -28);
+        gen.addJump("LABEL_576");
 
-        gen.defineLabel("LABEL_339");
+        gen.defineLabel("LABEL_249");
+        gen.addJumpIfR0Equals(0x86dd, "LABEL_273");
+        gen.addLoadImmediate(R0, 0);
+        gen.addLoadImmediate(R1, -60);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_576");
+        gen.addLoadImmediate(R1, -68);
+        gen.addJump("LABEL_582");
+
+        gen.defineLabel("LABEL_273");
+        gen.addLoad8(R0, 20);
+        gen.addJumpIfR0Equals(0x0, "LABEL_576");
+        gen.addJumpIfR0Equals(0x3a, "LABEL_297");
+        gen.addLoadImmediate(R1, -116);
+        gen.addLoad8(R0, 38);
+        gen.addJumpIfR0Equals(0xff, "LABEL_582");
+        gen.addLoadImmediate(R1, -44);
+        gen.addJump("LABEL_576");
+
+        gen.defineLabel("LABEL_297");
+        gen.addLoad8(R0, 54);
+        gen.addLoadImmediate(R1, -100);
+        gen.addJumpIfR0Equals(0x85, "LABEL_582");
+        gen.addJumpIfR0NotEquals(0x88, "LABEL_333");
+        gen.addLoadImmediate(R0, 38);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ff0200000000000000000000000000"), "LABEL_333");
+        gen.addLoadImmediate(R1, -104);
+        gen.addJump("LABEL_582");
+
+        gen.defineLabel("LABEL_333");
+        gen.addLoadFromMemory(R0, 14);
+        gen.addJumpIfR0NotEquals(0x96, "LABEL_574");
+        gen.addLoadFromMemory(R0, 15);
+        gen.addJumpIfR0GreaterThan(0x48e, "LABEL_574");
+        gen.addLoadImmediate(R0, 0);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("7e9046bc700828c68e23672c86dd60"), "LABEL_574");
+        gen.addLoadImmediate(R0, 18);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("00603afffe800000000000002ac68efffe23672c"), "LABEL_574");
+        gen.addLoadImmediate(R0, 54);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("8600"), "LABEL_574");
+        gen.addLoadImmediate(R0, 58);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("40c0"), "LABEL_574");
+        gen.addLoad16(R0, 60);
+        gen.addJumpIfR0Equals(0x0, "LABEL_574");
+        gen.addJumpIfR0LessThan(0xb4, "LABEL_421");
+        gen.addJumpIfR0LessThan(0x91e, "LABEL_574");
+        gen.addJumpIfR0GreaterThan(0x1b58, "LABEL_574");
+
+        gen.defineLabel("LABEL_421");
+        gen.addLoadImmediate(R0, 62);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("0000000000000000010128c68e23672c05010000000005dc030440c0"), "LABEL_574");
+        gen.addLoad32(R0, 90);
+        gen.addJumpIfR0Equals(0x0, "LABEL_574");
+        gen.addJumpIfR0LessThan(0xb4, "LABEL_480");
+        gen.addJumpIfR0LessThan(0x2aaaaaab, "LABEL_574");
+        gen.addJumpIfR0GreaterThan(0x7fffffff, "LABEL_574");
+
+        gen.defineLabel("LABEL_480");
+        gen.addLoad32(R0, 94);
+        gen.addJumpIfR0LessThan(0x2aaaaaab, "LABEL_574");
+        gen.addJumpIfR0GreaterThan(0x7fffffff, "LABEL_574");
+        gen.addLoadImmediate(R0, 98);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("000000002401fa000480f000000000000000000019030000"), "LABEL_574");
+        gen.addLoad32(R0, 122);
+        gen.addJumpIfR0Equals(0x0, "LABEL_574");
+        gen.addJumpIfR0LessThan(0x78, "LABEL_547");
+        gen.addJumpIfR0LessThan(0x91e, "LABEL_574");
+        gen.addJumpIfR0GreaterThan(0x1b58, "LABEL_574");
+
+        gen.defineLabel("LABEL_547");
+        gen.addLoadImmediate(R0, 126);
+        gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("2401fa000480f00000000000000000010701"), "LABEL_574");
+        gen.addLoadImmediate(R1, -72);
+        gen.addJump("LABEL_582");
+
+        gen.defineLabel("LABEL_574");
+        gen.addLoadImmediate(R1, -40);
+
+        gen.defineLabel("LABEL_576");
         gen.addLoadData(R0, 0);
         gen.addAdd(1);
         gen.addStoreData(R0, 0);
         gen.addJump(PASS_LABEL);
 
-        gen.defineLabel("LABEL_345");
+        gen.defineLabel("LABEL_582");
         gen.addLoadData(R0, 0);
         gen.addAdd(1);
         gen.addStoreData(R0, 0);
@@ -136,6 +173,6 @@
 
         byte[] program = gen.generate();
         final String programString = toHexString(program).toLowerCase();
-        final String referenceProgramHexString = "6bfcb03a01b8120c6b9494014a06006b907c014388a27c013e88a47c013988b87c013488cd7c012f88e17c012a88e384003f08066a0e6bdca40110000600010800060412147a1c016bd884010400021a1c6b8c7c01010000686bd4a2ef06ffffffffffff6a266bbca2ea04c0a801be6bf872e0120c84008d08000a17821e1112149c00171fffab0d2a108210446a3239a20406ea42226789c06bf472b60a1e52f06bac7ab3e06bb41a1e7e000000a6ffffffff6bb07e0000009bc0a801ff0a178230116a1aa223086b7a1f1fc0a801beaa0d3a08aa221210ab2139821501aa0d3a0ea20a041194ceca3a08a20401ff6b8072666be868a25406ffffffffffff6bb872566bf0724c7c001086dd686bd0a23b06ffffffffffff6bc8723d0a147a32007a0b3a6b980a267a2eff6be072240a366ba87a23858218886a26a2040fff02000000000000000000000000006ba472086be4b03a01b87206b03a01b87201";
+        final String referenceProgramHexString = "6bf8b03a01b8120c6b8894023706006b847c023088a27c022b88a47c022688b87c022188cd7c021c88e17c021788e384004608066a0e6dff68a40202000600010800060412147a1f016dff648401f500021a1c6b807c01ec0000686bc8a401d80006ffffffffffff6a266bb0a401d10004c0a801ec6bec7401c6120c84007808000a17821f1112149c00181fffab0d2a108211446a3239a205067e9046bc70086be874019b0a1e52f06ba07c019600e06ba81a1e7e00000189ffffffff6ba47e0000017ec0a801ff0a1782140612149c000d1fffab0d2a108206076dff6c7401656bdc68a401510006ffffffffffff6bac7401526be47401477c001386dd686bc4a401340006ffffffffffff6bbc7401350a147c012800007a0e3a6b8c0a267c012200ff6bd47401170a366b9c7c011400858218886a26a2040fff02000000000000000000000000006b9872f9aa0e82ec96aa0f8c00e5048e68a2d20f7e9046bc700828c68e23672c86dd606a12a2b91400603afffe800000000000002ac68efffe23672c6a36a2b20286006a3aa2ab0240c0123c7aa600920ab494009e091e8c00991b586a3ea2781c0000000000000000010128c68e23672c05010000000005dc030440c01a5a7a73009212b496000000672aaaaaab8e0000005e7fffffff1a5e96000000532aaaaaab8e0000004a7fffffff6a62a22d18000000002401fa000480f0000000000000000000190300001a7a7a2800920a78940020091e8c001b1b586a7ea204122401fa000480f000000000000000000107016bb872086bd8b03a01b87206b03a01b87201";
         assertEquals(referenceProgramHexString, programString);
     }