Fixes bug where driver gets initialized only when device is available.
More explict handling of versatile forwarding flows in corsa driver.
Moving TunnelConnectivityManager to use flowObjectives instead of flowRules.

Change-Id: If43023f30a6e7a028dfdefbe1ffbcc710a1c7be3
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 e196fe5..1c1a74a 100644
--- a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
+++ b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
@@ -161,7 +161,7 @@
         connectivityManager = new TunnellingConnectivityManager(appId,
                                                                 configService,
                                                                 packetService,
-                                                                flowService);
+                                                                flowObjectiveService);
 
         icmpHandler = new IcmpHandler(configService, packetService);
 
@@ -252,7 +252,7 @@
 
             flowObjectiveService.forward(deviceId,
                                          generateRibFlowRule(fibEntry.prefix(), nextId).add());
-            log.trace("Sending flow forwarding objective {}->{}", fibEntry, nextId);
+            log.trace("Sending forwarding objective {} -> nextId:{}", fibEntry, nextId);
         }
 
     }
@@ -282,8 +282,6 @@
                 .matchIPDst(prefix)
                 .build();
 
-
-
         int priority = prefix.prefixLength() * PRIORITY_MULTIPLIER + PRIORITY_OFFSET;
 
         ForwardingObjective.Builder fwdBuilder = DefaultForwardingObjective.builder()
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 d76b353..7d8ca7c 100644
--- a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/TunnellingConnectivityManager.java
+++ b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/TunnellingConnectivityManager.java
@@ -15,19 +15,21 @@
  */
 package org.onosproject.bgprouter;
 
+import static org.slf4j.LoggerFactory.getLogger;
+
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IpAddress;
 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.flowobjective.DefaultForwardingObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketContext;
@@ -37,6 +39,7 @@
 import org.onosproject.routing.config.BgpSpeaker;
 import org.onosproject.routing.config.InterfaceAddress;
 import org.onosproject.routing.config.RoutingConfigurationService;
+import org.slf4j.Logger;
 
 
 /**
@@ -46,23 +49,25 @@
 public class TunnellingConnectivityManager {
 
     private static final short BGP_PORT = 179;
-
+    private final Logger log = getLogger(getClass());
     private final ApplicationId appId;
 
     private final BgpSpeaker bgpSpeaker;
 
     private final PacketService packetService;
     private final RoutingConfigurationService configService;
+    private final FlowObjectiveService flowObjectiveService;
 
     private final BgpProcessor processor = new BgpProcessor();
 
     public TunnellingConnectivityManager(ApplicationId appId,
                                          RoutingConfigurationService configService,
                                          PacketService packetService,
-                                         FlowRuleService flowService) {
+                                         FlowObjectiveService flowObjectiveService) {
         this.appId = appId;
         this.configService = configService;
         this.packetService = packetService;
+        this.flowObjectiveService = flowObjectiveService;
 
         BgpSpeaker bgpSpeaker = null;
         for (BgpSpeaker speaker : configService.getBgpSpeakers().values()) {
@@ -92,12 +97,27 @@
                 .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());
+        ForwardingObjective puntSrc = DefaultForwardingObjective.builder()
+                .fromApp(appId)
+                .makePermanent()
+                .withSelector(selectorSrc)
+                .withTreatment(treatment)
+                .withFlag(ForwardingObjective.Flag.VERSATILE)
+                .add();
+        flowObjectiveService.forward(bgpSpeaker.connectPoint().deviceId(),
+                                     puntSrc);
+
+        ForwardingObjective puntDst = DefaultForwardingObjective.builder()
+                .fromApp(appId)
+                .makePermanent()
+                .withSelector(selectorDst)
+                .withTreatment(treatment)
+                .withFlag(ForwardingObjective.Flag.VERSATILE)
+                .add();
+        flowObjectiveService.forward(bgpSpeaker.connectPoint().deviceId(),
+                                     puntDst);
+        log.info("Sent punt forwarding objective to {}", bgpSpeaker.connectPoint().deviceId());
+
     }
 
     public void start() {