On Wed, Nov 28, 2012 at 11:06:56PM -0800, Ben Pfaff wrote:
> From: Simon Horman <[email protected]>
>
> These were useful in isolating a number of bugs.
>
> Signed-off-by: Simon Horman <[email protected]>
> Signed-off-by: Ben Pfaff <[email protected]>
No objections here.
> ---
> tests/ofproto-macros.at | 2 +-
> tests/ofproto.at | 595
> ++++++++++++++++++++++++++++++++++++++++++++---
> 2 files changed, 562 insertions(+), 35 deletions(-)
>
> diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
> index ee0d853..cba68a1 100644
> --- a/tests/ofproto-macros.at
> +++ b/tests/ofproto-macros.at
> @@ -61,7 +61,7 @@ m4_define([OVS_VSWITCHD_START],
> /ofproto|INFO|datapath ID changed to fedcba9876543210/d']])
>
> dnl Add bridges, ports, etc.
> - AT_CHECK([ovs-vsctl -- add-br br0 -- set bridge br0 datapath-type=dummy
> other-config:datapath-id=fedcba9876543210
> other-config:hwaddr=aa:55:aa:55:00:00 fail-mode=secure -- $1 m4_if([$2], [],
> [], [| perl $srcdir/uuidfilt.pl])], [0], [$2])
> + AT_CHECK([ovs-vsctl -- add-br br0 -- set bridge br0 datapath-type=dummy
> other-config:datapath-id=fedcba9876543210
> other-config:hwaddr=aa:55:aa:55:00:00 protocols=[[OpenFlow10,OpenFlow12]]
> fail-mode=secure -- $1 m4_if([$2], [], [], [| perl $srcdir/uuidfilt.pl])],
> [0], [$2])
> ])
>
> m4_define([OVS_VSWITCHD_STOP],
> diff --git a/tests/ofproto.at b/tests/ofproto.at
> index 01792f3..107e366 100644
> --- a/tests/ofproto.at
> +++ b/tests/ofproto.at
> @@ -56,7 +56,7 @@ AT_CLEANUP
>
> dnl This is really bare-bones.
> dnl It at least checks request and reply serialization and deserialization.
> -AT_SETUP([ofproto - port stats])
> +AT_SETUP([ofproto - port stats - (OpenFlow 1.0)])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-ofctl -vwarn dump-ports br0], [0], [stdout])
> AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> @@ -67,9 +67,20 @@ OFPST_PORT reply: 1 ports
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> +AT_SETUP([ofproto - port stats - (OpenFlow 1.2)])
> +OVS_VSWITCHD_START
> +AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn dump-ports br0], [0], [stdout])
> +AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> +OFPST_PORT reply (OF1.2): 1 ports
> + port 65534: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0
> + tx pkts=0, bytes=0, drop=0, errs=0, coll=0
> +])
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> dnl This is really bare-bones.
> dnl It at least checks request and reply serialization and deserialization.
> -AT_SETUP([ofproto - port-desc stats])
> +AT_SETUP([ofproto - port-desc stats (OpenFlow 1.0)])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-ofctl -vwarn dump-ports-desc br0], [0], [stdout])
> AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> @@ -84,7 +95,22 @@ AT_CLEANUP
>
> dnl This is really bare-bones.
> dnl It at least checks request and reply serialization and deserialization.
> -AT_SETUP([ofproto - queue stats])
> +AT_SETUP([ofproto - port-desc stats (OpenFlow 1.2)])
> +OVS_VSWITCHD_START
> +AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn dump-ports-desc br0], [0], [stdout])
> +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
> + speed: 0 Mbps now, 0 Mbps max
> +])
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> +dnl This is really bare-bones.
> +dnl It at least checks request and reply serialization and deserialization.
> +AT_SETUP([ofproto - queue stats - (OpenFlow 1.0)])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-ofctl -vwarn queue-stats br0], [0], [stdout])
> AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> @@ -101,7 +127,24 @@ OFPST_QUEUE request (xid=0x2):port=10 queue=ALL
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> -AT_SETUP([ofproto - mod-port])
> +AT_SETUP([ofproto - queue stats - (OpenFlow 1.2)])
> +OVS_VSWITCHD_START
> +AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn queue-stats br0], [0], [stdout])
> +AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> +OFPST_QUEUE reply (OF1.2): 0 queues
> +])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn queue-stats br0 ALL 5], [0],
> + [OFPT_ERROR (OF1.2) (xid=0x2): OFPQOFC_BAD_QUEUE
> +OFPST_QUEUE request (OF1.2) (xid=0x2):port=ANY queue=5
> +])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn queue-stats br0 10], [0],
> + [OFPT_ERROR (OF1.2) (xid=0x2): OFPQOFC_BAD_PORT
> +OFPST_QUEUE request (OF1.2) (xid=0x2):port=10 queue=ALL
> +])
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> +AT_SETUP([ofproto - mod-port (OpenFlow 1.0)])
> OVS_VSWITCHD_START
> for command_config_state in \
> 'up 0 0' \
> @@ -135,6 +178,37 @@ done
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> +AT_SETUP([ofproto - mod-port (OpenFlow 1.2)])
> +OVS_VSWITCHD_START
> +for command_config_state in \
> + 'up 0 0' \
> + 'down PORT_DOWN LINK_DOWN' \
> + 'no-receive PORT_DOWN,NO_RECV LINK_DOWN' \
> + 'no-forward PORT_DOWN,NO_RECV,NO_FWD LINK_DOWN' \
> + 'no-packet-in PORT_DOWN,NO_RECV,NO_FWD,NO_PACKET_IN LINK_DOWN' \
> + 'forward PORT_DOWN,NO_RECV,NO_PACKET_IN LINK_DOWN' \
> + 'packet-in PORT_DOWN,NO_RECV LINK_DOWN' \
> + 'up NO_RECV 0' \
> + 'receive 0 0'
> +do
> + set $command_config_state
> + command=$[1] config=`echo $[2] | sed 's/,/ /g'` state=$[3]
> + AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn mod-port br0 br0 $command])
> + AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn show br0], [0], [stdout])
> + AT_CHECK_UNQUOTED([STRIP_XIDS stdout], [0], [dnl
> +OFPT_FEATURES_REPLY (OF1.2): dpid:fedcba9876543210
> +n_tables:254, n_buffers:256
> +capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS
> + LOCAL(br0): addr:aa:55:aa:55:00:00
> + config: $config
> + state: $state
> + speed: 0 Mbps now, 0 Mbps max
> +OFPT_GET_CONFIG_REPLY (OF1.2): frags=normal miss_send_len=0
> +])
> +done
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> AT_SETUP([ofproto - basic flow_mod commands (NXM)])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip], [0], [NXST_FLOW reply:
> @@ -190,31 +264,26 @@ NXST_FLOW reply:
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> -AT_SETUP([ofproto - dump flows with cookie])
> +AT_SETUP([ofproto - basic flow_mod commands (OpenFlow 1.2)])
> OVS_VSWITCHD_START
> -AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
> -AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=2,actions=1])
> -AT_CHECK([ovs-ofctl add-flow br0 cookie=0x3,in_port=3,actions=1])
> -AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
> - cookie=0x1, in_port=1 actions=output:1
> - cookie=0x2, in_port=2 actions=output:1
> - cookie=0x3, in_port=3 actions=output:1
> -NXST_FLOW reply:
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip], [0],
> [OFPST_FLOW reply (OF1.2):
> ])
> -AT_CHECK([ovs-ofctl dump-aggregate br0 table=0 | STRIP_XIDS], [0], [dnl
> -NXST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=3
> -])
> -AT_CHECK([ovs-ofctl dump-flows br0 cookie=0x3/-1 | ofctl_strip | sort], [0],
> [dnl
> - cookie=0x3, in_port=3 actions=output:1
> -NXST_FLOW reply:
> +AT_CHECK([echo 'in_port=2,actions=1' | ovs-ofctl -O OpenFlow12 add-flows br0
> -])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=1,actions=2])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 table=1,in_port=4,actions=3])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + in_port=1 actions=output:2
> + in_port=2 actions=output:1
> + table=1, in_port=4 actions=output:3
> +OFPST_FLOW reply (OF1.2):
> ])
> -AT_CHECK([ovs-ofctl dump-aggregate br0 cookie=0x3/-1 | STRIP_XIDS], [0], [dnl
> -NXST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=1
> +AT_CHECK([ovs-ofctl -O OpenFlow12 del-flows br0])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip], [0],
> [OFPST_FLOW reply (OF1.2):
> ])
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> -AT_SETUP([ofproto - dump flows with cookie mask])
> +AT_SETUP([ofproto - dump flows with cookie])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
> AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=2,actions=1])
> @@ -228,13 +297,12 @@ NXST_FLOW reply:
> AT_CHECK([ovs-ofctl dump-aggregate br0 table=0 | STRIP_XIDS], [0], [dnl
> NXST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=3
> ])
> -AT_CHECK([ovs-ofctl dump-flows br0 cookie=0x3/0x1 | ofctl_strip | sort],
> [0], [dnl
> - cookie=0x1, in_port=1 actions=output:1
> +AT_CHECK([ovs-ofctl dump-flows br0 cookie=0x3/-1 | ofctl_strip | sort], [0],
> [dnl
> cookie=0x3, in_port=3 actions=output:1
> NXST_FLOW reply:
> ])
> -AT_CHECK([ovs-ofctl dump-aggregate br0 cookie=0x3/0x1 | STRIP_XIDS], [0],
> [dnl
> -NXST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=2
> +AT_CHECK([ovs-ofctl dump-aggregate br0 cookie=0x3/-1 | STRIP_XIDS], [0], [dnl
> +NXST_AGGREGATE reply: packet_count=0 byte_count=0 flow_count=1
> ])
> OVS_VSWITCHD_STOP
> AT_CLEANUP
> @@ -271,7 +339,24 @@ NXST_FLOW reply:
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> -AT_SETUP([ofproto - mod flows based on cookie mask])
> +dnl The OpenFlow 1.2 spec states that the cookie may not be modified
> +AT_SETUP([ofproto - no mod flow with cookie change (OpenFlow1.2)])
> +OVS_VSWITCHD_START
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0
> cookie=0x1,in_port=1,actions=1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + cookie=0x1, in_port=1 actions=output:1
> +OFPST_FLOW reply (OF1.2):
> +])
> +
> +AT_CHECK([ovs-ofctl -O OpenFlow12 mod-flows br0
> cookie=0x2,in_port=1,actions=1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + cookie=0x1, in_port=1 actions=output:1
> +OFPST_FLOW reply (OF1.2):
> +])
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> +AT_SETUP([ofproto - mod flows based on cookie mask (OpenFlow 1.0)])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
> AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=2,actions=1])
> @@ -293,6 +378,29 @@ NXST_FLOW reply:
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> +AT_SETUP([ofproto - mod flows based on cookie mask (OpenFlow 1.2)])
> +OVS_VSWITCHD_START
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0
> cookie=0x1,in_port=1,actions=1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0
> cookie=0x1,in_port=2,actions=1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0
> cookie=0x2,in_port=3,actions=1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + cookie=0x1, in_port=1 actions=output:1
> + cookie=0x1, in_port=2 actions=output:1
> + cookie=0x2, in_port=3 actions=output:1
> +OFPST_FLOW reply (OF1.2):
> +])
> +
> +AT_CHECK([ovs-ofctl -O OpenFlow12 mod-flows br0 cookie=0x1/0xff,actions=4])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + cookie=0x1, in_port=1 actions=output:4
> + cookie=0x1, in_port=2 actions=output:4
> + cookie=0x2, in_port=3 actions=output:1
> +OFPST_FLOW reply (OF1.2):
> +])
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> +dnl The OpenFlow 1.2 spec states that the cookie may not be modified
> AT_SETUP([ofproto - mod flows based on cookie mask with cookie change])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
> @@ -393,7 +501,7 @@ NXST_FLOW reply:
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> -AT_SETUP([ofproto - del flows based on table id])
> +AT_SETUP([ofproto - del flows based on table id (NXM)])
> OVS_VSWITCHD_START
> AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1])
> AT_CHECK([ovs-ofctl add-flow br0 cookie=0x2,in_port=2,table=1,actions=1])
> @@ -425,7 +533,39 @@ NXST_FLOW reply:
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> -AT_SETUP([ofproto - flow table configuration])
> +AT_SETUP([ofproto - del flows based on table id (OpenFlow 1.2)])
> +OVS_VSWITCHD_START
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0
> cookie=0x1,in_port=1,actions=1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0
> cookie=0x2,in_port=2,table=1,actions=1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + cookie=0x1, in_port=1 actions=output:1
> + cookie=0x2, table=1, in_port=2 actions=output:1
> +OFPST_FLOW reply (OF1.2):
> +])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 del-flows br0 table=0])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + cookie=0x2, table=1, in_port=2 actions=output:1
> +OFPST_FLOW reply (OF1.2):
> +])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 del-flows br0 table=1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> +OFPST_FLOW reply (OF1.2):
> +])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0
> cookie=0x1,in_port=1,actions=1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0
> cookie=0x2,in_port=2,table=1,actions=1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + cookie=0x1, in_port=1 actions=output:1
> + cookie=0x2, table=1, in_port=2 actions=output:1
> +OFPST_FLOW reply (OF1.2):
> +])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 del-flows br0])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> +OFPST_FLOW reply (OF1.2):
> +])
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> +AT_SETUP([ofproto - flow table configuration (OpenFlow 1.0)])
> OVS_VSWITCHD_START
> # Check the default configuration.
> (echo "OFPST_TABLE reply (xid=0x2): 254 tables
> @@ -461,7 +601,49 @@ AT_CHECK([ovs-ofctl dump-tables br0], [0], [expout])
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> -AT_SETUP([ofproto - hard limits on flow table size])
> +AT_SETUP([ofproto - flow table configuration (OpenFlow 1.2)])
> +OVS_VSWITCHD_START
> +# Check the default configuration.
> +(mid="wild=0xffffffffff, max=1000000,"
> + tail="
> + lookup=0, matched=0
> + match=0xffffffffff, instructions=0x00000007, config=0x00000003
> + write_actions=0x00000000, apply_actions=0x00000000
> + write_setfields=0x000000ffffffffff
> + apply_setfields=0x000000ffffffffff
> + metadata_match=0xffffffffffffffff
> + metadata_write=0xffffffffffffffff"
> + echo "OFPST_TABLE reply (OF1.2) (xid=0x2): 254 tables
> + 0: classifier: $mid active=0$tail"
> + x=1
> + while test $x -lt 254; do
> + printf " %d: %-8s: $mid active=0$tail
> +" $x table$x
> + x=`expr $x + 1`
> + done) > expout
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-tables br0], [0], [expout])
> +# Change the configuration.
> +AT_CHECK(
> + [ovs-vsctl \
> + -- --id=@t0 create Flow_Table name=main \
> + -- --id=@t1 create Flow_Table flow-limit=1024 \
> + -- set bridge br0 'flow_tables={1=@t1,0=@t0}' \
> + | perl $srcdir/uuidfilt.pl],
> + [0], [<0>
> +<1>
> +])
> +# Check that the configuration was updated.
> +mv expout orig-expout
> +(echo "OFPST_TABLE reply (OF1.2) (xid=0x2): 254 tables
> + 0: main : wild=0xffffffffff, max=1000000, active=0"
> + tail -n +3 orig-expout | head -7
> + echo " 1: table1 : wild=0xffffffffff, max= 1024, active=0"
> + tail -n +11 orig-expout) > expout
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-tables br0], [0], [expout])
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> +AT_SETUP([ofproto - hard limits on flow table size (OpenFLow 1.0)])
> OVS_VSWITCHD_START
> # Configure a maximum of 4 flows.
> AT_CHECK(
> @@ -505,7 +687,46 @@ NXST_FLOW reply:
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> -AT_SETUP([ofproto - eviction upon table overflow])
> +AT_SETUP([ofproto - hard limits on flow table size (OpenFLow 1.2)])
> +OVS_VSWITCHD_START
> +# Configure a maximum of 4 flows.
> +AT_CHECK(
> + [ovs-vsctl \
> + -- --id=@t0 create Flow_Table flow-limit=4 \
> + -- set bridge br0 flow_tables:0=@t0 \
> + | perl $srcdir/uuidfilt.pl],
> + [0], [<0>
> +])
> +# Add 4 flows.
> +for in_port in 1 2 3 4; do
> + ovs-ofctl -O OpenFlow12 add-flow br0 in_port=$in_port,actions=drop
> +done
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + in_port=1 actions=drop
> + in_port=2 actions=drop
> + in_port=3 actions=drop
> + in_port=4 actions=drop
> +OFPST_FLOW reply (OF1.2):
> +])
> +# Adding another flow will be refused.
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=5,actions=drop], [1],
> [], [stderr])
> +AT_CHECK([head -n 1 stderr | ofctl_strip], [0],
> + [OFPT_ERROR (OF1.2): OFPFMFC_TABLE_FULL
> +])
> +# Replacing or modifying an existing flow is allowed.
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=4,actions=normal])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 mod-flows br0 in_port=3,actions=output:1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + in_port=1 actions=drop
> + in_port=2 actions=drop
> + in_port=3 actions=output:1
> + in_port=4 actions=NORMAL
> +OFPST_FLOW reply (OF1.2):
> +])
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> +AT_SETUP([ofproto - eviction upon table overflow (OpenFlow 1.0)])
> OVS_VSWITCHD_START
> # Configure a maximum of 4 flows.
> AT_CHECK(
> @@ -563,7 +784,66 @@ NXST_FLOW reply:
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> -AT_SETUP([ofproto - eviction upon table overflow, with fairness])
> +AT_SETUP([ofproto - eviction upon table overflow (OpenFlow 1.2)])
> +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>
> +])
> +# Add 4 flows.
> +for in_port in 4 3 2 1; do
> + ovs-ofctl -O OpenFlow12 add-flow br0
> idle_timeout=${in_port}0,in_port=$in_port,actions=drop
> +done
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + idle_timeout=10, in_port=1 actions=drop
> + idle_timeout=20, in_port=2 actions=drop
> + idle_timeout=30, in_port=3 actions=drop
> + idle_timeout=40, in_port=4 actions=drop
> +OFPST_FLOW reply (OF1.2):
> +])
> +# Adding another flow will cause the one that expires soonest to be evicted.
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=5,actions=drop])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + idle_timeout=20, in_port=2 actions=drop
> + idle_timeout=30, in_port=3 actions=drop
> + idle_timeout=40, in_port=4 actions=drop
> + in_port=5 actions=drop
> +OFPST_FLOW reply (OF1.2):
> +])
> +# In Open Flow 1.2 a mod-flow does not ever add a flow and thus
> +# has no effect on eviction
> +AT_CHECK([ovs-ofctl -O OpenFlow12 mod-flows br0 in_port=6,actions=drop])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=4,actions=normal])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 mod-flows br0 in_port=3,actions=output:1])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + idle_timeout=20, in_port=2 actions=drop
> + idle_timeout=30, in_port=3 actions=output:1
> + in_port=4 actions=NORMAL
> + in_port=5 actions=drop
> +OFPST_FLOW reply (OF1.2):
> +])
> +# Flows with no timeouts at all cannot be evicted.
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=6,actions=drop])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=7,actions=normal])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 in_port=8,actions=drop], [1],
> [], [stderr])
> +AT_CHECK([head -n 1 stderr | ofctl_strip], [0],
> + [OFPT_ERROR (OF1.2): OFPFMFC_TABLE_FULL
> +])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + in_port=4 actions=NORMAL
> + in_port=5 actions=drop
> + in_port=6 actions=drop
> + in_port=7 actions=NORMAL
> +OFPST_FLOW reply (OF1.2):
> +])
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> +AT_SETUP([ofproto - eviction upon table overflow, with fairness (OpenFlow
> 1.0)])
> OVS_VSWITCHD_START
> # Configure a maximum of 4 flows.
> AT_CHECK(
> @@ -645,7 +925,89 @@ NXST_FLOW reply:
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> -AT_SETUP([ofproto - asynchronous message control])
> +AT_SETUP([ofproto - eviction upon table overflow, with fairness (OpenFlow
> 1.2)])
> +OVS_VSWITCHD_START
> +# Configure a maximum of 4 flows.
> +AT_CHECK(
> + [ovs-vsctl \
> + -- --id=@t0 create Flow_Table name=evict flow-limit=4 \
> + overflow-policy=evict \
> + groups='"NXM_OF_IN_PORT[[]]"' \
> + -- set bridge br0 flow_tables:0=@t0 \
> + | perl $srcdir/uuidfilt.pl],
> + [0], [<0>
> +])
> +# Add 4 flows.
> +ovs-ofctl -O OpenFlow12 add-flows br0 - <<EOF
> +idle_timeout=10 in_port=2 dl_src=00:44:55:66:77:88 actions=drop
> +idle_timeout=20 in_port=1 dl_src=00:11:22:33:44:55 actions=drop
> +idle_timeout=30 in_port=1 dl_src=00:22:33:44:55:66 actions=drop
> +idle_timeout=40 in_port=1 dl_src=00:33:44:55:66:77 actions=drop
> +EOF
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + idle_timeout=10, in_port=2,dl_src=00:44:55:66:77:88 actions=drop
> + idle_timeout=20, in_port=1,dl_src=00:11:22:33:44:55 actions=drop
> + idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
> + idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
> +OFPST_FLOW reply (OF1.2):
> +])
> +# Adding another flow will cause the one that expires soonest within
> +# the largest group (those with in_port=1) to be evicted. In this
> +# case this is not the same as the one that expires soonest overall
> +# (which is what makes the test interesting):
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0
> in_port=2,dl_src=00:55:66:77:88:99,actions=drop])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + idle_timeout=10, in_port=2,dl_src=00:44:55:66:77:88 actions=drop
> + idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
> + idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
> + in_port=2,dl_src=00:55:66:77:88:99 actions=drop
> +OFPST_FLOW reply (OF1.2):
> +])
> +# Enlarge the flow limit, change the eviction policy back to strictly
> +# based on expiration, and and add some flows.
> +AT_CHECK([ovs-vsctl set Flow_Table evict groups='[[]]' flow-limit=7])
> +ovs-ofctl -O OpenFlow12 add-flows br0 - <<EOF
> +idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=drop
> +idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=drop
> +idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=drop
> +EOF
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + idle_timeout=10, in_port=2,dl_src=00:44:55:66:77:88 actions=drop
> + idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
> + idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
> + idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
> + idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=drop
> + idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
> + in_port=2,dl_src=00:55:66:77:88:99 actions=drop
> +OFPST_FLOW reply (OF1.2):
> +])
> +# Adding another flow will cause the one that expires soonest overall
> +# to be evicted.
> +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'idle_timeout=80 in_port=2
> dl_src=00:99:aa:bb:cc:dd actions=drop'])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + idle_timeout=30, in_port=1,dl_src=00:22:33:44:55:66 actions=drop
> + idle_timeout=40, in_port=1,dl_src=00:33:44:55:66:77 actions=drop
> + idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=drop
> + idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=drop
> + idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
> + idle_timeout=80, in_port=2,dl_src=00:99:aa:bb:cc:dd actions=drop
> + in_port=2,dl_src=00:55:66:77:88:99 actions=drop
> +OFPST_FLOW reply (OF1.2):
> +])
> +# Reducing the flow limit also causes the flows that expire soonest
> +# overall to be evicted.
> +AT_CHECK([ovs-vsctl set Flow_Table evict flow-limit=4])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 dump-flows br0 | ofctl_strip | sort], [0],
> [dnl
> + idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=drop
> + idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop
> + idle_timeout=80, in_port=2,dl_src=00:99:aa:bb:cc:dd actions=drop
> + in_port=2,dl_src=00:55:66:77:88:99 actions=drop
> +OFPST_FLOW reply (OF1.2):
> +])
> +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])
> check_async () {
> @@ -748,11 +1110,115 @@ ovs-appctl -t ovs-ofctl exit
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> +AT_SETUP([ofproto - asynchronous message control (OpenFlow 1.2)])
> +OVS_VSWITCHD_START
> +AT_CHECK([ovs-ofctl -O OpenFlow12 monitor br0 --detach --no-chdir --pidfile])
> +check_async () {
> + printf '\n\n--- check_async %d ---\n\n\n' $1
> + INDEX=$1
> + shift
> +
> + ovs-appctl -t ovs-ofctl ofctl/barrier
> + ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
> + : > expout
> +
> + # OFPT_PACKET_IN, OFPR_ACTION (controller_id=0)
> + ovs-ofctl -O OpenFlow12 -v packet-out br0 none controller
> '0001020304050010203040501234'
> + if test X"$1" = X"OFPR_ACTION"; then shift;
> + echo >>expout "OFPT_PACKET_IN (OF1.2): total_len=14 in_port=ANY (via
> action) data_len=14 (unbuffered)
> +metadata=0,in_port=0,vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
> + fi
> +
> + # OFPT_PACKET_IN, OFPR_NO_MATCH (controller_id=123)
> + ovs-ofctl -O OpenFlow12 -v packet-out br0 none
> 'controller(reason=no_match,id=123)' '0001020304050010203040501234'
> + if test X"$1" = X"OFPR_NO_MATCH"; then shift;
> + echo >>expout "OFPT_PACKET_IN (OF1.2): total_len=14 in_port=ANY (via
> no_match) data_len=14 (unbuffered)
> +metadata=0,in_port=0,vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234"
> + fi
> +
> + # OFPT_PACKET_IN, OFPR_INVALID_TTL (controller_id=0)
> + ovs-ofctl -O OpenFlow12 packet-out br0 none dec_ttl
> '002583dfb4000026b98cb0f908004500003fb7e200000011339bac11370dac100002d7730035002b8f6d86fb0100000100000000000006626c702d7873066e696369726103636f6d00000f00'
> + if test X"$1" = X"OFPR_INVALID_TTL"; then shift;
> + echo >>expout "OFPT_PACKET_IN (OF1.2): total_len=76 in_port=ANY (via
> invalid_ttl) data_len=76 (unbuffered)
> +udp,metadata=0,in_port=0,vlan_tci=0x0000,dl_src=00:26:b9:8c:b0:f9,dl_dst=00:25:83:df:b4:00,nw_src=172.17.55.13,nw_dst=172.16.0.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=55155,tp_dst=53
> udp_csum:8f6d"
> + fi
> +
> + # OFPT_PORT_STATUS, OFPPR_ADD
> + ovs-vsctl add-port br0 test -- set Interface test type=dummy
> + if test X"$1" = X"OFPPR_ADD"; then shift;
> + echo >>expout "OFPT_PORT_STATUS (OF1.2): ADD: ${INDEX}(test):
> addr:aa:55:aa:55:00:0x
> + config: PORT_DOWN
> + state: LINK_DOWN
> + speed: 0 Mbps now, 0 Mbps max"
> + fi
> +
> + # OFPT_PORT_STATUS, OFPPR_DELETE
> + ovs-vsctl del-port br0 test
> + if test X"$1" = X"OFPPR_DELETE"; then shift;
> + echo >>expout "OFPT_PORT_STATUS (OF1.2): DEL: ${INDEX}(test):
> addr:aa:55:aa:55:00:0x
> + config: PORT_DOWN
> + state: LINK_DOWN
> + speed: 0 Mbps now, 0 Mbps max"
> + fi
> +
> + # OFPT_FLOW_REMOVED, OFPRR_DELETE
> + ovs-ofctl -O OpenFlow12 add-flow br0 send_flow_rem,actions=drop
> + ovs-ofctl -O OpenFlow12 --strict del-flows br0 ''
> + if test X"$1" = X"OFPRR_DELETE"; then shift;
> + echo >>expout "OFPT_FLOW_REMOVED (OF1.2): reason=delete table_id=0"
> + fi
> + AT_FAIL_IF([test X"$1" != X])
> +
> + ovs-appctl -t ovs-ofctl ofctl/barrier
> + echo >>expout "OFPT_BARRIER_REPLY (OF1.2):"
> +
> + AT_CHECK(
> + [[sed '
> +s/ (xid=0x[0-9a-fA-F]*)//
> +s/ *duration.*//
> +s/00:0.$/00:0x/' < monitor.log]],
> + [0], [expout])
> +}
> +
> +# It's a service connection so initially there should be no async messages.
> +check_async 1
> +
> +# Set miss_send_len to 128, turning on packet-ins for our service connection.
> +ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700000080
> +check_async 2 OFPR_ACTION OFPPR_ADD OFPPR_DELETE OFPRR_DELETE
> +
> +# Set miss_send_len to 128 and enable invalid_ttl.
> +ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700040080
> +check_async 3 OFPR_ACTION OFPR_INVALID_TTL OFPPR_ADD OFPPR_DELETE
> OFPRR_DELETE
> +
> +# Become slave, which should disable everything except port status.
> +ovs-appctl -t ovs-ofctl ofctl/send 0304001400000002000023200000000a00000002
> +check_async 4 OFPPR_ADD OFPPR_DELETE
> +
> +# Use NXT_SET_ASYNC_CONFIG to enable a patchwork of asynchronous messages.
> +ovs-appctl -t ovs-ofctl ofctl/send
> 03040028000000020000232000000013000000020000000500000005000000020000000200000005
> +check_async 5 OFPR_INVALID_TTL OFPPR_DELETE OFPRR_DELETE
> +
> +# Set controller ID 123.
> +ovs-appctl -t ovs-ofctl ofctl/send
> 03040018000000030000232000000014000000000000007b
> +check_async 6 OFPR_NO_MATCH OFPPR_DELETE OFPRR_DELETE
> +
> +# Restore controller ID 0.
> +ovs-appctl -t ovs-ofctl ofctl/send
> 030400180000000300002320000000140000000000000000
> +
> +# Become master.
> +ovs-appctl -t ovs-ofctl ofctl/send 0304001400000002000023200000000a00000001
> +check_async 7 OFPR_ACTION OFPPR_ADD
> +
> +ovs-appctl -t ovs-ofctl exit
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> dnl This test checks that OFPT_PACKET_OUT accepts both OFPP_NONE (as
> dnl specified by OpenFlow 1.0) and OFPP_CONTROLLER (used by some
> dnl controllers despite the spec) as meaning a packet that was generated
> dnl by the controller.
> -AT_SETUP([ofproto - packet-out from controller])
> +AT_SETUP([ofproto - packet-out from controller (OpenFlow 1.0)])
> OVS_VSWITCHD_START
>
> # Start a monitor listening for packet-ins.
> @@ -781,6 +1247,39 @@ OFPT_BARRIER_REPLY:
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> +dnl This test checks that OFPT_PACKET_OUT accepts both OFPP_NONE (as
> +dnl specified by OpenFlow 1.2) and OFPP_CONTROLLER (used by some
> +dnl controllers despite the spec) as meaning a packet that was generated
> +dnl by the controller.
> +AT_SETUP([ofproto - packet-out from controller (OpenFlow 1.2)])
> +OVS_VSWITCHD_START
> +
> +# Start a monitor listening for packet-ins.
> +AT_CHECK([ovs-ofctl -O OpenFlow12 monitor br0 --detach --no-chdir --pidfile])
> +ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700000080
> +ovs-appctl -t ovs-ofctl ofctl/barrier
> +ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
> +AT_CAPTURE_FILE([monitor.log])
> +
> +# Send some packet-outs with OFPP_NONE and OFPP_CONTROLLER (65533) as
> in_port.
> +AT_CHECK([ovs-ofctl -O OpenFlow12 packet-out br0 none controller
> '0001020304050010203040501234'])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 packet-out br0 4294967293 controller
> '0001020304050010203040505678'])
> +
> +# Stop the monitor and check its output.
> +ovs-appctl -t ovs-ofctl ofctl/barrier
> +ovs-appctl -t ovs-ofctl exit
> +
> +AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
> +OFPT_PACKET_IN (OF1.2): total_len=14 in_port=ANY (via action) data_len=14
> (unbuffered)
> +metadata=0,in_port=0,vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
> +OFPT_PACKET_IN (OF1.2): total_len=14 in_port=CONTROLLER (via action)
> data_len=14 (unbuffered)
> +metadata=0,in_port=0,vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x5678
> +OFPT_BARRIER_REPLY (OF1.2):
> +])
> +
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> dnl This test checks that metadata is encoded in packet_in structures,
> dnl supported by NXAST.
> AT_SETUP([ofproto - packet-out with metadata (NXM)])
> @@ -809,6 +1308,34 @@ OFPT_BARRIER_REPLY:
> OVS_VSWITCHD_STOP
> AT_CLEANUP
>
> +dnl This test checks that metadata is encoded in packet_in structures,
> +dnl supported by NXAST.
> +AT_SETUP([ofproto - packet-out with metadata (OpenFlow 1.2)])
> +OVS_VSWITCHD_START
> +
> +# Start a monitor listening for packet-ins.
> +AT_CHECK([ovs-ofctl -O OpenFlow12 monitor br0 --detach --no-chdir --pidfile])
> +ovs-appctl -t ovs-ofctl ofctl/send 0309000c0123456700000080
> +ovs-appctl -t ovs-ofctl ofctl/barrier
> +ovs-appctl -t ovs-ofctl ofctl/set-output-file monitor.log
> +AT_CAPTURE_FILE([monitor.log])
> +
> +# Send a packet-out with a load action to set some metadata, and forward to
> controller
> +AT_CHECK([ovs-ofctl -O OpenFlow12 packet-out br0 none
> 'load(0xfafafafa5a5a5a5a->OXM_OF_METADATA[[0..63]]), controller'
> '0001020304050010203040501234'])
> +
> +# Stop the monitor and check its output.
> +ovs-appctl -t ovs-ofctl ofctl/barrier
> +ovs-appctl -t ovs-ofctl exit
> +
> +AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl
> +OFPT_PACKET_IN (OF1.2): total_len=14 in_port=ANY metadata=0xfafafafa5a5a5a5a
> (via action) data_len=14 (unbuffered)
> +metadata=0,in_port=0,vlan_tci=0x0000,dl_src=00:10:20:30:40:50,dl_dst=00:01:02:03:04:05,dl_type=0x1234
> +OFPT_BARRIER_REPLY (OF1.2):
> +])
> +
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> AT_SETUP([ofproto - flow monitoring])
> AT_KEYWORDS([monitor])
> OVS_VSWITCHD_START
> --
> 1.7.10.4
>
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev