Improves ping responder
Patch contains several bugfixes and improvements:
- Fixes sid retrieval when the destination leaf is down
- Fixes sid retrieval when ping goes through the spine
- Fixes MPLS deserializer
- Improves Ethernet toString
- Fixes ping to looback for dh host when bond sends to wrong leaf
Change-Id: I05963e74b2976e526826ffd377cadeb462ba0a8d
diff --git a/app/src/test/java/org/onosproject/segmentrouting/TestUtils.java b/app/src/test/java/org/onosproject/segmentrouting/TestUtils.java
new file mode 100644
index 0000000..339b2c8
--- /dev/null
+++ b/app/src/test/java/org/onosproject/segmentrouting/TestUtils.java
@@ -0,0 +1,460 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.segmentrouting;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.host.InterfaceIpAddress;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.routeservice.ResolvedRoute;
+import org.onosproject.routeservice.Route;
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.ICMP;
+import org.onlab.packet.ICMP6;
+import org.onlab.packet.IPv4;
+import org.onlab.packet.IPv6;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onlab.packet.ICMPEcho;
+
+import java.util.Map;
+import java.util.Set;
+
+import static org.onlab.packet.ICMP.TYPE_ECHO_REQUEST;
+import static org.onlab.packet.ICMP6.ECHO_REQUEST;
+import static org.onlab.packet.IPv4.PROTOCOL_ICMP;
+import static org.onosproject.routeservice.Route.Source.STATIC;
+
+/**
+ * Utilities class for unit tests.
+ */
+public final class TestUtils {
+
+ private TestUtils() {
+
+ }
+
+ // Device configuration section
+ static final DeviceId REMOTE_LEAF = DeviceId.deviceId("of:0000000000000001");
+ static final int REMOTE_LEAF_SID4 = 1;
+ static final String REMOTE_LEAF_LB4 = "192.168.0.1";
+ static final int REMOTE_LEAF_SID6 = 10;
+ static final String REMOTE_LEAF_LB6 = "2000::c0a8:1";
+ private static final PortNumber P1 = PortNumber.portNumber(1);
+ static final MacAddress REMOTE_MAC = MacAddress.valueOf("00:00:00:00:00:02");
+
+ static final DeviceId LOCAL_LEAF = DeviceId.deviceId("of:0000000000000101");
+ static final int LOCAL_LEAF_SID4 = 101;
+ static final String LOCAL_LEAF_LB4 = "192.168.0.101";
+ static final int LOCAL_LEAF_SID6 = 111;
+ static final String LOCAL_LEAF_LB6 = "2000::c0a8:101";
+ static final MacAddress LOCAL_MAC = MacAddress.valueOf("00:00:00:00:01:01");
+
+ // Configure a pair
+ static final DeviceId LOCAL_LEAF1 = DeviceId.deviceId("of:0000000000000201");
+ static final int LOCAL_LEAF1_SID4 = 201;
+ static final String LOCAL_LEAF1_LB4 = "192.168.0.201";
+ static final int LOCAL_LEAF1_SID6 = 211;
+ static final String LOCAL_LEAF1_LB6 = "2000::c0a8:201";
+ static final MacAddress LOCAL_MAC1 = MacAddress.valueOf("00:00:00:00:02:01");
+
+ static final DeviceId LOCAL_LEAF2 = DeviceId.deviceId("of:0000000000000202");
+ static final int LOCAL_LEAF2_SID4 = 202;
+ static final String LOCAL_LEAF2_LB4 = "192.168.0.202";
+ static final int LOCAL_LEAF2_SID6 = 212;
+ static final String LOCAL_LEAF2_LB6 = "2000::c0a8:202";
+ static final MacAddress LOCAL_MAC2 = MacAddress.valueOf("00:00:00:00:02:02");
+
+ // Pair port
+ static final PortNumber P3 = PortNumber.portNumber(3);
+
+ // Ports configuration section
+ static final ConnectPoint CP11 = new ConnectPoint(REMOTE_LEAF, P1);
+ private static final PortNumber P2 = PortNumber.portNumber(2);
+ static final ConnectPoint CP12 = new ConnectPoint(REMOTE_LEAF, P2);
+ private static final IpAddress IP4_1 = IpAddress.valueOf("10.0.0.254");
+ private static final IpPrefix PREFIX4_1 = IpPrefix.valueOf("10.0.0.254/24");
+ private static final IpAddress IP6_1 = IpAddress.valueOf("2000::ff");
+ private static final IpPrefix PREFIX6_1 = IpPrefix.valueOf("2000::ff/120");
+ private static final InterfaceIpAddress INTF_IP4_1 = new InterfaceIpAddress(
+ IP4_1, PREFIX4_1);
+ private static final InterfaceIpAddress INTF_IP6_1 = new InterfaceIpAddress(
+ IP6_1, PREFIX6_1);
+ private static final VlanId INTF_VLAN_UNTAGGED = VlanId.vlanId((short) 10);
+ static final Interface INTF1 = new Interface(
+ "INTF1", CP12, Lists.newArrayList(INTF_IP4_1, INTF_IP6_1), MacAddress.NONE,
+ null, INTF_VLAN_UNTAGGED, null, null);
+ static final ConnectPoint CP13 = new ConnectPoint(REMOTE_LEAF, P3);
+ private static final IpAddress IP4_2 = IpAddress.valueOf("10.0.3.254");
+ private static final IpPrefix PREFIX4_2 = IpPrefix.valueOf("10.0.3.254/24");
+ private static final IpAddress IP6_2 = IpAddress.valueOf("2000::3ff");
+ private static final IpPrefix PREFIX6_2 = IpPrefix.valueOf("2000::3ff/120");
+ private static final InterfaceIpAddress INTF_IP4_2 = new InterfaceIpAddress(
+ IP4_2, PREFIX4_2);
+ private static final InterfaceIpAddress INTF_IP6_2 = new InterfaceIpAddress(
+ IP6_2, PREFIX6_2);
+ static final Interface INTF2 = new Interface(
+ "INTF2", CP13, Lists.newArrayList(INTF_IP4_2, INTF_IP6_2), MacAddress.NONE,
+ null, INTF_VLAN_UNTAGGED, null, null);
+
+ static final ConnectPoint CP1011 = new ConnectPoint(LOCAL_LEAF, P1);
+ private static final IpAddress IP4_11 = IpAddress.valueOf("10.0.1.254");
+ private static final IpPrefix PREFIX4_11 = IpPrefix.valueOf("10.0.1.254/24");
+ private static final InterfaceIpAddress INTF_IP4_11 = new InterfaceIpAddress(
+ IP4_11, PREFIX4_11);
+ private static final IpAddress IP6_11 = IpAddress.valueOf("2000::1ff");
+ private static final IpPrefix PREFIX6_11 = IpPrefix.valueOf("2000::1ff/120");
+ private static final InterfaceIpAddress INTF_IP6_11 = new InterfaceIpAddress(
+ IP6_11, PREFIX6_11);
+ static final Interface INTF111 = new Interface(
+ "INTF111", CP1011, Lists.newArrayList(INTF_IP4_11, INTF_IP6_11), MacAddress.NONE, null,
+ INTF_VLAN_UNTAGGED, null, null);
+
+ static final ConnectPoint CP2011 = new ConnectPoint(LOCAL_LEAF1, P1);
+ private static final IpAddress IP4_21 = IpAddress.valueOf("10.0.2.254");
+ private static final IpPrefix PREFIX4_21 = IpPrefix.valueOf("10.0.2.254/24");
+ private static final InterfaceIpAddress INTF_IP4_21 = new InterfaceIpAddress(
+ IP4_21, PREFIX4_21);
+ private static final IpAddress IP6_21 = IpAddress.valueOf("2000::2ff");
+ private static final IpPrefix PREFIX6_21 = IpPrefix.valueOf("2000::2ff/120");
+ private static final InterfaceIpAddress INTF_IP6_21 = new InterfaceIpAddress(
+ IP6_21, PREFIX6_21);
+ static final Interface INTF211 = new Interface(
+ "INTF211", CP2011, Lists.newArrayList(INTF_IP4_21, INTF_IP6_21), MacAddress.NONE, null,
+ INTF_VLAN_UNTAGGED, null, null);
+
+ static final ConnectPoint CP2021 = new ConnectPoint(LOCAL_LEAF2, P1);
+ private static final IpAddress IP4_22 = IpAddress.valueOf("10.0.2.254");
+ private static final IpPrefix PREFIX4_22 = IpPrefix.valueOf("10.0.2.254/24");
+ private static final InterfaceIpAddress INTF_IP4_22 = new InterfaceIpAddress(
+ IP4_22, PREFIX4_22);
+ private static final IpAddress IP6_22 = IpAddress.valueOf("2000::2ff");
+ private static final IpPrefix PREFIX6_22 = IpPrefix.valueOf("2000::2ff/120");
+ private static final InterfaceIpAddress INTF_IP6_22 = new InterfaceIpAddress(
+ IP6_22, PREFIX6_22);
+ static final Interface INTF212 = new Interface(
+ "INTF212", CP2021, Lists.newArrayList(INTF_IP4_22, INTF_IP6_22), MacAddress.NONE, null,
+ INTF_VLAN_UNTAGGED, null, null);
+ private static final PortNumber P4 = PortNumber.portNumber(4);
+ static final ConnectPoint CP2024 = new ConnectPoint(LOCAL_LEAF2, P4);
+ private static final PortNumber P5 = PortNumber.portNumber(5);
+ static final ConnectPoint CP2025 = new ConnectPoint(LOCAL_LEAF2, P5);
+ private static final IpAddress IP4_23 = IpAddress.valueOf("10.0.4.254");
+ private static final IpPrefix PREFIX4_23 = IpPrefix.valueOf("10.0.4.254/24");
+ private static final InterfaceIpAddress INTF_IP4_23 = new InterfaceIpAddress(
+ IP4_23, PREFIX4_23);
+ private static final IpAddress IP6_23 = IpAddress.valueOf("2000::4ff");
+ private static final IpPrefix PREFIX6_23 = IpPrefix.valueOf("2000::4ff/120");
+ private static final InterfaceIpAddress INTF_IP6_23 = new InterfaceIpAddress(
+ IP6_23, PREFIX6_23);
+ static final Interface INTF213 = new Interface(
+ "INTF212", CP2024, Lists.newArrayList(INTF_IP4_23, INTF_IP6_23), MacAddress.NONE, null,
+ INTF_VLAN_UNTAGGED, null, null);
+
+ // Packet-ins section
+ private static final MacAddress SRC_MAC = MacAddress.valueOf("00:00:00:00:00:01");
+
+ private static final ICMPEcho ICMP_ECHO = new ICMPEcho()
+ .setIdentifier((short) 0)
+ .setSequenceNum((short) 0);
+
+ private static final ICMP ICMP_REQUEST = (ICMP) new ICMP()
+ .setIcmpType(TYPE_ECHO_REQUEST)
+ .setPayload(ICMP_ECHO);
+
+ private static final Ip4Address SRC_IPV4 = Ip4Address.valueOf("10.0.1.1");
+ static final Ip4Address DST_IPV4 = Ip4Address.valueOf("10.0.0.254");
+
+ private static final IPv4 IPV4_REQUEST = (IPv4) new IPv4()
+ .setDestinationAddress(DST_IPV4.toInt())
+ .setSourceAddress(SRC_IPV4.toInt())
+ .setTtl((byte) 64)
+ .setProtocol(PROTOCOL_ICMP)
+ .setPayload(ICMP_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV4 = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV4)
+ .setDestinationMACAddress(REMOTE_MAC)
+ .setSourceMACAddress(SRC_MAC)
+ .setPayload(IPV4_REQUEST);
+
+ private static final ICMP6 ICMP6_REQUEST = new ICMP6()
+ .setIcmpType(ECHO_REQUEST);
+
+ private static final Ip6Address SRC_IPV6 = Ip6Address.valueOf("2000::101");
+ static final Ip6Address DST_IPV6 = Ip6Address.valueOf("2000::ff");
+
+ private static final IPv6 IPV6_REQUEST = (IPv6) new IPv6()
+ .setDestinationAddress(DST_IPV6.toOctets())
+ .setSourceAddress(SRC_IPV6.toOctets())
+ .setHopLimit((byte) 255)
+ .setNextHeader(IPv6.PROTOCOL_ICMP6)
+ .setPayload(ICMP6_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV6 = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV6)
+ .setDestinationMACAddress(REMOTE_MAC)
+ .setSourceMACAddress(SRC_MAC)
+ .setPayload(IPV6_REQUEST);
+
+ static final Ip4Address SRC_IPV41 = Ip4Address.valueOf("10.0.2.1");
+
+ private static final IPv4 IPV41_REQUEST = (IPv4) new IPv4()
+ .setDestinationAddress(DST_IPV4.toInt())
+ .setSourceAddress(SRC_IPV41.toInt())
+ .setTtl((byte) 64)
+ .setProtocol(PROTOCOL_ICMP)
+ .setPayload(ICMP_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV41 = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV4)
+ .setDestinationMACAddress(REMOTE_MAC)
+ .setSourceMACAddress(SRC_MAC)
+ .setPayload(IPV41_REQUEST);
+
+ static final Ip6Address SRC_IPV61 = Ip6Address.valueOf("2000::201");
+
+ private static final IPv6 IPV61_REQUEST = (IPv6) new IPv6()
+ .setDestinationAddress(DST_IPV6.toOctets())
+ .setSourceAddress(SRC_IPV61.toOctets())
+ .setHopLimit((byte) 255)
+ .setNextHeader(IPv6.PROTOCOL_ICMP6)
+ .setPayload(ICMP6_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV61 = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV6)
+ .setDestinationMACAddress(REMOTE_MAC)
+ .setSourceMACAddress(SRC_MAC)
+ .setPayload(IPV61_REQUEST);
+
+ private static final MacAddress SRC_MAC_MY = MacAddress.valueOf("00:01:00:00:00:01");
+ static final Ip4Address SRC_IPV4_MY = Ip4Address.valueOf("10.0.0.1");
+
+ private static final IPv4 IPV4_REQUEST_MY = (IPv4) new IPv4()
+ .setDestinationAddress(DST_IPV4.toInt())
+ .setSourceAddress(SRC_IPV4_MY.toInt())
+ .setTtl((byte) 64)
+ .setProtocol(PROTOCOL_ICMP)
+ .setPayload(ICMP_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV4_MY = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV4)
+ .setDestinationMACAddress(REMOTE_MAC)
+ .setSourceMACAddress(SRC_MAC_MY)
+ .setPayload(IPV4_REQUEST_MY);
+
+ static final Ip6Address SRC_IPV6_MY = Ip6Address.valueOf("2000::1");
+
+ private static final IPv6 IPV6_REQUEST_MY = (IPv6) new IPv6()
+ .setDestinationAddress(DST_IPV6.toOctets())
+ .setSourceAddress(SRC_IPV6_MY.toOctets())
+ .setHopLimit((byte) 255)
+ .setNextHeader(IPv6.PROTOCOL_ICMP6)
+ .setPayload(ICMP6_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV6_MY = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV6)
+ .setDestinationMACAddress(REMOTE_MAC)
+ .setSourceMACAddress(SRC_MAC_MY)
+ .setPayload(IPV6_REQUEST_MY);
+
+ static final Ip4Address DST_IPV4_LOCAL = Ip4Address.valueOf("10.0.3.254");
+
+ private static final IPv4 IPV4_REQUEST_LOCAL = (IPv4) new IPv4()
+ .setDestinationAddress(DST_IPV4_LOCAL.toInt())
+ .setSourceAddress(SRC_IPV4_MY.toInt())
+ .setTtl((byte) 64)
+ .setProtocol(PROTOCOL_ICMP)
+ .setPayload(ICMP_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV4_LOCAL = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV4)
+ .setDestinationMACAddress(REMOTE_MAC)
+ .setSourceMACAddress(SRC_MAC_MY)
+ .setPayload(IPV4_REQUEST_LOCAL);
+
+ static final Ip6Address DST_IPV6_LOCAL = Ip6Address.valueOf("2000::3ff");
+
+ private static final IPv6 IPV6_REQUEST_LOCAL = (IPv6) new IPv6()
+ .setDestinationAddress(DST_IPV6_LOCAL.toOctets())
+ .setSourceAddress(SRC_IPV6_MY.toOctets())
+ .setHopLimit((byte) 255)
+ .setNextHeader(IPv6.PROTOCOL_ICMP6)
+ .setPayload(ICMP6_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV6_LOCAL = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV6)
+ .setDestinationMACAddress(REMOTE_MAC)
+ .setSourceMACAddress(SRC_MAC_MY)
+ .setPayload(IPV6_REQUEST_LOCAL);
+
+ static final Ip4Address DST_IPV4_SAME = Ip4Address.valueOf("10.0.4.254");
+
+ private static final IPv4 IPV4_REQUEST_SAME = (IPv4) new IPv4()
+ .setDestinationAddress(DST_IPV4_SAME.toInt())
+ .setSourceAddress(SRC_IPV41.toInt())
+ .setTtl((byte) 64)
+ .setProtocol(PROTOCOL_ICMP)
+ .setPayload(ICMP_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV4_SAME = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV4)
+ .setDestinationMACAddress(LOCAL_MAC2)
+ .setSourceMACAddress(SRC_MAC)
+ .setPayload(IPV4_REQUEST_SAME);
+
+ static final Ip6Address DST_IPV6_SAME = Ip6Address.valueOf("2000::4ff");
+
+ private static final IPv6 IPV6_REQUEST_SAME = (IPv6) new IPv6()
+ .setDestinationAddress(DST_IPV6_SAME.toOctets())
+ .setSourceAddress(SRC_IPV61.toOctets())
+ .setHopLimit((byte) 255)
+ .setNextHeader(IPv6.PROTOCOL_ICMP6)
+ .setPayload(ICMP6_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV6_SAME = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV6)
+ .setDestinationMACAddress(LOCAL_MAC2)
+ .setSourceMACAddress(SRC_MAC)
+ .setPayload(IPV6_REQUEST_SAME);
+
+ static final Ip6Address DST_IPV6_LL = Ip6Address.valueOf(
+ IPv6.getLinkLocalAddress(MacAddress.NONE.toBytes()));
+ static final Ip6Address SRC_IPV6_LL = Ip6Address.valueOf(
+ IPv6.getLinkLocalAddress(SRC_MAC_MY.toBytes()));
+
+ private static final IPv6 IPV6_REQUEST_LL = (IPv6) new IPv6()
+ .setDestinationAddress(DST_IPV6_LL.toOctets())
+ .setSourceAddress(SRC_IPV6_LL.toOctets())
+ .setHopLimit((byte) 255)
+ .setNextHeader(IPv6.PROTOCOL_ICMP6)
+ .setPayload(ICMP6_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV6_LL = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV6)
+ .setDestinationMACAddress(MacAddress.NONE)
+ .setSourceMACAddress(SRC_MAC_MY)
+ .setPayload(IPV6_REQUEST_LL);
+
+ static final Ip4Address DST_IPV4_LOOPBACK = Ip4Address.valueOf(REMOTE_LEAF_LB4);
+
+ private static final IPv4 IPV4_REQUEST_LOOPBACK = (IPv4) new IPv4()
+ .setDestinationAddress(DST_IPV4_LOOPBACK.toInt())
+ .setSourceAddress(SRC_IPV4_MY.toInt())
+ .setTtl((byte) 64)
+ .setProtocol(PROTOCOL_ICMP)
+ .setPayload(ICMP_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV4_LOOPBACK = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV4)
+ .setDestinationMACAddress(REMOTE_MAC)
+ .setSourceMACAddress(SRC_MAC_MY)
+ .setPayload(IPV4_REQUEST_LOOPBACK);
+
+ static final Ip6Address DST_IPV6_LOOPBACK = Ip6Address.valueOf(REMOTE_LEAF_LB6);
+
+ private static final IPv6 IPV6_REQUEST_LOOPBACK = (IPv6) new IPv6()
+ .setDestinationAddress(DST_IPV6_LOOPBACK.toOctets())
+ .setSourceAddress(SRC_IPV6_MY.toOctets())
+ .setHopLimit((byte) 255)
+ .setNextHeader(IPv6.PROTOCOL_ICMP6)
+ .setPayload(ICMP6_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV6_LOOPBACK = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV6)
+ .setDestinationMACAddress(REMOTE_MAC)
+ .setSourceMACAddress(SRC_MAC_MY)
+ .setPayload(IPV6_REQUEST_LOOPBACK);
+
+ static final Ip4Address DST_IPV4_LOOPBACK_PAIR = Ip4Address.valueOf(LOCAL_LEAF1_LB4);
+
+ private static final IPv4 IPV4_REQUEST_LOOPBACK_PAIR = (IPv4) new IPv4()
+ .setDestinationAddress(DST_IPV4_LOOPBACK_PAIR.toInt())
+ .setSourceAddress(SRC_IPV41.toInt())
+ .setTtl((byte) 64)
+ .setProtocol(PROTOCOL_ICMP)
+ .setPayload(ICMP_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV4_LOOPBACK_PAIR = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV4)
+ .setDestinationMACAddress(LOCAL_MAC1)
+ .setSourceMACAddress(SRC_MAC)
+ .setPayload(IPV4_REQUEST_LOOPBACK_PAIR);
+
+ static final Ip6Address DST_IPV6_LOOPBACK_PAIR = Ip6Address.valueOf(LOCAL_LEAF2_LB6);
+
+ private static final IPv6 IPV6_REQUEST_LOOPBACK_PAIR = (IPv6) new IPv6()
+ .setDestinationAddress(DST_IPV6_LOOPBACK_PAIR.toOctets())
+ .setSourceAddress(SRC_IPV61.toOctets())
+ .setHopLimit((byte) 255)
+ .setNextHeader(IPv6.PROTOCOL_ICMP6)
+ .setPayload(ICMP6_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV6_LOOPBACK_PAIR = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV6)
+ .setDestinationMACAddress(LOCAL_MAC2)
+ .setSourceMACAddress(SRC_MAC)
+ .setPayload(IPV6_REQUEST_LOOPBACK_PAIR);
+
+ static final Ip4Address DST_IPV4_GATEWAY_PAIR = Ip4Address.valueOf("10.0.2.254");
+
+ private static final IPv4 IPV4_REQUEST_GATEWAY_PAIR = (IPv4) new IPv4()
+ .setDestinationAddress(DST_IPV4_GATEWAY_PAIR.toInt())
+ .setSourceAddress(SRC_IPV41.toInt())
+ .setTtl((byte) 64)
+ .setProtocol(PROTOCOL_ICMP)
+ .setPayload(ICMP_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV4_GATEWAY_PAIR = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV4)
+ .setDestinationMACAddress(LOCAL_MAC1)
+ .setSourceMACAddress(SRC_MAC)
+ .setPayload(IPV4_REQUEST_GATEWAY_PAIR);
+
+ static final Ip6Address DST_IPV6_GATEWAY_PAIR = Ip6Address.valueOf("2000::2ff");
+
+ private static final IPv6 IPV6_REQUEST_GATEWAY_PAIR = (IPv6) new IPv6()
+ .setDestinationAddress(DST_IPV6_GATEWAY_PAIR.toOctets())
+ .setSourceAddress(SRC_IPV61.toOctets())
+ .setHopLimit((byte) 255)
+ .setNextHeader(IPv6.PROTOCOL_ICMP6)
+ .setPayload(ICMP6_REQUEST);
+
+ static final Ethernet ETH_REQ_IPV6_GATEWAY_PAIR = (Ethernet) new Ethernet()
+ .setEtherType(Ethernet.TYPE_IPV6)
+ .setDestinationMACAddress(LOCAL_MAC2)
+ .setSourceMACAddress(SRC_MAC)
+ .setPayload(IPV6_REQUEST_GATEWAY_PAIR);
+
+ // Resolved route
+ private static final ResolvedRoute IPV4_ROUTE = new ResolvedRoute(
+ new Route(STATIC, SRC_IPV4.toIpPrefix(), SRC_IPV4), MacAddress.NONE);
+ private static final ResolvedRoute IPV6_ROUTE = new ResolvedRoute(
+ new Route(STATIC, SRC_IPV6.toIpPrefix(), SRC_IPV6), MacAddress.NONE);
+ static final Map<IpPrefix, Set<ResolvedRoute>> ROUTE_STORE = ImmutableMap.of(SRC_IPV4.toIpPrefix(),
+ Sets.newHashSet(IPV4_ROUTE),
+ SRC_IPV6.toIpPrefix(),
+ Sets.newHashSet(IPV6_ROUTE));
+}