Skip to content
  • Veaceslav Falico's avatar
    bonding: add an option to fail when any of arp_ip_target is inaccessible · 8599b52e
    Veaceslav Falico authored
    
    
    Currently, we fail only when all of the ips in arp_ip_target are gone.
    However, in some situations we might need to fail if even one host from
    arp_ip_target becomes unavailable.
    
    All situations, obviously, rely on the idea that we need *completely*
    functional network, with all interfaces/addresses working correctly.
    
    One real world example might be:
    vlans on top on bond (hybrid port). If bond and vlans have ips assigned
    and we have their peers monitored via arp_ip_target - in case of switch
    misconfiguration (trunk/access port), slave driver malfunction or
    tagged/untagged traffic dropped on the way - we will be able to switch
    to another slave.
    
    Though any other configuration needs that if we need to have access to all
    arp_ip_targets.
    
    This patch adds this possibility by adding a new parameter -
    arp_all_targets (both as a module parameter and as a sysfs knob). It can be
    set to:
    
    	0 or any (the default) - which works exactly as it's working now -
    	the slave is up if any of the arp_ip_targets are up.
    
    	1 or all - the slave is up if all of the arp_ip_targets are up.
    
    This parameter can be changed on the fly (via sysfs), and requires the mode
    to be active-backup and arp_validate to be enabled (it obeys the
    arp_validate config on which slaves to validate).
    
    Internally it's done through:
    
    1) Add target_last_arp_rx[BOND_MAX_ARP_TARGETS] array to slave struct. It's
       an array of jiffies, meaning that slave->target_last_arp_rx[i] is the
       last time we've received arp from bond->params.arp_targets[i] on this
       slave.
    
    2) If we successfully validate an arp from bond->params.arp_targets[i] in
       bond_validate_arp() - update the slave->target_last_arp_rx[i] with the
       current jiffies value.
    
    3) When getting slave's last_rx via slave_last_rx(), we return the oldest
       time when we've received an arp from any address in
       bond->params.arp_targets[].
    
    If the value of arp_all_targets == 0 - we still work the same way as
    before.
    
    Also, update the documentation to reflect the new parameter.
    
    v3->v4:
    Kill the forgotten rtnl_unlock(), rephrase the documentation part to be
    more clear, don't fail setting arp_all_targets if arp_validate is not set -
    it has no effect anyway but can be easier to set up. Also, print a warning
    if the last arp_ip_target is removed while the arp_interval is on, but not
    the arp_validate.
    
    v2->v3:
    Use _bh spinlock, remove useless rtnl_lock() and use jiffies for new
    arp_ip_target last arp, instead of slave_last_rx(). On bond_enslave(),
    use the same initialization value for target_last_arp_rx[] as is used
    for the default last_arp_rx, to avoid useless interface flaps.
    
    Also, instead of failing to remove the last arp_ip_target just print a
    warning - otherwise it might break existing scripts.
    
    v1->v2:
    Correctly handle adding/removing hosts in arp_ip_target - we need to
    shift/initialize all slave's target_last_arp_rx. Also, don't fail module
    loading on arp_all_targets misconfiguration, just disable it, and some
    minor style fixes.
    
    Signed-off-by: default avatarVeaceslav Falico <vfalico@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8599b52e