新版的p4编译器编译p4-14
p4c test.p4 -o meter --std p4-14 #p4-14和p4-16存在较大差异,参考p4代码时需注意
p4语言特性
- 无符号数bit类型的操作:此处我暂不明确是否包含 varbit
-
变长bit类型操作(只有有限的复制和比较操作)
p4程序处理流程
v1model
-
p4程序默认的包处理流程(不写入任何处理流程)
- 没有任何流表(默认的操作是 NoAction)
- 简单的模拟包
- 默认从入端口转发出去
- Egress控制块的作用(无法修改出端口)
(图片从 2014_arxiv_P4: Programming Protocol-Independent Packet Processor,即提出p4概念的论文中翻译而来)
v1model.p4源码阅读记录
-
外部对象(extern object)
-
extern void resubmit
(in T data); 在 igress 控制块中调用将保留标准和用户元数据(保留的是 igress 控制块结束时候的值,不是调用resubmit时候的值)
只能用于 igress 控制块,且只能执行一次(若多次调用,也只是重新提交一个包)
-
extern void recirculate
(in T data); 在 egress 控制块中调用将保留标准和用户元数据(保留的是 egress 控制块结束时候的值,不是调用recirculate时候的值)
只能用于 egress 控制块,且只能执行提供一次(若多次调用,也只是重新循环一个包)
-
extern void clone(in CloneType type, in bit<32> session);
不保留标准和用户元数据
本质上类似与调用 clone3
-
extern void clone3
(in CloneType type, in bit<32> session, in T data);
-
-
支持的原语操作(p4-14和p4-16系统提供的函数)
- modify_field
- modify_field_rng_uniform
- add_to_field
- subtract_from_field
- add
- subtract
- bit_xor
- bit_and
- shift_left
- shift_right
- drop
- mark_to_drop
- generate_digest
- add_header
- add_header_fast
- copy_header
- clone_ingress_pkt_to_egress
- clone_egress_pkt_to_egress
- resubmit
- recirculate
- modify_field_with_hash_based_offset
- no_op
- execute_meter
- count
- register_read提供
- register_write
- truncate
-
commit
-
19cd6964994671a6da027e07c77d7d30c6ec99ce
(Tue Jan 28 14:40:00 2020)- 添加寄存器的文档说明
- 更新元数据说明
- 修改了 resubmit 等外部变量的说明
-
652bc4af6d0dea30e51c84927c3b42e92c2b7ca3
(Mon Jul 8 15:55:15 2019)- 删除了六个标准元数据
- clone_spec
- drop
- recirculate_port
- lf_field_list
- resubmit_flag
- recirculate_flag
- 删除了六个标准元数据
-
858cdf483dd7d245060d8caedb329596b2477816
(Mon Jul 8 14:10:53 2019)- 修改了诸多 extern object 的注释
- extern counter
- extern meter
- extern void digest
(in bit<32> receiver, in T data); - extern void verify_checksum
(in bool condition, in T data, inout O checksum, HashAlgorithm algo); - extern void update_checksum
(in bool condition, in T data, inout O checksum, HashAlgorithm algo); - extern void verify_checksum_with_payload
- extern void update_checksum_with_payload
- extern void resubmit
(in T data); - extern void recirculate
(in T data); - extern void clone(in CloneType type, in bit<32> session);
- extern void clone3
(in CloneType type, in bit<32> session, in T data); - v1model 的 package 的各个部分
- 修改了诸多 extern object 的注释
-
bc7b75bd1892ab230c2ec2d125af8529cf092f4a
(Mon Apr 4 13:33:49 2016)- P4 v1.2 compiler prototype
- 诸多 extern object 添加的日志
-