Skip to content

Commit

Permalink
More tests for ipv6 defragmentation
Browse files Browse the repository at this point in the history
  • Loading branch information
tkunovsky committed Feb 4, 2021
1 parent 38f5179 commit b4d3557
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 10 deletions.
6 changes: 1 addition & 5 deletions pcap4j-core/src/main/java/org/pcap4j/util/IpV6Helper.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,7 @@ public static IpV6Packet defragment(List<IpV6Packet> 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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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});
Expand Down Expand Up @@ -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<IpV6ExtOptionsPacket.IpV6Option>(
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<IpV6Packet> ipV6Packets = new ArrayList<IpV6Packet>();
Expand All @@ -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);
}
Expand All @@ -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();
}
Expand Down Expand Up @@ -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);
}
}

0 comments on commit b4d3557

Please sign in to comment.