[ovs-dev] [of1.1 rollup 20/20] ofp-util: Work on decoding OF1.1 flow_mods.
Ben Pfaff
blp at nicira.com
Tue Jun 12 00:32:24 PDT 2012
A work in progress. Doesn't build.
I'm not really sure I want separate OFPUTIL_ constants for OF1.0 and OF1.1
versions of each message. It's something I'm trying out as I write the
code.
Signed-off-by: Ben Pfaff <blp at nicira.com>
---
include/openflow/openflow-1.1.h | 17 ++--
include/openflow/openflow-common.h | 10 ++
lib/learning-switch.c | 15 ++-
lib/ofp-errors.h | 3 +
lib/ofp-print.c | 50 +++-------
lib/ofp-util.c | 187 +++++++++++++++++++++++++-----------
lib/ofp-util.h | 17 +++-
ofproto/ofproto.c | 15 ++-
8 files changed, 196 insertions(+), 118 deletions(-)
diff --git a/include/openflow/openflow-1.1.h b/include/openflow/openflow-1.1.h
index 5a7e7c3..e48056a 100644
--- a/include/openflow/openflow-1.1.h
+++ b/include/openflow/openflow-1.1.h
@@ -495,8 +495,8 @@ struct ofp11_flow_mod {
indicates no restriction. */
ovs_be16 flags; /* One of OFPFF_*. */
uint8_t pad[2];
- /* Open Flow version specific match */
- /* struct ofp_instruction instructions[0]; Instruction set */
+ /* Followed by an ofp11_match structure. */
+ /* Followed by an instruction set. */
};
OFP_ASSERT(sizeof(struct ofp11_flow_mod) == 48);
@@ -543,7 +543,7 @@ struct ofp11_stats_msg {
ovs_be16 type; /* One of the OFPST_* constants. */
ovs_be16 flags; /* OFPSF_REQ_* flags (none yet defined). */
uint8_t pad[4];
- /* uint8_t body[0]; Body of the request. */
+ /* Followed by the body of the request. */
};
OFP_ASSERT(sizeof(struct ofp11_stats_msg) == 16);
@@ -575,9 +575,9 @@ struct ofp11_flow_stats_request {
ovs_be64 cookie_mask; /* Mask used to restrict the cookie bits that
must match. A value of 0 indicates
no restriction. */
- struct ofp11_match match; /* Fields to match. */
+ /* Followed by an ofp11_match structure. */
};
-OFP_ASSERT(sizeof(struct ofp11_flow_stats_request) == 120);
+OFP_ASSERT(sizeof(struct ofp11_flow_stats_request) == 32);
/* Body of reply to OFPST_FLOW request. */
struct ofp11_flow_stats {
@@ -698,11 +698,10 @@ OFP_ASSERT(sizeof(struct ofp11_group_stats) == 32);
/* Used in group stats replies. */
struct ofp11_bucket_counter {
- struct ofp11_stats_msg osm;
ovs_be64 packet_count; /* Number of packets processed by bucket. */
ovs_be64 byte_count; /* Number of bytes processed by bucket. */
};
-OFP_ASSERT(sizeof(struct ofp11_bucket_counter) == 32);
+OFP_ASSERT(sizeof(struct ofp11_bucket_counter) == 16);
/* Body of reply to OFPST11_GROUP_DESC request. */
struct ofp11_group_desc_stats {
@@ -762,8 +761,8 @@ struct ofp11_flow_removed {
uint8_t pad2[2]; /* Align to 64-bits. */
ovs_be64 packet_count;
ovs_be64 byte_count;
- struct ofp11_match match; /* Description of fields. */
+ /* Followed by an ofp11_match structure. */
};
-OFP_ASSERT(sizeof(struct ofp11_flow_removed) == 136);
+OFP_ASSERT(sizeof(struct ofp11_flow_removed) == 48);
#endif /* openflow/openflow-1.1.h */
diff --git a/include/openflow/openflow-common.h b/include/openflow/openflow-common.h
index c09ab9c..5070522 100644
--- a/include/openflow/openflow-common.h
+++ b/include/openflow/openflow-common.h
@@ -388,4 +388,14 @@ enum ofp_match_type {
OFPMT_OXM = 1, /* OpenFlow Extensible Match */
};
+/* Group numbering. Groups can use any number up to OFPG_MAX. */
+enum ofp_group {
+ /* Last usable group number. */
+ OFPG_MAX = 0xffffff00,
+
+ /* Fake groups. */
+ OFPG_ALL = 0xfffffffc, /* All groups, for group delete commands. */
+ OFPG_ANY = 0xffffffff /* Wildcard, for flow stats requests. */
+};
+
#endif /* openflow/openflow-common.h */
diff --git a/lib/learning-switch.c b/lib/learning-switch.c
index 916abf3..9fad356 100644
--- a/lib/learning-switch.c
+++ b/lib/learning-switch.c
@@ -267,25 +267,30 @@ lswitch_process_packet(struct lswitch *sw, struct rconn *rconn,
case OFPUTIL_OFPT_SET_CONFIG:
case OFPUTIL_OFPT_PORT_STATUS:
case OFPUTIL_OFPT_PACKET_OUT:
- case OFPUTIL_OFPT_FLOW_MOD:
+ case OFPUTIL_OFPT10_FLOW_MOD:
+ case OFPUTIL_OFPT11_FLOW_MOD:
case OFPUTIL_OFPT_PORT_MOD:
case OFPUTIL_OFPT_BARRIER_REQUEST:
case OFPUTIL_OFPT_BARRIER_REPLY:
case OFPUTIL_OFPT_QUEUE_GET_CONFIG_REQUEST:
case OFPUTIL_OFPT_QUEUE_GET_CONFIG_REPLY:
case OFPUTIL_OFPST_DESC_REQUEST:
- case OFPUTIL_OFPST_FLOW_REQUEST:
- case OFPUTIL_OFPST_AGGREGATE_REQUEST:
+ case OFPUTIL_OFPST10_FLOW_REQUEST:
+ case OFPUTIL_OFPST11_FLOW_REQUEST:
+ case OFPUTIL_OFPST10_AGGREGATE_REQUEST:
+ case OFPUTIL_OFPST11_AGGREGATE_REQUEST:
case OFPUTIL_OFPST_TABLE_REQUEST:
case OFPUTIL_OFPST_PORT_REQUEST:
case OFPUTIL_OFPST_QUEUE_REQUEST:
case OFPUTIL_OFPST_PORT_DESC_REQUEST:
case OFPUTIL_OFPST_DESC_REPLY:
- case OFPUTIL_OFPST_FLOW_REPLY:
+ case OFPUTIL_OFPST10_FLOW_REPLY:
+ case OFPUTIL_OFPST11_FLOW_REPLY:
case OFPUTIL_OFPST_QUEUE_REPLY:
case OFPUTIL_OFPST_PORT_REPLY:
case OFPUTIL_OFPST_TABLE_REPLY:
- case OFPUTIL_OFPST_AGGREGATE_REPLY:
+ case OFPUTIL_OFPST10_AGGREGATE_REPLY:
+ case OFPUTIL_OFPST11_AGGREGATE_REPLY:
case OFPUTIL_OFPST_PORT_DESC_REPLY:
case OFPUTIL_NXT_ROLE_REQUEST:
case OFPUTIL_NXT_ROLE_REPLY:
diff --git a/lib/ofp-errors.h b/lib/ofp-errors.h
index 61cef41..1a5ecd6 100644
--- a/lib/ofp-errors.h
+++ b/lib/ofp-errors.h
@@ -324,6 +324,9 @@ enum ofperr {
* extension is enabled. */
OFPERR_NXFMFC_BAD_TABLE_ID,
+ /* NX1.0+(3,258). 'out_group' specified but groups not yet supported. */
+ OFPERR_NXFMFC_GROUPS_NOT_SUPPORTED,
+
/* ## ---------------------- ## */
/* ## OFPET_GROUP_MOD_FAILED ## */
/* ## ---------------------- ## */
diff --git a/lib/ofp-print.c b/lib/ofp-print.c
index 439096f..4cf4734 100644
--- a/lib/ofp-print.c
+++ b/lib/ofp-print.c
@@ -659,12 +659,10 @@ ofp10_match_to_string(const struct ofp10_match *om, int verbosity)
}
static void
-ofp_print_flow_mod(struct ds *s, const struct ofp_header *oh,
- enum ofputil_msg_code code, int verbosity)
+ofp_print_flow_mod(struct ds *s, const struct ofp_header *oh)
{
struct ofputil_flow_mod fm;
struct ofpbuf ofpacts;
- bool need_priority;
enum ofperr error;
ofpbuf_init(&ofpacts, 64);
@@ -700,29 +698,7 @@ ofp_print_flow_mod(struct ds *s, const struct ofp_header *oh,
}
ds_put_char(s, ' ');
- if (verbosity >= 3 && code == OFPUTIL_OFPT_FLOW_MOD) {
- const struct ofp_flow_mod *ofm = (const struct ofp_flow_mod *) oh;
- ofp10_match_print(s, &ofm->match, verbosity);
-
- /* ofp_print_match() doesn't print priority. */
- need_priority = true;
- } else if (verbosity >= 3 && code == OFPUTIL_NXT_FLOW_MOD) {
- const struct nx_flow_mod *nfm = (const struct nx_flow_mod *) oh;
- const void *nxm = nfm + 1;
- char *nxm_s;
-
- nxm_s = nx_match_to_string(nxm, ntohs(nfm->match_len));
- ds_put_cstr(s, nxm_s);
- free(nxm_s);
-
- /* nx_match_to_string() doesn't print priority. */
- need_priority = true;
- } else {
- cls_rule_format(&fm.cr, s);
-
- /* cls_rule_format() does print priority. */
- need_priority = false;
- }
+ cls_rule_format(&fm.cr, s);
if (ds_last(s) != ' ') {
ds_put_char(s, ' ');
@@ -740,9 +716,6 @@ ofp_print_flow_mod(struct ds *s, const struct ofp_header *oh,
if (fm.hard_timeout != OFP_FLOW_PERMANENT) {
ds_put_format(s, "hard:%"PRIu16" ", fm.hard_timeout);
}
- if (fm.cr.priority != OFP_DEFAULT_PRIORITY && need_priority) {
- ds_put_format(s, "pri:%"PRIu16" ", fm.cr.priority);
- }
if (fm.buffer_id != UINT32_MAX) {
ds_put_format(s, "buf:0x%"PRIx32" ", fm.buffer_id);
}
@@ -1456,9 +1429,10 @@ ofp_to_string__(const struct ofp_header *oh,
ofp_print_packet_out(string, msg, verbosity);
break;
- case OFPUTIL_OFPT_FLOW_MOD:
+ case OFPUTIL_OFPT10_FLOW_MOD:
+ case OFPUTIL_OFPT11_FLOW_MOD:
case OFPUTIL_NXT_FLOW_MOD:
- ofp_print_flow_mod(string, msg, code, verbosity);
+ ofp_print_flow_mod(string, msg);
break;
case OFPUTIL_OFPT_PORT_MOD:
@@ -1479,12 +1453,14 @@ ofp_to_string__(const struct ofp_header *oh,
ofp_print_stats_request(string, oh);
break;
- case OFPUTIL_OFPST_FLOW_REQUEST:
+ case OFPUTIL_OFPST10_FLOW_REQUEST:
+ case OFPUTIL_OFPST11_FLOW_REQUEST:
case OFPUTIL_NXST_FLOW_REQUEST:
- case OFPUTIL_OFPST_AGGREGATE_REQUEST:
+ case OFPUTIL_OFPST10_AGGREGATE_REQUEST:
+ case OFPUTIL_OFPST11_AGGREGATE_REQUEST:
case OFPUTIL_NXST_AGGREGATE_REQUEST:
ofp_print_stats_request(string, oh);
- ofp_print_flow_stats_request(string, msg);
+ ofp_print_flow_stats_request(string, oh);
break;
case OFPUTIL_OFPST_TABLE_REQUEST:
@@ -1506,7 +1482,8 @@ ofp_to_string__(const struct ofp_header *oh,
ofp_print_ofpst_desc_reply(string, msg);
break;
- case OFPUTIL_OFPST_FLOW_REPLY:
+ case OFPUTIL_OFPST10_FLOW_REPLY:
+ case OFPUTIL_OFPST11_FLOW_REPLY:
case OFPUTIL_NXST_FLOW_REPLY:
ofp_print_stats_reply(string, oh);
ofp_print_flow_stats_reply(string, oh);
@@ -1527,7 +1504,8 @@ ofp_to_string__(const struct ofp_header *oh,
ofp_print_ofpst_table_reply(string, oh, verbosity);
break;
- case OFPUTIL_OFPST_AGGREGATE_REPLY:
+ case OFPUTIL_OFPST10_AGGREGATE_REPLY:
+ case OFPUTIL_OFPST11_AGGREGATE_REPLY:
ofp_print_stats_reply(string, oh);
ofp_print_ofpst_aggregate_reply(string, msg);
break;
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 11c467e..9414cd4 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -263,6 +263,31 @@ ofputil_cls_rule_to_ofp10_match(const struct cls_rule *rule,
memset(match->pad2, '\0', sizeof match->pad2);
}
+enum ofperr
+ofputil_pull_ofp11_match(struct ofpbuf *buf, unsigned int priority,
+ struct cls_rule *rule)
+{
+ struct ofp11_match_header *omh;
+ struct ofp11_match *om;
+
+ if (buf->size < sizeof(struct ofp11_match_header)) {
+ return OFPERR_OFPBMC_BAD_LEN;
+ }
+
+ omh = buf->data;
+ switch (ntohs(omh->type)) {
+ case OFPMT_STANDARD:
+ if (omh->length != htons(sizeof *om) || buf->size < sizeof *om) {
+ return OFPERR_OFPBMC_BAD_LEN;
+ }
+ om = ofpbuf_pull(buf, sizeof *om);
+ return ofputil_cls_rule_from_ofp11_match(om, priority, rule);
+
+ default:
+ return OFPERR_OFPBMC_BAD_TYPE;
+ }
+}
+
/* Converts the ofp11_match in 'match' into a cls_rule in 'rule', with the
* given 'priority'. Returns 0 if successful, otherwise an OFPERR_* value. */
enum ofperr
@@ -747,6 +772,8 @@ static const struct ofputil_msg_type ofputil_msg_types[] = {
sizeof(struct ofp_switch_features), sizeof(struct ofp11_port)),
OFPT11(PORT_STATUS, OFPT_PORT_STATUS,
sizeof(struct ofp_port_status) + sizeof(struct ofp11_port), 0),
+ OFPT11(FLOW_MOD, OFPT11_FLOW_MOD,
+ sizeof(struct ofp11_flow_mod), 1),
OFPT11(PORT_MOD, OFPT11_PORT_MOD,
sizeof(struct ofp11_port_mod), 0),
#undef OPFT11
@@ -1500,87 +1527,131 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm,
ofpbuf_use_const(&b, oh, ntohs(oh->length));
ofputil_decode_msg_type(oh, &type);
- if (ofputil_msg_type_code(type) == OFPUTIL_OFPT_FLOW_MOD) {
- /* Standard OpenFlow flow_mod. */
- const struct ofp_flow_mod *ofm;
- uint16_t priority;
+ if (ofputil_msg_type_code(type) == OFPUTIL_OFPT11_FLOW_MOD) {
+ /* Standard OpenFlow 1.1 flow_mod. */
+ const struct ofp11_flow_mod *ofm;
enum ofperr error;
- /* Get the ofp_flow_mod. */
ofm = ofpbuf_pull(&b, sizeof *ofm);
- /* Set priority based on original wildcards. Normally we'd allow
- * ofputil_cls_rule_from_match() to do this for us, but
- * ofputil_normalize_rule() can put wildcards where the original flow
- * didn't have them. */
- priority = ntohs(ofm->priority);
- if (!(ofm->match.wildcards & htonl(OFPFW10_ALL))) {
- priority = UINT16_MAX;
+ error = ofputil_pull_ofp11_match(&b, ntohs(ofm->priority), &fm->cr);
+ if (error) {
+ return error;
}
- /* Translate the rule. */
- ofputil_cls_rule_from_ofp10_match(&ofm->match, priority, &fm->cr);
- ofputil_normalize_rule(&fm->cr);
-
- /* Now get the actions. */
- error = ofpacts_pull_openflow10(&b, b.size, ofpacts);
+ error = ofpacts_pull_openflow11_instructions(&b, b.size, ofpacts);
if (error) {
return error;
}
/* Translate the message. */
- command = ntohs(ofm->command);
- fm->cookie = htonll(0);
- fm->cookie_mask = htonll(0);
- fm->new_cookie = ofm->cookie;
+ if (ofm->command == OFPFC_ADD) {
+ fm->cookie = htonll(0);
+ fm->cookie_mask = htonll(0);
+ fm->new_cookie = ofm->cookie;
+ } else {
+ /* XXX */
+ fm->cookie = ofm->cookie;
+ fm->cookie_mask = ofm->cookie_mask;
+ fm->new_cookie = htonll(UINT64_MAX);
+ }
+ fm->command = ofm->command;
+ fm->table_id = ofm->table_id;
fm->idle_timeout = ntohs(ofm->idle_timeout);
fm->hard_timeout = ntohs(ofm->hard_timeout);
fm->buffer_id = ntohl(ofm->buffer_id);
- fm->out_port = ntohs(ofm->out_port);
- fm->flags = ntohs(ofm->flags);
- } else if (ofputil_msg_type_code(type) == OFPUTIL_NXT_FLOW_MOD) {
- /* Nicira extended flow_mod. */
- const struct nx_flow_mod *nfm;
- enum ofperr error;
-
- /* Dissect the message. */
- nfm = ofpbuf_pull(&b, sizeof *nfm);
- error = nx_pull_match(&b, ntohs(nfm->match_len), ntohs(nfm->priority),
- &fm->cr, &fm->cookie, &fm->cookie_mask);
+ error = ofputil_port_from_ofp11(ofm->out_port, &fm->out_port);
if (error) {
return error;
}
- error = ofpacts_pull_openflow10(&b, b.size, ofpacts);
- if (error) {
- return error;
+ if (ofm->out_group != htonl(OFPG_ANY)) {
+ return OFPERR_NXFMFC_GROUPS_NOT_SUPPORTED;
}
-
- /* Translate the message. */
- command = ntohs(nfm->command);
- if ((command & 0xff) == OFPFC_ADD && fm->cookie_mask) {
- /* Flow additions may only set a new cookie, not match an
- * existing cookie. */
- return OFPERR_NXBRC_NXM_INVALID;
- }
- fm->new_cookie = nfm->cookie;
- fm->idle_timeout = ntohs(nfm->idle_timeout);
- fm->hard_timeout = ntohs(nfm->hard_timeout);
- fm->buffer_id = ntohl(nfm->buffer_id);
- fm->out_port = ntohs(nfm->out_port);
- fm->flags = ntohs(nfm->flags);
+ fm->flags = ntohs(ofm->flags);
} else {
- NOT_REACHED();
+ if (ofputil_msg_type_code(type) == OFPUTIL_OFPT10_FLOW_MOD) {
+ /* Standard OpenFlow 1.0 flow_mod. */
+ const struct ofp10_flow_mod *ofm;
+ uint16_t priority;
+ enum ofperr error;
+
+ /* Get the ofp10_flow_mod. */
+ ofm = ofpbuf_pull(&b, sizeof *ofm);
+
+ /* Set priority based on original wildcards. Normally we'd allow
+ * ofputil_cls_rule_from_match() to do this for us, but
+ * ofputil_normalize_rule() can put wildcards where the original flow
+ * didn't have them. */
+ priority = ntohs(ofm->priority);
+ if (!(ofm->match.wildcards & htonl(OFPFW10_ALL))) {
+ priority = UINT16_MAX;
+ }
+
+ /* Translate the rule. */
+ ofputil_cls_rule_from_ofp10_match(&ofm->match, priority, &fm->cr);
+ ofputil_normalize_rule(&fm->cr);
+
+ /* Now get the actions. */
+ error = ofpacts_pull_openflow10(&b, b.size, ofpacts);
+ if (error) {
+ return error;
+ }
+
+ /* Translate the message. */
+ command = ntohs(ofm->command);
+ fm->cookie = htonll(0);
+ fm->cookie_mask = htonll(0);
+ fm->new_cookie = ofm->cookie;
+ fm->idle_timeout = ntohs(ofm->idle_timeout);
+ fm->hard_timeout = ntohs(ofm->hard_timeout);
+ fm->buffer_id = ntohl(ofm->buffer_id);
+ fm->out_port = ntohs(ofm->out_port);
+ fm->flags = ntohs(ofm->flags);
+ } else if (ofputil_msg_type_code(type) == OFPUTIL_NXT_FLOW_MOD) {
+ /* Nicira extended flow_mod. */
+ const struct nx_flow_mod *nfm;
+ enum ofperr error;
+
+ /* Dissect the message. */
+ nfm = ofpbuf_pull(&b, sizeof *nfm);
+ error = nx_pull_match(&b, ntohs(nfm->match_len), ntohs(nfm->priority),
+ &fm->cr, &fm->cookie, &fm->cookie_mask);
+ if (error) {
+ return error;
+ }
+ error = ofpacts_pull_openflow10(&b, b.size, ofpacts);
+ if (error) {
+ return error;
+ }
+
+ /* Translate the message. */
+ command = ntohs(nfm->command);
+ if ((command & 0xff) == OFPFC_ADD && fm->cookie_mask) {
+ /* Flow additions may only set a new cookie, not match an
+ * existing cookie. */
+ return OFPERR_NXBRC_NXM_INVALID;
+ }
+ fm->new_cookie = nfm->cookie;
+ fm->idle_timeout = ntohs(nfm->idle_timeout);
+ fm->hard_timeout = ntohs(nfm->hard_timeout);
+ fm->buffer_id = ntohl(nfm->buffer_id);
+ fm->out_port = ntohs(nfm->out_port);
+ fm->flags = ntohs(nfm->flags);
+ } else {
+ NOT_REACHED();
+ }
+
+ if (protocol & OFPUTIL_P_TID) {
+ fm->command = command & 0xff;
+ fm->table_id = command >> 8;
+ } else {
+ fm->command = command;
+ fm->table_id = 0xff;
+ }
}
fm->ofpacts = ofpacts->data;
fm->ofpacts_len = ofpacts->size;
- if (protocol & OFPUTIL_P_TID) {
- fm->command = command & 0xff;
- fm->table_id = command >> 8;
- } else {
- fm->command = command;
- fm->table_id = 0xff;
- }
return 0;
}
@@ -1732,7 +1803,7 @@ ofputil_decode_flow_stats_request(struct ofputil_flow_stats_request *fsr,
ofputil_decode_msg_type(oh, &type);
code = ofputil_msg_type_code(type);
switch (code) {
- case OFPUTIL_OFPST_FLOW_REQUEST:
+ case OFPUTIL_OFPST10_FLOW_REQUEST:
return ofputil_decode_ofpst_flow_request(fsr, b.data, false);
case OFPUTIL_OFPST_AGGREGATE_REQUEST:
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index 3395a38..277f058 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -49,7 +49,8 @@ enum ofputil_msg_code {
OFPUTIL_OFPT_FLOW_REMOVED,
OFPUTIL_OFPT_PORT_STATUS,
OFPUTIL_OFPT_PACKET_OUT,
- OFPUTIL_OFPT_FLOW_MOD,
+ OFPUTIL_OFPT10_FLOW_MOD,
+ OFPUTIL_OFPT11_FLOW_MOD,
OFPUTIL_OFPT_PORT_MOD,
OFPUTIL_OFPT_BARRIER_REQUEST,
OFPUTIL_OFPT_BARRIER_REPLY,
@@ -58,8 +59,10 @@ enum ofputil_msg_code {
/* OFPST_* stat requests. */
OFPUTIL_OFPST_DESC_REQUEST,
- OFPUTIL_OFPST_FLOW_REQUEST,
- OFPUTIL_OFPST_AGGREGATE_REQUEST,
+ OFPUTIL_OFPST10_FLOW_REQUEST,
+ OFPUTIL_OFPST11_FLOW_REQUEST,
+ OFPUTIL_OFPST10_AGGREGATE_REQUEST,
+ OFPUTIL_OFPST11_AGGREGATE_REQUEST,
OFPUTIL_OFPST_TABLE_REQUEST,
OFPUTIL_OFPST_PORT_REQUEST,
OFPUTIL_OFPST_QUEUE_REQUEST,
@@ -67,11 +70,13 @@ enum ofputil_msg_code {
/* OFPST_* stat replies. */
OFPUTIL_OFPST_DESC_REPLY,
- OFPUTIL_OFPST_FLOW_REPLY,
+ OFPUTIL_OFPST10_FLOW_REPLY,
+ OFPUTIL_OFPST11_FLOW_REPLY,
OFPUTIL_OFPST_QUEUE_REPLY,
OFPUTIL_OFPST_PORT_REPLY,
OFPUTIL_OFPST_TABLE_REPLY,
- OFPUTIL_OFPST_AGGREGATE_REPLY,
+ OFPUTIL_OFPST10_AGGREGATE_REPLY,
+ OFPUTIL_OFPST11_AGGREGATE_REPLY,
OFPUTIL_OFPST_PORT_DESC_REPLY,
/* NXT_* messages. */
@@ -188,6 +193,8 @@ void ofputil_cls_rule_to_ofp10_match(const struct cls_rule *,
struct ofp10_match *);
/* Work with ofp11_match. */
+enum ofperr ofputil_pull_ofp11_match(struct ofpbuf *, unsigned int priority,
+ struct cls_rule *);
enum ofperr ofputil_cls_rule_from_ofp11_match(const struct ofp11_match *,
unsigned int priority,
struct cls_rule *);
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index f6d8692..cafe417 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -3316,7 +3316,8 @@ handle_openflow__(struct ofconn *ofconn, const struct ofpbuf *msg)
case OFPUTIL_OFPT_PORT_MOD:
return handle_port_mod(ofconn, oh);
- case OFPUTIL_OFPT_FLOW_MOD:
+ case OFPUTIL_OFPT10_FLOW_MOD:
+ case OFPUTIL_OFPT11_FLOW_MOD:
return handle_flow_mod(ofconn, oh);
case OFPUTIL_OFPT_BARRIER_REQUEST:
@@ -3356,11 +3357,13 @@ handle_openflow__(struct ofconn *ofconn, const struct ofpbuf *msg)
case OFPUTIL_OFPST_DESC_REQUEST:
return handle_desc_stats_request(ofconn, msg->data);
- case OFPUTIL_OFPST_FLOW_REQUEST:
+ case OFPUTIL_OFPST10_FLOW_REQUEST:
+ case OFPUTIL_OFPST11_FLOW_REQUEST:
case OFPUTIL_NXST_FLOW_REQUEST:
return handle_flow_stats_request(ofconn, msg->data);
- case OFPUTIL_OFPST_AGGREGATE_REQUEST:
+ case OFPUTIL_OFPST10_AGGREGATE_REQUEST:
+ case OFPUTIL_OFPST11_AGGREGATE_REQUEST:
case OFPUTIL_NXST_AGGREGATE_REQUEST:
return handle_aggregate_stats_request(ofconn, msg->data);
@@ -3388,11 +3391,13 @@ handle_openflow__(struct ofconn *ofconn, const struct ofpbuf *msg)
case OFPUTIL_OFPT_QUEUE_GET_CONFIG_REQUEST:
case OFPUTIL_OFPT_QUEUE_GET_CONFIG_REPLY:
case OFPUTIL_OFPST_DESC_REPLY:
- case OFPUTIL_OFPST_FLOW_REPLY:
+ case OFPUTIL_OFPST10_FLOW_REPLY:
+ case OFPUTIL_OFPST11_FLOW_REPLY:
case OFPUTIL_OFPST_QUEUE_REPLY:
case OFPUTIL_OFPST_PORT_REPLY:
case OFPUTIL_OFPST_TABLE_REPLY:
- case OFPUTIL_OFPST_AGGREGATE_REPLY:
+ case OFPUTIL_OFPST10_AGGREGATE_REPLY:
+ case OFPUTIL_OFPST11_AGGREGATE_REPLY:
case OFPUTIL_OFPST_PORT_DESC_REPLY:
case OFPUTIL_NXT_ROLE_REPLY:
case OFPUTIL_NXT_FLOW_REMOVED:
--
1.7.2.5
More information about the dev
mailing list