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@xxxxxxx> --- tests/nvme/045 | 72 +++++++++++++++++++++++++++++++++++++++++++++- tests/nvme/045.out | 3 +- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/tests/nvme/045 b/tests/nvme/045 index be408b629771..b0527685f61f 100755 --- a/tests/nvme/045 +++ b/tests/nvme/045 @@ -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 diff --git a/tests/nvme/045.out b/tests/nvme/045.out index 84a69ef5c4c6..3331304ef71a 100644 --- a/tests/nvme/045.out +++ b/tests/nvme/045.out @@ -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 -- 2.44.0