运行示例:demo1.p4_16.p4
文件位置:
~/p4pktgen-master/examples/ demo1.p4_16.p4
同文件夹下有已经编译好的json文件:
~/p4pktgen-master/examples/ demo1.p4_16.json
可以看到 p4文件有ParserImpl(),verifyChecksum(),ingress(),egress(),computeChecksum(),DeparserImpl()六个模块,但是对于p4pktgen来说只关心ParserImpl() 和ingress(),剩下四个control的内容不关心。
test-cases.json是描述测试用例的数据文件,其中一个大括号括起来的是一个测试用例。
① 可得到"SUCCESS"和"UNINITIALIZED_READ"结果:
% p4pktgen examples/demo1.p4_16.json >& log1.txt
② 可得到"SUCCESS"和"INVALID_HEADER_WRITE"结果:
% p4pktgen -au examples/demo1.p4_16.json >& log2.txt
选项 –au是–allow-uninitialized-reads的缩写,让p4pktgen假设将所有域都初始化为0,这样就不会出现“result”:“UNINITIALIZED_READ”的情况。
③ 可得到"SUCCESS"和"NO_PACKET_FOUND"结果:
% p4pktgen examples/demo1-no-uninit-reads.p4_16.json >& log3.txt
-“result”:
- “SUCCESS”
在整个路径中没有发现任何问题 - “UNINITIALIZED_READ”
p4pktgen判定在该path中读取了一个或多个未初始化的域(P4_14语言将所有字段都自动初始化为0,除非在程序中指定了不同的初始值;然而,在P4_16中,语言规范并没有自动初始化所有字段,它只将header中隐藏的有效位初始化为false。) - “INVALID_HEADER_WRITE”
当header无效时header的某个字段被赋值了(在P4_14语言规范中,这被定义为一个no-op;在P4_16语言规范中,这种行为没有定义。) - “NO_PACKET_FOUND”
未能找到可能导致执行此路径的表项和输入包的组合。
-“expected_path”:
- “start”:标志解析开始
- “sink”: 标志解析结束
- [(“table名”, “该table要执行的action” )]
-“complete_path”
是否执行到controll ingress完成
在发包之前,两个table必须先有实体表项。simple_switch_CLI指令中有一个用于table_add的特殊语法的命令。
-“ss_cli_setup_cmds”
用于添加table表项的命令集合。
table_add 表名 action名 匹配项 => action要用到的参数
-“input_packet”
描述要输入给这个设备的packet对象的列表
- “port”: 入端口号
- “packet_len_bytes” : 包的长度
- “packet_hexstr” : 16进制表示的内容
-“uninitialized_read_data”
与前面的“result”呼应,给出了更多关于那些域的细节(一个列表,列表中的元素就代表了一个域)。
- "variable_name”:变量名
- “source_info”:该变量第一次赋值的地方,在这之前未初始化