diff --git a/lib/nvme/nvme_tcp.c b/lib/nvme/nvme_tcp.c index 11472204d..f10a3edfe 100644 --- a/lib/nvme/nvme_tcp.c +++ b/lib/nvme/nvme_tcp.c @@ -801,7 +801,7 @@ nvme_tcp_qpair_abort_reqs(struct spdk_nvme_qpair *qpair, uint32_t dnr) } } -static void +static inline void nvme_tcp_qpair_set_recv_state(struct nvme_tcp_qpair *tqpair, enum nvme_tcp_pdu_recv_state state) { @@ -810,19 +810,7 @@ nvme_tcp_qpair_set_recv_state(struct nvme_tcp_qpair *tqpair, tqpair, state); return; } - tqpair->recv_state = state; - switch (state) { - case NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_READY: - case NVME_TCP_PDU_RECV_STATE_ERROR: - memset(tqpair->recv_pdu, 0, sizeof(struct nvme_tcp_pdu)); - break; - case NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_CH: - case NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_PSH: - case NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_PAYLOAD: - default: - break; - } } static void @@ -1623,6 +1611,7 @@ nvme_tcp_read_pdu(struct nvme_tcp_qpair *tqpair, uint32_t *reaped) switch (tqpair->recv_state) { /* If in a new state */ case NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_READY: + memset(tqpair->recv_pdu, 0, sizeof(struct nvme_tcp_pdu)); nvme_tcp_qpair_set_recv_state(tqpair, NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_CH); break; /* common header */ @@ -1698,6 +1687,7 @@ nvme_tcp_read_pdu(struct nvme_tcp_qpair *tqpair, uint32_t *reaped) nvme_tcp_pdu_payload_handle(tqpair, reaped); break; case NVME_TCP_PDU_RECV_STATE_ERROR: + memset(tqpair->recv_pdu, 0, sizeof(struct nvme_tcp_pdu)); rc = NVME_TCP_PDU_FATAL; break; default: diff --git a/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c b/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c index 3c223f296..5c07c0c03 100644 --- a/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c +++ b/test/unit/lib/nvme/nvme_tcp.c/nvme_tcp_ut.c @@ -787,46 +787,15 @@ static void test_nvme_tcp_qpair_set_recv_state(void) { struct nvme_tcp_qpair tqpair = {}; - enum nvme_tcp_pdu_recv_state state; - struct nvme_tcp_pdu recv_pdu = {}; - - tqpair.recv_pdu = &recv_pdu; /* case1: The recv state of tqpair is same with the state to be set */ tqpair.recv_state = NVME_TCP_PDU_RECV_STATE_ERROR; - state = NVME_TCP_PDU_RECV_STATE_ERROR; - nvme_tcp_qpair_set_recv_state(&tqpair, state); - CU_ASSERT(tqpair.recv_state == state); - - /* case2: The recv state of tqpair is different with the state to be set */ - /* state is NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_READY or NVME_TCP_PDU_RECV_STATE_ERROR, tqpair->recv_pdu will be cleared */ - tqpair.recv_pdu->cb_arg = (void *)0xDEADBEEF; - state = NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_READY; - nvme_tcp_qpair_set_recv_state(&tqpair, state); - CU_ASSERT(tqpair.recv_state == NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_READY); - CU_ASSERT(tqpair.recv_pdu->cb_arg == (void *)0x0); - - tqpair.recv_pdu->cb_arg = (void *)0xDEADBEEF; - state = NVME_TCP_PDU_RECV_STATE_ERROR; - nvme_tcp_qpair_set_recv_state(&tqpair, state); + nvme_tcp_qpair_set_recv_state(&tqpair, NVME_TCP_PDU_RECV_STATE_ERROR); CU_ASSERT(tqpair.recv_state == NVME_TCP_PDU_RECV_STATE_ERROR); - CU_ASSERT(tqpair.recv_pdu->cb_arg == (void *)0x0); - /* state is NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_CH or NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_PSH or NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_PAYLOAD or default */ - state = NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_CH; - nvme_tcp_qpair_set_recv_state(&tqpair, state); - CU_ASSERT(tqpair.recv_state == NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_CH); - - state = NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_PSH; - nvme_tcp_qpair_set_recv_state(&tqpair, state); - CU_ASSERT(tqpair.recv_state == NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_PSH); - - state = NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_PAYLOAD; - nvme_tcp_qpair_set_recv_state(&tqpair, state); - CU_ASSERT(tqpair.recv_state == NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_PAYLOAD); - - state = 0xff; - nvme_tcp_qpair_set_recv_state(&tqpair, state); + /* Different state will be set accordingly */ + tqpair.recv_state = NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_READY; + nvme_tcp_qpair_set_recv_state(&tqpair, 0xff); CU_ASSERT(tqpair.recv_state == 0xff); } @@ -1424,6 +1393,10 @@ test_nvme_tcp_ctrlr_connect_qpair(void) rc = nvme_tcp_ctrlr_connect_qpair(&ctrlr, qpair); CU_ASSERT(rc == 0); + /* skip NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_READY state */ + /* assume already received the icresp */ + tqpair->recv_state = NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_CH; + while (nvme_qpair_get_state(qpair) == NVME_QPAIR_CONNECTING) { rc = nvme_tcp_qpair_process_completions(qpair, 0); CU_ASSERT(rc >= 0);