Switch to using enum ofp14_flow_update_event instead of enum nx_flow_update_event in struct ofputil_flow_update as the former can encode all values defined for the latter but the reverse is not true.
Also use switch rather than if when testing event values to give a little bit of extra type checking. This is in preparation for supporting OpenFlow 1.4 flow monitor replies. Signed-off-by: Simon Horman <ho...@verge.net.au> --- v2 * No change --- lib/ofp-print.c | 14 +++++-- lib/ofp-util.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++------- lib/ofp-util.h | 2 +- ofproto/connmgr.c | 19 ++++++---- ofproto/connmgr.h | 3 +- ofproto/ofproto.c | 17 ++++++--- 6 files changed, 129 insertions(+), 33 deletions(-) diff --git a/lib/ofp-print.c b/lib/ofp-print.c index 40eb16d..3d3fa0b 100644 --- a/lib/ofp-print.c +++ b/lib/ofp-print.c @@ -2304,24 +2304,30 @@ ofp_print_nxst_flow_monitor_reply(struct ds *string, ds_put_cstr(string, "\n event="); switch (update.event) { - case NXFME_ADDED: + case OFPFME14_ADDED: ds_put_cstr(string, "ADDED"); break; - case NXFME_DELETED: + case OFPFME14_REMOVED: ds_put_format(string, "DELETED reason=%s", ofp_flow_removed_reason_to_string(update.reason, reasonbuf, sizeof reasonbuf)); break; - case NXFME_MODIFIED: + case OFPFME14_MODIFIED: ds_put_cstr(string, "MODIFIED"); break; - case NXFME_ABBREV: + case OFPFME14_ABBREV: ds_put_format(string, "ABBREV xid=0x%"PRIx32, ntohl(update.xid)); continue; + + case OFPFME14_INITIAL: + case OFPFME14_PAUSED: + case OFPFME14_RESUMED: + default: + OVS_NOT_REACHED(); } ds_put_format(string, " table=%"PRIu8, update.table_id); diff --git a/lib/ofp-util.c b/lib/ofp-util.c index e147fbb..fed93df 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -5428,6 +5428,57 @@ ofputil_append_flow_monitor_request( } } +static enum ofperr +nx_to_ofp14_flow_update_event(enum nx_flow_update_event nx_event, + enum ofp14_flow_update_event *ofp_event) +{ + switch (nx_event) { + case NXFME_ADDED: + *ofp_event = OFPFME14_ADDED; + break; + case NXFME_DELETED: + *ofp_event = OFPFME14_REMOVED; + break; + case NXFME_MODIFIED: + *ofp_event = OFPFME14_MODIFIED; + break; + case NXFME_ABBREV: + *ofp_event = OFPFME14_ABBREV; + break; + default: + return OFPERR_NXBRC_FM_BAD_EVENT; + } + + return 0; +} + +static enum ofperr +nx_from_ofp14_flow_update_event(enum ofp14_flow_update_event ofp_event, + enum nx_flow_update_event *nx_event) +{ + switch (ofp_event) { + case OFPFME14_INITIAL: + case OFPFME14_ADDED: + *nx_event = NXFME_ADDED; + break; + case OFPFME14_REMOVED: + *nx_event = NXFME_DELETED; + break; + case OFPFME14_MODIFIED: + *nx_event = NXFME_MODIFIED; + break; + case OFPFME14_ABBREV: + *nx_event = NXFME_ABBREV; + break; + case OFPFME14_PAUSED: + case OFPFME14_RESUMED: + default: + return OFPERR_NXBRC_FM_BAD_EVENT; + } + + return 0; +} + /* Converts an NXST_FLOW_MONITOR reply (also known as a flow update) in 'msg' * into an abstract ofputil_flow_update in 'update'. The caller must have * initialized update->match to point to space allocated for a match. @@ -5449,8 +5500,10 @@ ofputil_decode_flow_update(struct ofputil_flow_update *update, struct ofpbuf *msg, struct ofpbuf *ofpacts) { struct nx_flow_update_header *nfuh; + enum nx_flow_update_event nevent; unsigned int length; struct ofp_header *oh; + enum ofperr error; if (!msg->frame) { ofpraw_pull_assert(msg); @@ -5467,13 +5520,22 @@ ofputil_decode_flow_update(struct ofputil_flow_update *update, oh = msg->frame; nfuh = ofpbuf_data(msg); - update->event = ntohs(nfuh->event); + nevent = ntohs(nfuh->event); length = ntohs(nfuh->length); if (length > ofpbuf_size(msg) || length % 8) { goto bad_len; } - if (update->event == NXFME_ABBREV) { + error = nx_to_ofp14_flow_update_event(nevent, &update->event); + if (error) { + VLOG_WARN_RL(&bad_ofmsg_rl, + "NXST_FLOW_MONITOR reply has bad event %"PRIu16, + ntohs(nfuh->event)); + return error; + } + + switch (update->event) { + case OFPFME14_ABBREV: { struct nx_flow_update_abbrev *nfua; if (length != sizeof *nfua) { @@ -5483,9 +5545,10 @@ ofputil_decode_flow_update(struct ofputil_flow_update *update, nfua = ofpbuf_pull(msg, sizeof *nfua); update->xid = nfua->xid; return 0; - } else if (update->event == NXFME_ADDED - || update->event == NXFME_DELETED - || update->event == NXFME_MODIFIED) { + } + case OFPFME14_ADDED: + case OFPFME14_REMOVED: + case OFPFME14_MODIFIED: { struct nx_flow_update_full *nfuf; unsigned int actions_len; unsigned int match_len; @@ -5523,11 +5586,12 @@ ofputil_decode_flow_update(struct ofputil_flow_update *update, update->ofpacts = ofpbuf_data(ofpacts); update->ofpacts_len = ofpbuf_size(ofpacts); return 0; - } else { - VLOG_WARN_RL(&bad_ofmsg_rl, - "NXST_FLOW_MONITOR reply has bad event %"PRIu16, - ntohs(nfuh->event)); - return OFPERR_NXBRC_FM_BAD_EVENT; + } + case OFPFME14_INITIAL: + case OFPFME14_PAUSED: + case OFPFME14_RESUMED: + default: + OVS_NOT_REACHED(); } bad_len: @@ -5574,18 +5638,25 @@ ofputil_append_flow_update(const struct ofputil_flow_update *update, { enum ofp_version version = ofpmp_version(replies); struct nx_flow_update_header *nfuh; + enum nx_flow_update_event nevent; struct ofpbuf *msg; size_t start_ofs; msg = ofpbuf_from_list(list_back(replies)); start_ofs = ofpbuf_size(msg); - if (update->event == NXFME_ABBREV) { + switch(update->event) { + case OFPFME14_ABBREV: { struct nx_flow_update_abbrev *nfua; nfua = ofpbuf_put_zeros(msg, sizeof *nfua); nfua->xid = update->xid; - } else { + break; + } + case OFPFME14_INITIAL: + case OFPFME14_ADDED: + case OFPFME14_REMOVED: + case OFPFME14_MODIFIED: { struct nx_flow_update_full *nfuf; int match_len; @@ -5601,11 +5672,21 @@ ofputil_append_flow_update(const struct ofputil_flow_update *update, nfuf->match_len = htons(match_len); nfuf->table_id = update->table_id; nfuf->cookie = update->cookie; + break; + } + case OFPFME14_PAUSED: + case OFPFME14_RESUMED: + default: + OVS_NOT_REACHED(); } nfuh = ofpbuf_at_assert(msg, start_ofs, sizeof *nfuh); nfuh->length = htons(ofpbuf_size(msg) - start_ofs); - nfuh->event = htons(update->event); + + if (nx_from_ofp14_flow_update_event(update->event, &nevent)) { + OVS_NOT_REACHED(); + } + nfuh->event = htons(nevent); ofpmp_postappend(replies, start_ofs); } diff --git a/lib/ofp-util.h b/lib/ofp-util.h index c41d8c9..2a6e81d 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -855,7 +855,7 @@ void ofputil_append_flow_monitor_request( /* Abstract nx_flow_update. */ struct ofputil_flow_update { - enum nx_flow_update_event event; + enum ofp14_flow_update_event event; /* Used only for NXFME_ADDED, NXFME_DELETED, NXFME_MODIFIED. */ enum ofp_flow_removed_reason reason; diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c index 896a0a1..e468d08 100644 --- a/ofproto/connmgr.c +++ b/ofproto/connmgr.c @@ -2148,7 +2148,7 @@ ofmonitor_destroy(struct ofmonitor *m) void ofmonitor_report(struct connmgr *mgr, struct rule *rule, - enum nx_flow_update_event event, + enum ofp14_flow_update_event event, enum ofp_flow_removed_reason reason, const struct ofconn *abbrev_ofconn, ovs_be32 abbrev_xid) OVS_REQUIRES(ofproto_mutex) @@ -2157,22 +2157,25 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule, struct ofconn *ofconn; switch (event) { - case NXFME_ADDED: + case OFPFME14_ADDED: update = OFPFMF14_ADD; rule->add_seqno = rule->modify_seqno = monitor_seqno++; break; - case NXFME_DELETED: + case OFPFME14_REMOVED: update = OFPFMF14_REMOVED; break; - case NXFME_MODIFIED: + case OFPFME14_MODIFIED: update = OFPFMF14_MODIFY; rule->modify_seqno = monitor_seqno++; break; default: - case NXFME_ABBREV: + case OFPFME14_INITIAL: + case OFPFME14_ABBREV: + case OFPFME14_PAUSED: + case OFPFME14_RESUMED: OVS_NOT_REACHED(); } @@ -2183,7 +2186,7 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule, if (ofconn->monitor_paused) { /* Only send NXFME_DELETED notifications for flows that were added * before we paused. */ - if (event != NXFME_DELETED + if (event != OFPFME14_REMOVED || rule->add_seqno > ofconn->monitor_paused) { continue; } @@ -2212,7 +2215,7 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule, struct match match; fu.event = event; - fu.reason = event == NXFME_DELETED ? reason : 0; + fu.reason = event == OFPFME14_REMOVED ? reason : 0; fu.table_id = rule->table_id; fu.cookie = rule->flow_cookie; minimatch_expand(&rule->cr.match, &match); @@ -2236,7 +2239,7 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule, } else if (!ofconn->sent_abbrev_update) { struct ofputil_flow_update fu; - fu.event = NXFME_ABBREV; + fu.event = OFPFME14_ABBREV; fu.xid = abbrev_xid; ofputil_append_flow_update(&fu, &ofconn->updates); diff --git a/ofproto/connmgr.h b/ofproto/connmgr.h index 87e4d3a..5abeb99 100644 --- a/ofproto/connmgr.h +++ b/ofproto/connmgr.h @@ -225,7 +225,8 @@ void ofmonitor_destroy(struct ofmonitor *) OVS_REQUIRES(ofproto_mutex); void ofmonitor_report(struct connmgr *, struct rule *, - enum nx_flow_update_event, enum ofp_flow_removed_reason, + enum ofp14_flow_update_event, + enum ofp_flow_removed_reason, const struct ofconn *abbrev_ofconn, ovs_be32 abbrev_xid) OVS_REQUIRES(ofproto_mutex); void ofmonitor_flush(struct connmgr *) OVS_REQUIRES(ofproto_mutex); diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 4ac4fa9..eb97681 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -4758,8 +4758,13 @@ ofproto_compose_flow_refresh_update(const struct rule *rule, return; } - fu.event = (flags & (OFPFMF14_INITIAL | OFPFMF14_ADD) - ? NXFME_ADDED : NXFME_MODIFIED); + if (flags & OFPFMF14_INITIAL) { + fu.event = OFPFME14_INITIAL; + } else if (flags & OFPFMF14_ADD) { + fu.event = OFPFME14_ADDED; + } else { + fu.event = OFPFME14_MODIFIED; + } fu.reason = 0; ovs_mutex_lock(&rule->mutex); fu.idle_timeout = rule->idle_timeout; @@ -6273,20 +6278,20 @@ ofopgroup_complete(struct ofopgroup *group) || (op->type == OFOPERATION_MODIFY && !op->actions && rule->flow_cookie == op->flow_cookie))) { - enum nx_flow_update_event event_type; + enum ofp14_flow_update_event event_type; switch (op->type) { case OFOPERATION_ADD: case OFOPERATION_REPLACE: - event_type = NXFME_ADDED; + event_type = OFPFME14_ADDED; break; case OFOPERATION_DELETE: - event_type = NXFME_DELETED; + event_type = OFPFME14_REMOVED; break; case OFOPERATION_MODIFY: - event_type = NXFME_MODIFIED; + event_type = OFPFME14_MODIFIED; break; default: -- 2.0.0.rc2 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev