Fix VLAN and MPLS problem for fabric.p4

MPLS and VLAN won't work if we port fabric.p4 to PSA like architecture

Change-Id: Ife2ed4a09816981c712f4a3b78408536a21defee
diff --git a/pipelines/fabric/src/main/resources/include/control/forwarding.p4 b/pipelines/fabric/src/main/resources/include/control/forwarding.p4
index fc5f5b3..2993191 100644
--- a/pipelines/fabric/src/main/resources/include/control/forwarding.p4
+++ b/pipelines/fabric/src/main/resources/include/control/forwarding.p4
@@ -154,13 +154,10 @@
         if(fabric_metadata.fwd_type == FWD_BRIDGING) bridging.apply();
         else if (fabric_metadata.fwd_type == FWD_MPLS) {
             mpls.apply();
-            if (hdr.ipv4.isValid()) {
-                hdr.ethernet.ether_type = ETHERTYPE_IPV4;
-                fabric_metadata.original_ether_type = ETHERTYPE_IPV4;
-            } else {
-                hdr.ethernet.ether_type = ETHERTYPE_IPV6;
-                fabric_metadata.original_ether_type = ETHERTYPE_IPV6;
-            }
+
+            // TODO: IPv6
+            hdr.vlan_tag.ether_type = ETHERTYPE_IPV4;
+            fabric_metadata.original_ether_type = ETHERTYPE_IPV4;
         }
         else if (fabric_metadata.fwd_type == FWD_IPV4_UNICAST) unicast_v4.apply();
         else if (fabric_metadata.fwd_type == FWD_IPV4_MULTICAST) multicast_v4.apply();
diff --git a/pipelines/fabric/src/main/resources/include/control/next.p4 b/pipelines/fabric/src/main/resources/include/control/next.p4
index 79ac55b..2fbb866 100644
--- a/pipelines/fabric/src/main/resources/include/control/next.p4
+++ b/pipelines/fabric/src/main/resources/include/control/next.p4
@@ -63,7 +63,7 @@
     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.vlan_tag.ether_type = ETHERTYPE_MPLS;
         hdr.mpls.label = label;
         hdr.mpls.tc = tc;
         hdr.mpls.bos = 1w1; // BOS = TRUE
@@ -157,11 +157,7 @@
     apply {
         // pop internal vlan if the meta is set
         if (fabric_metadata.pop_vlan_at_egress) {
-            if (hdr.mpls.isValid()) {
-                hdr.ethernet.ether_type = ETHERTYPE_MPLS;
-            } else {
-                hdr.ethernet.ether_type = fabric_metadata.original_ether_type;
-            }
+            hdr.ethernet.ether_type = hdr.vlan_tag.ether_type;
             hdr.vlan_tag.setInvalid();
         }
     }
diff --git a/pipelines/fabric/src/main/resources/include/header.p4 b/pipelines/fabric/src/main/resources/include/header.p4
index df9958b..c177ad5 100644
--- a/pipelines/fabric/src/main/resources/include/header.p4
+++ b/pipelines/fabric/src/main/resources/include/header.p4
@@ -129,7 +129,6 @@
 struct parsed_headers_t {
     ethernet_t ethernet;
     vlan_tag_t vlan_tag;
-    vlan_tag_t inner_vlan_tag;
     mpls_t mpls;
     ipv4_t ipv4;
     ipv6_t ipv6;
diff --git a/pipelines/fabric/src/main/resources/include/parser.p4 b/pipelines/fabric/src/main/resources/include/parser.p4
index b5eadbc..67cc443 100644
--- a/pipelines/fabric/src/main/resources/include/parser.p4
+++ b/pipelines/fabric/src/main/resources/include/parser.p4
@@ -41,8 +41,6 @@
         packet.extract(hdr.ethernet);
         fabric_metadata.original_ether_type = hdr.ethernet.ether_type;
         transition select(hdr.ethernet.ether_type){
-            ETHERTYPE_QINQ_NON_STD: parse_vlan_tag;
-            ETHERTYPE_QINQ: parse_vlan_tag;
             ETHERTYPE_VLAN: parse_vlan_tag;
             ETHERTYPE_MPLS: parse_mpls;
             ETHERTYPE_ARP: parse_arp;
@@ -55,20 +53,10 @@
     state parse_vlan_tag {
         packet.extract(hdr.vlan_tag);
         transition select(hdr.vlan_tag.ether_type){
-            ETHERTYPE_VLAN: parse_inner_vlan_tag;
             ETHERTYPE_ARP: parse_arp;
             ETHERTYPE_IPV4: parse_ipv4;
             ETHERTYPE_IPV6: parse_ipv6;
-            default: accept;
-        }
-    }
-
-    state parse_inner_vlan_tag {
-        packet.extract(hdr.inner_vlan_tag);
-        transition select(hdr.vlan_tag.ether_type){
-            ETHERTYPE_ARP: parse_arp;
-            ETHERTYPE_IPV4: parse_ipv4;
-            ETHERTYPE_IPV6: parse_ipv6;
+            ETHERTYPE_MPLS: parse_mpls;
             default: accept;
         }
     }
@@ -139,7 +127,6 @@
         packet.emit(hdr.packet_in);
         packet.emit(hdr.ethernet);
         packet.emit(hdr.vlan_tag);
-        packet.emit(hdr.inner_vlan_tag);
         packet.emit(hdr.mpls);
         packet.emit(hdr.arp);
         packet.emit(hdr.ipv4);