From 404d27263fb69d573aea3a0ffe705580d2708e09 Mon Sep 17 00:00:00 2001 From: Ziye Yang Date: Tue, 14 May 2019 20:50:15 +0800 Subject: [PATCH] sock: add get_placement_id function. Placement_id is related with getsockopt with the optname= SO_INCOMING_NAPI_ID. For some testing platform, it is not supported with this macro, so use ifdef to avoid send this to the kernel. Change-Id: I9e49e6e15810af0cd5085b92469c15a53ac09ada Signed-off-by: Ziye Yang Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/454468 Reviewed-by: Changpeng Liu Reviewed-by: Shuhei Matsumoto Reviewed-by: Maciej Szwed Tested-by: SPDK CI Jenkins --- include/spdk_internal/sock.h | 1 + lib/sock/posix/posix.c | 19 +++++++++++++++++++ lib/sock/vpp/vpp.c | 7 +++++++ test/unit/lib/sock/sock.c/sock_ut.c | 7 +++++++ 4 files changed, 34 insertions(+) diff --git a/include/spdk_internal/sock.h b/include/spdk_internal/sock.h index 33ee81371..720ce926c 100644 --- a/include/spdk_internal/sock.h +++ b/include/spdk_internal/sock.h @@ -85,6 +85,7 @@ struct spdk_net_impl { bool (*is_ipv6)(struct spdk_sock *sock); bool (*is_ipv4)(struct spdk_sock *sock); + int (*get_placement_id)(struct spdk_sock *sock, int *placement_id); struct spdk_sock_group_impl *(*group_impl_create)(void); int (*group_impl_add_sock)(struct spdk_sock_group_impl *group, struct spdk_sock *sock); int (*group_impl_remove_sock)(struct spdk_sock_group_impl *group, struct spdk_sock *sock); diff --git a/lib/sock/posix/posix.c b/lib/sock/posix/posix.c index 568fc805e..fe2fa423d 100644 --- a/lib/sock/posix/posix.c +++ b/lib/sock/posix/posix.c @@ -469,6 +469,24 @@ spdk_posix_sock_is_ipv4(struct spdk_sock *_sock) return (sa.ss_family == AF_INET); } +static int +spdk_posix_sock_get_placement_id(struct spdk_sock *_sock, int *placement_id) +{ + int rc = -1; + +#if defined(SO_INCOMING_NAPI_ID) + struct spdk_posix_sock *sock = __posix_sock(_sock); + socklen_t salen = sizeof(int); + + rc = getsockopt(sock->fd, SOL_SOCKET, SO_INCOMING_NAPI_ID, placement_id, &salen); + if (rc != 0) { + SPDK_ERRLOG("getsockopt() failed (errno=%d)\n", errno); + } + +#endif + return rc; +} + static struct spdk_sock_group_impl * spdk_posix_sock_group_impl_create(void) { @@ -604,6 +622,7 @@ static struct spdk_net_impl g_posix_net_impl = { .set_sendbuf = spdk_posix_sock_set_sendbuf, .is_ipv6 = spdk_posix_sock_is_ipv6, .is_ipv4 = spdk_posix_sock_is_ipv4, + .get_placement_id = spdk_posix_sock_get_placement_id, .group_impl_create = spdk_posix_sock_group_impl_create, .group_impl_add_sock = spdk_posix_sock_group_impl_add_sock, .group_impl_remove_sock = spdk_posix_sock_group_impl_remove_sock, diff --git a/lib/sock/vpp/vpp.c b/lib/sock/vpp/vpp.c index b451912ed..d62399602 100644 --- a/lib/sock/vpp/vpp.c +++ b/lib/sock/vpp/vpp.c @@ -974,6 +974,12 @@ spdk_vpp_sock_is_ipv4(struct spdk_sock *_sock) return __vpp_session(_sock)->app_session.transport.is_ip4; } +static int +spdk_vpp_sock_get_placement_id(struct spdk_sock *_sock, int *placement_id) +{ + return -1; +} + static struct spdk_sock_group_impl * spdk_vpp_sock_group_impl_create(void) { @@ -1387,6 +1393,7 @@ static struct spdk_net_impl g_vpp_net_impl = { .set_sendbuf = spdk_vpp_sock_set_sendbuf, .is_ipv6 = spdk_vpp_sock_is_ipv6, .is_ipv4 = spdk_vpp_sock_is_ipv4, + .get_placement_id = spdk_vpp_sock_get_placement_id, .group_impl_create = spdk_vpp_sock_group_impl_create, .group_impl_add_sock = spdk_vpp_sock_group_impl_add_sock, .group_impl_remove_sock = spdk_vpp_sock_group_impl_remove_sock, diff --git a/test/unit/lib/sock/sock.c/sock_ut.c b/test/unit/lib/sock/sock.c/sock_ut.c index c43ac3045..eb905ede2 100644 --- a/test/unit/lib/sock/sock.c/sock_ut.c +++ b/test/unit/lib/sock/sock.c/sock_ut.c @@ -244,6 +244,12 @@ spdk_ut_sock_is_ipv4(struct spdk_sock *_sock) return true; } +static int +spdk_ut_sock_get_placement_id(struct spdk_sock *_sock, int *placement_id) +{ + return -1; +} + static struct spdk_sock_group_impl * spdk_ut_sock_group_impl_create(void) { @@ -317,6 +323,7 @@ static struct spdk_net_impl g_ut_net_impl = { .set_sendbuf = spdk_ut_sock_set_sendbuf, .is_ipv6 = spdk_ut_sock_is_ipv6, .is_ipv4 = spdk_ut_sock_is_ipv4, + .get_placement_id = spdk_ut_sock_get_placement_id, .group_impl_create = spdk_ut_sock_group_impl_create, .group_impl_add_sock = spdk_ut_sock_group_impl_add_sock, .group_impl_remove_sock = spdk_ut_sock_group_impl_remove_sock,