Skip to content

Instantly share code, notes, and snippets.

@ymmt2005
Last active May 16, 2018 01:12
Show Gist options
  • Select an option

  • Save ymmt2005/f7d82a7252ae32e73c1cbb4ae3114e5d to your computer and use it in GitHub Desktop.

Select an option

Save ymmt2005/f7d82a7252ae32e73c1cbb4ae3114e5d to your computer and use it in GitHub Desktop.

Revisions

  1. ymmt2005 revised this gist May 15, 2018. 1 changed file with 37 additions and 25 deletions.
    62 changes: 37 additions & 25 deletions ecmp_weird_route.sh
    Original file line number Diff line number Diff line change
    @@ -20,6 +20,7 @@ clean() {
    done

    if ip netns list | grep -q $NS; then
    #ip netns exec $NS ip link del node0
    ip netns del $NS
    fi
    }
    @@ -37,6 +38,11 @@ cidr2ip() {
    echo $1 | cut -d / -f 1
    }

    GW1=$(make_address $NET1 1)
    GW2=$(make_address $NET2 1)
    ADDR1=$(make_address $NET1 2)
    ADDR2=$(make_address $NET2 2)

    setup_veth() {
    local br veth dest
    br=$1
    @@ -58,31 +64,37 @@ setup() {
    setup_veth $BR2 $VETH2 eth1

    local gw1 gw2
    gw1=$(make_address $NET1 1)
    gw2=$(make_address $NET2 1)
    ip addr add $gw1 dev $BR1
    ip addr add $gw2 dev $BR2
    $IPNS addr add $(make_address $NET1 2) dev eth0
    $IPNS netns exec $NS ip addr add $(make_address $NET2 2) dev eth1

    $IPNS route add 0.0.0.0/0 nexthop via $(cidr2ip $gw1) nexthop via $(cidr2ip $gw2)
    ip addr add $GW1 dev $BR1
    ip addr add $GW2 dev $BR2
    $IPNS addr add $ADDR1 dev eth0
    $IPNS addr add $ADDR2 dev eth1

    $IPNS route add 0.0.0.0/0 nexthop via $(cidr2ip $GW1) nexthop via $(cidr2ip $GW2)
    }

    test_route() {
    local dest r dev src
    setup_node0() {
    $IPNS link add node0 type dummy
    $IPNS link set node0 up
    $IPNS addr add 192.168.10.2/32 dev node0
    }

    test_route_from() {
    local dest dev from r rdev
    dest=$1
    r=$($IPNS -o route get $dest)
    dev=$(echo $r | sed -nr 's/^.*dev (eth[[:digit:]]+).*/\1/p')
    src=$(echo $r | sed -nr 's/^.*src ([.[:digit:]]+).*/\1/p')
    if [ "$dev" = eth0 ] && [ "$src" != 192.168.11.2 ]; then
    echo "WRONG dev/src pair: dest=$dest dev=$dev src=$src"
    dev=$2
    from=$3
    r=$($IPNS -o route get $dest from $from)
    rdev=$(echo $r | sed -nr 's/^.*dev (eth[[:digit:]]+).*/\1/p')
    if [ "$dev" != "$rdev" ]; then
    echo "WRONG dev/from pair: ip -o route get $dest from $from:"
    printf "%s\n" "$r"
    return
    fi
    if [ "$dev" = eth1 ] && [ "$src" != 192.168.12.2 ]; then
    echo "WRONG dev/src pair: dest=$dest dev=$dev src=$src"
    return
    fi
    echo "correct dev/src pair for $dest"
    }

    test_route() {
    test_route_from "$1" eth0 $(cidr2ip $ADDR1)
    test_route_from "$1" eth1 $(cidr2ip $ADDR2)
    }

    run_tests() {
    @@ -92,15 +104,15 @@ run_tests() {
    test_route 216.58.200.162
    test_route 216.58.200.163
    test_route 216.58.200.164
    test_route 216.58.200.165
    test_route 216.58.200.166
    test_route 216.58.200.167
    test_route 216.58.200.168
    test_route 216.58.200.169
    test_route 52.85.149.10
    test_route 52.85.149.11
    test_route 52.85.149.12
    test_route 52.85.149.13
    test_route 52.85.149.14
    }

    # main
    setup
    #setup_node0
    run_tests
    read -p "Press enter to finish" ret
  2. ymmt2005 revised this gist May 14, 2018. 1 changed file with 32 additions and 8 deletions.
    40 changes: 32 additions & 8 deletions ecmp_weird_route.sh
    Original file line number Diff line number Diff line change
    @@ -23,12 +23,20 @@ clean() {
    ip netns del $NS
    fi
    }
    trap clean INT QUIT TERM HUP PIPE 0

    make_address() {
    local net addr
    net=$1
    addr=$2

    echo $net | sed "s/xx/$addr/"
    }

    cidr2ip() {
    echo $1 | cut -d / -f 1
    }

    setup_veth() {
    local br veth dest
    br=$1
    @@ -57,26 +65,42 @@ setup() {
    $IPNS addr add $(make_address $NET1 2) dev eth0
    $IPNS netns exec $NS ip addr add $(make_address $NET2 2) dev eth1

    $IPNS route add 0.0.0.0/0 nexthop via $gw1 nexthop via $gw2
    $IPNS route add 0.0.0.0/0 nexthop via $(cidr2ip $gw1) nexthop via $(cidr2ip $gw2)
    }

    test_route() {
    local dest
    local dest r dev src
    dest=$1
    echo "ip route get $dest"
    $IPNS route get $dest
    r=$($IPNS -o route get $dest)
    dev=$(echo $r | sed -nr 's/^.*dev (eth[[:digit:]]+).*/\1/p')
    src=$(echo $r | sed -nr 's/^.*src ([.[:digit:]]+).*/\1/p')
    if [ "$dev" = eth0 ] && [ "$src" != 192.168.11.2 ]; then
    echo "WRONG dev/src pair: dest=$dest dev=$dev src=$src"
    return
    fi
    if [ "$dev" = eth1 ] && [ "$src" != 192.168.12.2 ]; then
    echo "WRONG dev/src pair: dest=$dest dev=$dev src=$src"
    return
    fi
    echo "correct dev/src pair for $dest"
    }

    run_tests() {
    test_route 12.34.56.78
    test_route 216.58.200.160
    test_route 216.58.200.161
    test_route 216.58.200.162
    test_route 216.58.200.163
    test_route 216.58.200.164
    test_route 216.58.200.165
    test_route 216.58.200.166
    test_route 216.58.200.167
    test_route 216.58.200.168
    test_route 216.58.200.169
    test_route 52.85.149.11
    }

    # main
    clean
    setup
    run_tests

    read -p "Press enter to finish" ret
    clean
    read -p "Press enter to finish" ret
  3. ymmt2005 created this gist May 11, 2018.
    82 changes: 82 additions & 0 deletions ecmp_weird_route.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,82 @@
    #!/bin/sh -e

    NS=testns

    BR1=testbr1
    VETH1=testveth1
    BR2=testbr2
    VETH2=testveth2
    LINKS="$VETH1 $VETH2 $BR1 $BR2"

    NET1=192.168.11.xx/24
    NET2=192.168.12.xx/24
    IPNS="ip netns exec $NS ip"

    clean() {
    for l in $LINKS; do
    if ip -o link show $l >/dev/null 2>&1; then
    ip link del $l
    fi
    done

    if ip netns list | grep -q $NS; then
    ip netns del $NS
    fi
    }

    make_address() {
    local net addr
    echo $net | sed "s/xx/$addr/"
    }

    setup_veth() {
    local br veth dest
    br=$1
    veth=$2
    dest=$3

    ip link add $br type bridge
    ip link add $veth type veth peer name ${veth}_
    ip link set $br up
    ip link set $veth master $br up
    ip link set ${veth}_ netns $NS name $dest up
    }

    setup() {
    ip netns add $NS
    $IPNS link set lo up

    setup_veth $BR1 $VETH1 eth0
    setup_veth $BR2 $VETH2 eth1

    local gw1 gw2
    gw1=$(make_address $NET1 1)
    gw2=$(make_address $NET2 1)
    ip addr add $gw1 dev $BR1
    ip addr add $gw2 dev $BR2
    $IPNS addr add $(make_address $NET1 2) dev eth0
    $IPNS netns exec $NS ip addr add $(make_address $NET2 2) dev eth1

    $IPNS route add 0.0.0.0/0 nexthop via $gw1 nexthop via $gw2
    }

    test_route() {
    local dest
    dest=$1
    echo "ip route get $dest"
    $IPNS route get $dest
    }

    run_tests() {
    test_route 12.34.56.78
    test_route 216.58.200.164
    test_route 52.85.149.11
    }

    # main
    clean
    setup
    run_tests

    read -p "Press enter to finish" ret
    clean