mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-11 16:39:33 +00:00
pimd: switch pim_rpf.h to use 'struct prefix' for address
mrib_nexthop_addr and rpf_addr should be 'struct prefix' so that we can safely handle unnumbered data from a nexthop lookup in zebra Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
0252d82d06
commit
63c59d0c9a
@ -1076,8 +1076,8 @@ static void pim_show_upstream_rpf(struct vty *vty)
|
|||||||
|
|
||||||
pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str));
|
pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str));
|
||||||
pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str));
|
pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str));
|
||||||
pim_inet4_dump("<nexthop?>", rpf->source_nexthop.mrib_nexthop_addr, rpf_nexthop_str, sizeof(rpf_nexthop_str));
|
pim_addr_dump("<nexthop?>", &rpf->source_nexthop.mrib_nexthop_addr, rpf_nexthop_str, sizeof(rpf_nexthop_str));
|
||||||
pim_inet4_dump("<rpf?>", rpf->rpf_addr, rpf_addr_str, sizeof(rpf_addr_str));
|
pim_addr_dump("<rpf?>", &rpf->rpf_addr, rpf_addr_str, sizeof(rpf_addr_str));
|
||||||
|
|
||||||
rpf_ifname = rpf->source_nexthop.interface ? rpf->source_nexthop.interface->name : "<ifname?>";
|
rpf_ifname = rpf->source_nexthop.interface ? rpf->source_nexthop.interface->name : "<ifname?>";
|
||||||
|
|
||||||
@ -1155,8 +1155,8 @@ static void pim_show_rpf(struct vty *vty)
|
|||||||
|
|
||||||
pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str));
|
pim_inet4_dump("<src?>", up->sg.src, src_str, sizeof(src_str));
|
||||||
pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str));
|
pim_inet4_dump("<grp?>", up->sg.grp, grp_str, sizeof(grp_str));
|
||||||
pim_inet4_dump("<rpf?>", rpf->rpf_addr, rpf_addr_str, sizeof(rpf_addr_str));
|
pim_addr_dump("<rpf?>", &rpf->rpf_addr, rpf_addr_str, sizeof(rpf_addr_str));
|
||||||
pim_inet4_dump("<nexthop?>", rpf->source_nexthop.mrib_nexthop_addr, rib_nexthop_str, sizeof(rib_nexthop_str));
|
pim_addr_dump("<nexthop?>", &rpf->source_nexthop.mrib_nexthop_addr, rib_nexthop_str, sizeof(rib_nexthop_str));
|
||||||
|
|
||||||
rpf_ifname = rpf->source_nexthop.interface ? rpf->source_nexthop.interface->name : "<ifname?>";
|
rpf_ifname = rpf->source_nexthop.interface ? rpf->source_nexthop.interface->name : "<ifname?>";
|
||||||
|
|
||||||
@ -2371,7 +2371,7 @@ DEFUN (show_ip_rib,
|
|||||||
vty_out(vty, "Address NextHop Interface Metric Preference%s",
|
vty_out(vty, "Address NextHop Interface Metric Preference%s",
|
||||||
VTY_NEWLINE);
|
VTY_NEWLINE);
|
||||||
|
|
||||||
pim_inet4_dump("<nexthop?>", nexthop.mrib_nexthop_addr,
|
pim_addr_dump("<nexthop?>", &nexthop.mrib_nexthop_addr,
|
||||||
nexthop_addr_str, sizeof(nexthop_addr_str));
|
nexthop_addr_str, sizeof(nexthop_addr_str));
|
||||||
|
|
||||||
vty_out(vty, "%-15s %-15s %-9s %6d %10d%s",
|
vty_out(vty, "%-15s %-15s %-9s %6d %10d%s",
|
||||||
|
@ -512,7 +512,7 @@ static void check_recv_upstream(int is_join,
|
|||||||
|
|
||||||
/* Upstream (S,G) in Joined state */
|
/* Upstream (S,G) in Joined state */
|
||||||
|
|
||||||
if (PIM_INADDR_IS_ANY(up->rpf.rpf_addr)) {
|
if (pim_rpf_addr_is_inaddr_any(&up->rpf)) {
|
||||||
/* RPF'(S,G) not found */
|
/* RPF'(S,G) not found */
|
||||||
zlog_warn("%s %s: RPF'%s not found",
|
zlog_warn("%s %s: RPF'%s not found",
|
||||||
__FILE__, __PRETTY_FUNCTION__,
|
__FILE__, __PRETTY_FUNCTION__,
|
||||||
@ -521,11 +521,11 @@ static void check_recv_upstream(int is_join,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* upstream directed to RPF'(S,G) ? */
|
/* upstream directed to RPF'(S,G) ? */
|
||||||
if (upstream.s_addr != up->rpf.rpf_addr.s_addr) {
|
if (upstream.s_addr != up->rpf.rpf_addr.u.prefix4.s_addr) {
|
||||||
char up_str[100];
|
char up_str[100];
|
||||||
char rpf_str[100];
|
char rpf_str[100];
|
||||||
pim_inet4_dump("<up?>", upstream, up_str, sizeof(up_str));
|
pim_inet4_dump("<up?>", upstream, up_str, sizeof(up_str));
|
||||||
pim_inet4_dump("<rpf?>", up->rpf.rpf_addr, rpf_str, sizeof(rpf_str));
|
pim_addr_dump("<rpf?>", &up->rpf.rpf_addr, rpf_str, sizeof(rpf_str));
|
||||||
zlog_warn("%s %s: (S,G)=%s upstream=%s not directed to RPF'(S,G)=%s on interface %s",
|
zlog_warn("%s %s: (S,G)=%s upstream=%s not directed to RPF'(S,G)=%s on interface %s",
|
||||||
__FILE__, __PRETTY_FUNCTION__,
|
__FILE__, __PRETTY_FUNCTION__,
|
||||||
pim_str_sg_dump (sg),
|
pim_str_sg_dump (sg),
|
||||||
@ -536,7 +536,7 @@ static void check_recv_upstream(int is_join,
|
|||||||
|
|
||||||
if (is_join) {
|
if (is_join) {
|
||||||
/* Join(S,G) to RPF'(S,G) */
|
/* Join(S,G) to RPF'(S,G) */
|
||||||
pim_upstream_join_suppress(up, up->rpf.rpf_addr, holdtime);
|
pim_upstream_join_suppress(up, up->rpf.rpf_addr.u.prefix4, holdtime);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -546,19 +546,19 @@ static void check_recv_upstream(int is_join,
|
|||||||
if (source_flags & PIM_WILDCARD_BIT_MASK) {
|
if (source_flags & PIM_WILDCARD_BIT_MASK) {
|
||||||
/* Prune(*,G) to RPF'(S,G) */
|
/* Prune(*,G) to RPF'(S,G) */
|
||||||
pim_upstream_join_timer_decrease_to_t_override("Prune(*,G)",
|
pim_upstream_join_timer_decrease_to_t_override("Prune(*,G)",
|
||||||
up, up->rpf.rpf_addr);
|
up, up->rpf.rpf_addr.u.prefix4);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prune(S,G,rpt) to RPF'(S,G) */
|
/* Prune(S,G,rpt) to RPF'(S,G) */
|
||||||
pim_upstream_join_timer_decrease_to_t_override("Prune(S,G,rpt)",
|
pim_upstream_join_timer_decrease_to_t_override("Prune(S,G,rpt)",
|
||||||
up, up->rpf.rpf_addr);
|
up, up->rpf.rpf_addr.u.prefix4);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prune(S,G) to RPF'(S,G) */
|
/* Prune(S,G) to RPF'(S,G) */
|
||||||
pim_upstream_join_timer_decrease_to_t_override("Prune(S,G)", up,
|
pim_upstream_join_timer_decrease_to_t_override("Prune(S,G)", up,
|
||||||
up->rpf.rpf_addr);
|
up->rpf.rpf_addr.u.prefix4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nonlocal_upstream(int is_join,
|
static int nonlocal_upstream(int is_join,
|
||||||
|
@ -90,7 +90,7 @@ static void recv_join(struct interface *ifp,
|
|||||||
* If the RP sent in the message is not
|
* If the RP sent in the message is not
|
||||||
* our RP for the group, drop the message
|
* our RP for the group, drop the message
|
||||||
*/
|
*/
|
||||||
if (sg.src.s_addr != rp->rpf_addr.s_addr)
|
if (sg.src.s_addr != rp->rpf_addr.u.prefix4.s_addr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sg.src.s_addr = INADDR_ANY;
|
sg.src.s_addr = INADDR_ANY;
|
||||||
@ -162,7 +162,7 @@ static void recv_prune(struct interface *ifp,
|
|||||||
struct pim_rpf *rp = RP (sg.grp);
|
struct pim_rpf *rp = RP (sg.grp);
|
||||||
|
|
||||||
// Ignoring Prune *,G's at the moment.
|
// Ignoring Prune *,G's at the moment.
|
||||||
if (sg.src.s_addr != rp->rpf_addr.s_addr)
|
if (sg.src.s_addr != rp->rpf_addr.u.prefix4.s_addr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sg.src.s_addr = INADDR_ANY;
|
sg.src.s_addr = INADDR_ANY;
|
||||||
|
@ -97,7 +97,7 @@ pim_mroute_msg_nocache (int fd, struct interface *ifp, const struct igmpmsg *msg
|
|||||||
* the Interface type is SSM we don't need to
|
* the Interface type is SSM we don't need to
|
||||||
* do anything here
|
* do anything here
|
||||||
*/
|
*/
|
||||||
if ((rpg->rpf_addr.s_addr == INADDR_NONE) ||
|
if ((pim_rpf_addr_is_inaddr_none (rpg)) ||
|
||||||
(!pim_ifp) ||
|
(!pim_ifp) ||
|
||||||
(!(PIM_I_am_DR(pim_ifp))) ||
|
(!(PIM_I_am_DR(pim_ifp))) ||
|
||||||
(pim_ifp->itype == PIM_INTERFACE_SSM))
|
(pim_ifp->itype == PIM_INTERFACE_SSM))
|
||||||
@ -183,7 +183,7 @@ pim_mroute_msg_wholepkt (int fd, struct interface *ifp, const char *buf)
|
|||||||
|
|
||||||
rpg = RP(sg.grp);
|
rpg = RP(sg.grp);
|
||||||
|
|
||||||
if ((rpg->rpf_addr.s_addr == INADDR_NONE) ||
|
if ((pim_rpf_addr_is_inaddr_none (rpg)) ||
|
||||||
(!pim_ifp) ||
|
(!pim_ifp) ||
|
||||||
(!(PIM_I_am_DR(pim_ifp))) ||
|
(!(PIM_I_am_DR(pim_ifp))) ||
|
||||||
(pim_ifp->itype == PIM_INTERFACE_SSM)) {
|
(pim_ifp->itype == PIM_INTERFACE_SSM)) {
|
||||||
|
@ -181,7 +181,7 @@ pim_msg_join_prune_encode (uint8_t *buf, int buf_size, int is_join,
|
|||||||
{
|
{
|
||||||
struct pim_rpf *rpf = pim_rp_g (group);
|
struct pim_rpf *rpf = pim_rp_g (group);
|
||||||
bits = PIM_ENCODE_SPARSE_BIT | PIM_ENCODE_WC_BIT | PIM_ENCODE_RPT_BIT;
|
bits = PIM_ENCODE_SPARSE_BIT | PIM_ENCODE_WC_BIT | PIM_ENCODE_RPT_BIT;
|
||||||
stosend = rpf->rpf_addr;
|
stosend = rpf->rpf_addr.u.prefix4;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -155,7 +155,7 @@ pim_register_send (const uint8_t *buf, int buf_size, struct in_addr src, struct
|
|||||||
if (PIM_DEBUG_PIM_REG)
|
if (PIM_DEBUG_PIM_REG)
|
||||||
{
|
{
|
||||||
char rp_str[100];
|
char rp_str[100];
|
||||||
strcpy (rp_str, inet_ntoa (rpg->rpf_addr));
|
strcpy (rp_str, inet_ntoa (rpg->rpf_addr.u.prefix4));
|
||||||
zlog_debug ("Sending %sRegister Packet to %s", null_register ? "NULL " : "", rp_str);
|
zlog_debug ("Sending %sRegister Packet to %s", null_register ? "NULL " : "", rp_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ pim_register_send (const uint8_t *buf, int buf_size, struct in_addr src, struct
|
|||||||
|
|
||||||
if (pim_msg_send(pinfo->pim_sock_fd,
|
if (pim_msg_send(pinfo->pim_sock_fd,
|
||||||
src,
|
src,
|
||||||
rpg->rpf_addr,
|
rpg->rpf_addr.u.prefix4,
|
||||||
buffer,
|
buffer,
|
||||||
buf_size + PIM_MSG_REGISTER_LEN,
|
buf_size + PIM_MSG_REGISTER_LEN,
|
||||||
ifp->name)) {
|
ifp->name)) {
|
||||||
@ -296,7 +296,7 @@ pim_register_recv (struct interface *ifp,
|
|||||||
sg.src = ip_hdr->ip_src;
|
sg.src = ip_hdr->ip_src;
|
||||||
sg.grp = ip_hdr->ip_dst;
|
sg.grp = ip_hdr->ip_dst;
|
||||||
|
|
||||||
if (I_am_RP (sg.grp) && (dest_addr.s_addr == ((RP (sg.grp))->rpf_addr.s_addr))) {
|
if (I_am_RP (sg.grp) && (dest_addr.s_addr == ((RP (sg.grp))->rpf_addr.u.prefix4.s_addr))) {
|
||||||
sentRegisterStop = 0;
|
sentRegisterStop = 0;
|
||||||
|
|
||||||
if (*bits & PIM_REGISTER_BORDER_BIT) {
|
if (*bits & PIM_REGISTER_BORDER_BIT) {
|
||||||
|
@ -91,7 +91,8 @@ pim_rp_init (void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
str2prefix ("224.0.0.0/4", &rp_info->group);
|
str2prefix ("224.0.0.0/4", &rp_info->group);
|
||||||
rp_info->rp.rpf_addr.s_addr = INADDR_NONE;
|
rp_info->rp.rpf_addr.family = AF_INET;
|
||||||
|
rp_info->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
|
||||||
tail = rp_info;
|
tail = rp_info;
|
||||||
|
|
||||||
listnode_add (qpim_rp_list, rp_info);
|
listnode_add (qpim_rp_list, rp_info);
|
||||||
@ -112,7 +113,7 @@ pim_rp_find_exact (struct in_addr rp, struct prefix *group)
|
|||||||
|
|
||||||
for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
|
for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
|
||||||
{
|
{
|
||||||
if (rp.s_addr == rp_info->rp.rpf_addr.s_addr &&
|
if (rp.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr &&
|
||||||
prefix_same (&rp_info->group, group))
|
prefix_same (&rp_info->group, group))
|
||||||
return rp_info;
|
return rp_info;
|
||||||
}
|
}
|
||||||
@ -128,7 +129,7 @@ pim_rp_find_match (struct in_addr rp, struct prefix *group)
|
|||||||
|
|
||||||
for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
|
for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
|
||||||
{
|
{
|
||||||
if (rp.s_addr == rp_info->rp.rpf_addr.s_addr &&
|
if (rp.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr &&
|
||||||
prefix_match (&rp_info->group, group))
|
prefix_match (&rp_info->group, group))
|
||||||
return rp_info;
|
return rp_info;
|
||||||
}
|
}
|
||||||
@ -164,7 +165,7 @@ pim_rp_check_interfaces (struct rp_info *rp_info)
|
|||||||
if (!pim_ifp)
|
if (!pim_ifp)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (pim_ifp->primary_address.s_addr == rp_info->rp.rpf_addr.s_addr)
|
if (pim_ifp->primary_address.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr)
|
||||||
rp_info->i_am_rp = 1;
|
rp_info->i_am_rp = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -192,7 +193,7 @@ pim_rp_new (const char *rp, const char *group_range)
|
|||||||
if (!result)
|
if (!result)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
result = inet_pton (AF_INET, rp, &rp_info->rp.rpf_addr.s_addr);
|
result = inet_pton (rp_info->rp.rpf_addr.family, rp, &rp_info->rp.rpf_addr.u.prefix);
|
||||||
if (result <= 0)
|
if (result <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -200,7 +201,7 @@ pim_rp_new (const char *rp, const char *group_range)
|
|||||||
* Take over the 224.0.0.0/4 group if the rp is INADDR_NONE
|
* Take over the 224.0.0.0/4 group if the rp is INADDR_NONE
|
||||||
*/
|
*/
|
||||||
if (prefix_same (&rp_all->group, &rp_info->group) &&
|
if (prefix_same (&rp_all->group, &rp_info->group) &&
|
||||||
rp_all->rp.rpf_addr.s_addr == INADDR_NONE)
|
pim_rpf_addr_is_inaddr_none (&rp_all->rp))
|
||||||
{
|
{
|
||||||
rp_all->rp.rpf_addr = rp_info->rp.rpf_addr;
|
rp_all->rp.rpf_addr = rp_info->rp.rpf_addr;
|
||||||
XFREE (MTYPE_PIM_RP, rp_info);
|
XFREE (MTYPE_PIM_RP, rp_info);
|
||||||
@ -210,13 +211,13 @@ pim_rp_new (const char *rp, const char *group_range)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pim_rp_find_exact (rp_info->rp.rpf_addr, &rp_info->group))
|
if (pim_rp_find_exact (rp_info->rp.rpf_addr.u.prefix4, &rp_info->group))
|
||||||
{
|
{
|
||||||
XFREE (MTYPE_PIM_RP, rp_info);
|
XFREE (MTYPE_PIM_RP, rp_info);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pim_rp_find_match (rp_info->rp.rpf_addr, &rp_info->group))
|
if (pim_rp_find_match (rp_info->rp.rpf_addr.u.prefix4, &rp_info->group))
|
||||||
{
|
{
|
||||||
if (prefix_same (&group_all, &rp_info->group))
|
if (prefix_same (&group_all, &rp_info->group))
|
||||||
{
|
{
|
||||||
@ -267,7 +268,8 @@ pim_rp_del (const char *rp, const char *group_range)
|
|||||||
|
|
||||||
if (rp_all == rp_info)
|
if (rp_all == rp_info)
|
||||||
{
|
{
|
||||||
rp_all->rp.rpf_addr.s_addr = INADDR_NONE;
|
rp_all->rp.rpf_addr.family = AF_INET;
|
||||||
|
rp_all->rp.rpf_addr.u.prefix4.s_addr = INADDR_NONE;
|
||||||
rp_all->i_am_rp = 0;
|
rp_all->i_am_rp = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -285,7 +287,7 @@ pim_rp_setup (void)
|
|||||||
|
|
||||||
for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
|
for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
|
||||||
{
|
{
|
||||||
if (pim_nexthop_lookup (&rp_info->rp.source_nexthop, rp_info->rp.rpf_addr) != 0)
|
if (pim_nexthop_lookup (&rp_info->rp.source_nexthop, rp_info->rp.rpf_addr.u.prefix4) != 0)
|
||||||
{
|
{
|
||||||
zlog_err ("Unable to lookup nexthop for rp specified");
|
zlog_err ("Unable to lookup nexthop for rp specified");
|
||||||
ret++;
|
ret++;
|
||||||
@ -316,20 +318,20 @@ pim_rp_check_rp (struct in_addr old, struct in_addr new)
|
|||||||
char sold[100];
|
char sold[100];
|
||||||
char snew[100];
|
char snew[100];
|
||||||
char rp[100];
|
char rp[100];
|
||||||
pim_inet4_dump("<rp?>", rp_info->rp.rpf_addr, rp, sizeof(rp));
|
pim_addr_dump("<rp?>", &rp_info->rp.rpf_addr, rp, sizeof(rp));
|
||||||
pim_inet4_dump("<old?>", old, sold, sizeof(sold));
|
pim_inet4_dump("<old?>", old, sold, sizeof(sold));
|
||||||
pim_inet4_dump("<new?>", new, snew, sizeof(snew));
|
pim_inet4_dump("<new?>", new, snew, sizeof(snew));
|
||||||
zlog_debug("%s: %s for old %s new %s", __func__, rp, sold, snew );
|
zlog_debug("%s: %s for old %s new %s", __func__, rp, sold, snew );
|
||||||
}
|
}
|
||||||
if (rp_info->rp.rpf_addr.s_addr == INADDR_NONE)
|
if (pim_rpf_addr_is_inaddr_none (&rp_info->rp))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (new.s_addr == rp_info->rp.rpf_addr.s_addr)
|
if (new.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr)
|
||||||
{
|
{
|
||||||
rp_info->i_am_rp = 1;
|
rp_info->i_am_rp = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (old.s_addr == rp_info->rp.rpf_addr.s_addr)
|
if (old.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr)
|
||||||
{
|
{
|
||||||
rp_info->i_am_rp = 0;
|
rp_info->i_am_rp = 0;
|
||||||
}
|
}
|
||||||
@ -381,7 +383,7 @@ pim_rp_g (struct in_addr group)
|
|||||||
|
|
||||||
if (rp_info)
|
if (rp_info)
|
||||||
{
|
{
|
||||||
pim_nexthop_lookup(&rp_info->rp.source_nexthop, rp_info->rp.rpf_addr);
|
pim_nexthop_lookup(&rp_info->rp.source_nexthop, rp_info->rp.rpf_addr.u.prefix4);
|
||||||
return (&rp_info->rp);
|
return (&rp_info->rp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -410,14 +412,14 @@ pim_rp_set_upstream_addr (struct in_addr *up, struct in_addr source, struct in_a
|
|||||||
|
|
||||||
rp_info = pim_rp_find_match_group (&g);
|
rp_info = pim_rp_find_match_group (&g);
|
||||||
|
|
||||||
if ((rp_info->rp.rpf_addr.s_addr == INADDR_NONE) && (source.s_addr == INADDR_ANY))
|
if ((pim_rpf_addr_is_inaddr_none (&rp_info->rp)) && (source.s_addr == INADDR_ANY))
|
||||||
{
|
{
|
||||||
if (PIM_DEBUG_PIM_TRACE)
|
if (PIM_DEBUG_PIM_TRACE)
|
||||||
zlog_debug("%s: Received a (*,G) with no RP configured", __PRETTY_FUNCTION__);
|
zlog_debug("%s: Received a (*,G) with no RP configured", __PRETTY_FUNCTION__);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*up = (source.s_addr == INADDR_ANY) ? rp_info->rp.rpf_addr : source;
|
*up = (source.s_addr == INADDR_ANY) ? rp_info->rp.rpf_addr.u.prefix4 : source;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -432,10 +434,10 @@ pim_rp_config_write (struct vty *vty)
|
|||||||
|
|
||||||
for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
|
for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
|
||||||
{
|
{
|
||||||
if (rp_info->rp.rpf_addr.s_addr == INADDR_NONE)
|
if (pim_rpf_addr_is_inaddr_none (&rp_info->rp))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (rp_info->rp.rpf_addr.s_addr != INADDR_NONE)
|
if (!pim_rpf_addr_is_inaddr_none (&rp_info->rp))
|
||||||
{
|
{
|
||||||
char buf[32];
|
char buf[32];
|
||||||
vty_out(vty, "ip pim rp %s %s%s", inet_ntop(AF_INET, &rp_info->rp.rpf_addr, buffer, 32),
|
vty_out(vty, "ip pim rp %s %s%s", inet_ntop(AF_INET, &rp_info->rp.rpf_addr, buffer, 32),
|
||||||
@ -467,7 +469,7 @@ pim_rp_check_is_my_ip_address (struct in_addr group, struct in_addr dest_addr)
|
|||||||
*/
|
*/
|
||||||
if (I_am_RP(group))
|
if (I_am_RP(group))
|
||||||
{
|
{
|
||||||
if (dest_addr.s_addr == rp_info->rp.rpf_addr.s_addr)
|
if (dest_addr.s_addr == rp_info->rp.rpf_addr.u.prefix4.s_addr)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -486,11 +488,11 @@ pim_rp_show_information (struct vty *vty)
|
|||||||
vty_out (vty, "RP Addr Group Oif I_am_RP%s", VTY_NEWLINE);
|
vty_out (vty, "RP Addr Group Oif I_am_RP%s", VTY_NEWLINE);
|
||||||
for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
|
for (ALL_LIST_ELEMENTS_RO (qpim_rp_list, node, rp_info))
|
||||||
{
|
{
|
||||||
if (rp_info->rp.rpf_addr.s_addr != INADDR_NONE)
|
if (!pim_rpf_addr_is_inaddr_none (&rp_info->rp))
|
||||||
{
|
{
|
||||||
char buf[48];
|
char buf[48];
|
||||||
vty_out (vty, "%-10s %-10s %-10s%-10d%s",
|
vty_out (vty, "%-10s %-10s %-10s%-10d%s",
|
||||||
inet_ntoa (rp_info->rp.rpf_addr),
|
inet_ntoa (rp_info->rp.rpf_addr.u.prefix4),
|
||||||
prefix2str(&rp_info->group, buf, 48),
|
prefix2str(&rp_info->group, buf, 48),
|
||||||
rp_info->rp.source_nexthop.interface->name,
|
rp_info->rp.source_nexthop.interface->name,
|
||||||
rp_info->i_am_rp, VTY_NEWLINE);
|
rp_info->i_am_rp, VTY_NEWLINE);
|
||||||
|
@ -103,7 +103,7 @@ int pim_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr)
|
|||||||
|
|
||||||
/* update nextop data */
|
/* update nextop data */
|
||||||
nexthop->interface = ifp;
|
nexthop->interface = ifp;
|
||||||
nexthop->mrib_nexthop_addr = nexthop_tab[0].nexthop_addr.u.prefix4;
|
nexthop->mrib_nexthop_addr = nexthop_tab[0].nexthop_addr;
|
||||||
nexthop->mrib_metric_preference = nexthop_tab[0].protocol_distance;
|
nexthop->mrib_metric_preference = nexthop_tab[0].protocol_distance;
|
||||||
nexthop->mrib_route_metric = nexthop_tab[0].route_metric;
|
nexthop->mrib_route_metric = nexthop_tab[0].route_metric;
|
||||||
|
|
||||||
@ -113,18 +113,15 @@ int pim_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr)
|
|||||||
static int nexthop_mismatch(const struct pim_nexthop *nh1,
|
static int nexthop_mismatch(const struct pim_nexthop *nh1,
|
||||||
const struct pim_nexthop *nh2)
|
const struct pim_nexthop *nh2)
|
||||||
{
|
{
|
||||||
return (nh1->interface != nh2->interface)
|
return (nh1->interface != nh2->interface) ||
|
||||||
||
|
(nh1->mrib_nexthop_addr.u.prefix4.s_addr != nh2->mrib_nexthop_addr.u.prefix4.s_addr) ||
|
||||||
(nh1->mrib_nexthop_addr.s_addr != nh2->mrib_nexthop_addr.s_addr)
|
(nh1->mrib_metric_preference != nh2->mrib_metric_preference) ||
|
||||||
||
|
|
||||||
(nh1->mrib_metric_preference != nh2->mrib_metric_preference)
|
|
||||||
||
|
|
||||||
(nh1->mrib_route_metric != nh2->mrib_route_metric);
|
(nh1->mrib_route_metric != nh2->mrib_route_metric);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct in_addr *old_rpf_addr)
|
enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct in_addr *old_rpf_addr)
|
||||||
{
|
{
|
||||||
struct in_addr save_rpf_addr;
|
struct prefix save_rpf_addr;
|
||||||
struct pim_nexthop save_nexthop;
|
struct pim_nexthop save_nexthop;
|
||||||
struct pim_rpf *rpf = &up->rpf;
|
struct pim_rpf *rpf = &up->rpf;
|
||||||
|
|
||||||
@ -135,8 +132,9 @@ enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct in_addr *old_
|
|||||||
return PIM_RPF_FAILURE;
|
return PIM_RPF_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
rpf->rpf_addr = pim_rpf_find_rpf_addr(up);
|
rpf->rpf_addr.family = AF_INET;
|
||||||
if (PIM_INADDR_IS_ANY(rpf->rpf_addr) && PIM_DEBUG_ZEBRA) {
|
rpf->rpf_addr.u.prefix4 = pim_rpf_find_rpf_addr(up);
|
||||||
|
if (pim_rpf_addr_is_inaddr_any(rpf) && PIM_DEBUG_ZEBRA) {
|
||||||
/* RPF'(S,G) not found */
|
/* RPF'(S,G) not found */
|
||||||
zlog_debug("%s %s: RPF'%s not found: won't send join upstream",
|
zlog_debug("%s %s: RPF'%s not found: won't send join upstream",
|
||||||
__FILE__, __PRETTY_FUNCTION__,
|
__FILE__, __PRETTY_FUNCTION__,
|
||||||
@ -149,7 +147,7 @@ enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct in_addr *old_
|
|||||||
|
|
||||||
if (PIM_DEBUG_ZEBRA) {
|
if (PIM_DEBUG_ZEBRA) {
|
||||||
char nhaddr_str[100];
|
char nhaddr_str[100];
|
||||||
pim_inet4_dump("<addr?>", rpf->source_nexthop.mrib_nexthop_addr, nhaddr_str, sizeof(nhaddr_str));
|
pim_addr_dump("<addr?>", &rpf->source_nexthop.mrib_nexthop_addr, nhaddr_str, sizeof(nhaddr_str));
|
||||||
zlog_debug("%s %s: (S,G)=%s source nexthop now is: interface=%s address=%s pref=%d metric=%d",
|
zlog_debug("%s %s: (S,G)=%s source nexthop now is: interface=%s address=%s pref=%d metric=%d",
|
||||||
__FILE__, __PRETTY_FUNCTION__,
|
__FILE__, __PRETTY_FUNCTION__,
|
||||||
pim_str_sg_dump (&up->sg),
|
pim_str_sg_dump (&up->sg),
|
||||||
@ -180,11 +178,11 @@ enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct in_addr *old_
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* detect change in RPF'(S,G) */
|
/* detect change in RPF'(S,G) */
|
||||||
if (save_rpf_addr.s_addr != rpf->rpf_addr.s_addr) {
|
if (save_rpf_addr.u.prefix4.s_addr != rpf->rpf_addr.u.prefix4.s_addr) {
|
||||||
|
|
||||||
/* return old rpf to caller ? */
|
/* return old rpf to caller ? */
|
||||||
if (old_rpf_addr)
|
if (old_rpf_addr)
|
||||||
*old_rpf_addr = save_rpf_addr;
|
*old_rpf_addr = save_rpf_addr.u.prefix4;
|
||||||
|
|
||||||
return PIM_RPF_CHANGED;
|
return PIM_RPF_CHANGED;
|
||||||
}
|
}
|
||||||
@ -233,7 +231,7 @@ static struct in_addr pim_rpf_find_rpf_addr(struct pim_upstream *up)
|
|||||||
/* return NBR( RPF_interface(S), MRIB.next_hop( S ) ) */
|
/* return NBR( RPF_interface(S), MRIB.next_hop( S ) ) */
|
||||||
|
|
||||||
neigh = pim_if_find_neighbor(up->rpf.source_nexthop.interface,
|
neigh = pim_if_find_neighbor(up->rpf.source_nexthop.interface,
|
||||||
up->rpf.source_nexthop.mrib_nexthop_addr);
|
up->rpf.source_nexthop.mrib_nexthop_addr.u.prefix4);
|
||||||
if (neigh)
|
if (neigh)
|
||||||
rpf_addr = neigh->source_addr;
|
rpf_addr = neigh->source_addr;
|
||||||
else
|
else
|
||||||
@ -241,3 +239,43 @@ static struct in_addr pim_rpf_find_rpf_addr(struct pim_upstream *up)
|
|||||||
|
|
||||||
return rpf_addr;
|
return rpf_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
pim_rpf_addr_is_inaddr_none (struct pim_rpf *rpf)
|
||||||
|
{
|
||||||
|
switch (rpf->rpf_addr.family)
|
||||||
|
{
|
||||||
|
case AFI_IP:
|
||||||
|
return rpf->rpf_addr.u.prefix4.s_addr == INADDR_NONE;
|
||||||
|
break;
|
||||||
|
case AFI_IP6:
|
||||||
|
zlog_warn ("%s: v6 Unimplmeneted", __PRETTY_FUNCTION__);
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
pim_rpf_addr_is_inaddr_any (struct pim_rpf *rpf)
|
||||||
|
{
|
||||||
|
switch (rpf->rpf_addr.family)
|
||||||
|
{
|
||||||
|
case AFI_IP:
|
||||||
|
return rpf->rpf_addr.u.prefix4.s_addr == INADDR_ANY;
|
||||||
|
break;
|
||||||
|
case AFI_IP6:
|
||||||
|
zlog_warn ("%s: v6 Unimplmented", __PRETTY_FUNCTION__);
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -41,14 +41,14 @@
|
|||||||
*/
|
*/
|
||||||
struct pim_nexthop {
|
struct pim_nexthop {
|
||||||
struct interface *interface; /* RPF_interface(S) */
|
struct interface *interface; /* RPF_interface(S) */
|
||||||
struct in_addr mrib_nexthop_addr; /* MRIB.next_hop(S) */
|
struct prefix mrib_nexthop_addr; /* MRIB.next_hop(S) */
|
||||||
uint32_t mrib_metric_preference; /* MRIB.pref(S) */
|
uint32_t mrib_metric_preference; /* MRIB.pref(S) */
|
||||||
uint32_t mrib_route_metric; /* MRIB.metric(S) */
|
uint32_t mrib_route_metric; /* MRIB.metric(S) */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pim_rpf {
|
struct pim_rpf {
|
||||||
struct pim_nexthop source_nexthop;
|
struct pim_nexthop source_nexthop;
|
||||||
struct in_addr rpf_addr; /* RPF'(S,G) */
|
struct prefix rpf_addr; /* RPF'(S,G) */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum pim_rpf_result {
|
enum pim_rpf_result {
|
||||||
@ -62,4 +62,6 @@ struct pim_upstream;
|
|||||||
int pim_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr);
|
int pim_nexthop_lookup(struct pim_nexthop *nexthop, struct in_addr addr);
|
||||||
enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct in_addr *old_rpf_addr);
|
enum pim_rpf_result pim_rpf_update(struct pim_upstream *up, struct in_addr *old_rpf_addr);
|
||||||
|
|
||||||
|
int pim_rpf_addr_is_inaddr_none (struct pim_rpf *rpf);
|
||||||
|
int pim_rpf_addr_is_inaddr_any (struct pim_rpf *rpf);
|
||||||
#endif /* PIM_RPF_H */
|
#endif /* PIM_RPF_H */
|
||||||
|
@ -174,11 +174,11 @@ pim_upstream_send_join (struct pim_upstream *up)
|
|||||||
{
|
{
|
||||||
if (PIM_DEBUG_PIM_TRACE) {
|
if (PIM_DEBUG_PIM_TRACE) {
|
||||||
char rpf_str[100];
|
char rpf_str[100];
|
||||||
pim_inet4_dump("<rpf?>", up->rpf.rpf_addr, rpf_str, sizeof(rpf_str));
|
pim_addr_dump("<rpf?>", &up->rpf.rpf_addr, rpf_str, sizeof(rpf_str));
|
||||||
zlog_debug ("%s: RPF'%s=%s(%s) for Interface %s", __PRETTY_FUNCTION__,
|
zlog_debug ("%s: RPF'%s=%s(%s) for Interface %s", __PRETTY_FUNCTION__,
|
||||||
pim_str_sg_dump (&up->sg), rpf_str, pim_upstream_state2str (up->join_state),
|
pim_str_sg_dump (&up->sg), rpf_str, pim_upstream_state2str (up->join_state),
|
||||||
up->rpf.source_nexthop.interface->name);
|
up->rpf.source_nexthop.interface->name);
|
||||||
if (PIM_INADDR_IS_ANY(up->rpf.rpf_addr)) {
|
if (pim_rpf_addr_is_inaddr_any(&up->rpf)) {
|
||||||
zlog_debug("%s: can't send join upstream: RPF'%s=%s",
|
zlog_debug("%s: can't send join upstream: RPF'%s=%s",
|
||||||
__PRETTY_FUNCTION__,
|
__PRETTY_FUNCTION__,
|
||||||
pim_str_sg_dump (&up->sg), rpf_str);
|
pim_str_sg_dump (&up->sg), rpf_str);
|
||||||
@ -188,7 +188,7 @@ pim_upstream_send_join (struct pim_upstream *up)
|
|||||||
|
|
||||||
/* send Join(S,G) to the current upstream neighbor */
|
/* send Join(S,G) to the current upstream neighbor */
|
||||||
pim_joinprune_send(up->rpf.source_nexthop.interface,
|
pim_joinprune_send(up->rpf.source_nexthop.interface,
|
||||||
up->rpf.rpf_addr,
|
up->rpf.rpf_addr.u.prefix4,
|
||||||
&up->sg,
|
&up->sg,
|
||||||
1 /* join */);
|
1 /* join */);
|
||||||
}
|
}
|
||||||
@ -457,7 +457,7 @@ pim_upstream_switch(struct pim_upstream *up,
|
|||||||
else {
|
else {
|
||||||
forward_off(up);
|
forward_off(up);
|
||||||
pim_joinprune_send(up->rpf.source_nexthop.interface,
|
pim_joinprune_send(up->rpf.source_nexthop.interface,
|
||||||
up->rpf.rpf_addr,
|
up->rpf.rpf_addr.u.prefix4,
|
||||||
&up->sg,
|
&up->sg,
|
||||||
0 /* prune */);
|
0 /* prune */);
|
||||||
if (up->t_join_timer)
|
if (up->t_join_timer)
|
||||||
@ -501,10 +501,12 @@ static struct pim_upstream *pim_upstream_new(struct prefix_sg *sg,
|
|||||||
up->sptbit = PIM_UPSTREAM_SPTBIT_FALSE;
|
up->sptbit = PIM_UPSTREAM_SPTBIT_FALSE;
|
||||||
|
|
||||||
up->rpf.source_nexthop.interface = NULL;
|
up->rpf.source_nexthop.interface = NULL;
|
||||||
up->rpf.source_nexthop.mrib_nexthop_addr.s_addr = PIM_NET_INADDR_ANY;
|
up->rpf.source_nexthop.mrib_nexthop_addr.family = AF_INET;
|
||||||
|
up->rpf.source_nexthop.mrib_nexthop_addr.u.prefix4.s_addr = PIM_NET_INADDR_ANY;
|
||||||
up->rpf.source_nexthop.mrib_metric_preference = qpim_infinite_assert_metric.metric_preference;
|
up->rpf.source_nexthop.mrib_metric_preference = qpim_infinite_assert_metric.metric_preference;
|
||||||
up->rpf.source_nexthop.mrib_route_metric = qpim_infinite_assert_metric.route_metric;
|
up->rpf.source_nexthop.mrib_route_metric = qpim_infinite_assert_metric.route_metric;
|
||||||
up->rpf.rpf_addr.s_addr = PIM_NET_INADDR_ANY;
|
up->rpf.rpf_addr.family = AF_INET;
|
||||||
|
up->rpf.rpf_addr.u.prefix4.s_addr = PIM_NET_INADDR_ANY;
|
||||||
|
|
||||||
rpf_result = pim_rpf_update(up, NULL);
|
rpf_result = pim_rpf_update(up, NULL);
|
||||||
if (rpf_result == PIM_RPF_FAILURE) {
|
if (rpf_result == PIM_RPF_FAILURE) {
|
||||||
@ -703,7 +705,7 @@ void pim_upstream_rpf_genid_changed(struct in_addr neigh_addr)
|
|||||||
char neigh_str[100];
|
char neigh_str[100];
|
||||||
char rpf_addr_str[100];
|
char rpf_addr_str[100];
|
||||||
pim_inet4_dump("<neigh?>", neigh_addr, neigh_str, sizeof(neigh_str));
|
pim_inet4_dump("<neigh?>", neigh_addr, neigh_str, sizeof(neigh_str));
|
||||||
pim_inet4_dump("<rpf?>", up->rpf.rpf_addr, rpf_addr_str, sizeof(rpf_addr_str));
|
pim_addr_dump("<rpf?>", &up->rpf.rpf_addr, rpf_addr_str, sizeof(rpf_addr_str));
|
||||||
zlog_debug("%s: matching neigh=%s against upstream (S,G)=%s joined=%d rpf_addr=%s",
|
zlog_debug("%s: matching neigh=%s against upstream (S,G)=%s joined=%d rpf_addr=%s",
|
||||||
__PRETTY_FUNCTION__,
|
__PRETTY_FUNCTION__,
|
||||||
neigh_str, pim_str_sg_dump (&up->sg),
|
neigh_str, pim_str_sg_dump (&up->sg),
|
||||||
@ -716,7 +718,7 @@ void pim_upstream_rpf_genid_changed(struct in_addr neigh_addr)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* match RPF'(S,G)=neigh_addr */
|
/* match RPF'(S,G)=neigh_addr */
|
||||||
if (up->rpf.rpf_addr.s_addr != neigh_addr.s_addr)
|
if (up->rpf.rpf_addr.u.prefix4.s_addr != neigh_addr.s_addr)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pim_upstream_join_timer_decrease_to_t_override("RPF'(S,G) GenID change",
|
pim_upstream_join_timer_decrease_to_t_override("RPF'(S,G) GenID change",
|
||||||
@ -878,7 +880,7 @@ pim_upstream_keep_alive_timer (struct thread *t)
|
|||||||
THREAD_OFF (up->t_ka_timer);
|
THREAD_OFF (up->t_ka_timer);
|
||||||
THREAD_OFF (up->t_rs_timer);
|
THREAD_OFF (up->t_rs_timer);
|
||||||
THREAD_OFF (up->t_join_timer);
|
THREAD_OFF (up->t_join_timer);
|
||||||
pim_joinprune_send (up->rpf.source_nexthop.interface, up->rpf.rpf_addr,
|
pim_joinprune_send (up->rpf.source_nexthop.interface, up->rpf.rpf_addr.u.prefix4,
|
||||||
&up->sg, 0);
|
&up->sg, 0);
|
||||||
pim_upstream_del (up);
|
pim_upstream_del (up);
|
||||||
}
|
}
|
||||||
@ -1121,7 +1123,7 @@ pim_upstream_find_new_rpf (void)
|
|||||||
*/
|
*/
|
||||||
for (ALL_LIST_ELEMENTS(qpim_upstream_list, up_node, up_nextnode, up))
|
for (ALL_LIST_ELEMENTS(qpim_upstream_list, up_node, up_nextnode, up))
|
||||||
{
|
{
|
||||||
if (PIM_INADDR_IS_ANY(up->rpf.rpf_addr))
|
if (pim_rpf_addr_is_inaddr_any(&up->rpf))
|
||||||
{
|
{
|
||||||
if (PIM_DEBUG_PIM_TRACE)
|
if (PIM_DEBUG_PIM_TRACE)
|
||||||
zlog_debug ("Upstream %s without a path to send join, checking",
|
zlog_debug ("Upstream %s without a path to send join, checking",
|
||||||
|
@ -371,7 +371,7 @@ static void scan_upstream_rpf_cache()
|
|||||||
|
|
||||||
/* send Join(S,G) to the current upstream neighbor */
|
/* send Join(S,G) to the current upstream neighbor */
|
||||||
pim_joinprune_send(up->rpf.source_nexthop.interface,
|
pim_joinprune_send(up->rpf.source_nexthop.interface,
|
||||||
up->rpf.rpf_addr,
|
up->rpf.rpf_addr.u.prefix4,
|
||||||
&up->sg,
|
&up->sg,
|
||||||
1 /* join */);
|
1 /* join */);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user