#include "pim_assert.h"
#include "pim_msg.h"
#include "pim_register.h"
+#include "pim_errors.h"
static int on_pim_hello_send(struct thread *t);
static int pim_hello_send(struct interface *ifp, uint16_t holdtime);
delete_message);
if (!ifp->info) {
- zlog_err("%s: %s: but PIM not enabled on interface %s (!)",
+ flog_err(EC_PIM_CONFIG,
+ "%s: %s: but PIM not enabled on interface %s (!)",
__PRETTY_FUNCTION__, delete_message, ifp->name);
return;
}
pim_msg_len - PIM_MSG_HEADER_LEN);
break;
case PIM_MSG_TYPE_REG_STOP:
- return pim_register_stop_recv(pim_msg + PIM_MSG_HEADER_LEN,
+ return pim_register_stop_recv(ifp, pim_msg + PIM_MSG_HEADER_LEN,
pim_msg_len - PIM_MSG_HEADER_LEN);
break;
case PIM_MSG_TYPE_JOIN_PRUNE:
static int pim_sock_read(struct thread *t)
{
- struct interface *ifp;
+ struct interface *ifp, *orig_ifp;
struct pim_interface *pim_ifp;
int fd;
struct sockaddr_in from;
static long long count = 0;
int cont = 1;
- ifp = THREAD_ARG(t);
+ orig_ifp = ifp = THREAD_ARG(t);
fd = THREAD_FD(t);
pim_ifp = ifp->info;
goto done;
}
-#ifdef PIM_CHECK_RECV_IFINDEX_SANITY
- /* ifindex sanity check */
- if (ifindex != (int)ifp->ifindex) {
- char from_str[INET_ADDRSTRLEN];
- char to_str[INET_ADDRSTRLEN];
- struct interface *recv_ifp;
-
- if (!inet_ntop(AF_INET, &from.sin_addr, from_str,
- sizeof(from_str)))
- sprintf(from_str, "<from?>");
- if (!inet_ntop(AF_INET, &to.sin_addr, to_str,
- sizeof(to_str)))
- sprintf(to_str, "<to?>");
-
- recv_ifp = if_lookup_by_index(ifindex, VRF_DEFAULT);
- if (recv_ifp) {
- zassert(ifindex == (int)recv_ifp->ifindex);
- }
-
-#ifdef PIM_REPORT_RECV_IFINDEX_MISMATCH
- zlog_warn(
- "Interface mismatch: recv PIM pkt from %s to %s on fd=%d: recv_ifindex=%d (%s) sock_ifindex=%d (%s)",
- from_str, to_str, fd, ifindex,
- recv_ifp ? recv_ifp->name : "<if-notfound>",
- ifp->ifindex, ifp->name);
-#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, pim_ifp->pim->vrf_id);
+ if (!ifp || !ifp->info) {
+ if (PIM_DEBUG_PIM_PACKETS)
+ zlog_debug(
+ "%s: Received incoming pim packet on interface(%s:%d) not yet configured for pim",
+ __PRETTY_FUNCTION__,
+ ifp ? ifp->name : "Unknown", ifindex);
goto done;
}
-#endif
-
int fail = pim_pim_packet(ifp, buf, len);
if (fail) {
if (PIM_DEBUG_PIM_PACKETS)
result = 0; /* good */
done:
- pim_sock_read_on(ifp);
+ pim_sock_read_on(orig_ifp);
if (result) {
++pim_ifp->pim_ifstat_hello_recvfail;
socklen_t tolen;
unsigned char buffer[10000];
unsigned char *msg_start;
- uint8_t ttl = MAXTTL;
+ uint8_t ttl;
struct pim_msg_header *header;
struct ip *ip;
ip->ip_len = htons(sendlen);
if (PIM_DEBUG_PIM_PACKETS) {
- struct pim_msg_header *header =
- (struct pim_msg_header *)pim_msg;
char dst_str[INET_ADDRSTRLEN];
pim_inet4_dump("<dst?>", dst, dst_str, sizeof(dst_str));
zlog_debug("%s: to %s on %s: msg_size=%d checksum=%x",
static int pim_hello_send(struct interface *ifp, uint16_t holdtime)
{
- struct pim_interface *pim_ifp;
-
- zassert(ifp);
- pim_ifp = ifp->info;
- zassert(pim_ifp);
+ struct pim_interface *pim_ifp = ifp->info;
- if (if_is_loopback(ifp))
+ if (if_is_loopback_or_vrf(ifp))
return 0;
if (hello_send(ifp, holdtime)) {
{
struct pim_interface *pim_ifp;
- zassert(ifp);
pim_ifp = ifp->info;
- zassert(pim_ifp);
if (PIM_DEBUG_PIM_HELLO) {
zlog_debug("Rescheduling %d sec hello on interface %s",
struct interface *ifp;
ifp = THREAD_ARG(t);
-
pim_ifp = ifp->info;
/*
{
struct pim_interface *pim_ifp;
- zassert(ifp);
pim_ifp = ifp->info;
- zassert(pim_ifp);
/*
* Reset next hello timer
int triggered_hello_delay_msec;
int random_msec;
- zassert(ifp);
pim_ifp = ifp->info;
- zassert(pim_ifp);
+
+ /*
+ * No need to ever start loopback or vrf device hello's
+ */
+ if (if_is_loopback_or_vrf(ifp))
+ return;
/*
* There exists situations where we have the a RPF out this