Commit 25359fb9 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

test/iscsi_tgt: Virtual network made of three interfaces using veth and bridge



To test iSCSI login redirection feature, we need multiple IP addresses
for target application. Furthermore, it is nice if multiple iSCSI
target applications run.

This patch creates such network virtually using veth device and
ether bridge but keeps compatibility even after this patch.

Create three veth interface pairs and one bridge. One pair is for
initiator and two pairs are for targets, and all pairs are
added to the same bridge.

Create two network namespaces for targets and add one pair to
the first namespace and add another pair to the second namespace.
Namespace is not created for initiator.

Necessary connectivity is tested using ping after creation.

iSCSI login redirection test code will follow.

Signed-off-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: If0ca7b4a7af652602f3d6a7ea5669a06ce41a5f1
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3887


Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent 7ff4e2af
Loading
Loading
Loading
Loading
+63 −14
Original line number Diff line number Diff line
# Network configuration
TARGET_INTERFACE="spdk_tgt_int"
# There is one initiator interface and it is accessed directly.
# There are two target interfaces and they are accessed through an namespace.
ISCSI_BRIDGE="iscsi_br"
INITIATOR_INTERFACE="spdk_init_int"
INITIATOR_BRIDGE="init_br"
TARGET_NAMESPACE="spdk_iscsi_ns"
TARGET_NS_CMD=(ip netns exec "$TARGET_NAMESPACE")
TARGET_INTERFACE="spdk_tgt_int"
TARGET_INTERFACE2="spdk_tgt_int2"
TARGET_BRIDGE="tgt_br"
TARGET_BRIDGE2="tgt_br2"

# iSCSI target configuration
TARGET_IP=10.0.0.1
TARGET_IP2=10.0.0.3
INITIATOR_IP=10.0.0.2
ISCSI_PORT=3260
NETMASK=$INITIATOR_IP/32
@@ -16,37 +24,78 @@ ISCSI_APP=("${TARGET_NS_CMD[@]}" "${ISCSI_APP[@]}")
ISCSI_TEST_CORE_MASK=0xFF

function create_veth_interfaces() {
	ip netns del $TARGET_NAMESPACE || true
	ip link set $INITIATOR_BRIDGE nomaster || true
	ip link set $TARGET_BRIDGE nomaster || true
	ip link set $TARGET_BRIDGE2 nomaster || true
	ip link set $INITIATOR_BRIDGE down || true
	ip link set $TARGET_BRIDGE down || true
	ip link set $TARGET_BRIDGE2 down || true
	ip link delete $ISCSI_BRIDGE type bridge || true
	ip link delete $INITIATOR_INTERFACE || true
	"${TARGET_NS_CMD[@]}" ip link delete $TARGET_INTERFACE || true
	"${TARGET_NS_CMD[@]}" ip link delete $TARGET_INTERFACE2 || true
	ip netns del $TARGET_NAMESPACE || true

	trap 'cleanup_veth_interfaces; exit 1' SIGINT SIGTERM EXIT

	# Create veth (Virtual ethernet) interface pair
	ip link add $INITIATOR_INTERFACE type veth peer name $TARGET_INTERFACE
	ip addr add $INITIATOR_IP/24 dev $INITIATOR_INTERFACE
	ip link set $INITIATOR_INTERFACE up

	# Create and add interface for target to network namespace
	# Create network namespace
	ip netns add $TARGET_NAMESPACE

	# Create veth (Virtual ethernet) interface pairs
	ip link add $INITIATOR_INTERFACE type veth peer name $INITIATOR_BRIDGE
	ip link add $TARGET_INTERFACE type veth peer name $TARGET_BRIDGE
	ip link add $TARGET_INTERFACE2 type veth peer name $TARGET_BRIDGE2

	# Associate veth interface pairs with network namespace
	ip link set $TARGET_INTERFACE netns $TARGET_NAMESPACE
	ip link set $TARGET_INTERFACE2 netns $TARGET_NAMESPACE

	# Accept connections from veth interface
	iptables -I INPUT 1 -i $INITIATOR_INTERFACE -p tcp --dport $ISCSI_PORT -j ACCEPT
	# Allocate IP addresses
	ip addr add $INITIATOR_IP/24 dev $INITIATOR_INTERFACE
	"${TARGET_NS_CMD[@]}" ip addr add $TARGET_IP/24 dev $TARGET_INTERFACE
	"${TARGET_NS_CMD[@]}" ip addr add $TARGET_IP2/24 dev $TARGET_INTERFACE2

	# Link up veth interfaces
	ip link set $INITIATOR_INTERFACE up
	ip link set $INITIATOR_BRIDGE up
	ip link set $TARGET_BRIDGE up
	ip link set $TARGET_BRIDGE2 up
	"${TARGET_NS_CMD[@]}" ip link set $TARGET_INTERFACE up

	"${TARGET_NS_CMD[@]}" ip link set $TARGET_INTERFACE2 up
	"${TARGET_NS_CMD[@]}" ip link set lo up
	"${TARGET_NS_CMD[@]}" ip addr add $TARGET_IP/24 dev $TARGET_INTERFACE

	# Create a bridge
	ip link add $ISCSI_BRIDGE type bridge
	ip link set $ISCSI_BRIDGE up

	# Add veth interfaces to the bridge
	ip link set $INITIATOR_BRIDGE master $ISCSI_BRIDGE
	ip link set $TARGET_BRIDGE master $ISCSI_BRIDGE
	ip link set $TARGET_BRIDGE2 master $ISCSI_BRIDGE

	# Accept connections from veth interface
	iptables -I INPUT 1 -i $INITIATOR_INTERFACE -p tcp --dport $ISCSI_PORT -j ACCEPT

	# Verify connectivity
	ping -c 1 $TARGET_IP
	ip netns exec $TARGET_NAMESPACE ping -c 1 $INITIATOR_IP
	ping -c 1 $TARGET_IP2
	"${TARGET_NS_CMD[@]}" ping -c 1 $INITIATOR_IP
	"${TARGET_NS_CMD[@]}" ping -c 1 $INITIATOR_IP
}

function cleanup_veth_interfaces() {
	# Cleanup veth interfaces and network namespace
	# Cleanup bridge, veth interfaces, and network namespace
	# Note: removing one veth, removes the pair
	ip link set $INITIATOR_BRIDGE nomaster
	ip link set $TARGET_BRIDGE nomaster
	ip link set $TARGET_BRIDGE2 nomaster
	ip link set $INITIATOR_BRIDGE down
	ip link set $TARGET_BRIDGE down
	ip link set $TARGET_BRIDGE2 down
	ip link delete $ISCSI_BRIDGE type bridge
	ip link delete $INITIATOR_INTERFACE
	"${TARGET_NS_CMD[@]}" ip link delete $TARGET_INTERFACE
	"${TARGET_NS_CMD[@]}" ip link delete $TARGET_INTERFACE2
	ip netns del $TARGET_NAMESPACE
}