On Fri, Jul 31, 2009 at 7:36 PM, Evgeny
Yurchenko<[email protected]> wrote:
>> From: [email protected] [mailto:[email protected]] On
>> Behalf Of Chris Buechler
>>
>> On Thu, Jul 30, 2009 at 8:33 PM, Evgeny
>> Yurchenko<[email protected]> wrote:
>> >
>> > The code of igmpproxy is heavily inherited from mrouted and actual
>> > proxying of IGMP-packets does not happen. It is not a
>> problem if mcast
>> > sender on upstream interface does not care about
>> memberships and just
>> > multicasts always, but if it is wise sender, or if sender
>> is located
>> > in several routers upstream then IGMP is needed. So I fixed
>> this small issue for 1.2.2 (I have only this development
>> version). There was another problem with understanding
>> interfaces consisting of more than 3 letters (em1 - ok, bge1
>> - can't start), also fixed. Could somebody validate and put
>> my several lines of code in repository please? How does it
>> work at all - if somebody found solution for some problem, what to do?
>> >
>>
>> You can send a patch here (diff -rub please) and I'm sure
>> Ermal will review (he does most of our C work, and did this multicast
>> implementation) and get it committed.
>>
>> Thanks!
>>
> diff -rub original/igmpproxy/work/igmpproxy/src/config.c
> igmpproxy/work/igmpproxy/src/config.c
> --- original/igmpproxy/work/igmpproxy/src/config.c      2009-07-31
> 17:17:16.000000000 +0000
> +++ igmpproxy/work/igmpproxy/src/config.c       2009-07-31
> 17:21:28.000000000 +0000
> @@ -241,7 +241,7 @@
>     tmpPtr->allowednets = NULL;
>
>     // Make a copy of the token to store the IF name
> -    tmpPtr->name = (char *)malloc( sizeof(char) * strlen(token) );
> +    tmpPtr->name = (char *)malloc( sizeof(char) * strlen(token) + 1 );
>     if(tmpPtr->name == NULL) {
>         log(LOG_ERR, 0, "Out of memory.");
>     }
>
>
> diff -rub original/igmpproxy/work/igmpproxy/src/mcgroup.c
> igmpproxy/work/igmpproxy/src/mcgroup.c
> --- original/igmpproxy/work/igmpproxy/src/mcgroup.c     2009-07-31
> 17:17:16.000000000 +0000
> +++ igmpproxy/work/igmpproxy/src/mcgroup.c      2009-07-31
> 17:11:00.000000000 +0000
> @@ -63,13 +63,18 @@
>     }
>  #else
>     if( setsockopt( UdpSock, IPPROTO_IP,
> -          Cmd == 'j' ? IP_ADD_SOURCE_MEMBERSHIP :
> IP_DROP_SOURCE_MEMBERSHIP,
> +          Cmd == 'j' ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP,
>           (void *)&CtlReq, sizeof( CtlReq ) ) )
>     {
>         log( LOG_WARNING, errno, "MRT_%s_MEMBERSHIP failed", Cmd == 'j'
> ? "ADD" : "DROP" );
>         return 1;
>     }
>  #endif
> +    /* We have to send IGMP packet on upstream interface */
> +    if( Cmd == 'j' )
> +       sendIgmp(0, mcastaddr, IGMP_V2_MEMBERSHIP_REPORT, 0, mcastaddr,
> 0);
> +    else
> +        sendIgmp(0, mcastaddr, IGMP_V2_LEAVE_GROUP, 0, mcastaddr, 0);
>
>     return 0;
>  }
>
>
>
> diff -rub original/igmpproxy/work/igmpproxy/src/rttable.c
> igmpproxy/work/igmpproxy/src/rttable.c
> --- original/igmpproxy/work/igmpproxy/src/rttable.c     2009-07-31
> 17:17:16.000000000 +0000
> +++ igmpproxy/work/igmpproxy/src/rttable.c      2009-07-31
> 17:25:18.000000000 +0000
> @@ -344,12 +344,8 @@
>                 return 0;
>             }
>         }
> -    }
> -
> -    // Send join message upstream, if the route has no joined flag...
> -    if(croute->upstrState != ROUTESTATE_JOINED) {
> -        // Send Join request upstream
> -        sendJoinLeaveUpstream(croute, 1);
> +        // Send join message upstream
> +       sendIgmp(0, group, IGMP_V2_MEMBERSHIP_REPORT, 0, group, 0);
>     }
>
>     IF_DEBUG logRouteTable("Insert Route");
>
>
Slightly different version committed to the
port.(https://rcs.pfsense.org/projects/pfsense-tools/repos/mainline/commits/82204b23ead0d217382d49477bd72a7c0374841f)
Can you test this?


-- 
Ermal

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Commercial support available - https://portal.pfsense.org

Reply via email to