X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fofp-msgs.c;h=47d7615816391b0f3365be418e03c621dd4e0727;hb=620606f63cc56c7541005dc6787106789e2c364e;hp=48ecafc6b75297c7bf7b02b559f446982bf9c68c;hpb=e2b9ac44c82590c2a9a27bff79ae43899277f703;p=sliver-openvswitch.git diff --git a/lib/ofp-msgs.c b/lib/ofp-msgs.c index 48ecafc6b..47d761581 100644 --- a/lib/ofp-msgs.c +++ b/lib/ofp-msgs.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 Nicira, Inc. + * Copyright (c) 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ #include #include "ofp-msgs.h" -#include #include "byte-order.h" #include "dynamic-string.h" #include "hash.h" @@ -253,17 +252,24 @@ ofphdrs_decode_assert(struct ofphdrs *hdrs, const struct ofp_header *oh, size_t length) { enum ofperr error = ofphdrs_decode(hdrs, oh, length); - assert(!error); + ovs_assert(!error); } static bool ofphdrs_is_stat(const struct ofphdrs *hdrs) { - return (hdrs->version == OFP10_VERSION - ? (hdrs->type == OFPT10_STATS_REQUEST || - hdrs->type == OFPT10_STATS_REPLY) - : (hdrs->type == OFPT11_STATS_REQUEST || - hdrs->type == OFPT11_STATS_REPLY)); + switch ((enum ofp_version) hdrs->version) { + case OFP10_VERSION: + return (hdrs->type == OFPT10_STATS_REQUEST || + hdrs->type == OFPT10_STATS_REPLY); + case OFP11_VERSION: + case OFP12_VERSION: + case OFP13_VERSION: + return (hdrs->type == OFPT11_STATS_REQUEST || + hdrs->type == OFPT11_STATS_REPLY); + } + + return false; } size_t @@ -273,20 +279,26 @@ ofphdrs_len(const struct ofphdrs *hdrs) return sizeof(struct nicira_header); } - if (hdrs->version == OFP10_VERSION) { + switch ((enum ofp_version) hdrs->version) { + case OFP10_VERSION: if (hdrs->type == OFPT10_STATS_REQUEST || hdrs->type == OFPT10_STATS_REPLY) { return (hdrs->stat == OFPST_VENDOR ? sizeof(struct nicira10_stats_msg) : sizeof(struct ofp10_stats_msg)); } - } else { + break; + + case OFP11_VERSION: + case OFP12_VERSION: + case OFP13_VERSION: if (hdrs->type == OFPT11_STATS_REQUEST || hdrs->type == OFPT11_STATS_REPLY) { return (hdrs->stat == OFPST_VENDOR ? sizeof(struct nicira11_stats_msg) : sizeof(struct ofp11_stats_msg)); } + break; } return sizeof(struct ofp_header); @@ -403,7 +415,7 @@ ofpraw_pull_assert(struct ofpbuf *msg) enum ofpraw raw; error = ofpraw_pull(&raw, msg); - assert(!error); + ovs_assert(!error); return raw; } @@ -512,10 +524,10 @@ ofpraw_alloc_stats_reply(const struct ofp_header *request, error = ofpraw_decode_partial(&request_raw, request, ntohs(request->length)); - assert(!error); + ovs_assert(!error); reply_raw = ofpraw_stats_request_to_reply(request_raw, request->version); - assert(reply_raw); + ovs_assert(reply_raw); return ofpraw_alloc_reply(reply_raw, request, extra_tailroom); } @@ -582,10 +594,10 @@ ofpraw_put_stats_reply(const struct ofp_header *request, struct ofpbuf *buf) enum ofpraw raw; error = ofpraw_decode_partial(&raw, request, ntohs(request->length)); - assert(!error); + ovs_assert(!error); raw = ofpraw_stats_request_to_reply(raw, request->version); - assert(raw); + ovs_assert(raw); ofpraw_put__(raw, request->version, request->xid, 0, buf); } @@ -613,7 +625,7 @@ ofpraw_put__(enum ofpraw raw, uint8_t version, ovs_be32 xid, if (hdrs->type == OFPT_VENDOR) { struct nicira_header *nh = buf->l2; - assert(hdrs->vendor == NX_VENDOR_ID); + ovs_assert(hdrs->vendor == NX_VENDOR_ID); nh->vendor = htonl(hdrs->vendor); nh->subtype = htonl(hdrs->subtype); } else if (version == OFP10_VERSION @@ -686,16 +698,23 @@ ofpraw_stats_request_to_reply(enum ofpraw raw, uint8_t version) enum ofperr error; hdrs = instance->hdrs; - if (hdrs.version == OFP10_VERSION) { - assert(hdrs.type == OFPT10_STATS_REQUEST); + switch ((enum ofp_version)hdrs.version) { + case OFP10_VERSION: + ovs_assert(hdrs.type == OFPT10_STATS_REQUEST); hdrs.type = OFPT10_STATS_REPLY; - } else { - assert(hdrs.type == OFPT11_STATS_REQUEST); + break; + case OFP11_VERSION: + case OFP12_VERSION: + case OFP13_VERSION: + ovs_assert(hdrs.type == OFPT11_STATS_REQUEST); hdrs.type = OFPT11_STATS_REPLY; + break; + default: + NOT_REACHED(); } error = ofpraw_from_ofphdrs(&reply_raw, &hdrs); - assert(!error); + ovs_assert(!error); return reply_raw; } @@ -772,6 +791,8 @@ ofpmsg_body(const struct ofp_header *oh) return (const uint8_t *) oh + ofphdrs_len(&hdrs); } +static ovs_be16 *ofpmp_flags__(const struct ofp_header *); + /* Initializes 'replies' as a new list of stats messages that reply to * 'request', which must be a stats request message. Initially the list will * consist of only a single reply part without any body. The caller should @@ -815,6 +836,8 @@ ofpmp_reserve(struct list *replies, size_t len) ofpbuf_put(next, msg->data, hdrs_len); list_push_back(replies, &next->list_node); + *ofpmp_flags__(msg->data) |= htons(OFPSF_REPLY_MORE); + return next; } } @@ -842,7 +865,7 @@ ofpmp_postappend(struct list *replies, size_t start_ofs) { struct ofpbuf *msg = ofpbuf_from_list(list_back(replies)); - assert(start_ofs <= UINT16_MAX); + ovs_assert(start_ofs <= UINT16_MAX); if (msg->size > UINT16_MAX) { size_t len = msg->size - start_ofs; memcpy(ofpmp_append(replies, len), @@ -854,9 +877,16 @@ ofpmp_postappend(struct list *replies, size_t start_ofs) static ovs_be16 * ofpmp_flags__(const struct ofp_header *oh) { - return (oh->version == OFP10_VERSION - ? &((struct ofp10_stats_msg *) oh)->flags - : &((struct ofp11_stats_msg *) oh)->flags); + switch ((enum ofp_version)oh->version) { + case OFP10_VERSION: + return &((struct ofp10_stats_msg *) oh)->flags; + case OFP11_VERSION: + case OFP12_VERSION: + case OFP13_VERSION: + return &((struct ofp11_stats_msg *) oh)->flags; + default: + NOT_REACHED(); + } } /* Returns the OFPSF_* flags found in the OpenFlow stats header of 'oh', which @@ -885,14 +915,14 @@ raw_info_get(enum ofpraw raw) { ofpmsgs_init(); - assert(raw < ARRAY_SIZE(raw_infos)); + ovs_assert(raw < ARRAY_SIZE(raw_infos)); return &raw_infos[raw]; } static struct raw_instance * raw_instance_get(const struct raw_info *info, uint8_t version) { - assert(version >= info->min_version && version <= info->max_version); + ovs_assert(version >= info->min_version && version <= info->max_version); return &info->instances[version - info->min_version]; }