Integrating INT into fabric pipeline

Change-Id: I9555de0852de79d1a3c7302ecaa17ff112fc5107
diff --git a/pipelines/fabric/src/main/resources/fabric.p4 b/pipelines/fabric/src/main/resources/fabric.p4
index 93e887e..06c16fd 100644
--- a/pipelines/fabric/src/main/resources/fabric.p4
+++ b/pipelines/fabric/src/main/resources/fabric.p4
@@ -30,6 +30,13 @@
 #include "include/spgw.p4"
 #endif // WITH_SPGW
 
+#ifdef WITH_INT
+#include "include/int_source.p4"
+#include "include/int_transit.p4"
+#include "include/int_sink.p4"
+#include "include/int_report.p4"
+#endif // WITH_INT
+
 control FabricIngress (
 inout parsed_headers_t hdr,
 inout fabric_metadata_t fabric_metadata,
@@ -54,7 +61,15 @@
         forwarding.apply(hdr, fabric_metadata, standard_metadata);
         next.apply(hdr, fabric_metadata, standard_metadata);
         port_counters_control.apply(hdr, fabric_metadata, standard_metadata);
-
+#ifdef WITH_INT
+        process_set_source_sink.apply(hdr, fabric_metadata, standard_metadata);
+        if(fabric_metadata.int_meta.sink == 1) {
+            // clone packet for Telemetry Report
+            #ifdef __TARGET_BMV2__
+            clone(CloneType.I2E, REPORT_MIRROR_SESSION_ID);
+            #endif
+        }
+#endif
     }
 }
 
@@ -71,6 +86,28 @@
         spgw_egress.apply(hdr.ipv4, hdr.gtpu_ipv4, hdr.gtpu_udp, hdr.gtpu,
                           fabric_metadata.spgw, standard_metadata);
 #endif // WITH_SPGW
+#ifdef WITH_INT
+        if (standard_metadata.ingress_port != CPU_PORT &&
+            standard_metadata.egress_port != CPU_PORT &&
+            (hdr.udp.isValid() || hdr.tcp.isValid())) {
+            if (fabric_metadata.int_meta.source == 1) {
+                process_int_source.apply(hdr, fabric_metadata, standard_metadata);
+            }
+            if(hdr.int_header.isValid()) {
+                process_int_transit.apply(hdr, fabric_metadata, standard_metadata);
+                // update underlay header based on INT information inserted
+                process_int_outer_encap.apply(hdr, fabric_metadata, standard_metadata);
+                if (standard_metadata.instance_type == PKT_INSTANCE_TYPE_INGRESS_CLONE) {
+                    /* send int report */
+                    process_int_report.apply(hdr, fabric_metadata, standard_metadata);
+                }
+                if (fabric_metadata.int_meta.sink == 1) {
+                    // int sink
+                    process_int_sink.apply(hdr, fabric_metadata, standard_metadata);
+                }
+            }
+        }
+#endif
     }
 }