summaryrefslogtreecommitdiff
path: root/ofproto
diff options
context:
space:
mode:
authorVishal Deep Ajmera <vishal.deep.ajmera@ericsson.com>2020-02-03 11:32:46 +0100
committerBen Pfaff <blp@ovn.org>2020-03-06 13:25:23 -0800
commit44810e6d411e36efc56e949fd28d804e9750633e (patch)
treef93ce69ca637eedafac47e0bc65c6a1995463cd0 /ofproto
parentd57b89f3268dd918cf5800f2887f6e4dd6e3b967 (diff)
downloadopenvswitch-44810e6d411e36efc56e949fd28d804e9750633e.tar.gz
ofproto: Add support to watch controller port liveness in fast-failover group
Currently fast-failover group does not support checking liveness of controller port (OFPP_CONTROLLER). However this feature can be useful for selecting alternate pipeline when controller connection itself is down for e.g. by using local DHCP server to reply for any DHCP request originating from VMs. This patch adds the support for watching controller port liveness in fast- failover group. Controller port is considered live when atleast one of-connection is alive. Example usage: ovs-ofctl add-group br-int 'group_id=1234,type=ff, bucket=watch_port:CONTROLLER,actions:<A>, bucket=watch_port:1,actions:<B> Signed-off-by: Vishal Deep Ajmera <vishal.deep.ajmera@ericsson.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'ofproto')
-rw-r--r--ofproto/ofproto-dpif-xlate.c5
-rw-r--r--ofproto/ofproto-dpif.c10
-rw-r--r--ofproto/ofproto-dpif.h3
-rw-r--r--ofproto/ofproto.c3
4 files changed, 19 insertions, 2 deletions
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 0b45ecf3d..adf57a5e8 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -1888,9 +1888,12 @@ bucket_is_alive(const struct xlate_ctx *ctx,
return (!ofputil_bucket_has_liveness(bucket)
|| (bucket->watch_port != OFPP_ANY
+ && bucket->watch_port != OFPP_CONTROLLER
&& odp_port_is_alive(ctx, bucket->watch_port))
|| (bucket->watch_group != OFPG_ANY
- && group_is_alive(ctx, bucket->watch_group, depth + 1)));
+ && group_is_alive(ctx, bucket->watch_group, depth + 1))
+ || (bucket->watch_port == OFPP_CONTROLLER
+ && ofproto_is_alive(&ctx->xbridge->ofproto->up)));
}
static void
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index d56cece95..d21874b46 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -1800,6 +1800,7 @@ run(struct ofproto *ofproto_)
{
struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_);
uint64_t new_seq, new_dump_seq;
+ bool is_connected;
if (mbridge_need_revalidate(ofproto->mbridge)) {
ofproto->backer->need_revalidate = REV_RECONFIGURE;
@@ -1868,6 +1869,15 @@ run(struct ofproto *ofproto_)
ofproto->backer->need_revalidate = REV_MCAST_SNOOPING;
}
+ /* Check if controller connection is toggled. */
+ is_connected = ofproto_is_alive(&ofproto->up);
+ if (ofproto->is_controller_connected != is_connected) {
+ ofproto->is_controller_connected = is_connected;
+ /* Trigger revalidation as fast failover group monitoring
+ * controller port may need to check liveness again. */
+ ofproto->backer->need_revalidate = REV_RECONFIGURE;
+ }
+
new_dump_seq = seq_read(udpif_dump_seq(ofproto->backer->udpif));
if (ofproto->dump_seq != new_dump_seq) {
struct rule *rule, *next_rule;
diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h
index c9d5df34b..aee61d61d 100644
--- a/ofproto/ofproto-dpif.h
+++ b/ofproto/ofproto-dpif.h
@@ -342,6 +342,9 @@ struct ofproto_dpif {
struct guarded_list ams; /* Contains "struct ofproto_async_msgs"s. */
struct seq *ams_seq; /* For notifying 'ams' reception. */
uint64_t ams_seqno;
+
+ bool is_controller_connected; /* True if any controller admitted this
+ * switch connection. */
};
struct ofproto_dpif *ofproto_dpif_lookup_by_name(const char *name);
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index e2591287d..0fbd6c380 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -1906,7 +1906,8 @@ ofproto_wait(struct ofproto *p)
bool
ofproto_is_alive(const struct ofproto *p)
{
- return connmgr_has_controllers(p->connmgr);
+ return (connmgr_has_controllers(p->connmgr)
+ && connmgr_is_any_controller_admitted(p->connmgr));
}
/* Adds some memory usage statistics for 'ofproto' into 'usage', for use with