capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
LOCAL(br0): addr:aa:55:aa:55:00:00
- config: 0
- state: 0
+ config: PORT_DOWN
+ state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
])
state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
LOCAL(br0): addr:aa:55:aa:55:00:0x
- config: 0
- state: 0
+ config: PORT_DOWN
+ state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0
])
AT_CHECK([STRIP_XIDS stdout], [0], [dnl
OFPST_PORT_DESC reply:
LOCAL(br0): addr:aa:55:aa:55:00:00
- config: 0
- state: 0
+ config: PORT_DOWN
+ state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
])
OVS_VSWITCHD_STOP
AT_CHECK([STRIP_XIDS stdout], [0], [dnl
OFPST_PORT_DESC reply (OF1.2):
LOCAL(br0): addr:aa:55:aa:55:00:00
- config: 0
- state: 0
+ config: PORT_DOWN
+ state: LINK_DOWN
speed: 0 Mbps now, 0 Mbps max
])
OVS_VSWITCHD_STOP
OVS_VSWITCHD_STOP
AT_CLEANUP
-AT_SETUP([ofproto - hard limits on flow table size (OpenFLow 1.0)])
+AT_SETUP([ofproto - hard limits on flow table size (OpenFlow 1.0)])
OVS_VSWITCHD_START
# Configure a maximum of 4 flows.
AT_CHECK(
OVS_VSWITCHD_STOP
AT_CLEANUP
-AT_SETUP([ofproto - hard limits on flow table size (OpenFLow 1.2)])
+AT_SETUP([ofproto - hard limits on flow table size (OpenFlow 1.2)])
OVS_VSWITCHD_START
# Configure a maximum of 4 flows.
AT_CHECK(
OVS_VSWITCHD_STOP
AT_CLEANUP
+AT_SETUP([ofproto - eviction upon table overflow, with modified hard timeout])
+OVS_VSWITCHD_START
+# Configure a maximum of 4 flows.
+AT_CHECK(
+ [ovs-vsctl \
+ -- --id=@t0 create Flow_Table flow-limit=4 overflow-policy=evict \
+ -- set bridge br0 flow_tables:0=@t0 \
+ | ${PERL} $srcdir/uuidfilt.pl],
+ [0], [<0>
+])
+ovs-appctl time/stop
+# Add 4 flows.
+for in_port in 4 3 2 1; do
+ ovs-ofctl add-flow br0 hard_timeout=$((10 + in_port * 3)),in_port=$in_port,actions=drop
+done
+AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
+ hard_timeout=13, in_port=1 actions=drop
+ hard_timeout=16, in_port=2 actions=drop
+ hard_timeout=19, in_port=3 actions=drop
+ hard_timeout=22, in_port=4 actions=drop
+NXST_FLOW reply:
+])
+# Sleep and modify the one that expires soonest
+ovs-appctl time/warp 5000
+AT_CHECK([ovs-ofctl mod-flows br0 in_port=1,actions=drop])
+# At this point the table would looks like:
+# in_port seconds to expire
+# 1 13
+# 2 11
+# 3 14
+# 4 17
+ovs-appctl time/warp 2000
+# Adding another flow will cause the one that expires soonest to be evicted.
+AT_CHECK([ovs-ofctl add-flow br0 in_port=5,actions=drop])
+AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
+ hard_timeout=13, in_port=1 actions=drop
+ hard_timeout=19, in_port=3 actions=drop
+ hard_timeout=22, in_port=4 actions=drop
+ in_port=5 actions=drop
+NXST_FLOW reply:
+])
+OVS_VSWITCHD_STOP
+AT_CLEANUP
+
+AT_SETUP([ofproto - eviction upon table overflow, with modified idle timeout])
+OVS_VSWITCHD_START([add-port br0 p1 -- set interface p1 type=dummy ofport_request=1])
+# Configure a maximum of 4 flows.
+AT_CHECK(
+ [ovs-vsctl \
+ -- --id=@t0 create Flow_Table flow-limit=4 overflow-policy=evict \
+ -- set bridge br0 flow_tables:0=@t0 \
+ | ${PERL} $srcdir/uuidfilt.pl],
+ [0], [<0>
+])
+# Add 4 flows.
+for in_port in 4 3 2 1; do
+ ovs-ofctl add-flow br0 idle_timeout=$((10 + in_port * 3)),in_port=$in_port,actions=drop
+done
+ovs-appctl time/stop
+AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
+ idle_timeout=13, in_port=1 actions=drop
+ idle_timeout=16, in_port=2 actions=drop
+ idle_timeout=19, in_port=3 actions=drop
+ idle_timeout=22, in_port=4 actions=drop
+NXST_FLOW reply:
+])
+# Sleep and receive on the flow that expires soonest
+ovs-appctl time/warp 5000
+AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1)'])
+# At this point the table would looks like:
+# in_port seconds to expire
+# 1 13
+# 2 11
+# 3 14
+# 4 17
+ovs-appctl time/warp 2000
+# Adding another flow will cause the one that expires soonest to be evicted.
+AT_CHECK([ovs-ofctl add-flow br0 in_port=5,actions=drop])
+AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
+ idle_timeout=19, in_port=3 actions=drop
+ idle_timeout=22, in_port=4 actions=drop
+ in_port=5 actions=drop
+ n_packets=1, n_bytes=60, idle_timeout=13, in_port=1 actions=drop
+NXST_FLOW reply:
+])
+OVS_VSWITCHD_STOP
+AT_CLEANUP
+
AT_SETUP([ofproto - asynchronous message control (OpenFlow 1.0)])
OVS_VSWITCHD_START
AT_CHECK([ovs-ofctl -P openflow10 monitor br0 --detach --no-chdir --pidfile])
ovs-appctl -t ovs-ofctl ofctl/barrier
ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
: > expout
+: > experr
# find out current role
ovs-appctl -t ovs-ofctl ofctl/send 031800180000000200000000000000000000000000000000
-echo >>expout "send: OFPT_ROLE_REQUEST (OF1.2) (xid=0x2): role=nochange"
+echo >>experr "send: OFPT_ROLE_REQUEST (OF1.2) (xid=0x2): role=nochange"
echo >>expout "OFPT_ROLE_REPLY (OF1.2) (xid=0x2): role=equal"
# Become slave (generation_id is initially undefined, so 2^63+2 should not be stale)
ovs-appctl -t ovs-ofctl ofctl/send 031800180000000300000003000000008000000000000002
-echo >>expout "send: OFPT_ROLE_REQUEST (OF1.2) (xid=0x3): role=slave generation_id=9223372036854775810"
+echo >>experr "send: OFPT_ROLE_REQUEST (OF1.2) (xid=0x3): role=slave generation_id=9223372036854775810"
echo >>expout "OFPT_ROLE_REPLY (OF1.2) (xid=0x3): role=slave generation_id=9223372036854775810"
# Try to become the master using a stale generation ID
ovs-appctl -t ovs-ofctl ofctl/send 031800180000000400000002000000000000000000000002
-echo >>expout "send: OFPT_ROLE_REQUEST (OF1.2) (xid=0x4): role=master generation_id=2"
+echo >>experr "send: OFPT_ROLE_REQUEST (OF1.2) (xid=0x4): role=master generation_id=2"
echo >>expout "OFPT_ERROR (OF1.2) (xid=0x4): OFPRRFC_STALE"
echo >>expout "OFPT_ROLE_REQUEST (OF1.2) (xid=0x4): role=master generation_id=2"
# Become master using a valid generation ID
ovs-appctl -t ovs-ofctl ofctl/send 031800180000000500000002000000000000000000000001
-echo >>expout "send: OFPT_ROLE_REQUEST (OF1.2) (xid=0x5): role=master generation_id=1"
+echo >>experr "send: OFPT_ROLE_REQUEST (OF1.2) (xid=0x5): role=master generation_id=1"
echo >>expout "OFPT_ROLE_REPLY (OF1.2) (xid=0x5): role=master generation_id=1"
ovs-appctl -t ovs-ofctl ofctl/barrier
echo >>expout "OFPT_BARRIER_REPLY (OF1.2) (xid=0x3):"
-AT_CHECK([cat monitor.log], [0], [expout])
+AT_CHECK([grep -v '^send:' monitor.log], [0], [expout])
+mv experr expout
+AT_CHECK([grep '^send:' monitor.log], [0], [expout])
ovs-appctl -t ovs-ofctl exit
OVS_VSWITCHD_STOP
queue_size=`expr $rmem_max + 128 \* 1024`
echo rmem_max=$rmem_max queue_size=$queue_size
+# If there's too much queuing skip the test to avoid timing out.
+AT_SKIP_IF([test $rmem_max -gt 1048576])
+
# Each flow update message takes up at least 48 bytes of space in queues
# and in practice more than that.
n_msgs=`expr $queue_size / 48`
AT_CHECK([ovs-ofctl del-flows br0 cookie=1/-1])
ovs-appctl -t ovs-ofctl ofctl/unblock
-ovs-appctl -t ovs-ofctl ofctl/barrier
+
+# Wait for the connection resumed.
+# A barrier doesn't work for this purpose.
+# https://www.mail-archive.com/dev@openvswitch.org/msg27013.html
+# https://www.mail-archive.com/dev@openvswitch.org/msg27675.html
+OVS_WAIT_UNTIL([grep NXT_FLOW_MONITOR_RESUMED monitor.log])
ovs-appctl -t ovs-ofctl exit