一个流在 OVS 不正确地命中了 OpenFlow 流 table
A flow hit the OpenFlow flow table at OVS, improperly
我的问题是一个流没有到达 OpenFlow 流 table 尽管它的 属性 与 table 完美匹配。
我用mininet
,ONOS
,Iperf
.
做了个小实验
我想根据srcIP、dstIP、UDP、dstPort查看流量路由。
因此,我生成了一个UDP流(srcIP=10.0.0.3,dstIP=10.0.0.2,dstPORT=50000)
我使用 ONOS
REST api.
向每个 mininet 交换机添加流规则
您可以在原始流规则下方看到两个流规则。
1) cookie=0x4c0000ef7faa8a, duration=332.717s, table=0, n_packets=8974,
n_bytes=557090858, idle_age=153, priority=65050,ip,nw_dst=10.0.0.2
actions=output:4
2) cookie=0x4c0000951b3b33, duration=332.636s, table=0, n_packets=10,
n_bytes=460,idle_age=168,priority=65111,udp,nw_src=10.0.0.3,nw_dst=10.0.0.2,
tp_dst=50000 actions=output:3
虽然2)流规则有更多的优先级更高的匹配字段,流中的大部分数据包都命中了1)流规则。
我使用 Wireshark
检查流量是否正常生成。不过没问题。(srcIP=10.0.0.3, dstIP=10.0.0.2, dstPORT=50000)
怎么会这样?你能给我一些解决问题的提示吗?
感谢阅读!
nimdrak@nimdrak-VirtualBox:~$ sudo ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
cookie=0x4c0000ef7faa8a, duration=332.717s, table=0, n_packets=8974, n_bytes=557090858, idle_age=153, priority=65050,ip,nw_dst=10.0.0.2 actions=output:4
cookie=0x4c0000ef7fb20c, duration=332.679s, table=0, n_packets=127, n_bytes=36814, idle_age=305, priority=65050,ip,nw_dst=10.0.0.4 actions=output:3
cookie=0x4c0000ef7f9b86, duration=332.736s, table=0, n_packets=518, n_bytes=102960, idle_age=138, priority=65050,ip,nw_dst=10.0.0.254 actions=output:5
cookie=0x4c0000ef7fae4b, duration=332.698s, table=0, n_packets=270, n_bytes=49059, idle_age=138, priority=65050,ip,nw_dst=10.0.0.3 actions=output:2
cookie=0x4c0000ef7fa6c9, duration=332.751s, table=0, n_packets=125, n_bytes=36646, idle_age=305, priority=65050,ip,nw_dst=10.0.0.1 actions=output:1
cookie=0x10000487f5557, duration=348.362s, table=0, n_packets=285, n_bytes=23085, idle_age=66, priority=40000,dl_type=0x88cc actions=CONTROLLER:65535
cookie=0x10000487f63a1, duration=348.362s, table=0, n_packets=285, n_bytes=23085, idle_age=66, priority=40000,dl_type=0x8942 actions=CONTROLLER:65535
cookie=0x10000488ebd5d, duration=348.362s, table=0, n_packets=12, n_bytes=504, idle_age=148, priority=40000,arp actions=CONTROLLER:65535
cookie=0x10000464443e2, duration=348.362s, table=0, n_packets=0, n_bytes=0, idle_age=348, priority=5,arp actions=CONTROLLER:65535
cookie=0x4c0000951a5275, duration=332.671s, table=0, n_packets=0, n_bytes=0, idle_age=332, priority=65050,udp,nw_src=10.0.0.3,nw_dst=10.0.0.1,tp_dst=50000 actions=output:1
cookie=0x4c0000951b3b33, duration=332.636s, table=0, n_packets=10, n_bytes=460, idle_age=168, priority=65111,udp,nw_src=10.0.0.3,nw_dst=10.0.0.2,tp_dst=50000 actions=output:3
我解决了这个问题。问题与 UDP 碎片
有关
在我写评论时,我发现只有小的 UDP 数据报正确地命中了流量 table。
换句话说,是因为UDP数据报太大了。
我设置了UDP数据报63k。然后在IP层分片。
然后唯一的第一个数据包有 UDP header 信息,只有数据包正确地命中流 table,正如我预期的那样。
为了解决这个问题,我使用了巨型帧,这意味着 OVS 可以处理具有更大 MSS 的数据包。
我们还应该设置NIC MSS。 (http://docs.openvswitch.org/en/latest/topics/dpdk/jumbo-frames/)
并且我们将OVS版本更新到2.6.0以上
(使用 http://docs.openvswitch.org/en/latest/intro/install/general/ 比我们可以 google 的其他网站更好)
设置巨型帧后,我们可以看到流 table 命中对于较大的 UDP 数据报可以正常工作。
我的问题是一个流没有到达 OpenFlow 流 table 尽管它的 属性 与 table 完美匹配。
我用mininet
,ONOS
,Iperf
.
我想根据srcIP、dstIP、UDP、dstPort查看流量路由。
因此,我生成了一个UDP流(srcIP=10.0.0.3,dstIP=10.0.0.2,dstPORT=50000)
我使用 ONOS
REST api.
您可以在原始流规则下方看到两个流规则。
1) cookie=0x4c0000ef7faa8a, duration=332.717s, table=0, n_packets=8974,
n_bytes=557090858, idle_age=153, priority=65050,ip,nw_dst=10.0.0.2
actions=output:4
2) cookie=0x4c0000951b3b33, duration=332.636s, table=0, n_packets=10,
n_bytes=460,idle_age=168,priority=65111,udp,nw_src=10.0.0.3,nw_dst=10.0.0.2,
tp_dst=50000 actions=output:3
虽然2)流规则有更多的优先级更高的匹配字段,流中的大部分数据包都命中了1)流规则。
我使用 Wireshark
检查流量是否正常生成。不过没问题。(srcIP=10.0.0.3, dstIP=10.0.0.2, dstPORT=50000)
怎么会这样?你能给我一些解决问题的提示吗?
感谢阅读!
nimdrak@nimdrak-VirtualBox:~$ sudo ovs-ofctl dump-flows s1
NXST_FLOW reply (xid=0x4):
cookie=0x4c0000ef7faa8a, duration=332.717s, table=0, n_packets=8974, n_bytes=557090858, idle_age=153, priority=65050,ip,nw_dst=10.0.0.2 actions=output:4
cookie=0x4c0000ef7fb20c, duration=332.679s, table=0, n_packets=127, n_bytes=36814, idle_age=305, priority=65050,ip,nw_dst=10.0.0.4 actions=output:3
cookie=0x4c0000ef7f9b86, duration=332.736s, table=0, n_packets=518, n_bytes=102960, idle_age=138, priority=65050,ip,nw_dst=10.0.0.254 actions=output:5
cookie=0x4c0000ef7fae4b, duration=332.698s, table=0, n_packets=270, n_bytes=49059, idle_age=138, priority=65050,ip,nw_dst=10.0.0.3 actions=output:2
cookie=0x4c0000ef7fa6c9, duration=332.751s, table=0, n_packets=125, n_bytes=36646, idle_age=305, priority=65050,ip,nw_dst=10.0.0.1 actions=output:1
cookie=0x10000487f5557, duration=348.362s, table=0, n_packets=285, n_bytes=23085, idle_age=66, priority=40000,dl_type=0x88cc actions=CONTROLLER:65535
cookie=0x10000487f63a1, duration=348.362s, table=0, n_packets=285, n_bytes=23085, idle_age=66, priority=40000,dl_type=0x8942 actions=CONTROLLER:65535
cookie=0x10000488ebd5d, duration=348.362s, table=0, n_packets=12, n_bytes=504, idle_age=148, priority=40000,arp actions=CONTROLLER:65535
cookie=0x10000464443e2, duration=348.362s, table=0, n_packets=0, n_bytes=0, idle_age=348, priority=5,arp actions=CONTROLLER:65535
cookie=0x4c0000951a5275, duration=332.671s, table=0, n_packets=0, n_bytes=0, idle_age=332, priority=65050,udp,nw_src=10.0.0.3,nw_dst=10.0.0.1,tp_dst=50000 actions=output:1
cookie=0x4c0000951b3b33, duration=332.636s, table=0, n_packets=10, n_bytes=460, idle_age=168, priority=65111,udp,nw_src=10.0.0.3,nw_dst=10.0.0.2,tp_dst=50000 actions=output:3
我解决了这个问题。问题与 UDP 碎片
有关在我写评论时,我发现只有小的 UDP 数据报正确地命中了流量 table。
换句话说,是因为UDP数据报太大了。
我设置了UDP数据报63k。然后在IP层分片。
然后唯一的第一个数据包有 UDP header 信息,只有数据包正确地命中流 table,正如我预期的那样。
为了解决这个问题,我使用了巨型帧,这意味着 OVS 可以处理具有更大 MSS 的数据包。
我们还应该设置NIC MSS。 (http://docs.openvswitch.org/en/latest/topics/dpdk/jumbo-frames/)
并且我们将OVS版本更新到2.6.0以上 (使用 http://docs.openvswitch.org/en/latest/intro/install/general/ 比我们可以 google 的其他网站更好)
设置巨型帧后,我们可以看到流 table 命中对于较大的 UDP 数据报可以正常工作。