summaryrefslogtreecommitdiff
path: root/pimd
diff options
context:
space:
mode:
Diffstat (limited to 'pimd')
-rw-r--r--pimd/README4
-rw-r--r--pimd/pim_bfd.c10
-rw-r--r--pimd/pim_bsm.c7
-rw-r--r--pimd/pim_cmd.c65
-rw-r--r--pimd/pim_hello.c2
-rw-r--r--pimd/pim_iface.c11
-rw-r--r--pimd/pim_main.c1
-rw-r--r--pimd/pim_mlag.c6
-rw-r--r--pimd/pim_msdp.c4
-rw-r--r--pimd/pim_nht.c6
-rw-r--r--pimd/pim_pim.c3
-rw-r--r--pimd/pim_rp.c6
-rw-r--r--pimd/pim_sock.c5
-rw-r--r--pimd/pim_tlv.c21
-rw-r--r--pimd/pim_tlv.h14
-rw-r--r--pimd/pim_upstream.c21
-rw-r--r--pimd/pim_zlookup.c20
17 files changed, 135 insertions, 71 deletions
diff --git a/pimd/README b/pimd/README
index 3d03979a9a..1db0aad83c 100644
--- a/pimd/README
+++ b/pimd/README
@@ -33,7 +33,7 @@ HOME SITE
qpimd lives at:
- https://github.com/freerangerouting/frr
+ https://github.com/frrouting/frr
PLATFORMS
@@ -57,7 +57,7 @@ SUPPORT
Please post comments, questions, patches, bug reports at the
support site:
- https://freerangerouting/frr
+ https://frrouting.org/frr
RELATED WORK
diff --git a/pimd/pim_bfd.c b/pimd/pim_bfd.c
index 84f6733eaf..0df8ea6922 100644
--- a/pimd/pim_bfd.c
+++ b/pimd/pim_bfd.c
@@ -47,7 +47,7 @@ void pim_bfd_write_config(struct vty *vty, struct interface *ifp)
if (!pim_ifp)
return;
- bfd_info = (struct bfd_info *)pim_ifp->bfd_info;
+ bfd_info = pim_ifp->bfd_info;
if (!bfd_info)
return;
@@ -92,7 +92,7 @@ void pim_bfd_info_nbr_create(struct pim_interface *pim_ifp,
if (!neigh->bfd_info)
return;
- nbr_bfd_info = (struct bfd_info *)neigh->bfd_info;
+ nbr_bfd_info = neigh->bfd_info;
nbr_bfd_info->detect_mult = pim_ifp->bfd_info->detect_mult;
nbr_bfd_info->desired_min_tx = pim_ifp->bfd_info->desired_min_tx;
nbr_bfd_info->required_min_rx = pim_ifp->bfd_info->required_min_rx;
@@ -118,7 +118,7 @@ static void pim_bfd_reg_dereg_nbr(struct pim_neighbor *nbr, int command)
if (!nbr)
return;
pim_ifp = nbr->interface->info;
- bfd_info = (struct bfd_info *)pim_ifp->bfd_info;
+ bfd_info = pim_ifp->bfd_info;
if (!bfd_info)
return;
if (PIM_DEBUG_PIM_TRACE) {
@@ -194,8 +194,8 @@ void pim_bfd_if_param_set(struct interface *ifp, uint32_t min_rx,
if (!pim_ifp)
return;
- bfd_set_param((struct bfd_info **)&(pim_ifp->bfd_info), min_rx, min_tx,
- detect_mult, defaults, &command);
+ bfd_set_param(&(pim_ifp->bfd_info), min_rx, min_tx, detect_mult,
+ defaults, &command);
if (pim_ifp->bfd_info) {
if (PIM_DEBUG_PIM_TRACE)
diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c
index ad47427101..d949c657bd 100644
--- a/pimd/pim_bsm.c
+++ b/pimd/pim_bsm.c
@@ -1282,6 +1282,13 @@ int pim_bsm_process(struct interface *ifp, struct ip *ip_hdr, uint8_t *buf,
bshdr = (struct bsm_hdr *)(buf + PIM_MSG_HEADER_LEN);
pim_inet4_dump("<bsr?>", bshdr->bsr_addr.addr, bsr_str,
sizeof(bsr_str));
+ if (bshdr->hm_len > 32) {
+ zlog_warn("Bad hashmask length for IPv4; got %" PRIu8
+ ", expected value in range 0-32",
+ bshdr->hm_len);
+ pim->bsm_dropped++;
+ return -1;
+ }
pim->global_scope.hashMasklen = bshdr->hm_len;
frag_tag = ntohs(bshdr->frag_tag);
diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c
index 871606414e..f6af98598b 100644
--- a/pimd/pim_cmd.c
+++ b/pimd/pim_cmd.c
@@ -70,10 +70,19 @@
#endif
static struct cmd_node interface_node = {
- INTERFACE_NODE, "%s(config-if)# ", 1 /* vtysh ? yes */
+ .name = "interface",
+ .node = INTERFACE_NODE,
+ .parent_node = CONFIG_NODE,
+ .prompt = "%s(config-if)# ",
+ .config_write = pim_interface_config_write,
};
-static struct cmd_node debug_node = {DEBUG_NODE, "", 1};
+static struct cmd_node debug_node = {
+ .name = "debug",
+ .node = DEBUG_NODE,
+ .prompt = "",
+ .config_write = pim_debug_config_write,
+};
static struct vrf *pim_cmd_lookup_vrf(struct vty *vty, struct cmd_token *argv[],
const int argc, int *idx)
@@ -3319,12 +3328,9 @@ static void pim_show_statistics(struct pim_instance *pim, struct vty *vty,
if (uj) {
json = json_object_new_object();
- json_object_int_add(json, "Number of Received BSMs",
- pim->bsm_rcvd);
- json_object_int_add(json, "Number of Forwared BSMs",
- pim->bsm_sent);
- json_object_int_add(json, "Number of Dropped BSMs",
- pim->bsm_dropped);
+ json_object_int_add(json, "bsmRx", pim->bsm_rcvd);
+ json_object_int_add(json, "bsmTx", pim->bsm_sent);
+ json_object_int_add(json, "bsmDropped", pim->bsm_dropped);
} else {
vty_out(vty, "BSM Statistics :\n");
vty_out(vty, "----------------\n");
@@ -3366,15 +3372,13 @@ static void pim_show_statistics(struct pim_instance *pim, struct vty *vty,
json_row = json_object_new_object();
json_object_string_add(json_row, "If Name", ifp->name);
+ json_object_int_add(json_row, "bsmDroppedConfig",
+ pim_ifp->pim_ifstat_bsm_cfg_miss);
json_object_int_add(
- json_row,
- "Number of BSMs dropped due to config miss",
- pim_ifp->pim_ifstat_bsm_cfg_miss);
- json_object_int_add(
- json_row, "Number of unicast BSMs dropped",
+ json_row, "bsmDroppedUnicast",
pim_ifp->pim_ifstat_ucast_bsm_cfg_miss);
json_object_int_add(json_row,
- "Number of BSMs dropped due to invalid scope zone",
+ "bsmDroppedInvalidScopeZone",
pim_ifp->pim_ifstat_bsm_invalid_sz);
json_object_object_add(json, ifp->name, json_row);
}
@@ -3792,11 +3796,11 @@ static void pim_show_bsr(struct pim_instance *pim,
json_object_string_add(json, "bsr", bsr_str);
json_object_int_add(json, "priority",
pim->global_scope.current_bsr_prio);
- json_object_int_add(json, "fragment_tag",
+ json_object_int_add(json, "fragmentTag",
pim->global_scope.bsm_frag_tag);
json_object_string_add(json, "state", bsr_state);
json_object_string_add(json, "upTime", uptime);
- json_object_string_add(json, "last_bsm_seen", last_bsm_seen);
+ json_object_string_add(json, "lastBsmSeen", last_bsm_seen);
}
else {
@@ -9762,11 +9766,25 @@ DEFUN (no_ip_msdp_mesh_group_source,
"mesh group local address\n")
{
PIM_DECLVAR_CONTEXT(vrf, pim);
- if (argc == 7)
- return ip_no_msdp_mesh_group_cmd_worker(pim, vty, argv[6]->arg);
+
+ return ip_no_msdp_mesh_group_source_cmd_worker(pim, vty, argv[4]->arg);
+}
+
+DEFUN (no_ip_msdp_mesh_group,
+ no_ip_msdp_mesh_group_cmd,
+ "no ip msdp mesh-group [WORD]",
+ NO_STR
+ IP_STR
+ CFG_MSDP_STR
+ "Delete MSDP mesh-group\n"
+ "mesh group name")
+{
+ PIM_DECLVAR_CONTEXT(vrf, pim);
+
+ if (argc == 5)
+ return ip_no_msdp_mesh_group_cmd_worker(pim, vty, argv[4]->arg);
else
- return ip_no_msdp_mesh_group_source_cmd_worker(pim, vty,
- argv[4]->arg);
+ return ip_no_msdp_mesh_group_cmd_worker(pim, vty, NULL);
}
static void print_empty_json_obj(struct vty *vty)
@@ -10863,11 +10881,10 @@ DEFUN_HIDDEN (ip_pim_mlag,
void pim_cmd_init(void)
{
- install_node(&interface_node,
- pim_interface_config_write); /* INTERFACE_NODE */
+ install_node(&interface_node); /* INTERFACE_NODE */
if_cmd_init();
- install_node(&debug_node, pim_debug_config_write);
+ install_node(&debug_node);
install_element(ENABLE_NODE, &pim_test_sg_keepalive_cmd);
@@ -11158,6 +11175,8 @@ void pim_cmd_init(void)
install_element(VRF_NODE, &ip_msdp_mesh_group_source_cmd);
install_element(CONFIG_NODE, &no_ip_msdp_mesh_group_source_cmd);
install_element(VRF_NODE, &no_ip_msdp_mesh_group_source_cmd);
+ install_element(CONFIG_NODE, &no_ip_msdp_mesh_group_cmd);
+ install_element(VRF_NODE, &no_ip_msdp_mesh_group_cmd);
install_element(VIEW_NODE, &show_ip_msdp_peer_detail_cmd);
install_element(VIEW_NODE, &show_ip_msdp_peer_detail_vrf_all_cmd);
install_element(VIEW_NODE, &show_ip_msdp_sa_detail_cmd);
diff --git a/pimd/pim_hello.c b/pimd/pim_hello.c
index ecdb3a34a7..e50504ec10 100644
--- a/pimd/pim_hello.c
+++ b/pimd/pim_hello.c
@@ -484,7 +484,7 @@ int pim_hello_build_tlv(struct interface *ifp, uint8_t *tlv_buf,
return -1;
}
if (can_disable_join_suppression) {
- *((uint8_t *)(curr) + 4) |= 0x80; /* enable T bit */
+ *(curr + 4) |= 0x80; /* enable T bit */
}
curr = tmp;
diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c
index 07c4172f22..b25b6eaa8c 100644
--- a/pimd/pim_iface.c
+++ b/pimd/pim_iface.c
@@ -28,6 +28,7 @@
#include "plist.h"
#include "hash.h"
#include "ferr.h"
+#include "network.h"
#include "pimd.h"
#include "pim_instance.h"
@@ -900,15 +901,16 @@ struct in_addr pim_find_primary_addr(struct interface *ifp)
* So let's grab the loopbacks v4 address
* and use that as the primary address
*/
- if (!v4_addrs && v6_addrs && !if_is_loopback(ifp)) {
+ if (!v4_addrs && v6_addrs) {
struct interface *lo_ifp;
+
// DBS - Come back and check here
if (ifp->vrf_id == VRF_DEFAULT)
lo_ifp = if_lookup_by_name("lo", vrf->vrf_id);
else
lo_ifp = if_lookup_by_name(vrf->name, vrf->vrf_id);
- if (lo_ifp)
+ if (lo_ifp && (lo_ifp != ifp))
return pim_find_primary_addr(lo_ifp);
}
@@ -1102,7 +1104,8 @@ int pim_if_t_override_msec(struct interface *ifp)
effective_override_interval_msec =
pim_if_effective_override_interval_msec(ifp);
- t_override_msec = random() % (effective_override_interval_msec + 1);
+ t_override_msec =
+ frr_weak_random() % (effective_override_interval_msec + 1);
return t_override_msec;
}
@@ -1180,7 +1183,7 @@ long pim_if_t_suppressed_msec(struct interface *ifp)
return 0;
/* t_suppressed = t_periodic * rand(1.1, 1.4) */
- ramount = 1100 + (random() % (1400 - 1100 + 1));
+ ramount = 1100 + (frr_weak_random() % (1400 - 1100 + 1));
t_suppressed_msec = router->t_periodic * ramount;
return t_suppressed_msec;
diff --git a/pimd/pim_main.c b/pimd/pim_main.c
index 93b561ba0f..5c4c7151a5 100644
--- a/pimd/pim_main.c
+++ b/pimd/pim_main.c
@@ -75,6 +75,7 @@ struct zebra_privs_t pimd_privs = {
static const struct frr_yang_module_info *const pimd_yang_modules[] = {
&frr_interface_info,
&frr_route_map_info,
+ &frr_vrf_info,
};
FRR_DAEMON_INFO(pimd, PIM, .vty_port = PIMD_VTY_PORT,
diff --git a/pimd/pim_mlag.c b/pimd/pim_mlag.c
index 304e6ac6bc..78be914cee 100644
--- a/pimd/pim_mlag.c
+++ b/pimd/pim_mlag.c
@@ -583,7 +583,9 @@ static void pim_mlag_process_mlagd_state_change(struct mlag_status msg)
router->mlag_role = msg.my_role;
}
- strcpy(router->peerlink_rif, msg.peerlink_rif);
+ strlcpy(router->peerlink_rif, msg.peerlink_rif,
+ sizeof(router->peerlink_rif));
+
/* XXX - handle the case where we may rx the interface name from the
* MLAG daemon before we get the interface from zebra.
*/
@@ -767,7 +769,7 @@ static void pim_mlag_process_mroute_del(struct mlag_mroute_del msg)
int pim_zebra_mlag_handle_msg(struct stream *s, int len)
{
struct mlag_msg mlag_msg;
- char buf[ZLOG_FILTER_LENGTH_MAX];
+ char buf[80];
int rc = 0;
size_t length;
diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c
index 63d34e859c..52c989e644 100644
--- a/pimd/pim_msdp.c
+++ b/pimd/pim_msdp.c
@@ -1286,7 +1286,9 @@ enum pim_msdp_err pim_msdp_mg_del(struct pim_instance *pim,
struct pim_msdp_mg *mg = pim->msdp.mg;
struct pim_msdp_mg_mbr *mbr;
- if (!mg || strcmp(mg->mesh_group_name, mesh_group_name)) {
+ if (!mg
+ || (mesh_group_name
+ && strcmp(mg->mesh_group_name, mesh_group_name))) {
return PIM_MSDP_ERR_NO_MG;
}
diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c
index 60b7c73d43..68d43c0556 100644
--- a/pimd/pim_nht.c
+++ b/pimd/pim_nht.c
@@ -788,7 +788,11 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS)
case NEXTHOP_TYPE_IPV6_IFINDEX:
ifp1 = if_lookup_by_index(nexthop->ifindex,
pim->vrf_id);
- nbr = pim_neighbor_find_if(ifp1);
+
+ if (!ifp1)
+ nbr = NULL;
+ else
+ nbr = pim_neighbor_find_if(ifp1);
/* Overwrite with Nbr address as NH addr */
if (nbr)
nexthop->gate.ipv4 = nbr->source_addr;
diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c
index f37c140bf2..3976b262e3 100644
--- a/pimd/pim_pim.c
+++ b/pimd/pim_pim.c
@@ -23,6 +23,7 @@
#include "thread.h"
#include "memory.h"
#include "if.h"
+#include "network.h"
#include "pimd.h"
#include "pim_pim.h"
@@ -878,7 +879,7 @@ int pim_sock_add(struct interface *ifp)
old_genid = pim_ifp->pim_generation_id;
while (old_genid == pim_ifp->pim_generation_id)
- pim_ifp->pim_generation_id = random();
+ pim_ifp->pim_generation_id = frr_weak_random();
zlog_info("PIM INTERFACE UP: on interface %s ifindex=%d", ifp->name,
ifp->ifindex);
diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c
index a9f1d9335a..ef5f478226 100644
--- a/pimd/pim_rp.c
+++ b/pimd/pim_rp.c
@@ -1261,11 +1261,11 @@ void pim_rp_show_information(struct pim_instance *pim, struct vty *vty, bool uj)
char buf[48];
if (rp_info->rp_src == RP_SRC_STATIC)
- strcpy(source, "Static");
+ strlcpy(source, "Static", sizeof(source));
else if (rp_info->rp_src == RP_SRC_BSR)
- strcpy(source, "BSR");
+ strlcpy(source, "BSR", sizeof(source));
else
- strcpy(source, "None");
+ strlcpy(source, "None", sizeof(source));
if (uj) {
/*
* If we have moved on to a new RP then add the
diff --git a/pimd/pim_sock.c b/pimd/pim_sock.c
index ae5781f0cc..f0a71c96ce 100644
--- a/pimd/pim_sock.c
+++ b/pimd/pim_sock.c
@@ -375,8 +375,7 @@ int pim_socket_recvfromto(int fd, uint8_t *buf, size_t len,
struct in_pktinfo *i =
(struct in_pktinfo *)CMSG_DATA(cmsg);
if (to)
- ((struct sockaddr_in *)to)->sin_addr =
- i->ipi_addr;
+ to->sin_addr = i->ipi_addr;
if (tolen)
*tolen = sizeof(struct sockaddr_in);
if (ifindex)
@@ -391,7 +390,7 @@ int pim_socket_recvfromto(int fd, uint8_t *buf, size_t len,
&& (cmsg->cmsg_type == IP_RECVDSTADDR)) {
struct in_addr *i = (struct in_addr *)CMSG_DATA(cmsg);
if (to)
- ((struct sockaddr_in *)to)->sin_addr = *i;
+ to->sin_addr = *i;
if (tolen)
*tolen = sizeof(struct sockaddr_in);
diff --git a/pimd/pim_tlv.c b/pimd/pim_tlv.c
index 881a3e332a..633bb207bd 100644
--- a/pimd/pim_tlv.c
+++ b/pimd/pim_tlv.c
@@ -121,20 +121,19 @@ int pim_encode_addr_ucast(uint8_t *buf, struct prefix *p)
{
switch (p->family) {
case AF_INET:
- *(uint8_t *)buf =
- PIM_MSG_ADDRESS_FAMILY_IPV4; /* notice: AF_INET !=
- PIM_MSG_ADDRESS_FAMILY_IPV4
- */
+ *buf = PIM_MSG_ADDRESS_FAMILY_IPV4; /* notice: AF_INET !=
+ PIM_MSG_ADDRESS_FAMILY_IPV4
+ */
++buf;
- *(uint8_t *)buf = 0; /* ucast IPv4 native encoding type (RFC
+ *buf = 0; /* ucast IPv4 native encoding type (RFC
4601: 4.9.1) */
++buf;
memcpy(buf, &p->u.prefix4, sizeof(struct in_addr));
return ucast_ipv4_encoding_len;
case AF_INET6:
- *(uint8_t *)buf = PIM_MSG_ADDRESS_FAMILY_IPV6;
+ *buf = PIM_MSG_ADDRESS_FAMILY_IPV6;
++buf;
- *(uint8_t *)buf = 0;
+ *buf = 0;
++buf;
memcpy(buf, &p->u.prefix6, sizeof(struct in6_addr));
return ucast_ipv6_encoding_len;
@@ -198,13 +197,13 @@ int pim_encode_addr_group(uint8_t *buf, afi_t afi, int bidir, int scope,
switch (afi) {
case AFI_IP:
- *(uint8_t *)buf = PIM_MSG_ADDRESS_FAMILY_IPV4;
+ *buf = PIM_MSG_ADDRESS_FAMILY_IPV4;
++buf;
- *(uint8_t *)buf = 0;
+ *buf = 0;
++buf;
- *(uint8_t *)buf = flags;
+ *buf = flags;
++buf;
- *(uint8_t *)buf = 32;
+ *buf = 32;
++buf;
memcpy(buf, &group, sizeof(struct in_addr));
return group_ipv4_encoding_len;
diff --git a/pimd/pim_tlv.h b/pimd/pim_tlv.h
index 657675b312..ef764656d3 100644
--- a/pimd/pim_tlv.h
+++ b/pimd/pim_tlv.h
@@ -48,8 +48,18 @@ typedef uint32_t pim_hello_options;
#define PIM_OPTION_UNSET(options, option_mask) ((options) &= ~(option_mask))
#define PIM_OPTION_IS_SET(options, option_mask) ((options) & (option_mask))
-#define PIM_TLV_GET_UINT16(buf) ntohs(*(const uint16_t *)(buf))
-#define PIM_TLV_GET_UINT32(buf) ntohl(*(const uint32_t *)(buf))
+#define PIM_TLV_GET_UINT16(buf) \
+ ({ \
+ uint16_t _tmp; \
+ memcpy(&_tmp, (buf), sizeof(uint16_t)); \
+ ntohs(_tmp); \
+ })
+#define PIM_TLV_GET_UINT32(buf) \
+ ({ \
+ uint32_t _tmp; \
+ memcpy(&_tmp, (buf), sizeof(uint32_t)); \
+ ntohl(_tmp); \
+ })
#define PIM_TLV_GET_TYPE(buf) PIM_TLV_GET_UINT16(buf)
#define PIM_TLV_GET_LENGTH(buf) PIM_TLV_GET_UINT16(buf)
#define PIM_TLV_GET_HOLDTIME(buf) PIM_TLV_GET_UINT16(buf)
diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c
index 872883dfde..1e78f41359 100644
--- a/pimd/pim_upstream.c
+++ b/pimd/pim_upstream.c
@@ -29,6 +29,7 @@
#include "hash.h"
#include "jhash.h"
#include "wheel.h"
+#include "network.h"
#include "pimd.h"
#include "pim_pim.h"
@@ -462,10 +463,26 @@ void pim_upstream_join_timer_decrease_to_t_override(const char *debug_label,
return;
}
- join_timer_remain_msec = pim_time_timer_remain_msec(up->t_join_timer);
t_override_msec =
pim_if_t_override_msec(up->rpf.source_nexthop.interface);
+ if (up->t_join_timer) {
+ join_timer_remain_msec =
+ pim_time_timer_remain_msec(up->t_join_timer);
+ } else {
+ /* upstream join tracked with neighbor jp timer */
+ struct pim_neighbor *nbr;
+
+ nbr = pim_neighbor_find(up->rpf.source_nexthop.interface,
+ up->rpf.rpf_addr.u.prefix4);
+ if (nbr)
+ join_timer_remain_msec =
+ pim_time_timer_remain_msec(nbr->jp_timer);
+ else
+ /* Manipulate such that override takes place */
+ join_timer_remain_msec = t_override_msec + 1;
+ }
+
if (PIM_DEBUG_PIM_TRACE) {
char rpf_str[INET_ADDRSTRLEN];
pim_inet4_dump("<rpf?>", up->rpf.rpf_addr.u.prefix4, rpf_str,
@@ -1746,7 +1763,7 @@ void pim_upstream_start_register_stop_timer(struct pim_upstream *up,
if (!null_register) {
uint32_t lower = (0.5 * PIM_REGISTER_SUPPRESSION_PERIOD);
uint32_t upper = (1.5 * PIM_REGISTER_SUPPRESSION_PERIOD);
- time = lower + (random() % (upper - lower + 1))
+ time = lower + (frr_weak_random() % (upper - lower + 1))
- PIM_REGISTER_PROBE_PERIOD;
} else
time = PIM_REGISTER_PROBE_PERIOD;
diff --git a/pimd/pim_zlookup.c b/pimd/pim_zlookup.c
index 84fac4f951..49c221f8ed 100644
--- a/pimd/pim_zlookup.c
+++ b/pimd/pim_zlookup.c
@@ -285,17 +285,17 @@ static int zclient_read_nexthop(struct pim_instance *pim,
* If we are sending v6 secondary assume we receive v6
* secondary
*/
- if (pim->send_v6_secondary)
- nbr = pim_neighbor_find_by_secondary(
- if_lookup_by_index(
- nexthop_tab[num_ifindex]
- .ifindex,
- nexthop_vrf_id),
- &p);
+ struct interface *ifp = if_lookup_by_index(
+ nexthop_tab[num_ifindex].ifindex,
+ nexthop_vrf_id);
+
+ if (!ifp)
+ nbr = NULL;
+ else if (pim->send_v6_secondary)
+ nbr = pim_neighbor_find_by_secondary(ifp, &p);
else
- nbr = pim_neighbor_find_if(if_lookup_by_index(
- nexthop_tab[num_ifindex].ifindex,
- nexthop_vrf_id));
+ nbr = pim_neighbor_find_if(ifp);
+
if (nbr) {
nexthop_tab[num_ifindex].nexthop_addr.family =
AF_INET;