lkml.org 
[lkml]   [2012]   [Mar]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH net V2] bonding: send igmp report for its master
    On Wed, Mar 14, 2012 at 11:37:22AM +0800, Weiping Pan wrote:
    > Liang Zheng(lzheng@redhat.com) found that in the following topo,
    > bonding does not send igmp report when we trigger a fail-over of bonding.
    >
    > eth0--
    > |-- bond0 -- br0
    > eth1--
    >
    > modprobe bonding mode=1 miimon=100 resend_igmp=10
    > ifconfig bond0 up
    > ifenslave bond0 eth0 eth1
    >
    > brctl addbr br0
    > ifconfig br0 192.168.100.2/24 up
    > brctl addif br0 bond0
    >
    > Add 192.168.100.2(br0) into a multicast group, like 224.10.10.10,
    > then trigger a fali-over in bonding.
    > You can see that parameter "resend_igmp" does not work.
    >
    > The reason is that when we add br0 into a multicast group,
    > it does not propagate multicast knowledge down to its ports.
    >
    > If we choose to propagate multicast knowledge down to all ports for bridge,
    > then we have to track every change that is done to bridge, and keep a backup
    > for all ports. It is hard to track, I think.
    >
    > Instead I choose to modify bonding to send igmp report for its master.
    >
    > Changelog:
    > V2: correct comments
    >
    > Signed-off-by: Weiping Pan <panweiping3@gmail.com>
    > ---
    > drivers/net/bonding/bond_main.c | 8 ++++++++
    > 1 files changed, 8 insertions(+), 0 deletions(-)
    >
    > diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
    > index 435984a..300c490 100644
    > --- a/drivers/net/bonding/bond_main.c
    > +++ b/drivers/net/bonding/bond_main.c
    > @@ -794,6 +794,14 @@ static void bond_resend_igmp_join_requests_delayed(struct work_struct *work)
    > {
    > struct bonding *bond = container_of(work, struct bonding,
    > mcast_work.work);
    > + struct net_device *bond_dev, *master_dev = NULL;
    > + bond_dev = bond->dev;
    > + master_dev = bond_dev->master;
    > +
    > + if (unlikely(master_dev)) {
    > + __bond_resend_igmp_join_requests(master_dev);
    > + }
    > +
    > bond_resend_igmp_join_requests(bond);
    > }
    >

    This check and call to __bond_resend_igmp_join_requests would be better
    in bond_resend_igmp_join_requests for 2 reasons:

    1. bond_resend_igmp_join_requests already has a check for vlan devices.
    It seems logical to check for the bridging case there also.

    2. Calling __bond_resend_igmp_join_requests will not work as expected
    when igmp_retrans>1 since no decrementing or rescheduling is done in
    __bond_resend_igmp_join_requests.



    \
     
     \ /
      Last update: 2012-03-14 18:23    [W:0.024 / U:30.484 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site