$OpenBSD: patch-igmp_c,v 1.1.1.1 2008/02/08 19:30:52 sthen Exp $ --- igmp.c.orig Tue May 24 17:49:16 2005 +++ igmp.c Mon Aug 13 15:16:51 2007 @@ -41,8 +41,6 @@ uint32 allhosts_group; /* All hosts addr in net order */ uint32 allrouters_group; /* All hosts addr in net order */ -extern int MRouterFD; - /* * Open and initialize the igmp socket, and fill in the non-changing * IP header fields in the output packet buffer. @@ -128,6 +126,7 @@ void acceptIgmp(int recvlen) { } else { struct IfDesc *checkVIF; + int downIf = -1; // Check if the source address matches a valid address on upstream vif. checkVIF = getIfByIx( upStreamVif ); @@ -141,15 +140,30 @@ void acceptIgmp(int recvlen) { return; } else if(!isAdressValidForIf(checkVIF, src)) { - log(LOG_WARNING, 0, "The source address %s for group %s, is not in any valid net for upstream VIF.", - inetFmt(src, s1), inetFmt(dst, s2)); - return; + unsigned Ix; + struct IfDesc *Dp; + + for ( Ix = 0; (Dp = getIfByIx( Ix )); Ix++ ) { + if ((Dp->state == IF_STATE_DOWNSTREAM) &&isAdressValidForIf(Dp, src)) { + downIf = Ix; + break; + } + } + + if (downIf == -1) { + log(LOG_WARNING, 0, "The source address %s for group %s, is not in any valid net for upstream VIF.", + inetFmt(src, s1), inetFmt(dst, s2)); + return; + } else { + log(LOG_NOTICE, 0, "The source address %s for group %s, is valid DOWNSTREAM VIF #%d.", + inetFmt(src, s1), inetFmt(dst, s2), downIf); + } } // Activate the route. - IF_DEBUG log(LOG_DEBUG, 0, "Route activate request from %s to %s", - inetFmt(src,s1), inetFmt(dst,s2)); - activateRoute(dst, src); + IF_DEBUG log(LOG_DEBUG, 0, "Route activate request from %s to %s, downIf %d", + inetFmt(src,s1), inetFmt(dst,s2), downIf); + activateRoute(dst, src, downIf); } @@ -176,9 +190,9 @@ void acceptIgmp(int recvlen) { return; } - log(LOG_NOTICE, 0, "RECV %s from %-15s to %s", + log(LOG_NOTICE, 0, "RECV %s from %-15s to %s (ip_hl %d, data %d)", igmpPacketKind(igmp->igmp_type, igmp->igmp_code), - inetFmt(src, s1), inetFmt(dst, s2) ); + inetFmt(src, s1), inetFmt(dst, s2), iphdrlen, ipdatalen); switch (igmp->igmp_type) { case IGMP_V1_MEMBERSHIP_REPORT: @@ -190,12 +204,9 @@ void acceptIgmp(int recvlen) { acceptLeaveMessage(src, group); return; - /* case IGMP_MEMBERSHIP_QUERY: //accept_membership_query(src, dst, group, igmp->igmp_code); return; - - */ default: log(LOG_INFO, 0,