[ONOS-7242] Support MPLS by fabric.p4 pipeliner

Change-Id: I56a8f266e6d0afe5ad6737b8d0e399758fb75378
diff --git a/pipelines/fabric/src/main/resources/include/control/next.p4 b/pipelines/fabric/src/main/resources/include/control/next.p4
index 5ab18fa..2b3019c 100644
--- a/pipelines/fabric/src/main/resources/include/control/next.p4
+++ b/pipelines/fabric/src/main/resources/include/control/next.p4
@@ -73,6 +73,28 @@
         rewrite_smac(smac);
     }
 
+    action push_mpls (mpls_label_t label, bit<3> tc) {
+        //Suppose that the maximum number of label is one.
+        hdr.mpls.setValid();
+        hdr.ethernet.ether_type = ETHERTYPE_MPLS;
+        hdr.mpls.label = label;
+        hdr.mpls.tc = tc;
+        hdr.mpls.bos = 1; // BOS = TRUE
+        hdr.mpls.ttl = DEFAULT_MPLS_TTL;
+    }
+
+    action mpls_routing_v4 (port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
+                            mpls_label_t label) {
+        l3_routing(port_num, smac, dmac);
+        push_mpls(label, hdr.ipv4.diffserv[7:5]);
+    }
+
+    action mpls_routing_v6 (port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
+                            mpls_label_t label) {
+        l3_routing(port_num, smac, dmac);
+        push_mpls(label, hdr.ipv6.traffic_class[7:5]);
+    }
+
     table next_id_mapping {
         key = {
             fabric_metadata.next_id: exact;
@@ -112,6 +134,8 @@
 
         actions = {
             l3_routing;
+            mpls_routing_v4;
+            mpls_routing_v6;
         }
 
         implementation = ecmp_selector;