WIP: Initial implementation of filterObjectives using driver subsystem.

Incomplete implementation

Change-Id: I3745d481027659d4ca44b72139e5461c02e8c3ef
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 9a4ecba..58e796f 100644
--- a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
+++ b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
@@ -15,14 +15,11 @@
  */
 package org.onosproject.bgprouter;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
+import com.google.common.collect.ConcurrentHashMultiset;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multiset;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -45,12 +42,14 @@
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.FlowRule.Type;
 import org.onosproject.net.flow.FlowRuleOperations;
-import org.onosproject.net.flow.FlowRuleOperationsContext;
 import org.onosproject.net.flow.FlowRuleService;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.criteria.Criteria;
+import org.onosproject.net.flowobjective.DefaultFilteringObjective;
+import org.onosproject.net.flowobjective.FilteringObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
 import org.onosproject.net.group.DefaultGroupBucket;
 import org.onosproject.net.group.DefaultGroupDescription;
 import org.onosproject.net.group.DefaultGroupKey;
@@ -73,11 +72,13 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.ConcurrentHashMultiset;
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multiset;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * BgpRouter component.
@@ -156,6 +157,10 @@
                     .register(NextHopGroupKey.class)
                     .build();
 
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected FlowObjectiveService flowObjectiveService;
+
     @Activate
     protected void activate() {
         appId = coreService.registerApplication(BGP_ROUTER_APP);
@@ -377,336 +382,28 @@
 
     private class InternalTableHandler {
 
-        private static final int CONTROLLER_PRIORITY = 255;
-        private static final int DROP_PRIORITY = 0;
-        private static final int HIGHEST_PRIORITY = 0xffff;
         private Set<InterfaceIpAddress> intfIps = new HashSet<InterfaceIpAddress>();
         private Set<MacAddress> intfMacs = new HashSet<MacAddress>();
         private Map<PortNumber, VlanId> portVlanPair = Maps.newHashMap();
 
         public void provision(boolean install, Set<Interface> intfs) {
             getInterfaceConfig(intfs);
-            processTableZero(install);
-            processTableOne(install);
-            processTableTwo(install);
-            processTableFour(install);
-            processTableFive(install);
-            processTableSix(install);
-            processTableNine(install);
         }
 
         private void getInterfaceConfig(Set<Interface> intfs) {
             log.info("Processing {} router interfaces", intfs.size());
             for (Interface intf : intfs) {
+                FilteringObjective.Builder fob = DefaultFilteringObjective.builder();
+                flowObjectiveService.filter(deviceId, Collections.singletonList(
+                        fob.addCondition(Criteria.matchEthDst(intf.mac()))
+                                .fromApp(appId).permit().add()));
                 intfIps.addAll(intf.ipAddresses());
                 intfMacs.add(intf.mac());
                 portVlanPair.put(intf.connectPoint().port(), intf.vlan());
             }
         }
 
-        private void processTableZero(boolean install) {
-            TrafficSelector.Builder selector;
-            TrafficTreatment.Builder treatment;
-
-            // Bcast rule
-            selector = DefaultTrafficSelector.builder();
-            treatment = DefaultTrafficTreatment.builder();
-
-            selector.matchEthDst(MacAddress.BROADCAST);
-            treatment.transition(FlowRule.Type.VLAN_MPLS);
-
-            FlowRule rule = new DefaultFlowRule(deviceId, selector.build(),
-                                                treatment.build(),
-                                                CONTROLLER_PRIORITY, appId, 0,
-                                                true, FlowRule.Type.FIRST);
-
-            FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            // Interface MACs
-            for (MacAddress mac : intfMacs) {
-                log.debug("adding rule for MAC: {}", mac);
-                selector = DefaultTrafficSelector.builder();
-                treatment = DefaultTrafficTreatment.builder();
-
-                selector.matchEthDst(mac);
-                treatment.transition(FlowRule.Type.VLAN_MPLS);
-
-                rule = new DefaultFlowRule(deviceId, selector.build(),
-                                           treatment.build(),
-                                           CONTROLLER_PRIORITY, appId, 0,
-                                           true, FlowRule.Type.FIRST);
-
-                ops = install ? ops.add(rule) : ops.remove(rule);
-            }
-
-            //Drop rule
-            selector = DefaultTrafficSelector.builder();
-            treatment = DefaultTrafficTreatment.builder();
-
-            treatment.drop();
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), DROP_PRIORITY, appId,
-                                       0, true, FlowRule.Type.FIRST);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            flowService.apply(ops.build(new FlowRuleOperationsContext() {
-                @Override
-                public void onSuccess(FlowRuleOperations ops) {
-                    log.info("Provisioned default table for bgp router");
-                }
-
-                @Override
-                public void onError(FlowRuleOperations ops) {
-                    log.info("Failed to provision default table for bgp router");
-                }
-            }));
-
-        }
-
-        private void processTableOne(boolean install) {
-            TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
-            TrafficTreatment.Builder treatment = DefaultTrafficTreatment
-                    .builder();
-            FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
-            FlowRule rule;
-
-            selector.matchVlanId(VlanId.ANY);
-            treatment.transition(FlowRule.Type.VLAN);
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), CONTROLLER_PRIORITY,
-                                       appId, 0, true, FlowRule.Type.VLAN_MPLS);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            flowService.apply(ops.build(new FlowRuleOperationsContext() {
-                @Override
-                public void onSuccess(FlowRuleOperations ops) {
-                    log.info("Provisioned vlan/mpls table for bgp router");
-                }
-
-                @Override
-                public void onError(FlowRuleOperations ops) {
-                    log.info(
-                            "Failed to provision vlan/mpls table for bgp router");
-                }
-            }));
-
-        }
-
-        private void processTableTwo(boolean install) {
-            TrafficSelector.Builder selector;
-            TrafficTreatment.Builder treatment;
-            FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
-            FlowRule rule;
-
-            //Interface Vlans
-            for (Map.Entry<PortNumber, VlanId> portVlan : portVlanPair.entrySet()) {
-                log.debug("adding rule for VLAN: {}", portVlan);
-                selector = DefaultTrafficSelector.builder();
-                treatment = DefaultTrafficTreatment.builder();
-
-                selector.matchVlanId(portVlan.getValue());
-                selector.matchInPort(portVlan.getKey());
-                treatment.transition(Type.ETHER);
-                treatment.deferred().popVlan();
-
-                rule = new DefaultFlowRule(deviceId, selector.build(),
-                                           treatment.build(), CONTROLLER_PRIORITY, appId,
-                                           0, true, FlowRule.Type.VLAN);
-
-                ops = install ? ops.add(rule) : ops.remove(rule);
-            }
-
-            //Drop rule
-            selector = DefaultTrafficSelector.builder();
-            treatment = DefaultTrafficTreatment.builder();
-
-            treatment.drop();
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), DROP_PRIORITY, appId,
-                                       0, true, FlowRule.Type.VLAN);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            flowService.apply(ops.build(new FlowRuleOperationsContext() {
-                @Override
-                public void onSuccess(FlowRuleOperations ops) {
-                    log.info("Provisioned vlan table for bgp router");
-                }
-
-                @Override
-                public void onError(FlowRuleOperations ops) {
-                    log.info("Failed to provision vlan table for bgp router");
-                }
-            }));
-        }
-
-        private void processTableFour(boolean install) {
-            TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
-            TrafficTreatment.Builder treatment = DefaultTrafficTreatment
-                    .builder();
-            FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
-            FlowRule rule;
-
-            selector.matchEthType(Ethernet.TYPE_ARP);
-            treatment.punt();
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), CONTROLLER_PRIORITY,
-                                       appId, 0, true, FlowRule.Type.ETHER);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            selector = DefaultTrafficSelector.builder();
-            treatment = DefaultTrafficTreatment.builder();
-
-            selector.matchEthType(Ethernet.TYPE_IPV4);
-            treatment.transition(FlowRule.Type.COS);
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), CONTROLLER_PRIORITY,
-                                       appId, 0, true, FlowRule.Type.ETHER);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            //Drop rule
-            selector = DefaultTrafficSelector.builder();
-            treatment = DefaultTrafficTreatment.builder();
-
-            treatment.drop();
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), DROP_PRIORITY, appId,
-                                       0, true, FlowRule.Type.ETHER);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            flowService.apply(ops.build(new FlowRuleOperationsContext() {
-                @Override
-                public void onSuccess(FlowRuleOperations ops) {
-                    log.info("Provisioned ether table for bgp router");
-                }
-
-                @Override
-                public void onError(FlowRuleOperations ops) {
-                    log.info("Failed to provision ether table for bgp router");
-                }
-            }));
-
-        }
-
-        private void processTableFive(boolean install) {
-            TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
-            TrafficTreatment.Builder treatment = DefaultTrafficTreatment
-                    .builder();
-            FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
-            FlowRule rule;
-
-            treatment.transition(FlowRule.Type.IP);
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), DROP_PRIORITY, appId,
-                                       0, true, FlowRule.Type.COS);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            flowService.apply(ops.build(new FlowRuleOperationsContext() {
-                @Override
-                public void onSuccess(FlowRuleOperations ops) {
-                    log.info("Provisioned cos table for bgp router");
-                }
-
-                @Override
-                public void onError(FlowRuleOperations ops) {
-                    log.info("Failed to provision cos table for bgp router");
-                }
-            }));
-
-        }
-
-        private void processTableSix(boolean install) {
-            TrafficSelector.Builder selector;
-            TrafficTreatment.Builder treatment;
-            FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
-            FlowRule rule;
-
-
-            //Interface IPs
-            for (InterfaceIpAddress ipAddr : intfIps) {
-                log.debug("adding rule for IPs: {}", ipAddr.ipAddress());
-                selector = DefaultTrafficSelector.builder();
-                treatment = DefaultTrafficTreatment.builder();
-
-                selector.matchEthType(Ethernet.TYPE_IPV4);
-                selector.matchIPDst(IpPrefix.valueOf(ipAddr.ipAddress(), 32));
-                treatment.transition(Type.ACL);
-
-                rule = new DefaultFlowRule(deviceId, selector.build(),
-                                           treatment.build(), HIGHEST_PRIORITY, appId,
-                                           0, true, FlowRule.Type.IP);
-
-                ops = install ? ops.add(rule) : ops.remove(rule);
-            }
-
-
-            //Drop rule
-            selector = DefaultTrafficSelector.builder();
-            treatment = DefaultTrafficTreatment.builder();
-
-            treatment.drop();
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), DROP_PRIORITY, appId,
-                                       0, true, FlowRule.Type.IP);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            flowService.apply(ops.build(new FlowRuleOperationsContext() {
-                @Override
-                public void onSuccess(FlowRuleOperations ops) {
-                    log.info("Provisioned FIB table for bgp router");
-                }
-
-                @Override
-                public void onError(FlowRuleOperations ops) {
-                    log.info("Failed to provision FIB table for bgp router");
-                }
-            }));
-        }
-
-        private void processTableNine(boolean install) {
-            TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
-            TrafficTreatment.Builder treatment = DefaultTrafficTreatment
-                    .builder();
-            FlowRuleOperations.Builder ops = FlowRuleOperations.builder();
-            FlowRule rule;
-
-            treatment.punt();
-
-            rule = new DefaultFlowRule(deviceId, selector.build(),
-                                       treatment.build(), CONTROLLER_PRIORITY,
-                                       appId, 0, true, FlowRule.Type.DEFAULT);
-
-            ops = install ? ops.add(rule) : ops.remove(rule);
-
-            flowService.apply(ops.build(new FlowRuleOperationsContext() {
-                @Override
-                public void onSuccess(FlowRuleOperations ops) {
-                    log.info("Provisioned Local table for bgp router");
-                }
 
-                @Override
-                public void onError(FlowRuleOperations ops) {
-                    log.info("Failed to provision Local table for bgp router");
-                }
-            }));
-        }
     }
 
     private class InternalGroupListener implements GroupListener {