• Andy Gospodarek's avatar
    bonding: remove entries for master_ip and vlan_ip and query devices instead · eaddcd76
    Andy Gospodarek authored
    The following patch aimed to resolve an issue where secondary, tertiary,
    etc. addresses added to bond interfaces could overwrite the
    bond->master_ip and vlan_ip values.
    
            commit 917fbdb3
            Author: Henrik Saavedra Persson <henrik.e.persson@ericsson.com>
            Date:   Wed Nov 23 23:37:15 2011 +0000
    
                bonding: only use primary address for ARP
    
    That patch was good because it prevented bonds using ARP monitoring from
    sending frames with an invalid source IP address.  Unfortunately, it
    didn't always work as expected.
    
    When using an ioctl (like ifconfig does) to set the IP address and
    netmask, 2 separate ioctls are actually called to set the IP and netmask
    if the mask chosen doesn't match the standard mask for that class of
    address.  The first ioctl did not have a mask that matched the one in
    the primary address and would still cause the device address to be
    overwritten.  The second ioctl that was called to set the mask would
    then detect as secondary and ignored, but the damage was already done.
    
    This was not an issue when using an application that used netlink
    sockets as the setting of IP and netmask came down at once.  The
    inconsistent behavior between those two interfaces was something that
    needed to be resolved.
    
    While I was thinking about how I wanted to resolve this, Ralf Zeidler
    came with a patch that resolved this on a RHEL kernel by keeping a full
    shadow of the entries in dev->ifa_list for the bonding device and vlan
    devices in the bonding driver.  I didn't like the duplication of the
    list as I want to see the 'bonding' struct and code shrink rather than
    grow, but liked the general idea.
    
    As the Subject indicates this patch drops the master_ip and vlan_ip
    elements from the 'bonding' and 'vlan_entry' structs, respectively.
    This can be done because a device's address-list is now traversed to
    determine the optimal source IP address for ARP requests and for checks
    to see if the bonding device has a particular IP address.  This code
    could have all be contained inside the bonding driver, but it made more
    sense to me to EXPORT and call inet_confirm_addr since it did exactly
    what was needed.
    
    I tested this and a backported patch and everything works as expected.
    Ralf also helped with verification of the backported patch.
    
    Thanks to Ralf for all his help on this.
    
    v2: Whitespace and organizational changes based on suggestions from Jay
    Vosburgh and Dave Miller.
    
    v3: Fixup incorrect usage of rcu_read_unlock based on Dave Miller's
    suggestion.
    Signed-off-by: default avatarAndy Gospodarek <andy@greyhouse.net>
    CC: Ralf Zeidler <ralf.zeidler@nsn.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    eaddcd76
bond_main.c 128 KB