#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # # Author: Brett A C Sheffield # Author: Oscar Maes # # Ensure destination ethernet field is correctly set for # broadcast packets source lib.sh CLIENT_IP4="192.168.0.1" GW_IP4="192.168.0.2" setup() { setup_ns CLIENT_NS SERVER_NS ip -net "${SERVER_NS}" link add link1 type veth \ peer name link0 netns "${CLIENT_NS}" ip -net "${CLIENT_NS}" link set link0 up ip -net "${CLIENT_NS}" addr add "${CLIENT_IP4}"/24 dev link0 ip -net "${SERVER_NS}" link set link1 up ip -net "${CLIENT_NS}" route add default via "${GW_IP4}" ip netns exec "${CLIENT_NS}" arp -s "${GW_IP4}" 00:11:22:33:44:55 } cleanup() { rm -f "${CAPFILE}" "${OUTPUT}" ip -net "${SERVER_NS}" link del link1 cleanup_ns "${CLIENT_NS}" "${SERVER_NS}" } test_broadcast_ether_dst() { local rc=0 CAPFILE=$(mktemp -u cap.XXXXXXXXXX) OUTPUT=$(mktemp -u out.XXXXXXXXXX) echo "Testing ethernet broadcast destination" # start tcpdump listening for icmp # tcpdump will exit after receiving a single packet # timeout will kill tcpdump if it is still running after 2s timeout 2s ip netns exec "${CLIENT_NS}" \ tcpdump -i link0 -c 1 -w "${CAPFILE}" icmp &> "${OUTPUT}" & pid=$! slowwait 1 grep -qs "listening" "${OUTPUT}" # send broadcast ping ip netns exec "${CLIENT_NS}" \ ping -W0.01 -c1 -b 255.255.255.255 &> /dev/null # wait for tcpdump for exit after receiving packet wait "${pid}" # compare ethernet destination field to ff:ff:ff:ff:ff:ff ether_dst=$(tcpdump -r "${CAPFILE}" -tnne 2>/dev/null | \ awk '{sub(/,/,"",$3); print $3}') if [[ "${ether_dst}" == "ff:ff:ff:ff:ff:ff" ]]; then echo "[ OK ]" rc="${ksft_pass}" else echo "[FAIL] expected dst ether addr to be ff:ff:ff:ff:ff:ff," \ "got ${ether_dst}" rc="${ksft_fail}" fi return "${rc}" } if [ ! -x "$(command -v tcpdump)" ]; then echo "SKIP: Could not run test without tcpdump tool" exit "${ksft_skip}" fi trap cleanup EXIT setup test_broadcast_ether_dst exit $?