CORD-349 Support VLAN cross-connect traffic

Change related to this topic:
- Support VLAN cross-connect traffic
    Utilize ports subjectClass to achieve. For non-xConnect port, set interface VLAN to -1
- Remove VLAN checking since we have multiple VLANs per port
- Hash the L2 interface group key generation to include VLAN as well
- Update the network-cfg.json sample

Other refactoring changes:
- Read next objective stores from srManager directly
- Use constant for flow priority
- CORD-267 Javadoc fix

Change-Id: I4ca8c2d9c8b3633a4a0101c5070d19343f7e5b90
diff --git a/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java b/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
index cce9741..e4b7ef5 100644
--- a/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
+++ b/drivers/src/main/java/org/onosproject/driver/pipeline/OFDPA2Pipeline.java
@@ -305,29 +305,35 @@
         }
 
         VlanId assignedVlan = null;
-        if (vidCriterion != null && vidCriterion.vlanId() == VlanId.NONE) {
-            // untagged packets are assigned vlans in OF-DPA
-            if (filt.meta() == null) {
-                log.error("Missing metadata in filtering objective required "
-                        + "for vlan assignment in dev {}", deviceId);
-                fail(filt, ObjectiveError.BADPARAMS);
-                return;
-            }
-            for (Instruction i : filt.meta().allInstructions()) {
-                if (i instanceof ModVlanIdInstruction) {
-                    assignedVlan = ((ModVlanIdInstruction) i).vlanId();
+        // For VLAN cross-connect packets, use the configured VLAN
+        if (vidCriterion != null) {
+            if (vidCriterion.vlanId() != VlanId.NONE) {
+                assignedVlan = vidCriterion.vlanId();
+
+            // For untagged packets, assign a VLAN ID
+            } else {
+                if (filt.meta() == null) {
+                    log.error("Missing metadata in filtering objective required " +
+                            "for vlan assignment in dev {}", deviceId);
+                    fail(filt, ObjectiveError.BADPARAMS);
+                    return;
                 }
-            }
-            if (assignedVlan == null) {
-                log.error("Driver requires an assigned vlan-id to tag incoming "
-                        + "untagged packets. Not processing vlan filters on "
-                        + "device {}", deviceId);
-                fail(filt, ObjectiveError.BADPARAMS);
-                return;
+                for (Instruction i : filt.meta().allInstructions()) {
+                    if (i instanceof ModVlanIdInstruction) {
+                        assignedVlan = ((ModVlanIdInstruction) i).vlanId();
+                    }
+                }
+                if (assignedVlan == null) {
+                    log.error("Driver requires an assigned vlan-id to tag incoming "
+                            + "untagged packets. Not processing vlan filters on "
+                            + "device {}", deviceId);
+                    fail(filt, ObjectiveError.BADPARAMS);
+                    return;
+                }
             }
         }
 
-        if (ethCriterion == null) {
+        if (ethCriterion == null || ethCriterion.mac().equals(MacAddress.NONE)) {
             log.debug("filtering objective missing dstMac, cannot program TMAC table");
         } else {
             for (FlowRule tmacRule : processEthDstFilter(portCriterion, ethCriterion,
@@ -340,8 +346,8 @@
         }
 
         if (ethCriterion == null || vidCriterion == null) {
-            log.debug("filtering objective missing dstMac or vlan, cannot program"
-                    + "Vlan Table");
+            log.debug("filtering objective missing dstMac or VLAN, "
+                    + "cannot program VLAN Table");
         } else {
             for (FlowRule vlanRule : processVlanIdFilter(portCriterion, vidCriterion,
                                                          assignedVlan,