[ovs-dev] [PATCH v2 02/47] ofproto: Use ofp14_flow_monitor_flags internally
Simon Horman
horms at verge.net.au
Tue Jun 10 10:27:06 UTC 2014
Use enum ofp14_flow_monitor_flags in place of enum nx_flow_monitor_flags in
struct ofputil_flow_monitor_request and struct rule, translating between
the two enumerations as necessary.
The motivation for this patch is to move towards
supporting OpenFlow1.4 flow monitor requests.
Signed-off-by: Simon Horman <horms at verge.net.au>
---
v2
* No change
---
lib/ofp-parse.c | 16 ++++++++--------
lib/ofp-print.c | 4 +++-
lib/ofp-util.c | 44 +++++++++++++++++++++++++++++++++++++++++---
lib/ofp-util.h | 6 ++++--
ofproto/connmgr.c | 14 +++++++-------
ofproto/connmgr.h | 2 +-
ofproto/ofproto-provider.h | 2 +-
ofproto/ofproto.c | 20 ++++++++++----------
8 files changed, 75 insertions(+), 33 deletions(-)
diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c
index c759f03..500478a 100644
--- a/lib/ofp-parse.c
+++ b/lib/ofp-parse.c
@@ -1723,8 +1723,8 @@ parse_flow_monitor_request__(struct ofputil_flow_monitor_request *fmr,
atomic_add(&id, 1, &fmr->id);
- fmr->flags = (NXFMF_INITIAL | NXFMF_ADD | NXFMF_DELETE | NXFMF_MODIFY
- | NXFMF_OWN | NXFMF_ACTIONS);
+ fmr->flags = (OFPFMF14_INITIAL | OFPFMF14_ADD | OFPFMF14_REMOVED |
+ OFPFMF14_MODIFY | OFPFMF14_INSTRUCTIONS);
fmr->out_port = OFPP_NONE;
fmr->table_id = 0xff;
match_init_catchall(&fmr->match);
@@ -1734,17 +1734,17 @@ parse_flow_monitor_request__(struct ofputil_flow_monitor_request *fmr,
const struct protocol *p;
if (!strcmp(name, "!initial")) {
- fmr->flags &= ~NXFMF_INITIAL;
+ fmr->flags &= ~OFPFMF14_INITIAL;
} else if (!strcmp(name, "!add")) {
- fmr->flags &= ~NXFMF_ADD;
+ fmr->flags &= ~OFPFMF14_ADD;
} else if (!strcmp(name, "!delete")) {
- fmr->flags &= ~NXFMF_DELETE;
+ fmr->flags &= ~OFPFMF14_REMOVED;
} else if (!strcmp(name, "!modify")) {
- fmr->flags &= ~NXFMF_MODIFY;
+ fmr->flags &= ~OFPFMF14_MODIFY;
} else if (!strcmp(name, "!actions")) {
- fmr->flags &= ~NXFMF_ACTIONS;
+ fmr->flags &= ~OFPFMF14_INSTRUCTIONS;
} else if (!strcmp(name, "!own")) {
- fmr->flags &= ~NXFMF_OWN;
+ fmr->flags |= OFPFMF14_NO_ABBREV;
} else if (parse_protocol(name, &p)) {
match_set_dl_type(&fmr->match, htons(p->dl_type));
if (p->nw_proto) {
diff --git a/lib/ofp-print.c b/lib/ofp-print.c
index a2c2434..81cac90 100644
--- a/lib/ofp-print.c
+++ b/lib/ofp-print.c
@@ -2193,6 +2193,7 @@ ofp_print_nxst_flow_monitor_request(struct ds *string,
ofpbuf_use_const(&b, oh, ntohs(oh->length));
for (;;) {
struct ofputil_flow_monitor_request request;
+ enum nx_flow_monitor_flags nx_flags;
int retval;
retval = ofputil_decode_flow_monitor_request(&request, &b);
@@ -2204,7 +2205,8 @@ ofp_print_nxst_flow_monitor_request(struct ds *string,
}
ds_put_format(string, "\n id=%"PRIu32" flags=", request.id);
- ofp_print_bit_names(string, request.flags,
+ nx_flags = nx_from_ofp14_flow_monitor_flags(request.flags);
+ ofp_print_bit_names(string, nx_flags,
nx_flow_monitor_flags_to_name, ',');
if (request.out_port != OFPP_NONE) {
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 09e4438..bcefc9a 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -5186,6 +5186,44 @@ ofputil_encode_table_stats_reply(const struct ofp12_table_stats stats[], int n,
/* ofputil_flow_monitor_request */
+static enum ofp14_flow_monitor_flags
+nx_to_ofp14_flow_monitor_flags(enum nx_flow_monitor_flags nx_flags)
+{
+ enum ofp14_flow_monitor_flags ofp_flags;
+
+ /* These NXFMF flags are identity mapped to OFPFMF14 flags */
+ ofp_flags = nx_flags & (NXFMF_INITIAL | NXFMF_ADD | NXFMF_DELETE
+ | NXFMF_MODIFY | NXFMF_ACTIONS);
+ /* NXFMF_OWN and OFPFMF14_NO_ABBREV have inverted sense */
+ if (!(nx_flags & NXFMF_OWN)) {
+ ofp_flags |= OFPFMF14_NO_ABBREV;
+ }
+
+ /* No other flags should be present. */
+ ovs_assert(!((ofp_flags | OFPFMF14_NO_ABBREV) & ~(nx_flags | NXFMF_OWN)));
+
+ return ofp_flags;
+}
+
+enum nx_flow_monitor_flags
+nx_from_ofp14_flow_monitor_flags(enum ofp14_flow_monitor_flags ofp_flags)
+{
+ enum nx_flow_monitor_flags nx_flags;
+
+ /* These OFPFMF14 flags are identity mapped to NX flags */
+ nx_flags = ofp_flags & (OFPFMF14_INITIAL | OFPFMF14_ADD | OFPFMF14_REMOVED
+ | OFPFMF14_MODIFY | OFPFMF14_INSTRUCTIONS);
+ /* NXFMF_OWN and OFPFMF14_NO_ABBREV have inverted sense */
+ if (!(ofp_flags & OFPFMF14_NO_ABBREV)) {
+ nx_flags |= NXFMF_OWN;
+ }
+
+ /* No other flags should be present. */
+ ovs_assert(!((nx_flags | NXFMF_OWN) & ~(ofp_flags | OFPFMF14_NO_ABBREV)));
+
+ return nx_flags;
+}
+
/* Converts an NXST_FLOW_MONITOR request in 'msg' into an abstract
* ofputil_flow_monitor_request in 'rq'.
*
@@ -5201,7 +5239,7 @@ ofputil_decode_flow_monitor_request(struct ofputil_flow_monitor_request *rq,
struct ofpbuf *msg)
{
struct nx_flow_monitor_request *nfmr;
- uint16_t flags;
+ enum nx_flow_monitor_flags flags;
if (!msg->frame) {
ofpraw_pull_assert(msg);
@@ -5232,7 +5270,7 @@ ofputil_decode_flow_monitor_request(struct ofputil_flow_monitor_request *rq,
}
rq->id = ntohl(nfmr->id);
- rq->flags = flags;
+ rq->flags = nx_to_ofp14_flow_monitor_flags(flags);
rq->out_port = u16_to_ofp(ntohs(nfmr->out_port));
rq->table_id = nfmr->table_id;
@@ -5257,7 +5295,7 @@ ofputil_append_flow_monitor_request(
nfmr = ofpbuf_at_assert(msg, start_ofs, sizeof *nfmr);
nfmr->id = htonl(rq->id);
- nfmr->flags = htons(rq->flags);
+ nfmr->flags = htons(nx_from_ofp14_flow_monitor_flags(rq->flags));
nfmr->out_port = htons(ofp_to_u16(rq->out_port));
nfmr->match_len = htons(match_len);
nfmr->table_id = rq->table_id;
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index 552b006..39afa51 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -834,15 +834,17 @@ int ofputil_pull_queue_get_config_reply(struct ofpbuf *reply,
struct ofputil_queue_config *);
-/* Abstract nx_flow_monitor_request. */
+/* Abstract {nx,ofp14}_flow_monitor_request. */
struct ofputil_flow_monitor_request {
uint32_t id;
- enum nx_flow_monitor_flags flags;
+ enum ofp14_flow_monitor_flags flags;
ofp_port_t out_port;
uint8_t table_id;
struct match match;
};
+enum nx_flow_monitor_flags nx_from_ofp14_flow_monitor_flags(
+ enum ofp14_flow_monitor_flags ofp_flags);
int ofputil_decode_flow_monitor_request(struct ofputil_flow_monitor_request *,
struct ofpbuf *msg);
void ofputil_append_flow_monitor_request(
diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c
index 4eaede4..9561c45 100644
--- a/ofproto/connmgr.c
+++ b/ofproto/connmgr.c
@@ -2150,21 +2150,21 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule,
const struct ofconn *abbrev_ofconn, ovs_be32 abbrev_xid)
OVS_REQUIRES(ofproto_mutex)
{
- enum nx_flow_monitor_flags update;
+ enum ofp14_flow_monitor_flags update;
struct ofconn *ofconn;
switch (event) {
case NXFME_ADDED:
- update = NXFMF_ADD;
+ update = OFPFMF14_ADD;
rule->add_seqno = rule->modify_seqno = monitor_seqno++;
break;
case NXFME_DELETED:
- update = NXFMF_DELETE;
+ update = OFPFMF14_REMOVED;
break;
case NXFME_MODIFIED:
- update = NXFMF_MODIFY;
+ update = OFPFMF14_MODIFY;
rule->modify_seqno = monitor_seqno++;
break;
@@ -2174,7 +2174,7 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule,
}
LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
- enum nx_flow_monitor_flags flags = 0;
+ enum ofp14_flow_monitor_flags flags = 0;
struct ofmonitor *m;
if (ofconn->monitor_paused) {
@@ -2201,7 +2201,7 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule,
ofconn->sent_abbrev_update = false;
}
- if (!(flags & NXFMF_OWN) || ofconn != abbrev_ofconn
+ if ((flags & OFPFMF14_NO_ABBREV) || ofconn != abbrev_ofconn
|| ofconn->monitor_paused) {
struct ofputil_flow_update fu;
struct match match;
@@ -2219,7 +2219,7 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule,
fu.hard_timeout = rule->hard_timeout;
ovs_mutex_unlock(&rule->mutex);
- if (flags & NXFMF_ACTIONS) {
+ if (flags & OFPFMF14_INSTRUCTIONS) {
const struct rule_actions *actions = rule_get_actions(rule);
fu.ofpacts = actions->ofpacts;
fu.ofpacts_len = actions->ofpacts_len;
diff --git a/ofproto/connmgr.h b/ofproto/connmgr.h
index b6fc90b..c0cf6f0 100644
--- a/ofproto/connmgr.h
+++ b/ofproto/connmgr.h
@@ -202,7 +202,7 @@ struct ofmonitor {
struct hmap_node ofconn_node; /* In ofconn's 'monitors' hmap. */
uint32_t id;
- enum nx_flow_monitor_flags flags;
+ enum ofp14_flow_monitor_flags flags;
/* Matching. */
ofp_port_t out_port;
diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
index 7741044..aa5adf9 100644
--- a/ofproto/ofproto-provider.h
+++ b/ofproto/ofproto-provider.h
@@ -384,7 +384,7 @@ struct rule {
* 'add_seqno' is the sequence number when this rule was created.
* 'modify_seqno' is the sequence number when this rule was last modified.
* See 'monitor_seqno' in connmgr.c for more information. */
- enum nx_flow_monitor_flags monitor_flags OVS_GUARDED_BY(ofproto_mutex);
+ enum ofp14_flow_monitor_flags monitor_flags OVS_GUARDED_BY(ofproto_mutex);
uint64_t add_seqno OVS_GUARDED_BY(ofproto_mutex);
uint64_t modify_seqno OVS_GUARDED_BY(ofproto_mutex);
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index 4615f7e..648d2dc 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -4719,7 +4719,7 @@ handle_barrier_request(struct ofconn *ofconn, const struct ofp_header *oh)
static void
ofproto_compose_flow_refresh_update(const struct rule *rule,
- enum nx_flow_monitor_flags flags,
+ enum ofp14_flow_monitor_flags flags,
struct list *msgs)
OVS_REQUIRES(ofproto_mutex)
{
@@ -4734,7 +4734,7 @@ ofproto_compose_flow_refresh_update(const struct rule *rule,
return;
}
- fu.event = (flags & (NXFMF_INITIAL | NXFMF_ADD)
+ fu.event = (flags & (OFPFMF14_INITIAL | OFPFMF14_ADD)
? NXFME_ADDED : NXFME_MODIFIED);
fu.reason = 0;
ovs_mutex_lock(&rule->mutex);
@@ -4747,7 +4747,7 @@ ofproto_compose_flow_refresh_update(const struct rule *rule,
fu.match = &match;
fu.priority = rule->cr.priority;
- if (!(flags & NXFMF_ACTIONS)) {
+ if (!(flags & OFPFMF14_INSTRUCTIONS)) {
actions = NULL;
} else if (!op) {
actions = rule_get_actions(rule);
@@ -4789,7 +4789,7 @@ ofmonitor_compose_refresh_updates(struct rule_collection *rules,
for (i = 0; i < rules->n; i++) {
struct rule *rule = rules->rules[i];
- enum nx_flow_monitor_flags flags = rule->monitor_flags;
+ enum ofp14_flow_monitor_flags flags = rule->monitor_flags;
rule->monitor_flags = 0;
ofproto_compose_flow_refresh_update(rule, flags, msgs);
@@ -4802,7 +4802,7 @@ ofproto_collect_ofmonitor_refresh_rule(const struct ofmonitor *m,
struct rule_collection *rules)
OVS_REQUIRES(ofproto_mutex)
{
- enum nx_flow_monitor_flags update;
+ enum ofp14_flow_monitor_flags update;
if (ofproto_rule_is_hidden(rule)) {
return;
@@ -4816,9 +4816,9 @@ ofproto_collect_ofmonitor_refresh_rule(const struct ofmonitor *m,
if (seqno) {
if (rule->add_seqno > seqno) {
- update = NXFMF_ADD | NXFMF_MODIFY;
+ update = OFPFMF14_ADD | OFPFMF14_MODIFY;
} else if (rule->modify_seqno > seqno) {
- update = NXFMF_MODIFY;
+ update = OFPFMF14_MODIFY;
} else {
return;
}
@@ -4827,13 +4827,13 @@ ofproto_collect_ofmonitor_refresh_rule(const struct ofmonitor *m,
return;
}
} else {
- update = NXFMF_INITIAL;
+ update = OFPFMF14_INITIAL;
}
if (!rule->monitor_flags) {
rule_collection_add(rules, rule);
}
- rule->monitor_flags |= update | (m->flags & NXFMF_ACTIONS);
+ rule->monitor_flags |= update | (m->flags & OFPFMF14_INSTRUCTIONS);
}
static void
@@ -4879,7 +4879,7 @@ ofproto_collect_ofmonitor_initial_rules(struct ofmonitor *m,
struct rule_collection *rules)
OVS_REQUIRES(ofproto_mutex)
{
- if (m->flags & NXFMF_INITIAL) {
+ if (m->flags & OFPFMF14_INITIAL) {
ofproto_collect_ofmonitor_refresh_rules(m, 0, rules);
}
}
--
2.0.0.rc2
More information about the dev
mailing list