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>
153 lines
4.4 KiB
Bash
153 lines
4.4 KiB
Bash
# Network configuration
|
|
# 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
|
|
INITIATOR_TAG=2
|
|
INITIATOR_NAME=ANY
|
|
PORTAL_TAG=1
|
|
ISCSI_APP=("${TARGET_NS_CMD[@]}" "${ISCSI_APP[@]}")
|
|
ISCSI_TEST_CORE_MASK=0xFF
|
|
|
|
function create_veth_interfaces() {
|
|
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 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
|
|
|
|
# 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
|
|
iptables -I INPUT 1 -i $INITIATOR_INTERFACE -p tcp --dport $ISCSI_PORT -j ACCEPT
|
|
|
|
# Verify connectivity
|
|
ping -c 1 $TARGET_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 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
|
|
}
|
|
|
|
function iscsitestinit() {
|
|
if [ "$TEST_MODE" == "iso" ]; then
|
|
$rootdir/scripts/setup.sh
|
|
create_veth_interfaces
|
|
fi
|
|
}
|
|
|
|
function waitforiscsidevices() {
|
|
local num=$1
|
|
|
|
for ((i = 1; i <= 20; i++)); do
|
|
n=$(iscsiadm -m session -P 3 | grep -c "Attached scsi disk sd[a-z]*" || true)
|
|
if [ $n -ne $num ]; then
|
|
sleep 0.1
|
|
else
|
|
return 0
|
|
fi
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
function iscsitestfini() {
|
|
if [ "$TEST_MODE" == "iso" ]; then
|
|
cleanup_veth_interfaces
|
|
$rootdir/scripts/setup.sh reset
|
|
fi
|
|
}
|
|
|
|
function initiator_json_config() {
|
|
# Prepare config file for iSCSI initiator
|
|
jq . <<- JSON
|
|
{
|
|
"subsystems": [
|
|
{
|
|
"subsystem": "bdev",
|
|
"config": [
|
|
{
|
|
"method": "bdev_iscsi_create",
|
|
"params": {
|
|
"name": "iSCSI0",
|
|
"url": "iscsi://$TARGET_IP/iqn.2016-06.io.spdk:disk1/0",
|
|
"initiator_iqn": "iqn.2016-06.io.spdk:disk1/0"
|
|
}
|
|
}${*:+,$*}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
JSON
|
|
}
|