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); }