CORD-1015 CPR bridging alternative
- Remove workaround introduced in gerrit #12604
- Add ability to respond to IPv6 solicited-node multicast address of gateway IPs
Change-Id: I7d1c9840a51e35d471303a8f723245a5bbc809ff
diff --git a/src/main/java/org/onosproject/segmentrouting/IcmpHandler.java b/src/main/java/org/onosproject/segmentrouting/IcmpHandler.java
index a1327c0..a42a806 100644
--- a/src/main/java/org/onosproject/segmentrouting/IcmpHandler.java
+++ b/src/main/java/org/onosproject/segmentrouting/IcmpHandler.java
@@ -36,15 +36,14 @@
import org.onosproject.net.flow.TrafficTreatment;
import org.onosproject.net.host.HostService;
import org.onosproject.net.packet.DefaultOutboundPacket;
-import org.onosproject.net.packet.InboundPacket;
import org.onosproject.net.packet.OutboundPacket;
-import org.onosproject.net.packet.PacketContext;
import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
import org.onosproject.segmentrouting.config.SegmentRoutingAppConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
+import java.util.Arrays;
import java.util.Set;
/**
@@ -404,11 +403,13 @@
} catch (DeviceConfigNotFoundException e) {
log.warn(e.getMessage() + " Aborting check for router IP in processing ndp");
}
- if (gatewayIpAddresses != null &&
- gatewayIpAddresses.contains(pkt.target())) {
- return true;
- }
- return false;
+
+ return gatewayIpAddresses != null && gatewayIpAddresses.stream()
+ .filter(IpAddress::isIp6)
+ .anyMatch(gatewayIp -> gatewayIp.equals(pkt.target()) ||
+ Arrays.equals(IPv6.getSolicitNodeAddress(gatewayIp.toOctets()),
+ pkt.target().toOctets())
+ );
}
/**
@@ -447,34 +448,4 @@
);
flood(ndpRequest, inPort, targetAddress);
}
-
- /////////////////////////////////////////////////////////////////
- // XXX Neighbour hacking, temporary workaround will be //
- // removed as soon as possible, when the bridging will //
- // be implemented. For now, it's fine to leave this //
- /////////////////////////////////////////////////////////////////
-
- // XXX Neighbour hacking, this method is used to handle
- // the ICMPv6 protocols for the upstream port
- public boolean handleUPstreamPackets(PacketContext packetContext) {
- InboundPacket pkt = packetContext.inPacket();
- Ethernet ethernet = pkt.parsed();
- if (srManager.vRouterCP == null || srManager.upstreamCP == null) {
- return false;
- }
- if (pkt.receivedFrom().equals(srManager.upstreamCP)) {
- sendTo(ByteBuffer.wrap(ethernet.serialize()), srManager.vRouterCP);
- return true;
- }
- return false;
- }
-
- // XXX Neigbour hack. To send out a packet
- private void sendTo(ByteBuffer packet, ConnectPoint outPort) {
- TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
- builder.setOutput(outPort.port());
- srManager.packetService.emit(new DefaultOutboundPacket(outPort.deviceId(),
- builder.build(), packet));
- }
-
}