1.根据P4教程,将basic和basic_tunnel两个案例程序补充完整,成功运行。
-
basic:
- 补全代码:
/* TODO: add parser logic */ state start { 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 accept; } /* TODO: fill out code in action body */ standard_metadata.egress_spec = port; hdr.ethernet.srcAddr = hdr.ethernet.dstAddr; hdr.ethernet.dstAddr = dstAddr; hdr.ipv4.ttl = hdr.ipv4.ttl - 1; /* TODO: fix ingress control logic * - ipv4_lpm should be applied only when IPv4 header is valid */ if (hdr.ipv4.isValid()) { ipv4_lpm.apply(); } /* TODO: add deparser logic */ packet.emit(hdr.ethernet); packet.emit(hdr.ipv4);
-
接着打开终端,进入basic文件夹,输入make run编译运行:
-
ping通测试:
- ping h1 h2
- pingall
- 均成功,说明代码补充正确
- ping h1 h2
-
basic_tunnel
- 补全代码:
// TODO: Update the parser to parse the myTunnel header as well parser MyParser(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { state start { transition parse_ethernet; } state parse_ethernet { packet.extract(hdr.ethernet); transition select(hdr.ethernet.etherType) { TYPE_MYTUNNEL: parse_myTunnel; TYPE_IPV4: parse_ipv4; default: accept; } } state parse_myTunnel { packet.extract(hdr.myTunnel); transition select(hdr.myTunnel.proto_id) { TYPE_IPV4: parse_ipv4; default: accept; } } state parse_ipv4 { packet.extract(hdr.ipv4); transition accept; } } // TODO: declare a new action: myTunnel_forward(egressSpec_t port) action myTunnel_forward(egressSpec_t port) { standard_metadata.egress_spec = port; } // TODO: declare a new table: myTunnel_exact // TODO: also remember to add table entries! table myTunnel_exact { key = { hdr.myTunnel.dst_id: exact; } actions = { myTunnel_forward; drop; } size = 1024; default_action = drop(); } // TODO: Update control flow if (hdr.ipv4.isValid() && !hdr.myTunnel.isValid()) { ipv4_lpm.apply(); } if (hdr.myTunnel.isValid()) { myTunnel_exact.apply(); } // TODO: emit myTunnel header as well packet.emit(hdr.myTunnel);
-
make run:
-
xterm h1 h2打开主机终端
-
主机2输入./receive.py
-
主机2输入./send.py 10.0.2.2 "OHHHHH"
-
主机1界面
已经接收到了信息,内容包括以太头部,IP头部,TCP头部以及发送的信息 -
主机1输入./send.py 10.0.2.2 "OHHHH" --dst_id 2
-
主机2界面已经接收到了信息,内容包括以太头部,IP头部,TCP头部以及发送的信息
-
主机1输入./send.py 10.0.4.4 "OHHHH" --dst_id 2
-
主机2界面已经接收到了信息,内容包括以太头部,IP头部,TCP头部以及发送的信息
-
2.说明案例程序的编译执行流程
-
basic.p4
- make run
- 编译basic.p4 代码,生成basic.json
- 解析topology.json, 并且构建相应的mininet仿真拓扑
- 进入mininet命令行
-
basic_tunnel.p4
- make run
- 编译basic_tunnel.p4,生成basic_tunnel.json
- 构建相应的mininet仿真拓扑,三个交换机(s1,s2,s3),被配置成三角形,每个连接到一个主机(h1,h2,和h3)
- 该主机被分配的IP地址10.0.1.1,10.0.2.2和10.0.3.3
- 进入mininet命令行
3.提交你对P4的认识和体会。
P4模型的核心特征仍然是基于网络包处理的高速交换,它可以实现Packet通信相关事件的处理,灵活匹配,灵活编辑,以及小容量的高速存储查找。通过p4可以实现数据平面可编程,我们可以对超高速ASIC数据平面的转发行为与流水线逻辑进行自行定制,能很好地弥补OpenFlow只能依据现有的协议来定义流表项这个缺点。