Made GTP UPD checksum update optinal in SPGW

Change-Id: Icb38c47aeff533bd108a96b77e1b7c1ec866bc0a
diff --git a/pipelines/fabric/src/main/resources/fabric.p4 b/pipelines/fabric/src/main/resources/fabric.p4
index 56ab6e9..8205196 100644
--- a/pipelines/fabric/src/main/resources/fabric.p4
+++ b/pipelines/fabric/src/main/resources/fabric.p4
@@ -66,7 +66,7 @@
     apply {
         pkt_io_egress.apply(hdr, fabric_metadata, standard_metadata);
 #ifdef WITH_SPGW
-        spgw_egress.apply(hdr.gtpu_ipv4, hdr.gtpu_udp, hdr.gtpu,
+        spgw_egress.apply(hdr.ipv4, hdr.gtpu_ipv4, hdr.gtpu_udp, hdr.gtpu,
                           fabric_metadata.spgw, standard_metadata);
 #endif // WITH_SPGW
     }
diff --git a/pipelines/fabric/src/main/resources/include/spgw.p4 b/pipelines/fabric/src/main/resources/include/spgw.p4
index 3edca18..5637adf 100644
--- a/pipelines/fabric/src/main/resources/include/spgw.p4
+++ b/pipelines/fabric/src/main/resources/include/spgw.p4
@@ -199,6 +199,7 @@
 
 
 control spgw_egress(
+        in ipv4_t               ipv4,
         out ipv4_t              gtpu_ipv4,
         out udp_t               gtpu_udp,
         out gtpu_t              gtpu,
@@ -211,8 +212,8 @@
         gtpu_ipv4.version = IP_VERSION_4;
         gtpu_ipv4.ihl = IPV4_MIN_IHL;
         gtpu_ipv4.diffserv = 0;
-        gtpu_ipv4.total_len = ((bit<16>)std_meta.packet_length
-            - ETH_HDR_SIZE + IPV4_HDR_SIZE + UDP_HDR_SIZE + GTP_HDR_SIZE);
+        gtpu_ipv4.total_len = ipv4.total_len
+                + (IPV4_HDR_SIZE + UDP_HDR_SIZE + GTP_HDR_SIZE);
         gtpu_ipv4.identification = 0x1513; /* From NGIC */
         gtpu_ipv4.flags = 0;
         gtpu_ipv4.frag_offset = 0;
@@ -225,8 +226,8 @@
         gtpu_udp.setValid();
         gtpu_udp.src_port = UDP_PORT_GTPU;
         gtpu_udp.dst_port = UDP_PORT_GTPU;
-        gtpu_udp.len = ((bit<16>)std_meta.packet_length
-            - ETH_HDR_SIZE + UDP_HDR_SIZE + GTP_HDR_SIZE);
+        gtpu_udp.len = ipv4.total_len
+                + (UDP_HDR_SIZE + GTP_HDR_SIZE);
         gtpu_udp.checksum = 0; // Updated later
 
         gtpu.setValid();
@@ -237,7 +238,7 @@
         gtpu.seq_flag = 0;
         gtpu.npdu_flag = 0;
         gtpu.msgtype = GTP_GPDU;
-        gtpu.msglen = ((bit<16>)std_meta.packet_length - ETH_HDR_SIZE);
+        gtpu.msglen = ipv4.total_len;
         gtpu.teid = spgw_meta.teid;
     }
 
@@ -307,6 +308,7 @@
             HashAlgorithm.csum16
         );
 
+#ifdef WITH_SPGW_UDP_CSUM_UPDATE
         // Compute outer UDP checksum.
         update_checksum_with_payload(gtpu_udp.isValid(),
             {
@@ -327,6 +329,7 @@
             gtpu_udp.checksum,
             HashAlgorithm.csum16
         );
+#endif // WITH_SPGW_UDP_CSUM_UPDATE
     }
 }