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;
 }

Reply via email to