pim6d: encode PIM joins correctly

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2022-03-12 22:33:23 +01:00
parent 334326ed39
commit 042a754146

View File

@ -43,14 +43,10 @@
#include "pim_util.h" #include "pim_util.h"
#include "pim_ssm.h" #include "pim_ssm.h"
static void on_trace(const char *label, struct interface *ifp, static void on_trace(const char *label, struct interface *ifp, pim_addr src)
struct in_addr src)
{ {
if (PIM_DEBUG_PIM_TRACE) { if (PIM_DEBUG_PIM_TRACE)
char src_str[INET_ADDRSTRLEN]; zlog_debug("%s: from %pPA on %s", label, &src, ifp->name);
pim_inet4_dump("<src?>", src, src_str, sizeof(src_str));
zlog_debug("%s: from %s on %s", label, src_str, ifp->name);
}
} }
static void recv_join(struct interface *ifp, struct pim_neighbor *neigh, static void recv_join(struct interface *ifp, struct pim_neighbor *neigh,
@ -422,6 +418,7 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups)
size_t packet_left = 0; size_t packet_left = 0;
size_t packet_size = 0; size_t packet_size = 0;
size_t group_size = 0; size_t group_size = 0;
pim_addr rpf_addr;
if (rpf->source_nexthop.interface) if (rpf->source_nexthop.interface)
pim_ifp = rpf->source_nexthop.interface->info; pim_ifp = rpf->source_nexthop.interface->info;
@ -430,8 +427,9 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups)
return -1; return -1;
} }
on_trace(__func__, rpf->source_nexthop.interface, rpf_addr = pim_addr_from_prefix(&rpf->rpf_addr);
rpf->rpf_addr.u.prefix4);
on_trace(__func__, rpf->source_nexthop.interface, rpf_addr);
if (!pim_ifp) { if (!pim_ifp) {
zlog_warn("%s: multicast not enabled on interface %s", __func__, zlog_warn("%s: multicast not enabled on interface %s", __func__,
@ -439,15 +437,12 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups)
return -1; return -1;
} }
if (rpf->rpf_addr.u.prefix4.s_addr == INADDR_ANY) { if (pim_addr_is_any(rpf_addr)) {
if (PIM_DEBUG_PIM_J_P) { if (PIM_DEBUG_PIM_J_P)
char dst_str[INET_ADDRSTRLEN]; zlog_debug(
pim_inet4_dump("<dst?>", rpf->rpf_addr.u.prefix4, "%s: upstream=%pPA is myself on interface %s",
dst_str, sizeof(dst_str)); __func__, &rpf_addr,
zlog_debug("%s: upstream=%s is myself on interface %s", rpf->source_nexthop.interface->name);
__func__, dst_str,
rpf->source_nexthop.interface->name);
}
return 0; return 0;
} }
@ -468,8 +463,8 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups)
memset(msg, 0, sizeof(*msg)); memset(msg, 0, sizeof(*msg));
pim_msg_addr_encode_ipv4_ucast((uint8_t *)&msg->addr, pim_msg_addr_encode_ucast((uint8_t *)&msg->addr,
rpf->rpf_addr.u.prefix4); rpf_addr);
msg->reserved = 0; msg->reserved = 0;
msg->holdtime = htons(PIM_JP_HOLDTIME); msg->holdtime = htons(PIM_JP_HOLDTIME);
@ -485,15 +480,11 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups)
packet_left = rpf->source_nexthop.interface->mtu - 24; packet_left = rpf->source_nexthop.interface->mtu - 24;
packet_left -= packet_size; packet_left -= packet_size;
} }
if (PIM_DEBUG_PIM_J_P) { if (PIM_DEBUG_PIM_J_P)
char dst_str[INET_ADDRSTRLEN];
pim_inet4_dump("<dst?>", rpf->rpf_addr.u.prefix4,
dst_str, sizeof(dst_str));
zlog_debug( zlog_debug(
"%s: sending (G)=%pPAs to upstream=%s on interface %s", "%s: sending (G)=%pPAs to upstream=%pPA on interface %s",
__func__, &group->group, dst_str, __func__, &group->group, &rpf_addr,
rpf->source_nexthop.interface->name); rpf->source_nexthop.interface->name);
}
group_size = pim_msg_get_jp_group_size(group->sources); group_size = pim_msg_get_jp_group_size(group->sources);
if (group_size > packet_left) { if (group_size > packet_left) {
@ -513,8 +504,8 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups)
msg = (struct pim_jp *)pim_msg; msg = (struct pim_jp *)pim_msg;
memset(msg, 0, sizeof(*msg)); memset(msg, 0, sizeof(*msg));
pim_msg_addr_encode_ipv4_ucast((uint8_t *)&msg->addr, pim_msg_addr_encode_ucast((uint8_t *)&msg->addr,
rpf->rpf_addr.u.prefix4); rpf_addr);
msg->reserved = 0; msg->reserved = 0;
msg->holdtime = htons(PIM_JP_HOLDTIME); msg->holdtime = htons(PIM_JP_HOLDTIME);