@@ -21,6 +21,62 @@ requires() {
_have_driver dh_generic
}
+nvmf_wait_for_state() {
+ local def_state_timeout=5
+ local subsys_name="$1"
+ local state="$2"
+ local timeout="${3:-$def_state_timeout}"
+ local nvmedev
+ local state_file
+ local start_time
+ local end_time
+
+ nvmedev=$(_find_nvme_dev "${subsys_name}")
+ state_file="/sys/class/nvme-fabrics/ctl/${nvmedev}/state"
+
+ start_time=$(date +%s)
+ while ! grep -q "${state}" "${state_file}"; do
+ sleep 1
+ end_time=$(date +%s)
+ if (( end_time - start_time > timeout )); then
+ echo "expected state \"${state}\" not " \
+ "reached within ${timeout} seconds"
+ return 1
+ fi
+ done
+
+ return 0
+}
+
+nvmf_wait_for_ctrl_delete() {
+ local def_state_timeout=5
+ local nvmedev="$1"
+ local timeout="${2:-$def_state_timeout}"
+ local ctrl="/sys/class/nvme-fabrics/ctl/${nvmedev}/state"
+ local start_time
+ local end_time
+
+ start_time=$(date +%s)
+ while [ -f "${ctrl}" ]; do
+ sleep 1
+ end_time=$(date +%s)
+ if (( end_time - start_time > timeout )); then
+ echo "controller \"${nvmedev}\" not deleted" \
+ "within ${timeout} seconds"
+ return 1
+ fi
+ done
+
+ return 0
+}
+
+set_nvmet_attr_qid_max() {
+ local nvmet_subsystem="$1"
+ local qid_max="$2"
+ local cfs_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
+
+ echo "${qid_max}" > "${cfs_path}/attr_qid_max"
+}
test() {
echo "Running ${TEST_NAME}"
@@ -55,7 +111,11 @@ test() {
--hostnqn "${def_hostnqn}" \
--hostid "${def_hostid}" \
--dhchap-secret "${hostkey}" \
- --dhchap-ctrl-secret "${ctrlkey}"
+ --dhchap-ctrl-secret "${ctrlkey}" \
+ --reconnect-delay 1
+
+ nvmf_wait_for_state "${def_subsysnqn}" "live"
+ nvmedev=$(_find_nvme_dev "${def_subsysnqn}")
echo "Re-authenticate with original host key"
@@ -108,6 +168,16 @@ test() {
rand_io_size="$(_nvme_calc_rand_io_size 4m)"
_run_fio_rand_io --size="${rand_io_size}" --filename="/dev/${nvmedev}n1"
+ echo "Renew host key on the controller and force reconnect"
+
+ new_hostkey="$(nvme gen-dhchap-key -n ${def_subsysnqn} 2> /dev/null)"
+
+ _set_nvmet_hostkey "${def_hostnqn}" "${new_hostkey}"
+
+ # Force a reconnect
+ set_nvmet_attr_qid_max "${def_subsysnqn}" 1
+ nvmf_wait_for_ctrl_delete "${nvmedev}"
+
_nvme_disconnect_subsys "${def_subsysnqn}"
_nvmet_target_cleanup
@@ -8,5 +8,6 @@ Change DH group to ffdhe8192
Re-authenticate with changed DH group
Change hash to hmac(sha512)
Re-authenticate with changed hash
-disconnected 1 controller(s)
+Renew host key on the controller and force reconnect
+disconnected 0 controller(s)
Test complete
The re-authentication is a soft state, meaning unless the host has to reconnect a key change on the target side is not observed. Extend the current test with a forced reconnect after a key change. This exercises the DNR handling code of the host. Signed-off-by: Daniel Wagner <dwagner@suse.de> --- tests/nvme/045 | 72 +++++++++++++++++++++++++++++++++++++++++++++- tests/nvme/045.out | 3 +- 2 files changed, 73 insertions(+), 2 deletions(-)