TNSM_Latency_Prediction / code / control / ingress / 1_test / ingress_parser.p4
ingress_parser.p4
Raw
parser IngressParser(packet_in        packet,
    /* User */
    out my_ingress_headers_t          hdr,
    out my_ingress_metadata_t         meta,
    /* Intrinsic */
    out ingress_intrinsic_metadata_t  ig_intr_md)
{
    /* This is a mandatory state, required by Tofino Architecture */

    state start {
        packet.extract(ig_intr_md);
        packet.advance(PORT_METADATA_SIZE);
        packet.extract(hdr.ethernet);
        transition select(hdr.ethernet.etherType) {
            ETHERTYPE_VLAN_STAG : parse_outer_vlan; // Normally S-Tag
            ETHERTYPE_VLAN_CTAG : parse_inner_vlan; // Normally C-Tag
            ETHERTYPE_IPV4      : parse_ipv4;
            ETHERTYPE_IPV6      : parse_ipv6;
            default             : accept;
        }
    }

    state parse_outer_vlan {
        packet.extract(hdr.outer_vlan);
        transition select(hdr.outer_vlan.etherType) {
            ETHERTYPE_VLAN_CTAG: parse_inner_vlan;
            ETHERTYPE_IPV4:      parse_ipv4;
            ETHERTYPE_IPV6      : parse_ipv6;
            default:             accept;
        }
    }

    state parse_inner_vlan {
        packet.extract(hdr.inner_vlan);
        transition select(hdr.inner_vlan.etherType) {
            ETHERTYPE_IPV4:      parse_ipv4;
            ETHERTYPE_IPV6      : parse_ipv6;
            default:             accept;
        }
    }    

    state parse_ipv4 {
        packet.extract(hdr.ipv4);
        transition select(hdr.ipv4.protocol) {
            IPPROTO_UDP  : parse_udp;
            IPPROTO_TCP  : parse_tcp;
            default      : accept;
        }
    }

    state parse_ipv6 {
        packet.extract(hdr.ipv6);
        transition select(hdr.ipv6.nextHdr) {
            IPPROTO_UDP       : parse_udp;
            IPPROTO_TCP       : parse_tcp;
            default           : accept;
        }
    }

    state parse_tcp {
        packet.extract(hdr.tcp);
        transition accept;
    }

    state parse_udp {
        packet.extract(hdr.udp);
        transition accept;
    }
}