From fa8b054f50e6f669a1cc4c41ada0f1fdad03e9dd Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 29 Oct 2010 11:38:39 -0700 Subject: [PATCH] ofproto: Disable timeouts for flows added by ofproto_add_flow(). None of the existing callers of ofproto_add_flow() want an idle timeout, but ofproto_add_flow() was giving them a 5-second timeout anyway. I don't know how this worked properly--in-band will patiently add the flow back every few seconds anyway, but the bridge doesn't do that. Also add an explanatory comment to ofproto_add_flow(). --- ofproto/fail-open.c | 2 +- ofproto/in-band.c | 2 +- ofproto/ofproto.c | 16 +++++++++++----- ofproto/ofproto.h | 3 +-- vswitchd/bridge.c | 2 +- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/ofproto/fail-open.c b/ofproto/fail-open.c index ba6dbcfa..cd1db94c 100644 --- a/ofproto/fail-open.c +++ b/ofproto/fail-open.c @@ -294,7 +294,7 @@ fail_open_flushed(struct fail_open *fo) action.output.port = htons(OFPP_NORMAL); cls_rule_init_catchall(&rule, FAIL_OPEN_PRIORITY); - ofproto_add_flow(fo->ofproto, &rule, &action, 1, 0); + ofproto_add_flow(fo->ofproto, &rule, &action, 1); } } diff --git a/ofproto/in-band.c b/ofproto/in-band.c index 722c1f91..9605b50f 100644 --- a/ofproto/in-band.c +++ b/ofproto/in-band.c @@ -591,7 +591,7 @@ add_rule(struct in_band *ib, const struct cls_rule *rule) action.output.len = htons(sizeof action); action.output.port = htons(OFPP_NORMAL); action.output.max_len = htons(0); - ofproto_add_flow(ib->ofproto, rule, &action, 1, 0); + ofproto_add_flow(ib->ofproto, rule, &action, 1); } /* Inserts flows into the flow table for the current state of 'ib'. */ diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 8348868b..9cb3f910 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -1298,15 +1298,21 @@ ofproto_send_packet(struct ofproto *p, const struct flow *flow, return 0; } +/* Adds a flow to the OpenFlow flow table in 'p' that matches 'cls_rule' and + * performs the 'n_actions' actions in 'actions'. The new flow will not + * timeout. + * + * If cls_rule->priority is in the range of priorities supported by OpenFlow + * (0...65535, inclusive) then the flow will be visible to OpenFlow + * controllers; otherwise, it will be hidden. + * + * The caller retains ownership of 'cls_rule' and 'actions'. */ void ofproto_add_flow(struct ofproto *p, const struct cls_rule *cls_rule, - const union ofp_action *actions, size_t n_actions, - int idle_timeout) + const union ofp_action *actions, size_t n_actions) { struct rule *rule; - rule = rule_create(p, NULL, actions, n_actions, - idle_timeout >= 0 ? idle_timeout : 5 /* XXX */, - 0, 0, false); + rule = rule_create(p, NULL, actions, n_actions, 0, 0, 0, false); rule->cr = *cls_rule; rule_insert(p, rule, NULL, 0); } diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h index a0a00f80..a3cc8255 100644 --- a/ofproto/ofproto.h +++ b/ofproto/ofproto.h @@ -128,8 +128,7 @@ int ofproto_send_packet(struct ofproto *, const struct flow *, const union ofp_action *, size_t n_actions, const struct ofpbuf *); void ofproto_add_flow(struct ofproto *, const struct cls_rule *, - const union ofp_action *, size_t n_actions, - int idle_timeout); + const union ofp_action *, size_t n_actions); void ofproto_delete_flow(struct ofproto *, const struct cls_rule *); void ofproto_flush_flows(struct ofproto *); diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 808fc586..9ddafe1e 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -1800,7 +1800,7 @@ bridge_reconfigure_remotes(struct bridge *br, action.output.len = htons(sizeof action); action.output.port = htons(OFPP_NORMAL); cls_rule_init_catchall(&rule, 0); - ofproto_add_flow(br->ofproto, &rule, &action, 1, 0); + ofproto_add_flow(br->ofproto, &rule, &action, 1); } } -- 2.30.2