mirror of
https://github.com/FRRouting/frr.git
synced 2025-05-01 05:57:15 +02:00
pimd: refactor pim_sock_read to be used with unicast bsr msgs
Signed-off-by: Jafar Al-Gharaibeh <jafar@atcorp.com>
This commit is contained in:
parent
865bae9657
commit
d97bea338d
|
@ -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)
|
static void bsm_unicast_sock_read(struct event *t)
|
||||||
{
|
{
|
||||||
struct bsm_scope *scope = EVENT_ARG(t);
|
struct bsm_scope *scope = EVENT_ARG(t);
|
||||||
struct sockaddr_storage from;
|
|
||||||
struct sockaddr_storage to;
|
pim_sock_read_helper(scope->unicast_sock, scope->pim, false);
|
||||||
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;
|
|
||||||
|
|
||||||
event_add_read(router->master, bsm_unicast_sock_read, scope,
|
event_add_read(router->master, bsm_unicast_sock_read, scope,
|
||||||
scope->unicast_sock, &scope->unicast_read);
|
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)
|
void pim_bsm_proc_init(struct pim_instance *pim)
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
|
|
||||||
#include "pimd.h"
|
#include "pimd.h"
|
||||||
#include "pim_instance.h"
|
|
||||||
#include "pim_pim.h"
|
#include "pim_pim.h"
|
||||||
#include "pim_time.h"
|
#include "pim_time.h"
|
||||||
#include "pim_iface.h"
|
#include "pim_iface.h"
|
||||||
|
@ -355,13 +354,9 @@ int pim_pim_packet(struct interface *ifp, uint8_t *buf, size_t len,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pim_sock_read_on(struct interface *ifp);
|
int pim_sock_read_helper(int fd, struct pim_instance *pim, bool is_mcast)
|
||||||
|
|
||||||
static void pim_sock_read(struct event *t)
|
|
||||||
{
|
{
|
||||||
struct interface *ifp, *orig_ifp;
|
struct interface *ifp = NULL;
|
||||||
struct pim_interface *pim_ifp;
|
|
||||||
int fd;
|
|
||||||
struct sockaddr_storage from;
|
struct sockaddr_storage from;
|
||||||
struct sockaddr_storage to;
|
struct sockaddr_storage to;
|
||||||
socklen_t fromlen = sizeof(from);
|
socklen_t fromlen = sizeof(from);
|
||||||
|
@ -369,16 +364,9 @@ static void pim_sock_read(struct event *t)
|
||||||
uint8_t buf[PIM_PIM_BUFSIZE_READ];
|
uint8_t buf[PIM_PIM_BUFSIZE_READ];
|
||||||
int len;
|
int len;
|
||||||
ifindex_t ifindex = -1;
|
ifindex_t ifindex = -1;
|
||||||
int result = -1; /* defaults to bad */
|
int i;
|
||||||
static long long count = 0;
|
|
||||||
int cont = 1;
|
|
||||||
|
|
||||||
orig_ifp = ifp = EVENT_ARG(t);
|
for (i = 0; i < router->packet_process; i++) {
|
||||||
fd = EVENT_FD(t);
|
|
||||||
|
|
||||||
pim_ifp = ifp->info;
|
|
||||||
|
|
||||||
while (cont) {
|
|
||||||
pim_sgaddr sg;
|
pim_sgaddr sg;
|
||||||
|
|
||||||
len = pim_socket_recvfromto(fd, buf, sizeof(buf), &from,
|
len = pim_socket_recvfromto(fd, buf, sizeof(buf), &from,
|
||||||
|
@ -392,7 +380,7 @@ static void pim_sock_read(struct event *t)
|
||||||
if (PIM_DEBUG_PIM_PACKETS)
|
if (PIM_DEBUG_PIM_PACKETS)
|
||||||
zlog_debug("Received errno: %d %s", errno,
|
zlog_debug("Received errno: %d %s", errno,
|
||||||
safe_strerror(errno));
|
safe_strerror(errno));
|
||||||
goto done;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -401,14 +389,21 @@ static void pim_sock_read(struct event *t)
|
||||||
* the right ifindex, so just use it. We know
|
* the right ifindex, so just use it. We know
|
||||||
* it's the right interface because we bind to it
|
* it's the right interface because we bind to it
|
||||||
*/
|
*/
|
||||||
ifp = if_lookup_by_index(ifindex, pim_ifp->pim->vrf->vrf_id);
|
if (pim != NULL)
|
||||||
if (!ifp || !ifp->info) {
|
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)
|
if (PIM_DEBUG_PIM_PACKETS)
|
||||||
zlog_debug(
|
zlog_debug("%s: Received incoming pim packet on interface(%s:%d)%s",
|
||||||
"%s: Received incoming pim packet on interface(%s:%d) not yet configured for pim",
|
__func__,
|
||||||
__func__, ifp ? ifp->name : "Unknown",
|
ifp ? ifp->name : "Unknown", ifindex,
|
||||||
ifindex);
|
is_mcast ? " not yet configured for pim"
|
||||||
goto done;
|
: "");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
#if PIM_IPV == 4
|
#if PIM_IPV == 4
|
||||||
sg.src = ((struct sockaddr_in *)&from)->sin_addr;
|
sg.src = ((struct sockaddr_in *)&from)->sin_addr;
|
||||||
|
@ -418,27 +413,34 @@ static void pim_sock_read(struct event *t)
|
||||||
sg.grp = ((struct sockaddr_in6 *)&to)->sin6_addr;
|
sg.grp = ((struct sockaddr_in6 *)&to)->sin6_addr;
|
||||||
#endif
|
#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 (fail) {
|
||||||
if (PIM_DEBUG_PIM_PACKETS)
|
if (PIM_DEBUG_PIM_PACKETS)
|
||||||
zlog_debug("%s: pim_pim_packet() return=%d",
|
zlog_debug("%s: pim_pim_packet() return=%d",
|
||||||
__func__, fail);
|
__func__, fail);
|
||||||
goto done;
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
count++;
|
static void pim_sock_read_on(struct interface *ifp);
|
||||||
if (count % router->packet_process == 0)
|
|
||||||
cont = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = 0; /* good */
|
static void pim_sock_read(struct event *t)
|
||||||
|
{
|
||||||
|
struct interface *ifp;
|
||||||
|
struct pim_interface *pim_ifp;
|
||||||
|
int fd;
|
||||||
|
|
||||||
done:
|
ifp = EVENT_ARG(t);
|
||||||
pim_sock_read_on(orig_ifp);
|
fd = EVENT_FD(t);
|
||||||
|
|
||||||
if (result) {
|
pim_ifp = ifp->info;
|
||||||
|
|
||||||
|
if (pim_sock_read_helper(fd, pim_ifp->pim, true) == 0)
|
||||||
++pim_ifp->pim_ifstat_hello_recvfail;
|
++pim_ifp->pim_ifstat_hello_recvfail;
|
||||||
}
|
|
||||||
|
pim_sock_read_on(ifp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pim_sock_read_on(struct interface *ifp)
|
static void pim_sock_read_on(struct interface *ifp)
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <zebra.h>
|
#include <zebra.h>
|
||||||
|
|
||||||
#include "if.h"
|
#include "if.h"
|
||||||
|
#include "pim_instance.h"
|
||||||
|
|
||||||
#define PIM_PIM_BUFSIZE_READ (20000)
|
#define PIM_PIM_BUFSIZE_READ (20000)
|
||||||
#define PIM_PIM_BUFSIZE_WRITE (20000)
|
#define PIM_PIM_BUFSIZE_WRITE (20000)
|
||||||
|
@ -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_msg_size, struct interface *ifp);
|
||||||
|
|
||||||
int pim_hello_send(struct interface *ifp, uint16_t holdtime);
|
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 */
|
#endif /* PIM_PIM_H */
|
||||||
|
|
Loading…
Reference in a new issue