Yes, that's right, thanks.
On Thu, Jul 04, 2013 at 11:58:32AM +0900, Joe Stringer wrote: > This looks like it retains the same behaviour as before, so looks good > to me. I assume this is to prepare for the final patch in the series. > > On Sat, Jun 29, 2013 at 8:27 AM, Ben Pfaff <b...@nicira.com> wrote: > > Signed-off-by: Ben Pfaff <b...@nicira.com> > > --- > > lib/learn.c | 3 ++- > > lib/ofp-parse.c | 2 ++ > > lib/ofp-util.c | 3 +++ > > lib/ofp-util.h | 41 +++++++++++++++++++++++++---------------- > > ofproto/ofproto-dpif.c | 1 + > > ofproto/ofproto.c | 2 +- > > utilities/ovs-ofctl.c | 1 + > > 7 files changed, 35 insertions(+), 18 deletions(-) > > > > diff --git a/lib/learn.c b/lib/learn.c > > index 0cc562d..5ec922a 100644 > > --- a/lib/learn.c > > +++ b/lib/learn.c > > @@ -1,5 +1,5 @@ > > /* > > - * Copyright (c) 2011, 2012 Nicira, Inc. > > + * Copyright (c) 2011, 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. > > @@ -303,6 +303,7 @@ learn_execute(const struct ofpact_learn *learn, const > > struct flow *flow, > > fm->cookie = htonll(0); > > fm->cookie_mask = htonll(0); > > fm->new_cookie = htonll(learn->cookie); > > + fm->modify_cookie = fm->new_cookie != htonll(UINT64_MAX); > > fm->table_id = learn->table_id; > > fm->command = OFPFC_MODIFY_STRICT; > > fm->idle_timeout = learn->idle_timeout; > > diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c > > index b1e369c..70b6ea8 100644 > > --- a/lib/ofp-parse.c > > +++ b/lib/ofp-parse.c > > @@ -903,6 +903,7 @@ parse_ofp_str(struct ofputil_flow_mod *fm, int command, > > const char *str_, > > } else{ > > fm->new_cookie = htonll(0); > > } > > + fm->modify_cookie = false; > > fm->table_id = 0xff; > > fm->command = command; > > fm->idle_timeout = OFP_FLOW_PERMANENT; > > @@ -983,6 +984,7 @@ parse_ofp_str(struct ofputil_flow_mod *fm, int command, > > const char *str_, > > ofp_fatal(str_, verbose, "cannot set cookie"); > > } > > fm->new_cookie = htonll(str_to_u64(value)); > > + fm->modify_cookie = true; > > } > > } else if (mf_from_name(name)) { > > parse_field(mf_from_name(name), value, &fm->match); > > diff --git a/lib/ofp-util.c b/lib/ofp-util.c > > index aa4009d..f1a6f2d 100644 > > --- a/lib/ofp-util.c > > +++ b/lib/ofp-util.c > > @@ -1523,6 +1523,7 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, > > fm->cookie_mask = ofm->cookie_mask; > > fm->new_cookie = htonll(UINT64_MAX); > > } > > + fm->modify_cookie = false; > > fm->command = ofm->command; > > fm->table_id = ofm->table_id; > > fm->idle_timeout = ntohs(ofm->idle_timeout); > > @@ -1568,6 +1569,7 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, > > fm->cookie = htonll(0); > > fm->cookie_mask = htonll(0); > > fm->new_cookie = ofm->cookie; > > + fm->modify_cookie = fm->new_cookie != htonll(UINT64_MAX); > > fm->idle_timeout = ntohs(ofm->idle_timeout); > > fm->hard_timeout = ntohs(ofm->hard_timeout); > > fm->buffer_id = ntohl(ofm->buffer_id); > > @@ -1599,6 +1601,7 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm, > > } > > fm->priority = ntohs(nfm->priority); > > fm->new_cookie = nfm->cookie; > > + fm->modify_cookie = fm->new_cookie != htonll(UINT64_MAX); > > fm->idle_timeout = ntohs(nfm->idle_timeout); > > fm->hard_timeout = ntohs(nfm->hard_timeout); > > fm->buffer_id = ntohl(nfm->buffer_id); > > diff --git a/lib/ofp-util.h b/lib/ofp-util.h > > index 39c81be..85456a5 100644 > > --- a/lib/ofp-util.h > > +++ b/lib/ofp-util.h > > @@ -197,27 +197,36 @@ struct ofpbuf *ofputil_make_flow_mod_table_id(bool > > flow_mod_table_id); > > /* Protocol-independent flow_mod. > > * > > * The handling of cookies across multiple versions of OpenFlow is a bit > > - * confusing. A full description of Open vSwitch's cookie handling is > > - * in the DESIGN file. The following table shows the expected values of > > - * the cookie-related fields for the different flow_mod commands in > > - * OpenFlow 1.0 ("OF10") and NXM. "<used>" and "-" indicate a value > > - * that may be populated and an ignored field, respectively. > > - * > > - * cookie cookie_mask new_cookie > > - * ====== =========== ========== > > - * OF10 Add - 0 <used> > > - * OF10 Modify - 0 <used> > > - * OF10 Delete - 0 - > > - * NXM Add - 0 <used> > > - * NXM Modify <used> <used> <used> > > - * NXM Delete <used> <used> - > > - */ > > + * confusing. See DESIGN for the details. */ > > struct ofputil_flow_mod { > > struct match match; > > unsigned int priority; > > + > > + /* Cookie matching. The flow_mod affects only flows that have cookies > > that > > + * bitwise match 'cookie' bits in positions where 'cookie_mask has > > 1-bits. > > + * > > + * 'cookie_mask' should be zero for OFPFC_ADD flow_mods. */ > > ovs_be64 cookie; /* Cookie bits to match. */ > > ovs_be64 cookie_mask; /* 1-bit in each 'cookie' bit to match. */ > > - ovs_be64 new_cookie; /* New cookie to install or -1. */ > > + > > + /* Cookie changes. > > + * > > + * OFPFC_ADD uses 'new_cookie' as the new flow's cookie. 'new_cookie' > > + * should not be UINT64_MAX. > > + * > > + * OFPFC_MODIFY and OFPFC_MODIFY_STRICT have two cases: > > + * > > + * - If one or more matching flows exist and 'modify_cookie' is true, > > + * then the flow_mod changes the existing flows' cookies to > > + * 'new_cookie'. 'new_cookie' should not be UINT64_MAX. > > + * > > + * - If no matching flow exists, 'new_cookie' is not UINT64_MAX, and > > + * 'cookie_mask' is 0, then the flow_mod adds a new flow with > > + * 'new_cookie' as its cookie. > > + */ > > + ovs_be64 new_cookie; /* New cookie to install or UINT64_MAX. */ > > + bool modify_cookie; /* Set cookie of existing flow to > > 'new_cookie'? */ > > + > > uint8_t table_id; > > uint16_t command; > > uint16_t idle_timeout; > > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > > index 5ca16b7..e74d30a 100644 > > --- a/ofproto/ofproto-dpif.c > > +++ b/ofproto/ofproto-dpif.c > > @@ -1096,6 +1096,7 @@ add_internal_flow(struct ofproto_dpif *ofproto, int > > id, > > fm.new_cookie = htonll(0); > > fm.cookie = htonll(0); > > fm.cookie_mask = htonll(0); > > + fm.modify_cookie = false; > > fm.table_id = TBL_INTERNAL; > > fm.command = OFPFC_ADD; > > fm.idle_timeout = 0; > > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c > > index 522c839..114c0cd 100644 > > --- a/ofproto/ofproto.c > > +++ b/ofproto/ofproto.c > > @@ -3475,7 +3475,7 @@ modify_flows__(struct ofproto *ofproto, struct ofconn > > *ofconn, > > > > op = ofoperation_create(group, rule, OFOPERATION_MODIFY, 0); > > > > - if (fm->new_cookie != htonll(UINT64_MAX)) { > > + if (fm->modify_cookie && fm->new_cookie != htonll(UINT64_MAX)) { > > ofproto_rule_change_cookie(ofproto, rule, fm->new_cookie); > > } > > if (actions_changed) { > > diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c > > index adf86ad..1be13fe 100644 > > --- a/utilities/ovs-ofctl.c > > +++ b/utilities/ovs-ofctl.c > > @@ -2050,6 +2050,7 @@ fte_make_flow_mod(const struct fte *fte, int index, > > uint16_t command, > > fm.cookie = htonll(0); > > fm.cookie_mask = htonll(0); > > fm.new_cookie = version->cookie; > > + fm.modify_cookie = true; > > fm.table_id = 0xff; > > fm.command = command; > > fm.idle_timeout = version->idle_timeout; > > -- > > 1.7.2.5 > > > > _______________________________________________ > > dev mailing list > > dev@openvswitch.org > > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev