TNSM_Latency_Prediction / code / parser / 0_most_basic / egress.p4
egress.p4
Raw
control Egress(
    /* User */
    inout my_egress_headers_t                          hdr,
    inout my_egress_metadata_t                         meta,
    /* Intrinsic */
    in    egress_intrinsic_metadata_t                  eg_intr_md,
    in    egress_intrinsic_metadata_from_parser_t      eg_prsr_md,
    inout egress_intrinsic_metadata_for_deparser_t     eg_dprsr_md,
    inout egress_intrinsic_metadata_for_output_port_t  eg_oport_md)
{
    
    action add_egs_mac_ts(bit<8> offset){

        eg_oport_md.update_delay_on_tx = 1;

        hdr.ptp_metadata.setValid();
        hdr.ptp_metadata.udp_cksum_byte_offset = 0;
        hdr.ptp_metadata.cf_byte_offset = offset;
        hdr.ptp_metadata.updated_cf = 0;
    }

    table timestamp_eg_t {
        key = {
        }
        actions = {
            add_egs_mac_ts;
            NoAction;
        }
        //default_action = add_egs_mac_ts(42); //Eth+IP+UDP = 14+20+8 = 42
        default_action = add_egs_mac_ts(0); 
        size           = 1;
    }
    
    apply{
        hdr.ts_egress.setValid();        
        hdr.ts_egress.ts3 = (bit<24>)eg_intr_md.enq_tstamp;
        hdr.ts_egress.ts4 = (bit<24>)eg_intr_md.deq_timedelta;
        hdr.ts_egress.ts5 = eg_prsr_md.global_tstamp;
        timestamp_eg_t.apply();

        /*
        eg_oport_md.update_delay_on_tx = 1;

        hdr.ptp_metadata.setValid();
        hdr.ptp_metadata.udp_cksum_byte_offset = 0;
        hdr.ptp_metadata.cf_byte_offset = 0;
        hdr.ptp_metadata.updated_cf = 0;        
        */
    }
}