[ovs-dev] [error reporting 2/6] ofp-util: New function ofputil_decode_msg_type_partial().
Ethan Jackson
ethan at nicira.com
Fri Oct 21 21:39:49 UTC 2011
Looks good.
Ethan
On Thu, Sep 8, 2011 at 12:36, Ben Pfaff <blp at nicira.com> wrote:
> ---
> lib/ofp-util.c | 70 ++++++++++++++++++++++++++++++++-----------------------
> lib/ofp-util.h | 2 +
> 2 files changed, 43 insertions(+), 29 deletions(-)
>
> diff --git a/lib/ofp-util.c b/lib/ofp-util.c
> index 1e95d04..156d974 100644
> --- a/lib/ofp-util.c
> +++ b/lib/ofp-util.c
> @@ -343,14 +343,13 @@ ofputil_check_length(const struct ofputil_msg_type *type, unsigned int size)
> }
>
> static int
> -ofputil_decode_vendor(const struct ofp_header *oh,
> +ofputil_decode_vendor(const struct ofp_header *oh, size_t length,
> const struct ofputil_msg_type **typep)
> {
> const char *category = "Nicira extension message";
> const struct ofp_vendor_header *ovh;
> const struct ofputil_msg_type *type;
> const struct nicira_header *nh;
> - size_t length = ntohs(oh->length);
>
> if (length < sizeof(struct ofp_vendor_header)) {
> VLOG_WARN_RL(&bad_ofmsg_rl, "truncated vendor message");
> @@ -392,10 +391,9 @@ ofputil_decode_vendor(const struct ofp_header *oh,
> }
>
> static int
> -check_nxstats_msg(const struct ofp_header *oh)
> +check_nxstats_msg(const struct ofp_header *oh, size_t length)
> {
> const struct ofp_vendor_stats_msg *ovsm;
> - size_t length = ntohs(oh->length);
>
> if (length < sizeof(struct ofp_vendor_stats_msg)) {
> VLOG_WARN_RL(&bad_ofmsg_rl, "truncated vendor stats message");
> @@ -418,7 +416,7 @@ check_nxstats_msg(const struct ofp_header *oh)
> }
>
> static int
> -ofputil_decode_nxst_request(const struct ofp_header *oh,
> +ofputil_decode_nxst_request(const struct ofp_header *oh, size_t length,
> const struct ofputil_msg_type **typep)
> {
> const char *category = "Nicira extension statistics request";
> @@ -426,7 +424,7 @@ ofputil_decode_nxst_request(const struct ofp_header *oh,
> const struct nicira_stats_msg *nsm;
> int error;
>
> - error = check_nxstats_msg(oh);
> + error = check_nxstats_msg(oh, length);
> if (error) {
> return error;
> }
> @@ -447,7 +445,7 @@ ofputil_decode_nxst_request(const struct ofp_header *oh,
> }
>
> static int
> -ofputil_decode_nxst_reply(const struct ofp_header *oh,
> +ofputil_decode_nxst_reply(const struct ofp_header *oh, size_t length,
> const struct ofputil_msg_type **typep)
> {
> const char *category = "Nicira extension statistics reply";
> @@ -455,7 +453,7 @@ ofputil_decode_nxst_reply(const struct ofp_header *oh,
> const struct nicira_stats_msg *nsm;
> int error;
>
> - error = check_nxstats_msg(oh);
> + error = check_nxstats_msg(oh, length);
> if (error) {
> return error;
> }
> @@ -476,10 +474,8 @@ ofputil_decode_nxst_reply(const struct ofp_header *oh,
> }
>
> static int
> -check_stats_msg(const struct ofp_header *oh)
> +check_stats_msg(size_t length)
> {
> - size_t length = ntohs(oh->length);
> -
> if (length < sizeof(struct ofp_stats_msg)) {
> VLOG_WARN_RL(&bad_ofmsg_rl, "truncated stats message");
> return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
> @@ -489,7 +485,7 @@ check_stats_msg(const struct ofp_header *oh)
> }
>
> static int
> -ofputil_decode_ofpst_request(const struct ofp_header *oh,
> +ofputil_decode_ofpst_request(const struct ofp_header *oh, size_t length,
> const struct ofputil_msg_type **typep)
> {
> const char *category = "OpenFlow statistics";
> @@ -497,7 +493,7 @@ ofputil_decode_ofpst_request(const struct ofp_header *oh,
> const struct ofputil_msg_type *type;
> int error;
>
> - error = check_stats_msg(oh);
> + error = check_stats_msg(length);
> if (error) {
> return error;
> }
> @@ -511,7 +507,7 @@ ofputil_decode_ofpst_request(const struct ofp_header *oh,
> REQ_CASE(OFPST_QUEUE, sizeof(struct ofp_queue_stats_request), 0);
>
> case OFPST_VENDOR:
> - return ofputil_decode_nxst_request(oh, typep);
> + return ofputil_decode_nxst_request(oh, length, typep);
>
> default:
> VLOG_WARN_RL(&bad_ofmsg_rl, "received %s of unknown type %"PRIu16,
> @@ -524,7 +520,7 @@ ofputil_decode_ofpst_request(const struct ofp_header *oh,
> }
>
> static int
> -ofputil_decode_ofpst_reply(const struct ofp_header *oh,
> +ofputil_decode_ofpst_reply(const struct ofp_header *oh, size_t length,
> const struct ofputil_msg_type **typep)
> {
> const char *category = "OpenFlow statistics";
> @@ -532,7 +528,7 @@ ofputil_decode_ofpst_reply(const struct ofp_header *oh,
> const struct ofputil_msg_type *type;
> int error;
>
> - error = check_stats_msg(oh);
> + error = check_stats_msg(length);
> if (error) {
> return error;
> }
> @@ -549,7 +545,7 @@ ofputil_decode_ofpst_reply(const struct ofp_header *oh,
> sizeof(struct ofp_queue_stats));
>
> case OFPST_VENDOR:
> - return ofputil_decode_nxst_reply(oh, typep);
> + return ofputil_decode_nxst_reply(oh, length, typep);
>
> default:
> VLOG_WARN_RL(&bad_ofmsg_rl, "received %s of unknown type %"PRIu16,
> @@ -562,7 +558,7 @@ ofputil_decode_ofpst_reply(const struct ofp_header *oh,
> }
>
> static int
> -ofputil_decode_msg_type__(const struct ofp_header *oh,
> +ofputil_decode_msg_type__(const struct ofp_header *oh, size_t length,
> const struct ofputil_msg_type **typep)
> {
> const char *category = "OpenFlow message";
> @@ -592,13 +588,13 @@ ofputil_decode_msg_type__(const struct ofp_header *oh,
> MSG_CASE(OFPT_BARRIER_REPLY, sizeof(struct ofp_header), 0);
>
> case OFPT_STATS_REQUEST:
> - return ofputil_decode_ofpst_request(oh, typep);
> + return ofputil_decode_ofpst_request(oh, length, typep);
>
> case OFPT_STATS_REPLY:
> - return ofputil_decode_ofpst_reply(oh, typep);
> + return ofputil_decode_ofpst_reply(oh, length, typep);
>
> case OFPT_VENDOR:
> - return ofputil_decode_vendor(oh, typep);
> + return ofputil_decode_vendor(oh, length, typep);
>
> default:
> VLOG_WARN_RL(&bad_ofmsg_rl, "received %s of unknown type %"PRIu8,
> @@ -610,7 +606,6 @@ ofputil_decode_msg_type__(const struct ofp_header *oh,
> return 0;
> }
>
> -
> /* Decodes the message type represented by 'oh'. Returns 0 if successful or
> * an OpenFlow error code constructed with ofp_mkerr() on failure. Either
> * way, stores in '*typep' a type structure that can be inspected with the
> @@ -625,17 +620,34 @@ int
> ofputil_decode_msg_type(const struct ofp_header *oh,
> const struct ofputil_msg_type **typep)
> {
> - int error = ofputil_decode_msg_type__(oh, typep);
> + size_t length = ntohs(oh->length);
> + int error;
> +
> + error = ofputil_decode_msg_type__(oh, length, typep);
> if (!error) {
> - error = ofputil_check_length(*typep, ntohs(oh->length));
> + error = ofputil_check_length(*typep, length);
> }
> if (error) {
> - static const struct ofputil_msg_type ofputil_invalid_type = {
> - OFPUTIL_MSG_INVALID,
> - 0, "OFPUTIL_MSG_INVALID",
> - 0, 0
> - };
> + *typep = &ofputil_invalid_type;
> + }
> + return error;
> +}
> +
> +/* Decodes the message type represented by 'oh', of which only the first
> + * 'length' bytes are available. Returns 0 if successful or an OpenFlow error
> + * code constructed with ofp_mkerr() on failure. Either way, stores in
> + * '*typep' a type structure that can be inspected with the
> + * ofputil_msg_type_*() functions. */
> +int
> +ofputil_decode_msg_type_partial(const struct ofp_header *oh, size_t length,
> + const struct ofputil_msg_type **typep)
> +{
> + int error;
>
> + error = (length >= sizeof *oh
> + ? ofputil_decode_msg_type__(oh, length, typep)
> + : ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LEN));
> + if (error) {
> *typep = &ofputil_invalid_type;
> }
> return error;
> diff --git a/lib/ofp-util.h b/lib/ofp-util.h
> index b110d71..02b85fc 100644
> --- a/lib/ofp-util.h
> +++ b/lib/ofp-util.h
> @@ -90,6 +90,8 @@ enum ofputil_msg_code {
> struct ofputil_msg_type;
> int ofputil_decode_msg_type(const struct ofp_header *,
> const struct ofputil_msg_type **);
> +int ofputil_decode_msg_type_partial(const struct ofp_header *, size_t length,
> + const struct ofputil_msg_type **);
> enum ofputil_msg_code ofputil_msg_type_code(const struct ofputil_msg_type *);
> const char *ofputil_msg_type_name(const struct ofputil_msg_type *);
> int ofputil_check_output_port(uint16_t ofp_port, int max_ports);
> --
> 1.7.4.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
More information about the dev
mailing list