From b4d3557c17b49ea1f424a306b64cbb82d0272986 Mon Sep 17 00:00:00 2001 From: Tomas Kunovsky Date: Thu, 4 Feb 2021 19:45:02 +0100 Subject: [PATCH] More tests for ipv6 defragmentation --- .../main/java/org/pcap4j/util/IpV6Helper.java | 6 +- .../org/pcap4j/test/util/IpV6HelperTest.java | 57 +++++++++++++++++-- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/pcap4j-core/src/main/java/org/pcap4j/util/IpV6Helper.java b/pcap4j-core/src/main/java/org/pcap4j/util/IpV6Helper.java index f31e3abc..1ba32e9f 100644 --- a/pcap4j-core/src/main/java/org/pcap4j/util/IpV6Helper.java +++ b/pcap4j-core/src/main/java/org/pcap4j/util/IpV6Helper.java @@ -89,11 +89,7 @@ public static IpV6Packet defragment(List list) { System.arraycopy(rawPayload, 0, defragmentedPayload, destPos, rawPayload.length); destPos += rawPayload.length; } - } catch (NullPointerException e) { - throw new IllegalArgumentException("Can't defragment: " + list, e); - } catch (ArrayStoreException e) { - throw new IllegalArgumentException("Can't defragment: " + list, e); - } catch (IndexOutOfBoundsException e) { + } catch (Throwable e) { throw new IllegalArgumentException("Can't defragment: " + list, e); } diff --git a/pcap4j-packettest/src/test/java/org/pcap4j/test/util/IpV6HelperTest.java b/pcap4j-packettest/src/test/java/org/pcap4j/test/util/IpV6HelperTest.java index f6f88fe7..6653e37c 100644 --- a/pcap4j-packettest/src/test/java/org/pcap4j/test/util/IpV6HelperTest.java +++ b/pcap4j-packettest/src/test/java/org/pcap4j/test/util/IpV6HelperTest.java @@ -8,6 +8,7 @@ package org.pcap4j.test.util; import static org.junit.Assert.*; + import java.io.EOFException; import java.net.Inet6Address; import java.net.InetAddress; @@ -32,6 +33,12 @@ public class IpV6HelperTest { + IpV6HelperTest.class.getSimpleName() + ".pcap"); + enum ExtHeader { + DESTINATION, + ROUTING, + NO_HEADER + }; + private EthernetPacket getPacket(boolean fragmented) throws UnknownHostException { UnknownPacket.Builder unknownb = new UnknownPacket.Builder(); unknownb.rawData(new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}); @@ -109,6 +116,37 @@ private Packet addExtRoutingHeader(Packet packet, boolean isFragmented) return packetb.build(); } + private Packet addExtDestinationHeader(Packet packet, boolean isFragmented) + throws IllegalRawDataException, UnknownHostException { + IpV6ExtDestinationOptionsPacket.Builder ipV6ExtDestinationOptionsPacketb = + new IpV6ExtDestinationOptionsPacket.Builder(); + ipV6ExtDestinationOptionsPacketb + .nextHeader(isFragmented ? IpNumber.IPV6_FRAG : IpNumber.UDP) + .correctLengthAtBuild(true) + .options( + new ArrayList( + Arrays.asList( + new IpV6ExtOptionsPacket.IpV6Option[] { + new IpV6PadNOption.Builder() + .correctLengthAtBuild(true) + .data(new byte[] {0, 0, 0, 0}) + .build() + }))) + .payloadBuilder( + isFragmented + ? packet.get(IpV6ExtFragmentPacket.class).getBuilder() + : packet.get(UdpPacket.class).getBuilder()); + + Packet.Builder packetb = packet.getBuilder(); + packetb + .get(IpV6Packet.Builder.class) + .correctLengthAtBuild(true) + .payloadBuilder(ipV6ExtDestinationOptionsPacketb) + .nextHeader(IpNumber.IPV6_ROUTE); + + return packetb.build(); + } + @Test(expected = IllegalArgumentException.class) public void twoNoFragmentedPackets() throws UnknownHostException { List ipV6Packets = new ArrayList(); @@ -126,10 +164,12 @@ public void oneNoFragmentedPacket() throws UnknownHostException { IpV6Helper.defragment(ipV6Packets); } - private void testDefragment(boolean routingHeader) throws Exception { + private void testDefragment(ExtHeader extHeader) throws Exception { EthernetPacket expectedPacket; - if (routingHeader) { + if (extHeader == ExtHeader.ROUTING) { expectedPacket = (EthernetPacket) addExtRoutingHeader(getPacket(false), false); + } else if (extHeader == ExtHeader.DESTINATION) { + expectedPacket = (EthernetPacket) addExtDestinationHeader(getPacket(false), false); } else { expectedPacket = getPacket(false); } @@ -141,8 +181,10 @@ private void testDefragment(boolean routingHeader) throws Exception { while (true) { try { Packet packet; - if (routingHeader) { + if (extHeader == ExtHeader.ROUTING) { packet = addExtRoutingHeader(handle.getNextPacketEx(), true); + } else if (extHeader == ExtHeader.DESTINATION) { + packet = addExtDestinationHeader(handle.getNextPacketEx(), true); } else { packet = handle.getNextPacketEx(); } @@ -171,11 +213,16 @@ private void testDefragment(boolean routingHeader) throws Exception { @Test public void testDefragmentWithRoutingHeader() throws Exception { - testDefragment(true); + testDefragment(ExtHeader.ROUTING); } @Test public void testDefragmentWithoutExtHeaders() throws Exception { - testDefragment(false); + testDefragment(ExtHeader.NO_HEADER); + } + + @Test + public void testDefragmentWithDestinationExtHeaders() throws Exception { + testDefragment(ExtHeader.DESTINATION); } }