1b0ced8f2SJakub Kicinski#!/bin/bash 2b0ced8f2SJakub Kicinski# SPDX-License-Identifier: GPL-2.0 3b0ced8f2SJakub Kicinski 4b0ced8f2SJakub KicinskiNS=ns 5b0ced8f2SJakub KicinskiIP4=172.16.0.1/24 6b0ced8f2SJakub KicinskiTGT4=172.16.0.2 7b0ced8f2SJakub KicinskiIP6=2001:db8:1::1/64 8b0ced8f2SJakub KicinskiTGT6=2001:db8:1::2 9b0ced8f2SJakub KicinskiMARK=1000 10b0ced8f2SJakub Kicinski 11b0ced8f2SJakub Kicinskicleanup() 12b0ced8f2SJakub Kicinski{ 13b0ced8f2SJakub Kicinski ip netns del $NS 14b0ced8f2SJakub Kicinski} 15b0ced8f2SJakub Kicinski 16b0ced8f2SJakub Kicinskitrap cleanup EXIT 17b0ced8f2SJakub Kicinski 18b0ced8f2SJakub Kicinski# Namespaces 19b0ced8f2SJakub Kicinskiip netns add $NS 20b0ced8f2SJakub Kicinski 210344488eSJakub Kicinskiip netns exec $NS sysctl -w net.ipv4.ping_group_range='0 2147483647' > /dev/null 220344488eSJakub Kicinski 23b0ced8f2SJakub Kicinski# Connectivity 24b0ced8f2SJakub Kicinskiip -netns $NS link add type dummy 25b0ced8f2SJakub Kicinskiip -netns $NS link set dev dummy0 up 26b0ced8f2SJakub Kicinskiip -netns $NS addr add $IP4 dev dummy0 27b0ced8f2SJakub Kicinskiip -netns $NS addr add $IP6 dev dummy0 28b0ced8f2SJakub Kicinski 29b0ced8f2SJakub Kicinskiip -netns $NS rule add fwmark $MARK lookup 300 30b0ced8f2SJakub Kicinskiip -6 -netns $NS rule add fwmark $MARK lookup 300 31b0ced8f2SJakub Kicinskiip -netns $NS route add prohibit any table 300 32b0ced8f2SJakub Kicinskiip -6 -netns $NS route add prohibit any table 300 33b0ced8f2SJakub Kicinski 34b0ced8f2SJakub Kicinski# Test 35b0ced8f2SJakub KicinskiBAD=0 36b0ced8f2SJakub KicinskiTOTAL=0 37b0ced8f2SJakub Kicinski 38b0ced8f2SJakub Kicinskicheck_result() { 39b0ced8f2SJakub Kicinski ((TOTAL++)) 40b0ced8f2SJakub Kicinski if [ $1 -ne $2 ]; then 41b0ced8f2SJakub Kicinski echo " Case $3 returned $1, expected $2" 42b0ced8f2SJakub Kicinski ((BAD++)) 43b0ced8f2SJakub Kicinski fi 44b0ced8f2SJakub Kicinski} 45b0ced8f2SJakub Kicinski 46*9bbfbc92SJakub Kicinskifor ovr in setsock cmsg both; do 470344488eSJakub Kicinski for i in 4 6; do 480344488eSJakub Kicinski [ $i == 4 ] && TGT=$TGT4 || TGT=$TGT6 49b0ced8f2SJakub Kicinski 500344488eSJakub Kicinski for p in u i r; do 510344488eSJakub Kicinski [ $p == "u" ] && prot=UDP 520344488eSJakub Kicinski [ $p == "i" ] && prot=ICMP 530344488eSJakub Kicinski [ $p == "r" ] && prot=RAW 540344488eSJakub Kicinski 55*9bbfbc92SJakub Kicinski [ $ovr == "setsock" ] && m="-M" 56*9bbfbc92SJakub Kicinski [ $ovr == "cmsg" ] && m="-m" 57*9bbfbc92SJakub Kicinski [ $ovr == "both" ] && m="-M $MARK -m" 580344488eSJakub Kicinski 59*9bbfbc92SJakub Kicinski ip netns exec $NS ./cmsg_sender -$i -p $p $m $((MARK + 1)) $TGT 1234 60*9bbfbc92SJakub Kicinski check_result $? 0 "$prot $ovr - pass" 61*9bbfbc92SJakub Kicinski 62*9bbfbc92SJakub Kicinski [ $ovr == "diff" ] && m="-M $((MARK + 1)) -m" 63*9bbfbc92SJakub Kicinski 64*9bbfbc92SJakub Kicinski ip netns exec $NS ./cmsg_sender -$i -p $p $m $MARK -s $TGT 1234 65*9bbfbc92SJakub Kicinski check_result $? 1 "$prot $ovr - rejection" 66*9bbfbc92SJakub Kicinski done 670344488eSJakub Kicinski done 680344488eSJakub Kicinskidone 69b0ced8f2SJakub Kicinski 70b0ced8f2SJakub Kicinski# Summary 71b0ced8f2SJakub Kicinskiif [ $BAD -ne 0 ]; then 72b0ced8f2SJakub Kicinski echo "FAIL - $BAD/$TOTAL cases failed" 73b0ced8f2SJakub Kicinski exit 1 74b0ced8f2SJakub Kicinskielse 75b0ced8f2SJakub Kicinski echo "OK" 76b0ced8f2SJakub Kicinski exit 0 77b0ced8f2SJakub Kicinskifi 78