From b9ca5393904d9fa243aa3175561267eddb2a250a Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Wed, 1 Mar 2017 13:31:19 -0700 Subject: [PATCH] nvme: add transport ID comparison function Change-Id: I4ab7cbad1c31ac57347bb470f3f545d3ca81de43 Signed-off-by: Daniel Verkamp --- include/spdk/nvme.h | 18 +++++++++++++ lib/nvme/nvme.c | 40 +++++++++++++++++++++++++++++ test/lib/nvme/unit/nvme_c/nvme_ut.c | 26 ++++++++++--------- 3 files changed, 72 insertions(+), 12 deletions(-) diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index 9bfdc4409..b08c35c95 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -213,6 +213,24 @@ int spdk_nvme_transport_id_parse_trtype(enum spdk_nvme_transport_type *trtype, c */ int spdk_nvme_transport_id_parse_adrfam(enum spdk_nvmf_adrfam *adrfam, const char *str); +/** + * Compare two transport IDs. + * + * \param trid1 First transport ID to compare. + * \param trid2 Second transport ID to compare. + * + * \return 0 if trid1 == trid2, less than 0 if trid1 < trid2, greater than 0 if trid1 > trid2. + * + * The result of this function may be used to sort transport IDs in a consistent order; however, + * the comparison result is not guaranteed to be consistent across library versions. + * + * This function uses a case-insensitive comparison for string fields, but it does not otherwise + * normalize the transport ID. It is the caller's responsibility to provide the transport IDs in + * a consistent format. + */ +int spdk_nvme_transport_id_compare(const struct spdk_nvme_transport_id *trid1, + const struct spdk_nvme_transport_id *trid2); + /** * Determine whether the NVMe library can handle a specific NVMe over Fabrics transport type. * diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index 0a00dde94..ffaf4e183 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -570,4 +570,44 @@ spdk_nvme_transport_id_parse(struct spdk_nvme_transport_id *trid, const char *st return 0; } +static int +cmp_int(int a, int b) +{ + return a - b; +} + +int +spdk_nvme_transport_id_compare(const struct spdk_nvme_transport_id *trid1, + const struct spdk_nvme_transport_id *trid2) +{ + int cmp; + + cmp = cmp_int(trid1->trtype, trid2->trtype); + if (cmp) { + return cmp; + } + + cmp = cmp_int(trid1->adrfam, trid2->adrfam); + if (cmp) { + return cmp; + } + + cmp = strcasecmp(trid1->traddr, trid2->traddr); + if (cmp) { + return cmp; + } + + cmp = strcasecmp(trid1->trsvcid, trid2->trsvcid); + if (cmp) { + return cmp; + } + + cmp = strcasecmp(trid1->subnqn, trid2->subnqn); + if (cmp) { + return cmp; + } + + return 0; +} + SPDK_LOG_REGISTER_TRACE_FLAG("nvme", SPDK_TRACE_NVME) diff --git a/test/lib/nvme/unit/nvme_c/nvme_ut.c b/test/lib/nvme/unit/nvme_c/nvme_ut.c index d8f06ab1f..836aa05ca 100644 --- a/test/lib/nvme/unit/nvme_c/nvme_ut.c +++ b/test/lib/nvme/unit/nvme_c/nvme_ut.c @@ -165,25 +165,27 @@ test_opc_data_transfer(void) static void test_trid_parse(void) { - struct spdk_nvme_transport_id trid; + struct spdk_nvme_transport_id trid1, trid2; - memset(&trid, 0, sizeof(trid)); - CU_ASSERT(spdk_nvme_transport_id_parse(&trid, + memset(&trid1, 0, sizeof(trid1)); + CU_ASSERT(spdk_nvme_transport_id_parse(&trid1, "trtype:rdma\n" "adrfam:ipv4\n" "traddr:192.168.100.8\n" "trsvcid:4420\n" "subnqn:nqn.2014-08.org.nvmexpress.discovery") == 0); - CU_ASSERT(trid.trtype == SPDK_NVME_TRANSPORT_RDMA); - CU_ASSERT(trid.adrfam == SPDK_NVMF_ADRFAM_IPV4); - CU_ASSERT(strcmp(trid.traddr, "192.168.100.8") == 0); - CU_ASSERT(strcmp(trid.trsvcid, "4420") == 0); - CU_ASSERT(strcmp(trid.subnqn, "nqn.2014-08.org.nvmexpress.discovery") == 0); + CU_ASSERT(trid1.trtype == SPDK_NVME_TRANSPORT_RDMA); + CU_ASSERT(trid1.adrfam == SPDK_NVMF_ADRFAM_IPV4); + CU_ASSERT(strcmp(trid1.traddr, "192.168.100.8") == 0); + CU_ASSERT(strcmp(trid1.trsvcid, "4420") == 0); + CU_ASSERT(strcmp(trid1.subnqn, "nqn.2014-08.org.nvmexpress.discovery") == 0); - memset(&trid, 0, sizeof(trid)); - CU_ASSERT(spdk_nvme_transport_id_parse(&trid, "trtype:PCIe traddr:0000:04:00.0") == 0); - CU_ASSERT(trid.trtype == SPDK_NVME_TRANSPORT_PCIE); - CU_ASSERT(strcmp(trid.traddr, "0000:04:00.0") == 0); + memset(&trid2, 0, sizeof(trid2)); + CU_ASSERT(spdk_nvme_transport_id_parse(&trid2, "trtype:PCIe traddr:0000:04:00.0") == 0); + CU_ASSERT(trid2.trtype == SPDK_NVME_TRANSPORT_PCIE); + CU_ASSERT(strcmp(trid2.traddr, "0000:04:00.0") == 0); + + CU_ASSERT(spdk_nvme_transport_id_compare(&trid1, &trid2) != 0); } int main(int argc, char **argv)