• Kristian Evensen's avatar
    fou: Support binding FoU socket · 1713cb37
    Kristian Evensen authored
    An FoU socket is currently bound to the wildcard-address. While this
    works fine, there are several use-cases where the use of the
    wildcard-address is not desirable. For example, I use FoU on some
    multi-homed servers and would like to use FoU on only one of the
    interfaces.
    
    This commit adds support for binding FoU sockets to a given source
    address/interface, as well as connecting the socket to a given
    destination address/port. udp_tunnel already provides the required
    infrastructure, so most of the code added is for exposing and setting
    the different attributes (local address, peer address, etc.).
    
    The lookups performed when we add, delete or get an FoU-socket has also
    been updated to compare all the attributes a user can set. Since the
    comparison now involves several elements, I have added a separate
    comparison-function instead of open-coding.
    
    In order to test the code and ensure that the new comparison code works
    correctly, I started by creating a wildcard socket bound to port 1234 on
    my machine. I then tried to create a non-wildcarded socket bound to the
    same port, as well as fetching and deleting the socket (including source
    address, peer address or interface index in the netlink request).  Both
    the create, fetch and delete request failed. Deleting/fetching the
    socket was only successful when my netlink request attributes matched
    those used to create the socket.
    
    I then repeated the tests, but with a socket bound to a local ip
    address, a socket bound to a local address + interface, and a bound
    socket that was also «connected» to a peer. Add only worked when no
    socket with the matching source address/interface (or wildcard) existed,
    while fetch/delete was only successful when all attributes matched.
    
    In addition to testing that the new code work, I also checked that the
    current behavior is kept. If none of the new attributes are provided,
    then an FoU-socket is configured as before (i.e., wildcarded).  If any
    of the new attributes are provided, the FoU-socket is configured as
    expected.
    
    v1->v2:
    * Fixed building with IPv6 disabled (kbuild).
    * Fixed a return type warning and make the ugly comparison function more
    readable (kbuild).
    * Describe more in detail what has been tested (thanks David Miller).
    * Make peer port required if peer address is specified.
    Signed-off-by: default avatarKristian Evensen <kristian.evensen@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    1713cb37
fou.c 27.9 KB