1*dfb429eaSDavid Wei#!/bin/bash
2*dfb429eaSDavid Wei# SPDX-License-Identifier: GPL-2.0-only
3*dfb429eaSDavid Wei
4*dfb429eaSDavid Weisource ../../../net/net_helper.sh
5*dfb429eaSDavid Wei
6*dfb429eaSDavid WeiNSIM_DEV_1_ID=$((256 + RANDOM % 256))
7*dfb429eaSDavid WeiNSIM_DEV_1_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_DEV_1_ID
8*dfb429eaSDavid WeiNSIM_DEV_2_ID=$((512 + RANDOM % 256))
9*dfb429eaSDavid WeiNSIM_DEV_2_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_DEV_2_ID
10*dfb429eaSDavid Wei
11*dfb429eaSDavid WeiNSIM_DEV_SYS_NEW=/sys/bus/netdevsim/new_device
12*dfb429eaSDavid WeiNSIM_DEV_SYS_DEL=/sys/bus/netdevsim/del_device
13*dfb429eaSDavid WeiNSIM_DEV_SYS_LINK=/sys/bus/netdevsim/link_device
14*dfb429eaSDavid WeiNSIM_DEV_SYS_UNLINK=/sys/bus/netdevsim/unlink_device
15*dfb429eaSDavid Wei
16*dfb429eaSDavid Weisocat_check()
17*dfb429eaSDavid Wei{
18*dfb429eaSDavid Wei	if [ ! -x "$(command -v socat)" ]; then
19*dfb429eaSDavid Wei		echo "socat command not found. Skipping test"
20*dfb429eaSDavid Wei		return 1
21*dfb429eaSDavid Wei	fi
22*dfb429eaSDavid Wei
23*dfb429eaSDavid Wei	return 0
24*dfb429eaSDavid Wei}
25*dfb429eaSDavid Wei
26*dfb429eaSDavid Weisetup_ns()
27*dfb429eaSDavid Wei{
28*dfb429eaSDavid Wei	set -e
29*dfb429eaSDavid Wei	ip netns add nssv
30*dfb429eaSDavid Wei	ip netns add nscl
31*dfb429eaSDavid Wei
32*dfb429eaSDavid Wei	NSIM_DEV_1_NAME=$(find $NSIM_DEV_1_SYS/net -maxdepth 1 -type d ! \
33*dfb429eaSDavid Wei		-path $NSIM_DEV_1_SYS/net -exec basename {} \;)
34*dfb429eaSDavid Wei	NSIM_DEV_2_NAME=$(find $NSIM_DEV_2_SYS/net -maxdepth 1 -type d ! \
35*dfb429eaSDavid Wei		-path $NSIM_DEV_2_SYS/net -exec basename {} \;)
36*dfb429eaSDavid Wei
37*dfb429eaSDavid Wei	ip link set $NSIM_DEV_1_NAME netns nssv
38*dfb429eaSDavid Wei	ip link set $NSIM_DEV_2_NAME netns nscl
39*dfb429eaSDavid Wei
40*dfb429eaSDavid Wei	ip netns exec nssv ip addr add '192.168.1.1/24' dev $NSIM_DEV_1_NAME
41*dfb429eaSDavid Wei	ip netns exec nscl ip addr add '192.168.1.2/24' dev $NSIM_DEV_2_NAME
42*dfb429eaSDavid Wei
43*dfb429eaSDavid Wei	ip netns exec nssv ip link set dev $NSIM_DEV_1_NAME up
44*dfb429eaSDavid Wei	ip netns exec nscl ip link set dev $NSIM_DEV_2_NAME up
45*dfb429eaSDavid Wei	set +e
46*dfb429eaSDavid Wei}
47*dfb429eaSDavid Wei
48*dfb429eaSDavid Weicleanup_ns()
49*dfb429eaSDavid Wei{
50*dfb429eaSDavid Wei	ip netns del nscl
51*dfb429eaSDavid Wei	ip netns del nssv
52*dfb429eaSDavid Wei}
53*dfb429eaSDavid Wei
54*dfb429eaSDavid Wei###
55*dfb429eaSDavid Wei### Code start
56*dfb429eaSDavid Wei###
57*dfb429eaSDavid Wei
58*dfb429eaSDavid Weisocat_check || exit 4
59*dfb429eaSDavid Wei
60*dfb429eaSDavid Weimodprobe netdevsim
61*dfb429eaSDavid Wei
62*dfb429eaSDavid Wei# linking
63*dfb429eaSDavid Wei
64*dfb429eaSDavid Weiecho $NSIM_DEV_1_ID > $NSIM_DEV_SYS_NEW
65*dfb429eaSDavid Weiecho $NSIM_DEV_2_ID > $NSIM_DEV_SYS_NEW
66*dfb429eaSDavid Weiudevadm settle
67*dfb429eaSDavid Wei
68*dfb429eaSDavid Weisetup_ns
69*dfb429eaSDavid Wei
70*dfb429eaSDavid WeiNSIM_DEV_1_FD=$((256 + RANDOM % 256))
71*dfb429eaSDavid Weiexec {NSIM_DEV_1_FD}</var/run/netns/nssv
72*dfb429eaSDavid WeiNSIM_DEV_1_IFIDX=$(ip netns exec nssv cat /sys/class/net/$NSIM_DEV_1_NAME/ifindex)
73*dfb429eaSDavid Wei
74*dfb429eaSDavid WeiNSIM_DEV_2_FD=$((256 + RANDOM % 256))
75*dfb429eaSDavid Weiexec {NSIM_DEV_2_FD}</var/run/netns/nscl
76*dfb429eaSDavid WeiNSIM_DEV_2_IFIDX=$(ip netns exec nscl cat /sys/class/net/$NSIM_DEV_2_NAME/ifindex)
77*dfb429eaSDavid Wei
78*dfb429eaSDavid Weiecho "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:2000" > $NSIM_DEV_SYS_LINK 2>/dev/null
79*dfb429eaSDavid Weiif [ $? -eq 0 ]; then
80*dfb429eaSDavid Wei	echo "linking with non-existent netdevsim should fail"
81*dfb429eaSDavid Wei	cleanup_ns
82*dfb429eaSDavid Wei	exit 1
83*dfb429eaSDavid Weifi
84*dfb429eaSDavid Wei
85*dfb429eaSDavid Weiecho "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX 2000:$NSIM_DEV_2_IFIDX" > $NSIM_DEV_SYS_LINK 2>/dev/null
86*dfb429eaSDavid Weiif [ $? -eq 0 ]; then
87*dfb429eaSDavid Wei	echo "linking with non-existent netnsid should fail"
88*dfb429eaSDavid Wei	cleanup_ns
89*dfb429eaSDavid Wei	exit 1
90*dfb429eaSDavid Weifi
91*dfb429eaSDavid Wei
92*dfb429eaSDavid Weiecho "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX" > $NSIM_DEV_SYS_LINK 2>/dev/null
93*dfb429eaSDavid Weiif [ $? -eq 0 ]; then
94*dfb429eaSDavid Wei	echo "linking with self should fail"
95*dfb429eaSDavid Wei	cleanup_ns
96*dfb429eaSDavid Wei	exit 1
97*dfb429eaSDavid Weifi
98*dfb429eaSDavid Wei
99*dfb429eaSDavid Weiecho "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:$NSIM_DEV_2_IFIDX" > $NSIM_DEV_SYS_LINK
100*dfb429eaSDavid Weiif [ $? -ne 0 ]; then
101*dfb429eaSDavid Wei	echo "linking netdevsim1 with netdevsim2 should succeed"
102*dfb429eaSDavid Wei	cleanup_ns
103*dfb429eaSDavid Wei	exit 1
104*dfb429eaSDavid Weifi
105*dfb429eaSDavid Wei
106*dfb429eaSDavid Wei# argument error checking
107*dfb429eaSDavid Wei
108*dfb429eaSDavid Weiecho "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX $NSIM_DEV_2_FD:a" > $NSIM_DEV_SYS_LINK 2>/dev/null
109*dfb429eaSDavid Weiif [ $? -eq 0 ]; then
110*dfb429eaSDavid Wei	echo "invalid arg should fail"
111*dfb429eaSDavid Wei	cleanup_ns
112*dfb429eaSDavid Wei	exit 1
113*dfb429eaSDavid Weifi
114*dfb429eaSDavid Wei
115*dfb429eaSDavid Wei# send/recv packets
116*dfb429eaSDavid Wei
117*dfb429eaSDavid Weitmp_file=$(mktemp)
118*dfb429eaSDavid Weiip netns exec nssv socat TCP-LISTEN:1234,fork $tmp_file &
119*dfb429eaSDavid Weipid=$!
120*dfb429eaSDavid Weires=0
121*dfb429eaSDavid Wei
122*dfb429eaSDavid Weiwait_local_port_listen nssv 1234 tcp
123*dfb429eaSDavid Wei
124*dfb429eaSDavid Weiecho "HI" | ip netns exec nscl socat STDIN TCP:192.168.1.1:1234
125*dfb429eaSDavid Wei
126*dfb429eaSDavid Weicount=$(cat $tmp_file | wc -c)
127*dfb429eaSDavid Weiif [[ $count -ne 3 ]]; then
128*dfb429eaSDavid Wei	echo "expected 3 bytes, got $count"
129*dfb429eaSDavid Wei	res=1
130*dfb429eaSDavid Weifi
131*dfb429eaSDavid Wei
132*dfb429eaSDavid Weiecho "$NSIM_DEV_1_FD:$NSIM_DEV_1_IFIDX" > $NSIM_DEV_SYS_UNLINK
133*dfb429eaSDavid Wei
134*dfb429eaSDavid Weiecho $NSIM_DEV_2_ID > $NSIM_DEV_SYS_DEL
135*dfb429eaSDavid Wei
136*dfb429eaSDavid Weikill $pid
137*dfb429eaSDavid Weiecho $NSIM_DEV_1_ID > $NSIM_DEV_SYS_DEL
138*dfb429eaSDavid Wei
139*dfb429eaSDavid Weicleanup_ns
140*dfb429eaSDavid Wei
141*dfb429eaSDavid Weimodprobe -r netdevsim
142*dfb429eaSDavid Wei
143*dfb429eaSDavid Weiexit $res
144