• Jiri Bohac's avatar
    bonding: delete migrated IP addresses from the rlb hash table · e53665c6
    Jiri Bohac authored
    Bonding in balance-alb mode records information from ARP packets
    passing through the bond in a hash table (rx_hashtbl).
    
    At certain situations (e.g. link change of a slave),
    rlb_update_rx_clients() will send out ARP packets to update ARP
    caches of other hosts on the network to achieve RX load
    balancing.
    
    The problem is that once an IP address is recorded in the hash
    table, it stays there indefinitely. If this IP address is
    migrated to a different host in the network, bonding still sends
    out ARP packets that poison other systems' ARP caches with
    invalid information.
    
    This patch solves this by looking at all incoming ARP packets,
    and checking if the source IP address is one of the source
    addresses stored in the rx_hashtbl. If it is, but the MAC
    addresses differ, the corresponding hash table entries are
    removed. Thus, when an IP address is migrated, the first ARP
    broadcast by its new owner will purge the offending entries of
    rx_hashtbl.
    
    The hash table is hashed by ip_dst. To be able to do the above
    check efficiently (not walking the whole hash table), we need a
    reverse mapping (by ip_src).
    
    I added three new members in struct rlb_client_info:
       rx_hashtbl[x].src_first will point to the start of a list of
          entries for which hash(ip_src) == x.
       The list is linked with src_next and src_prev.
    
    When an incoming ARP packet arrives at rlb_arp_recv()
    rlb_purge_src_ip() can quickly walk only the entries on the
    corresponding lists, i.e. the entries that are likely to contain
    the offending IP address.
    
    To avoid confusion, I renamed these existing fields of struct
    rlb_client_info:
    	next -> used_next
    	prev -> used_prev
    	rx_hashtbl_head -> rx_hashtbl_used_head
    
    (The current linked list is _not_ a list of hash table
    entries with colliding ip_dst. It's a list of entries that are
    being used; its purpose is to avoid walking the whole hash table
    when looking for used entries.)
    Signed-off-by: default avatarJiri Bohac <jbohac@suse.cz>
    Signed-off-by: default avatarJay Vosburgh <fubar@us.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    e53665c6
bond_alb.c 47.5 KB