144 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # SPDX-License-Identifier: GPL-2.0-only
 | |
| 
 | |
| source ../../../net/net_helper.sh
 | |
| 
 | |
| NSIM_DEV_1_ID=$((256 + RANDOM % 256))
 | |
| NSIM_DEV_1_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_DEV_1_ID
 | |
| NSIM_DEV_2_ID=$((512 + RANDOM % 256))
 | |
| NSIM_DEV_2_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_DEV_2_ID
 | |
| 
 | |
| NSIM_DEV_SYS_NEW=/sys/bus/netdevsim/new_device
 | |
| NSIM_DEV_SYS_DEL=/sys/bus/netdevsim/del_device
 | |
| NSIM_DEV_SYS_LINK=/sys/bus/netdevsim/link_device
 | |
| NSIM_DEV_SYS_UNLINK=/sys/bus/netdevsim/unlink_device
 | |
| 
 | |
| socat_check()
 | |
| {
 | |
| 	if [ ! -x "$(command -v socat)" ]; then
 | |
| 		echo "socat command not found. Skipping test"
 | |
| 		return 1
 | |
| 	fi
 | |
| 
 | |
| 	return 0
 | |
| }
 | |
| 
 | |
| setup_ns()
 | |
| {
 | |
| 	set -e
 | |
| 	ip netns add nssv
 | |
| 	ip netns add nscl
 | |
| 
 | |
| 	NSIM_DEV_1_NAME=$(find $NSIM_DEV_1_SYS/net -maxdepth 1 -type d ! \
 | |
| 		-path $NSIM_DEV_1_SYS/net -exec basename {} \;)
 | |
| 	NSIM_DEV_2_NAME=$(find $NSIM_DEV_2_SYS/net -maxdepth 1 -type d ! \
 | |
| 		-path $NSIM_DEV_2_SYS/net -exec basename {} \;)
 | |
| 
 | |
| 	ip link set $NSIM_DEV_1_NAME netns nssv
 | |
| 	ip link set $NSIM_DEV_2_NAME netns nscl
 | |
| 
 | |
| 	ip netns exec nssv ip addr add '192.168.1.1/24' dev $NSIM_DEV_1_NAME
 | |
| 	ip netns exec nscl ip addr add '192.168.1.2/24' dev $NSIM_DEV_2_NAME
 | |
| 
 | |
| 	ip netns exec nssv ip link set dev $NSIM_DEV_1_NAME up
 | |
| 	ip netns exec nscl ip link set dev $NSIM_DEV_2_NAME up
 | |
| 	set +e
 | |
| }
 | |
| 
 | |
| cleanup_ns()
 | |
| {
 | |
| 	ip netns del nscl
 | |
| 	ip netns del nssv
 | |
| }
 | |
| 
 | |
| ###
 | |
| ### Code start
 | |
| ###
 | |
| 
 | |
| socat_check || exit 4
 | |
| 
 | |
| modprobe netdevsim
 | |
| 
 | |
| # linking
 | |
| 
 | |
| echo $NSIM_DEV_1_ID > $NSIM_DEV_SYS_NEW
 | |
| echo $NSIM_DEV_2_ID > $NSIM_DEV_SYS_NEW
 | |
| udevadm settle
 | |
| 
 | |
| setup_ns
 | |
| 
 | |
| NSIM_DEV_1_FD=$((256 + RANDOM % 256))
 | |
| exec {NSIM_DEV_1_FD}</var/run/netns/nssv
 | |
| NSIM_DEV_1_IFIDX=$(ip netns exec nssv cat /sys/class/net/$NSIM_DEV_1_NAME/ifindex)
 | |
| 
 | |
| NSIM_DEV_2_FD=$((256 + RANDOM % 256))
 | |
| exec {NSIM_DEV_2_FD}</var/run/netns/nscl
 | |
| NSIM_DEV_2_IFIDX=$(ip netns exec nscl cat /sys/class/net/$NSIM_DEV_2_NAME/ifindex)
 | |
| 
 | |
| echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:2000" > $NSIM_DEV_SYS_LINK 2>/dev/null
 | |
| if [ $? -eq 0 ]; then
 | |
| 	echo "linking with non-existent netdevsim should fail"
 | |
| 	cleanup_ns
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX 2000:$NSIM_DEV_2_IFIDX" > $NSIM_DEV_SYS_LINK 2>/dev/null
 | |
| if [ $? -eq 0 ]; then
 | |
| 	echo "linking with non-existent netnsid should fail"
 | |
| 	cleanup_ns
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX" > $NSIM_DEV_SYS_LINK 2>/dev/null
 | |
| if [ $? -eq 0 ]; then
 | |
| 	echo "linking with self should fail"
 | |
| 	cleanup_ns
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:$NSIM_DEV_2_IFIDX" > $NSIM_DEV_SYS_LINK
 | |
| if [ $? -ne 0 ]; then
 | |
| 	echo "linking netdevsim1 with netdevsim2 should succeed"
 | |
| 	cleanup_ns
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| # argument error checking
 | |
| 
 | |
| echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:a" > $NSIM_DEV_SYS_LINK 2>/dev/null
 | |
| if [ $? -eq 0 ]; then
 | |
| 	echo "invalid arg should fail"
 | |
| 	cleanup_ns
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| # send/recv packets
 | |
| 
 | |
| tmp_file=$(mktemp)
 | |
| ip netns exec nssv socat TCP-LISTEN:1234,fork $tmp_file &
 | |
| pid=$!
 | |
| res=0
 | |
| 
 | |
| wait_local_port_listen nssv 1234 tcp
 | |
| 
 | |
| echo "HI" | ip netns exec nscl socat STDIN TCP:192.168.1.1:1234
 | |
| 
 | |
| count=$(cat $tmp_file | wc -c)
 | |
| if [[ $count -ne 3 ]]; then
 | |
| 	echo "expected 3 bytes, got $count"
 | |
| 	res=1
 | |
| fi
 | |
| 
 | |
| echo "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX" > $NSIM_DEV_SYS_UNLINK
 | |
| 
 | |
| echo $NSIM_DEV_2_ID > $NSIM_DEV_SYS_DEL
 | |
| 
 | |
| kill $pid
 | |
| echo $NSIM_DEV_1_ID > $NSIM_DEV_SYS_DEL
 | |
| 
 | |
| cleanup_ns
 | |
| 
 | |
| modprobe -r netdevsim
 | |
| 
 | |
| exit $res
 |