| 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(); |
| } |
| } |
| } |
| } |