nvme: add transport ID comparison function

Change-Id: I4ab7cbad1c31ac57347bb470f3f545d3ca81de43
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Daniel Verkamp 2017-03-01 13:31:19 -07:00 committed by Ben Walker
parent a3a3d7dddf
commit b9ca539390
3 changed files with 72 additions and 12 deletions

View File

@ -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); 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. * Determine whether the NVMe library can handle a specific NVMe over Fabrics transport type.
* *

View File

@ -570,4 +570,44 @@ spdk_nvme_transport_id_parse(struct spdk_nvme_transport_id *trid, const char *st
return 0; 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) SPDK_LOG_REGISTER_TRACE_FLAG("nvme", SPDK_TRACE_NVME)

View File

@ -165,25 +165,27 @@ test_opc_data_transfer(void)
static void static void
test_trid_parse(void) test_trid_parse(void)
{ {
struct spdk_nvme_transport_id trid; struct spdk_nvme_transport_id trid1, trid2;
memset(&trid, 0, sizeof(trid)); memset(&trid1, 0, sizeof(trid1));
CU_ASSERT(spdk_nvme_transport_id_parse(&trid, CU_ASSERT(spdk_nvme_transport_id_parse(&trid1,
"trtype:rdma\n" "trtype:rdma\n"
"adrfam:ipv4\n" "adrfam:ipv4\n"
"traddr:192.168.100.8\n" "traddr:192.168.100.8\n"
"trsvcid:4420\n" "trsvcid:4420\n"
"subnqn:nqn.2014-08.org.nvmexpress.discovery") == 0); "subnqn:nqn.2014-08.org.nvmexpress.discovery") == 0);
CU_ASSERT(trid.trtype == SPDK_NVME_TRANSPORT_RDMA); CU_ASSERT(trid1.trtype == SPDK_NVME_TRANSPORT_RDMA);
CU_ASSERT(trid.adrfam == SPDK_NVMF_ADRFAM_IPV4); CU_ASSERT(trid1.adrfam == SPDK_NVMF_ADRFAM_IPV4);
CU_ASSERT(strcmp(trid.traddr, "192.168.100.8") == 0); CU_ASSERT(strcmp(trid1.traddr, "192.168.100.8") == 0);
CU_ASSERT(strcmp(trid.trsvcid, "4420") == 0); CU_ASSERT(strcmp(trid1.trsvcid, "4420") == 0);
CU_ASSERT(strcmp(trid.subnqn, "nqn.2014-08.org.nvmexpress.discovery") == 0); CU_ASSERT(strcmp(trid1.subnqn, "nqn.2014-08.org.nvmexpress.discovery") == 0);
memset(&trid, 0, sizeof(trid)); memset(&trid2, 0, sizeof(trid2));
CU_ASSERT(spdk_nvme_transport_id_parse(&trid, "trtype:PCIe traddr:0000:04:00.0") == 0); CU_ASSERT(spdk_nvme_transport_id_parse(&trid2, "trtype:PCIe traddr:0000:04:00.0") == 0);
CU_ASSERT(trid.trtype == SPDK_NVME_TRANSPORT_PCIE); CU_ASSERT(trid2.trtype == SPDK_NVME_TRANSPORT_PCIE);
CU_ASSERT(strcmp(trid.traddr, "0000:04:00.0") == 0); 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) int main(int argc, char **argv)