From: Jarno Rajahalme Date: Wed, 17 Feb 2016 22:08:04 +0000 (-0800) Subject: ofp: Add support for bundles extension in OpenFlow 1.3. X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=06d4d4b68726d9cf153577a4a2287f944276f0d7 ofp: Add support for bundles extension in OpenFlow 1.3. ONF Extension 230 adds support for OpenFlow 1.4 bundles to OpenFlow 1.3. Supporting this allows OpenFlow 1.3 controllers to start using bundles. Also the ovs-ofctl '--bundle' option can now be used with OpenFlow 1.3. Signed-off-by: Jarno Rajahalme Acked-by: Ben Pfaff --- diff --git a/NEWS b/NEWS index 2271c4508..a968f4f92 100644 --- a/NEWS +++ b/NEWS @@ -11,8 +11,12 @@ Post-v2.5.0 traversal into a continuation for later resumption. * New extension message NXT_SET_ASYNC_CONFIG2 to allow OpenFlow 1.4-like control over asynchronous messages in earlier versions of OpenFlow. + * OpenFlow 1.3 Extension 230, adding OpenFlow Bundles support, is + now implemented. Only flow mod and port mod messages are supported + in bundles. - ovs-ofctl: * queue-get-config command now allows a queue ID to be specified. + * '--bundle' option can now be used with OpenFlow 1.3. - DPDK: * New option "n_rxq" for PMD interfaces. Old 'other_config:n-dpdk-rxqs' is no longer supported. diff --git a/lib/ofp-errors.h b/lib/ofp-errors.h index a9abc052e..d40ca381b 100644 --- a/lib/ofp-errors.h +++ b/lib/ofp-errors.h @@ -652,55 +652,59 @@ enum ofperr { /* ## OFPET_BUNDLE_FAILED ## */ /* ## -------------------- ## */ - /* OF1.4+(17,0). Unspecified error. */ + /* ONF1.3(2300), OF1.4+(17,0). Unspecified error. */ OFPERR_OFPBFC_UNKNOWN, - /* OF1.4+(17,1). Permissions error. */ + /* ONF1.3(2301), OF1.4+(17,1). Permissions error. */ OFPERR_OFPBFC_EPERM, - /* OF1.4+(17,2). Bundle ID doesn't exist. */ + /* ONF1.3(2302), OF1.4+(17,2). Bundle ID doesn't exist. */ OFPERR_OFPBFC_BAD_ID, - /* OF1.4+(17,3). Bundle ID already exists. */ + /* ONF1.3(2303), OF1.4+(17,3). Bundle ID already exists. */ OFPERR_OFPBFC_BUNDLE_EXIST, - /* OF1.4+(17,4). Bundle ID is closed. */ + /* ONF1.3(2304), OF1.4+(17,4). Bundle ID is closed. */ OFPERR_OFPBFC_BUNDLE_CLOSED, - /* OF1.4+(17,5). Too many bundle IDs. */ + /* ONF1.3(2305), OF1.4+(17,5). Too many bundle IDs. */ OFPERR_OFPBFC_OUT_OF_BUNDLES, - /* OF1.4+(17,6). Unsupported of unknown message control type. */ + /* ONF1.3(2306), OF1.4+(17,6). Unsupported of unknown message control + * type. */ OFPERR_OFPBFC_BAD_TYPE, - /* OF1.4+(17,7). Unsupported, unknown, or inconsistent flags. */ + /* ONF1.3(2307), OF1.4+(17,7). Unsupported, unknown, or inconsistent + * flags. */ OFPERR_OFPBFC_BAD_FLAGS, - /* OF1.4+(17,8). Length problem in included message. */ + /* ONF1.3(2308), OF1.4+(17,8). Length problem in included message. */ OFPERR_OFPBFC_MSG_BAD_LEN, - /* OF1.4+(17,9). Inconsistent or duplicate XID. */ + /* ONF1.3(2309), OF1.4+(17,9). Inconsistent or duplicate XID. */ OFPERR_OFPBFC_MSG_BAD_XID, - /* OF1.4+(17,10). Unsupported message in this bundle. */ + /* ONF1.3(2310), OF1.4+(17,10). Unsupported message in this bundle. */ OFPERR_OFPBFC_MSG_UNSUP, - /* OF1.4+(17,11). Unsupported message combination in this bundle. */ + /* ONF1.3(2311), OF1.4+(17,11). Unsupported message combination in this + * bundle. */ OFPERR_OFPBFC_MSG_CONFLICT, - /* OF1.4+(17,12). Cant handle this many messages in bundle. */ + /* ONF1.3(2312), OF1.4+(17,12). Cant handle this many messages in + * bundle. */ OFPERR_OFPBFC_MSG_TOO_MANY, - /* OF1.4+(17,13). One message in bundle failed. */ + /* ONF1.3(2313), OF1.4+(17,13). One message in bundle failed. */ OFPERR_OFPBFC_MSG_FAILED, - /* OF1.4+(17,14). Bundle is taking too long. */ + /* ONF1.3(2314), OF1.4+(17,14). Bundle is taking too long. */ OFPERR_OFPBFC_TIMEOUT, - /* OF1.4+(17,15). Bundle is locking the resource. */ + /* ONF1.3(2315), OF1.4+(17,15). Bundle is locking the resource. */ OFPERR_OFPBFC_BUNDLE_IN_PROGRESS, - /* NX1.4+(22). In an OFPT_BUNDLE_ADD_MESSAGE, the OpenFlow version in the + /* NX1.3+(22). In an OFPT_BUNDLE_ADD_MESSAGE, the OpenFlow version in the * inner and outer messages differ. */ OFPERR_NXBFC_BAD_VERSION, diff --git a/lib/ofp-msgs.h b/lib/ofp-msgs.h index 22f286408..e0f0c1ab1 100644 --- a/lib/ofp-msgs.h +++ b/lib/ofp-msgs.h @@ -264,9 +264,13 @@ enum ofpraw { /* OFPT 1.4+ (33): struct ofp14_bundle_ctrl_msg, uint8_t[8][]. */ OFPRAW_OFPT14_BUNDLE_CONTROL, + /* ONFT 1.3 (2300): struct ofp14_bundle_ctrl_msg, uint8_t[8][]. */ + OFPRAW_ONFT13_BUNDLE_CONTROL, /* OFPT 1.4+ (34): struct ofp14_bundle_ctrl_msg, uint8_t[]. */ OFPRAW_OFPT14_BUNDLE_ADD_MESSAGE, + /* ONFT 1.3 (2301): struct ofp14_bundle_ctrl_msg, uint8_t[]. */ + OFPRAW_ONFT13_BUNDLE_ADD_MESSAGE, /* Standard statistics. */ @@ -592,9 +596,11 @@ enum ofptype { /* Asynchronous messages. */ OFPTYPE_TABLE_STATUS, /* OFPRAW_OFPT14_TABLE_STATUS. */ - OFPTYPE_BUNDLE_CONTROL, /* OFPRAW_OFPT14_BUNDLE_CONTROL. */ + OFPTYPE_BUNDLE_CONTROL, /* OFPRAW_OFPT14_BUNDLE_CONTROL. + * OFPRAW_ONFT13_BUNDLE_CONTROL. */ - OFPTYPE_BUNDLE_ADD_MESSAGE, /* OFPRAW_OFPT14_BUNDLE_ADD_MESSAGE. */ + OFPTYPE_BUNDLE_ADD_MESSAGE, /* OFPRAW_OFPT14_BUNDLE_ADD_MESSAGE. + * OFPRAW_ONFT13_BUNDLE_ADD_MESSAGE. */ /* Statistics. */ OFPTYPE_DESC_STATS_REQUEST, /* OFPRAW_OFPST_DESC_REQUEST. */ diff --git a/lib/ofp-util.c b/lib/ofp-util.c index de7cf3cea..aae389d14 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -9504,7 +9504,8 @@ ofputil_decode_bundle_ctrl(const struct ofp_header *oh, { struct ofpbuf b = ofpbuf_const_initializer(oh, ntohs(oh->length)); enum ofpraw raw = ofpraw_pull_assert(&b); - ovs_assert(raw == OFPRAW_OFPT14_BUNDLE_CONTROL); + ovs_assert(raw == OFPRAW_OFPT14_BUNDLE_CONTROL + || raw == OFPRAW_ONFT13_BUNDLE_CONTROL); const struct ofp14_bundle_ctrl_msg *m = b.msg; msg->bundle_id = ntohl(m->bundle_id); @@ -9525,12 +9526,14 @@ ofputil_encode_bundle_ctrl_request(enum ofp_version ofp_version, case OFP10_VERSION: case OFP11_VERSION: case OFP12_VERSION: - case OFP13_VERSION: - ovs_fatal(0, "bundles need OpenFlow 1.4 or later " + ovs_fatal(0, "bundles need OpenFlow 1.3 or later " "(\'-O OpenFlow14\')"); + case OFP13_VERSION: case OFP14_VERSION: case OFP15_VERSION: - request = ofpraw_alloc(OFPRAW_OFPT14_BUNDLE_CONTROL, ofp_version, 0); + request = ofpraw_alloc(ofp_version == OFP13_VERSION + ? OFPRAW_ONFT13_BUNDLE_CONTROL + : OFPRAW_OFPT14_BUNDLE_CONTROL, ofp_version, 0); m = ofpbuf_put_zeros(request, sizeof *m); m->bundle_id = htonl(bc->bundle_id); @@ -9551,7 +9554,9 @@ ofputil_encode_bundle_ctrl_reply(const struct ofp_header *oh, struct ofpbuf *buf; struct ofp14_bundle_ctrl_msg *m; - buf = ofpraw_alloc_reply(OFPRAW_OFPT14_BUNDLE_CONTROL, oh, 0); + buf = ofpraw_alloc_reply(oh->version == OFP13_VERSION + ? OFPRAW_ONFT13_BUNDLE_CONTROL + : OFPRAW_OFPT14_BUNDLE_CONTROL, oh, 0); m = ofpbuf_put_zeros(buf, sizeof *m); m->bundle_id = htonl(msg->bundle_id); @@ -9662,7 +9667,8 @@ ofputil_decode_bundle_add(const struct ofp_header *oh, { struct ofpbuf b = ofpbuf_const_initializer(oh, ntohs(oh->length)); enum ofpraw raw = ofpraw_pull_assert(&b); - ovs_assert(raw == OFPRAW_OFPT14_BUNDLE_ADD_MESSAGE); + ovs_assert(raw == OFPRAW_OFPT14_BUNDLE_ADD_MESSAGE + || raw == OFPRAW_ONFT13_BUNDLE_ADD_MESSAGE); const struct ofp14_bundle_ctrl_msg *m = ofpbuf_pull(&b, sizeof *m); msg->bundle_id = ntohl(m->bundle_id); @@ -9709,7 +9715,9 @@ ofputil_encode_bundle_add(enum ofp_version ofp_version, struct ofp14_bundle_ctrl_msg *m; /* Must use the same xid as the embedded message. */ - request = ofpraw_alloc_xid(OFPRAW_OFPT14_BUNDLE_ADD_MESSAGE, ofp_version, + request = ofpraw_alloc_xid(ofp_version == OFP13_VERSION + ? OFPRAW_ONFT13_BUNDLE_ADD_MESSAGE + : OFPRAW_OFPT14_BUNDLE_ADD_MESSAGE, ofp_version, msg->msg->xid, 0); m = ofpbuf_put_zeros(request, sizeof *m); diff --git a/tests/ofproto.at b/tests/ofproto.at index b2b32b564..880fbc051 100644 --- a/tests/ofproto.at +++ b/tests/ofproto.at @@ -4024,7 +4024,7 @@ OVS_VSWITCHD_STOP AT_CLEANUP -AT_SETUP([ofproto - bundles, open (OpenFlow 1.4)]) +AT_SETUP([ofproto - bundle open (OpenFlow 1.4)]) AT_KEYWORDS([monitor]) OVS_VSWITCHD_START @@ -4048,7 +4048,7 @@ OFPT_BARRIER_REPLY (OF1.4): OVS_VSWITCHD_STOP AT_CLEANUP -AT_SETUP([ofproto - bundles, double open (OpenFlow 1.4)]) +AT_SETUP([ofproto - bundle double open (OpenFlow 1.4)]) AT_KEYWORDS([monitor]) OVS_VSWITCHD_START @@ -4501,3 +4501,488 @@ NXST_FLOW reply: OVS_VSWITCHD_STOP AT_CLEANUP + + +AT_SETUP([ofproto - bundle open (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_EXPERIMENTER (04), length (0018), +# xid (0000000a), ONF_EXPERIMENTER_ID (4F4E4600), +# ONFT_BUNDLE_CONTROL (2300 = 0x08FC), bundle id (00000001), +# message type (0000), and flags (0002) +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl exit + +AT_CHECK([ofctl_strip < monitor.log], [], [dnl +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REQUEST flags=ordered +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REPLY flags=0 +OFPT_BARRIER_REPLY (OF1.3): +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - bundle double open (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 twice an OpenFlow13 message (04), OFPT_EXPERIMENTER (04), length (0018), +# xid (0000000a), ONF_EXPERIMENTER_ID (4F4E4600), +# ONFT_BUNDLE_CONTROL (2300 = 0x08FC), bundle id (00000001), +# message type (0000), and flags (0002) +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl exit + +AT_CHECK([ofctl_strip < monitor.log], [0], [dnl +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REQUEST flags=ordered +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REPLY flags=0 +OFPT_BARRIER_REPLY (OF1.3): +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REQUEST flags=ordered +OFPT_ERROR (OF1.3): OFPBFC_BAD_ID +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REQUEST flags=ordered +OFPT_BARRIER_REPLY (OF1.3): +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - bundle close without open (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]) + +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 02 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl exit + +AT_CHECK([ofctl_strip < monitor.log], [0], [dnl +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=CLOSE_REQUEST flags=ordered +OFPT_ERROR (OF1.3): OFPBFC_BAD_ID +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=CLOSE_REQUEST flags=ordered +OFPT_BARRIER_REPLY (OF1.3): +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - bundle double close (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]) + +# Open, Close, Close +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 02 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 02 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl exit + +AT_CHECK([ofctl_strip < monitor.log], [0], [dnl +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REQUEST flags=ordered +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REPLY flags=0 +OFPT_BARRIER_REPLY (OF1.3): +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=CLOSE_REQUEST flags=ordered +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=CLOSE_REPLY flags=0 +OFPT_BARRIER_REPLY (OF1.3): +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=CLOSE_REQUEST flags=ordered +OFPT_ERROR (OF1.3): OFPBFC_BUNDLE_CLOSED +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=CLOSE_REQUEST flags=ordered +OFPT_BARRIER_REPLY (OF1.3): +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - bundle close, different flags (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]) + +# Open, Close +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 02 00 01" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl exit + +AT_CHECK([ofctl_strip < monitor.log], [0], [dnl +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REQUEST flags=ordered +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REPLY flags=0 +OFPT_BARRIER_REPLY (OF1.3): +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=CLOSE_REQUEST flags=atomic +OFPT_ERROR (OF1.3): OFPBFC_BAD_FLAGS +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=CLOSE_REQUEST flags=atomic +OFPT_BARRIER_REPLY (OF1.3): +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - bundle commit without open (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]) + +# Commit +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 04 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl exit + +AT_CHECK([ofctl_strip < monitor.log], [0], [dnl +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=COMMIT_REQUEST flags=ordered +OFPT_ERROR (OF1.3): OFPBFC_BAD_ID +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=COMMIT_REQUEST flags=ordered +OFPT_BARRIER_REPLY (OF1.3): +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - bundle commit, different flags (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]) + +# Open, Commit +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 00 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 04 00 01" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl exit + +AT_CHECK([ofctl_strip < monitor.log], [0], [dnl +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REQUEST flags=ordered +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=OPEN_REPLY flags=0 +OFPT_BARRIER_REPLY (OF1.3): +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=COMMIT_REQUEST flags=atomic +OFPT_ERROR (OF1.3): OFPBFC_BAD_FLAGS +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=COMMIT_REQUEST flags=atomic +OFPT_BARRIER_REPLY (OF1.3): +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ofproto - bundle discard without open (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]) + +# Discard +ovs-appctl -t ovs-ofctl ofctl/send "04 04 00 18 00 00 00 0a 4F 4E 46 00 00 00 08 FC 00 00 00 01 00 06 00 02" +ovs-appctl -t ovs-ofctl ofctl/barrier +ovs-appctl -t ovs-ofctl exit + +AT_CHECK([ofctl_strip < monitor.log], [0], [dnl +send: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=DISCARD_REQUEST flags=ordered +OFPT_ERROR (OF1.3): OFPBFC_BAD_ID +ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0x1 type=DISCARD_REQUEST flags=ordered +OFPT_BARRIER_REPLY (OF1.3): +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + + +AT_SETUP([ofproto - bundle with multiple flow mods (OpenFlow 1.3)]) +AT_KEYWORDS([monitor]) +OVS_VSWITCHD_START + +AT_CHECK([ovs-appctl vlog/set vconn:dbg]) + +AT_CHECK([ovs-ofctl del-flows br0]) + +AT_DATA([flows.txt], [dnl +add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=1 +add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=2 +add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=3 +add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=4 +delete +add idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=5 +add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=6 +add idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=7 +delete in_port=2 dl_src=00:88:99:aa:bb:cc +]) + +AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle add-flows br0 flows.txt]) + +AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl + idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:5 + idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:6 +NXST_FLOW reply: +]) + +AT_DATA([flows.txt], [dnl +modify actions=drop +modify_strict in_port=2 dl_src=00:77:88:99:aa:bb actions=7 +]) + +AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle add-flows br0 flows.txt]) + +AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl + 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=output:7 +NXST_FLOW reply: +]) + +# Adding an existing flow acts as a modify, and delete_strict also works. +AT_DATA([flows.txt], [dnl +add idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=8 +delete_strict in_port=2 dl_src=00:66:77:88:99:aa +add in_port=2 dl_src=00:66:77:88:99:aa actions=drop +]) + +AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle add-flows br0 flows.txt]) + +AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl + idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:8 + in_port=2,dl_src=00:66:77:88:99:aa actions=drop +NXST_FLOW reply: +]) + +dnl Check logs for OpenFlow trace +# Prevent race. +OVS_WAIT_UNTIL([vconn_sub < ovs-vswitchd.log | test `grep -- "|vconn|DBG|unix: sent (Success): NXST_FLOW reply" | wc -l` -ge 3]) +AT_CHECK([print_vconn_debug | vconn_sub | ofctl_strip], [0], [dnl +vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.5): + version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 +vconn|DBG|unix: received: OFPT_HELLO: + version bitmap: 0x01 +vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x06 and earlier, peer supports version 0x01) +vconn|DBG|unix: received: OFPT_FLOW_MOD: DEL actions=drop +vconn|DBG|unix: received: OFPT_BARRIER_REQUEST: +vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY: +vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.5): + version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 +vconn|DBG|unix: received: OFPT_HELLO (OF1.3): + version bitmap: 0x04 +vconn|DBG|unix: negotiated OpenFlow version 0x04 (we support version 0x06 and earlier, peer supports version 0x04) +vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=OPEN_REQUEST flags=atomic ordered +vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=OPEN_REPLY flags=0 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:1 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:2 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:88:99:aa:bb:cc idle:70 actions=output:3 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:4 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): DEL table:255 actions=drop +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa idle:50 actions=output:5 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:6 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:88:99:aa:bb:cc idle:70 actions=output:7 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): DEL table:255 in_port=2,dl_src=00:88:99:aa:bb:cc actions=drop +vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered +vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=COMMIT_REPLY flags=0 +vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.5): + version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 +vconn|DBG|unix: received: OFPT_HELLO: + version bitmap: 0x01 +vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x06 and earlier, peer supports version 0x01) +vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm +vconn|DBG|unix: received: OFPT_BARRIER_REQUEST: +vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY: +vconn|DBG|unix: received: NXST_FLOW request: +vconn|DBG|unix: sent (Success): NXST_FLOW reply: + idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:5 + idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:6 +vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.5): + version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 +vconn|DBG|unix: received: OFPT_HELLO (OF1.3): + version bitmap: 0x04 +vconn|DBG|unix: negotiated OpenFlow version 0x04 (we support version 0x06 and earlier, peer supports version 0x04) +vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=OPEN_REQUEST flags=atomic ordered +vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=OPEN_REPLY flags=0 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): MOD actions=drop +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): MOD_STRICT in_port=2,dl_src=00:77:88:99:aa:bb actions=output:7 +vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered +vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=COMMIT_REPLY flags=0 +vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.5): + version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 +vconn|DBG|unix: received: OFPT_HELLO: + version bitmap: 0x01 +vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x06 and earlier, peer supports version 0x01) +vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm +vconn|DBG|unix: received: OFPT_BARRIER_REQUEST: +vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY: +vconn|DBG|unix: received: NXST_FLOW request: +vconn|DBG|unix: sent (Success): NXST_FLOW reply: + 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=output:7 +vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.5): + version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 +vconn|DBG|unix: received: OFPT_HELLO (OF1.3): + version bitmap: 0x04 +vconn|DBG|unix: negotiated OpenFlow version 0x04 (we support version 0x06 and earlier, peer supports version 0x04) +vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=OPEN_REQUEST flags=atomic ordered +vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=OPEN_REPLY flags=0 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:77:88:99:aa:bb idle:60 actions=output:8 +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): DEL_STRICT table:255 in_port=2,dl_src=00:66:77:88:99:aa actions=drop +vconn|DBG|unix: received: ONFT_BUNDLE_ADD_MESSAGE (OF1.3): + bundle_id=0 flags=atomic ordered +OFPT_FLOW_MOD (OF1.3): ADD in_port=2,dl_src=00:66:77:88:99:aa actions=drop +vconn|DBG|unix: received: ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered +vconn|DBG|unix: sent (Success): ONFT_BUNDLE_CONTROL (OF1.3): + bundle_id=0 type=COMMIT_REPLY flags=0 +vconn|DBG|unix: sent (Success): OFPT_HELLO (OF1.5): + version bitmap: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 +vconn|DBG|unix: received: OFPT_HELLO: + version bitmap: 0x01 +vconn|DBG|unix: negotiated OpenFlow version 0x01 (we support version 0x06 and earlier, peer supports version 0x01) +vconn|DBG|unix: received: NXT_SET_FLOW_FORMAT: format=nxm +vconn|DBG|unix: received: OFPT_BARRIER_REQUEST: +vconn|DBG|unix: sent (Success): OFPT_BARRIER_REPLY: +vconn|DBG|unix: received: NXST_FLOW request: +vconn|DBG|unix: sent (Success): NXST_FLOW reply: + idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:8 + in_port=2,dl_src=00:66:77:88:99:aa actions=drop +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + + +AT_SETUP([ofproto - failing bundle commit (OpenFlow 1.3)]) +AT_KEYWORDS([monitor]) +OVS_VSWITCHD_START + +AT_CHECK([ovs-ofctl del-flows br0]) + +ovs-ofctl add-flows br0 - <&1 | sed '/|WARN|/d +s/unix:.*br0\.mgmt/unix:br0.mgmt/' | sed 's/(.* error)/(error)/'], +[0], [dnl +OFPT_ERROR (OF1.3) (xid=0xb): OFPBRC_EPERM +OFPT_FLOW_MOD (OF1.3) (xid=0xb): ADD table:254 actions=drop +OFPT_ERROR (OF1.3) (xid=0xd): OFPBFC_MSG_FAILED +ONFT_BUNDLE_CONTROL (OF1.3) (xid=0xd): + bundle_id=0 type=COMMIT_REQUEST flags=atomic ordered +ovs-ofctl: talking to unix:br0.mgmt (error) +]) + +AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl + idle_timeout=50, in_port=2,dl_src=00:66:77:88:99:aa actions=output:11 + idle_timeout=60, in_port=2,dl_src=00:77:88:99:aa:bb actions=output:22 + idle_timeout=70, in_port=2,dl_src=00:88:99:aa:bb:cc actions=output:33 +NXST_FLOW reply: +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index c1876fd3e..7bcfc66a3 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -67,9 +67,11 @@ VLOG_DEFINE_THIS_MODULE(ofctl); -/* --bundle: Use OpenFlow 1.4 bundle for making the flow table change atomic. - * NOTE: Also the flow mod will use OpenFlow 1.4, so the semantics may be - * different (see the comment in parse_options() for details). +/* --bundle: Use OpenFlow 1.3+ bundle for making the flow table change atomic. + * NOTE: If OpenFlow 1.3 or higher is not selected with the '-O' option, + * OpenFlow 1.4 will be implicitly selected. Also the flow mod will use + * OpenFlow 1.4, so the semantics may be different (see the comment in + * parse_options() for details). */ static bool bundle = false; @@ -308,13 +310,14 @@ parse_options(int argc, char *argv[]) free(short_options); /* Implicit OpenFlow 1.4 with the '--bundle' option. */ - if (bundle) { + if (bundle && !(get_allowed_ofp_versions() & + ofputil_protocols_to_version_bitmap(OFPUTIL_P_OF13_UP))) { /* Add implicit allowance for OpenFlow 1.4. */ add_allowed_ofp_versions(ofputil_protocols_to_version_bitmap( OFPUTIL_P_OF14_OXM)); - /* Remove all prior versions. */ + /* Remove all versions that do not support bundles. */ mask_allowed_ofp_versions(ofputil_protocols_to_version_bitmap( - OFPUTIL_P_OF14_UP)); + OFPUTIL_P_OF13_UP)); } versions = get_allowed_ofp_versions(); version_protocols = ofputil_protocols_from_version_bitmap(versions); @@ -1317,8 +1320,8 @@ bundle_flow_mod__(const char *remote, struct ofputil_flow_mod *fms, list_init(&requests); - /* Bundles need OpenFlow 1.4+. */ - usable_protocols &= OFPUTIL_P_OF14_UP; + /* Bundles need OpenFlow 1.3+. */ + usable_protocols &= OFPUTIL_P_OF13_UP; protocol = open_vconn_for_flow_mod(remote, &vconn, usable_protocols); for (i = 0; i < n_fms; i++) {