[ONOS-6634] Add method to create NDP replay for ICMP6
Change-Id: Ibc24470072cc6810a428ac9caf1d3343310df80c
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
index ac00096..db34514 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
@@ -16,16 +16,24 @@
package org.onlab.packet.ndp;
import org.apache.commons.lang3.StringUtils;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
import org.junit.BeforeClass;
import org.junit.Test;
import org.onlab.packet.DeserializationException;
import org.onlab.packet.Deserializer;
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.ICMP6;
+import org.onlab.packet.IPv6;
+import org.onlab.packet.Ip6Address;
import org.onlab.packet.MacAddress;
import org.onlab.packet.PacketTestUtils;
import java.nio.ByteBuffer;
+import java.util.Arrays;
import static org.hamcrest.Matchers.is;
+import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.junit.Assert.*;
/**
@@ -39,7 +47,18 @@
(byte) 0xfe, (byte) 0x35, (byte) 0x26, (byte) 0xce
};
private static final MacAddress MAC_ADDRESS =
- MacAddress.valueOf("11:22:33:44:55:66");
+ MacAddress.valueOf("11:22:33:44:55:66");
+ private static final MacAddress MAC_ADDRESS2 =
+ MacAddress.valueOf("10:20:30:40:50:60");
+ private static final byte[] IPV6_SOURCE_ADDRESS = {
+ (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01
+ };
+ private static final byte[] IPV6_DESTINATION_ADDRESS = {
+ (byte) 0xfe, (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x02
+ };
+ private static final Ip6Address IP_6_ADDRESS = Ip6Address.valueOf(IPV6_DESTINATION_ADDRESS);
private static byte[] bytePacket;
@@ -149,4 +168,86 @@
assertTrue(StringUtils.contains(str, "overrideFlag=" + (byte) 1));
// TODO: need to handle TARGET_ADDRESS
}
+
+ /**
+ * Test Neighbor Advertisement reply build.
+ */
+ @Test
+ public void testBuildNdpAdv() {
+ Ethernet eth = new Ethernet();
+ eth.setSourceMACAddress(MAC_ADDRESS);
+ eth.setDestinationMACAddress(MAC_ADDRESS2);
+
+ IPv6 ipv6 = new IPv6();
+ ipv6.setSourceAddress(IPV6_SOURCE_ADDRESS);
+ ipv6.setDestinationAddress(IPV6_DESTINATION_ADDRESS);
+ ipv6.setNextHeader(IPv6.PROTOCOL_ICMP6);
+
+ eth.setEtherType(Ethernet.TYPE_IPV6);
+ eth.setPayload(ipv6);
+
+ ICMP6 icmp6 = new ICMP6();
+ icmp6.setIcmpType(ICMP6.NEIGHBOR_SOLICITATION);
+ icmp6.setIcmpCode(NeighborAdvertisement.RESERVED_CODE);
+ ipv6.setPayload(icmp6);
+
+ final Ethernet ethResponse = NeighborAdvertisement.buildNdpAdv(IP_6_ADDRESS, MAC_ADDRESS2, eth);
+
+ assertTrue(ethResponse.getDestinationMAC().equals(MAC_ADDRESS));
+ assertTrue(ethResponse.getSourceMAC().equals(MAC_ADDRESS2));
+ assertTrue(ethResponse.getEtherType() == Ethernet.TYPE_IPV6);
+
+ final IPv6 responseIpv6 = (IPv6) ethResponse.getPayload();
+
+ assertArrayEquals(responseIpv6.getSourceAddress(), ipv6.getDestinationAddress());
+ assertArrayEquals(responseIpv6.getDestinationAddress(), ipv6.getSourceAddress());
+ assertTrue(responseIpv6.getNextHeader() == IPv6.PROTOCOL_ICMP6);
+
+ final ICMP6 responseIcmp6 = (ICMP6) responseIpv6.getPayload();
+
+ assertTrue(responseIcmp6.getIcmpType() == ICMP6.NEIGHBOR_ADVERTISEMENT);
+ assertTrue(responseIcmp6.getIcmpCode() == NeighborAdvertisement.RESERVED_CODE);
+
+ final NeighborAdvertisement responseNadv = (NeighborAdvertisement) responseIcmp6.getPayload();
+
+ assertArrayEquals(responseNadv.getTargetAddress(), IPV6_DESTINATION_ADDRESS);
+ assertTrue(responseNadv.getSolicitedFlag() == NeighborAdvertisement.NDP_SOLICITED_FLAG);
+ assertTrue(responseNadv.getOverrideFlag() == NeighborAdvertisement.NDP_OVERRIDE_FLAG);
+ assertThat(responseNadv.getOptions(),
+ hasItem(hasOption(NeighborDiscoveryOptions.TYPE_TARGET_LL_ADDRESS, MAC_ADDRESS2.toBytes())));
+ }
+
+ private NeighborDiscoveryOptionMatcher hasOption(byte type, byte[] data) {
+ return new NeighborDiscoveryOptionMatcher(type, data);
+ }
+
+ private static class NeighborDiscoveryOptionMatcher extends TypeSafeMatcher<NeighborDiscoveryOptions.Option> {
+
+ private final byte type;
+ private final byte[] data;
+ private String reason = "";
+
+ NeighborDiscoveryOptionMatcher(byte type, byte[] data) {
+ this.type = type;
+ this.data = data;
+ }
+
+ @Override
+ protected boolean matchesSafely(NeighborDiscoveryOptions.Option option) {
+ if (type != option.type()) {
+ reason = "Wrong Option type";
+ return false;
+ }
+ if (!Arrays.equals(data, option.data())) {
+ reason = "Wrong Option data";
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText(reason);
+ }
+ }
}
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
index e01db27..abcd20e 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
@@ -158,12 +158,23 @@
*/
@Test
public void testBuildNdpSolicit() throws Exception {
- Ethernet ethPacket = NeighborSolicitation.buildNdpSolicit(TARGET_IP.toOctets(),
- SRC_IP.toOctets(), DST_IP.toOctets(),
- SRC_MAC.toBytes(), DST_MAC.toBytes(), VLAN_ID);
- IPv6 ipPacket = (IPv6) ethPacket.getPayload();
- ICMP6 icmp6Packet = (ICMP6) ipPacket.getPayload();
- NeighborSolicitation nsPacket = (NeighborSolicitation) icmp6Packet.getPayload();
+ final Ethernet ethPacket = NeighborSolicitation.buildNdpSolicit(TARGET_IP,
+ SRC_IP, DST_IP, SRC_MAC, DST_MAC, VLAN_ID);
+
+ assertTrue(ethPacket.getDestinationMAC().equals(DST_MAC));
+ assertTrue(ethPacket.getSourceMAC().equals(SRC_MAC));
+ assertTrue(ethPacket.getEtherType() == Ethernet.TYPE_IPV6);
+ assertTrue(ethPacket.getVlanID() == VLAN_ID.id());
+
+ final IPv6 ipPacket = (IPv6) ethPacket.getPayload();
+
+ assertArrayEquals(ipPacket.getSourceAddress(), SRC_IP.toOctets());
+ assertArrayEquals(ipPacket.getDestinationAddress(), DST_IP.toOctets());
+
+ final ICMP6 icmp6Packet = (ICMP6) ipPacket.getPayload();
+ final NeighborSolicitation nsPacket = (NeighborSolicitation) icmp6Packet.getPayload();
+
+ assertArrayEquals(nsPacket.getTargetAddress(), TARGET_IP.toOctets());
assertEquals("Non-DAD NS should have 1 option", 1, nsPacket.getOptions().size());
assertEquals("The option should be SRC_LL_ADDR type", TYPE_SOURCE_LL_ADDRESS,
@@ -176,9 +187,8 @@
*/
@Test
public void testBuildNdpSolicitDad() throws Exception {
- Ethernet ethPacket = NeighborSolicitation.buildNdpSolicit(TARGET_IP.toOctets(),
- Ip6Address.ZERO.toOctets(), DST_IP.toOctets(),
- SRC_MAC.toBytes(), DST_MAC.toBytes(), VLAN_ID);
+ Ethernet ethPacket = NeighborSolicitation.buildNdpSolicit(TARGET_IP,
+ Ip6Address.ZERO, DST_IP, SRC_MAC, DST_MAC, VLAN_ID);
IPv6 ipPacket = (IPv6) ethPacket.getPayload();
ICMP6 icmp6Packet = (ICMP6) ipPacket.getPayload();
NeighborSolicitation nsPacket = (NeighborSolicitation) icmp6Packet.getPayload();