Add golden test for ApfGenerator on IPv4 WiFi network Automatically generated via: //hardware/google/apf/apf2java/apf2java.sh (which is an APF disassembly to java test bash/sed script). The apf byte code itself was extracted from a IPv4-only wifi network connected device running: google/oriole/oriole:14/UQ1A.231205.001/10959544:userdebug/dev-keys and converted from hex via the apf_disassembler. See: aosp/2922474 Bug: 320199061 Test: TH Change-Id: Iab8c42c2fce34120df862028e16cc9642d742a22
diff --git a/tests/unit/src/android/net/apf/ApfTest.java b/tests/unit/src/android/net/apf/ApfTest.java index 85071f7..eced574 100644 --- a/tests/unit/src/android/net/apf/ApfTest.java +++ b/tests/unit/src/android/net/apf/ApfTest.java
@@ -3407,7 +3407,7 @@ } @Test - public void testFullApfV4ProgramGeneration() throws IllegalInstructionException { + public void testFullApfV4ProgramGenerationIPV6() throws IllegalInstructionException { ApfV4Generator gen = new ApfV4Generator(APF_VERSION_4); gen.addLoadImmediate(R1, -4); gen.addLoadData(R0, 0); @@ -3558,4 +3558,125 @@ final String referenceProgramHexString = "6bfcb03a01b8120c6b949401e906006b907c01e288a27c01dd88a47c01d888b87c01d388cd7c01ce88e17c01c988e384004008066a0e6bdca401af000600010800060412147a1e016bd88401a300021a1c6b8c7c01a00000686bd4a4018c0006ffffffffffff1a266bc07c018900006bf874017e120c84005408000a17821f1112149c00181fffab0d2a108211446a3239a20506e212507c63456bf47401530a1e52f06bac7c014e00e06bb41a1e7e00000141ffffffff6be868a4012d0006ffffffffffff6bb874012e6bf07401237c001386dd686bd0a401100006ffffffffffff6bc87401110a147a0d3a6b980a267c010300ff6be072f90a366ba87af8858218886a26a2040fff02000000000000000000000000006ba472ddaa0e82d0a6aa0f8c00c9025468a2b60fe212507c6345648788fd6df086dd686a12a28b2600703afffe800000000000002a0079e10abc1539fe80000000000000e01250fffe7c634586006a3aa284024000123c94007d02546a3ea2700800000000000000006a4ea26704190500001a5294006002546a56a23b2020014860486000000000000000006464200148604860000000000000000000646a76a23204030440c01a7a94002b02541a7e94002402546c0082a21a04000000006c0086a204102a0079e10abc153900000000000000006bc472086be4b03a01b87206b03a01b87201"; assertEquals(referenceProgramHexString, programString); } + + @Test + public void testFullApfV4ProgramGenerationIPV4() throws IllegalInstructionException { + ApfV4Generator gen = new ApfV4Generator(APF_VERSION_4); + gen.addLoadImmediate(R1, -4); + gen.addLoadData(R0, 0); + gen.addAdd(1); + gen.addStoreData(R0, 0); + gen.addLoad16(R0, 12); + gen.addLoadImmediate(R1, -108); + gen.addJumpIfR0LessThan(0x600, "LABEL_283"); + gen.addLoadImmediate(R1, -112); + gen.addJumpIfR0Equals(0x88a2, "LABEL_283"); + gen.addJumpIfR0Equals(0x88a4, "LABEL_283"); + gen.addJumpIfR0Equals(0x88b8, "LABEL_283"); + gen.addJumpIfR0Equals(0x88cd, "LABEL_283"); + gen.addJumpIfR0Equals(0x88e1, "LABEL_283"); + gen.addJumpIfR0Equals(0x88e3, "LABEL_283"); + gen.addJumpIfR0NotEquals(0x806, "LABEL_109"); + gen.addLoadImmediate(R0, 14); + gen.addLoadImmediate(R1, -36); + gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("000108000604"), "LABEL_277"); + gen.addLoad16(R0, 20); + gen.addJumpIfR0Equals(0x1, "LABEL_94"); + gen.addLoadImmediate(R1, -40); + gen.addJumpIfR0NotEquals(0x2, "LABEL_277"); + gen.addLoad32(R0, 28); + gen.addLoadImmediate(R1, -116); + gen.addJumpIfR0Equals(0x0, "LABEL_283"); + gen.addLoadImmediate(R0, 0); + gen.addLoadImmediate(R1, -44); + gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_277"); + + gen.defineLabel("LABEL_94"); + gen.addLoadImmediate(R0, 38); + gen.addLoadImmediate(R1, -68); + gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("c0a801b3"), "LABEL_283"); + gen.addLoadImmediate(R1, -8); + gen.addJump("LABEL_277"); + + gen.defineLabel("LABEL_109"); + gen.addLoad16(R0, 12); + gen.addJumpIfR0NotEquals(0x800, "LABEL_204"); + gen.addLoad8(R0, 23); + gen.addJumpIfR0NotEquals(0x11, "LABEL_151"); + gen.addLoad16(R0, 20); + gen.addJumpIfR0AnyBitsSet(0x1fff, "LABEL_151"); + gen.addLoadFromMemory(R1, 13); + gen.addLoad16Indexed(R0, 16); + gen.addJumpIfR0NotEquals(0x44, "LABEL_151"); + gen.addLoadImmediate(R0, 50); + gen.addAddR1(); + gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("f683d58f832b"), "LABEL_151"); + gen.addLoadImmediate(R1, -12); + gen.addJump("LABEL_277"); + + gen.defineLabel("LABEL_151"); + gen.addLoad8(R0, 30); + gen.addAnd(240); + gen.addLoadImmediate(R1, -84); + gen.addJumpIfR0Equals(0xe0, "LABEL_283"); + gen.addLoadImmediate(R1, -76); + gen.addLoad32(R0, 30); + gen.addJumpIfR0Equals(0xffffffff, "LABEL_283"); + gen.addLoadImmediate(R1, -80); + gen.addJumpIfR0Equals(0xc0a801ff, "LABEL_283"); + gen.addLoadImmediate(R1, -24); + gen.addLoadImmediate(R0, 0); + gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_277"); + gen.addLoadImmediate(R1, -72); + gen.addJump("LABEL_283"); + gen.addLoadImmediate(R1, -16); + gen.addJump("LABEL_277"); + + gen.defineLabel("LABEL_204"); + gen.addJumpIfR0Equals(0x86dd, "LABEL_225"); + gen.addLoadImmediate(R0, 0); + gen.addLoadImmediate(R1, -48); + gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ffffffffffff"), "LABEL_277"); + gen.addLoadImmediate(R1, -56); + gen.addJump("LABEL_283"); + + gen.defineLabel("LABEL_225"); + gen.addLoad8(R0, 20); + gen.addJumpIfR0Equals(0x3a, "LABEL_241"); + gen.addLoadImmediate(R1, -104); + gen.addLoad8(R0, 38); + gen.addJumpIfR0Equals(0xff, "LABEL_283"); + gen.addLoadImmediate(R1, -32); + gen.addJump("LABEL_277"); + + gen.defineLabel("LABEL_241"); + gen.addLoad8(R0, 54); + gen.addLoadImmediate(R1, -88); + gen.addJumpIfR0Equals(0x85, "LABEL_283"); + gen.addJumpIfR0NotEquals(0x88, "LABEL_275"); + gen.addLoadImmediate(R0, 38); + gen.addJumpIfBytesAtR0NotEqual(hexStringToByteArray("ff0200000000000000000000000000"), "LABEL_275"); + gen.addLoadImmediate(R1, -92); + gen.addJump("LABEL_283"); + + gen.defineLabel("LABEL_275"); + gen.addLoadImmediate(R1, -28); + + gen.defineLabel("LABEL_277"); + gen.addLoadData(R0, 0); + gen.addAdd(1); + gen.addStoreData(R0, 0); + gen.addJump(PASS_LABEL); + + gen.defineLabel("LABEL_283"); + gen.addLoadData(R0, 0); + gen.addAdd(1); + gen.addStoreData(R0, 0); + gen.addJump(DROP_LABEL); + + byte[] program = gen.generate(); + final String programString = toHexString(program).toLowerCase(); + final String referenceProgramHexString = "6bfcb03a01b8120c6b9494010c06006b907c010588a27c010088a47c00fb88b87c00f688cd7c00f188e17c00ec88e384003908066a0e6bdca2d40600010800060412147a18016bd882ca021a1c6b8c7ac900686bd4a2b706ffffffffffff6a266bbca2b204c0a801b36bf872a8120c84005808000a17821e1112149c00171fffab0d2a108210446a3239a20406f683d58f832b6bf4727e0a1e52f06bac7a7be06bb41a1e7e0000006effffffff6bb07e00000063c0a801ff6be868a25106ffffffffffff6bb872536bf072497c001086dd686bd0a23806ffffffffffff6bc8723a0a147a0b3a6b980a267a2eff6be072240a366ba87a23858218886a26a2040fff02000000000000000000000000006ba472086be4b03a01b87206b03a01b87201"; + assertEquals(referenceProgramHexString, programString); + } } \ No newline at end of file