Commit b9ca5393 authored by Daniel Verkamp's avatar Daniel Verkamp Committed by Ben Walker
Browse files

nvme: add transport ID comparison function



Change-Id: I4ab7cbad1c31ac57347bb470f3f545d3ca81de43
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent a3a3d7dd
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -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.
 *
+40 −0
Original line number Diff line number Diff line
@@ -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)
+15 −13
Original line number Diff line number Diff line
@@ -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);

	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);
	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(&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)