[CORD-545] Adds MPLS L2 Port support in ONOS core

Change-Id: I61d9b2c14580b4995fdcc96571745bfd00ee586f
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionSelectorInterpreter.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionSelectorInterpreter.java
index 05c943c..388d0e6 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionSelectorInterpreter.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionSelectorInterpreter.java
@@ -26,11 +26,13 @@
 import org.projectfloodlight.openflow.protocol.OFFactory;
 import org.projectfloodlight.openflow.protocol.match.MatchField;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
+import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaMplsL2Port;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaOvid;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmVlanVid;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmVlanVidMasked;
 import org.projectfloodlight.openflow.types.OFVlanVidMatch;
 import org.projectfloodlight.openflow.types.U16;
+import org.projectfloodlight.openflow.types.U32;
 import org.projectfloodlight.openflow.types.VlanVid;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,6 +51,8 @@
             return true;
         } else if (extensionSelectorType.equals(ExtensionSelectorTypes.OFDPA_MATCH_OVID.type())) {
             return true;
+        } else if (extensionSelectorType.equals(ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type())) {
+            return true;
         }
         return false;
     }
@@ -82,6 +86,18 @@
                 short oVid = (short) (mask | vlanId.toShort());
                 return factory.oxms().ofdpaOvid(U16.ofRaw(oVid));
             }
+        } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type())) {
+            int mplsL2Port = ((Ofdpa3MatchMplsL2Port) extensionSelector).mplsL2Port();
+            /*
+             * 0x0000XXXX UNI Interface.
+             * 0x0002XXXX NNI Interface
+             */
+            if ((mplsL2Port >= 0 && mplsL2Port <= 0x0000FFFF) ||
+                    (mplsL2Port >= 0x00020000 && mplsL2Port <= 0x0002FFFF)) {
+                return factory.oxms().ofdpaMplsL2Port(U32.ofRaw(mplsL2Port));
+            }
+            throw new UnsupportedOperationException(
+                        "Unexpected ExtensionSelector: " + extensionSelector.toString());
         }
         throw new UnsupportedOperationException(
                 "Unexpected ExtensionSelector: " + extensionSelector.toString());
@@ -126,6 +142,28 @@
                 vlanId = VlanId.vlanId(oVid);
                 }
             return new Ofdpa3MatchOvid(vlanId);
+        } else if (oxm.getMatchField().equals(MatchField.OFDPA_MPLS_L2_PORT)) {
+            Integer mplsL2Port;
+            /*
+             * Supported but not used for now.
+             */
+            if (oxm.isMasked()) {
+                throw new UnsupportedOperationException(
+                        "Unexpected OXM: " + oxm.toString());
+            } else {
+                OFOxmOfdpaMplsL2Port mplsl2port = ((OFOxmOfdpaMplsL2Port) oxm);
+                mplsL2Port = mplsl2port.getValue().getRaw();
+                /*
+                 * 0x0000XXXX UNI Interface.
+                 * 0x0002XXXX NNI Interface
+                 */
+                if ((mplsL2Port >= 0 && mplsL2Port <= 0x0000FFFF) ||
+                        (mplsL2Port >= 0x00020000 && mplsL2Port <= 0x0002FFFF)) {
+                    return new Ofdpa3MatchMplsL2Port(mplsL2Port);
+                }
+                throw new UnsupportedOperationException(
+                        "Unexpected OXM: " + oxm.toString());
+            }
         }
         throw new UnsupportedOperationException(
                 "Unexpected OXM: " + oxm.toString());
@@ -137,6 +175,8 @@
             return new OfdpaMatchVlanVid();
         } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_OVID.type())) {
             return new Ofdpa3MatchOvid();
+        } else if (type.equals(ExtensionSelectorTypes.OFDPA_MATCH_MPLS_L2_PORT.type())) {
+            return new Ofdpa3MatchMplsL2Port();
         }
         throw new UnsupportedOperationException(
                 "Driver does not support extension type " + type.toString());