| #!/bin/bash | |
| # SPDX-License-Identifier: GPL-2.0 | |
| source ppp_common.sh | |
| VETH_SERVER="veth-server" | |
| VETH_CLIENT="veth-client" | |
| OUTER_IP_SERVER="172.16.1.1" | |
| OUTER_IP_CLIENT="172.16.1.2" | |
| PPPOL2TP_DIR=$(mktemp -d /tmp/pppol2tp.XXXXXX) | |
| PPPOL2TP_LOG="$PPPOL2TP_DIR/l2tp.log" | |
| # shellcheck disable=SC2329 | |
| cleanup() { | |
| cleanup_all_ns | |
| [ -n "$SOCAT_PID" ] && kill_process "$SOCAT_PID" | |
| rm -rf "$PPPOL2TP_DIR" | |
| } | |
| trap cleanup EXIT | |
| require_command xl2tpd | |
| ppp_common_init | |
| modprobe -q l2tp_ppp | |
| # Create the veth pair | |
| ip link add "$VETH_SERVER" type veth peer name "$VETH_CLIENT" | |
| ip link set "$VETH_SERVER" netns "$NS_SERVER" | |
| ip link set "$VETH_CLIENT" netns "$NS_CLIENT" | |
| ip -netns "$NS_SERVER" link set "$VETH_SERVER" up | |
| ip -netns "$NS_CLIENT" link set "$VETH_CLIENT" up | |
| ip -netns "$NS_SERVER" address add dev "$VETH_SERVER" "$OUTER_IP_SERVER" peer "$OUTER_IP_CLIENT" | |
| ip -netns "$NS_CLIENT" address add dev "$VETH_CLIENT" "$OUTER_IP_CLIENT" peer "$OUTER_IP_SERVER" | |
| # Start socat as syslog listener | |
| socat -v -u UNIX-RECV:/dev/log OPEN:/dev/null > "$PPPOL2TP_LOG" 2>&1 & | |
| SOCAT_PID=$! | |
| # Generate configuration files | |
| cat > "$PPPOL2TP_DIR/l2tp-server.conf" <<EOF | |
| [global] | |
| listen-addr = $OUTER_IP_SERVER | |
| access control = no | |
| [lns default] | |
| ip range = $IP_CLIENT | |
| local ip = $IP_SERVER | |
| require authentication = no | |
| require chap = no | |
| require pap = no | |
| ppp debug = yes | |
| pppoptfile = $(pwd)/pppoe-server-options | |
| EOF | |
| cat > "$PPPOL2TP_DIR/l2tp-client.conf" <<EOF | |
| [global] | |
| listen-addr = $OUTER_IP_CLIENT | |
| access control = no | |
| [lac server] | |
| lns = $OUTER_IP_SERVER | |
| require authentication = no | |
| require chap = no | |
| require pap = no | |
| ppp debug = yes | |
| pppoptfile = $(pwd)/pppoe-server-options | |
| EOF | |
| # Start the L2TP Server | |
| ip netns exec "$NS_SERVER" xl2tpd -D -c "$PPPOL2TP_DIR/l2tp-server.conf" \ | |
| -p "$PPPOL2TP_DIR/l2tp-server.pid" -C "$PPPOL2TP_DIR/l2tp-server.control" & | |
| # Start the L2TP Client | |
| ip netns exec "$NS_CLIENT" xl2tpd -D -c "$PPPOL2TP_DIR/l2tp-client.conf" \ | |
| -p "$PPPOL2TP_DIR/l2tp-client.pid" -C "$PPPOL2TP_DIR/l2tp-client.control" & | |
| # Wait for xl2tpd to start and open their control pipes | |
| slowwait 2 [ -p "$PPPOL2TP_DIR/l2tp-server.control" ] | |
| slowwait 2 [ -p "$PPPOL2TP_DIR/l2tp-client.control" ] | |
| # Connect LAC to LNS | |
| echo "c server" > "$PPPOL2TP_DIR/l2tp-client.control" | |
| ppp_test_connectivity | |
| log_test "PPPoL2TP" | |
| # Recursion test | |
| RET=0 | |
| # Delete route to LNS IP | |
| ip -netns "$NS_CLIENT" route del "$OUTER_IP_SERVER" | |
| # Add default route through ppp0 | |
| ip -netns "$NS_CLIENT" route add default dev ppp0 | |
| # ping (we expect the ping to fail but not deadlock the system) | |
| ip netns exec "$NS_CLIENT" ping -c 1 "$IP_SERVER" -w 1 | |
| check_fail $? | |
| log_test "PPPoL2TP Recursion" | |
| # Dump syslog messages if the test failed | |
| if [ "$EXIT_STATUS" -ne 0 ]; then | |
| while read -r _sign _date _time len _from _to | |
| do len=${len##*=} | |
| read -n "$len" -r LINE | |
| echo "$LINE" | |
| done < "$PPPOL2TP_LOG" | |
| fi | |
| exit "$EXIT_STATUS" |