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 <[email protected]> --- NEWS | 4 + lib/ofp-errors.h | 38 ++-- lib/ofp-msgs.h | 10 +- lib/ofp-util.c | 22 ++- tests/ofproto.at | 489 +++++++++++++++++++++++++++++++++++++++++++++++++- utilities/ovs-ofctl.c | 19 +- 6 files changed, 546 insertions(+), 36 deletions(-) diff --git a/NEWS b/NEWS index ced6a49..1d19302 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 a9abc05..d40ca38 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 22f2864..e0f0c1a 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 de7cf3c..aae389d 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 b2b32b5..880fbc0 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 - <<EOF +idle_timeout=50 in_port=2 dl_src=00:66:77:88:99:aa actions=11 +idle_timeout=60 in_port=2 dl_src=00:77:88:99:aa:bb actions=22 +idle_timeout=70 in_port=2 dl_src=00:88:99:aa:bb:cc actions=33 +EOF +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: +]) + +# last line uses illegal table number (OVS internal table) +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 +modify 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 +add table=254 actions=drop +]) + +AT_CHECK([ovs-ofctl -O OpenFlow13 --bundle add-flows br0 flows.txt 2>&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 c1876fd..7bcfc66 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++) { -- 2.1.4 _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
