Skip to content

Commit

Permalink
pimd: refactor pim_sock_read to be used with unicast bsr msgs
Browse files Browse the repository at this point in the history
Signed-off-by: Jafar Al-Gharaibeh <[email protected]>
  • Loading branch information
Jafaral committed Aug 29, 2024
1 parent f790831 commit 2906368
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 92 deletions.
59 changes: 2 additions & 57 deletions pimd/pim_bsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,66 +258,11 @@ static inline void pim_bs_timer_restart(struct bsm_scope *scope, int bs_timeout)
static void bsm_unicast_sock_read(struct event *t)
{
struct bsm_scope *scope = EVENT_ARG(t);
struct sockaddr_storage from;
struct sockaddr_storage to;
socklen_t fromlen = sizeof(from);
socklen_t tolen = sizeof(to);
ifindex_t ifindex = 0;
struct interface *ifp;
uint8_t buf[PIM_PIM_BUFSIZE_READ];
int len, i;

pim_sock_read_helper(scope->unicast_sock, scope->pim, false);

event_add_read(router->master, bsm_unicast_sock_read, scope,
scope->unicast_sock, &scope->unicast_read);

for (i = 0; i < router->packet_process; i++) {
pim_sgaddr sg;

len = pim_socket_recvfromto(scope->unicast_sock, buf,
sizeof(buf), &from, &fromlen, &to,
&tolen, &ifindex);
if (len < 0) {
if (errno == EINTR)
continue;
if (errno == EWOULDBLOCK || errno == EAGAIN)
break;

if (PIM_DEBUG_PIM_PACKETS)
zlog_debug("Received errno: %d %s", errno,
safe_strerror(errno));
break;
}

#if PIM_IPV == 4
sg.src = ((struct sockaddr_in *)&from)->sin_addr;
sg.grp = ((struct sockaddr_in *)&to)->sin_addr;
#else
sg.src = ((struct sockaddr_in6 *)&from)->sin6_addr;
sg.grp = ((struct sockaddr_in6 *)&to)->sin6_addr;
#endif

/*
* What? So with vrf's the incoming packet is received
* on the vrf interface but recvfromto above returns
* the right ifindex, so just use it. We know
* it's the right interface because we bind to it
*/
ifp = if_lookup_by_index(ifindex, scope->pim->vrf->vrf_id);
if (!ifp) {
zlog_warn("Received incoming PIM packet on unknown ifindex %d",
ifindex);
break;
}

int fail = pim_pim_packet(ifp, buf, len, sg, false);

if (fail) {
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug("%s: pim_pim_packet() return=%d",
__func__, fail);
break;
}
}
}

void pim_bsm_proc_init(struct pim_instance *pim)
Expand Down
72 changes: 37 additions & 35 deletions pimd/pim_pim.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
#include "network.h"

#include "pimd.h"
#include "pim_instance.h"
#include "pim_pim.h"
#include "pim_time.h"
#include "pim_iface.h"
Expand Down Expand Up @@ -355,30 +354,19 @@ int pim_pim_packet(struct interface *ifp, uint8_t *buf, size_t len,
}
}

static void pim_sock_read_on(struct interface *ifp);

static void pim_sock_read(struct event *t)
int pim_sock_read_helper(int fd, struct pim_instance *pim, bool is_mcast)
{
struct interface *ifp, *orig_ifp;
struct pim_interface *pim_ifp;
int fd;
struct interface *ifp = NULL;
struct sockaddr_storage from;
struct sockaddr_storage to;
socklen_t fromlen = sizeof(from);
socklen_t tolen = sizeof(to);
uint8_t buf[PIM_PIM_BUFSIZE_READ];
int len;
ifindex_t ifindex = -1;
int result = -1; /* defaults to bad */
static long long count = 0;
int cont = 1;

orig_ifp = ifp = EVENT_ARG(t);
fd = EVENT_FD(t);

pim_ifp = ifp->info;
int i;

while (cont) {
for (i = 0; i < router->packet_process; i++) {
pim_sgaddr sg;

len = pim_socket_recvfromto(fd, buf, sizeof(buf), &from,
Expand All @@ -392,7 +380,7 @@ static void pim_sock_read(struct event *t)
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug("Received errno: %d %s", errno,
safe_strerror(errno));
goto done;
return -1;
}

/*
Expand All @@ -401,14 +389,21 @@ static void pim_sock_read(struct event *t)
* the right ifindex, so just use it. We know
* it's the right interface because we bind to it
*/
ifp = if_lookup_by_index(ifindex, pim_ifp->pim->vrf->vrf_id);
if (!ifp || !ifp->info) {
if (pim != NULL)
ifp = if_lookup_by_index(ifindex, pim->vrf->vrf_id);

/*
* unicast BSM pkts (C-RP) may arrive on non pim interfaces
* mcast pkts are only expected in pim interfaces
*/
if (!ifp || (is_mcast && !ifp->info)) {
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug(
"%s: Received incoming pim packet on interface(%s:%d) not yet configured for pim",
__func__, ifp ? ifp->name : "Unknown",
ifindex);
goto done;
zlog_debug("%s: Received incoming pim packet on interface(%s:%d)%s",
__func__,
ifp ? ifp->name : "Unknown", ifindex,
is_mcast ? " not yet configured for pim"
: "");
return -1;
}
#if PIM_IPV == 4
sg.src = ((struct sockaddr_in *)&from)->sin_addr;
Expand All @@ -418,27 +413,34 @@ static void pim_sock_read(struct event *t)
sg.grp = ((struct sockaddr_in6 *)&to)->sin6_addr;
#endif

int fail = pim_pim_packet(ifp, buf, len, sg, true);
int fail = pim_pim_packet(ifp, buf, len, sg, is_mcast);
if (fail) {
if (PIM_DEBUG_PIM_PACKETS)
zlog_debug("%s: pim_pim_packet() return=%d",
__func__, fail);
goto done;
return -1;
}

count++;
if (count % router->packet_process == 0)
cont = 0;
}
return 0;
}

static void pim_sock_read_on(struct interface *ifp);

static void pim_sock_read(struct event *t)
{
struct interface *ifp;
struct pim_interface *pim_ifp;
int fd;

result = 0; /* good */
ifp = EVENT_ARG(t);
fd = EVENT_FD(t);

done:
pim_sock_read_on(orig_ifp);
pim_ifp = ifp->info;

if (result) {
if (pim_sock_read_helper(fd, pim_ifp->pim, true) == 0)
++pim_ifp->pim_ifstat_hello_recvfail;
}

pim_sock_read_on(ifp);
}

static void pim_sock_read_on(struct interface *ifp)
Expand Down
3 changes: 3 additions & 0 deletions pimd/pim_pim.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <zebra.h>

#include "if.h"
#include "pim_instance.h"

#define PIM_PIM_BUFSIZE_READ (20000)
#define PIM_PIM_BUFSIZE_WRITE (20000)
Expand Down Expand Up @@ -48,4 +49,6 @@ int pim_msg_send(int fd, pim_addr src, pim_addr dst, uint8_t *pim_msg,
int pim_msg_size, struct interface *ifp);

int pim_hello_send(struct interface *ifp, uint16_t holdtime);

int pim_sock_read_helper(int fd, struct pim_instance *pim, bool is_mcast);
#endif /* PIM_PIM_H */

0 comments on commit 2906368

Please sign in to comment.