]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Cleanup some basic crashes from mistakes made converting to vrf
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 24 May 2017 14:37:23 +0000 (10:37 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 24 Jul 2017 17:51:38 +0000 (13:51 -0400)
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
pimd/pim_iface.c
pimd/pim_ifchannel.c
pimd/pim_mroute.c
pimd/pim_msdp.c
pimd/pim_nht.c
pimd/pim_register.c
pimd/pim_rpf.c
pimd/pim_rpf.h
pimd/pim_upstream.c
pimd/pim_upstream.h
pimd/pim_zebra.c

index d3b5aa3a59b9b1bfa6d7d3a82a32b3464d445f76..124166880ca32d7ab98f56d9b5191dace35181c9 100644 (file)
@@ -594,8 +594,8 @@ void pim_if_addr_add(struct connected *ifc)
 
        detect_address_change(ifp, 0, __PRETTY_FUNCTION__);
 
-       if (ifc->address->family != AF_INET)
-               return;
+       // if (ifc->address->family != AF_INET)
+       //  return;
 
        if (PIM_IF_TEST_IGMP(pim_ifp->options)) {
                struct igmp_sock *igmp;
index 469d33318c6dec5140f4b3df20c5f872f718306e..e3e0e9abc313bcd4215a158713601a18963b4353 100644 (file)
@@ -521,7 +521,8 @@ struct pim_ifchannel *pim_ifchannel_add(struct interface *ifp,
 
        pim_ifp = ifp->info;
 
-       up = pim_upstream_add(sg, NULL, flags, __PRETTY_FUNCTION__);
+       up = pim_upstream_add(pim_ifp->pim, sg, NULL, flags,
+                             __PRETTY_FUNCTION__);
        if (!up) {
                zlog_err(
                        "%s: could not attach upstream (S,G)=%s on interface %s",
index c452cc799e53698ace084cf52fae23610ae0d6d4..765c4c5e886267f476f17bf4ce7529fc49c27c93 100644 (file)
@@ -40,6 +40,7 @@
 #include "pim_ifchannel.h"
 #include "pim_zlookup.h"
 #include "pim_ssm.h"
+#include "pim_sock.h"
 
 static void mroute_read_on(struct pim_instance *pim);
 
@@ -231,7 +232,7 @@ static int pim_mroute_msg_wholepkt(int fd, struct interface *ifp,
                up = pim_upstream_find(pim_ifp->pim, &star);
 
                if (up && PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(up->flags)) {
-                       up = pim_upstream_add(&sg, ifp,
+                       up = pim_upstream_add(pim_ifp->pim, &sg, ifp,
                                              PIM_UPSTREAM_FLAG_MASK_SRC_LHR,
                                              __PRETTY_FUNCTION__);
                        if (!up) {
@@ -502,7 +503,8 @@ static int pim_mroute_msg_wrvifwhole(int fd, struct interface *ifp,
        if (!oil->installed)
                pim_mroute_add(oil, __PRETTY_FUNCTION__);
        if (pim_if_connected_to_source(ifp, sg.src)) {
-               up = pim_upstream_add(&sg, ifp, PIM_UPSTREAM_FLAG_MASK_FHR,
+               up = pim_upstream_add(pim_ifp->pim, &sg, ifp,
+                                     PIM_UPSTREAM_FLAG_MASK_FHR,
                                      __PRETTY_FUNCTION__);
                if (!up) {
                        if (PIM_DEBUG_MROUTE)
index 80305203bc48e7defd5ae354c32d03ab4ed2b677..fa884266b395edd236868a7bc62c5c86f5e17ae6 100644 (file)
@@ -203,7 +203,7 @@ static void pim_msdp_sa_upstream_update(struct pim_msdp_sa *sa,
 
        /* RFC3618: "RP triggers a (S, G) join event towards the data source
         * as if a JP message was rxed addressed to the RP itself." */
-       up = pim_upstream_add(&sa->sg, NULL /* iif */,
+       up = pim_upstream_add(sa->pim, &sa->sg, NULL /* iif */,
                              PIM_UPSTREAM_FLAG_MASK_SRC_MSDP,
                              __PRETTY_FUNCTION__);
 
index 13f41458c5b05687298c07154d8ae545c90d13b4..eb487b96268c00fa1f4247c660002d79dfeaf75a 100644 (file)
@@ -350,7 +350,7 @@ static int pim_update_upstream_nh(struct pim_instance *pim,
                struct pim_rpf old;
 
                old.source_nexthop.interface = up->rpf.source_nexthop.interface;
-               rpf_result = pim_rpf_update(up, &old, 0);
+               rpf_result = pim_rpf_update(pim, up, &old, 0);
                if (rpf_result == PIM_RPF_FAILURE)
                        continue;
 
index 9448dd8182c7430553d4854e4a33b3964fda87f0..744bc8e94c26c6fa06e2d1f7b2a69ec0daf0eff0 100644 (file)
@@ -368,7 +368,8 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
                 */
                if (!upstream) {
                        upstream = pim_upstream_add(
-                               &sg, ifp, PIM_UPSTREAM_FLAG_MASK_SRC_STREAM,
+                               pim_ifp->pim, &sg, ifp,
+                               PIM_UPSTREAM_FLAG_MASK_SRC_STREAM,
                                __PRETTY_FUNCTION__);
                        if (!upstream) {
                                zlog_warn("Failure to create upstream state");
index 3bde1bb83e078ed8bc3f3abdba4f3cd2c33ff948..36c6c894ef04be6410865306876250b8b837b16d 100644 (file)
@@ -188,7 +188,8 @@ static int nexthop_mismatch(const struct pim_nexthop *nh1,
               || (nh1->mrib_route_metric != nh2->mrib_route_metric);
 }
 
-enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
+enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
+                                  struct pim_upstream *up, struct pim_rpf *old,
                                   uint8_t is_new)
 {
        struct pim_rpf *rpf = &up->rpf;
@@ -196,7 +197,6 @@ enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
        struct prefix nht_p;
        struct pim_nexthop_cache pnc;
        struct prefix src, grp;
-       struct pim_instance *pim = up->channel_oil->pim;
 
        saved.source_nexthop = rpf->source_nexthop;
        saved.rpf_addr = rpf->rpf_addr;
index 9f7ae86795f4f335c7e03b6aac7a757d523e9f13..86032f1c29634eb066a811e5492491c597dea0c7 100644 (file)
@@ -63,7 +63,8 @@ int pim_rpf_equal(const void *arg1, const void *arg2);
 
 int pim_nexthop_lookup(struct pim_instance *pim, struct pim_nexthop *nexthop,
                       struct in_addr addr, int neighbor_needed);
-enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
+enum pim_rpf_result pim_rpf_update(struct pim_instance *pim,
+                                  struct pim_upstream *up, struct pim_rpf *old,
                                   uint8_t is_new);
 
 int pim_rpf_addr_is_inaddr_none(struct pim_rpf *rpf);
index acaa8df80110e28db5b718d3c766d8cefd625f13..31437e26f7ada2cda4937a8362d0a3ddc6d37768 100644 (file)
@@ -599,12 +599,13 @@ int pim_upstream_compare(void *arg1, void *arg2)
        return 0;
 }
 
-static struct pim_upstream *
-pim_upstream_new(struct prefix_sg *sg, struct interface *incoming, int flags)
+static struct pim_upstream *pim_upstream_new(struct pim_instance *pim,
+                                            struct prefix_sg *sg,
+                                            struct interface *incoming,
+                                            int flags)
 {
        enum pim_rpf_result rpf_result;
        struct pim_interface *pim_ifp;
-       struct pim_instance *pim;
        struct pim_upstream *up;
 
        up = XCALLOC(MTYPE_PIM_UPSTREAM, sizeof(*up));
@@ -614,8 +615,6 @@ pim_upstream_new(struct prefix_sg *sg, struct interface *incoming, int flags)
                return NULL;
        }
 
-       pim_ifp = incoming->info;
-       pim = pim_ifp->pim;
        up->sg = *sg;
        pim_str_sg_set(sg, up->sg_str);
        up = hash_get(pim->upstream_hash, up, hash_alloc_intern);
@@ -667,7 +666,7 @@ pim_upstream_new(struct prefix_sg *sg, struct interface *incoming, int flags)
        if (up->sg.src.s_addr != INADDR_ANY)
                wheel_add_item(pim->upstream_sg_wheel, up);
 
-       rpf_result = pim_rpf_update(up, NULL, 1);
+       rpf_result = pim_rpf_update(pim, up, NULL, 1);
        if (rpf_result == PIM_RPF_FAILURE) {
                struct prefix nht_p;
 
@@ -679,7 +678,7 @@ pim_upstream_new(struct prefix_sg *sg, struct interface *incoming, int flags)
                nht_p.family = AF_INET;
                nht_p.prefixlen = IPV4_MAX_BITLEN;
                nht_p.u.prefix4 = up->upstream_addr;
-               pim_delete_tracked_nexthop(pim_ifp->pim, &nht_p, up, NULL);
+               pim_delete_tracked_nexthop(pim, &nht_p, up, NULL);
 
                if (up->parent) {
                        listnode_delete(up->parent->sources, up);
@@ -749,7 +748,7 @@ struct pim_upstream *pim_upstream_find_or_add(struct prefix_sg *sg,
                                        up->ref_count);
                }
        } else
-               up = pim_upstream_add(sg, incoming, flags, name);
+               up = pim_upstream_add(pim_ifp->pim, sg, incoming, flags, name);
 
        return up;
 }
@@ -764,21 +763,20 @@ void pim_upstream_ref(struct pim_upstream *up, int flags, const char *name)
                           up->ref_count);
 }
 
-struct pim_upstream *pim_upstream_add(struct prefix_sg *sg,
+struct pim_upstream *pim_upstream_add(struct pim_instance *pim,
+                                     struct prefix_sg *sg,
                                      struct interface *incoming, int flags,
                                      const char *name)
 {
        struct pim_upstream *up = NULL;
-       struct pim_interface *pim_ifp;
        int found = 0;
 
-       pim_ifp = incoming->info;
-       up = pim_upstream_find(pim_ifp->pim, sg);
+       up = pim_upstream_find(pim, sg);
        if (up) {
                pim_upstream_ref(up, flags, name);
                found = 1;
        } else {
-               up = pim_upstream_new(sg, incoming, flags);
+               up = pim_upstream_new(pim, sg, incoming, flags);
        }
 
        if (PIM_DEBUG_TRACE) {
@@ -1511,7 +1509,7 @@ void pim_upstream_find_new_rpf(struct pim_instance *pim)
                                zlog_debug(
                                        "Upstream %s without a path to send join, checking",
                                        up->sg_str);
-                       pim_rpf_update(up, NULL, 1);
+                       pim_rpf_update(pim, up, NULL, 1);
                }
        }
 }
index a9d84bb9b42e3b83497de260c477db1dfb40f6b7..3be1de70ad2be8b983ecc45c0c52011081747fb4 100644 (file)
@@ -143,7 +143,8 @@ struct pim_upstream *pim_upstream_find(struct pim_instance *pim,
 struct pim_upstream *pim_upstream_find_or_add(struct prefix_sg *sg,
                                              struct interface *ifp, int flags,
                                              const char *name);
-struct pim_upstream *pim_upstream_add(struct prefix_sg *sg,
+struct pim_upstream *pim_upstream_add(struct pim_instance *pim,
+                                     struct prefix_sg *sg,
                                      struct interface *ifp, int flags,
                                      const char *name);
 void pim_upstream_ref(struct pim_upstream *up, int flags, const char *name);
index 88b234900ece62210a32e0e10e5f54813477f720..47b97339f0c78a3ba15f14f0f48443a529cb858f 100644 (file)
@@ -379,7 +379,7 @@ static void scan_upstream_rpf_cache()
                        old.source_nexthop.interface =
                                up->rpf.source_nexthop.interface;
                        old.source_nexthop.nbr = up->rpf.source_nexthop.nbr;
-                       rpf_result = pim_rpf_update(up, &old, 0);
+                       rpf_result = pim_rpf_update(pim, up, &old, 0);
 
                        if (rpf_result == PIM_RPF_FAILURE)
                                continue;