I can confirm Rafael's diff fixes the issues I was having with multicast. Thank you very much, Rafael!
Paul On Mon, Mar 13, 2017 at 06:03:56PM +0100, Rafael Zalamena wrote: | On Fri, Mar 10, 2017 at 04:14:44PM +0100, Paul de Weerd wrote: | > Hi Rafael, others, | > | > It looks like your commit to ip_mroute.[ch] from January 11th broke | > multicast forwarding. I found another thread that may suffer from the | > same problem: http://marc.info/?l=openbsd-bugs&m=148605155027668&w=2 - | > I'm CC:'ing the OP from that thread here (hope you don't mind :). | > | > On Wed, Jan 11, 2017 at 06:17:35AM -0700, Rafael Zalamena wrote: | > | CVSROOT: /cvs | > | Module name: src | > | Changes by: [email protected] 2017/01/11 06:17:35 | > | | > | Modified files: | > | sys/netinet : ip_mroute.c ip_mroute.h | > | | > | Log message: | > | Remove mfc hash tables and use the OpenBSD routing table for multicast | > | routes. Beside the code simplification and removal, we also get to see | > | the multicast routes now in the route(8) utility. | > | | > | ok mpi@ | | After exchanging a few e-mails with Paul we identified and fixed the | problem reported. | | The problem was that the mfc_find() function was matching default route | as a multicast route, so it was never notifying the multicast routing | daemon that we had a new IGMP message. Without sending the IGMP messages | to the userland, igmpproxy never had a chance to install the needed | routes for the rest to work. | | The diff below makes mfc_find() route search more strict. | | ok? | | Index: sys/netinet/ip_mroute.c | =================================================================== | RCS file: /home/obsdcvs/src/sys/netinet/ip_mroute.c,v | retrieving revision 1.110 | diff -u -p -r1.110 ip_mroute.c | --- sys/netinet/ip_mroute.c 9 Feb 2017 15:36:46 -0000 1.110 | +++ sys/netinet/ip_mroute.c 13 Mar 2017 11:25:13 -0000 | @@ -157,11 +157,14 @@ mfc_find(struct ifnet *ifp, struct in_ad | if (rt == NULL) | return (NULL); | | - /* Return first ocurrence if interface is not specified. */ | - if (ifp == NULL) | - return (rt); | - | do { | + /* Don't consider non multicast routes. */ | + if (ISSET(rt->rt_flags, RTF_HOST | RTF_MULTICAST) != | + (RTF_HOST | RTF_MULTICAST)) | + continue; | + /* Return first occurrence if interface is not specified. */ | + if (ifp == NULL) | + return (rt); | if (rt->rt_ifidx == ifp->if_index) | return (rt); | } while ((rt = rtable_iterate(rt)) != NULL); -- >++++++++[<++++++++++>-]<+++++++.>+++[<------>-]<.>+++[<+ +++++++++++>-]<.>++[<------------>-]<+.--------------.[-] http://www.weirdnet.nl/
