[ovs-dev] [PATCH] ofproto: Delete fail-open flow when turning off fail-open mode.
Ben Pfaff
blp at nicira.com
Tue Feb 23 15:14:45 PST 2010
fail_open_destroy() was not deleting the fail-open flow, so turning off
fail-open mode did not work if fail-open had already been triggered.
This commit fixes the problem.
Reported by Paul Ingram <paul at nicira.com>.
---
ofproto/fail-open.c | 15 +++++++++++++--
ofproto/ofproto.c | 4 +++-
2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/ofproto/fail-open.c b/ofproto/fail-open.c
index 54a91cd..ff77de8 100644
--- a/ofproto/fail-open.c
+++ b/ofproto/fail-open.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2009 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -76,6 +76,8 @@ struct fail_open {
struct rconn_packet_counter *bogus_packet_counter;
};
+static void fail_open_recover(struct fail_open *);
+
/* Returns true if 'fo' should be in fail-open mode, otherwise false. */
static inline bool
should_fail_open(const struct fail_open *fo)
@@ -155,7 +157,15 @@ fail_open_run(struct fail_open *fo)
void
fail_open_maybe_recover(struct fail_open *fo)
{
- if (fail_open_is_active(fo) && rconn_is_admitted(fo->controller)) {
+ if (rconn_is_admitted(fo->controller)) {
+ fail_open_recover(fo);
+ }
+}
+
+static void
+fail_open_recover(struct fail_open *fo)
+{
+ if (fail_open_is_active(fo)) {
flow_t flow;
VLOG_WARN("No longer in fail-open mode");
@@ -235,6 +245,7 @@ void
fail_open_destroy(struct fail_open *fo)
{
if (fo) {
+ fail_open_recover(fo);
/* We don't own fo->controller. */
switch_status_unregister(fo->ss_cat);
rconn_packet_counter_destroy(fo->bogus_packet_counter);
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index a431cc7..b1f022f 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -679,6 +679,9 @@ ofproto_destroy(struct ofproto *p)
return;
}
+ /* Destroy fail-open early, because it touches the classifier. */
+ ofproto_set_failure(p, false);
+
ofproto_flush_flows(p);
classifier_destroy(&p->cls);
@@ -697,7 +700,6 @@ ofproto_destroy(struct ofproto *p)
switch_status_destroy(p->switch_status);
in_band_destroy(p->in_band);
discovery_destroy(p->discovery);
- fail_open_destroy(p->fail_open);
pinsched_destroy(p->miss_sched);
pinsched_destroy(p->action_sched);
netflow_destroy(p->netflow);
--
1.6.6.1
More information about the dev
mailing list