Commit 8f64db18 authored by Ben Walker's avatar Ben Walker Committed by Jim Harris
Browse files

nvmf: Add a function to get the source address for a qpair



Change-Id: I6ae1f380aebbcf090a0ff31ff96fc4592fc29591
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/421173


Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent ff6299f8
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -206,6 +206,18 @@ typedef void (*nvmf_qpair_disconnect_cb)(void *ctx);
int spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_cb cb_fn,
			       void *ctx);

/**
 * Get the peer's transport ID for this queue pair.
 *
 * \param qpair The NVMe-oF qpair
 * \param trid Output parameter that will contain the transport id.
 *
 * \return 0 for success.
 * \return -EINVAL if the qpair is not connected.
 */
int spdk_nvmf_qpair_get_peer_trid(struct spdk_nvmf_qpair *qpair,
				  struct spdk_nvme_transport_id *trid);

/**
 * Create an NVMe-oF subsystem.
 *
+7 −0
Original line number Diff line number Diff line
@@ -753,6 +753,13 @@ spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_
	return 0;
}

int
spdk_nvmf_qpair_get_peer_trid(struct spdk_nvmf_qpair *qpair,
			      struct spdk_nvme_transport_id *trid)
{
	return spdk_nvmf_transport_qpair_get_peer_trid(qpair, trid);
}

int
spdk_nvmf_poll_group_add_transport(struct spdk_nvmf_poll_group *group,
				   struct spdk_nvmf_transport *transport)
+39 −0
Original line number Diff line number Diff line
@@ -2693,6 +2693,44 @@ spdk_nvmf_rdma_poll_group_poll(struct spdk_nvmf_transport_poll_group *group)
	return count;
}

static int
spdk_nvmf_rdma_qpair_get_peer_trid(struct spdk_nvmf_qpair *qpair,
				   struct spdk_nvme_transport_id *trid)
{
	struct spdk_nvmf_rdma_qpair	*rqpair;
	struct sockaddr *saddr;

	rqpair = SPDK_CONTAINEROF(qpair, struct spdk_nvmf_rdma_qpair, qpair);

	trid->trtype = SPDK_NVME_TRANSPORT_RDMA;

	saddr = rdma_get_peer_addr(rqpair->cm_id);
	switch (saddr->sa_family) {
	case AF_INET: {
		struct sockaddr_in *saddr_in = (struct sockaddr_in *)saddr;

		trid->adrfam = SPDK_NVMF_ADRFAM_IPV4;
		inet_ntop(AF_INET, &saddr_in->sin_addr,
			  trid->traddr, sizeof(trid->traddr));
		snprintf(trid->trsvcid, sizeof(trid->trsvcid), "%u", saddr_in->sin_port);
		break;
	}
	case AF_INET6: {
		struct sockaddr_in6 *saddr_in = (struct sockaddr_in6 *)saddr;
		trid->adrfam = SPDK_NVMF_ADRFAM_IPV6;
		inet_ntop(AF_INET6, &saddr_in->sin6_addr,
			  trid->traddr, sizeof(trid->traddr));
		snprintf(trid->trsvcid, sizeof(trid->trsvcid), "%u", saddr_in->sin6_port);
		break;
	}
	default:
		return -1;

	}

	return 0;
}

const struct spdk_nvmf_transport_ops spdk_nvmf_transport_rdma = {
	.type = SPDK_NVME_TRANSPORT_RDMA,
	.create = spdk_nvmf_rdma_create,
@@ -2714,6 +2752,7 @@ const struct spdk_nvmf_transport_ops spdk_nvmf_transport_rdma = {

	.qpair_fini = spdk_nvmf_rdma_close_qpair,
	.qpair_is_idle = spdk_nvmf_rdma_qpair_is_idle,
	.qpair_get_peer_trid = spdk_nvmf_rdma_qpair_get_peer_trid,

};

+7 −0
Original line number Diff line number Diff line
@@ -209,3 +209,10 @@ spdk_nvmf_transport_qpair_is_idle(struct spdk_nvmf_qpair *qpair)
{
	return qpair->transport->ops->qpair_is_idle(qpair);
}

int
spdk_nvmf_transport_qpair_get_peer_trid(struct spdk_nvmf_qpair *qpair,
					struct spdk_nvme_transport_id *trid)
{
	return qpair->transport->ops->qpair_get_peer_trid(qpair, trid);
}
+9 −0
Original line number Diff line number Diff line
@@ -130,6 +130,12 @@ struct spdk_nvmf_transport_ops {
	 * True if the qpair has no pending IO.
	 */
	bool (*qpair_is_idle)(struct spdk_nvmf_qpair *qpair);

	/*
	 * Get the remote transport ID for the queue pair
	 */
	int (*qpair_get_peer_trid)(struct spdk_nvmf_qpair *qpair,
				   struct spdk_nvme_transport_id *trid);
};

struct spdk_nvmf_transport *spdk_nvmf_transport_create(struct spdk_nvmf_tgt *tgt,
@@ -168,6 +174,9 @@ void spdk_nvmf_transport_qpair_fini(struct spdk_nvmf_qpair *qpair);

bool spdk_nvmf_transport_qpair_is_idle(struct spdk_nvmf_qpair *qpair);

int spdk_nvmf_transport_qpair_get_peer_trid(struct spdk_nvmf_qpair *qpair,
		struct spdk_nvme_transport_id *trid);

extern const struct spdk_nvmf_transport_ops spdk_nvmf_transport_rdma;

#endif /* SPDK_NVMF_TRANSPORT_H */