引言
RYU 官方文档 很重要,耐心一点绝大多数情况下的问题都可以在官方文档处找到解决方案。
但官方文档也不是包含了所有说明,因此再次记录一下 RYU 在下发根据 ip 匹配的流表项以及删除流表命令时的一些坑和注意事项。
下发流表
下发根据以太网卡地址进行匹配转发的程序官方有提供,笔者在尝试将其修改为根据 ip 地址进行匹配转发,但当 RYU 下发时报错:unknown error xid …
原因:这是由于下发的流表不符合 OVS 规范导致,以下为笔者原来的代码。
# 根据 mac_to_port 构建 ip_to_port 表进行自学习,获得 ip_src、ip_dst
match = parser.OFPMatch(in_port=in_port, ipv4_src=ip_src, ipv4_dst=ip_dst)
actions = [parser.OFPActionOutput(out_port)]
self.add_flow(datapath, 1, match, actions)
经过查阅 OVS 官方文档后得知,正确的 ipv4 匹配域应该有如下字段:
# 根据 mac_to_port 构建 ip_to_port 表进行自学习,获得 ip_src、ip_dst
match = parser.OFPMatch(in_port=in_port, ipv4_src=(ip_src, '255.0.0.0'), ipv4_dst=ip_dst,
eth_type=0x0800)
actions = [parser.OFPActionOutput(out_port)]
self.add_flow(datapath, 1, match, actions)
OVS 官方文档只需要在 mininet 中输入 man 7 ovs-fields 即可。如果需要根据 tcp 或者 udp 等运输层协议进行匹配转发时,也需要先查一下需要那些匹配字段。
删除流表
RYU 可通过 OFPFlowMod 中的 command 字段下发删除流表命令。建议使用 command=OFPFC_DELETE,其删除要求偏高,如果使用 OFPFC_DELETE_STRICT 其删除要求最严格,基本上添加的是什么样,就要填什么样。这里只介绍 OFPFC_DELETE 方式。
首先 OFPFlowMod 中除 instructions 字段外全部需要填写。
mod = parser.OFPFlowMod(datapath, 0, 0, 0, ofproto.OFPFC_DELETE, 0, 0, 2,
ofproto.OFP_NO_BUFFER, out_port, ofproto.OFPG_ANY,
ofproto.OFPFF_SEND_FLOW_REM, match=match)
其次 match 域尽可能详细。
match = parser.OFPMatch(in_port=in_port, ipv4_src=(ip_src, '255.0.0.0'),
eth_type=0x0800, ipv4_dst=ip_dst)