eth_type moved outside ethernet header in fabric.p4
Change-Id: I3ae0813c5e8aba48767d5bb235fbbcfb75954010
(cherry picked from commit 693d76f189c59579837b559975c0ba767335dfc0)
diff --git a/pipelines/fabric/impl/src/main/resources/include/parser.p4 b/pipelines/fabric/impl/src/main/resources/include/parser.p4
index 3fadebf..ee6b13c 100644
--- a/pipelines/fabric/impl/src/main/resources/include/parser.p4
+++ b/pipelines/fabric/impl/src/main/resources/include/parser.p4
@@ -40,45 +40,40 @@
state parse_ethernet {
packet.extract(hdr.ethernet);
- fabric_metadata.last_eth_type = hdr.ethernet.eth_type;
fabric_metadata.vlan_id = DEFAULT_VLAN_ID;
- transition select(hdr.ethernet.eth_type){
+ transition select(packet.lookahead<bit<16>>()){
ETHERTYPE_QINQ: parse_vlan_tag;
ETHERTYPE_QINQ_NON_STD: parse_vlan_tag;
ETHERTYPE_VLAN: parse_vlan_tag;
- ETHERTYPE_MPLS: parse_mpls;
- ETHERTYPE_IPV4: pre_parse_ipv4;
-#ifdef WITH_IPV6
- ETHERTYPE_IPV6: pre_parse_ipv6;
-#endif // WITH_IPV6
- default: accept;
+ default: parse_eth_type;
}
}
state parse_vlan_tag {
packet.extract(hdr.vlan_tag);
- transition select(hdr.vlan_tag.eth_type){
- ETHERTYPE_IPV4: pre_parse_ipv4;
-#ifdef WITH_IPV6
- ETHERTYPE_IPV6: pre_parse_ipv6;
-#endif // WITH_IPV6
- ETHERTYPE_MPLS: parse_mpls;
-#if defined(WITH_XCONNECT) || defined(WITH_BNG) || defined(WITH_DOUBLE_VLAN_TERMINATION)
+ transition select(packet.lookahead<bit<16>>()){
+#if defined(WITH_XCONNECT) || defined(WITH_DOUBLE_VLAN_TERMINATION)
ETHERTYPE_VLAN: parse_inner_vlan_tag;
-#endif // WITH_XCONNECT
- default: accept;
+#endif // WITH_XCONNECT || WITH_DOUBLE_VLAN_TERMINATION
+ default: parse_eth_type;
}
}
-#if defined(WITH_XCONNECT) || defined(WITH_BNG) || defined(WITH_DOUBLE_VLAN_TERMINATION)
+#if defined(WITH_XCONNECT) || defined(WITH_DOUBLE_VLAN_TERMINATION)
state parse_inner_vlan_tag {
packet.extract(hdr.inner_vlan_tag);
- transition select(hdr.inner_vlan_tag.eth_type){
- ETHERTYPE_IPV4: pre_parse_ipv4;
-#ifdef WITH_IPV6
- ETHERTYPE_IPV6: pre_parse_ipv6;
-#endif // WITH_IPV6
+ transition parse_eth_type;
+ }
+#endif // WITH_XCONNECT || WITH_DOUBLE_VLAN_TERMINATION
+
+ state parse_eth_type {
+ packet.extract(hdr.eth_type);
+ transition select(hdr.eth_type.value) {
ETHERTYPE_MPLS: parse_mpls;
+ ETHERTYPE_IPV4: parse_ipv4;
+#ifdef WITH_IPV6
+ ETHERTYPE_IPV6: parse_ipv6;
+#endif // WITH_IPV6
#ifdef WITH_BNG
ETHERTYPE_PPPOED: parse_pppoe;
ETHERTYPE_PPPOES: parse_pppoe;
@@ -86,16 +81,15 @@
default: accept;
}
}
-#endif // WITH_XCONNECT || WITH_BNG || WITH_DOUBLE_VLAN_TERMINATION
#ifdef WITH_BNG
state parse_pppoe {
packet.extract(hdr.pppoe);
transition select(hdr.pppoe.protocol) {
PPPOE_PROTOCOL_MPLS: parse_mpls;
- PPPOE_PROTOCOL_IP4: pre_parse_ipv4;
+ PPPOE_PROTOCOL_IP4: parse_ipv4;
#ifdef WITH_IPV6
- PPPOE_PROTOCOL_IP6: pre_parse_ipv6;
+ PPPOE_PROTOCOL_IP6: parse_ipv6;
#endif // WITH_IPV6
default: accept;
}
@@ -104,7 +98,6 @@
state parse_mpls {
packet.extract(hdr.mpls);
- fabric_metadata.is_mpls = _TRUE;
fabric_metadata.mpls_label = hdr.mpls.label;
fabric_metadata.mpls_ttl = hdr.mpls.ttl;
// There is only one MPLS label for this fabric.
@@ -122,11 +115,6 @@
}
}
- // Intermediate state to set is_ipv4
- state pre_parse_ipv4 {
- fabric_metadata.is_ipv4 = _TRUE;
- transition parse_ipv4;
- }
state parse_ipv4 {
packet.extract(hdr.ipv4);
fabric_metadata.ip_proto = hdr.ipv4.protocol;
@@ -142,11 +130,6 @@
}
#ifdef WITH_IPV6
- // Intermediate state to set is_ipv6
- state pre_parse_ipv6 {
- fabric_metadata.is_ipv6 = _TRUE;
- transition parse_ipv6;
- }
state parse_ipv6 {
packet.extract(hdr.ipv6);
fabric_metadata.ip_proto = hdr.ipv6.next_hdr;
@@ -279,15 +262,17 @@
packet.emit(hdr.packet_in);
#ifdef WITH_INT_SINK
packet.emit(hdr.report_ethernet);
+ packet.emit(hdr.report_eth_type);
packet.emit(hdr.report_ipv4);
packet.emit(hdr.report_udp);
packet.emit(hdr.report_fixed_header);
#endif // WITH_INT_SINK
packet.emit(hdr.ethernet);
packet.emit(hdr.vlan_tag);
-#if defined(WITH_XCONNECT) || defined(WITH_BNG) || defined(WITH_DOUBLE_VLAN_TERMINATION)
+#if defined(WITH_XCONNECT) || defined(WITH_DOUBLE_VLAN_TERMINATION)
packet.emit(hdr.inner_vlan_tag);
-#endif // WITH_XCONNECT || WITH_BNG || WITH_DOUBLE_VLAN_TERMINATION
+#endif // WITH_XCONNECT || WITH_DOUBLE_VLAN_TERMINATION
+ packet.emit(hdr.eth_type);
#ifdef WITH_BNG
packet.emit(hdr.pppoe);
#endif // WITH_BNG
@@ -325,4 +310,4 @@
}
}
-#endif
+#endif
\ No newline at end of file