INT transit for tofino (only with spgw enabled)

Because of recent update in p4c that uses different names for
P4 entities, requires manual search/replace in p4info/context.json

Change-Id: If7d6ea738710ef0c8786d9ff07f21f240fb6cedc
diff --git a/pipelines/fabric/src/main/resources/include/int_transit.p4 b/pipelines/fabric/src/main/resources/include/int_transit.p4
new file mode 100644
index 0000000..d09eab8
--- /dev/null
+++ b/pipelines/fabric/src/main/resources/include/int_transit.p4
@@ -0,0 +1,299 @@
+control int_metadata_insert(inout parsed_headers_t hdr,
+                            in int_metadata_t int_metadata,
+                            inout standard_metadata_t standard_metadata) {
+    // this implementation covers only INT instructions 0, 1, 2, 4, 5
+    action int_set_header_0() {
+        hdr.int_switch_id.setValid();
+        hdr.int_switch_id.switch_id = int_metadata.switch_id;
+    }
+
+    action int_set_header_1() {
+        hdr.int_port_ids.setValid();
+        hdr.int_port_ids.ingress_port_id =
+            (bit<16>) standard_metadata.ingress_port;
+        hdr.int_port_ids.egress_port_id =
+            (bit<16>) standard_metadata.egress_port;
+    }
+
+    action int_set_header_2() {
+        hdr.int_hop_latency.setValid();
+        hdr.int_hop_latency.hop_latency = 0xffffffff;
+    }
+
+    action int_set_header_3() { // Queue ID + Queue occupancy, not supported
+        hdr.int_q_occupancy.setValid();
+        hdr.int_q_occupancy.q_id = 0x00;
+        hdr.int_q_occupancy.q_occupancy = (bit<24>) standard_metadata.deq_qdepth;
+    }
+
+    action int_set_header_4() {
+        hdr.int_ingress_tstamp.setValid();
+        hdr.int_ingress_tstamp.ingress_tstamp =
+            (bit<32>) standard_metadata.ingress_global_timestamp;
+    }
+
+    action int_set_header_5() {
+        hdr.int_egress_tstamp.setValid();
+        hdr.int_egress_tstamp.egress_tstamp =
+            (bit<32>) standard_metadata.egress_global_timestamp;
+    }
+
+    action int_set_header_6() { // Queue ID + Queue congestion status, not supported
+        hdr.int_q_congestion.setValid();
+        hdr.int_q_congestion.q_id = 0xff;
+        hdr.int_q_congestion.q_congestion = 0xffffff;
+    }
+
+    action int_set_header_7() { // Egress port tx utilization, not supported
+        hdr.int_egress_port_tx_util.setValid();
+        hdr.int_egress_port_tx_util.egress_port_tx_util = 0xffffffff;
+    }
+
+    action int_set_header_0003_i0() {
+    }
+    action int_set_header_0003_i1() {
+        int_set_header_3();
+    }
+    action int_set_header_0003_i2() {
+        int_set_header_2();
+    }
+    action int_set_header_0003_i3() {
+        int_set_header_3();
+        int_set_header_2();
+    }
+    action int_set_header_0003_i4() {
+        int_set_header_1();
+    }
+    action int_set_header_0003_i5() {
+        int_set_header_3();
+        int_set_header_1();
+    }
+    action int_set_header_0003_i6() {
+        int_set_header_2();
+        int_set_header_1();
+    }
+    action int_set_header_0003_i7() {
+        int_set_header_3();
+        int_set_header_2();
+        int_set_header_1();
+    }
+    action int_set_header_0003_i8() {
+        int_set_header_0();
+    }
+    action int_set_header_0003_i9() {
+        int_set_header_3();
+        int_set_header_0();
+    }
+    action int_set_header_0003_i10() {
+        int_set_header_2();
+        int_set_header_0();
+    }
+    action int_set_header_0003_i11() {
+        int_set_header_3();
+        int_set_header_2();
+        int_set_header_0();
+    }
+    action int_set_header_0003_i12() {
+        int_set_header_1();
+        int_set_header_0();
+    }
+    action int_set_header_0003_i13() {
+        int_set_header_3();
+        int_set_header_1();
+        int_set_header_0();
+    }
+    action int_set_header_0003_i14() {
+        int_set_header_2();
+        int_set_header_1();
+        int_set_header_0();
+    }
+    action int_set_header_0003_i15() {
+        int_set_header_3();
+        int_set_header_2();
+        int_set_header_1();
+        int_set_header_0();
+    }
+
+    table int_inst_0003 {
+        key = {
+            hdr.int_header.instruction_mask_0003 : exact;
+        }
+        actions = {
+            int_set_header_0003_i0;
+            int_set_header_0003_i1;
+            int_set_header_0003_i2;
+            int_set_header_0003_i3;
+            int_set_header_0003_i4;
+            int_set_header_0003_i5;
+            int_set_header_0003_i6;
+            int_set_header_0003_i7;
+            int_set_header_0003_i8;
+            int_set_header_0003_i9;
+            int_set_header_0003_i10;
+            int_set_header_0003_i11;
+            int_set_header_0003_i12;
+            int_set_header_0003_i13;
+            int_set_header_0003_i14;
+            int_set_header_0003_i15;
+        }
+        default_action = int_set_header_0003_i0();
+        size = 17;
+    }
+
+    action int_set_header_0407_i0() {
+    }
+    action int_set_header_0407_i1() {
+        int_set_header_7();
+    }
+    action int_set_header_0407_i2() {
+        int_set_header_6();
+    }
+    action int_set_header_0407_i3() {
+        int_set_header_7();
+        int_set_header_6();
+    }
+    action int_set_header_0407_i4() {
+        int_set_header_5();
+    }
+    action int_set_header_0407_i5() {
+        int_set_header_7();
+        int_set_header_5();
+    }
+    action int_set_header_0407_i6() {
+        int_set_header_6();
+        int_set_header_5();
+    }
+    action int_set_header_0407_i7() {
+        int_set_header_7();
+        int_set_header_6();
+        int_set_header_5();
+    }
+    action int_set_header_0407_i8() {
+        int_set_header_4();
+    }
+    action int_set_header_0407_i9() {
+        int_set_header_7();
+        int_set_header_4();
+    }
+    action int_set_header_0407_i10() {
+        int_set_header_6();
+        int_set_header_4();
+    }
+    action int_set_header_0407_i11() {
+        int_set_header_7();
+        int_set_header_6();
+        int_set_header_4();
+    }
+    action int_set_header_0407_i12() {
+        int_set_header_5();
+        int_set_header_4();
+    }
+    action int_set_header_0407_i13() {
+        int_set_header_7();
+        int_set_header_5();
+        int_set_header_4();
+    }
+    action int_set_header_0407_i14() {
+        int_set_header_6();
+        int_set_header_5();
+        int_set_header_4();
+    }
+    action int_set_header_0407_i15() {
+        int_set_header_7();
+        int_set_header_6();
+        int_set_header_5();
+        int_set_header_4();
+    }
+
+    table int_inst_0407 {
+        key = {
+            hdr.int_header.instruction_mask_0407 : exact;
+        }
+        actions = {
+            int_set_header_0407_i0;
+            int_set_header_0407_i1;
+            int_set_header_0407_i2;
+            int_set_header_0407_i3;
+            int_set_header_0407_i4;
+            int_set_header_0407_i5;
+            int_set_header_0407_i6;
+            int_set_header_0407_i7;
+            int_set_header_0407_i8;
+            int_set_header_0407_i9;
+            int_set_header_0407_i10;
+            int_set_header_0407_i11;
+            int_set_header_0407_i12;
+            int_set_header_0407_i13;
+            int_set_header_0407_i14;
+            int_set_header_0407_i15;
+        }
+        default_action = int_set_header_0407_i0();
+        size = 17;
+    }
+
+    apply {
+        int_inst_0003.apply();
+        int_inst_0407.apply();
+    }
+}
+
+control int_outer_encap(inout parsed_headers_t hdr,
+                        in int_metadata_t int_metadata) {
+    action int_update_ipv4() {
+        hdr.ipv4.total_len = hdr.ipv4.total_len + int_metadata.insert_byte_cnt;
+    }
+    action int_update_udp() {
+        hdr.udp.len = hdr.udp.len + int_metadata.insert_byte_cnt;
+        hdr.udp.checksum = 0;
+    }
+    action int_update_shim() {
+        hdr.intl4_shim.len = hdr.intl4_shim.len + int_metadata.int_hdr_word_len;
+    }
+
+    apply{
+        if (hdr.ipv4.isValid()) {
+            int_update_ipv4();
+        }
+        if (hdr.udp.isValid()) {
+            int_update_udp();
+        }
+        if (hdr.intl4_shim.isValid()) {
+            int_update_shim();
+        }
+    }
+}
+
+control int_egress(inout parsed_headers_t hdr,
+                   inout int_metadata_t int_metadata,
+                   inout standard_metadata_t standard_metadata) {
+    action int_transit(bit<32> switch_id) {
+        int_metadata.switch_id = switch_id;
+        int_metadata.insert_byte_cnt = (bit<16>) (hdr.int_header.ins_cnt << 2);
+        int_metadata.int_hdr_word_len = (bit<8>) int_metadata.ins_cnt_tmp;
+    }
+    table int_prep {
+        key = {}
+        actions = {int_transit;}
+    }
+
+    action int_hop_cnt_increment() {
+        hdr.int_header.total_hop_cnt = hdr.int_header.total_hop_cnt + 1;
+    }
+    action int_hop_cnt_exceeded() {
+        hdr.int_header.e = 1;
+    }
+
+    apply{
+        if(hdr.int_header.isValid()) {
+            if(hdr.int_header.total_hop_cnt != hdr.int_header.max_hop_cnt &&
+               hdr.int_header.e == 0) {
+                int_hop_cnt_increment();
+                int_prep.apply();
+                int_metadata_insert.apply(hdr, int_metadata, standard_metadata);
+                int_outer_encap.apply(hdr, int_metadata);
+            } else {
+                int_hop_cnt_exceeded();
+            }
+        }
+    }
+}