Segment Routing bug fix and enhancement

Bugfix:
- Add MPLS BOS matching
- Fix NPE caused by race between filter objective and broadcast next objective

Enhancement:
- Move group handler out from OFDPA pipeline
- Move ARP request from rule populator to packet request

Change-Id: I0ba40e10f7cb7f97277df86725fbd2546a62e890
diff --git a/drivers/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java b/drivers/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java
index dba4557..5be8a3f 100644
--- a/drivers/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java
+++ b/drivers/src/main/java/org/onosproject/driver/pipeline/SpringOpenTTP.java
@@ -51,6 +51,7 @@
 import org.onosproject.net.flow.criteria.EthCriterion;
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
 import org.onosproject.net.flow.criteria.IPCriterion;
+import org.onosproject.net.flow.criteria.MplsBosCriterion;
 import org.onosproject.net.flow.criteria.MplsCriterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
 import org.onosproject.net.flow.criteria.VlanIdCriterion;
@@ -593,9 +594,10 @@
                 .matchEthType(Ethernet.MPLS_UNICAST)
                 .matchMplsLabel(((MplsCriterion)
                    selector.getCriterion(Criterion.Type.MPLS_LABEL)).label());
-            //TODO: Add Match for BoS
-            //if (selector.getCriterion(Criterion.Type.MPLS_BOS) != null) {
-            //}
+            if (selector.getCriterion(Criterion.Type.MPLS_BOS) != null) {
+                filteredSelectorBuilder.matchMplsBos(((MplsBosCriterion)
+                        selector.getCriterion(Type.MPLS_BOS)).mplsBos());
+            }
             forTableId = mplsTableId;
             log.debug("processing MPLS specific forwarding objective:{} in dev:{}",
                     fwd.id(), deviceId);