summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pimd/pim_cmd.c5
-rw-r--r--pimd/pim_nht.c74
-rw-r--r--pimd/pim_rp.c111
-rw-r--r--pimd/pim_rp.h2
-rw-r--r--pimd/pim_rpf.c14
-rw-r--r--pimd/pim_zebra.c16
6 files changed, 90 insertions, 132 deletions
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index 96cbcd1844..ce51edf0bd 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -3599,10 +3599,9 @@ DEFUN (show_ip_pim_nexthop_lookup,
grp.u.prefix4 = grp_addr;
memset(&nexthop, 0, sizeof(nexthop));
- if ((pim_find_or_track_nexthop(&nht_p, NULL, NULL, &pnc)) == 1) {
- // Compute PIM RPF using Cached nexthop
+ if (pim_find_or_track_nexthop(&nht_p, NULL, NULL, &pnc))
pim_ecmp_nexthop_search(&pnc, &nexthop, &nht_p, &grp, 0);
- } else
+ else
pim_ecmp_nexthop_lookup(&nexthop, vif_source, &nht_p, &grp, 0);
pim_addr_dump("<grp?>", &grp, grp_str, sizeof(grp_str));
diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c
index ac66ebb63c..b852f8d1c5 100644
--- a/pimd/pim_nht.c
+++ b/pimd/pim_nht.c
@@ -142,9 +142,14 @@ struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_rpf *rpf_addr)
return pnc;
}
-/* This API is used to Register an address with Zebra
- ret 1 means nexthop cache is found.
-*/
+/*
+ * pim_find_or_track_nexthop
+ *
+ * This API is used to Register an address with Zebra
+ *
+ * 1 -> Success
+ * 0 -> Failure
+ */
int pim_find_or_track_nexthop(struct prefix *addr, struct pim_upstream *up,
struct rp_info *rp,
struct pim_nexthop_cache *out_pnc)
@@ -172,7 +177,7 @@ int pim_find_or_track_nexthop(struct prefix *addr, struct pim_upstream *up,
sizeof(rpf_str));
zlog_warn("%s: pnc node allocation failed. addr %s ",
__PRETTY_FUNCTION__, rpf_str);
- return -1;
+ return 0;
}
}
@@ -299,31 +304,29 @@ void pim_resolve_upstream_nh(struct prefix *nht_p)
struct pim_neighbor *nbr = NULL;
memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
- if ((pim_find_or_track_nexthop(nht_p, NULL, NULL, &pnc)) == 1) {
- for (nh_node = pnc.nexthop; nh_node; nh_node = nh_node->next) {
- if (nh_node->gate.ipv4.s_addr == 0) {
- struct interface *ifp1 = if_lookup_by_index(
- nh_node->ifindex, pimg->vrf_id);
- nbr = pim_neighbor_find_if(ifp1);
- if (nbr) {
- nh_node->gate.ipv4 = nbr->source_addr;
- if (PIM_DEBUG_TRACE) {
- char str[PREFIX_STRLEN];
- char str1[INET_ADDRSTRLEN];
- pim_inet4_dump("<nht_nbr?>",
- nbr->source_addr,
- str1,
- sizeof(str1));
- pim_addr_dump("<nht_addr?>",
- nht_p, str,
- sizeof(str));
- zlog_debug(
- "%s: addr %s new nexthop addr %s interface %s",
- __PRETTY_FUNCTION__,
- str, str1, ifp1->name);
- }
- }
- }
+ if (!pim_find_or_track_nexthop(nht_p, NULL, NULL, &pnc))
+ return;
+
+ for (nh_node = pnc.nexthop; nh_node; nh_node = nh_node->next) {
+ if (nh_node->gate.ipv4.s_addr != 0)
+ continue;
+
+ struct interface *ifp1 =
+ if_lookup_by_index(nh_node->ifindex, pimg->vrf_id);
+ nbr = pim_neighbor_find_if(ifp1);
+ if (!nbr)
+ continue;
+
+ nh_node->gate.ipv4 = nbr->source_addr;
+ if (PIM_DEBUG_TRACE) {
+ char str[PREFIX_STRLEN];
+ char str1[INET_ADDRSTRLEN];
+ pim_inet4_dump("<nht_nbr?>", nbr->source_addr, str1,
+ sizeof(str1));
+ pim_addr_dump("<nht_addr?>", nht_p, str, sizeof(str));
+ zlog_debug(
+ "%s: addr %s new nexthop addr %s interface %s",
+ __PRETTY_FUNCTION__, str, str1, ifp1->name);
}
}
}
@@ -499,7 +502,7 @@ int pim_ecmp_nexthop_search(struct pim_nexthop_cache *pnc,
uint8_t nh_iter = 0, found = 0;
if (!pnc || !pnc->nexthop_num || !nexthop)
- return -1;
+ return 0;
// Current Nexthop is VALID, check to stay on the current path.
if (nexthop->interface && nexthop->interface->info
@@ -653,9 +656,9 @@ int pim_ecmp_nexthop_search(struct pim_nexthop_cache *pnc,
}
if (found)
- return 0;
+ return 1;
else
- return -1;
+ return 0;
}
/* This API is used to parse Registered address nexthop update coming from Zebra
@@ -899,7 +902,7 @@ int pim_ecmp_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr,
zlog_warn(
"%s %s: could not find nexthop ifindex for address %s",
__FILE__, __PRETTY_FUNCTION__, addr_str);
- return -1;
+ return 0;
}
// If PIM ECMP enable then choose ECMP path.
@@ -1001,10 +1004,11 @@ int pim_ecmp_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr,
}
i++;
}
+
if (found)
- return 0;
+ return 1;
else
- return -1;
+ return 0;
}
int pim_ecmp_fib_lookup_if_vif_index(struct in_addr addr, struct prefix *src,
diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c
index 8a902ef9be..36e5e4f6f0 100644
--- a/pimd/pim_rp.c
+++ b/pimd/pim_rp.c
@@ -402,14 +402,11 @@ int pim_rp_new(const char *rp, const char *group_range, const char *plist)
__PRETTY_FUNCTION__, buf, buf1);
}
memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
- if ((pim_find_or_track_nexthop(&nht_p, NULL, rp_all,
- &pnc))
- == 1) {
- // Compute PIM RPF using Cached nexthop
- if ((pim_ecmp_nexthop_search(
+ if (pim_find_or_track_nexthop(&nht_p, NULL, rp_all,
+ &pnc)) {
+ if (!pim_ecmp_nexthop_search(
&pnc, &rp_all->rp.source_nexthop,
&nht_p, &rp_all->group, 1))
- != 0)
return PIM_RP_NO_PATH;
} else {
if (pim_nexthop_lookup(
@@ -474,11 +471,9 @@ int pim_rp_new(const char *rp, const char *group_range, const char *plist)
}
memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
- if ((pim_find_or_track_nexthop(&nht_p, NULL, rp_info, &pnc)) == 1) {
- // Compute PIM RPF using Cached nexthop
- if (pim_ecmp_nexthop_search(&pnc, &rp_info->rp.source_nexthop,
- &nht_p, &rp_info->group, 1)
- != 0)
+ if (pim_find_or_track_nexthop(&nht_p, NULL, rp_info, &pnc)) {
+ if (!pim_ecmp_nexthop_search(&pnc, &rp_info->rp.source_nexthop,
+ &nht_p, &rp_info->group, 1))
return PIM_RP_NO_PATH;
} else {
if (pim_nexthop_lookup(&rp_info->rp.source_nexthop,
@@ -554,11 +549,10 @@ int pim_rp_del(const char *rp, const char *group_range, const char *plist)
return PIM_SUCCESS;
}
-int pim_rp_setup(void)
+void pim_rp_setup(void)
{
struct listnode *node;
struct rp_info *rp_info;
- int ret = 0;
struct prefix nht_p;
struct pim_nexthop_cache pnc;
@@ -570,15 +564,11 @@ int pim_rp_setup(void)
nht_p.prefixlen = IPV4_MAX_BITLEN;
nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4;
memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
- if ((pim_find_or_track_nexthop(&nht_p, NULL, rp_info, &pnc))
- == 1) {
- // Compute PIM RPF using Cached nexthop
- if ((pim_ecmp_nexthop_search(
- &pnc, &rp_info->rp.source_nexthop, &nht_p,
- &rp_info->group, 1))
- != 0)
- ret++;
- } else {
+ if (pim_find_or_track_nexthop(&nht_p, NULL, rp_info, &pnc))
+ pim_ecmp_nexthop_search(&pnc,
+ &rp_info->rp.source_nexthop,
+ &nht_p, &rp_info->group, 1);
+ else {
if (PIM_DEBUG_ZEBRA) {
char buf[PREFIX2STR_BUFFER];
prefix2str(&nht_p, buf, sizeof(buf));
@@ -589,19 +579,12 @@ int pim_rp_setup(void)
if (pim_nexthop_lookup(&rp_info->rp.source_nexthop,
rp_info->rp.rpf_addr.u.prefix4,
1)
- != 0) {
+ != 0)
if (PIM_DEBUG_PIM_TRACE)
zlog_debug(
"Unable to lookup nexthop for rp specified");
- ret++;
- }
}
}
-
- if (ret)
- return 0;
-
- return 1;
}
/*
@@ -745,13 +728,11 @@ struct pim_rpf *pim_rp_g(struct in_addr group)
__PRETTY_FUNCTION__, buf, buf1);
}
memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
- if ((pim_find_or_track_nexthop(&nht_p, NULL, rp_info, &pnc))
- == 1) {
- // Compute PIM RPF using Cached nexthop
+ if (pim_find_or_track_nexthop(&nht_p, NULL, rp_info, &pnc))
pim_ecmp_nexthop_search(&pnc,
&rp_info->rp.source_nexthop,
&nht_p, &rp_info->group, 1);
- } else {
+ else {
if (PIM_DEBUG_ZEBRA) {
char buf[PREFIX2STR_BUFFER];
char buf1[PREFIX2STR_BUFFER];
@@ -989,43 +970,31 @@ void pim_resolve_rp_nh(void)
nht_p.prefixlen = IPV4_MAX_BITLEN;
nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4;
memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
- if ((pim_find_or_track_nexthop(&nht_p, NULL, rp_info, &pnc))
- == 1) {
- for (nh_node = pnc.nexthop; nh_node;
- nh_node = nh_node->next) {
- if (nh_node->gate.ipv4.s_addr == 0) {
- nbr = pim_neighbor_find_if(
- if_lookup_by_index(
- nh_node->ifindex,
- pimg->vrf_id));
- if (nbr) {
- nh_node->gate.ipv4 =
- nbr->source_addr;
- if (PIM_DEBUG_TRACE) {
- char str[PREFIX_STRLEN];
- char str1
- [INET_ADDRSTRLEN];
- struct interface *ifp1 =
- if_lookup_by_index(
- nh_node->ifindex,
- pimg->vrf_id);
- pim_inet4_dump(
- "<nht_nbr?>",
- nbr->source_addr,
- str1,
- sizeof(str1));
- pim_addr_dump(
- "<nht_addr?>",
- &nht_p, str,
- sizeof(str));
- zlog_debug(
- "%s: addr %s new nexthop addr %s interface %s",
- __PRETTY_FUNCTION__,
- str, str1,
- ifp1->name);
- }
- }
- }
+ if (!pim_find_or_track_nexthop(&nht_p, NULL, rp_info, &pnc))
+ continue;
+
+ for (nh_node = pnc.nexthop; nh_node; nh_node = nh_node->next) {
+ if (nh_node->gate.ipv4.s_addr != 0)
+ continue;
+
+ struct interface *ifp1 = if_lookup_by_index(
+ nh_node->ifindex, pimg->vrf_id);
+ nbr = pim_neighbor_find_if(ifp1);
+ if (!nbr)
+ continue;
+
+ nh_node->gate.ipv4 = nbr->source_addr;
+ if (PIM_DEBUG_TRACE) {
+ char str[PREFIX_STRLEN];
+ char str1[INET_ADDRSTRLEN];
+ pim_inet4_dump("<nht_nbr?>", nbr->source_addr,
+ str1, sizeof(str1));
+ pim_addr_dump("<nht_addr?>", &nht_p, str,
+ sizeof(str));
+ zlog_debug(
+ "%s: addr %s new nexthop addr %s interface %s",
+ __PRETTY_FUNCTION__, str, str1,
+ ifp1->name);
}
}
}
diff --git a/pimd/pim_rp.h b/pimd/pim_rp.h
index 8d687460e4..4c916086d2 100644
--- a/pimd/pim_rp.h
+++ b/pimd/pim_rp.h
@@ -44,7 +44,7 @@ void pim_rp_prefix_list_update(struct prefix_list *plist);
int pim_rp_config_write(struct vty *vty);
-int pim_rp_setup(void);
+void pim_rp_setup(void);
int pim_rp_i_am_rp(struct in_addr group);
void pim_rp_check_on_if_add(struct pim_interface *pim_ifp);
diff --git a/pimd/pim_rpf.c b/pimd/pim_rpf.c
index e53c5392c4..8e3aa4e73c 100644
--- a/pimd/pim_rpf.c
+++ b/pimd/pim_rpf.c
@@ -194,7 +194,6 @@ enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
struct pim_rpf saved;
struct prefix nht_p;
struct pim_nexthop_cache pnc;
- int ret = 0;
struct prefix src, grp;
saved.source_nexthop = rpf->source_nexthop;
@@ -219,27 +218,22 @@ enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct pim_rpf *old,
grp.prefixlen = IPV4_MAX_BITLEN;
grp.u.prefix4 = up->sg.grp;
memset(&pnc, 0, sizeof(struct pim_nexthop_cache));
- if ((ret = pim_find_or_track_nexthop(&nht_p, up, NULL, &pnc)) == 1) {
+ if (pim_find_or_track_nexthop(&nht_p, up, NULL, &pnc)) {
if (pnc.nexthop_num) {
- // Compute PIM RPF using Cached nexthop
- if (pim_ecmp_nexthop_search(
+ if (!pim_ecmp_nexthop_search(
&pnc, &up->rpf.source_nexthop, &src, &grp,
!PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)
&& !PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(
up->flags)))
-
- {
return PIM_RPF_FAILURE;
- }
}
} else {
- if (pim_ecmp_nexthop_lookup(
+ if (!pim_ecmp_nexthop_lookup(
&rpf->source_nexthop, up->upstream_addr, &src, &grp,
!PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)
&& !PIM_UPSTREAM_FLAG_TEST_SRC_IGMP(
- up->flags))) {
+ up->flags)))
return PIM_RPF_FAILURE;
- }
}
rpf->rpf_addr.family = AF_INET;
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index c41dba8b9e..f0616e6cf6 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -849,7 +849,6 @@ void igmp_source_forward_start(struct igmp_source *source)
struct in_addr vif_source;
struct pim_interface *pim_oif;
struct prefix nht_p, src, grp;
- int ret = 0;
struct pim_nexthop_cache out_pnc;
struct pim_nexthop nexthop;
struct pim_upstream *up = NULL;
@@ -871,17 +870,14 @@ void igmp_source_forward_start(struct igmp_source *source)
grp.prefixlen = IPV4_MAX_BITLEN;
grp.u.prefix4 = sg.grp;
- if ((ret = pim_find_or_track_nexthop(&nht_p, NULL, NULL,
- &out_pnc))
- == 1) {
+ if (pim_find_or_track_nexthop(&nht_p, NULL, NULL, &out_pnc)) {
if (out_pnc.nexthop_num) {
up = pim_upstream_find(&sg);
- memset(&nexthop, 0, sizeof(struct pim_nexthop));
+ memset(&nexthop, 0, sizeof(nexthop));
if (up)
memcpy(&nexthop,
&up->rpf.source_nexthop,
sizeof(struct pim_nexthop));
- // Compute PIM RPF using Cached nexthop
pim_ecmp_nexthop_search(&out_pnc, &nexthop,
&src, &grp, 0);
if (nexthop.interface)
@@ -1096,7 +1092,6 @@ void pim_forward_start(struct pim_ifchannel *ch)
|| (up->channel_oil
&& up->channel_oil->oil.mfcc_parent >= MAXVIFS)) {
struct prefix nht_p, src, grp;
- int ret = 0;
struct pim_nexthop_cache out_pnc;
/* Register addr with Zebra NHT */
@@ -1108,9 +1103,7 @@ void pim_forward_start(struct pim_ifchannel *ch)
grp.u.prefix4 = up->sg.grp;
memset(&out_pnc, 0, sizeof(struct pim_nexthop_cache));
- if ((ret = pim_find_or_track_nexthop(&nht_p, NULL, NULL,
- &out_pnc))
- == 1) {
+ if (pim_find_or_track_nexthop(&nht_p, NULL, NULL, &out_pnc)) {
if (out_pnc.nexthop_num) {
src.family = AF_INET;
src.prefixlen = IPV4_MAX_BITLEN;
@@ -1122,8 +1115,7 @@ void pim_forward_start(struct pim_ifchannel *ch)
// Compute PIM RPF using Cached nexthop
if (pim_ecmp_nexthop_search(
&out_pnc, &up->rpf.source_nexthop,
- &src, &grp, 0)
- == 0)
+ &src, &grp, 0))
input_iface_vif_index =
pim_if_find_vifindex_by_ifindex(
up->rpf.source_nexthop