• Matteo Croce's avatar
    bonding: symmetric ICMP transmit · df98be06
    Matteo Croce authored
    A bonding with layer2+3 or layer3+4 hashing uses the IP addresses and the ports
    to balance packets between slaves. With some network errors, we receive an ICMP
    error packet by the remote host or a router. If sent by a router, the source IP
    can differ from the remote host one. Additionally the ICMP protocol has no port
    numbers, so a layer3+4 bonding will get a different hash than the previous one.
    These two conditions could let the packet go through a different interface than
    the other packets of the same flow:
    
        # tcpdump -qltnni veth0 |sed 's/^/0: /' &
        # tcpdump -qltnni veth1 |sed 's/^/1: /' &
        # hping3 -2 192.168.0.2 -p 9
        0: IP 192.168.0.1.2251 > 192.168.0.2.9: UDP, length 0
        1: IP 192.168.0.2 > 192.168.0.1: ICMP 192.168.0.2 udp port 9 unreachable, length 36
        1: IP 192.168.0.1.2252 > 192.168.0.2.9: UDP, length 0
        1: IP 192.168.0.2 > 192.168.0.1: ICMP 192.168.0.2 udp port 9 unreachable, length 36
        1: IP 192.168.0.1.2253 > 192.168.0.2.9: UDP, length 0
        1: IP 192.168.0.2 > 192.168.0.1: ICMP 192.168.0.2 udp port 9 unreachable, length 36
        0: IP 192.168.0.1.2254 > 192.168.0.2.9: UDP, length 0
        1: IP 192.168.0.2 > 192.168.0.1: ICMP 192.168.0.2 udp port 9 unreachable, length 36
    
    An ICMP error packet contains the header of the packet which caused the network
    error, so inspect it and match the flow against it, so we can send the ICMP via
    the same interface of the previous packet in the flow.
    Move the IP and port dissect code into a generic function bond_flow_ip() and if
    we are dissecting an ICMP error packet, call it again with the adjusted offset.
    
        # hping3 -2 192.168.0.2 -p 9
        1: IP 192.168.0.1.1224 > 192.168.0.2.9: UDP, length 0
        1: IP 192.168.0.2 > 192.168.0.1: ICMP 192.168.0.2 udp port 9 unreachable, length 36
        1: IP 192.168.0.1.1225 > 192.168.0.2.9: UDP, length 0
        1: IP 192.168.0.2 > 192.168.0.1: ICMP 192.168.0.2 udp port 9 unreachable, length 36
        0: IP 192.168.0.1.1226 > 192.168.0.2.9: UDP, length 0
        0: IP 192.168.0.2 > 192.168.0.1: ICMP 192.168.0.2 udp port 9 unreachable, length 36
        0: IP 192.168.0.1.1227 > 192.168.0.2.9: UDP, length 0
        0: IP 192.168.0.2 > 192.168.0.1: ICMP 192.168.0.2 udp port 9 unreachable, length 36
    Signed-off-by: default avatarMatteo Croce <mcroce@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    df98be06
bond_main.c 139 KB