From da89bf9eb715a779752462f523ab567ea3916fa9 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 29 Sep 2010 13:04:03 -0700 Subject: [PATCH] ofproto: Iterate through exact-match rules first during expiration. A wildcarded flow is idle only if all of its subrules have expired because they were idle, so unless we expire exact-match rules first it is possible that a wildcarded flow fails to expire as soon as it should. (The current implementation of classifier_for_each() iterates through exact-match rules before wildcarded rules, but nothing in the interface guarantees that.) --- ofproto/ofproto.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 859f416f..cc90f91c 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -4258,9 +4258,13 @@ ofproto_expire(struct ofproto *ofproto) /* Update 'used' for each flow in the datapath. */ ofproto_update_used(ofproto); - /* Expire idle flows. */ + /* Expire idle flows. + * + * A wildcarded flow is idle only when all of its subrules have expired due + * to becoming idle, so iterate through the exact-match flows first. */ cbdata.ofproto = ofproto; - classifier_for_each(&ofproto->cls, CLS_INC_ALL, rule_expire, &cbdata); + classifier_for_each(&ofproto->cls, CLS_INC_EXACT, rule_expire, &cbdata); + classifier_for_each(&ofproto->cls, CLS_INC_WILD, rule_expire, &cbdata); /* Let the hook know that we're at a stable point: all outstanding data * in existing flows has been accounted to the account_cb. Thus, the -- 2.30.2