BgpRouter: Add default flows for BGP traffic in control plane switch
Change-Id: Ia963b22c5a7460fb7fa2e75ddf66bcbb40004dca
diff --git a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
index cc50819..66e4b25 100644
--- a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
+++ b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
@@ -149,7 +149,8 @@
connectivityManager = new TunnellingConnectivityManager(appId,
configService,
- packetService);
+ packetService,
+ flowService);
routingService.start(new InternalFibListener());
diff --git a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/TunnellingConnectivityManager.java b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/TunnellingConnectivityManager.java
index 270a4da..d76b353 100644
--- a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/TunnellingConnectivityManager.java
+++ b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/TunnellingConnectivityManager.java
@@ -21,7 +21,12 @@
import org.onlab.packet.TCP;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.flow.DefaultFlowRule;
+import org.onosproject.net.flow.DefaultTrafficSelector;
import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.FlowRuleOperations;
+import org.onosproject.net.flow.FlowRuleService;
+import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
import org.onosproject.net.packet.DefaultOutboundPacket;
import org.onosproject.net.packet.OutboundPacket;
@@ -32,8 +37,6 @@
import org.onosproject.routing.config.BgpSpeaker;
import org.onosproject.routing.config.InterfaceAddress;
import org.onosproject.routing.config.RoutingConfigurationService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
@@ -46,6 +49,8 @@
private final ApplicationId appId;
+ private final BgpSpeaker bgpSpeaker;
+
private final PacketService packetService;
private final RoutingConfigurationService configService;
@@ -53,10 +58,46 @@
public TunnellingConnectivityManager(ApplicationId appId,
RoutingConfigurationService configService,
- PacketService packetService) {
+ PacketService packetService,
+ FlowRuleService flowService) {
this.appId = appId;
this.configService = configService;
this.packetService = packetService;
+
+ BgpSpeaker bgpSpeaker = null;
+ for (BgpSpeaker speaker : configService.getBgpSpeakers().values()) {
+ bgpSpeaker = speaker;
+ break;
+ }
+
+ if (bgpSpeaker == null) {
+ throw new IllegalArgumentException("Must have at least one BGP speaker configured");
+ }
+
+ this.bgpSpeaker = bgpSpeaker;
+
+ TrafficSelector selectorDst = DefaultTrafficSelector.builder()
+ .matchEthType(Ethernet.TYPE_IPV4)
+ .matchIPProtocol(IPv4.PROTOCOL_TCP)
+ .matchTcpDst(BGP_PORT)
+ .build();
+
+ TrafficSelector selectorSrc = DefaultTrafficSelector.builder()
+ .matchEthType(Ethernet.TYPE_IPV4)
+ .matchIPProtocol(IPv4.PROTOCOL_TCP)
+ .matchTcpSrc(BGP_PORT)
+ .build();
+
+ TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+ .punt()
+ .build();
+
+ FlowRuleOperations.Builder builder = FlowRuleOperations.builder();
+ builder.add(new DefaultFlowRule(bgpSpeaker.connectPoint().deviceId(),
+ selectorSrc, treatment, 0, appId, 0, true));
+ builder.add(new DefaultFlowRule(bgpSpeaker.connectPoint().deviceId(),
+ selectorDst, treatment, 0, appId, 0, true));
+ flowService.apply(builder.build());
}
public void start() {
@@ -74,27 +115,21 @@
* @param context the packet context of the incoming packet
*/
private void forward(PacketContext context) {
-
ConnectPoint outputPort = null;
- Logger log = LoggerFactory.getLogger(getClass());
-
IPv4 ipv4 = (IPv4) context.inPacket().parsed().getPayload();
IpAddress dstAddress = IpAddress.valueOf(ipv4.getDestinationAddress());
- for (BgpSpeaker speaker : configService.getBgpSpeakers().values()) {
- if (context.inPacket().receivedFrom().equals(speaker.connectPoint())) {
- BgpPeer peer = configService.getBgpPeers().get(dstAddress);
- if (peer != null) {
- outputPort = peer.connectPoint();
- }
- break;
+ if (context.inPacket().receivedFrom().equals(bgpSpeaker.connectPoint())) {
+ BgpPeer peer = configService.getBgpPeers().get(dstAddress);
+ if (peer != null) {
+ outputPort = peer.connectPoint();
}
- for (InterfaceAddress addr : speaker.interfaceAddresses()) {
- if (addr.ipAddress().equals(dstAddress) && !context.inPacket()
- .receivedFrom().equals(speaker.connectPoint())) {
- outputPort = speaker.connectPoint();
- }
+ }
+ for (InterfaceAddress addr : bgpSpeaker.interfaceAddresses()) {
+ if (addr.ipAddress().equals(dstAddress) && !context.inPacket()
+ .receivedFrom().equals(bgpSpeaker.connectPoint())) {
+ outputPort = bgpSpeaker.connectPoint();
}
}