diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index af449e470..717af1324 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -737,16 +737,25 @@ spdk_nvme_transport_id_compare(const struct spdk_nvme_transport_id *trid1, return cmp; } + if (trid1->trtype == SPDK_NVME_TRANSPORT_PCIE) { + struct spdk_pci_addr pci_addr1; + struct spdk_pci_addr pci_addr2; + + /* Normalize PCI addresses before comparing */ + if (spdk_pci_addr_parse(&pci_addr1, trid1->traddr) < 0 || + spdk_pci_addr_parse(&pci_addr2, trid2->traddr) < 0) { + return -1; + } + + /* PCIe transport ID only uses trtype and traddr */ + return spdk_pci_addr_compare(&pci_addr1, &pci_addr2); + } + cmp = strcasecmp(trid1->traddr, trid2->traddr); if (cmp) { return cmp; } - if (trid1->trtype == SPDK_NVME_TRANSPORT_PCIE) { - /* PCIe transport ID only uses trtype and traddr */ - return 0; - } - cmp = cmp_int(trid1->adrfam, trid2->adrfam); if (cmp) { return cmp; diff --git a/test/lib/test_env.c b/test/lib/test_env.c index 4bea47613..e0fcf828c 100644 --- a/test/lib/test_env.c +++ b/test/lib/test_env.c @@ -293,6 +293,30 @@ spdk_pci_addr_fmt(char *bdf, size_t sz, const struct spdk_pci_addr *addr) return -1; } +int +spdk_pci_addr_compare(const struct spdk_pci_addr *a1, const struct spdk_pci_addr *a2) +{ + if (a1->domain > a2->domain) { + return 1; + } else if (a1->domain < a2->domain) { + return -1; + } else if (a1->bus > a2->bus) { + return 1; + } else if (a1->bus < a2->bus) { + return -1; + } else if (a1->dev > a2->dev) { + return 1; + } else if (a1->dev < a2->dev) { + return -1; + } else if (a1->func > a2->func) { + return 1; + } else if (a1->func < a2->func) { + return -1; + } + + return 0; +} + uint32_t spdk_env_get_core_count(void) { diff --git a/test/unit/lib/nvme/nvme.c/nvme_ut.c b/test/unit/lib/nvme/nvme.c/nvme_ut.c index 82231315e..5d8d5a043 100644 --- a/test/unit/lib/nvme/nvme.c/nvme_ut.c +++ b/test/unit/lib/nvme/nvme.c/nvme_ut.c @@ -71,10 +71,6 @@ DEFINE_STUB(nvme_ctrlr_start, int, DEFINE_STUB(spdk_pci_device_get_addr, struct spdk_pci_addr, (struct spdk_pci_device *pci_dev), {0}) -DEFINE_STUB(spdk_pci_addr_compare, int, - (const struct spdk_pci_addr *a1, - const struct spdk_pci_addr *a2), 1) - DEFINE_STUB(nvme_ctrlr_get_ref_count, int, (struct spdk_nvme_ctrlr *ctrlr), 0) @@ -771,6 +767,22 @@ test_trid_parse_and_compare(void) memset_trid(&trid1, &trid2); ret = spdk_nvme_transport_id_compare(&trid1, &trid2); CU_ASSERT(ret == 0); + + /* Compare PCI addresses via spdk_pci_addr_compare (rather than as strings) */ + memset_trid(&trid1, &trid2); + CU_ASSERT(spdk_nvme_transport_id_parse(&trid1, "trtype:PCIe traddr:0000:04:00.0") == 0); + CU_ASSERT(spdk_nvme_transport_id_parse(&trid2, "trtype:PCIe traddr:04:00.0") == 0); + CU_ASSERT(spdk_nvme_transport_id_compare(&trid1, &trid2) == 0); + + memset_trid(&trid1, &trid2); + CU_ASSERT(spdk_nvme_transport_id_parse(&trid1, "trtype:PCIe traddr:0000:05:00.0") == 0); + CU_ASSERT(spdk_nvme_transport_id_parse(&trid2, "trtype:PCIe traddr:04:00.0") == 0); + CU_ASSERT(spdk_nvme_transport_id_compare(&trid1, &trid2) > 0); + + memset_trid(&trid1, &trid2); + CU_ASSERT(spdk_nvme_transport_id_parse(&trid1, "trtype:PCIe traddr:0000:04:00.0") == 0); + CU_ASSERT(spdk_nvme_transport_id_parse(&trid2, "trtype:PCIe traddr:05:00.0") == 0); + CU_ASSERT(spdk_nvme_transport_id_compare(&trid1, &trid2) < 0); } static void diff --git a/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c b/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c index dc97c2151..1880fa904 100644 --- a/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c +++ b/test/unit/lib/nvme/nvme_ns_cmd.c/nvme_ns_cmd_ut.c @@ -128,12 +128,6 @@ spdk_pci_device_get_id(struct spdk_pci_device *pci_dev) return pci_id; } -int -spdk_pci_addr_compare(const struct spdk_pci_addr *a1, const struct spdk_pci_addr *a2) -{ - return true; -} - void spdk_nvme_ctrlr_get_default_ctrlr_opts(struct spdk_nvme_ctrlr_opts *opts, size_t opts_size) { diff --git a/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c b/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c index 49305a4a5..81532351f 100644 --- a/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c +++ b/test/unit/lib/nvme/nvme_pcie.c/nvme_pcie_ut.c @@ -134,12 +134,6 @@ spdk_pci_device_get_addr(struct spdk_pci_device *dev) abort(); } -int -spdk_pci_addr_compare(const struct spdk_pci_addr *a1, const struct spdk_pci_addr *a2) -{ - abort(); -} - int spdk_pci_device_cfg_read32(struct spdk_pci_device *dev, uint32_t *value, uint32_t offset) {