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

Change-Id: I6ae1f380aebbcf090a0ff31ff96fc4592fc29591
Signed-off-by: Ben 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: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Ben Walker 2018-08-02 15:08:12 -07:00 committed by Jim Harris
parent ff6299f831
commit 8f64db180e
5 changed files with 74 additions and 0 deletions

View File

@ -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, int spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_cb cb_fn,
void *ctx); 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. * Create an NVMe-oF subsystem.
* *

View File

@ -753,6 +753,13 @@ spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_
return 0; 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 int
spdk_nvmf_poll_group_add_transport(struct spdk_nvmf_poll_group *group, spdk_nvmf_poll_group_add_transport(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_transport *transport) struct spdk_nvmf_transport *transport)

View File

@ -2693,6 +2693,44 @@ spdk_nvmf_rdma_poll_group_poll(struct spdk_nvmf_transport_poll_group *group)
return count; 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 = { const struct spdk_nvmf_transport_ops spdk_nvmf_transport_rdma = {
.type = SPDK_NVME_TRANSPORT_RDMA, .type = SPDK_NVME_TRANSPORT_RDMA,
.create = spdk_nvmf_rdma_create, .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_fini = spdk_nvmf_rdma_close_qpair,
.qpair_is_idle = spdk_nvmf_rdma_qpair_is_idle, .qpair_is_idle = spdk_nvmf_rdma_qpair_is_idle,
.qpair_get_peer_trid = spdk_nvmf_rdma_qpair_get_peer_trid,
}; };

View File

@ -209,3 +209,10 @@ spdk_nvmf_transport_qpair_is_idle(struct spdk_nvmf_qpair *qpair)
{ {
return qpair->transport->ops->qpair_is_idle(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);
}

View File

@ -130,6 +130,12 @@ struct spdk_nvmf_transport_ops {
* True if the qpair has no pending IO. * True if the qpair has no pending IO.
*/ */
bool (*qpair_is_idle)(struct spdk_nvmf_qpair *qpair); 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, 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); 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; extern const struct spdk_nvmf_transport_ops spdk_nvmf_transport_rdma;
#endif /* SPDK_NVMF_TRANSPORT_H */ #endif /* SPDK_NVMF_TRANSPORT_H */