p4-hlir/test源码 stateful.p4 control_flow_opt.p4

stateful.p4

#include "includes/headers.p4"
#include "includes/parser.p4"

action hop(ttl, egress_spec) {
    add_to_field(ttl, -1);
    modify_field(standard_metadata.egress_spec, egress_spec, 0xFFFFFFFF);
}

action hop_ipv4(egress_spec) {
    hop(ipv4.ttl, egress_spec);
}

/* This should not be necessary if drop is allowed in table action specs */
action drop_pkt() {
    drop();
}

table ipv4_routing {
    reads {
        ipv4.dstAddr : lpm;
    }
    actions {
      drop_pkt;
      hop_ipv4;
    }
}

action act() {
    count(cnt1, 10);
}

table table_2 {
    reads {
        ipv4.dstAddr : lpm;
    }
    actions {
        act;
    }
}

counter cnt1 {
    type : packets;
    static : table_2;
    instance_count : 32;
}

register reg1 {
    width : 20;
    static : ipv4_routing;
    instance_count : 100;
    attributes : saturating, signed;
}

register reg2 {
    layout : ipv4_t;
    direct : ipv4_routing;
}
    

control ingress {
    apply(ipv4_routing);
    apply(table_2);
}

control egress {

}

control_flow_opt.p4

#include "includes/headers.p4"
#include "includes/parser.p4"

action hop(ttl, egress_spec) {
    add_to_field(ttl, -1);
    modify_field(standard_metadata.egress_spec, egress_spec, 0xFFFFFFFF);
}

action hop_ipv4(egress_spec) {
    hop(ipv4.ttl, egress_spec);
}

/* This should not be necessary if drop is allowed in table action specs */
action drop_pkt() {
    drop();
}

table ipv4_routing {
    reads {
        ipv4.dstAddr : lpm;
    }
    actions {
      drop_pkt;
      hop_ipv4;
    }
}

action act() {
    count(cnt1, 10);
}

action lala() {

}

table table_2 {
    reads {
        ipv4.dstAddr : lpm;
    }
    actions {
        act;
    }
}

table table_3 {
    reads {
        ipv4.dstAddr : lpm;
    }
    actions {
        lala;
    }
}

counter cnt1 {
    type : packets;
    static : table_2;
    instance_count : 32;
}

register reg1 {
    width : 20;
    static : ipv4_routing;
    instance_count : 100;
    attributes : saturating, signed;
}

register reg2 {
    layout : ipv4_t;
    direct : ipv4_routing;
}
    

control ingress {
    if (valid(ipv4)) {
        apply(ipv4_routing);
        if (valid(ipv4)) {
            apply(table_3);
        }
    }
    if (valid(ipv6)) {
        apply(table_2);
    }

}

control egress {

}

headers.p4

header_type ethernet_t {
    fields {
        dstAddr : 48;
        srcAddr : 48;
        etherType : 16;
    }
}

header_type vlan_tag_t {
    fields {
        pcp : 3;
        cfi : 1;
        vid : 12;
        etherType : 16;
    }
}

header_type ipv4_t {
    fields {
        version : 4;
        ihl : 4;
        diffserv : 8;
        totalLen : 16;
        identification : 16;
        flags : 3;
        fragOffset : 13;
        ttl : 8;
        protocol : 8;
        hdrChecksum : 16;
        srcAddr : 32;
        dstAddr: 32;
    }
}

header_type ipv6_t {
    fields {
        version : 4;
        trafficClass : 8;
        flowLabel : 20;
        payloadLen : 16;
        nextHdr : 8;
        hopLimit : 8;
        srcAddr : 128;
        dstAddr : 128;
    }
}

header_type icmp_t {
    fields {
        hdr_type : 8;
        code : 8;
        hdrChecksum : 16;
    }
}

header_type icmpv6_t {
    fields {
        hdr_type : 8;
        code : 8;
        hdrChecksum : 16;
    }
}

header_type tcp_t {
    fields {
        srcPort : 16;
        dstPort : 16;
        seqNo : 32;
        ackNo : 32;
        dataOffset : 4;
        res : 3;
        ecn : 3;
        ctrl : 6;
        window : 16;
        checksum : 16;
        urgentPtr : 16;
    }
}

header_type udp_t {
    fields {
        srcPort : 16;
        dstPort : 16;
        hdr_length : 16;
        checksum : 16;
    }
}

header_type routing_metadata_t {
    fields {
        drop : 1;
    }
}

parser.p4


metadata routing_metadata_t routing_metadata;

parser start {
    set_metadata(routing_metadata.drop, 0);
    return parse_ethernet;
}

#define ETHERTYPE_VLAN 0x8100, 0x9100, 0x9200, 0x9300
#define ETHERTYPE_IPV4 0x0800
#define ETHERTYPE_IPV6 0x86dd
#define ETHERTYPE_ARP 0x0806
#define ETHERTYPE_RARP 0x8035

header ethernet_t ethernet;

parser parse_ethernet {
    extract(ethernet);
    return select(latest.etherType) {
        ETHERTYPE_VLAN : parse_vlan;
        ETHERTYPE_IPV4 : parse_ipv4;
        ETHERTYPE_IPV6 : parse_ipv6;
    }
}

#define VLAN_DEPTH 4
header vlan_tag_t vlan_tag_[VLAN_DEPTH];

parser parse_vlan {
    extract(vlan_tag_[next]);
    return select(latest.etherType) {
        ETHERTYPE_VLAN : parse_vlan;
        ETHERTYPE_IPV4 : parse_ipv4;
        ETHERTYPE_IPV6 : parse_ipv6;
    }
}

#define IP_PROTOCOLS_ICMP 1
#define IP_PROTOCOLS_TCP 6
#define IP_PROTOCOLS_UDP 17
#define IP_PROTOCOLS_ICMPV6 58

header ipv4_t ipv4;

parser parse_ipv4 {
    extract(ipv4);
    return select(latest.fragOffset, latest.protocol) {
        IP_PROTOCOLS_ICMP : parse_icmp;
        IP_PROTOCOLS_TCP : parse_tcp;
        IP_PROTOCOLS_UDP : parse_udp;
    }
}

header ipv6_t ipv6;

parser parse_ipv6 {
    extract(ipv6);
    return select(latest.nextHdr) {
        IP_PROTOCOLS_ICMPV6 : parse_icmpv6;
        IP_PROTOCOLS_TCP : parse_tcp;
        IP_PROTOCOLS_UDP : parse_udp;
    }
}

header icmp_t icmp;

parser parse_icmp {
    extract(icmp);
    return ingress;
}

header icmpv6_t icmpv6;

parser parse_icmpv6 {
    extract(icmpv6);
    return ingress;
}

header tcp_t tcp;

parser parse_tcp {
    extract(tcp);
    return ingress;
}


header udp_t udp;

parser parse_udp {
    extract(udp);
    return ingress;
}

2016/12/2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值