From 5665dbd91f0b9a46aca061eb6522276a9102c4cf Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Sun, 18 Feb 2018 21:52:43 -0700 Subject: [PATCH] net: add spdk_sock_group_impl spdk_sock_group_impl represents the implementation of a sock group for a given spdk_net_impl (posix, vpp, etc.) This extra abstraction is required for enabling spdk_sock_groups with sockets associated with different spdk_net_impls. Signed-off-by: Jim Harris Change-Id: I7a380cc62c59bdac98996faf0387550c234165a0 Reviewed-on: https://review.gerrithub.io/400527 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Shuhei Matsumoto --- include/spdk_internal/sock.h | 11 ++--- lib/net/sock.c | 80 +++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 38 deletions(-) diff --git a/include/spdk_internal/sock.h b/include/spdk_internal/sock.h index 4421c5c27..1693ff20d 100644 --- a/include/spdk_internal/sock.h +++ b/include/spdk_internal/sock.h @@ -66,11 +66,12 @@ struct spdk_net_impl { bool (*is_ipv6)(struct spdk_sock *sock); bool (*is_ipv4)(struct spdk_sock *sock); - struct spdk_sock_group *(*group_create)(void); - int (*group_add_sock)(struct spdk_sock_group *group, struct spdk_sock *sock); - int (*group_remove_sock)(struct spdk_sock_group *group, struct spdk_sock *sock); - int (*group_poll)(struct spdk_sock_group *group, int max_events, struct spdk_sock **socks); - int (*group_close)(struct spdk_sock_group *group); + 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); + int (*group_impl_poll)(struct spdk_sock_group_impl *group, int max_events, + struct spdk_sock **socks); + int (*group_impl_close)(struct spdk_sock_group_impl *group); STAILQ_ENTRY(spdk_net_impl) link; }; diff --git a/lib/net/sock.c b/lib/net/sock.c index 78f7ac320..1af982fab 100644 --- a/lib/net/sock.c +++ b/lib/net/sock.c @@ -64,13 +64,18 @@ struct spdk_posix_sock { }; struct spdk_sock_group { - struct spdk_net_impl *net_impl; - TAILQ_HEAD(, spdk_sock) socks; + struct spdk_net_impl *net_impl; + struct spdk_sock_group_impl *group_impl; + TAILQ_HEAD(, spdk_sock) socks; }; -struct spdk_posix_sock_group { - struct spdk_sock_group base; - int fd; +struct spdk_sock_group_impl { + TAILQ_ENTRY(spdk_sock_group_impl) link; +}; + +struct spdk_posix_sock_group_impl { + struct spdk_sock_group_impl base; + int fd; }; static int get_addr_str(struct sockaddr *sa, char *host, size_t hlen) @@ -102,7 +107,7 @@ static int get_addr_str(struct sockaddr *sa, char *host, size_t hlen) } #define __posix_sock(sock) (struct spdk_posix_sock *)sock -#define __posix_group(group) (struct spdk_posix_sock_group *)group +#define __posix_group_impl(group) (struct spdk_posix_sock_group_impl *)group static int spdk_posix_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, char *caddr, int clen) @@ -437,10 +442,10 @@ spdk_posix_sock_is_ipv4(struct spdk_sock *_sock) return (sa.ss_family == AF_INET); } -static struct spdk_sock_group * -spdk_posix_sock_group_create(void) +static struct spdk_sock_group_impl * +spdk_posix_sock_group_impl_create(void) { - struct spdk_posix_sock_group *sock_group; + struct spdk_posix_sock_group_impl *group_impl; int fd; #if defined(__linux__) @@ -452,22 +457,22 @@ spdk_posix_sock_group_create(void) return NULL; } - sock_group = calloc(1, sizeof(*sock_group)); - if (sock_group == NULL) { - SPDK_ERRLOG("sock_group allocation failed\n"); + group_impl = calloc(1, sizeof(*group_impl)); + if (group_impl == NULL) { + SPDK_ERRLOG("group_impl allocation failed\n"); close(fd); return NULL; } - sock_group->fd = fd; + group_impl->fd = fd; - return &sock_group->base; + return &group_impl->base; } static int -spdk_posix_sock_group_add_sock(struct spdk_sock_group *_group, struct spdk_sock *_sock) +spdk_posix_sock_group_impl_add_sock(struct spdk_sock_group_impl *_group, struct spdk_sock *_sock) { - struct spdk_posix_sock_group *group = __posix_group(_group); + struct spdk_posix_sock_group_impl *group = __posix_group_impl(_group); struct spdk_posix_sock *sock = __posix_sock(_sock); int rc; @@ -490,9 +495,9 @@ spdk_posix_sock_group_add_sock(struct spdk_sock_group *_group, struct spdk_sock } static int -spdk_posix_sock_group_remove_sock(struct spdk_sock_group *_group, struct spdk_sock *_sock) +spdk_posix_sock_group_impl_remove_sock(struct spdk_sock_group_impl *_group, struct spdk_sock *_sock) { - struct spdk_posix_sock_group *group = __posix_group(_group); + struct spdk_posix_sock_group_impl *group = __posix_group_impl(_group); struct spdk_posix_sock *sock = __posix_sock(_sock); int rc; #if defined(__linux__) @@ -516,9 +521,10 @@ spdk_posix_sock_group_remove_sock(struct spdk_sock_group *_group, struct spdk_so } static int -spdk_posix_sock_group_poll(struct spdk_sock_group *_group, int max_events, struct spdk_sock **socks) +spdk_posix_sock_group_impl_poll(struct spdk_sock_group_impl *_group, int max_events, + struct spdk_sock **socks) { - struct spdk_posix_sock_group *group = __posix_group(_group); + struct spdk_posix_sock_group_impl *group = __posix_group_impl(_group); int num_events, i; #if defined(__linux__) @@ -548,9 +554,9 @@ spdk_posix_sock_group_poll(struct spdk_sock_group *_group, int max_events, struc } static int -spdk_posix_sock_group_close(struct spdk_sock_group *_group) +spdk_posix_sock_group_impl_close(struct spdk_sock_group_impl *_group) { - struct spdk_posix_sock_group *group = __posix_group(_group); + struct spdk_posix_sock_group_impl *group = __posix_group_impl(_group); return close(group->fd); } @@ -569,11 +575,11 @@ 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, - .group_create = spdk_posix_sock_group_create, - .group_add_sock = spdk_posix_sock_group_add_sock, - .group_remove_sock = spdk_posix_sock_group_remove_sock, - .group_poll = spdk_posix_sock_group_poll, - .group_close = spdk_posix_sock_group_close, + .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, + .group_impl_poll = spdk_posix_sock_group_impl_poll, + .group_impl_close = spdk_posix_sock_group_impl_close, }; SPDK_NET_IMPL_REGISTER(posix, &g_posix_net_impl); @@ -713,11 +719,18 @@ struct spdk_sock_group * spdk_sock_group_create(void) { struct spdk_sock_group *group; + struct spdk_sock_group_impl *group_impl; - group = STAILQ_FIRST(&g_net_impls)->group_create(); - if (group != NULL) { + group = calloc(1, sizeof(*group)); + if (group == NULL) { + return NULL; + } + + group_impl = STAILQ_FIRST(&g_net_impls)->group_impl_create(); + if (group_impl != NULL) { TAILQ_INIT(&group->socks); group->net_impl = STAILQ_FIRST(&g_net_impls); + group->group_impl = group_impl; } return group; @@ -743,7 +756,7 @@ spdk_sock_group_add_sock(struct spdk_sock_group *group, struct spdk_sock *sock, return -1; } - rc = group->net_impl->group_add_sock(group, sock); + rc = group->net_impl->group_impl_add_sock(group->group_impl, sock); if (rc == 0) { TAILQ_INSERT_TAIL(&group->socks, sock, link); sock->cb_fn = cb_fn; @@ -758,7 +771,7 @@ spdk_sock_group_remove_sock(struct spdk_sock_group *group, struct spdk_sock *soc { int rc; - rc = group->net_impl->group_remove_sock(group, sock); + rc = group->net_impl->group_impl_remove_sock(group->group_impl, sock); if (rc == 0) { TAILQ_REMOVE(&group->socks, sock, link); sock->cb_fn = NULL; @@ -793,7 +806,7 @@ spdk_sock_group_poll_count(struct spdk_sock_group *group, int max_events) max_events = MAX_EVENTS_PER_POLL; } - num_events = group->net_impl->group_poll(group, max_events, socks); + num_events = group->net_impl->group_impl_poll(group->group_impl, max_events, socks); if (num_events == -1) { return -1; } @@ -822,8 +835,9 @@ spdk_sock_group_close(struct spdk_sock_group **group) return -1; } - rc = (*group)->net_impl->group_close(*group); + rc = (*group)->net_impl->group_impl_close((*group)->group_impl); if (rc == 0) { + free((*group)->group_impl); free(*group); *group = NULL; }