Skip to content
  • Jiri Pirko's avatar
    bonding: allow bond in mode balance-alb to work properly in bridge -try4.3 · 5d4e039b
    Jiri Pirko authored
    [PATCH net-next] bonding: allow bond in mode balance-alb to work properly in bridge -try4.3
    
    (updated)
    changes v4.2 -> v4.3
    - memcpy the address always, not just in case it differs from master->dev_addr
    - compare_ether_addr_64bits() is not used so there is no direct need to make new
      header file (I think it would be good to have bond stuff in separate file
      anyway).
    
    changes v4.1 -> v4.2
    - use skb->pkt_type == PACKET_HOST compare rather then comparing skb dest addr
      against skb->dev->dev_addr
    
    The problem is described in following bugzilla:
    https://bugzilla.redhat.com/show_bug.cgi?id=487763
    
    
    
    Basically here's what's going on. In every mode, bonding interface uses the same
    mac address for all enslaved devices (except fail_over_mac). Only balance-alb
    will simultaneously use multiple MAC addresses across different slaves. When you
    put this kind of bond device into a bridge it will only add one of mac adresses
    into a hash list of mac addresses, say X. This mac address is marked as local.
    But this bonding interface also has mac address Y. Now then packet arrives with
    destination address Y, this address is not marked as local and the packed looks
    like it needs to be forwarded. This packet is then lost which is wrong.
    
    Notice that interfaces can be added and removed from bond while it is in bridge.
    
    ***
    When the multiple addresses for bridge port approach failed to solve this issue
    due to STP I started to think other way to solve this. I returned to previous
    solution but tweaked one.
    
    This patch solves the situation in the bonding without touching bridge code.
    For every incoming frame to bonding the destination address is compared to
    current address of the slave device from which tha packet came. If these two
    match destination address is replaced by mac address of the master. This address
    is known by bridge so it is delivered properly. Note that the comparsion is not
    made directly, it's used skb->pkt_type == PACKET_HOST instead. This is "set"
    previously in eth_type_trans().
    
    I experimentally tried that this works as good as searching through the slave
    list (v4 of this patch).
    
    Jirka
    
    Signed-off-by: default avatarJiri Pirko <jpirko@redhat.com>
    Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarAndy Gospodarek <andy@greyhouse.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5d4e039b