• Francesco Ruggeri's avatar
    net: icmp6: provide input address for traceroute6 · fac6fce9
    Francesco Ruggeri authored
    traceroute6 output can be confusing, in that it shows the address
    that a router would use to reach the sender, rather than the address
    the packet used to reach the router.
    Consider this case:
    
            ------------------------ N2
             |                    |
           ------              ------  N3  ----
           | R1 |              | R2 |------|H2|
           ------              ------      ----
             |                    |
            ------------------------ N1
                      |
                     ----
                     |H1|
                     ----
    
    where H1's default route is through R1, and R1's default route is
    through R2 over N2.
    traceroute6 from H1 to H2 shows R2's address on N1 rather than on N2.
    
    The script below can be used to reproduce this scenario.
    
    traceroute6 output without this patch:
    
    traceroute to 2000:103::4 (2000:103::4), 30 hops max, 80 byte packets
     1  2000:101::1 (2000:101::1)  0.036 ms  0.008 ms  0.006 ms
     2  2000:101::2 (2000:101::2)  0.011 ms  0.008 ms  0.007 ms
     3  2000:103::4 (2000:103::4)  0.013 ms  0.010 ms  0.009 ms
    
    traceroute6 output with this patch:
    
    traceroute to 2000:103::4 (2000:103::4), 30 hops max, 80 byte packets
     1  2000:101::1 (2000:101::1)  0.056 ms  0.019 ms  0.006 ms
     2  2000:102::2 (2000:102::2)  0.013 ms  0.008 ms  0.008 ms
     3  2000:103::4 (2000:103::4)  0.013 ms  0.009 ms  0.009 ms
    
    #!/bin/bash
    #
    #        ------------------------ N2
    #         |                    |
    #       ------              ------  N3  ----
    #       | R1 |              | R2 |------|H2|
    #       ------              ------      ----
    #         |                    |
    #        ------------------------ N1
    #                  |
    #                 ----
    #                 |H1|
    #                 ----
    #
    # N1: 2000:101::/64
    # N2: 2000:102::/64
    # N3: 2000:103::/64
    #
    # R1's host part of address: 1
    # R2's host part of address: 2
    # H1's host part of address: 3
    # H2's host part of address: 4
    #
    # For example:
    # the IPv6 address of R1's interface on N2 is 2000:102::1/64
    #
    # Nets are implemented by macvlan interfaces (bridge mode) over
    # dummy interfaces.
    #
    
    # Create net namespaces
    ip netns add host1
    ip netns add host2
    ip netns add rtr1
    ip netns add rtr2
    
    # Create nets
    ip link add net1 type dummy; ip link set net1 up
    ip link add net2 type dummy; ip link set net2 up
    ip link add net3 type dummy; ip link set net3 up
    
    # Add interfaces to net1, move them to their nemaspaces
    ip link add link net1 dev host1net1 type macvlan mode bridge
    ip link set host1net1 netns host1
    ip link add link net1 dev rtr1net1 type macvlan mode bridge
    ip link set rtr1net1 netns rtr1
    ip link add link net1 dev rtr2net1 type macvlan mode bridge
    ip link set rtr2net1 netns rtr2
    
    # Add interfaces to net2, move them to their nemaspaces
    ip link add link net2 dev rtr1net2 type macvlan mode bridge
    ip link set rtr1net2 netns rtr1
    ip link add link net2 dev rtr2net2 type macvlan mode bridge
    ip link set rtr2net2 netns rtr2
    
    # Add interfaces to net3, move them to their nemaspaces
    ip link add link net3 dev rtr2net3 type macvlan mode bridge
    ip link set rtr2net3 netns rtr2
    ip link add link net3 dev host2net3 type macvlan mode bridge
    ip link set host2net3 netns host2
    
    # Configure interfaces and routes in host1
    ip netns exec host1 ip link set lo up
    ip netns exec host1 ip link set host1net1 up
    ip netns exec host1 ip -6 addr add 2000:101::3/64 dev host1net1
    ip netns exec host1 ip -6 route add default via 2000:101::1
    
    # Configure interfaces and routes in rtr1
    ip netns exec rtr1 ip link set lo up
    ip netns exec rtr1 ip link set rtr1net1 up
    ip netns exec rtr1 ip -6 addr add 2000:101::1/64 dev rtr1net1
    ip netns exec rtr1 ip link set rtr1net2 up
    ip netns exec rtr1 ip -6 addr add 2000:102::1/64 dev rtr1net2
    ip netns exec rtr1 ip -6 route add default via 2000:102::2
    ip netns exec rtr1 sysctl net.ipv6.conf.all.forwarding=1
    
    # Configure interfaces and routes in rtr2
    ip netns exec rtr2 ip link set lo up
    ip netns exec rtr2 ip link set rtr2net1 up
    ip netns exec rtr2 ip -6 addr add 2000:101::2/64 dev rtr2net1
    ip netns exec rtr2 ip link set rtr2net2 up
    ip netns exec rtr2 ip -6 addr add 2000:102::2/64 dev rtr2net2
    ip netns exec rtr2 ip link set rtr2net3 up
    ip netns exec rtr2 ip -6 addr add 2000:103::2/64 dev rtr2net3
    ip netns exec rtr2 sysctl net.ipv6.conf.all.forwarding=1
    
    # Configure interfaces and routes in host2
    ip netns exec host2 ip link set lo up
    ip netns exec host2 ip link set host2net3 up
    ip netns exec host2 ip -6 addr add 2000:103::4/64 dev host2net3
    ip netns exec host2 ip -6 route add default via 2000:103::2
    
    # Ping host2 from host1
    ip netns exec host1 ping6 -c5 2000:103::4
    
    # Traceroute host2 from host1
    ip netns exec host1 traceroute6 2000:103::4
    
    # Delete nets
    ip link del net3
    ip link del net2
    ip link del net1
    
    # Delete namespaces
    ip netns del rtr2
    ip netns del rtr1
    ip netns del host2
    ip netns del host1
    Signed-off-by: default avatarFrancesco Ruggeri <fruggeri@arista.com>
    Original-patch-by: default avatarHonggang Xu <hxu@arista.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    fac6fce9
icmp.c 27.6 KB