]> git.proxmox.com Git - mirror_frr.git/commitdiff
pimd: Only delete on KAT when created by stream
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 12 Oct 2016 23:18:19 +0000 (19:18 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 22 Dec 2016 01:26:11 +0000 (20:26 -0500)
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 <sharpd@cumulusnetworks.com>
pimd/pim_ifchannel.c
pimd/pim_mroute.c
pimd/pim_register.c
pimd/pim_upstream.c
pimd/pim_upstream.h

index 165ea1fe3288cd8e020593274c1099f8721aba64..eb127338e459370423a477da4777ce3969b99887 100644 (file)
@@ -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);
index 6f748db25664190726213eaaad50ecb4b1522197..b9c97557c5cec1e5364d2326061248506129a80e 100644 (file)
@@ -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;
index 6fb42bcd6ab3598375c1436ad04afcef31757f21..216e3390a61ee743bde3ff13e5e61519cae8b26f 100644 (file)
@@ -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,
index eb69f6345996ecc035eaebb0cf9937224101fd35..cbc8e505080169731c71f9bc6321df2774102d01 100644 (file)
@@ -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
     {
index 3c9862fe9885cca36d1be9729f8c30735a0fadc4..61f9d3226a7113e4e914dd78329df0e54bce9d63 100644 (file)
@@ -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,