Reject bundle add messages containing messages that should not be bundled.
Signed-off-by: Jarno Rajahalme <[email protected]>
---
lib/ofp-util.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/ofp-print.at | 47 ++++++++++++++++++++++----
2 files changed, 134 insertions(+), 7 deletions(-)
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 8ee51ac..bfccc69 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -8487,6 +8487,92 @@ ofputil_encode_bundle_ctrl_reply(const struct ofp_header
*oh,
return buf;
}
+/* Return true for bundlable state change requests, false for other messages.
+ */
+static bool
+ofputil_is_bundlable(enum ofptype type)
+{
+ switch (type) {
+ /* Minimum required by OpenFlow 1.4. */
+ case OFPTYPE_PORT_MOD:
+ case OFPTYPE_FLOW_MOD:
+ return true;
+
+ /* Nice to have later. */
+ case OFPTYPE_FLOW_MOD_TABLE_ID:
+ case OFPTYPE_GROUP_MOD:
+ case OFPTYPE_TABLE_MOD:
+ case OFPTYPE_METER_MOD:
+ case OFPTYPE_PACKET_OUT:
+
+ /* Not to be bundlable. */
+ case OFPTYPE_ECHO_REQUEST:
+ case OFPTYPE_FEATURES_REQUEST:
+ case OFPTYPE_GET_CONFIG_REQUEST:
+ case OFPTYPE_SET_CONFIG:
+ case OFPTYPE_BARRIER_REQUEST:
+ case OFPTYPE_ROLE_REQUEST:
+ case OFPTYPE_ECHO_REPLY:
+ case OFPTYPE_SET_FLOW_FORMAT:
+ case OFPTYPE_SET_PACKET_IN_FORMAT:
+ case OFPTYPE_SET_CONTROLLER_ID:
+ case OFPTYPE_FLOW_AGE:
+ case OFPTYPE_FLOW_MONITOR_CANCEL:
+ case OFPTYPE_SET_ASYNC_CONFIG:
+ case OFPTYPE_GET_ASYNC_REQUEST:
+ case OFPTYPE_DESC_STATS_REQUEST:
+ case OFPTYPE_FLOW_STATS_REQUEST:
+ case OFPTYPE_AGGREGATE_STATS_REQUEST:
+ case OFPTYPE_TABLE_STATS_REQUEST:
+ case OFPTYPE_TABLE_FEATURES_STATS_REQUEST:
+ case OFPTYPE_PORT_STATS_REQUEST:
+ case OFPTYPE_QUEUE_STATS_REQUEST:
+ case OFPTYPE_PORT_DESC_STATS_REQUEST:
+ case OFPTYPE_FLOW_MONITOR_STATS_REQUEST:
+ case OFPTYPE_METER_STATS_REQUEST:
+ case OFPTYPE_METER_CONFIG_STATS_REQUEST:
+ case OFPTYPE_METER_FEATURES_STATS_REQUEST:
+ case OFPTYPE_GROUP_STATS_REQUEST:
+ case OFPTYPE_GROUP_DESC_STATS_REQUEST:
+ case OFPTYPE_GROUP_FEATURES_STATS_REQUEST:
+ case OFPTYPE_QUEUE_GET_CONFIG_REQUEST:
+ case OFPTYPE_BUNDLE_CONTROL:
+ case OFPTYPE_BUNDLE_ADD_MESSAGE:
+ case OFPTYPE_HELLO:
+ case OFPTYPE_ERROR:
+ case OFPTYPE_FEATURES_REPLY:
+ case OFPTYPE_GET_CONFIG_REPLY:
+ case OFPTYPE_PACKET_IN:
+ case OFPTYPE_FLOW_REMOVED:
+ case OFPTYPE_PORT_STATUS:
+ case OFPTYPE_BARRIER_REPLY:
+ case OFPTYPE_QUEUE_GET_CONFIG_REPLY:
+ case OFPTYPE_DESC_STATS_REPLY:
+ case OFPTYPE_FLOW_STATS_REPLY:
+ case OFPTYPE_QUEUE_STATS_REPLY:
+ case OFPTYPE_PORT_STATS_REPLY:
+ case OFPTYPE_TABLE_STATS_REPLY:
+ case OFPTYPE_AGGREGATE_STATS_REPLY:
+ case OFPTYPE_PORT_DESC_STATS_REPLY:
+ case OFPTYPE_ROLE_REPLY:
+ case OFPTYPE_FLOW_MONITOR_PAUSED:
+ case OFPTYPE_FLOW_MONITOR_RESUMED:
+ case OFPTYPE_FLOW_MONITOR_STATS_REPLY:
+ case OFPTYPE_GET_ASYNC_REPLY:
+ case OFPTYPE_GROUP_STATS_REPLY:
+ case OFPTYPE_GROUP_DESC_STATS_REPLY:
+ case OFPTYPE_GROUP_FEATURES_STATS_REPLY:
+ case OFPTYPE_METER_STATS_REPLY:
+ case OFPTYPE_METER_CONFIG_STATS_REPLY:
+ case OFPTYPE_METER_FEATURES_STATS_REPLY:
+ case OFPTYPE_TABLE_FEATURES_STATS_REPLY:
+ case OFPTYPE_ROLE_STATUS:
+ ;
+ }
+
+ return false;
+}
+
enum ofperr
ofputil_decode_bundle_add(const struct ofp_header *oh,
struct ofputil_bundle_add_msg *msg)
@@ -8495,6 +8581,8 @@ ofputil_decode_bundle_add(const struct ofp_header *oh,
struct ofpbuf b;
enum ofpraw raw;
size_t inner_len;
+ enum ofperr error;
+ enum ofptype type;
ofpbuf_use_const(&b, oh, ntohs(oh->length));
raw = ofpraw_pull_assert(&b);
@@ -8513,6 +8601,12 @@ ofputil_decode_bundle_add(const struct ofp_header *oh,
return OFPERR_OFPBFC_MSG_BAD_XID;
}
+ /* Reject unbundlable messages. */
+ error = ofptype_decode(&type, msg->msg);
+ if (error || !ofputil_is_bundlable(type)) {
+ return OFPERR_OFPBFC_MSG_UNSUP; /* 'error' could be confusing. */
+ }
+
return 0;
}
diff --git a/tests/ofp-print.at b/tests/ofp-print.at
index fb227c7..bab3a12 100644
--- a/tests/ofp-print.at
+++ b/tests/ofp-print.at
@@ -3220,16 +3220,49 @@ OFPT_BUNDLE_ADD_MESSAGE (OF1.4) (xid=0x0): ***decode
error: OFPBFC_MSG_BAD_XID**
])
AT_CLEANUP
-AT_SETUP([OFPT_BUNDLE_ADD_MESSAGE - OFPT_HELLO])
+AT_SETUP([OFPT_BUNDLE_ADD_MESSAGE - reject OFPT_HELLO])
AT_KEYWORDS([ofp-print])
AT_CHECK([ovs-ofctl ofp-print "\
-05 22 00 20 00 00 00 00 \
-00 00 00 01 00 01 00 01 02 00 00 08 00 00 00 00 \
-00 00 00 00 00 00 00 00 \
+05 22 00 20 00 00 00 00 00 00 00 01 00 00 00 01 \
+02 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 \
+"], [0], [dnl
+OFPT_BUNDLE_ADD_MESSAGE (OF1.4) (xid=0x0): ***decode error: OFPBFC_MSG_UNSUP***
+])
+AT_CLEANUP
+
+AT_SETUP([OFPT_BUNDLE_ADD_MESSAGE - FLOW_MOD])
+AT_KEYWORDS([ofp-print])
+AT_CHECK([ovs-ofctl ofp-print "\
+05 22 00 a0 00 00 00 02 00 00 00 01 00 00 00 01 \
+03 0e 00 90 00 00 00 02 00 00 00 00 00 00 00 00 \
+00 00 00 00 00 00 00 00 01 00 00 00 00 00 ff ff \
+ff ff ff ff ff ff ff ff ff ff ff ff 00 00 00 00 \
+00 01 00 42 80 00 00 04 00 00 00 01 80 00 08 06 \
+50 54 00 00 00 06 80 00 06 06 50 54 00 00 00 05 \
+80 00 0a 02 08 06 80 00 0c 02 00 00 80 00 2a 02 \
+00 02 80 00 2c 04 c0 a8 00 02 80 00 2e 04 c0 a8 \
+00 01 00 00 00 00 00 00 00 04 00 18 00 00 00 00 \
+00 00 00 10 00 00 00 03 00 00 00 00 00 00 00 00 \
+"], [0], [dnl
+OFPT_BUNDLE_ADD_MESSAGE (OF1.4) (xid=0x2):
+ bundle_id=0x1 flags=atomic
+OFPT_FLOW_MOD (OF1.2) (xid=0x2): ADD table:1
priority=65535,arp,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=50:54:00:00:00:06,dl_dst=50:54:00:00:00:05,arp_spa=192.168.0.2,arp_tpa=192.168.0.1,arp_op=2
actions=output:3
+])
+AT_CLEANUP
+
+AT_SETUP([OFPT_BUNDLE_ADD_MESSAGE - PORT_MOD])
+AT_KEYWORDS([ofp-print])
+AT_CHECK([ovs-ofctl ofp-print "\
+05 22 00 38 00 00 00 03 00 00 00 01 00 00 00 01 \
+05 10 00 28 00 00 00 03 00 00 00 03 00 00 00 00 \
+50 54 00 00 00 01 00 00 00 00 00 01 00 00 00 01 \
+00 00 00 08 00 00 00 01
"], [0], [dnl
-OFPT_BUNDLE_ADD_MESSAGE (OF1.4) (xid=0x0):
+OFPT_BUNDLE_ADD_MESSAGE (OF1.4) (xid=0x3):
bundle_id=0x1 flags=atomic
-OFPT_HELLO (OF1.1) (xid=0x0):
- version bitmap: 0x01, 0x02
+OFPT_PORT_MOD (OF1.4) (xid=0x3):port: 3: addr:50:54:00:00:00:01
+ config: PORT_DOWN
+ mask: PORT_DOWN
+ advertise: 10MB-HD
])
AT_CLEANUP
--
1.7.10.4
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev