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: Shuhei 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: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
parent
7ff4e2af79
commit
25359fb900
@ -1,11 +1,19 @@
|
|||||||
# Network configuration
|
# 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_INTERFACE="spdk_init_int"
|
||||||
|
INITIATOR_BRIDGE="init_br"
|
||||||
TARGET_NAMESPACE="spdk_iscsi_ns"
|
TARGET_NAMESPACE="spdk_iscsi_ns"
|
||||||
TARGET_NS_CMD=(ip netns exec "$TARGET_NAMESPACE")
|
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
|
# iSCSI target configuration
|
||||||
TARGET_IP=10.0.0.1
|
TARGET_IP=10.0.0.1
|
||||||
|
TARGET_IP2=10.0.0.3
|
||||||
INITIATOR_IP=10.0.0.2
|
INITIATOR_IP=10.0.0.2
|
||||||
ISCSI_PORT=3260
|
ISCSI_PORT=3260
|
||||||
NETMASK=$INITIATOR_IP/32
|
NETMASK=$INITIATOR_IP/32
|
||||||
@ -16,37 +24,78 @@ ISCSI_APP=("${TARGET_NS_CMD[@]}" "${ISCSI_APP[@]}")
|
|||||||
ISCSI_TEST_CORE_MASK=0xFF
|
ISCSI_TEST_CORE_MASK=0xFF
|
||||||
|
|
||||||
function create_veth_interfaces() {
|
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
|
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
|
trap 'cleanup_veth_interfaces; exit 1' SIGINT SIGTERM EXIT
|
||||||
|
|
||||||
# Create veth (Virtual ethernet) interface pair
|
# Create network namespace
|
||||||
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
|
|
||||||
ip netns add $TARGET_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_INTERFACE netns $TARGET_NAMESPACE
|
||||||
|
ip link set $TARGET_INTERFACE2 netns $TARGET_NAMESPACE
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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
|
# Accept connections from veth interface
|
||||||
iptables -I INPUT 1 -i $INITIATOR_INTERFACE -p tcp --dport $ISCSI_PORT -j ACCEPT
|
iptables -I INPUT 1 -i $INITIATOR_INTERFACE -p tcp --dport $ISCSI_PORT -j ACCEPT
|
||||||
|
|
||||||
"${TARGET_NS_CMD[@]}" ip link set $TARGET_INTERFACE up
|
|
||||||
|
|
||||||
"${TARGET_NS_CMD[@]}" ip link set lo up
|
|
||||||
"${TARGET_NS_CMD[@]}" ip addr add $TARGET_IP/24 dev $TARGET_INTERFACE
|
|
||||||
|
|
||||||
# Verify connectivity
|
# Verify connectivity
|
||||||
ping -c 1 $TARGET_IP
|
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() {
|
function cleanup_veth_interfaces() {
|
||||||
# Cleanup veth interfaces and network namespace
|
# Cleanup bridge, veth interfaces, and network namespace
|
||||||
# Note: removing one veth, removes the pair
|
# 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
|
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
|
ip netns del $TARGET_NAMESPACE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user