例如:simple_router.p4app的p4app.json如下
{ "program": "simple_router.p4", "language": "p4-16", "targets": { "mininet": { "num-hosts": 2, "switch-config": "simple_router.config" } } }当有多个target时,需要指定一个默认的target,否则p4app运行其中的第一个target.
(Ps:纠正孙勇峰博客中说的随机运行其中一个)
注意其中的"use"字段,若没有指定"use"字段则默认为"use":"前面的targets名"
targets字段详解
compile-bmv2
将p4程序编译成bmv2目标,例如:样例compile_only.p4app
{ "program": "compile_only.p4", "language": "p4-14", "targets": { "compile-bmv2": { "compiler-flags": ["-v", "--p4runtime-file out.bin", "--p4runtime-format json"], "run-after-compile": ["cat out.bin"] } } }
mininet
编译一个P4程序,并加载到一个BMV2 simple_switch中,然后创建一个mininet实验环境.
支持以下可选的配置
"mininet": { "num-hosts": 2, "switch-config": "file.config" }mininet将创建一个星型网络拓扑,包含num-hosts个host并通过不同端口连接到你的P4模拟交换机.
你可以通过switch-config文件指定P4模拟交换机的启动配置,配置文件中是一系列 BMV2 simple_switch_CLI 命令.
multiswitch
multiswitch与mininet类似,编译P4程序并运行在mininet环境. multiswitch顾名思义可支持配置多个交换机、自定义拓扑并自定义在host上执行命令. 这些交换机默认自动配置L2/L3转发规则,用于所有host之间的互通. (前提是P4程序中包含ipv4_lpm、send_frame、forwar table)
例如:multiswitch.p4app
{ "program": "simple_router.p4", "language": "p4-16", "targets": { "multiswitch": { "auto-control-plane": true, "links": [["h1", "s1"], ["s1", "s2"], ["s2", "h2", 50]], "hosts": { "h1": { "cmd": "python echo_server.py $port", "startup_sleep": 0.2, "wait": false }, "h2": { "cmd": "python echo_client.py h1 $port $echo_msg", "wait": true } }, "parameters": { "port": 8000, "echo_msg": "foobar" } } } }该配置创建如下拓扑:
h1 <---> s1 <---> s2 <---> h2其中 s2-h2 链路人工配置了50ms的时延. 而host的可选配置选项如下:
cmd
在host上运行的可执行命令
wait
如果配置为true,表示等待此命令执行结束;配置为false,表示在后台运行此命令.
startup_sleep
启动命令执行完成后必须等待的时间(单位为秒)
latency
主机与交换机之间的时延. 可配置为纯数字(默认单位为秒)或具有时间单位的字符串(例如50ms或1s). 该配置将覆盖link对象中设置的时延.
限制:目前每个host只能连一个switch
stf (simple test framework)
编译P4程序并运行一个stf测试用例. stf是一种模拟网络测试框架,可以测试你的P4程序以确保达到预期行为.
例如:simple_counter.p4app
//json文件 "stf": { "test": "simple_counter.stf" } //stf文件 add test1 data.f1:0x01010101 c1_2(val1:0x01, val2:0x02) add test1 data.f1:0x02020202 c1_2(val1:0x10, val2:0x20) add test2 data.f2:0x03030303 c3_4(val3:0x03, val4:0x04, port:1) add test2 data.f2:0x04040404 c3_4(val3:0x30, val4:0x40, port:2) expect 1 01010101 03030303 01 02 03 04 packet 0 01010101 03030303 55 66 77 88 expect 2 01010101 04040404 01 02 30 40 packet 0 01010101 04040404 55 66 77 88 expect 1 02020202 03030303 10 20 03 04 packet 0 02020202 03030303 99 88 77 66 expect 2 02020202 04040404 10 20 30 40 packet 0 02020202 04040404 14 25 36 47“test”字段指定的配置文件必须使用stf格式编写. 但是目前还没有该格式的说明文档
custom
这是第三种编译P4程序并运行mininet实验环境的方法.
允许使用者在“program”字段指定自定义python程序. 可通过mininet的python api指定网络拓扑和配置.
例如:simple_routing.p4app
{ "program": "source_routing.p4", "language": "p4-14", "targets": { "custom": { "program": "topo.py" } } }在运行topo.py时,将默认执行以下操作:
PYTHONPATH=$PYTHONPATH:/scripts/mininet/ python2 topo.py \ --behavioral-exe simple_switch \ --json SOME_FILE \ --cli simple_switch_CLI同时可以指定其他参数传递给自定义拓扑程序,方法是将它们包含在 program 定义中,如下所示:
{ "program": "source_routing.p4", "language": "p4-14", "targets": { "custom": { "program": "topo.py --num-hosts 2 --switch-config simple_router.config" } } }可以通过python获取docker容器ID
import os container = os.environ['HOSTNAME'] print 'Run the switch CLI as follows:' print ' docker exec -t -i %s %s' % (container, args.cli) 高级功能