From: Ben Pfaff Date: Tue, 23 Feb 2010 23:14:15 +0000 (-0800) Subject: ofproto: Delete fail-open flow when turning off fail-open mode. X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=2f6d344525463ebe52f6bbd0e9a4cc22e33dacbe;p=sliver-openvswitch.git ofproto: Delete fail-open flow when turning off fail-open mode. 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 . --- diff --git a/ofproto/fail-open.c b/ofproto/fail-open.c index 54a91cdfd..ff77de87e 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 a431cc78f..b1f022f25 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);