def_traddr="127.0.0.1"
def_adrfam="ipv4"
def_trsvcid="4420"
+def_remote_wwnn="0x10001100aa000001"
+def_remote_wwpn="0x20001100aa000001"
+def_local_wwnn="0x10001100aa000002"
+def_local_wwpn="0x20001100aa000002"
def_hostnqn="$(cat /etc/nvme/hostnqn 2> /dev/null)"
def_hostid="$(cat /etc/nvme/hostid 2> /dev/null)"
nvme_trtype=${nvme_trtype:-"loop"}
_have_program rdma
_have_driver rdma_rxe || _have_driver siw
;;
+ fc)
+ _have_driver nvme-fc
+ _have_driver nvme-fcloop
+ _have_configfs
+ def_adrfam="fc"
+ ;;
*)
SKIP_REASONS+=("unsupported nvme_trtype=${nvme_trtype}")
return 1
;;
ipv4)
;; # was already set
+ fc)
+ def_adrfam="fc"
+ ;;
*)
# ignore for non ip transports
if [[ "${nvme_trtype}" == "tcp" ||
cat "${TEST_DEV_SYSFS}/nsid"
}
+_nvme_fcloop_add_rport() {
+ local local_wwnn="$1"
+ local local_wwpn="$2"
+ local remote_wwnn="$3"
+ local remote_wwpn="$4"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${remote_wwnn},wwpn=${remote_wwpn},lpwwnn=${local_wwnn},lpwwpn=${local_wwpn},roles=0x60" > ${loopctl}/add_remote_port
+}
+
+_nvme_fcloop_add_lport() {
+ local wwnn="$1"
+ local wwpn="$2"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${wwnn},wwpn=${wwpn}" > ${loopctl}/add_local_port
+}
+
+_nvme_fcloop_add_tport() {
+ local wwnn="$1"
+ local wwpn="$2"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${wwnn},wwpn=${wwpn}" > ${loopctl}/add_target_port
+}
+
+_setup_fcloop() {
+ local local_wwnn="${1:-$def_local_wwnn}"
+ local local_wwpn="${2:-$def_local_wwpn}"
+ local remote_wwnn="${3:-$def_remote_wwnn}"
+ local remote_wwpn="${4:-$def_remote_wwpn}"
+
+ _nvme_fcloop_add_tport "${remote_wwnn}" "${remote_wwpn}"
+ _nvme_fcloop_add_lport "${local_wwnn}" "${local_wwpn}"
+ _nvme_fcloop_add_rport "${local_wwnn}" "${local_wwpn}" \
+ "${remote_wwnn}" "${remote_wwpn}"
+}
+
+_nvme_fcloop_del_rport() {
+ local local_wwnn="$1"
+ local local_wwpn="$2"
+ local remote_wwnn="$3"
+ local remote_wwpn="$4"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${remote_wwnn},wwpn=${remote_wwpn}" > ${loopctl}/del_remote_port 2> /dev/null
+}
+
+_nvme_fcloop_del_lport() {
+ local wwnn="$1"
+ local wwpn="$2"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${wwnn},wwpn=${wwpn}" > ${loopctl}/del_local_port 2> /dev/null
+}
+
+_nvme_fcloop_del_tport() {
+ local wwnn="$1"
+ local wwpn="$2"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${wwnn},wwpn=${wwpn}" > ${loopctl}/del_target_port 2> /dev/null
+}
+
+_cleanup_fcloop() {
+ local local_wwnn="${1:-$def_local_wwnn}"
+ local local_wwpn="${2:-$def_local_wwpn}"
+ local remote_wwnn="${3:-$def_remote_wwnn}"
+ local remote_wwpn="${4:-$def_remote_wwpn}"
+
+ _nvme_fcloop_del_rport "${local_wwnn}" "${local_wwpn}" \
+ "${remote_wwnn}" "${remote_wwpn}"
+ _nvme_fcloop_del_tport "${remote_wwnn}" "${remote_wwpn}"
+ _nvme_fcloop_del_lport "${local_wwnn}" "${local_wwpn}"
+}
+
_cleanup_nvmet() {
local dev
local port
if [[ "${nvme_trtype}" == "rdma" ]]; then
stop_soft_rdma
fi
+ if [[ "${nvme_trtype}" == "fc" ]]; then
+ _cleanup_fcloop "${def_local_wwnn}" "${def_local_wwpn}" \
+ "${def_remote_wwnn}" "${def_remote_wwpn}"
+ fi
}
_setup_nvmet() {
fi
done
fi
+ if [[ "${nvme_trtype}" = "fc" ]]; then
+ modprobe -q nvme-fcloop
+ _setup_fcloop "${def_local_wwnn}" "${def_local_wwpn}" \
+ "${def_remote_wwnn}" "${def_remote_wwpn}"
+
+ def_traddr=$(printf "nn-%s:pn-%s" \
+ "${def_remote_wwnn}" \
+ "${def_remote_wwpn}")
+ def_host_traddr=$(printf "nn-%s:pn-%s" \
+ "${def_local_wwnn}" \
+ "${def_local_wwpn}")
+ fi
}
_nvme_disconnect_ctrl() {
local trtype="$1"
local subsysnqn="$2"
local traddr="${3:-$def_traddr}"
+ local host_traddr="${4:-$def_host_traddr}"
local trsvcid="${4:-$def_trsvcid}"
local hostnqn="${5:-$def_hostnqn}"
local hostid="${6:-$def_hostid}"
local ctrlkey="${8}"
ARGS=(-t "${trtype}" -n "${subsysnqn}")
- if [[ "${trtype}" != "loop" ]]; then
+ if [[ "${trtype}" == "fc" ]] ; then
+ ARGS+=(-a "${traddr}" -w "${host_traddr}")
+ elif [[ "${trtype}" != "loop" ]]; then
ARGS+=(-a "${traddr}" -s "${trsvcid}")
fi
if [[ "${hostnqn}" != "$def_hostnqn" ]]; then
_nvme_discover() {
local trtype="$1"
local traddr="${2:-$def_traddr}"
+ local host_traddr="${3:-$def_host_traddr}"
local trsvcid="${3:-$def_trsvcid}"
ARGS=(-t "${trtype}")
- if [[ "${trtype}" != "loop" ]]; then
+ if [[ "${trtype}" = "fc" ]]; then
+ ARGS+=(-a "${traddr}" -w "${host_traddr}")
+ elif [[ "${trtype}" != "loop" ]]; then
ARGS+=(-a "${traddr}" -s "${trsvcid}")
fi
nvme discover "${ARGS[@]}"
echo "${trtype}" > "${NVMET_CFS}/ports/${port}/addr_trtype"
echo "${traddr}" > "${NVMET_CFS}/ports/${port}/addr_traddr"
echo "${adrfam}" > "${NVMET_CFS}/ports/${port}/addr_adrfam"
- echo "${trsvcid}" > "${NVMET_CFS}/ports/${port}/addr_trsvcid"
+ if [[ "${adrfam}" != "fc" ]]; then
+ echo "${trsvcid}" > "${NVMET_CFS}/ports/${port}/addr_trsvcid"
+ fi
echo "${port}"
}