Add helpers for allowing requests and use them in handle_openflow__(). This is a in preparation for supporting multipart requests on a per message type basis.
Signed-off-by: Simon Horman <ho...@verge.net.au> --- lib/ofp-msgs.c | 34 ++++++++++++++++++++++++++++++++++ lib/ofp-msgs.h | 2 ++ ofproto/ofproto.c | 9 ++++----- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/lib/ofp-msgs.c b/lib/ofp-msgs.c index 602f8b4..29f9770 100644 --- a/lib/ofp-msgs.c +++ b/lib/ofp-msgs.c @@ -884,6 +884,40 @@ ofpmsg_is_stat_request(const struct ofp_header *oh) { return ofp_is_stat_request(oh->version, oh->type); } + +/* Return if it's a multpart request message + * with more parts to follow */ +bool +ofpmsg_is_mp_request(const struct ofp_header *oh) +{ + bool retval; + + switch (oh->version) { + case OFP10_VERSION: + case OFP11_VERSION: + case OFP12_VERSION: + retval = false; + break; + case OFP13_VERSION: + case OFP14_VERSION: + case OFP15_VERSION: + retval = ofpmsg_is_stat_request(oh); + break; + default: + OVS_NOT_REACHED(); + } + + return retval; +} + +/* Return if type of a multipart request message + * that may be buffered and processed as multiple messages. */ +bool +ofpmsg_may_buffer_mp_request(enum ofptype type OVS_UNUSED) +{ + /* Currently no types are allowed to be buffered. */ + return false; +} static ovs_be16 *ofpmp_flags__(const struct ofp_header *); diff --git a/lib/ofp-msgs.h b/lib/ofp-msgs.h index 1642f1f..137e1e0 100644 --- a/lib/ofp-msgs.h +++ b/lib/ofp-msgs.h @@ -671,6 +671,8 @@ bool ofpmsg_is_stat_request(const struct ofp_header *); * that is, only a multipart reply may have more than one part. OpenFlow 1.3 * adds one multipart request. This code does not yet support multipart * requests. */ +bool ofpmsg_is_mp_request(const struct ofp_header *oh); +bool ofpmsg_may_buffer_mp_request(enum ofptype type); /* Encoding multipart replies. * diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index a9a9d91..f8d2690 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -5927,11 +5927,10 @@ handle_openflow__(struct ofconn *ofconn, const struct ofpbuf *msg) if (error) { return error; } - if (oh->version >= OFP13_VERSION && ofpmsg_is_stat_request(oh) - && ofpmp_more(oh)) { - /* We have no buffer implementation for multipart requests. - * Report overflow for requests which consists of multiple - * messages. */ + if (ofpmsg_is_mp_request(oh) && ofpmp_more(oh) + && !ofpmsg_may_buffer_mp_request(type)) { + /* Report overflow for requests which consist of multiple message + * for which multiple message handling is not available. */ return OFPERR_OFPBRC_MULTIPART_BUFFER_OVERFLOW; } -- 2.0.0.rc2 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev