}
static void recv_join(struct interface *ifp, struct pim_neighbor *neigh,
- uint16_t holdtime, struct in_addr upstream,
- struct prefix_sg *sg, uint8_t source_flags)
+ uint16_t holdtime, pim_addr upstream, pim_sgaddr *sg,
+ uint8_t source_flags)
{
struct pim_interface *pim_ifp = NULL;
- if (PIM_DEBUG_PIM_TRACE) {
- char up_str[INET_ADDRSTRLEN];
- char neigh_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<upstream?>", upstream, up_str, sizeof(up_str));
- pim_inet4_dump("<neigh?>", neigh->source_addr, neigh_str,
- sizeof(neigh_str));
+ if (PIM_DEBUG_PIM_TRACE)
zlog_debug(
- "%s: join (S,G)=%s rpt=%d wc=%d upstream=%s holdtime=%d from %s on %s",
- __func__, pim_str_sg_dump(sg),
- !!(source_flags & PIM_RPT_BIT_MASK),
- !!(source_flags & PIM_WILDCARD_BIT_MASK), up_str,
- holdtime, neigh_str, ifp->name);
- }
+ "%s: join (S,G)=%pSG rpt=%d wc=%d upstream=%pPAs holdtime=%d from %pPA on %s",
+ __func__, sg, !!(source_flags & PIM_RPT_BIT_MASK),
+ !!(source_flags & PIM_WILDCARD_BIT_MASK), &upstream,
+ holdtime, &neigh->source_addr, ifp->name);
pim_ifp = ifp->info;
assert(pim_ifp);
if ((source_flags & PIM_RPT_BIT_MASK)
&& (source_flags & PIM_WILDCARD_BIT_MASK)) {
struct pim_rpf *rp = RP(pim_ifp->pim, sg->grp);
+ pim_addr rpf_addr;
if (!rp) {
- zlog_warn("%s: Lookup of RP failed for %pPSG4",
- __func__, sg);
+ zlog_warn("%s: Lookup of RP failed for %pSG", __func__,
+ sg);
return;
}
/*
* 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.u.prefix4.s_addr) {
- char received_rp[INET_ADDRSTRLEN];
- char local_rp[INET_ADDRSTRLEN];
- pim_inet4_dump("<received?>", sg->src, received_rp,
- sizeof(received_rp));
- pim_inet4_dump("<local?>", rp->rpf_addr.u.prefix4,
- local_rp, sizeof(local_rp));
+ rpf_addr = pim_addr_from_prefix(&rp->rpf_addr);
+ if (pim_addr_cmp(sg->src, rpf_addr)) {
zlog_warn(
- "%s: Specified RP(%s) in join is different than our configured RP(%s)",
- __func__, received_rp, local_rp);
+ "%s: Specified RP(%pPAs) in join is different than our configured RP(%pPAs)",
+ __func__, &sg->src, &rpf_addr);
return;
}
if (pim_is_grp_ssm(pim_ifp->pim, sg->grp)) {
zlog_warn(
- "%s: Specified Group(%pI4) in join is now in SSM, not allowed to create PIM state",
+ "%s: Specified Group(%pPA) in join is now in SSM, not allowed to create PIM state",
__func__, &sg->grp);
return;
}
- sg->src.s_addr = INADDR_ANY;
+ sg->src = PIMADDR_ANY;
}
/* Restart join expiry timer */
}
static void recv_prune(struct interface *ifp, struct pim_neighbor *neigh,
- uint16_t holdtime, struct in_addr upstream,
- struct prefix_sg *sg, uint8_t source_flags)
+ uint16_t holdtime, pim_addr upstream, pim_sgaddr *sg,
+ uint8_t source_flags)
{
struct pim_interface *pim_ifp = NULL;
- if (PIM_DEBUG_PIM_TRACE) {
- char up_str[INET_ADDRSTRLEN];
- char neigh_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<upstream?>", upstream, up_str, sizeof(up_str));
- pim_inet4_dump("<neigh?>", neigh->source_addr, neigh_str,
- sizeof(neigh_str));
+ if (PIM_DEBUG_PIM_TRACE)
zlog_debug(
- "%s: prune (S,G)=%s rpt=%d wc=%d upstream=%s holdtime=%d from %s on %s",
- __func__, pim_str_sg_dump(sg),
- source_flags & PIM_RPT_BIT_MASK,
- source_flags & PIM_WILDCARD_BIT_MASK, up_str, holdtime,
- neigh_str, ifp->name);
- }
+ "%s: prune (S,G)=%pSG rpt=%d wc=%d upstream=%pPAs holdtime=%d from %pPA on %s",
+ __func__, sg, source_flags & PIM_RPT_BIT_MASK,
+ source_flags & PIM_WILDCARD_BIT_MASK, &upstream,
+ holdtime, &neigh->source_addr, ifp->name);
pim_ifp = ifp->info;
assert(pim_ifp);
* Received Prune(*,G) messages are processed even if the
* RP in the message does not match RP(G).
*/
- if (PIM_DEBUG_PIM_TRACE) {
- char received_rp[INET_ADDRSTRLEN];
-
- pim_inet4_dump("<received?>", sg->src, received_rp,
- sizeof(received_rp));
- zlog_debug("%s: Prune received with RP(%s) for %pPSG4",
- __func__, received_rp, sg);
- }
+ if (PIM_DEBUG_PIM_TRACE)
+ zlog_debug("%s: Prune received with RP(%pPAs) for %pSG",
+ __func__, &sg->src, sg);
- sg->src.s_addr = INADDR_ANY;
+ sg->src = PIMADDR_ANY;
}
pim_ifchannel_prune(ifp, upstream, sg, source_flags, holdtime);
}
int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
- struct in_addr src_addr, uint8_t *tlv_buf,
- int tlv_buf_size)
+ pim_addr src_addr, uint8_t *tlv_buf, int tlv_buf_size)
{
- struct prefix msg_upstream_addr;
+ pim_addr msg_upstream_addr;
+ bool wrong_af = false;
struct pim_interface *pim_ifp;
uint8_t msg_num_groups;
uint16_t msg_holdtime;
/*
Parse ucast addr
*/
- addr_offset =
- pim_parse_addr_ucast(&msg_upstream_addr, buf, pastend - buf);
+ addr_offset = pim_parse_addr_ucast(&msg_upstream_addr, buf,
+ pastend - buf, &wrong_af);
if (addr_offset < 1) {
- char src_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<src?>", src_addr, src_str, sizeof(src_str));
- zlog_warn("%s: pim_parse_addr_ucast() failure: from %s on %s",
- __func__, src_str, ifp->name);
+ zlog_warn("%s: pim_parse_addr_ucast() failure: from %pPA on %s",
+ __func__, &src_addr, ifp->name);
return -1;
}
buf += addr_offset;
/*
Check upstream address family
*/
- if (msg_upstream_addr.family != AF_INET) {
- char src_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<src?>", src_addr, src_str, sizeof(src_str));
+ if (wrong_af) {
zlog_warn(
- "%s: ignoring join/prune directed to unexpected addr family=%d from %s on %s",
- __func__, msg_upstream_addr.family, src_str, ifp->name);
+ "%s: ignoring join/prune directed to unexpected addr family from %pPA on %s",
+ __func__, &src_addr, ifp->name);
return -2;
}
remain = pastend - buf;
if (remain < 4) {
- char src_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<src?>", src_addr, src_str, sizeof(src_str));
zlog_warn(
- "%s: short join/prune message buffer for group list: size=%d minimum=%d from %s on %s",
- __func__, remain, 4, src_str, ifp->name);
+ "%s: short join/prune message buffer for group list: size=%d minimum=%d from %pPA on %s",
+ __func__, remain, 4, &src_addr, ifp->name);
return -4;
}
++buf;
++buf;
- if (PIM_DEBUG_PIM_J_P) {
- char src_str[INET_ADDRSTRLEN];
- char upstream_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<src?>", src_addr, src_str, sizeof(src_str));
- pim_inet4_dump("<addr?>", msg_upstream_addr.u.prefix4,
- upstream_str, sizeof(upstream_str));
+ if (PIM_DEBUG_PIM_J_P)
zlog_debug(
- "%s: join/prune upstream=%s groups=%d holdtime=%d from %s on %s",
- __func__, upstream_str, msg_num_groups, msg_holdtime,
- src_str, ifp->name);
- }
+ "%s: join/prune upstream=%pPAs groups=%d holdtime=%d from %pPA on %s",
+ __func__, &msg_upstream_addr, msg_num_groups,
+ msg_holdtime, &src_addr, ifp->name);
/* Scan groups */
for (group = 0; group < msg_num_groups; ++group) {
- struct prefix_sg sg;
+ pim_sgaddr sg;
uint8_t msg_source_flags;
uint16_t msg_num_joined_sources;
uint16_t msg_num_pruned_sources;
struct pim_ifchannel *starg_ch = NULL, *sg_ch = NULL;
bool filtered = false;
- memset(&sg, 0, sizeof(struct prefix_sg));
+ memset(&sg, 0, sizeof(sg));
addr_offset = pim_parse_addr_group(&sg, buf, pastend - buf);
if (addr_offset < 1) {
return -5;
remain = pastend - buf;
if (remain < 4) {
- char src_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<src?>", src_addr, src_str,
- sizeof(src_str));
zlog_warn(
- "%s: short join/prune buffer for source list: size=%d minimum=%d from %s on %s",
- __func__, remain, 4, src_str, ifp->name);
+ "%s: short join/prune buffer for source list: size=%d minimum=%d from %pPA on %s",
+ __func__, remain, 4, &src_addr, ifp->name);
return -6;
}
msg_num_pruned_sources = ntohs(*(const uint16_t *)buf);
buf += 2;
- if (PIM_DEBUG_PIM_J_P) {
- char src_str[INET_ADDRSTRLEN];
- char upstream_str[INET_ADDRSTRLEN];
- char group_str[INET_ADDRSTRLEN];
- pim_inet4_dump("<src?>", src_addr, src_str,
- sizeof(src_str));
- pim_inet4_dump("<addr?>", msg_upstream_addr.u.prefix4,
- upstream_str, sizeof(upstream_str));
- pim_inet4_dump("<grp?>", sg.grp, group_str,
- sizeof(group_str));
+ if (PIM_DEBUG_PIM_J_P)
zlog_debug(
- "%s: join/prune upstream=%s group=%s/32 join_src=%d prune_src=%d from %s on %s",
- __func__, upstream_str, group_str,
+ "%s: join/prune upstream=%pPAs group=%pPA/32 join_src=%d prune_src=%d from %pPA on %s",
+ __func__, &msg_upstream_addr, &sg.grp,
msg_num_joined_sources, msg_num_pruned_sources,
- src_str, ifp->name);
- }
+ &src_addr, ifp->name);
/* boundary check */
filtered = pim_is_group_filtered(pim_ifp, &sg.grp);
if (filtered)
continue;
- recv_join(ifp, neigh, msg_holdtime,
- msg_upstream_addr.u.prefix4, &sg,
- msg_source_flags);
+ recv_join(ifp, neigh, msg_holdtime, msg_upstream_addr,
+ &sg, msg_source_flags);
- if (sg.src.s_addr == INADDR_ANY) {
+ if (pim_addr_is_any(sg.src)) {
starg_ch = pim_ifchannel_find(ifp, &sg);
if (starg_ch)
pim_ifchannel_set_star_g_join_state(
if (filtered)
continue;
- recv_prune(ifp, neigh, msg_holdtime,
- msg_upstream_addr.u.prefix4, &sg,
- msg_source_flags);
+ recv_prune(ifp, neigh, msg_holdtime, msg_upstream_addr,
+ &sg, msg_source_flags);
/*
* So if we are receiving a S,G,RPT prune
* before we have any data for that S,G
return -1;
}
- if (PIM_INADDR_IS_ANY(rpf->rpf_addr.u.prefix4)) {
+ if (rpf->rpf_addr.u.prefix4.s_addr == INADDR_ANY) {
if (PIM_DEBUG_PIM_J_P) {
char dst_str[INET_ADDRSTRLEN];
pim_inet4_dump("<dst?>", rpf->rpf_addr.u.prefix4,
grp = &msg->groups[0];
curr_ptr = (uint8_t *)grp;
packet_size = sizeof(struct pim_msg_header);
- packet_size += sizeof(struct pim_encoded_ipv4_unicast);
+ packet_size += sizeof(pim_encoded_unicast);
packet_size +=
4; // reserved (1) + groups (1) + holdtime (2)
}
if (PIM_DEBUG_PIM_J_P) {
char dst_str[INET_ADDRSTRLEN];
- char grp_str[INET_ADDRSTRLEN];
pim_inet4_dump("<dst?>", rpf->rpf_addr.u.prefix4,
dst_str, sizeof(dst_str));
- pim_inet4_dump("<grp?>", group->group, grp_str,
- sizeof(grp_str));
zlog_debug(
- "%s: sending (G)=%s to upstream=%s on interface %s",
- __func__, grp_str, dst_str,
+ "%s: sending (G)=%pPAs to upstream=%s on interface %s",
+ __func__, &group->group, dst_str,
rpf->source_nexthop.interface->name);
}
grp = &msg->groups[0];
curr_ptr = (uint8_t *)grp;
packet_size = sizeof(struct pim_msg_header);
- packet_size += sizeof(struct pim_encoded_ipv4_unicast);
+ packet_size += sizeof(pim_encoded_unicast);
packet_size +=
4; // reserved (1) + groups (1) + holdtime (2)