Seems fine to me. Out of curiosity: Is this compatible with the 1.0 spec? I wonder if anyone is relying on the old behavior? Seems unlikely I suppose.
Ethan On Fri, Aug 19, 2011 at 15:28, Ben Pfaff <b...@nicira.com> wrote: > I finally found a good use for hard timeouts in OpenFlow, but they require > a slight reinterpretation of the meaning of hard timeouts. Until now, a > hard timeout meant that a flow would be removed the specified number of > seconds after a flow was created. Intervening modifications with > OFPFC_MODIFY(_STRICT) had no effect on the hard timeout; the flow would > still be deleted the specified number of seconds after its original > creation. > > This commit changes the effect of OFPFC_MODIFY(_STRICT). Now, modifying > a flow resets its hard timeout counter. A flow will time out the specified > number of seconds after creation or after the last time it is modified, > whichever comes later. > --- > ofproto/ofproto-dpif.c | 2 +- > ofproto/ofproto-provider.h | 3 ++- > ofproto/ofproto.c | 8 ++++++-- > 3 files changed, 9 insertions(+), 4 deletions(-) > > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > index 3130da4..2669bf0 100644 > --- a/ofproto/ofproto-dpif.c > +++ b/ofproto/ofproto-dpif.c > @@ -1992,7 +1992,7 @@ rule_expire(struct rule_dpif *rule) > /* Has 'rule' expired? */ > now = time_msec(); > if (rule->up.hard_timeout > - && now > rule->up.created + rule->up.hard_timeout * 1000) { > + && now > rule->up.modified + rule->up.hard_timeout * 1000) { > reason = OFPRR_HARD_TIMEOUT; > } else if (rule->up.idle_timeout && list_is_empty(&rule->facets) > && now > rule->used + rule->up.idle_timeout * 1000) { > diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h > index 9c53657..e56c8d1 100644 > --- a/ofproto/ofproto-provider.h > +++ b/ofproto/ofproto-provider.h > @@ -106,8 +106,9 @@ struct rule { > ovs_be64 flow_cookie; /* Controller-issued identifier. */ > > long long int created; /* Creation time. */ > + long long int modified; /* Time of last modification. */ > uint16_t idle_timeout; /* In seconds from time of last use. */ > - uint16_t hard_timeout; /* In seconds from time of creation. */ > + uint16_t hard_timeout; /* In seconds from last modification. */ > uint8_t table_id; /* Index in ofproto's 'tables' array. */ > bool send_flow_removed; /* Send a flow removed message? */ > > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c > index d35e1d8..b7e31d2 100644 > --- a/ofproto/ofproto.c > +++ b/ofproto/ofproto.c > @@ -2233,7 +2233,7 @@ add_flow(struct ofproto *ofproto, struct ofconn *ofconn, > rule->cr = fm->cr; > rule->pending = NULL; > rule->flow_cookie = fm->cookie; > - rule->created = time_msec(); > + rule->created = rule->modified = time_msec(); > rule->idle_timeout = fm->idle_timeout; > rule->hard_timeout = fm->hard_timeout; > rule->table_id = table - ofproto->tables; > @@ -2296,6 +2296,8 @@ modify_flows__(struct ofproto *ofproto, struct ofconn > *ofconn, > rule->actions = ofputil_actions_clone(fm->actions, fm->n_actions); > rule->n_actions = fm->n_actions; > rule->ofproto->ofproto_class->rule_modify_actions(rule); > + } else { > + rule->modified = time_msec(); > } > rule->flow_cookie = fm->cookie; > } > @@ -2904,7 +2906,9 @@ ofoperation_complete(struct ofoperation *op, int error) > break; > > case OFOPERATION_MODIFY: > - if (error) { > + if (!error) { > + rule->modified = time_msec(); > + } else { > free(rule->actions); > rule->actions = op->actions; > rule->n_actions = op->n_actions; > -- > 1.7.4.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