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);
}