• Quentin Armitage's avatar
    ipvs: fix bind to link-local mcast IPv6 address in backup · 3777ed68
    Quentin Armitage authored
    When using HEAD from
    https://git.kernel.org/cgit/utils/kernel/ipvsadm/ipvsadm.git/,
    the command:
    ipvsadm --start-daemon backup --mcast-interface eth0.60 \
        --mcast-group ff02::1:81
    fails with the error message:
    Argument list too long
    
    whereas both:
    ipvsadm --start-daemon master --mcast-interface eth0.60 \
        --mcast-group ff02::1:81
    and:
    ipvsadm --start-daemon backup --mcast-interface eth0.60 \
        --mcast-group 224.0.0.81
    are successful.
    
    The error message "Argument list too long" isn't helpful. The error occurs
    because an IPv6 address is given in backup mode.
    
    The error is in make_receive_sock() in net/netfilter/ipvs/ip_vs_sync.c,
    since it fails to set the interface on the address or the socket before
    calling inet6_bind() (via sock->ops->bind), where the test
    'if (!sk->sk_bound_dev_if)' failed.
    
    Setting sock->sk->sk_bound_dev_if on the socket before calling
    inet6_bind() resolves the issue.
    
    Fixes: d3328817 ("ipvs: add more mcast parameters for the sync daemon")
    Signed-off-by: default avatarQuentin Armitage <quentin@armitage.org.uk>
    Acked-by: default avatarJulian Anastasov <ja@ssi.bg>
    Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
    3777ed68
ip_vs_sync.c 53.5 KB