On Fri, May 02, 2014 at 09:54:27AM +0300, Alexandru Copot wrote:
> This is only the communication part of the bundles functionality.
> The actual message pre-validation and commits are not implemented.
>
> We also enable OF1.4 for all the tests.
>
> Signed-off-by: Alexandru Copot <[email protected]>
> Cc: Daniel Baluta <[email protected]>
> ---
> v6:
> * return error code for invalid inner message size
I'm not too comfortable with the wraparound to UINT_MAX here if
msg->msg->length is less than sizeof(struct ofp_header):
inner_size = ntohs(oh->length) - sizeof *m;
if (ntohs(msg->msg->length) - sizeof *oh > inner_size) {
I guess it is actually OK but it looks suspicious at first glance. So I
rewrote this and a little of the other code.
I started by dropping the inner ofp_header from ofp14_bundle_add_msg, so
that the structure only covers the actual bundle_add message. At that
point ofp14_bundle_add_msg is the same as ofp14_bundle_ctrl_msg, if one
ignores the padding, so I merged them. And then I modified
ofputil_decode_bundle_add() to be, in my opinion, more obviously
correct.
I'm going to apply this to master in a minute. Here's the diff I'm
folding in.
Thank you very much for this contribution, and I hope that you will
continue to work on OpenFlow 1.4 support.
diff --git a/include/openflow/openflow-1.4.h b/include/openflow/openflow-1.4.h
index 6efa3b9..cf83c61 100644
--- a/include/openflow/openflow-1.4.h
+++ b/include/openflow/openflow-1.4.h
@@ -171,31 +171,20 @@ enum ofp14_bundle_flags {
OFPBF_ORDERED = 1 << 1, /* Execute in specified order. */
};
-/* Message structure for ONF_ET_BUNDLE_CONTROL. */
+/* Message structure for OFPT_BUNDLE_CONTROL and OFPT_BUNDLE_ADD_MESSAGE. */
struct ofp14_bundle_ctrl_msg {
ovs_be32 bundle_id; /* Identify the bundle. */
- ovs_be16 type; /* OFPBCT_*. */
+ ovs_be16 type; /* OFPT_BUNDLE_CONTROL: one of OFPBCT_*.
+ * OFPT_BUNDLE_ADD_MESSAGE: not used. */
ovs_be16 flags; /* Bitmap of OFPBF_* flags. */
- /* Bundle Property list. */
- /* struct ofp14_bundle_prop_header properties[0]; */
+ /* Followed by:
+ * - For OFPT_BUNDLE_ADD_MESSAGE only, an encapsulated OpenFlow message,
+ * beginning with an ofp_header whose xid is identical to this message's
+ * outer xid.
+ * - For OFPT_BUNDLE_ADD_MESSAGE only, and only if at least one property is
+ * present, 0 to 7 bytes of padding to align on a 64-bit boundary.
+ * - Zero or more properties (see struct ofp14_bundle_prop_header). */
};
OFP_ASSERT(sizeof(struct ofp14_bundle_ctrl_msg) == 8);
-/* Message structure for OFP_BUNDLE_ADD_MESSAGE.
-* Adding a message in a bundle is done with. */
-struct ofp14_bundle_add_msg {
- ovs_be32 bundle_id; /* Identify the bundle. */
- uint8_t pad[2]; /* Align to 64 bits. */
- ovs_be16 flags; /* Bitmap of ONF_BF_* flags. */
-
- struct ofp_header message; /* Message added to the bundle. */
-
- /* If there is one property or more, 'message' is followed by:
- * - Exactly (message.length + 7)/8*8 - (message.length) (between 0 and 7)
- * bytes of all-zero bytes */
-
- /* Bundle Property list. */
- /* struct ofp14_bundle_prop_header properties[0]; */
-};
-OFP_ASSERT(sizeof(struct ofp14_bundle_add_msg) == 16);
#endif /* openflow/openflow-1.4.h */
diff --git a/lib/ofp-msgs.h b/lib/ofp-msgs.h
index 573b4ce..ded9042 100644
--- a/lib/ofp-msgs.h
+++ b/lib/ofp-msgs.h
@@ -236,7 +236,7 @@ enum ofpraw {
/* OFPT 1.4+ (33): struct ofp14_bundle_ctrl_msg, uint8_t[8][]. */
OFPRAW_OFPT14_BUNDLE_CONTROL,
- /* OFPT 1.4+ (34): struct ofp14_bundle_add_msg, uint8_t[]. */
+ /* OFPT 1.4+ (34): struct ofp14_bundle_ctrl_msg, uint8_t[]. */
OFPRAW_OFPT14_BUNDLE_ADD_MESSAGE,
/* Standard statistics. */
diff --git a/lib/ofp-print.c b/lib/ofp-print.c
index 1dc634b..a2e515d 100644
--- a/lib/ofp-print.c
+++ b/lib/ofp-print.c
@@ -2746,7 +2746,7 @@ ofp_print_bundle_add(struct ds *s, const struct
ofp_header *oh, int verbosity)
ofp_print_bit_names(s, badd.flags, bundle_flags_to_name, ' ');
ds_put_char(s, '\n');
- msg = ofp_to_string(badd.msg, badd.length, verbosity);
+ msg = ofp_to_string(badd.msg, ntohs(badd.msg->length), verbosity);
if (msg) {
ds_put_cstr(s, msg);
}
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 804cfb5..d178113 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -7096,23 +7096,22 @@ enum ofperr
ofputil_decode_bundle_add(const struct ofp_header *oh,
struct ofputil_bundle_add_msg *msg)
{
+ const struct ofp14_bundle_ctrl_msg *m;
struct ofpbuf b;
enum ofpraw raw;
- size_t inner_size;
- const struct ofp14_bundle_add_msg *m;
+ size_t inner_len;
ofpbuf_use_const(&b, oh, ntohs(oh->length));
raw = ofpraw_pull_assert(&b);
ovs_assert(raw == OFPRAW_OFPT14_BUNDLE_ADD_MESSAGE);
- m = ofpbuf_l3(&b);
+ m = ofpbuf_pull(&b, sizeof *m);
msg->bundle_id = ntohl(m->bundle_id);
msg->flags = ntohs(m->flags);
- msg->length = ntohs(m->message.length);
- msg->msg = &m->message;
- inner_size = ntohs(oh->length) - sizeof *m;
- if (ntohs(msg->msg->length) - sizeof *oh > inner_size) {
+ msg->msg = ofpbuf_data(&b);
+ inner_len = ntohs(msg->msg->length);
+ if (inner_len < sizeof(struct ofp_header) || inner_len > ofpbuf_size(&b)) {
return OFPERR_OFPBFC_MSG_BAD_LEN;
}
@@ -7124,16 +7123,14 @@ ofputil_encode_bundle_add(enum ofp_version ofp_version,
struct ofputil_bundle_add_msg *msg)
{
struct ofpbuf *request;
- struct ofp14_bundle_add_msg *m;
+ struct ofp14_bundle_ctrl_msg *m;
request = ofpraw_alloc(OFPRAW_OFPT14_BUNDLE_ADD_MESSAGE, ofp_version, 0);
m = ofpbuf_put_zeros(request, sizeof *m);
m->bundle_id = htonl(msg->bundle_id);
m->flags = htons(msg->flags);
-
- ofpbuf_put_zeros(request, msg->length - sizeof(*msg->msg));
- memcpy(&m->message, msg->msg, msg->length);
+ ofpbuf_put(request, msg->msg, ntohs(msg->msg->length));
return request;
}
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index 3f39b22..782e512 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -1147,7 +1147,6 @@ struct ofputil_bundle_add_msg {
uint32_t bundle_id;
uint16_t flags;
const struct ofp_header *msg;
- uint16_t length;
};
enum ofperr ofputil_decode_bundle_ctrl(const struct ofp_header *,
diff --git a/ofproto/bundles.c b/ofproto/bundles.c
index 8db3667..9904465 100644
--- a/ofproto/bundles.c
+++ b/ofproto/bundles.c
@@ -224,7 +224,6 @@ ofp_bundle_discard(struct ofconn *ofconn, uint32_t id)
enum ofperr
ofp_bundle_add_message(struct ofconn *ofconn, struct ofputil_bundle_add_msg
*badd)
{
- struct ofp_header *msg;
struct hmap *bundles;
struct ofp_bundle *bundle;
struct bundle_message *bmsg;
@@ -245,12 +244,8 @@ ofp_bundle_add_message(struct ofconn *ofconn, struct
ofputil_bundle_add_msg *bad
return OFPERR_OFPBFC_BUNDLE_CLOSED;
}
- msg = xmemdup(badd->msg, badd->length);
-
- bmsg = xmalloc(sizeof(*bmsg));
- bmsg->msg = msg;
-
+ bmsg = xmalloc(sizeof *bmsg);
+ bmsg->msg = xmemdup(badd->msg, ntohs(badd->msg->length));
list_push_back(&bundle->msg_list, &bmsg->node);
-
return 0;
}
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev