158ade67bSShijie Luo#!/bin/bash
258ade67bSShijie Luo# SPDX-License-Identifier: GPL-2.0
358ade67bSShijie Luo#
458ade67bSShijie Luo# Run a couple of tests when route_localnet = 1.
558ade67bSShijie Luo
658ade67bSShijie Luoreadonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)"
758ade67bSShijie Luo
858ade67bSShijie Luosetup() {
958ade67bSShijie Luo    ip netns add "${PEER_NS}"
1058ade67bSShijie Luo    ip -netns "${PEER_NS}" link set dev lo up
1158ade67bSShijie Luo    ip link add name veth0 type veth peer name veth1
1258ade67bSShijie Luo    ip link set dev veth0 up
1358ade67bSShijie Luo    ip link set dev veth1 netns "${PEER_NS}"
1458ade67bSShijie Luo
1558ade67bSShijie Luo    # Enable route_localnet and delete useless route 127.0.0.0/8.
1658ade67bSShijie Luo    sysctl -w net.ipv4.conf.veth0.route_localnet=1
1758ade67bSShijie Luo    ip netns exec "${PEER_NS}" sysctl -w net.ipv4.conf.veth1.route_localnet=1
1858ade67bSShijie Luo    ip route del 127.0.0.0/8 dev lo table local
1958ade67bSShijie Luo    ip netns exec "${PEER_NS}" ip route del 127.0.0.0/8 dev lo table local
2058ade67bSShijie Luo
2158ade67bSShijie Luo    ifconfig veth0 127.25.3.4/24 up
2258ade67bSShijie Luo    ip netns exec "${PEER_NS}" ifconfig veth1 127.25.3.14/24 up
2358ade67bSShijie Luo
2458ade67bSShijie Luo    ip route flush cache
2558ade67bSShijie Luo    ip netns exec "${PEER_NS}" ip route flush cache
2658ade67bSShijie Luo}
2758ade67bSShijie Luo
2858ade67bSShijie Luocleanup() {
2958ade67bSShijie Luo    ip link del veth0
3058ade67bSShijie Luo    ip route add local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
3158ade67bSShijie Luo    local -r ns="$(ip netns list|grep $PEER_NS)"
3258ade67bSShijie Luo    [ -n "$ns" ] && ip netns del $ns 2>/dev/null
3358ade67bSShijie Luo}
3458ade67bSShijie Luo
3558ade67bSShijie Luo# Run test when arp_announce = 2.
3658ade67bSShijie Luorun_arp_announce_test() {
3758ade67bSShijie Luo    echo "run arp_announce test"
3858ade67bSShijie Luo    setup
3958ade67bSShijie Luo
4058ade67bSShijie Luo    sysctl -w net.ipv4.conf.veth0.arp_announce=2
4158ade67bSShijie Luo    ip netns exec "${PEER_NS}" sysctl -w net.ipv4.conf.veth1.arp_announce=2
4258ade67bSShijie Luo    ping -c5 -I veth0 127.25.3.14
4358ade67bSShijie Luo    if [ $? -ne 0 ];then
4458ade67bSShijie Luo        echo "failed"
4558ade67bSShijie Luo    else
4658ade67bSShijie Luo        echo "ok"
4758ade67bSShijie Luo    fi
4858ade67bSShijie Luo
4958ade67bSShijie Luo    cleanup
5058ade67bSShijie Luo}
5158ade67bSShijie Luo
5258ade67bSShijie Luo# Run test when arp_ignore = 3.
5358ade67bSShijie Luorun_arp_ignore_test() {
5458ade67bSShijie Luo    echo "run arp_ignore test"
5558ade67bSShijie Luo    setup
5658ade67bSShijie Luo
5758ade67bSShijie Luo    sysctl -w net.ipv4.conf.veth0.arp_ignore=3
5858ade67bSShijie Luo    ip netns exec "${PEER_NS}" sysctl -w net.ipv4.conf.veth1.arp_ignore=3
5958ade67bSShijie Luo    ping -c5 -I veth0 127.25.3.14
6058ade67bSShijie Luo    if [ $? -ne 0 ];then
6158ade67bSShijie Luo        echo "failed"
6258ade67bSShijie Luo    else
6358ade67bSShijie Luo        echo "ok"
6458ade67bSShijie Luo    fi
6558ade67bSShijie Luo
6658ade67bSShijie Luo    cleanup
6758ade67bSShijie Luo}
6858ade67bSShijie Luo
6958ade67bSShijie Luorun_all_tests() {
7058ade67bSShijie Luo    run_arp_announce_test
7158ade67bSShijie Luo    run_arp_ignore_test
7258ade67bSShijie Luo}
7358ade67bSShijie Luo
7458ade67bSShijie Luorun_all_tests
75