• Matteo Croce's avatar
    bonding: balance ICMP echoes in layer3+4 mode · 58deb77c
    Matteo Croce authored
    The bonding uses the L4 ports to balance flows between slaves. As the ICMP
    protocol has no ports, those packets are sent all to the same device:
    
        # tcpdump -qltnni veth0 ip |sed 's/^/0: /' &
        # tcpdump -qltnni veth1 ip |sed 's/^/1: /' &
        # ping -qc1 192.168.0.2
        1: IP 192.168.0.1 > 192.168.0.2: ICMP echo request, id 315, seq 1, length 64
        1: IP 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 315, seq 1, length 64
        # ping -qc1 192.168.0.2
        1: IP 192.168.0.1 > 192.168.0.2: ICMP echo request, id 316, seq 1, length 64
        1: IP 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 316, seq 1, length 64
        # ping -qc1 192.168.0.2
        1: IP 192.168.0.1 > 192.168.0.2: ICMP echo request, id 317, seq 1, length 64
        1: IP 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 317, seq 1, length 64
    
    But some ICMP packets have an Identifier field which is
    used to match packets within sessions, let's use this value in the hash
    function to balance these packets between bond slaves:
    
        # ping -qc1 192.168.0.2
        0: IP 192.168.0.1 > 192.168.0.2: ICMP echo request, id 303, seq 1, length 64
        0: IP 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 303, seq 1, length 64
        # ping -qc1 192.168.0.2
        1: IP 192.168.0.1 > 192.168.0.2: ICMP echo request, id 304, seq 1, length 64
        1: IP 192.168.0.2 > 192.168.0.1: ICMP echo reply, id 304, seq 1, length 64
    
    Aso, let's use a flow_dissector_key which defines FLOW_DISSECTOR_KEY_ICMP,
    so we can balance pings encapsulated in a tunnel when using mode encap3+4:
    
        # ping -q 192.168.1.2 -c1
        0: IP 192.168.0.1 > 192.168.0.2: GREv0, length 102: IP 192.168.1.1 > 192.168.1.2: ICMP echo request, id 585, seq 1, length 64
        0: IP 192.168.0.2 > 192.168.0.1: GREv0, length 102: IP 192.168.1.2 > 192.168.1.1: ICMP echo reply, id 585, seq 1, length 64
        # ping -q 192.168.1.2 -c1
        1: IP 192.168.0.1 > 192.168.0.2: GREv0, length 102: IP 192.168.1.1 > 192.168.1.2: ICMP echo request, id 586, seq 1, length 64
        1: IP 192.168.0.2 > 192.168.0.1: GREv0, length 102: IP 192.168.1.2 > 192.168.1.1: ICMP echo reply, id 586, seq 1, length 64
    Signed-off-by: default avatarMatteo Croce <mcroce@redhat.com>
    Reviewed-by: default avatarNikolay Aleksandrov <nikolay@cumulusnetworks.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    58deb77c
bond_main.c 139 KB