diff --git a/include/spdk_internal/sock.h b/include/spdk_internal/sock.h index e3222f6a0..2087ea789 100644 --- a/include/spdk_internal/sock.h +++ b/include/spdk_internal/sock.h @@ -47,6 +47,7 @@ extern "C" { #endif #define MAX_EVENTS_PER_POLL 32 +#define DEFAULT_SOCK_PRIORITY 0 struct spdk_sock { struct spdk_net_impl *net_impl; @@ -80,6 +81,7 @@ struct spdk_sock_group_impl { struct spdk_net_impl { const char *name; + int priority; int (*getaddr)(struct spdk_sock *sock, char *saddr, int slen, uint16_t *sport, char *caddr, int clen, uint16_t *cport); @@ -113,12 +115,12 @@ struct spdk_net_impl { STAILQ_ENTRY(spdk_net_impl) link; }; -void spdk_net_impl_register(struct spdk_net_impl *impl); +void spdk_net_impl_register(struct spdk_net_impl *impl, int priority); -#define SPDK_NET_IMPL_REGISTER(name, impl) \ +#define SPDK_NET_IMPL_REGISTER(name, impl, priority) \ static void __attribute__((constructor)) net_impl_register_##name(void) \ { \ - spdk_net_impl_register(impl); \ + spdk_net_impl_register(impl, priority); \ } static inline void diff --git a/lib/sock/sock.c b/lib/sock/sock.c index fa72e4b63..dcb1d2bd9 100644 --- a/lib/sock/sock.c +++ b/lib/sock/sock.c @@ -593,10 +593,21 @@ spdk_sock_group_close(struct spdk_sock_group **group) } void -spdk_net_impl_register(struct spdk_net_impl *impl) +spdk_net_impl_register(struct spdk_net_impl *impl, int priority) { - if (!strcmp("posix", impl->name)) { - STAILQ_INSERT_TAIL(&g_net_impls, impl, link); + struct spdk_net_impl *cur, *prev; + + impl->priority = priority; + prev = NULL; + STAILQ_FOREACH(cur, &g_net_impls, link) { + if (impl->priority > cur->priority) { + break; + } + prev = cur; + } + + if (prev) { + STAILQ_INSERT_AFTER(&g_net_impls, prev, impl, link); } else { STAILQ_INSERT_HEAD(&g_net_impls, impl, link); } diff --git a/module/sock/posix/posix.c b/module/sock/posix/posix.c index 3ec1061c5..bb3805867 100644 --- a/module/sock/posix/posix.c +++ b/module/sock/posix/posix.c @@ -885,4 +885,4 @@ static struct spdk_net_impl g_posix_net_impl = { .group_impl_close = spdk_posix_sock_group_impl_close, }; -SPDK_NET_IMPL_REGISTER(posix, &g_posix_net_impl); +SPDK_NET_IMPL_REGISTER(posix, &g_posix_net_impl, DEFAULT_SOCK_PRIORITY); diff --git a/module/sock/vpp/vpp.c b/module/sock/vpp/vpp.c index 0034f6e00..4a7db9ef8 100644 --- a/module/sock/vpp/vpp.c +++ b/module/sock/vpp/vpp.c @@ -1469,7 +1469,7 @@ static struct spdk_net_impl g_vpp_net_impl = { .group_impl_close = spdk_vpp_sock_group_impl_close, }; -SPDK_NET_IMPL_REGISTER(vpp, &g_vpp_net_impl); +SPDK_NET_IMPL_REGISTER(vpp, &g_vpp_net_impl, DEFAULT_SOCK_PRIORITY + 1); static void spdk_vpp_net_framework_fini(void) diff --git a/test/unit/lib/sock/posix.c/posix_ut.c b/test/unit/lib/sock/posix.c/posix_ut.c index b8a704043..1fb933e2c 100644 --- a/test/unit/lib/sock/posix.c/posix_ut.c +++ b/test/unit/lib/sock/posix.c/posix_ut.c @@ -40,7 +40,7 @@ #include "sock/posix/posix.c" -DEFINE_STUB_V(spdk_net_impl_register, (struct spdk_net_impl *impl)); +DEFINE_STUB_V(spdk_net_impl_register, (struct spdk_net_impl *impl, int priority)); DEFINE_STUB(spdk_sock_close, int, (struct spdk_sock **s), 0); static void diff --git a/test/unit/lib/sock/sock.c/sock_ut.c b/test/unit/lib/sock/sock.c/sock_ut.c index a4c61aa56..a8b8567a4 100644 --- a/test/unit/lib/sock/sock.c/sock_ut.c +++ b/test/unit/lib/sock/sock.c/sock_ut.c @@ -356,7 +356,7 @@ static struct spdk_net_impl g_ut_net_impl = { .group_impl_close = spdk_ut_sock_group_impl_close, }; -SPDK_NET_IMPL_REGISTER(ut, &g_ut_net_impl); +SPDK_NET_IMPL_REGISTER(ut, &g_ut_net_impl, DEFAULT_SOCK_PRIORITY + 2); static void _sock(const char *ip, int port, char *impl_name)