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("<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("<nexthop?>", &rpf->source_nexthop.mrib_nexthop_addr, rpf_nexthop_str, sizeof(rpf_nexthop_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?>";
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("<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("<rpf?>", &rpf->rpf_addr, rpf_addr_str, sizeof(rpf_addr_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?>";
vty_out(vty, "Address NextHop Interface Metric Preference%s",
VTY_NEWLINE);
- pim_inet4_dump("<nexthop?>", nexthop.mrib_nexthop_addr,
- nexthop_addr_str, sizeof(nexthop_addr_str));
+ pim_addr_dump("<nexthop?>", &nexthop.mrib_nexthop_addr,
+ nexthop_addr_str, sizeof(nexthop_addr_str));
vty_out(vty, "%-15s %-15s %-9s %6d %10d%s",
addr_str,
/* 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 */
zlog_warn("%s %s: RPF'%s not found",
__FILE__, __PRETTY_FUNCTION__,
}
/* 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 rpf_str[100];
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",
__FILE__, __PRETTY_FUNCTION__,
pim_str_sg_dump (sg),
if (is_join) {
/* 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;
}
if (source_flags & PIM_WILDCARD_BIT_MASK) {
/* Prune(*,G) to RPF'(S,G) */
pim_upstream_join_timer_decrease_to_t_override("Prune(*,G)",
- up, up->rpf.rpf_addr);
+ up, up->rpf.rpf_addr.u.prefix4);
return;
}
/* Prune(S,G,rpt) to RPF'(S,G) */
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;
}
/* Prune(S,G) to RPF'(S,G) */
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,
* If the RP sent in the message is not
* 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;
sg.src.s_addr = INADDR_ANY;
struct pim_rpf *rp = RP (sg.grp);
// 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;
sg.src.s_addr = INADDR_ANY;
* the Interface type is SSM we don't need to
* do anything here
*/
- if ((rpg->rpf_addr.s_addr == INADDR_NONE) ||
+ if ((pim_rpf_addr_is_inaddr_none (rpg)) ||
(!pim_ifp) ||
(!(PIM_I_am_DR(pim_ifp))) ||
(pim_ifp->itype == PIM_INTERFACE_SSM))
rpg = RP(sg.grp);
- if ((rpg->rpf_addr.s_addr == INADDR_NONE) ||
+ if ((pim_rpf_addr_is_inaddr_none (rpg)) ||
(!pim_ifp) ||
(!(PIM_I_am_DR(pim_ifp))) ||
(pim_ifp->itype == PIM_INTERFACE_SSM)) {
{
struct pim_rpf *rpf = pim_rp_g (group);
bits = PIM_ENCODE_SPARSE_BIT | PIM_ENCODE_WC_BIT | PIM_ENCODE_RPT_BIT;
- stosend = rpf->rpf_addr;
+ stosend = rpf->rpf_addr.u.prefix4;
}
else
{
if (PIM_DEBUG_PIM_REG)
{
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);
}
if (pim_msg_send(pinfo->pim_sock_fd,
src,
- rpg->rpf_addr,
+ rpg->rpf_addr.u.prefix4,
buffer,
buf_size + PIM_MSG_REGISTER_LEN,
ifp->name)) {
sg.src = ip_hdr->ip_src;
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;
if (*bits & PIM_REGISTER_BORDER_BIT) {
return;
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;
listnode_add (qpim_rp_list, 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))
return 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))
return rp_info;
}
if (!pim_ifp)
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;
}
}
if (!result)
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)
return -1;
* Take over the 224.0.0.0/4 group if the rp is INADDR_NONE
*/
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;
XFREE (MTYPE_PIM_RP, rp_info);
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);
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 (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;
return 0;
}
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");
ret++;
char sold[100];
char snew[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("<new?>", new, snew, sizeof(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;
- 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;
}
- 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;
}
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);
}
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)
zlog_debug("%s: Received a (*,G) with no RP configured", __PRETTY_FUNCTION__);
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;
}
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;
- if (rp_info->rp.rpf_addr.s_addr != INADDR_NONE)
+ if (!pim_rpf_addr_is_inaddr_none (&rp_info->rp))
{
char buf[32];
vty_out(vty, "ip pim rp %s %s%s", inet_ntop(AF_INET, &rp_info->rp.rpf_addr, buffer, 32),
*/
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;
}
vty_out (vty, "RP Addr Group Oif I_am_RP%s", VTY_NEWLINE);
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];
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),
rp_info->rp.source_nexthop.interface->name,
rp_info->i_am_rp, VTY_NEWLINE);
}
/* update nextop data */
- nexthop->interface = ifp;
- nexthop->mrib_nexthop_addr = nexthop_tab[0].nexthop_addr.u.prefix4;
- nexthop->mrib_metric_preference = nexthop_tab[0].protocol_distance;
- nexthop->mrib_route_metric = nexthop_tab[0].route_metric;
+ nexthop->interface = ifp;
+ nexthop->mrib_nexthop_addr = nexthop_tab[0].nexthop_addr;
+ nexthop->mrib_metric_preference = nexthop_tab[0].protocol_distance;
+ nexthop->mrib_route_metric = nexthop_tab[0].route_metric;
return 0;
}
static int nexthop_mismatch(const struct pim_nexthop *nh1,
const struct pim_nexthop *nh2)
{
- return (nh1->interface != nh2->interface)
- ||
- (nh1->mrib_nexthop_addr.s_addr != nh2->mrib_nexthop_addr.s_addr)
- ||
- (nh1->mrib_metric_preference != nh2->mrib_metric_preference)
- ||
+ return (nh1->interface != nh2->interface) ||
+ (nh1->mrib_nexthop_addr.u.prefix4.s_addr != nh2->mrib_nexthop_addr.u.prefix4.s_addr) ||
+ (nh1->mrib_metric_preference != nh2->mrib_metric_preference) ||
(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)
{
- struct in_addr save_rpf_addr;
+ struct prefix save_rpf_addr;
struct pim_nexthop save_nexthop;
struct pim_rpf *rpf = &up->rpf;
return PIM_RPF_FAILURE;
}
- rpf->rpf_addr = pim_rpf_find_rpf_addr(up);
- if (PIM_INADDR_IS_ANY(rpf->rpf_addr) && PIM_DEBUG_ZEBRA) {
+ rpf->rpf_addr.family = AF_INET;
+ 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 */
zlog_debug("%s %s: RPF'%s not found: won't send join upstream",
__FILE__, __PRETTY_FUNCTION__,
if (PIM_DEBUG_ZEBRA) {
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",
__FILE__, __PRETTY_FUNCTION__,
pim_str_sg_dump (&up->sg),
}
/* 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 ? */
if (old_rpf_addr)
- *old_rpf_addr = save_rpf_addr;
+ *old_rpf_addr = save_rpf_addr.u.prefix4;
return PIM_RPF_CHANGED;
}
/* return NBR( RPF_interface(S), MRIB.next_hop( S ) ) */
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)
rpf_addr = neigh->source_addr;
else
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;
+}
*/
struct pim_nexthop {
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_route_metric; /* MRIB.metric(S) */
};
struct pim_rpf {
struct pim_nexthop source_nexthop;
- struct in_addr rpf_addr; /* RPF'(S,G) */
+ struct prefix rpf_addr; /* RPF'(S,G) */
};
enum pim_rpf_result {
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);
+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 */
{
if (PIM_DEBUG_PIM_TRACE) {
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__,
pim_str_sg_dump (&up->sg), rpf_str, pim_upstream_state2str (up->join_state),
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",
__PRETTY_FUNCTION__,
pim_str_sg_dump (&up->sg), rpf_str);
/* send Join(S,G) to the current upstream neighbor */
pim_joinprune_send(up->rpf.source_nexthop.interface,
- up->rpf.rpf_addr,
+ up->rpf.rpf_addr.u.prefix4,
&up->sg,
1 /* join */);
}
else {
forward_off(up);
pim_joinprune_send(up->rpf.source_nexthop.interface,
- up->rpf.rpf_addr,
+ up->rpf.rpf_addr.u.prefix4,
&up->sg,
0 /* prune */);
if (up->t_join_timer)
up->sptbit = PIM_UPSTREAM_SPTBIT_FALSE;
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_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);
if (rpf_result == PIM_RPF_FAILURE) {
char neigh_str[100];
char rpf_addr_str[100];
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",
__PRETTY_FUNCTION__,
neigh_str, pim_str_sg_dump (&up->sg),
continue;
/* 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;
pim_upstream_join_timer_decrease_to_t_override("RPF'(S,G) GenID change",
THREAD_OFF (up->t_ka_timer);
THREAD_OFF (up->t_rs_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);
pim_upstream_del (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)
zlog_debug ("Upstream %s without a path to send join, checking",
/* send Join(S,G) to the current upstream neighbor */
pim_joinprune_send(up->rpf.source_nexthop.interface,
- up->rpf.rpf_addr,
+ up->rpf.rpf_addr.u.prefix4,
&up->sg,
1 /* join */);