summaryrefslogtreecommitdiffstats
path: root/pimd/pim_bfd.c
diff options
context:
space:
mode:
authorChirag Shah <chirag@cumulusnetworks.com>2017-06-06 03:21:52 +0200
committerChirag Shah <chirag@cumulusnetworks.com>2017-06-06 03:21:52 +0200
commit72a83d6daa28f6eadb17114d0fda97e7de168d86 (patch)
tree8b48bd3e5357cabd267c016eb1aafa063597837e /pimd/pim_bfd.c
parentMerge remote-tracking branch 'origin/stable/2.0' (diff)
downloadfrr-72a83d6daa28f6eadb17114d0fda97e7de168d86.tar.xz
frr-72a83d6daa28f6eadb17114d0fda97e7de168d86.zip
pimd: fix pim bfd crash and bfd neigh down
During running config, all IFPs are traversed, bfd interface config write need to check for ifp->info null in case pim info is missing and skip the interface. bfd update for address change need to check if particular pim neighbor's address matches with bfd address update Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
Diffstat (limited to 'pimd/pim_bfd.c')
-rw-r--r--pimd/pim_bfd.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/pimd/pim_bfd.c b/pimd/pim_bfd.c
index b0915fa62..938e35e81 100644
--- a/pimd/pim_bfd.c
+++ b/pimd/pim_bfd.c
@@ -44,6 +44,9 @@ pim_bfd_write_config (struct vty *vty, struct interface *ifp)
struct pim_interface *pim_ifp = ifp->info;
struct bfd_info *bfd_info = NULL;
+ if (!pim_ifp)
+ return;
+
bfd_info = (struct bfd_info *) pim_ifp->bfd_info;
if (!bfd_info)
return;
@@ -194,6 +197,8 @@ pim_bfd_if_param_set (struct interface *ifp, u_int32_t min_rx,
struct pim_interface *pim_ifp = ifp->info;
int command = 0;
+ if (!pim_ifp)
+ return;
bfd_set_param ((struct bfd_info **) &(pim_ifp->bfd_info), min_rx, min_tx,
detect_mult, defaults, &command);
@@ -259,6 +264,10 @@ pim_bfd_interface_dest_update (int command, struct zclient *zclient,
for (ALL_LIST_ELEMENTS (pim_ifp->pim_neighbor_list, neigh_node,
neigh_nextnode, neigh))
{
+ /* Check neigh address matches with BFD address */
+ if (neigh->source_addr.s_addr != p.u.prefix4.s_addr)
+ continue;
+
bfd_info = (struct bfd_info *) neigh->bfd_info;
if (bfd_info->status == status)
{