[lkml]   [2005]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[patch 2.6.11] bonding: avoid tx balance for IGMP (alb/tlb mode)
    Add special case to bond_alb_xmit() to avoid tx balance for IGMP.

    Signed-off-by: John W. Linville <>
    Some switches (e.g. the Cisco Catalyst 3750) use IGMP snooping to
    determine which hosts belong to which multicast groups. Typically
    such switches use a timeout to determine when hosts have quietly left
    a group.

    In ALB or TLB mode, only one interface is configured to receive
    packets at a time. (Receive load balancing doesn't seem to be
    effective for IGMP traffic.) If both Ethernet interfaces are up,
    the load balancing capability can move the sending of IGMP packets
    to the non-receiving interface. If the switch ends up timing out the
    interface configured to receive packets, the multicast packets are then
    only sent to the non-receiving interface and are subsequently dropped.
    This behaviour is undesirable.

    The fix is to add a new special case (alongside some existing special
    cases) in bond_alb_xmit() in order to ensure that IGMP traffic is
    always sent out the port which is configured to receive frames.

    Of course, this patch has the downside of not load balancing IGMP
    traffic from the host. But, I'm inclined to believe that is "no big
    deal"... :-) Also, I'm sure other solutions might exist. But, they
    are likely no where near as simple as this one. And, this is probably
    the most in keeping with the ALB/TLB philosophy of not requiring any
    special switch support.

    drivers/net/bonding/bond_alb.c | 4 +++-
    1 files changed, 3 insertions(+), 1 deletion(-)

    --- linux-2.6.11/drivers/net/bonding/bond_alb.c.orig 2005-03-15 16:25:09.648034108 -0500
    +++ linux-2.6.11/drivers/net/bonding/bond_alb.c 2005-03-15 16:25:09.649033971 -0500
    @@ -54,6 +54,7 @@
    #include <linux/if_ether.h>
    #include <linux/if_bonding.h>
    #include <linux/if_vlan.h>
    +#include <linux/in.h>
    #include <net/ipx.h>
    #include <net/arp.h>
    #include <asm/byteorder.h>
    @@ -1300,7 +1301,8 @@ int bond_alb_xmit(struct sk_buff *skb, s
    switch (ntohs(skb->protocol)) {
    case ETH_P_IP:
    if ((memcmp(eth_data->h_dest, mac_bcast, ETH_ALEN) == 0) ||
    - (skb->nh.iph->daddr == ip_bcast)) {
    + (skb->nh.iph->daddr == ip_bcast) ||
    + (skb->nh.iph->protocol == IPPROTO_IGMP)) {
    do_tx_balance = 0;
    John W. Linville
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to
    More majordomo info at
    Please read the FAQ at
     \ /
      Last update: 2005-03-22 14:11    [W:0.024 / U:13.132 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site