Acked-by: Ethan Jackson <et...@nicira.com>
On Mon, Aug 26, 2013 at 5:10 PM, Ben Pfaff <b...@nicira.com> wrote: > The OFPFF_* flags used in flow_mods are just confusing enough that it > seems worthwhile to try to abstract them out. In particular: > > * OFPFF_EMERG was introduced in OF1.0, deleted in OF1.1, and then > its bit was reused for a different purpose in OF1.2. > > * OFPFF_RESET_COUNTS was introduced in OF1.2 but the semantics that it > specifies are implied by "add" commands in earlier versions, so > proper translation requires the OpenFlow version number and flow_mod > command. > > This commit does the abstraction. > > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > lib/learn.c | 15 +++++- > lib/ofp-actions.h | 2 +- > lib/ofp-errors.h | 3 +- > lib/ofp-parse.c | 10 ++-- > lib/ofp-print.c | 28 +++++----- > lib/ofp-util.c | 143 > +++++++++++++++++++++++++++++++++++++++---------- > lib/ofp-util.h | 14 ++++- > ofproto/ofproto.c | 16 +++--- > utilities/ovs-ofctl.c | 3 +- > 9 files changed, 171 insertions(+), 63 deletions(-) > > diff --git a/lib/learn.c b/lib/learn.c > index 49d9efd..68d95cb 100644 > --- a/lib/learn.c > +++ b/lib/learn.c > @@ -97,12 +97,23 @@ learn_from_openflow(const struct nx_action_learn *nal, > struct ofpbuf *ofpacts) > learn->hard_timeout = ntohs(nal->hard_timeout); > learn->priority = ntohs(nal->priority); > learn->cookie = ntohll(nal->cookie); > - learn->flags = ntohs(nal->flags); > learn->table_id = nal->table_id; > learn->fin_idle_timeout = ntohs(nal->fin_idle_timeout); > learn->fin_hard_timeout = ntohs(nal->fin_hard_timeout); > > - if (learn->flags & ~OFPFF_SEND_FLOW_REM || learn->table_id == 0xff) { > + /* We only support "send-flow-removed" for now. */ > + switch (ntohs(nal->flags)) { > + case 0: > + learn->flags = 0; > + break; > + case OFPFF_SEND_FLOW_REM: > + learn->flags = OFPUTIL_FF_SEND_FLOW_REM; > + break; > + default: > + return OFPERR_OFPBAC_BAD_ARGUMENT; > + } > + > + if (learn->table_id == 0xff) { > return OFPERR_OFPBAC_BAD_ARGUMENT; > } > > diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h > index ca33ca8..101c33d 100644 > --- a/lib/ofp-actions.h > +++ b/lib/ofp-actions.h > @@ -414,7 +414,7 @@ struct ofpact_learn { > uint16_t hard_timeout; /* Max time before discarding (seconds). */ > uint16_t priority; /* Priority level of flow entry. */ > uint64_t cookie; /* Cookie for new flow. */ > - uint16_t flags; /* Either 0 or OFPFF_SEND_FLOW_REM. */ > + enum ofputil_flow_mod_flags flags; > uint8_t table_id; /* Table to insert flow entry. */ > uint16_t fin_idle_timeout; /* Idle timeout after FIN, if nonzero. */ > uint16_t fin_hard_timeout; /* Hard timeout after FIN, if nonzero. */ > diff --git a/lib/ofp-errors.h b/lib/ofp-errors.h > index 79acd30..c80a75e 100644 > --- a/lib/ofp-errors.h > +++ b/lib/ofp-errors.h > @@ -349,7 +349,8 @@ enum ofperr { > /* OF1.0(3,4), OF1.1+(5,6). Unsupported or unknown command. */ > OFPERR_OFPFMFC_BAD_COMMAND, > > - /* OF1.2+(5,7). Unsupported or unknown flags. */ > + /* NX1.0(3,258), NX1.1(5,258), OF1.2+(5,7). Unsupported or unknown > + * flags. */ > OFPERR_OFPFMFC_BAD_FLAGS, > > /* OF1.0(3,5). Unsupported action list - cannot process in the order > diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c > index dd0738c..c854066 100644 > --- a/lib/ofp-parse.c > +++ b/lib/ofp-parse.c > @@ -1161,15 +1161,15 @@ parse_ofp_str__(struct ofputil_flow_mod *fm, int > command, char *string) > match_set_nw_proto(&fm->match, p->nw_proto); > } > } else if (fields & F_FLAGS && !strcmp(name, "send_flow_rem")) { > - fm->flags |= OFPFF_SEND_FLOW_REM; > + fm->flags |= OFPUTIL_FF_SEND_FLOW_REM; > } else if (fields & F_FLAGS && !strcmp(name, "check_overlap")) { > - fm->flags |= OFPFF_CHECK_OVERLAP; > + fm->flags |= OFPUTIL_FF_CHECK_OVERLAP; > } else if (fields & F_FLAGS && !strcmp(name, "reset_counts")) { > - fm->flags |= OFPFF12_RESET_COUNTS; > + fm->flags |= OFPUTIL_FF_RESET_COUNTS; > } else if (fields & F_FLAGS && !strcmp(name, "no_packet_counts")) { > - fm->flags |= OFPFF13_NO_PKT_COUNTS; > + fm->flags |= OFPUTIL_FF_NO_PKT_COUNTS; > } else if (fields & F_FLAGS && !strcmp(name, "no_byte_counts")) { > - fm->flags |= OFPFF13_NO_BYT_COUNTS; > + fm->flags |= OFPUTIL_FF_NO_BYT_COUNTS; > } else { > char *value; > > diff --git a/lib/ofp-print.c b/lib/ofp-print.c > index 23ba9d4..560762b 100644 > --- a/lib/ofp-print.c > +++ b/lib/ofp-print.c > @@ -724,30 +724,23 @@ ofp10_match_to_string(const struct ofp10_match *om, int > verbosity) > } > > static void > -ofp_print_flow_flags(struct ds *s, uint16_t flags) > +ofp_print_flow_flags(struct ds *s, enum ofputil_flow_mod_flags flags) > { > - if (flags & OFPFF_SEND_FLOW_REM) { > + if (flags & OFPUTIL_FF_SEND_FLOW_REM) { > ds_put_cstr(s, "send_flow_rem "); > } > - if (flags & OFPFF_CHECK_OVERLAP) { > + if (flags & OFPUTIL_FF_CHECK_OVERLAP) { > ds_put_cstr(s, "check_overlap "); > } > - if (flags & OFPFF12_RESET_COUNTS) { > + if (flags & OFPUTIL_FF_RESET_COUNTS) { > ds_put_cstr(s, "reset_counts "); > } > - if (flags & OFPFF13_NO_PKT_COUNTS) { > + if (flags & OFPUTIL_FF_NO_PKT_COUNTS) { > ds_put_cstr(s, "no_packet_counts "); > } > - if (flags & OFPFF13_NO_BYT_COUNTS) { > + if (flags & OFPUTIL_FF_NO_BYT_COUNTS) { > ds_put_cstr(s, "no_byte_counts "); > } > - > - flags &= ~(OFPFF_SEND_FLOW_REM | OFPFF_CHECK_OVERLAP > - | OFPFF12_RESET_COUNTS > - | OFPFF13_NO_PKT_COUNTS | OFPFF13_NO_BYT_COUNTS); > - if (flags) { > - ds_put_format(s, "flags:0x%"PRIx16" ", flags); > - } > } > > static void > @@ -848,9 +841,14 @@ ofp_print_flow_mod(struct ds *s, const struct ofp_header > *oh, int verbosity) > ofputil_format_port(fm.out_port, s); > ds_put_char(s, ' '); > } > - if (fm.flags != 0) { > - ofp_print_flow_flags(s, fm.flags); > + > + if (oh->version == OFP10_VERSION || oh->version == OFP11_VERSION) { > + /* Don't print the reset_counts flag for OF1.0 and OF1.1 because > those > + * versions don't really have such a flag and printing one is likely > to > + * confuse people. */ > + fm.flags &= ~OFPUTIL_FF_RESET_COUNTS; > } > + ofp_print_flow_flags(s, fm.flags); > > ofpacts_format(fm.ofpacts, fm.ofpacts_len, s); > ofpbuf_uninit(&ofpacts); > diff --git a/lib/ofp-util.c b/lib/ofp-util.c > index edda338..6c48d17 100644 > --- a/lib/ofp-util.c > +++ b/lib/ofp-util.c > @@ -1554,6 +1554,74 @@ ofputil_make_flow_mod_table_id(bool flow_mod_table_id) > return msg; > } > > +struct ofputil_flow_mod_flag { > + uint16_t raw_flag; > + enum ofp_version min_version, max_version; > + enum ofputil_flow_mod_flags flag; > +}; > + > +static const struct ofputil_flow_mod_flag ofputil_flow_mod_flags[] = { > + { OFPFF_SEND_FLOW_REM, OFP10_VERSION, 0, OFPUTIL_FF_SEND_FLOW_REM }, > + { OFPFF_CHECK_OVERLAP, OFP10_VERSION, 0, OFPUTIL_FF_CHECK_OVERLAP }, > + { OFPFF10_EMERG, OFP10_VERSION, OFP10_VERSION, > + OFPUTIL_FF_EMERG }, > + { OFPFF12_RESET_COUNTS, OFP12_VERSION, 0, OFPUTIL_FF_RESET_COUNTS }, > + { OFPFF13_NO_PKT_COUNTS, OFP13_VERSION, 0, OFPUTIL_FF_NO_PKT_COUNTS }, > + { OFPFF13_NO_BYT_COUNTS, OFP13_VERSION, 0, OFPUTIL_FF_NO_BYT_COUNTS }, > + { 0, 0, 0, 0 }, > +}; > + > +static enum ofperr > +ofputil_decode_flow_mod_flags(ovs_be16 raw_flags_, > + enum ofp_flow_mod_command command, > + enum ofp_version version, > + enum ofputil_flow_mod_flags *flagsp) > +{ > + uint16_t raw_flags = ntohs(raw_flags_); > + const struct ofputil_flow_mod_flag *f; > + > + *flagsp = 0; > + for (f = ofputil_flow_mod_flags; f->raw_flag; f++) { > + if (raw_flags & f->raw_flag > + && version >= f->min_version > + && (!f->max_version || version <= f->max_version)) { > + raw_flags &= ~f->raw_flag; > + *flagsp |= f->flag; > + } > + } > + > + /* In OF1.0 and OF1.1, "add" always resets counters, and other commands > + * never do. > + * > + * In OF1.2 and later, OFPFF12_RESET_COUNTS controls whether each command > + * resets counters. */ > + if ((version == OFP10_VERSION || version == OFP11_VERSION) > + && command == OFPFC_ADD) { > + *flagsp |= OFPUTIL_FF_RESET_COUNTS; > + } > + > + return raw_flags ? OFPERR_OFPFMFC_BAD_FLAGS : 0; > +} > + > +static ovs_be16 > +ofputil_encode_flow_mod_flags(enum ofputil_flow_mod_flags flags, > + enum ofp_version version) > +{ > + const struct ofputil_flow_mod_flag *f; > + uint16_t raw_flags; > + > + raw_flags = 0; > + for (f = ofputil_flow_mod_flags; f->raw_flag; f++) { > + if (f->flag & flags > + && version >= f->min_version > + && (!f->max_version || version <= f->max_version)) { > + raw_flags |= f->raw_flag; > + } > + } > + > + return htons(raw_flags); > +} > + > /* Converts an OFPT_FLOW_MOD or NXT_FLOW_MOD message 'oh' into an abstract > * flow_mod in 'fm'. Returns 0 if successful, otherwise an OpenFlow error > * code. > @@ -1570,7 +1638,8 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, > enum ofputil_protocol protocol, > struct ofpbuf *ofpacts) > { > - uint16_t command; > + ovs_be16 raw_flags; > + enum ofperr error; > struct ofpbuf b; > enum ofpraw raw; > > @@ -1579,7 +1648,6 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, > if (raw == OFPRAW_OFPT11_FLOW_MOD) { > /* Standard OpenFlow 1.1+ flow_mod. */ > const struct ofp11_flow_mod *ofm; > - enum ofperr error; > > ofm = ofpbuf_pull(&b, sizeof *ofm); > > @@ -1626,12 +1694,13 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, > && ofm->out_group != htonl(OFPG_ANY)) { > return OFPERR_OFPFMFC_UNKNOWN; > } > - fm->flags = ntohs(ofm->flags); > + raw_flags = ofm->flags; > } else { > + uint16_t command; > + > if (raw == OFPRAW_OFPT10_FLOW_MOD) { > /* Standard OpenFlow 1.0 flow_mod. */ > const struct ofp10_flow_mod *ofm; > - enum ofperr error; > > /* Get the ofp10_flow_mod. */ > ofm = ofpbuf_pull(&b, sizeof *ofm); > @@ -1661,11 +1730,10 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, > fm->hard_timeout = ntohs(ofm->hard_timeout); > fm->buffer_id = ntohl(ofm->buffer_id); > fm->out_port = u16_to_ofp(ntohs(ofm->out_port)); > - fm->flags = ntohs(ofm->flags); > + raw_flags = ofm->flags; > } else if (raw == OFPRAW_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); > @@ -1692,23 +1760,11 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, > fm->hard_timeout = ntohs(nfm->hard_timeout); > fm->buffer_id = ntohl(nfm->buffer_id); > fm->out_port = u16_to_ofp(ntohs(nfm->out_port)); > - fm->flags = ntohs(nfm->flags); > + raw_flags = nfm->flags; > } else { > NOT_REACHED(); > } > > - if (fm->flags & OFPFF10_EMERG) { > - /* We do not support the OpenFlow 1.0 emergency flow cache, which > - * is not required in OpenFlow 1.0.1 and removed from OpenFlow > 1.1. > - * > - * OpenFlow 1.0 specifies the error code to use when idle_timeout > - * or hard_timeout is nonzero. Otherwise, there is no good error > - * code, so just state that the flow table is full. */ > - return (fm->hard_timeout || fm->idle_timeout > - ? OFPERR_OFPFMFC_BAD_EMERG_TIMEOUT > - : OFPERR_OFPFMFC_TABLE_FULL); > - } > - > fm->modify_cookie = fm->new_cookie != htonll(UINT64_MAX); > if (protocol & OFPUTIL_P_TID) { > fm->command = command & 0xff; > @@ -1722,6 +1778,24 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, > fm->ofpacts = ofpacts->data; > fm->ofpacts_len = ofpacts->size; > > + error = ofputil_decode_flow_mod_flags(raw_flags, fm->command, > + oh->version, &fm->flags); > + if (error) { > + return error; > + } > + > + if (fm->flags & OFPUTIL_FF_EMERG) { > + /* We do not support the OpenFlow 1.0 emergency flow cache, which > + * is not required in OpenFlow 1.0.1 and removed from OpenFlow 1.1. > + * > + * OpenFlow 1.0 specifies the error code to use when idle_timeout > + * or hard_timeout is nonzero. Otherwise, there is no good error > + * code, so just state that the flow table is full. */ > + return (fm->hard_timeout || fm->idle_timeout > + ? OFPERR_OFPFMFC_BAD_EMERG_TIMEOUT > + : OFPERR_OFPFMFC_TABLE_FULL); > + } > + > return 0; > } > > @@ -2105,6 +2179,8 @@ struct ofpbuf * > ofputil_encode_flow_mod(const struct ofputil_flow_mod *fm, > enum ofputil_protocol protocol) > { > + enum ofp_version version = ofputil_protocol_to_ofp_version(protocol); > + ovs_be16 raw_flags = ofputil_encode_flow_mod_flags(fm->flags, version); > struct ofpbuf *msg; > > switch (protocol) { > @@ -2115,9 +2191,7 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod > *fm, > int tailroom; > > tailroom = ofputil_match_typical_len(protocol) + fm->ofpacts_len; > - msg = ofpraw_alloc(OFPRAW_OFPT11_FLOW_MOD, > - ofputil_protocol_to_ofp_version(protocol), > - tailroom); > + msg = ofpraw_alloc(OFPRAW_OFPT11_FLOW_MOD, version, tailroom); > ofm = ofpbuf_put_zeros(msg, sizeof *ofm); > if ((protocol == OFPUTIL_P_OF11_STD > && (fm->command == OFPFC_MODIFY || > @@ -2137,7 +2211,7 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod > *fm, > ofm->buffer_id = htonl(fm->buffer_id); > ofm->out_port = ofputil_port_to_ofp11(fm->out_port); > ofm->out_group = htonl(OFPG11_ANY); > - ofm->flags = htons(fm->flags); > + ofm->flags = raw_flags; > ofputil_put_ofp11_match(msg, &fm->match, protocol); > ofpacts_put_openflow11_instructions(fm->ofpacts, fm->ofpacts_len, > msg); > break; > @@ -2158,7 +2232,7 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod > *fm, > ofm->priority = htons(fm->priority); > ofm->buffer_id = htonl(fm->buffer_id); > ofm->out_port = htons(ofp_to_u16(fm->out_port)); > - ofm->flags = htons(fm->flags); > + ofm->flags = raw_flags; > ofpacts_put_openflow10(fm->ofpacts, fm->ofpacts_len, msg); > break; > } > @@ -2180,7 +2254,7 @@ ofputil_encode_flow_mod(const struct ofputil_flow_mod > *fm, > nfm->priority = htons(fm->priority); > nfm->buffer_id = htonl(fm->buffer_id); > nfm->out_port = htons(ofp_to_u16(fm->out_port)); > - nfm->flags = htons(fm->flags); > + nfm->flags = raw_flags; > nfm->match_len = htons(match_len); > ofpacts_put_openflow10(fm->ofpacts, fm->ofpacts_len, msg); > break; > @@ -2446,6 +2520,7 @@ ofputil_decode_flow_stats_reply(struct > ofputil_flow_stats *fs, > bool flow_age_extension, > struct ofpbuf *ofpacts) > { > + const struct ofp_header *oh; > enum ofperr error; > enum ofpraw raw; > > @@ -2455,6 +2530,7 @@ ofputil_decode_flow_stats_reply(struct > ofputil_flow_stats *fs, > if (error) { > return error; > } > + oh = msg->l2; > > if (!msg->size) { > return EOF; > @@ -2495,7 +2571,15 @@ ofputil_decode_flow_stats_reply(struct > ofputil_flow_stats *fs, > fs->duration_nsec = ntohl(ofs->duration_nsec); > fs->idle_timeout = ntohs(ofs->idle_timeout); > fs->hard_timeout = ntohs(ofs->hard_timeout); > - fs->flags = (raw == OFPRAW_OFPST13_FLOW_REPLY) ? ntohs(ofs->flags) : > 0; > + if (raw == OFPRAW_OFPST13_FLOW_REPLY) { > + error = ofputil_decode_flow_mod_flags(ofs->flags, -1, > oh->version, > + &fs->flags); > + if (error) { > + return error; > + } > + } else { > + fs->flags = 0; > + } > fs->idle_age = -1; > fs->hard_age = -1; > fs->cookie = ofs->cookie; > @@ -2616,6 +2700,7 @@ ofputil_append_flow_stats_reply(const struct > ofputil_flow_stats *fs, > > ofpraw_decode_partial(&raw, reply->data, reply->size); > if (raw == OFPRAW_OFPST11_FLOW_REPLY || raw == > OFPRAW_OFPST13_FLOW_REPLY) { > + const struct ofp_header *oh = reply->data; > struct ofp11_flow_stats *ofs; > > ofpbuf_put_uninit(reply, sizeof *ofs); > @@ -2632,7 +2717,11 @@ ofputil_append_flow_stats_reply(const struct > ofputil_flow_stats *fs, > ofs->priority = htons(fs->priority); > ofs->idle_timeout = htons(fs->idle_timeout); > ofs->hard_timeout = htons(fs->hard_timeout); > - ofs->flags = (raw == OFPRAW_OFPST13_FLOW_REPLY) ? htons(fs->flags) : > 0; > + if (raw == OFPRAW_OFPST13_FLOW_REPLY) { > + ofs->flags = ofputil_encode_flow_mod_flags(fs->flags, > oh->version); > + } else { > + ofs->flags = 0; > + } > memset(ofs->pad2, 0, sizeof ofs->pad2); > ofs->cookie = fs->cookie; > ofs->packet_count = htonll(unknown_to_zero(fs->packet_count)); > diff --git a/lib/ofp-util.h b/lib/ofp-util.h > index f3348c0..7fb47de 100644 > --- a/lib/ofp-util.h > +++ b/lib/ofp-util.h > @@ -207,6 +207,16 @@ struct ofpbuf *ofputil_make_set_packet_in_format(enum > ofp_version, > /* NXT_FLOW_MOD_TABLE_ID extension. */ > struct ofpbuf *ofputil_make_flow_mod_table_id(bool flow_mod_table_id); > > +/* Protocol-independent flow_mod flags. */ > +enum ofputil_flow_mod_flags { > + OFPUTIL_FF_SEND_FLOW_REM = 1 << 0, /* All versions. */ > + OFPUTIL_FF_CHECK_OVERLAP = 1 << 1, /* All versions. */ > + OFPUTIL_FF_EMERG = 1 << 2, /* OpenFlow 1.0 only. */ > + OFPUTIL_FF_RESET_COUNTS = 1 << 3, /* OpenFlow 1.2+. */ > + OFPUTIL_FF_NO_PKT_COUNTS = 1 << 4, /* OpenFlow 1.3+. */ > + OFPUTIL_FF_NO_BYT_COUNTS = 1 << 5 /* OpenFlow 1.3+. */ > +}; > + > /* Protocol-independent flow_mod. > * > * The handling of cookies across multiple versions of OpenFlow is a bit > @@ -248,7 +258,7 @@ struct ofputil_flow_mod { > uint16_t hard_timeout; > uint32_t buffer_id; > ofp_port_t out_port; > - uint16_t flags; > + enum ofputil_flow_mod_flags flags; > struct ofpact *ofpacts; /* Series of "struct ofpact"s. */ > size_t ofpacts_len; /* Length of ofpacts, in bytes. */ > }; > @@ -296,7 +306,7 @@ struct ofputil_flow_stats { > uint64_t byte_count; /* Byte count, UINT64_MAX if unknown. */ > struct ofpact *ofpacts; > size_t ofpacts_len; > - uint16_t flags; /* Added for OF 1.3 */ > + enum ofputil_flow_mod_flags flags; > }; > > int ofputil_decode_flow_stats_reply(struct ofputil_flow_stats *, > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c > index 4e3efbe..080592e 100644 > --- a/ofproto/ofproto.c > +++ b/ofproto/ofproto.c > @@ -3073,17 +3073,17 @@ handle_flow_stats_request(struct ofconn *ofconn, > &fs.byte_count); > fs.ofpacts = rule->ofpacts; > fs.ofpacts_len = rule->ofpacts_len; > - fs.flags = 0; > > ovs_mutex_lock(&rule->timeout_mutex); > fs.idle_timeout = rule->idle_timeout; > fs.hard_timeout = rule->hard_timeout; > ovs_mutex_unlock(&rule->timeout_mutex); > > + fs.flags = 0; > if (rule->send_flow_removed) { > - fs.flags |= OFPFF_SEND_FLOW_REM; > - /* FIXME: Implement OF 1.3 flags OFPFF13_NO_PKT_COUNTS > - and OFPFF13_NO_BYT_COUNTS */ > + fs.flags |= OFPUTIL_FF_SEND_FLOW_REM; > + /* FIXME: Implement OFPUTIL_FF_NO_PKT_COUNTS and > + OFPUTIL_FF_NO_BYT_COUNTS. */ > } > ofputil_append_flow_stats_reply(&fs, &replies); > } > @@ -3416,7 +3416,7 @@ add_flow(struct ofproto *ofproto, struct ofconn *ofconn, > } > > /* Check for overlap, if requested. */ > - if (fm->flags & OFPFF_CHECK_OVERLAP) { > + if (fm->flags & OFPUTIL_FF_CHECK_OVERLAP) { > bool overlaps; > > ovs_rwlock_rdlock(&table->cls.rwlock); > @@ -3444,9 +3444,7 @@ add_flow(struct ofproto *ofproto, struct ofconn *ofconn, > ovs_mutex_unlock(&rule->timeout_mutex); > > rule->table_id = table - ofproto->tables; > - rule->send_flow_removed = (fm->flags & OFPFF_SEND_FLOW_REM) != 0; > - /* FIXME: Implement OF 1.3 flags OFPFF13_NO_PKT_COUNTS > - and OFPFF13_NO_BYT_COUNTS */ > + rule->send_flow_removed = (fm->flags & OFPUTIL_FF_SEND_FLOW_REM) != 0; > rule->ofpacts = xmemdup(fm->ofpacts, fm->ofpacts_len); > rule->ofpacts_len = fm->ofpacts_len; > rule->meter_id = find_meter(rule->ofpacts, rule->ofpacts_len); > @@ -3544,7 +3542,7 @@ modify_flows__(struct ofproto *ofproto, struct ofconn > *ofconn, > struct ofoperation *op; > bool actions_changed; > > - /* FIXME: Implement OFPFF12_RESET_COUNTS */ > + /* FIXME: Implement OFPFUTIL_FF_RESET_COUNTS */ > > if (rule_is_modifiable(rule)) { > /* At least one rule is modifiable, don't report EPERM error. */ > diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c > index 899ce4e..9ef11b0 100644 > --- a/utilities/ovs-ofctl.c > +++ b/utilities/ovs-ofctl.c > @@ -2010,7 +2010,8 @@ read_flows_from_file(const char *filename, struct > classifier *cls, int index) > version->cookie = fm.new_cookie; > version->idle_timeout = fm.idle_timeout; > version->hard_timeout = fm.hard_timeout; > - version->flags = fm.flags & (OFPFF_SEND_FLOW_REM | OFPFF10_EMERG); > + version->flags = fm.flags & (OFPUTIL_FF_SEND_FLOW_REM > + | OFPUTIL_FF_EMERG); > version->ofpacts = fm.ofpacts; > version->ofpacts_len = fm.ofpacts_len; > > -- > 1.7.10.4 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev