X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2Fofproto.at;h=27b6b34c4fe8ea0de055e2f50dbc3c43d0ae3566;hb=ac60863f78e412004c5b69f5a64a49bc6f0bc46d;hp=fe6836312af52d0e49f9a5c324fbb9abd5d5f1ae;hpb=b21eb1dac009d976a7b858b25f0a7bafdbedd227;p=sliver-openvswitch.git diff --git a/tests/ofproto.at b/tests/ofproto.at index fe6836312..27b6b34c4 100644 --- a/tests/ofproto.at +++ b/tests/ofproto.at @@ -61,7 +61,7 @@ OVS_VSWITCHD_START AT_CHECK([ovs-ofctl -vwarn dump-ports br0], [0], [stdout]) AT_CHECK([STRIP_XIDS stdout], [0], [dnl OFPST_PORT reply: 1 ports - port 65534: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0 + port LOCAL: 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 @@ -72,7 +72,7 @@ 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 + port LOCAL: 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 @@ -144,6 +144,197 @@ OFPST_QUEUE request (OF1.2) (xid=0x2):port=10 queue=ALL 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 configuration - (OpenFlow 1.0)]) +OVS_VSWITCHD_START +ADD_OF_PORTS([br0], [1], [2]) +AT_CHECK([ovs-ofctl queue-get-config br0 1], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout], [0], [dnl +OFPT_QUEUE_GET_CONFIG_REPLY: port=1 +]) +AT_CHECK([ovs-ofctl queue-get-config br0 10], [0], + [OFPT_ERROR (xid=0x2): OFPQOFC_BAD_PORT +OFPT_QUEUE_GET_CONFIG_REQUEST (xid=0x2): port=10 +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - queue configuration - (OpenFlow 1.2)]) +OVS_VSWITCHD_START +ADD_OF_PORTS([br0], [1], [2]) +AT_CHECK([ovs-ofctl -O OpenFlow12 queue-get-config br0 1], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout], [0], [dnl +OFPT_QUEUE_GET_CONFIG_REPLY (OF1.2): port=1 +]) +AT_CHECK([ovs-ofctl -O OpenFlow12 queue-get-config br0 10], [0], + [OFPT_ERROR (OF1.2) (xid=0x2): OFPQOFC_BAD_PORT +OFPT_QUEUE_GET_CONFIG_REQUEST (OF1.2) (xid=0x2): port=10 +]) +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 - del group]) +OVS_VSWITCHD_START +AT_DATA([groups.txt], [dnl +group_id=1234,type=all,bucket=output:10 +group_id=1235,type=all,bucket=output:10 +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-groups br0 groups.txt]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0 group_id=1234]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout], [0], [dnl +OFPST_GROUP_DESC reply (OF1.1): + group_id=1235,type=all,bucket=actions=output:10 +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0 group_id=1234]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout], [0], [dnl +OFPST_GROUP_DESC reply (OF1.1): + group_id=1235,type=all,bucket=actions=output:10 +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0], [0]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout], [0], [dnl +OFPST_GROUP_DESC reply (OF1.1): +]) +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 - del group deletes flows]) +OVS_VSWITCHD_START +AT_DATA([groups.txt], [dnl +group_id=1234,type=all,bucket=output:10 +group_id=1235,type=all,bucket=output:10 +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-groups br0 groups.txt]) +AT_DATA([flows.txt], [dnl +tcp actions=group:1234 +udp actions=group:1235 +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-flows br0 flows.txt]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-flows br0 | ofctl_strip | sort], +[0], [dnl + tcp actions=group:1234 + udp actions=group:1235 +OFPST_FLOW reply (OF1.1): +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0 group_id=1234]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-flows br0 | ofctl_strip | sort], +[0], [dnl + udp actions=group:1235 +OFPST_FLOW reply (OF1.1): +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0 group_id=1234]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-flows br0 | ofctl_strip | sort], +[0], [dnl + udp actions=group:1235 +OFPST_FLOW reply (OF1.1): +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn del-groups br0]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-flows br0 | ofctl_strip | sort], +[0], [dnl +OFPST_FLOW reply (OF1.1): +]) +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 - flow mod checks group availability]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-group br0 group_id=1234,type=all,bucket=output:10]) +AT_DATA([flows.txt], [dnl +tcp actions=group:1234 +udp actions=group:1235 +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-flow br0 'tcp actions=group:1234']) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-flow br0 'tcp actions=group:1235'], [1], [], [stderr]) + +# The output should look like this: +# +# 00000000 02 0e 00 98 00 00 00 02-00 00 00 00 00 00 00 00 |................| +# 00000010 00 00 00 00 00 00 00 00-ff 00 00 00 00 00 80 00 |................| +# 00000020 ff ff ff ff ff ff ff ff-ff ff ff ff 00 00 00 00 |................| +# 00000030 00 00 00 58 00 00 00 00-00 00 03 d7 00 00 00 00 |...X............| +# +# This 'sed' command captures the error message but drops details. +AT_CHECK([sed '/truncated/d +/^000000.0/d' stderr | STRIP_XIDS], [0], + [OFPT_ERROR (OF1.1): OFPBAC_BAD_OUT_GROUP +OFPT_FLOW_MOD (OF1.1): +]) +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 - group description]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-group br0 group_id=1234,type=all,bucket=output:10], [0], [stdout]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout], [0], [dnl +OFPST_GROUP_DESC reply (OF1.1): + group_id=1234,type=all,bucket=actions=output:10 +]) +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 - group description]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-group br0 group_id=1234,type=all,bucket=output:10]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-groups br0], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout], [0], [dnl +OFPST_GROUP_DESC reply (OF1.1): + group_id=1234,type=all,bucket=actions=output:10 +]) +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 - group features]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O OpenFlow12 -vwarn dump-group-features br0], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout], [0], [dnl +OFPST_GROUP_FEATURES reply (OF1.2): + Group table: + Types: 0x0 + Capabilities: 0x7 +]) +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 - group stats]) +OVS_VSWITCHD_START +AT_DATA([groups.txt], [dnl +group_id=1234,type=all,bucket=output:10 +group_id=1235,type=all,bucket=output:10 +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-groups br0 groups.txt]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn add-flow br0 'tcp actions=group:1234']) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-group-stats br0 group_id=1234], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout | sort], [0], [dnl + group_id=1234,ref_count=1,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0 +OFPST_GROUP reply (OF1.1): +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 -vwarn dump-group-stats br0], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout | sort], [0], [dnl + group_id=1234,ref_count=1,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0 + group_id=1235,ref_count=0,packet_count=0,byte_count=0,bucket0:packet_count=0,byte_count=0 +OFPST_GROUP reply (OF1.1): +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + AT_SETUP([ofproto - mod-port (OpenFlow 1.0)]) OVS_VSWITCHD_START for command_config_state in \ @@ -253,6 +444,43 @@ AT_CHECK([ovs-ofctl -F openflow10 dump-flows br0 | ofctl_strip], [0], [OFPST_FLO OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([ofproto - basic flow_mod commands (OpenFlow 1.1)]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply (OF1.1): +]) +AT_CHECK([echo 'in_port=2,actions=1' | ovs-ofctl -O OpenFlow11 add-flows br0 -]) +AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 in_port=1,actions=2]) +AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 table=1,in_port=4,actions=3]) +AT_CHECK([ovs-ofctl -O OpenFlow11 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.1): +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 dump-aggregate br0 table=0 | STRIP_XIDS], [0], [dnl +OFPST_AGGREGATE reply (OF1.1): packet_count=0 byte_count=0 flow_count=2 +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0]) +AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip], [0], [OFPST_FLOW reply (OF1.1): + table=1, in_port=4 actions=output:3 +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - flow_mod negative test (OpenFlow 1.1)]) +OVS_VSWITCHD_START( + [set bridge br0 protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13]) +AT_CHECK([ovs-ofctl add-flow -O OpenFlow11 br0 table=1,action=goto_table:2]) + +# The error message here actually comes from ovs-ofctl, not from ovs-vswitchd, +# but at least it's the same code in ofpacts_check() that issues the error. +AT_CHECK([ovs-ofctl add-flow -O OpenFlow11 br0 table=1,action=goto_table:1], + [1], [], + [ovs-ofctl: actions are invalid with specified match (OFPBRC_BAD_TABLE_ID) +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + AT_SETUP([ofproto - set-field flow_mod commands (NXM)]) OVS_VSWITCHD_START AT_CHECK([ovs-ofctl add-flow br0 ipv6,table=1,in_port=3,actions=drop]) @@ -339,8 +567,23 @@ NXST_FLOW reply: OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([ofproto - no mod flow with cookie change (OpenFlow 1.1)]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x1,in_port=1,actions=1]) +AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl + cookie=0x1, in_port=1 actions=output:1 +OFPST_FLOW reply (OF1.1): +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 mod-flows br0 cookie=0x2,in_port=1,actions=1]) +AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl + cookie=0x1, in_port=1 actions=output:1 +OFPST_FLOW reply (OF1.1): +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + 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)]) +AT_SETUP([ofproto - no mod flow with cookie change (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 dump-flows br0 | ofctl_strip | sort], [0], [dnl @@ -378,6 +621,28 @@ NXST_FLOW reply: OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([ofproto - mod flows based on cookie mask (OpenFlow 1.1)]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x1,in_port=1,actions=1]) +AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x1,in_port=2,actions=1]) +AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x2,in_port=3,actions=1]) +AT_CHECK([ovs-ofctl -O OpenFlow11 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.1): +]) + +AT_CHECK([ovs-ofctl -O OpenFlow11 mod-flows br0 cookie=0x1/0xff,actions=4]) +AT_CHECK([ovs-ofctl -O OpenFlow11 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.1): +]) +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]) @@ -423,7 +688,7 @@ NXST_FLOW reply: OVS_VSWITCHD_STOP AT_CLEANUP -AT_SETUP([ofproto - mod flow with cookie miss (mask==0)]) +AT_SETUP([ofproto - mod flow with cookie miss (mask==0) - NXM]) OVS_VSWITCHD_START AT_CHECK([ovs-ofctl -F nxm mod-flows br0 in_port=1,actions=1]) AT_CHECK([ovs-ofctl -F nxm dump-flows br0 | ofctl_strip | sort], [0], [dnl @@ -433,7 +698,26 @@ NXST_FLOW reply: OVS_VSWITCHD_STOP AT_CLEANUP -AT_SETUP([ofproto - mod flow with cookie miss (mask!=0)]) +AT_SETUP([ofproto - mod flow with cookie miss (mask==0) - OF1.1]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O openflow11 mod-flows br0 in_port=1,actions=1]) +AT_CHECK([ovs-ofctl -O openflow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl + in_port=1 actions=output:1 +OFPST_FLOW reply (OF1.1): +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - mod flow with cookie miss (mask==0) - OF1.2]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O openflow12 mod-flows br0 in_port=1,actions=1]) +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 - mod flow with cookie miss (mask!=0) - NXM]) OVS_VSWITCHD_START AT_CHECK([ovs-ofctl -F nxm mod-flows br0 cookie=1/1,in_port=1,actions=1]) AT_CHECK([ovs-ofctl -F nxm dump-flows br0 | ofctl_strip | sort], [0], [dnl @@ -442,6 +726,24 @@ NXST_FLOW reply: OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([ofproto - mod flow with cookie miss (mask!=0) - OF1.1]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O openflow11 mod-flows br0 cookie=1/1,in_port=1,actions=1]) +AT_CHECK([ovs-ofctl -O openflow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl +OFPST_FLOW reply (OF1.1): +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - mod flow with cookie miss (mask!=0) - OF1.2]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O openflow12 mod-flows br0 cookie=1/1,in_port=1,actions=1]) +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 - del flows with cookies]) OVS_VSWITCHD_START AT_CHECK([ovs-ofctl add-flow br0 cookie=0x1,in_port=1,actions=1]) @@ -533,6 +835,39 @@ NXST_FLOW reply: OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([ofproto - del flows based on table id (OpenFlow 1.1)]) +OVS_VSWITCHD_START +AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x1,in_port=1,actions=1]) +AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x2,in_port=2,table=1,actions=1]) +AT_CHECK([ovs-ofctl -O OpenFlow11 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.1): +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0 table=0]) +AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl + cookie=0x2, table=1, in_port=2 actions=output:1 +OFPST_FLOW reply (OF1.1): +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0 table=1]) +AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip | sort], [0], [dnl +OFPST_FLOW reply (OF1.1): +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x1,in_port=1,actions=1]) +AT_CHECK([ovs-ofctl -O OpenFlow11 add-flow br0 cookie=0x2,in_port=2,table=1,actions=1]) +AT_CHECK([ovs-ofctl -O OpenFlow11 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.1): +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 del-flows br0]) +AT_CHECK([ovs-ofctl -O OpenFlow11 dump-flows br0 | ofctl_strip], [0], [dnl +OFPST_FLOW reply (OF1.1): + cookie=0x2, table=1, in_port=2 actions=output:1 +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + 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]) @@ -585,7 +920,7 @@ AT_CHECK( -- --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], + | ${PERL} $srcdir/uuidfilt.pl], [0], [<0> <1> ]) @@ -604,13 +939,13 @@ AT_CLEANUP AT_SETUP([ofproto - flow table configuration (OpenFlow 1.2)]) OVS_VSWITCHD_START # Check the default configuration. -(mid="wild=0xffffffffff, max=1000000," +(mid="wild=0xfffffffff, max=1000000," tail=" lookup=0, matched=0 - match=0xffffffffff, instructions=0x00000007, config=0x00000003 + match=0xfffffffff, instructions=0x00000007, config=0x00000003 write_actions=0x00000000, apply_actions=0x00000000 - write_setfields=0x000000ffffffffff - apply_setfields=0x000000ffffffffff + write_setfields=0x0000000fffffffff + apply_setfields=0x0000000fffffffff metadata_match=0xffffffffffffffff metadata_write=0xffffffffffffffff" echo "OFPST_TABLE reply (OF1.2) (xid=0x2): 254 tables @@ -628,16 +963,16 @@ AT_CHECK( -- --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], + | ${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" + 0: main : wild=0xfffffffff, max=1000000, active=0" tail -n +3 orig-expout | head -7 - echo " 1: table1 : wild=0xffffffffff, max= 1024, active=0" + echo " 1: table1 : wild=0xfffffffff, max= 1024, active=0" tail -n +11 orig-expout) > expout AT_CHECK([ovs-ofctl -O OpenFlow12 dump-tables br0], [0], [expout]) OVS_VSWITCHD_STOP @@ -650,7 +985,7 @@ AT_CHECK( [ovs-vsctl \ -- --id=@t0 create Flow_Table flow-limit=4 \ -- set bridge br0 flow_tables:0=@t0 \ - | perl $srcdir/uuidfilt.pl], + | ${PERL} $srcdir/uuidfilt.pl], [0], [<0> ]) # Add 4 flows. @@ -694,7 +1029,7 @@ AT_CHECK( [ovs-vsctl \ -- --id=@t0 create Flow_Table flow-limit=4 \ -- set bridge br0 flow_tables:0=@t0 \ - | perl $srcdir/uuidfilt.pl], + | ${PERL} $srcdir/uuidfilt.pl], [0], [<0> ]) # Add 4 flows. @@ -733,7 +1068,7 @@ 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], + | ${PERL} $srcdir/uuidfilt.pl], [0], [<0> ]) # Add 4 flows. @@ -791,7 +1126,7 @@ 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], + | ${PERL} $srcdir/uuidfilt.pl], [0], [<0> ]) # Add 4 flows. @@ -852,7 +1187,7 @@ AT_CHECK( overflow-policy=evict \ groups='"NXM_OF_IN_PORT[[]]"' \ -- set bridge br0 flow_tables:0=@t0 \ - | perl $srcdir/uuidfilt.pl], + | ${PERL} $srcdir/uuidfilt.pl], [0], [<0> ]) # Add 4 flows. @@ -934,7 +1269,7 @@ AT_CHECK( overflow-policy=evict \ groups='"NXM_OF_IN_PORT[[]]"' \ -- set bridge br0 flow_tables:0=@t0 \ - | perl $srcdir/uuidfilt.pl], + | ${PERL} $srcdir/uuidfilt.pl], [0], [<0> ]) # Add 4 flows. @@ -1332,7 +1667,7 @@ 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 >>expout "OFPT_ROLE_REPLY (OF1.2) (xid=0x3): role=slave" +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 @@ -1343,7 +1678,7 @@ 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 >>expout "OFPT_ROLE_REPLY (OF1.2) (xid=0x5): role=master" +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):" @@ -1359,6 +1694,7 @@ 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.0)]) OVS_VSWITCHD_START +ADD_OF_PORTS([br0], [1]) # Start a monitor listening for packet-ins. AT_CHECK([ovs-ofctl -P openflow10 monitor br0 --detach --no-chdir --pidfile]) @@ -1368,13 +1704,15 @@ 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 packet-out br0 none controller '0001020304050010203040501234']) -AT_CHECK([ovs-ofctl packet-out br0 controller controller '0001020304050010203040505678']) +AT_CHECK([ovs-ofctl packet-out br0 none controller,1 '0001020304050010203040501234']) +AT_CHECK([ovs-ofctl packet-out br0 controller controller,1 '0001020304050010203040505678']) # Stop the monitor and check its output. ovs-appctl -t ovs-ofctl ofctl/barrier ovs-appctl -t ovs-ofctl exit +ovs-ofctl dump-ports br0 + AT_CHECK([sed 's/ (xid=0x[[0-9a-fA-F]]*)//' monitor.log], [0], [dnl OFPT_PACKET_IN: 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 @@ -1432,14 +1770,14 @@ 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 packet-out br0 controller 'load(0xfafafafa5a5a5a5a->OXM_OF_METADATA[[0..63]]), controller' '0001020304050010203040501234']) +AT_CHECK([ovs-ofctl packet-out br0 controller 'load(0xfafafafa5a5a5a5a->OXM_OF_METADATA[[0..63]]), load(0xaa->NXM_NX_PKT_MARK[[]]), 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 -NXT_PACKET_IN: total_len=14 in_port=CONTROLLER metadata=0xfafafafa5a5a5a5a (via action) data_len=14 (unbuffered) +NXT_PACKET_IN: total_len=14 in_port=CONTROLLER metadata=0xfafafafa5a5a5a5a pkt_mark=0xaa (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: ]) @@ -1475,6 +1813,33 @@ OFPT_BARRIER_REPLY (OF1.2): OVS_VSWITCHD_STOP AT_CLEANUP +dnl This test checks that tunnel metadata is encoded in packet_in structures. +AT_SETUP([ofproto - packet-out with tunnel 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 set field actions to set some tunnel metadata, and forward to controller +AT_CHECK([ovs-ofctl -O OpenFlow12 packet-out br0 none 'set_field:127.0.0.1->tun_src,set_field:0x01020304->tun_id,set_field:192.168.0.1->tun_dst, 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 tun_id=0x1020304 tun_src=127.0.0.1 tun_dst=192.168.0.1 (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 @@ -1534,7 +1899,7 @@ sort=' } print $_ foreach sort(@buffer); ' -AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log | perl -e "$sort"], [0], +AT_CHECK([sed 's/ (xid=0x[[1-9a-fA-F]][[0-9a-fA-F]]*)//' monitor.log | ${PERL} -e "$sort"], [0], [NXST_FLOW_MONITOR reply (xid=0x0): event=ADDED table=0 cookie=0 in_port=0,dl_vlan=124 actions=output:2 NXST_FLOW_MONITOR reply (xid=0x0): @@ -1632,7 +1997,7 @@ if test -e /proc/sys/net/core/rmem_max; then # Linux rmem_max=`cat /proc/sys/net/core/rmem_max` elif rmem_max=`sysctl -n net.inet.tcp.recvbuf_max 2>/dev/null`; then - : # FreeBSD + : # FreeBSD, NetBSD else # Don't know how to get maximum socket receive buffer on this OS AT_SKIP_IF([:]) @@ -1657,7 +2022,7 @@ ovs-appctl -t ovs-ofctl ofctl/block # Add $n_msgs flows. (echo "in_port=2,actions=output:2" -perl -e ' +${PERL} -e ' for ($i = 0; $i < '$n_msgs'; $i++) { print "cookie=1,reg1=$i,actions=drop\n"; } @@ -1720,3 +2085,37 @@ NXT_FLOW_MONITOR_RESUMED: OVS_VSWITCHD_STOP AT_CLEANUP + +AT_SETUP([ofproto - event filtering (OpenFlow 1.3)]) +AT_KEYWORDS([monitor]) +OVS_VSWITCHD_START + +# Start a monitor, use the required protocol version +ovs-ofctl -O OpenFlow13 monitor br0 --detach --no-chdir --pidfile >monitor.log 2>&1 +AT_CAPTURE_FILE([monitor.log]) + +# Send an OpenFlow13 message (04), OFPT_GET_ASYNC_REQUEST (1a), length (8), xid (0a) +ovs-appctl -t ovs-ofctl ofctl/send 041a00080000000a +ovs-appctl -t ovs-ofctl ofctl/barrier + +# Check default setting +read -r -d '' expected <<'EOF' +EOF + +AT_CHECK([ofctl_strip < monitor.log], [], [dnl +send: OFPT_GET_ASYNC_REQUEST (OF1.3): +OFPT_GET_ASYNC_REPLY (OF1.3): + master: + PACKET_IN: no_match action + PORT_STATUS: add delete modify + FLOW_REMOVED: idle hard delete + + slave: + PACKET_IN: (off) + PORT_STATUS: add delete modify + FLOW_REMOVED: (off) +OFPT_BARRIER_REPLY (OF1.3): +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP