1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0-only 3 4lib_dir=$(dirname $0)/../../../net 5source $lib_dir/lib.sh 6 7NSIM_DEV_1_ID=$((256 + RANDOM % 256)) 8NSIM_DEV_1_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_DEV_1_ID 9NSIM_DEV_2_ID=$((512 + RANDOM % 256)) 10NSIM_DEV_2_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_DEV_2_ID 11 12NSIM_DEV_SYS_NEW=/sys/bus/netdevsim/new_device 13NSIM_DEV_SYS_DEL=/sys/bus/netdevsim/del_device 14NSIM_DEV_SYS_LINK=/sys/bus/netdevsim/link_device 15NSIM_DEV_SYS_UNLINK=/sys/bus/netdevsim/unlink_device 16 17socat_check() 18{ 19 if [ ! -x "$(command -v socat)" ]; then 20 echo "socat command not found. Skipping test" 21 return 1 22 fi 23 24 return 0 25} 26 27setup_ns() 28{ 29 set -e 30 ip netns add nssv 31 ip netns add nscl 32 33 NSIM_DEV_1_NAME=$(find $NSIM_DEV_1_SYS/net -maxdepth 1 -type d ! \ 34 -path $NSIM_DEV_1_SYS/net -exec basename {} \;) 35 NSIM_DEV_2_NAME=$(find $NSIM_DEV_2_SYS/net -maxdepth 1 -type d ! \ 36 -path $NSIM_DEV_2_SYS/net -exec basename {} \;) 37 38 ip link set $NSIM_DEV_1_NAME netns nssv 39 ip link set $NSIM_DEV_2_NAME netns nscl 40 41 ip netns exec nssv ip addr add '192.168.1.1/24' dev $NSIM_DEV_1_NAME 42 ip netns exec nscl ip addr add '192.168.1.2/24' dev $NSIM_DEV_2_NAME 43 44 ip netns exec nssv ip link set dev $NSIM_DEV_1_NAME up 45 ip netns exec nscl ip link set dev $NSIM_DEV_2_NAME up 46 set +e 47} 48 49cleanup_ns() 50{ 51 ip netns del nscl 52 ip netns del nssv 53} 54 55is_carrier_up() 56{ 57 local netns="$1" 58 local nsim_dev="$2" 59 60 test "$(ip netns exec "$netns" \ 61 cat /sys/class/net/"$nsim_dev"/carrier 2>/dev/null)" -eq 1 62} 63 64assert_carrier_up() 65{ 66 local netns="$1" 67 local nsim_dev="$2" 68 69 if ! is_carrier_up "$netns" "$nsim_dev"; then 70 echo "$nsim_dev's carrier should be UP, but it isn't" 71 cleanup_ns 72 exit 1 73 fi 74} 75 76assert_carrier_down() 77{ 78 local netns="$1" 79 local nsim_dev="$2" 80 81 if is_carrier_up "$netns" "$nsim_dev"; then 82 echo "$nsim_dev's carrier should be DOWN, but it isn't" 83 cleanup_ns 84 exit 1 85 fi 86} 87 88### 89### Code start 90### 91 92socat_check || exit 4 93 94modprobe netdevsim 95 96# linking 97 98echo $NSIM_DEV_1_ID > $NSIM_DEV_SYS_NEW 99echo $NSIM_DEV_2_ID > $NSIM_DEV_SYS_NEW 100udevadm settle 101 102setup_ns 103 104NSIM_DEV_1_FD=$((256 + RANDOM % 256)) 105exec {NSIM_DEV_1_FD}</var/run/netns/nssv 106NSIM_DEV_1_IFIDX=$(ip netns exec nssv cat /sys/class/net/$NSIM_DEV_1_NAME/ifindex) 107 108NSIM_DEV_2_FD=$((256 + RANDOM % 256)) 109exec {NSIM_DEV_2_FD}</var/run/netns/nscl 110NSIM_DEV_2_IFIDX=$(ip netns exec nscl cat /sys/class/net/$NSIM_DEV_2_NAME/ifindex) 111 112echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:2000" > $NSIM_DEV_SYS_LINK 2>/dev/null 113if [ $? -eq 0 ]; then 114 echo "linking with non-existent netdevsim should fail" 115 cleanup_ns 116 exit 1 117fi 118 119echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX 2000:$NSIM_DEV_2_IFIDX" > $NSIM_DEV_SYS_LINK 2>/dev/null 120if [ $? -eq 0 ]; then 121 echo "linking with non-existent netnsid should fail" 122 cleanup_ns 123 exit 1 124fi 125 126echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX" > $NSIM_DEV_SYS_LINK 2>/dev/null 127if [ $? -eq 0 ]; then 128 echo "linking with self should fail" 129 cleanup_ns 130 exit 1 131fi 132 133echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:$NSIM_DEV_2_IFIDX" > $NSIM_DEV_SYS_LINK 134if [ $? -ne 0 ]; then 135 echo "linking netdevsim1 with netdevsim2 should succeed" 136 cleanup_ns 137 exit 1 138fi 139 140# argument error checking 141 142echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:a" > $NSIM_DEV_SYS_LINK 2>/dev/null 143if [ $? -eq 0 ]; then 144 echo "invalid arg should fail" 145 cleanup_ns 146 exit 1 147fi 148 149# netdevsim carrier state consistency checking 150assert_carrier_up nssv "$NSIM_DEV_1_NAME" 151assert_carrier_up nscl "$NSIM_DEV_2_NAME" 152 153echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX" > "$NSIM_DEV_SYS_UNLINK" 154 155assert_carrier_down nssv "$NSIM_DEV_1_NAME" 156assert_carrier_down nscl "$NSIM_DEV_2_NAME" 157 158ip netns exec nssv ip link set dev "$NSIM_DEV_1_NAME" down 159ip netns exec nssv ip link set dev "$NSIM_DEV_1_NAME" up 160 161assert_carrier_down nssv "$NSIM_DEV_1_NAME" 162assert_carrier_down nscl "$NSIM_DEV_2_NAME" 163 164echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:$NSIM_DEV_2_IFIDX" > $NSIM_DEV_SYS_LINK 165 166assert_carrier_up nssv "$NSIM_DEV_1_NAME" 167assert_carrier_up nscl "$NSIM_DEV_2_NAME" 168 169ip netns exec nssv ip link set dev "$NSIM_DEV_1_NAME" down 170ip netns exec nssv ip link set dev "$NSIM_DEV_1_NAME" up 171 172assert_carrier_up nssv "$NSIM_DEV_1_NAME" 173assert_carrier_up nscl "$NSIM_DEV_2_NAME" 174 175# send/recv packets 176 177tmp_file=$(mktemp) 178ip netns exec nssv socat TCP-LISTEN:1234,fork $tmp_file & 179pid=$! 180res=0 181 182wait_local_port_listen nssv 1234 tcp 183 184echo "HI" | ip netns exec nscl socat STDIN TCP:192.168.1.1:1234 185 186count=$(cat $tmp_file | wc -c) 187if [[ $count -ne 3 ]]; then 188 echo "expected 3 bytes, got $count" 189 res=1 190fi 191 192echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX" > $NSIM_DEV_SYS_UNLINK 193 194echo $NSIM_DEV_2_ID > $NSIM_DEV_SYS_DEL 195 196kill $pid 197echo $NSIM_DEV_1_ID > $NSIM_DEV_SYS_DEL 198 199cleanup_ns 200 201modprobe -r netdevsim 202 203exit $res 204