Search code examples
sdnopenflowopenvswitchonos

A flow hit the OpenFlow flow table at OVS, improperly


My questions

a flow doesn't hit the OpenFlow flow table although its property matches the table perfectly. How can it happen? Could you give me a little hint for trouble shooting?

What I did for finding answers.

(1) I made a small network by using mininet,ONOS, Iperf.

(2) I generated a UDP flow (srcIP=10.0.0.3, dstIP=10.0.0.2, dstPORT=50000)

(3) I added flow rules to each mininet switch by using ONOS REST api. You can see two flow rules below the raw flow rules.

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

(4) I found that 2) flow rule have more match fields with higher priority, Most of packet in the flow hit 1) flow rule.

(5) I used Wireshark for check whether traffic is generated properly. However there is no problem.(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

Solution

  • Summary

    The cause is related with UDP fragmentation. So fragmented packet doesn't hit the table

    In detail

    (1) I set the UDP datagram 63k when sending. Then it is fragmented at IP layer.

    (2) Then the only first packet has UDP header information and only the packet hit the flow table properly

    (3) For solve this problem, I use the Jumbo frame which means OVS can handle the packet with larger MSS. We should also set NIC MSS (http://docs.openvswitch.org/en/latest/topics/dpdk/jumbo-frames/)

    And we update OVS version above 2.6.0 (it will be better to use http://docs.openvswitch.org/en/latest/intro/install/general/ than other sites that we can google)

    (5) After setting Jumbo frame, we can see the flow table hitting works properly for larger UDP datagram.