From 0f7f901c8742583995f911cf75744c935bc31bf9 Mon Sep 17 00:00:00 2001 From: Xiao Ma Date: Wed, 17 Jan 2024 23:02:21 +0900 Subject: [PATCH] Parse destination and source mac address of ARP packet. This can be used in the integration test to assert if an ARP packet captured on the tap interface is broadcast or unicast request. Bug: 315076572 Test: atest NetworkStaticLibTests Change-Id: I52c0b18bf3fd2b64727912e54c045a8e8405d2f6 --- .../com/android/net/module/util/arp/ArpPacket.java | 12 +++++++++--- .../com/android/net/module/util/ArpPacketTest.java | 6 ++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/staticlibs/device/com/android/net/module/util/arp/ArpPacket.java b/staticlibs/device/com/android/net/module/util/arp/ArpPacket.java index dab9694b25..bf447d3d1b 100644 --- a/staticlibs/device/com/android/net/module/util/arp/ArpPacket.java +++ b/staticlibs/device/com/android/net/module/util/arp/ArpPacket.java @@ -45,14 +45,18 @@ import java.nio.ByteBuffer; public class ArpPacket { private static final String TAG = "ArpPacket"; + public final MacAddress destination; + public final MacAddress source; public final short opCode; public final Inet4Address senderIp; public final Inet4Address targetIp; public final MacAddress senderHwAddress; public final MacAddress targetHwAddress; - ArpPacket(short opCode, MacAddress senderHwAddress, Inet4Address senderIp, - MacAddress targetHwAddress, Inet4Address targetIp) { + ArpPacket(MacAddress destination, MacAddress source, short opCode, MacAddress senderHwAddress, + Inet4Address senderIp, MacAddress targetHwAddress, Inet4Address targetIp) { + this.destination = destination; + this.source = source; this.opCode = opCode; this.senderHwAddress = senderHwAddress; this.senderIp = senderIp; @@ -145,7 +149,9 @@ public class ArpPacket { buffer.get(targetHwAddress); buffer.get(targetIp); - return new ArpPacket(opCode, MacAddress.fromBytes(senderHwAddress), + return new ArpPacket(MacAddress.fromBytes(l2dst), + MacAddress.fromBytes(l2src), opCode, + MacAddress.fromBytes(senderHwAddress), (Inet4Address) InetAddress.getByAddress(senderIp), MacAddress.fromBytes(targetHwAddress), (Inet4Address) InetAddress.getByAddress(targetIp)); diff --git a/staticlibs/tests/unit/src/com/android/net/module/util/ArpPacketTest.java b/staticlibs/tests/unit/src/com/android/net/module/util/ArpPacketTest.java index e25d554892..29e84c99ee 100644 --- a/staticlibs/tests/unit/src/com/android/net/module/util/ArpPacketTest.java +++ b/staticlibs/tests/unit/src/com/android/net/module/util/ArpPacketTest.java @@ -50,6 +50,8 @@ public final class ArpPacketTest { 0x00, 0x1a, 0x11, 0x22, 0x33, 0x33 }; private static final byte[] TEST_TARGET_MAC_ADDR = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + private static final MacAddress TEST_DESTINATION_MAC = MacAddress.fromBytes(ETHER_BROADCAST); + private static final MacAddress TEST_SOURCE_MAC = MacAddress.fromBytes(TEST_SENDER_MAC_ADDR); private static final byte[] TEST_ARP_PROBE = new byte[] { // dst mac address (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, @@ -163,6 +165,8 @@ public final class ArpPacketTest { @Test public void testParseArpProbePacket() throws Exception { final ArpPacket packet = ArpPacket.parseArpPacket(TEST_ARP_PROBE, TEST_ARP_PROBE.length); + assertEquals(packet.destination, TEST_DESTINATION_MAC); + assertEquals(packet.source, TEST_SOURCE_MAC); assertEquals(packet.opCode, ARP_REQUEST); assertEquals(packet.senderHwAddress, MacAddress.fromBytes(TEST_SENDER_MAC_ADDR)); assertEquals(packet.targetHwAddress, MacAddress.fromBytes(TEST_TARGET_MAC_ADDR)); @@ -174,6 +178,8 @@ public final class ArpPacketTest { public void testParseArpAnnouncePacket() throws Exception { final ArpPacket packet = ArpPacket.parseArpPacket(TEST_ARP_ANNOUNCE, TEST_ARP_ANNOUNCE.length); + assertEquals(packet.destination, TEST_DESTINATION_MAC); + assertEquals(packet.source, TEST_SOURCE_MAC); assertEquals(packet.opCode, ARP_REQUEST); assertEquals(packet.senderHwAddress, MacAddress.fromBytes(TEST_SENDER_MAC_ADDR)); assertEquals(packet.targetHwAddress, MacAddress.fromBytes(TEST_TARGET_MAC_ADDR));