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,