searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

初识P4(三)

2023-10-24 03:14:20
19
0

my_ingress_headers_t

在P4编程中,my_ingress_headers_h是一个头文件,通常用于定义入口头部信息。这个文件可能包含一些预定义的头部字段,例如源IP地址、目标IP地址、源端口号、目标端口号等。这些头部字段可以在P4程序中使用,以便在处理网络数据包时获取相关信息。

假设我们有一个名为my_ingress_headers_h的头文件,其中定义了一些入口头部信息。以下是一个示例:

// my_ingress_headers_h.p4
header ethernet_t {
    bit<48> dstAddr; // 目标MAC地址
    bit<48> srcAddr; // 源MAC地址
    ethernetType type; // 以太网类型
}

header ipv4_t {
    bit<32> version; // IP版本号
    bit<8> ihl; // IP头部长度
    enum protocolType { tcp, udp } protocol; // 协议类型
    bit<16> totalLength; // 总长度
    bit<16> identification; // 标识符
    bit<32> flagsFragOffset; // 标志、片偏移量
    bit<32> ttl; // 生存时间
    bit<8> protocol; // 协议类型
    bit<16> headerChecksum; // 头部校验和
    bit<32> srcAddr; // 源IP地址
    bit<32> dstAddr; // 目标IP地址
}

header vlan_tag_h{
	bit<1>  pri;
	bit<3>  cri;
	bit<12> vid;
	bit<16> ether_type;
}
struct my_ingress_headers_t{
     ethernet_t  ethernet;
     ipv4_t         ipv4;
     vlan_tag_t  vlan_tag;
}

在ingress pipeline中所有的可编程组件均使用相同的两个结构体(my_ingress_headers_h 和 my_ingress_meatedata_h)进行信息交互。

解析器

下面定义一个ingress parser:

parser MyParser(packet_in pkt,
                out my_ingress_headers_t hdr,
                inout my_ingress_metadata_t meta,
                inout ingress_intrinsic_meatadata_t ig_intr_md) {

    state start {
        pkt.extract(ig_intr_md)
        okt.advance(...)
        transition parse_ethernet;
    }

    state parse_ethernet {
        packet.extract(hdr.ethernet);
        transition select(hdr.ethernet.etherType){
            TYPE_IPV4: parse_ipv4;
            default: accept;
        }
    }
    state parse_ipv4 {
        packet.extract(hdr.ipv4);
        transition select(hdr.ipv4.protocol){
            6 : parse_tcp;
            default: accept;
        }
    }

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

解析器函数可以按照上述例子写,包括数据包的提取、处理包内的信息等。其中packet_in是输入的字节流,使用自定义的结构体来处理headers和metadata。解析器总是以start状态开始,解析器结束总是以accept或者reject结束。内部可以通过select来选择对应的case(这个和c还是很像的)。

这篇文文章介绍了对应的头文件中结构体的定义,包括结构体内参数是怎么定义的。除此之外,还介绍了解析器是怎么编写的,解析器用于处理入口数据包并提取相关信息,从文中函数编写也可以很明确的理解这句话。

下一节继续介绍其他P4相关的内容。

0条评论
0 / 1000
w****m
3文章数
0粉丝数
w****m
3 文章 | 0 粉丝
w****m
3文章数
0粉丝数
w****m
3 文章 | 0 粉丝
原创

初识P4(三)

2023-10-24 03:14:20
19
0

my_ingress_headers_t

在P4编程中,my_ingress_headers_h是一个头文件,通常用于定义入口头部信息。这个文件可能包含一些预定义的头部字段,例如源IP地址、目标IP地址、源端口号、目标端口号等。这些头部字段可以在P4程序中使用,以便在处理网络数据包时获取相关信息。

假设我们有一个名为my_ingress_headers_h的头文件,其中定义了一些入口头部信息。以下是一个示例:

// my_ingress_headers_h.p4
header ethernet_t {
    bit<48> dstAddr; // 目标MAC地址
    bit<48> srcAddr; // 源MAC地址
    ethernetType type; // 以太网类型
}

header ipv4_t {
    bit<32> version; // IP版本号
    bit<8> ihl; // IP头部长度
    enum protocolType { tcp, udp } protocol; // 协议类型
    bit<16> totalLength; // 总长度
    bit<16> identification; // 标识符
    bit<32> flagsFragOffset; // 标志、片偏移量
    bit<32> ttl; // 生存时间
    bit<8> protocol; // 协议类型
    bit<16> headerChecksum; // 头部校验和
    bit<32> srcAddr; // 源IP地址
    bit<32> dstAddr; // 目标IP地址
}

header vlan_tag_h{
	bit<1>  pri;
	bit<3>  cri;
	bit<12> vid;
	bit<16> ether_type;
}
struct my_ingress_headers_t{
     ethernet_t  ethernet;
     ipv4_t         ipv4;
     vlan_tag_t  vlan_tag;
}

在ingress pipeline中所有的可编程组件均使用相同的两个结构体(my_ingress_headers_h 和 my_ingress_meatedata_h)进行信息交互。

解析器

下面定义一个ingress parser:

parser MyParser(packet_in pkt,
                out my_ingress_headers_t hdr,
                inout my_ingress_metadata_t meta,
                inout ingress_intrinsic_meatadata_t ig_intr_md) {

    state start {
        pkt.extract(ig_intr_md)
        okt.advance(...)
        transition parse_ethernet;
    }

    state parse_ethernet {
        packet.extract(hdr.ethernet);
        transition select(hdr.ethernet.etherType){
            TYPE_IPV4: parse_ipv4;
            default: accept;
        }
    }
    state parse_ipv4 {
        packet.extract(hdr.ipv4);
        transition select(hdr.ipv4.protocol){
            6 : parse_tcp;
            default: accept;
        }
    }

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

解析器函数可以按照上述例子写,包括数据包的提取、处理包内的信息等。其中packet_in是输入的字节流,使用自定义的结构体来处理headers和metadata。解析器总是以start状态开始,解析器结束总是以accept或者reject结束。内部可以通过select来选择对应的case(这个和c还是很像的)。

这篇文文章介绍了对应的头文件中结构体的定义,包括结构体内参数是怎么定义的。除此之外,还介绍了解析器是怎么编写的,解析器用于处理入口数据包并提取相关信息,从文中函数编写也可以很明确的理解这句话。

下一节继续介绍其他P4相关的内容。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0