]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_neighbor.c
Merge pull request #13455 from sri-mohan1/srib-ldpd
[mirror_frr.git] / pimd / pim_neighbor.c
index 0bbed1f99fc8562529588288b2b85961f2f94eac..1cd7cce086fb6680f3ac59d78a54ee763f55732d 100644 (file)
@@ -1,20 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
  * PIM for Quagga
  * Copyright (C) 2008  Everton da Silva Marques
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; see the file COPYING; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
@@ -42,6 +29,7 @@
 #include "pim_jp_agg.h"
 #include "pim_bfd.h"
 #include "pim_register.h"
+#include "pim_oil.h"
 
 static void dr_election_by_addr(struct interface *ifp)
 {
@@ -136,9 +124,10 @@ int pim_if_dr_election(struct interface *ifp)
                pim_if_update_could_assert(ifp);
                pim_if_update_assert_tracking_desired(ifp);
 
-               if (PIM_I_am_DR(pim_ifp))
+               if (PIM_I_am_DR(pim_ifp)) {
                        pim_ifp->am_i_dr = true;
-               else {
+                       pim_clear_nocache_state(pim_ifp);
+               } else {
                        if (pim_ifp->am_i_dr == true) {
                                pim_reg_del_on_couldreg_fail(ifp);
                                pim_ifp->am_i_dr = false;
@@ -201,13 +190,13 @@ static void update_dr_priority(struct pim_neighbor *neigh,
        }
 }
 
-static void on_neighbor_timer(struct thread *t)
+static void on_neighbor_timer(struct event *t)
 {
        struct pim_neighbor *neigh;
        struct interface *ifp;
        char msg[100];
 
-       neigh = THREAD_ARG(t);
+       neigh = EVENT_ARG(t);
 
        ifp = neigh->interface;
 
@@ -233,7 +222,7 @@ void pim_neighbor_timer_reset(struct pim_neighbor *neigh, uint16_t holdtime)
 {
        neigh->holdtime = holdtime;
 
-       THREAD_OFF(neigh->t_expire_timer);
+       EVENT_OFF(neigh->t_expire_timer);
 
        /*
          0xFFFF is request for no holdtime
@@ -247,13 +236,13 @@ void pim_neighbor_timer_reset(struct pim_neighbor *neigh, uint16_t holdtime)
                           __func__, neigh->holdtime, &neigh->source_addr,
                           neigh->interface->name);
 
-       thread_add_timer(router->master, on_neighbor_timer, neigh,
-                        neigh->holdtime, &neigh->t_expire_timer);
+       event_add_timer(router->master, on_neighbor_timer, neigh,
+                       neigh->holdtime, &neigh->t_expire_timer);
 }
 
-static void on_neighbor_jp_timer(struct thread *t)
+static void on_neighbor_jp_timer(struct event *t)
 {
-       struct pim_neighbor *neigh = THREAD_ARG(t);
+       struct pim_neighbor *neigh = EVENT_ARG(t);
        struct pim_rpf rpf;
 
        if (PIM_DEBUG_PIM_TRACE)
@@ -263,18 +252,18 @@ static void on_neighbor_jp_timer(struct thread *t)
                           neigh->upstream_jp_agg->count);
 
        rpf.source_nexthop.interface = neigh->interface;
-       pim_addr_to_prefix(&rpf.rpf_addr, neigh->source_addr);
+       rpf.rpf_addr = neigh->source_addr;
        pim_joinprune_send(&rpf, neigh->upstream_jp_agg);
 
-       thread_add_timer(router->master, on_neighbor_jp_timer, neigh,
-                        router->t_periodic, &neigh->jp_timer);
+       event_add_timer(router->master, on_neighbor_jp_timer, neigh,
+                       router->t_periodic, &neigh->jp_timer);
 }
 
 static void pim_neighbor_start_jp_timer(struct pim_neighbor *neigh)
 {
-       THREAD_OFF(neigh->jp_timer);
-       thread_add_timer(router->master, on_neighbor_jp_timer, neigh,
-                        router->t_periodic, &neigh->jp_timer);
+       EVENT_OFF(neigh->jp_timer);
+       event_add_timer(router->master, on_neighbor_jp_timer, neigh,
+                       router->t_periodic, &neigh->jp_timer);
 }
 
 static struct pim_neighbor *
@@ -388,7 +377,7 @@ void pim_neighbor_free(struct pim_neighbor *neigh)
        delete_prefix_list(neigh);
 
        list_delete(&neigh->upstream_jp_agg);
-       THREAD_OFF(neigh->jp_timer);
+       EVENT_OFF(neigh->jp_timer);
 
        bfd_sess_free(&neigh->bfd_session);
 
@@ -419,7 +408,7 @@ struct pim_neighbor *pim_neighbor_find_by_secondary(struct interface *ifp,
 }
 
 struct pim_neighbor *pim_neighbor_find(struct interface *ifp,
-                                      pim_addr source_addr)
+                                      pim_addr source_addr, bool secondary)
 {
        struct pim_interface *pim_ifp;
        struct listnode *node;
@@ -438,16 +427,14 @@ struct pim_neighbor *pim_neighbor_find(struct interface *ifp,
                }
        }
 
-       return NULL;
-}
+       if (secondary) {
+               struct prefix p;
 
-struct pim_neighbor *pim_neighbor_find_prefix(struct interface *ifp,
-                                             const struct prefix *src_prefix)
-{
-       pim_addr addr;
+               pim_addr_to_prefix(&p, source_addr);
+               return pim_neighbor_find_by_secondary(ifp, &p);
+       }
 
-       addr = pim_addr_from_prefix(src_prefix);
-       return pim_neighbor_find(ifp, addr);
+       return NULL;
 }
 
 /*
@@ -594,7 +581,7 @@ void pim_neighbor_delete(struct interface *ifp, struct pim_neighbor *neigh,
        zlog_notice("PIM NEIGHBOR DOWN: neighbor %pPA on interface %s: %s",
                    &neigh->source_addr, ifp->name, delete_message);
 
-       THREAD_OFF(neigh->t_expire_timer);
+       EVENT_OFF(neigh->t_expire_timer);
 
        pim_if_assert_on_neighbor_down(ifp, neigh->source_addr);