#!/bin/bash # SPDX-License-Identifier: GPL-2.0 source ppp_common.sh VETH_SERVER="veth-server" VETH_CLIENT="veth-client" PPPOE_LOG=$(mktemp /tmp/pppoe.XXXXXX) # shellcheck disable=SC2329 cleanup() { cleanup_all_ns [ -n "$SOCAT_PID" ] && kill_process "$SOCAT_PID" rm -f "$PPPOE_LOG" } trap cleanup EXIT require_command pppoe-server ppp_common_init modprobe -q pppoe # Try to locate pppoe.so plugin PPPOE_PLUGIN=$(find /usr/{lib,lib64,lib32}/pppd/ -name pppoe.so -type f -print -quit) if [ -z "$PPPOE_PLUGIN" ]; then log_test_skip "PPPoE: pppoe.so plugin not found" exit "$EXIT_STATUS" fi # 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 # Start socat as syslog listener socat -v -u UNIX-RECV:/dev/log OPEN:/dev/null > "$PPPOE_LOG" 2>&1 & SOCAT_PID=$! # Start the PPP Server. Note that versions before 4.0 ignore -g option and # instead use a hardcoded plugin path, so they may fail to find the plugin. ip netns exec "$NS_SERVER" pppoe-server -I "$VETH_SERVER" \ -L "$IP_SERVER" -R "$IP_CLIENT" -N 1 -q "$(command -v pppd)" \ -k -O "$(pwd)/pppoe-server-options" -g "$PPPOE_PLUGIN" # Start the PPP Client ip netns exec "$NS_CLIENT" pppd \ local debug updetach noipdefault noauth nodefaultroute \ plugin "$PPPOE_PLUGIN" nic-"$VETH_CLIENT" ppp_test_connectivity log_test "PPPoE" # Dump syslog messages if the test failed if [ "$RET" -ne 0 ]; then while read -r _sign _date _time len _from _to do len=${len##*=} read -n "$len" -r LINE echo "$LINE" done < "$PPPOE_LOG" fi exit "$EXIT_STATUS"