summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnuradha Karuppiah <anuradhak@cumulusnetworks.com>2019-11-15 12:08:18 -0800
committerAnuradha Karuppiah <anuradhak@cumulusnetworks.com>2019-11-15 14:16:08 -0800
commitc5cdf069600c3a957ca83896b7d10c6dbe37fb93 (patch)
tree50e7f7bc7216acf5887fc41c0a9d1e9a81d5a31e
parentc692bd2ad42e941d0d63a149daaed1a331d47cd0 (diff)
pimd: jp-agg list update debug logs
Added event logs around add/del of upstream entries into the nbr's jp-agg list. This is to help debug a problem with stale (deleted) upstream entries being present in the list causing pimd to crash on the periodic processing. Signed-off-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
-rw-r--r--pimd/pim_jp_agg.c37
-rw-r--r--pimd/pim_jp_agg.h5
-rw-r--r--pimd/pim_upstream.c9
-rw-r--r--pimd/pim_zebra.c2
4 files changed, 44 insertions, 9 deletions
diff --git a/pimd/pim_jp_agg.c b/pimd/pim_jp_agg.c
index 5f9e166810..2662c9eae6 100644
--- a/pimd/pim_jp_agg.c
+++ b/pimd/pim_jp_agg.c
@@ -148,7 +148,8 @@ pim_jp_agg_get_interface_upstream_switch_list(struct pim_rpf *rpf)
return pius;
}
-void pim_jp_agg_remove_group(struct list *group, struct pim_upstream *up)
+void pim_jp_agg_remove_group(struct list *group, struct pim_upstream *up,
+ struct pim_neighbor *nbr)
{
struct listnode *node, *nnode;
struct pim_jp_agg_group *jag = NULL;
@@ -167,6 +168,20 @@ void pim_jp_agg_remove_group(struct list *group, struct pim_upstream *up)
break;
}
+ if (nbr) {
+ if (PIM_DEBUG_TRACE) {
+ char src_str[INET_ADDRSTRLEN];
+
+ pim_inet4_dump("<src?>", nbr->source_addr, src_str,
+ sizeof(src_str));
+ zlog_debug(
+ "up %s remove from nbr %s/%s jp-agg-list",
+ up->sg_str,
+ nbr->interface->name,
+ src_str);
+ }
+ }
+
if (js) {
js->up = NULL;
listnode_delete(jag->sources, js);
@@ -254,7 +269,7 @@ void pim_jp_agg_upstream_verification(struct pim_upstream *up, bool ignore)
}
void pim_jp_agg_add_group(struct list *group, struct pim_upstream *up,
- bool is_join)
+ bool is_join, struct pim_neighbor *nbr)
{
struct listnode *node, *nnode;
struct pim_jp_agg_group *jag = NULL;
@@ -280,6 +295,20 @@ void pim_jp_agg_add_group(struct list *group, struct pim_upstream *up,
break;
}
+ if (nbr) {
+ if (PIM_DEBUG_TRACE) {
+ char src_str[INET_ADDRSTRLEN];
+
+ pim_inet4_dump("<src?>", nbr->source_addr, src_str,
+ sizeof(src_str));
+ zlog_debug(
+ "up %s add to nbr %s/%s jp-agg-list",
+ up->sg_str,
+ up->rpf.source_nexthop.interface->name,
+ src_str);
+ }
+ }
+
if (!js) {
js = XCALLOC(MTYPE_PIM_JP_AGG_SOURCE,
sizeof(struct pim_jp_sources));
@@ -320,11 +349,11 @@ void pim_jp_agg_switch_interface(struct pim_rpf *orpf, struct pim_rpf *nrpf,
/* send Prune(S,G) to the old upstream neighbor */
if (opius)
- pim_jp_agg_add_group(opius->us, up, false);
+ pim_jp_agg_add_group(opius->us, up, false, NULL);
/* send Join(S,G) to the current upstream neighbor */
if (npius)
- pim_jp_agg_add_group(npius->us, up, true);
+ pim_jp_agg_add_group(npius->us, up, true, NULL);
}
diff --git a/pimd/pim_jp_agg.h b/pimd/pim_jp_agg.h
index aa21aa9816..d88ff8892b 100644
--- a/pimd/pim_jp_agg.h
+++ b/pimd/pim_jp_agg.h
@@ -37,10 +37,11 @@ void pim_jp_agg_group_list_free(struct pim_jp_agg_group *jag);
int pim_jp_agg_group_list_cmp(void *arg1, void *arg2);
void pim_jp_agg_clear_group(struct list *group);
-void pim_jp_agg_remove_group(struct list *group, struct pim_upstream *up);
+void pim_jp_agg_remove_group(struct list *group, struct pim_upstream *up,
+ struct pim_neighbor *nbr);
void pim_jp_agg_add_group(struct list *group, struct pim_upstream *up,
- bool is_join);
+ bool is_join, struct pim_neighbor *nbr);
void pim_jp_agg_switch_interface(struct pim_rpf *orpf, struct pim_rpf *nrpf,
struct pim_upstream *up);
diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c
index 4d0a63b915..411e767645 100644
--- a/pimd/pim_upstream.c
+++ b/pimd/pim_upstream.c
@@ -190,6 +190,11 @@ struct pim_upstream *pim_upstream_del(struct pim_instance *pim,
if (up->ref_count >= 1)
return up;
+ if (PIM_DEBUG_TRACE)
+ zlog_debug(
+ "pim_upstream free vrf:%s %s flags 0x%x",
+ pim->vrf->name, up->sg_str, up->flags);
+
THREAD_OFF(up->t_ka_timer);
THREAD_OFF(up->t_rs_timer);
THREAD_OFF(up->t_msdp_reg_timer);
@@ -333,7 +338,7 @@ static void join_timer_stop(struct pim_upstream *up)
up->rpf.rpf_addr.u.prefix4);
if (nbr)
- pim_jp_agg_remove_group(nbr->upstream_jp_agg, up);
+ pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr);
pim_jp_agg_upstream_verification(up, false);
}
@@ -355,7 +360,7 @@ void join_timer_start(struct pim_upstream *up)
}
if (nbr)
- pim_jp_agg_add_group(nbr->upstream_jp_agg, up, 1);
+ pim_jp_agg_add_group(nbr->upstream_jp_agg, up, 1, nbr);
else {
THREAD_OFF(up->t_join_timer);
thread_add_timer(router->master, on_join_timer, up,
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index dcc0f08426..89c4e3657c 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -271,7 +271,7 @@ void pim_zebra_upstream_rpf_changed(struct pim_instance *pim,
nbr = pim_neighbor_find(old->source_nexthop.interface,
old->rpf_addr.u.prefix4);
if (nbr)
- pim_jp_agg_remove_group(nbr->upstream_jp_agg, up);
+ pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr);
/*
* We have detected a case where we might need