From: Donald Sharp Date: Wed, 12 Oct 2016 23:18:19 +0000 (-0400) Subject: pimd: Only delete on KAT when created by stream X-Git-Tag: frr-3.0-branchpoint~64^2~10^2~181 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=5ce794664d7404450a381c2dfc4abe408ba9aaba;p=mirror%2Ffrr.git pimd: Only delete on KAT when created by stream When we have pim_mroute.c or pim_register.c create the upstream state, only delete it then when the KAT timer expires, else we will not have the refcount right and we will do bad things. Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c index 165ea1fe32..eb127338e4 100644 --- a/pimd/pim_ifchannel.c +++ b/pimd/pim_ifchannel.c @@ -128,6 +128,7 @@ void pim_ifchannel_delete(struct pim_ifchannel *ch) } pim_upstream_del(ch->upstream); + ch->upstream = NULL; THREAD_OFF(ch->t_ifjoin_expiry_timer); THREAD_OFF(ch->t_ifjoin_prune_pending_timer); diff --git a/pimd/pim_mroute.c b/pimd/pim_mroute.c index 6f748db256..b9c97557c5 100644 --- a/pimd/pim_mroute.c +++ b/pimd/pim_mroute.c @@ -146,6 +146,7 @@ pim_mroute_msg_nocache (int fd, struct interface *ifp, const struct igmpmsg *msg return 0; } PIM_UPSTREAM_FLAG_SET_SRC_STREAM(up->flags); + PIM_UPSTREAM_FLAG_SET_CREATED_BY_UPSTREAM(up->flags); pim_upstream_keep_alive_timer_start (up, qpim_keep_alive_time); @@ -379,7 +380,7 @@ pim_mroute_msg_wrvifwhole (int fd, struct interface *ifp, const char *buf) return -2; } PIM_UPSTREAM_FLAG_SET_SRC_STREAM(up->flags); - PIM_UPSTREAM_FLAG_SET_FHR(up->flags); + PIM_UPSTREAM_FLAG_SET_CREATED_BY_UPSTREAM(up->flags); pim_upstream_keep_alive_timer_start (up, qpim_keep_alive_time); up->channel_oil = oil; diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 6fb42bcd6a..216e3390a6 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -339,6 +339,8 @@ pim_register_recv (struct interface *ifp, zlog_warn ("Failure to create upstream state"); return 1; } + PIM_UPSTREAM_FLAG_SET_CREATED_BY_UPSTREAM(upstream->flags); + upstream->upstream_register = src_addr; pim_rp_set_upstream_addr (&upstream->upstream_addr, sg.src, sg.grp); pim_nexthop_lookup (&upstream->rpf.source_nexthop, diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index eb69f63459..cbc8e50508 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -891,7 +891,8 @@ pim_upstream_keep_alive_timer (struct thread *t) pim_joinprune_send (up->rpf.source_nexthop.interface, up->rpf.rpf_addr.u.prefix4, &up->sg, 0); PIM_UPSTREAM_FLAG_UNSET_SRC_STREAM (up->flags); - pim_upstream_del (up); + if (PIM_UPSTREAM_FLAG_TEST_CREATED_BY_UPSTREAM(up->flags)) + pim_upstream_del (up); } else { diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h index 3c9862fe98..61f9d3226a 100644 --- a/pimd/pim_upstream.h +++ b/pimd/pim_upstream.h @@ -33,6 +33,7 @@ #define PIM_UPSTREAM_FLAG_MASK_SRC_IGMP (1 << 3) #define PIM_UPSTREAM_FLAG_MASK_SRC_PIM (1 << 4) #define PIM_UPSTREAM_FLAG_MASK_SRC_STREAM (1 << 5) +#define PIM_UPSTREAM_FLAG_MASK_CREATED_BY_UPSTREAM (1 << 6) #define PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) #define PIM_UPSTREAM_FLAG_TEST_DR_JOIN_DESIRED_UPDATED(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) @@ -40,6 +41,7 @@ #define PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) #define PIM_UPSTREAM_FLAG_TEST_SRC_PIM(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_PIM) #define PIM_UPSTREAM_FLAG_TEST_SRC_STREAM(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) +#define PIM_UPSTREAM_FLAG_TEST_CREATED_BY_UPSTREAM(flags) ((flags) & PIM_UPSTREAM_FLAG_MASK_CREATED_BY_UPSTREAM) #define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) #define PIM_UPSTREAM_FLAG_SET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) @@ -47,6 +49,7 @@ #define PIM_UPSTREAM_FLAG_SET_SRC_IGMP(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) #define PIM_UPSTREAM_FLAG_SET_SRC_PIM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_PIM) #define PIM_UPSTREAM_FLAG_SET_SRC_STREAM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) +#define PIM_UPSTREAM_FLAG_SET_CREATED_BY_UPSTREAM(flags) ((flags) |= PIM_UPSTREAM_FLAG_MASK_CREATED_BY_UPSTREAM) #define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED) #define PIM_UPSTREAM_FLAG_UNSET_DR_JOIN_DESIRED_UPDATED(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_DR_JOIN_DESIRED_UPDATED) @@ -54,6 +57,7 @@ #define PIM_UPSTREAM_FLAG_UNSET_SRC_IGMP(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_IGMP) #define PIM_UPSTREAM_FLAG_UNSET_SRC_PIM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_PIM) #define PIM_UPSTREAM_FLAG_UNSET_SRC_STREAM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_SRC_STREAM) +#define PIM_UPSTREAM_FLAG_UNSET_CREATED_BY_UPSTREAM(flags) ((flags) &= ~PIM_UPSTREAM_FLAG_MASK_CREATED_BY_UPSTREAM) enum pim_upstream_state { PIM_UPSTREAM_NOTJOINED,