After running the igmpproxy in multiple domains I noticed that the kernel
started complaining about sending packets on wrong domains. Here is the
exact message:
"
vio1: trying to send packet on wrong domain. if 1 vs. mbuf 0
"
After some debugging I traced the problem to the igmp_sendpkt() function
and it seems that it is missing to set the mbuf rdomain, so this is
exactly what this diff does.
ok?
Index: sys/netinet/igmp.c
===================================================================
RCS file: /home/obsdcvs/src/sys/netinet/igmp.c,v
retrieving revision 1.56
diff -u -p -r1.56 igmp.c
--- sys/netinet/igmp.c 5 Dec 2016 15:31:43 -0000 1.56
+++ sys/netinet/igmp.c 14 Dec 2016 15:40:08 -0000
@@ -613,14 +613,21 @@ igmp_slowtimo(void)
void
igmp_sendpkt(struct in_multi *inm, int type, in_addr_t addr)
{
+ struct ifnet *ifp;
struct mbuf *m;
struct igmp *igmp;
struct ip *ip;
struct ip_moptions imo;
+ if ((ifp = if_get(inm->inm_ifidx)) == NULL)
+ return;
+
MGETHDR(m, M_DONTWAIT, MT_HEADER);
- if (m == NULL)
+ if (m == NULL) {
+ if_put(ifp);
return;
+ }
+
/*
* Assume max_linkhdr + sizeof(struct ip) + IGMP_MINLEN
* is smaller than mbuf size returned by MGETHDR.
@@ -652,6 +659,7 @@ igmp_sendpkt(struct in_multi *inm, int t
m->m_data -= sizeof(struct ip);
m->m_len += sizeof(struct ip);
+ m->m_pkthdr.ph_rtableid = ifp->if_rdomain;
imo.imo_ifidx = inm->inm_ifidx;
imo.imo_ttl = 1;
@@ -666,6 +674,7 @@ igmp_sendpkt(struct in_multi *inm, int t
#endif /* MROUTING */
ip_output(m, router_alert, NULL, IP_MULTICASTOPTS, &imo, NULL, 0);
+ if_put(ifp);
++igmpstat.igps_snd_reports;
}