From 11ed34831e12051cb5af1ddf84e7963c87ccf924 Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Tue, 13 Mar 2018 10:41:24 -0400 Subject: [PATCH] net_framework: add registering of multiple spdk_net_frameworks Its possible for a net_framework to have initialization and finish functions. This patch adds mechanism to register spdk_net_framework and executes appropriate functions during subsystem start/finish. Change-Id: I06d9cb6e98f843794296b833caa3c79735f06f12 Signed-off-by: Tomasz Zawadzki Reviewed-on: https://review.gerrithub.io/403703 Reviewed-by: Daniel Verkamp Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris --- include/spdk/net.h | 17 +++++++++++++++++ lib/net/net_framework.c | 27 +++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/include/spdk/net.h b/include/spdk/net.h index f97efe14d..026584f84 100644 --- a/include/spdk/net.h +++ b/include/spdk/net.h @@ -48,6 +48,23 @@ extern "C" { struct spdk_sock; +struct spdk_net_framework { + const char *name; + + int (*init)(void); + void (*fini)(void); + + STAILQ_ENTRY(spdk_net_framework) link; +}; + +void spdk_net_framework_register(struct spdk_net_framework *frame); + +#define SPDK_NET_FRAMEWORK_REGISTER(name, frame) \ +static void __attribute__((constructor)) net_framework_register_##name(void) \ +{ \ + spdk_net_framework_register(frame); \ +} + int spdk_interface_init(void); void spdk_interface_destroy(void); diff --git a/lib/net/net_framework.c b/lib/net/net_framework.c index 8e7da58f7..5d5a568fb 100644 --- a/lib/net/net_framework.c +++ b/lib/net/net_framework.c @@ -31,13 +31,40 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "spdk/log.h" #include "spdk/net.h" +#include "spdk/queue.h" + +static STAILQ_HEAD(, spdk_net_framework) g_net_frameworks = + STAILQ_HEAD_INITIALIZER(g_net_frameworks); int spdk_net_framework_start(void) { + struct spdk_net_framework *net_framework = NULL; + int rc; + + STAILQ_FOREACH_FROM(net_framework, &g_net_frameworks, link) { + rc = net_framework->init(); + if (rc != 0) { + SPDK_ERRLOG("Net framework %s failed to initalize\n", net_framework->name); + return rc; + } + } + return 0; } void spdk_net_framework_fini(void) { + struct spdk_net_framework *net_framework = NULL; + + STAILQ_FOREACH_FROM(net_framework, &g_net_frameworks, link) { + net_framework->fini(); + } +} + +void +spdk_net_framework_register(struct spdk_net_framework *frame) +{ + STAILQ_INSERT_TAIL(&g_net_frameworks, frame, link); }