From 5c263046dbe68dc0cbf5ea40957c534ff15970df Mon Sep 17 00:00:00 2001 From: Ziye Yang Date: Mon, 8 Oct 2018 09:51:03 +0800 Subject: [PATCH] sock: Update the spdk_sock_getaddr function. Purpose: We need to get the port info in other applications (e.g., NVMe-oF TCP/IP transport) Change-Id: I3a4636e764e44425436bb064cb0062c6f3e44035 Signed-off-by: Ziye Yang Reviewed-on: https://review.gerrithub.io/428313 Chandler-Test-Pool: SPDK Automated Test System Tested-by: SPDK CI Jenkins Reviewed-by: Tomasz Kulasek Reviewed-by: Jim Harris Reviewed-by: Changpeng Liu --- CHANGELOG.md | 6 ++++++ examples/sock/hello_world/hello_sock.c | 13 +++++++------ include/spdk/sock.h | 5 ++++- include/spdk_internal/sock.h | 3 ++- lib/iscsi/conn.c | 5 ++--- lib/sock/posix/posix.c | 19 ++++++++++++++++++- lib/sock/sock.c | 5 +++-- lib/sock/vpp/vpp.c | 19 ++++++++++++++++++- test/unit/lib/iscsi/conn.c/conn_ut.c | 3 ++- test/unit/lib/sock/sock.c/sock_ut.c | 3 ++- 10 files changed, 64 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 724066136..47df1ca2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,12 @@ scripts/config_converter.py. Example how this script can be used: cat old_format.ini | scripts/config_converter.py > new_json_format.json ~~~ +### Sock + +Two additional parameters were added to spdk_sock_get_addr() for the server +port and client port. These parameters are named "sport" and "cport" +respectively. + ## v18.07: ### bdev diff --git a/examples/sock/hello_world/hello_sock.c b/examples/sock/hello_world/hello_sock.c index c2aef5e24..a3a5d5531 100644 --- a/examples/sock/hello_world/hello_sock.c +++ b/examples/sock/hello_world/hello_sock.c @@ -190,6 +190,7 @@ hello_sock_connect(struct hello_context_t *ctx) { int rc; char saddr[ADDR_STR_LEN], caddr[ADDR_STR_LEN]; + uint16_t cport, sport; SPDK_NOTICELOG("Connecting to the server on %s:%d\n", ctx->host, ctx->port); @@ -199,14 +200,14 @@ hello_sock_connect(struct hello_context_t *ctx) return -1; } - rc = spdk_sock_getaddr(ctx->sock, saddr, sizeof(saddr), caddr, sizeof(caddr)); + rc = spdk_sock_getaddr(ctx->sock, saddr, sizeof(saddr), &sport, caddr, sizeof(caddr), &cport); if (rc < 0) { SPDK_ERRLOG("Cannot get connection addresses\n"); spdk_sock_close(&ctx->sock); return -1; } - SPDK_NOTICELOG("Connection accepted from %s to %s\n", caddr, saddr); + SPDK_NOTICELOG("Connection accepted from (%s, %hu) to (%s, %hu)\n", caddr, cport, saddr, sport); fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | O_NONBLOCK); @@ -262,6 +263,7 @@ hello_sock_accept_poll(void *arg) int rc; int count = 0; char saddr[ADDR_STR_LEN], caddr[ADDR_STR_LEN]; + uint16_t cport, sport; if (!g_is_running) { spdk_poller_unregister(&ctx->poller_in); @@ -275,11 +277,10 @@ hello_sock_accept_poll(void *arg) while (1) { sock = spdk_sock_accept(ctx->sock); if (sock != NULL) { + spdk_sock_getaddr(sock, saddr, sizeof(saddr), &sport, caddr, sizeof(caddr), &cport); - spdk_sock_getaddr(sock, saddr, sizeof(saddr), caddr, sizeof(caddr)); - - SPDK_NOTICELOG("Accepting a new connection from %s to %s\n", - caddr, saddr); + SPDK_NOTICELOG("Accepting a new connection from (%s, %hu) to (%s, %hu)\n", + caddr, cport, saddr, sport); rc = spdk_sock_group_add_sock(ctx->group, sock, hello_sock_cb, ctx); diff --git a/include/spdk/sock.h b/include/spdk/sock.h index 6732372ee..8d5c6a74a 100644 --- a/include/spdk/sock.h +++ b/include/spdk/sock.h @@ -53,12 +53,15 @@ struct spdk_sock_group; * \param sock Socket to get address. * \param saddr A pointer to the buffer to hold the address of server. * \param slen Length of the buffer 'saddr'. + * \param sport A pointer(May be NULL) to the buffer to hold the port info of server. * \param caddr A pointer to the buffer to hold the address of client. * \param clen Length of the buffer 'caddr'. + * \param cport A pointer(May be NULL) to the buffer to hold the port info of server. * * \return 0 on success, -1 on failure. */ -int spdk_sock_getaddr(struct spdk_sock *sock, char *saddr, int slen, char *caddr, int clen); +int spdk_sock_getaddr(struct spdk_sock *sock, char *saddr, int slen, uint16_t *sport, + char *caddr, int clen, uint16_t *cport); /** * Create a socket, connect the socket to the specified address and port (of the diff --git a/include/spdk_internal/sock.h b/include/spdk_internal/sock.h index fd1c13c3a..d5542bf33 100644 --- a/include/spdk_internal/sock.h +++ b/include/spdk_internal/sock.h @@ -68,7 +68,8 @@ struct spdk_sock_group_impl { struct spdk_net_impl { const char *name; - int (*getaddr)(struct spdk_sock *sock, char *saddr, int slen, char *caddr, int clen); + int (*getaddr)(struct spdk_sock *sock, char *saddr, int slen, uint16_t *sport, char *caddr, + int clen, uint16_t *cport); struct spdk_sock *(*connect)(const char *ip, int port); struct spdk_sock *(*listen)(const char *ip, int port); struct spdk_sock *(*accept)(struct spdk_sock *sock); diff --git a/lib/iscsi/conn.c b/lib/iscsi/conn.c index 1431e10fb..5cbc8dc73 100644 --- a/lib/iscsi/conn.c +++ b/lib/iscsi/conn.c @@ -297,9 +297,8 @@ spdk_iscsi_conn_construct(struct spdk_iscsi_portal *portal, TAILQ_INIT(&conn->queued_datain_tasks); memset(&conn->open_lun_descs, 0, sizeof(conn->open_lun_descs)); - rc = spdk_sock_getaddr(sock, conn->target_addr, - sizeof conn->target_addr, - conn->initiator_addr, sizeof conn->initiator_addr); + rc = spdk_sock_getaddr(sock, conn->target_addr, sizeof conn->target_addr, NULL, + conn->initiator_addr, sizeof conn->initiator_addr, NULL); if (rc < 0) { SPDK_ERRLOG("spdk_sock_getaddr() failed\n"); goto error_return; diff --git a/lib/sock/posix/posix.c b/lib/sock/posix/posix.c index 20788d736..fc341f06a 100644 --- a/lib/sock/posix/posix.c +++ b/lib/sock/posix/posix.c @@ -89,7 +89,8 @@ get_addr_str(struct sockaddr *sa, char *host, size_t hlen) #define __posix_group_impl(group) (struct spdk_posix_sock_group_impl *)group static int -spdk_posix_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, char *caddr, int clen) +spdk_posix_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, uint16_t *sport, + char *caddr, int clen, uint16_t *cport) { struct spdk_posix_sock *sock = __posix_sock(_sock); struct sockaddr_storage sa; @@ -125,6 +126,14 @@ spdk_posix_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, char *ca return -1; } + if (sport) { + if (sa.ss_family == AF_INET) { + *sport = ntohs(((struct sockaddr_in *) &sa)->sin_port); + } else if (sa.ss_family == AF_INET6) { + *sport = ntohs(((struct sockaddr_in6 *) &sa)->sin6_port); + } + } + memset(&sa, 0, sizeof sa); salen = sizeof sa; rc = getpeername(sock->fd, (struct sockaddr *) &sa, &salen); @@ -139,6 +148,14 @@ spdk_posix_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, char *ca return -1; } + if (cport) { + if (sa.ss_family == AF_INET) { + *cport = ntohs(((struct sockaddr_in *) &sa)->sin_port); + } else if (sa.ss_family == AF_INET6) { + *cport = ntohs(((struct sockaddr_in6 *) &sa)->sin6_port); + } + } + return 0; } diff --git a/lib/sock/sock.c b/lib/sock/sock.c index 67f2ff8d1..d31aa9b07 100644 --- a/lib/sock/sock.c +++ b/lib/sock/sock.c @@ -41,9 +41,10 @@ static STAILQ_HEAD(, spdk_net_impl) g_net_impls = STAILQ_HEAD_INITIALIZER(g_net_impls); int -spdk_sock_getaddr(struct spdk_sock *sock, char *saddr, int slen, char *caddr, int clen) +spdk_sock_getaddr(struct spdk_sock *sock, char *saddr, int slen, uint16_t *sport, + char *caddr, int clen, uint16_t *cport) { - return sock->net_impl->getaddr(sock, saddr, slen, caddr, clen); + return sock->net_impl->getaddr(sock, saddr, slen, sport, caddr, clen, cport); } struct spdk_sock * diff --git a/lib/sock/vpp/vpp.c b/lib/sock/vpp/vpp.c index d2d5c3aaf..752250eb7 100644 --- a/lib/sock/vpp/vpp.c +++ b/lib/sock/vpp/vpp.c @@ -160,7 +160,8 @@ getpeername_vpp(int sock, struct sockaddr *addr, socklen_t *len) } static int -spdk_vpp_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, char *caddr, int clen) +spdk_vpp_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, uint16_t *sport, + char *caddr, int clen, uint16_t *cport) { struct spdk_vpp_sock *sock = __vpp_sock(_sock); struct sockaddr sa; @@ -186,6 +187,14 @@ spdk_vpp_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, char *cadd return -1; } + if (sport) { + if (sa.ss_family == AF_INET) { + *sport = ntohs(((struct sockaddr_in *) &sa)->sin_port); + } else if (sa.ss_family == AF_INET6) { + *sport = ntohs(((struct sockaddr_in6 *) &sa)->sin6_port); + } + } + memset(&sa, 0, sizeof(sa)); salen = sizeof(sa); rc = getpeername_vpp(sock->fd, &sa, &salen); @@ -202,6 +211,14 @@ spdk_vpp_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, char *cadd return -1; } + if (cport) { + if (sa.ss_family == AF_INET) { + *cport = ntohs(((struct sockaddr_in *) &sa)->sin_port); + } else if (sa.ss_family == AF_INET6) { + *cport = ntohs(((struct sockaddr_in6 *) &sa)->sin6_port); + } + } + return 0; } diff --git a/test/unit/lib/iscsi/conn.c/conn_ut.c b/test/unit/lib/iscsi/conn.c/conn_ut.c index f6b0b40ff..5a9c852c8 100644 --- a/test/unit/lib/iscsi/conn.c/conn_ut.c +++ b/test/unit/lib/iscsi/conn.c/conn_ut.c @@ -87,7 +87,8 @@ spdk_event_call(struct spdk_event *event) } int -spdk_sock_getaddr(struct spdk_sock *sock, char *saddr, int slen, char *caddr, int clen) +spdk_sock_getaddr(struct spdk_sock *sock, char *saddr, int slen, uint16_t *sport, + char *caddr, int clen, uint16_t *cport) { return 0; } diff --git a/test/unit/lib/sock/sock.c/sock_ut.c b/test/unit/lib/sock/sock.c/sock_ut.c index 23c115547..a0176f11c 100644 --- a/test/unit/lib/sock/sock.c/sock_ut.c +++ b/test/unit/lib/sock/sock.c/sock_ut.c @@ -66,7 +66,8 @@ struct spdk_ut_sock_group_impl { #define __ut_group(group) (struct spdk_ut_sock_group_impl *)group static int -spdk_ut_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, char *caddr, int clen) +spdk_ut_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, uint16_t *sport, + char *caddr, int clen, uint16_t *cport) { return 0; }