BFD: Reconfigure BFD on port deletion.
authorPavithra Ramesh <paramesh@vmware.com>
Tue, 28 May 2013 19:35:06 +0000 (12:35 -0700)
committerEthan Jackson <ethan@nicira.com>
Tue, 28 May 2013 19:37:32 +0000 (12:37 -0700)
Invoke the function to reconfigure BFD when a port/interface
is deleted.

Signed-off-by: Pavithra Ramesh <paramesh@vmware.com>
Signed-off-by: Ethan Jackson <ethan@nicira.com>
lib/bfd.c
ofproto/ofproto-dpif.c

index 95dad2d..9f671f2 100644 (file)
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -229,7 +229,8 @@ bfd_get_status(const struct bfd *bfd, struct smap *smap)
 /* Initializes, destroys, or reconfigures the BFD session 'bfd' (named 'name'),
  * according to the database configuration contained in 'cfg'.  Takes ownership
  * of 'bfd', which may be NULL.  Returns a BFD object which may be used as a
- * handle for the session, or NULL if BFD is not enabled according to 'cfg'. */
+ * handle for the session, or NULL if BFD is not enabled according to 'cfg'.
+ * Also returns NULL if cfg is NULL. */
 struct bfd *
 bfd_configure(struct bfd *bfd, const char *name,
               const struct smap *cfg)
@@ -246,7 +247,7 @@ bfd_configure(struct bfd *bfd, const char *name,
         init = true;
     }
 
-    if (!smap_get_bool(cfg, "enable", false)) {
+    if (!cfg || !smap_get_bool(cfg, "enable", false)) {
         if (bfd) {
             hmap_remove(&all_bfds, &bfd->node);
             free(bfd->name);
index 280fd57..b547298 100644 (file)
@@ -606,6 +606,7 @@ ofport_dpif_cast(const struct ofport *ofport)
 static void port_run(struct ofport_dpif *);
 static void port_run_fast(struct ofport_dpif *);
 static void port_wait(struct ofport_dpif *);
+static int set_bfd(struct ofport *, const struct smap *);
 static int set_cfm(struct ofport *, const struct cfm_settings *);
 static void ofport_clear_priorities(struct ofport_dpif *);
 static void run_fast_rl(void);
@@ -1869,6 +1870,7 @@ port_destruct(struct ofport *port_)
     ofproto->backer->need_revalidate = REV_RECONFIGURE;
     bundle_remove(port_);
     set_cfm(port_, NULL);
+    set_bfd(port_, NULL);
     if (ofproto->sflow) {
         dpif_sflow_del_port(ofproto->sflow, port->odp_port);
     }