- OpenFlow:
* The OpenFlow ofp_desc/serial_num may now be configured by setting the
value of other-config:dp-sn in the Bridge table.
+ * Added support to watch CONTROLLER port status in fast failover group.
- DPDK:
* Deprecated DPDK pdump packet capture support removed.
* Deprecated DPDK ring ports (dpdkr) are no longer supported.
} else if (!strcasecmp(key, "watch_port")) {
if (!ofputil_port_from_string(value, port_map, &bucket->watch_port)
|| (ofp_to_u16(bucket->watch_port) >= ofp_to_u16(OFPP_MAX)
- && bucket->watch_port != OFPP_ANY)) {
+ && bucket->watch_port != OFPP_ANY
+ && bucket->watch_port != OFPP_CONTROLLER)) {
error = xasprintf("%s: invalid watch_port", value);
}
} else if (!strcasecmp(key, "watch_group")) {
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
{
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;
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;
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);
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