summaryrefslogtreecommitdiff
path: root/pimd/pim_pim.c
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2022-07-09 18:47:43 +0200
committerDavid Lamparter <equinox@opensourcerouting.org>2024-06-20 13:10:51 +0200
commitcca9bc193edfebbd93fbdd76bd4c3b8310f007d6 (patch)
tree835bbe2b84861f1eaae15baf268033ed5540ac2d /pimd/pim_pim.c
parent18b82f64c9538b6fd3b9f61c86dfff8cbdc8c6b6 (diff)
pimd: allow sending packets without pinned iface
The upcoming Candidate-RP code needs to send PIM packets that go through normal unicast routing, without forcing a specific output interface. Allow passing in NULL ifp to do that. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'pimd/pim_pim.c')
-rw-r--r--pimd/pim_pim.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c
index 1bc265b138..6a7e8924f2 100644
--- a/pimd/pim_pim.c
+++ b/pimd/pim_pim.c
@@ -636,17 +636,15 @@ static int pim_msg_send_frame(pim_addr src, pim_addr dst, ifindex_t ifindex,
int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg,
int pim_msg_size, struct interface *ifp)
{
- struct pim_interface *pim_ifp;
-
+ if (ifp) {
+ struct pim_interface *pim_ifp = ifp->info;
- pim_ifp = ifp->info;
-
- if (pim_ifp->pim_passive_enable) {
- if (PIM_DEBUG_PIM_PACKETS)
- zlog_debug(
- "skip sending PIM message on passive interface %s",
- ifp->name);
- return 0;
+ if (pim_ifp->pim_passive_enable) {
+ if (PIM_DEBUG_PIM_PACKETS)
+ zlog_debug("skip sending PIM message on passive interface %s",
+ ifp->name);
+ return 0;
+ }
}
#if PIM_IPV == 4
@@ -710,7 +708,7 @@ int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg,
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug("%s: to %pPA on %s: msg_size=%d checksum=%x",
- __func__, &dst, ifp->name, pim_msg_size,
+ __func__, &dst, ifp ? ifp->name : "*", pim_msg_size,
header->checksum);
if (PIM_DEBUG_PIM_PACKETDUMP_SEND) {
@@ -718,7 +716,7 @@ int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg,
}
pim_msg_send_frame(fd, (char *)buffer, sendlen, (struct sockaddr *)&to,
- tolen, ifp->name);
+ tolen, ifp ? ifp->name : "*");
return 0;
#else
@@ -727,7 +725,7 @@ int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg,
iovector[0].iov_base = pim_msg;
iovector[0].iov_len = pim_msg_size;
- pim_msg_send_frame(src, dst, ifp->ifindex, &iovector[0], fd);
+ pim_msg_send_frame(src, dst, ifp ? ifp->ifindex : 0, &iovector[0], fd);
return 0;
#endif