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 <james.r.harris@intel.com> Change-Id: I7a380cc62c59bdac98996faf0387550c234165a0 Reviewed-on: https://review.gerrithub.io/400527 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
d4033356dc
commit
5665dbd91f
@ -66,11 +66,12 @@ struct spdk_net_impl {
|
|||||||
bool (*is_ipv6)(struct spdk_sock *sock);
|
bool (*is_ipv6)(struct spdk_sock *sock);
|
||||||
bool (*is_ipv4)(struct spdk_sock *sock);
|
bool (*is_ipv4)(struct spdk_sock *sock);
|
||||||
|
|
||||||
struct spdk_sock_group *(*group_create)(void);
|
struct spdk_sock_group_impl *(*group_impl_create)(void);
|
||||||
int (*group_add_sock)(struct spdk_sock_group *group, struct spdk_sock *sock);
|
int (*group_impl_add_sock)(struct spdk_sock_group_impl *group, struct spdk_sock *sock);
|
||||||
int (*group_remove_sock)(struct spdk_sock_group *group, struct spdk_sock *sock);
|
int (*group_impl_remove_sock)(struct spdk_sock_group_impl *group, struct spdk_sock *sock);
|
||||||
int (*group_poll)(struct spdk_sock_group *group, int max_events, struct spdk_sock **socks);
|
int (*group_impl_poll)(struct spdk_sock_group_impl *group, int max_events,
|
||||||
int (*group_close)(struct spdk_sock_group *group);
|
struct spdk_sock **socks);
|
||||||
|
int (*group_impl_close)(struct spdk_sock_group_impl *group);
|
||||||
|
|
||||||
STAILQ_ENTRY(spdk_net_impl) link;
|
STAILQ_ENTRY(spdk_net_impl) link;
|
||||||
};
|
};
|
||||||
|
@ -65,11 +65,16 @@ struct spdk_posix_sock {
|
|||||||
|
|
||||||
struct spdk_sock_group {
|
struct spdk_sock_group {
|
||||||
struct spdk_net_impl *net_impl;
|
struct spdk_net_impl *net_impl;
|
||||||
|
struct spdk_sock_group_impl *group_impl;
|
||||||
TAILQ_HEAD(, spdk_sock) socks;
|
TAILQ_HEAD(, spdk_sock) socks;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct spdk_posix_sock_group {
|
struct spdk_sock_group_impl {
|
||||||
struct spdk_sock_group base;
|
TAILQ_ENTRY(spdk_sock_group_impl) link;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct spdk_posix_sock_group_impl {
|
||||||
|
struct spdk_sock_group_impl base;
|
||||||
int fd;
|
int fd;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -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_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
|
static int
|
||||||
spdk_posix_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, char *caddr, int clen)
|
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);
|
return (sa.ss_family == AF_INET);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct spdk_sock_group *
|
static struct spdk_sock_group_impl *
|
||||||
spdk_posix_sock_group_create(void)
|
spdk_posix_sock_group_impl_create(void)
|
||||||
{
|
{
|
||||||
struct spdk_posix_sock_group *sock_group;
|
struct spdk_posix_sock_group_impl *group_impl;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
@ -452,22 +457,22 @@ spdk_posix_sock_group_create(void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sock_group = calloc(1, sizeof(*sock_group));
|
group_impl = calloc(1, sizeof(*group_impl));
|
||||||
if (sock_group == NULL) {
|
if (group_impl == NULL) {
|
||||||
SPDK_ERRLOG("sock_group allocation failed\n");
|
SPDK_ERRLOG("group_impl allocation failed\n");
|
||||||
close(fd);
|
close(fd);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
sock_group->fd = fd;
|
group_impl->fd = fd;
|
||||||
|
|
||||||
return &sock_group->base;
|
return &group_impl->base;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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);
|
struct spdk_posix_sock *sock = __posix_sock(_sock);
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@ -490,9 +495,9 @@ spdk_posix_sock_group_add_sock(struct spdk_sock_group *_group, struct spdk_sock
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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);
|
struct spdk_posix_sock *sock = __posix_sock(_sock);
|
||||||
int rc;
|
int rc;
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
@ -516,9 +521,10 @@ spdk_posix_sock_group_remove_sock(struct spdk_sock_group *_group, struct spdk_so
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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;
|
int num_events, i;
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
@ -548,9 +554,9 @@ spdk_posix_sock_group_poll(struct spdk_sock_group *_group, int max_events, struc
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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);
|
return close(group->fd);
|
||||||
}
|
}
|
||||||
@ -569,11 +575,11 @@ static struct spdk_net_impl g_posix_net_impl = {
|
|||||||
.set_sendbuf = spdk_posix_sock_set_sendbuf,
|
.set_sendbuf = spdk_posix_sock_set_sendbuf,
|
||||||
.is_ipv6 = spdk_posix_sock_is_ipv6,
|
.is_ipv6 = spdk_posix_sock_is_ipv6,
|
||||||
.is_ipv4 = spdk_posix_sock_is_ipv4,
|
.is_ipv4 = spdk_posix_sock_is_ipv4,
|
||||||
.group_create = spdk_posix_sock_group_create,
|
.group_impl_create = spdk_posix_sock_group_impl_create,
|
||||||
.group_add_sock = spdk_posix_sock_group_add_sock,
|
.group_impl_add_sock = spdk_posix_sock_group_impl_add_sock,
|
||||||
.group_remove_sock = spdk_posix_sock_group_remove_sock,
|
.group_impl_remove_sock = spdk_posix_sock_group_impl_remove_sock,
|
||||||
.group_poll = spdk_posix_sock_group_poll,
|
.group_impl_poll = spdk_posix_sock_group_impl_poll,
|
||||||
.group_close = spdk_posix_sock_group_close,
|
.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);
|
||||||
@ -713,11 +719,18 @@ struct spdk_sock_group *
|
|||||||
spdk_sock_group_create(void)
|
spdk_sock_group_create(void)
|
||||||
{
|
{
|
||||||
struct spdk_sock_group *group;
|
struct spdk_sock_group *group;
|
||||||
|
struct spdk_sock_group_impl *group_impl;
|
||||||
|
|
||||||
group = STAILQ_FIRST(&g_net_impls)->group_create();
|
group = calloc(1, sizeof(*group));
|
||||||
if (group != NULL) {
|
if (group == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
group_impl = STAILQ_FIRST(&g_net_impls)->group_impl_create();
|
||||||
|
if (group_impl != NULL) {
|
||||||
TAILQ_INIT(&group->socks);
|
TAILQ_INIT(&group->socks);
|
||||||
group->net_impl = STAILQ_FIRST(&g_net_impls);
|
group->net_impl = STAILQ_FIRST(&g_net_impls);
|
||||||
|
group->group_impl = group_impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
return group;
|
return group;
|
||||||
@ -743,7 +756,7 @@ spdk_sock_group_add_sock(struct spdk_sock_group *group, struct spdk_sock *sock,
|
|||||||
return -1;
|
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) {
|
if (rc == 0) {
|
||||||
TAILQ_INSERT_TAIL(&group->socks, sock, link);
|
TAILQ_INSERT_TAIL(&group->socks, sock, link);
|
||||||
sock->cb_fn = cb_fn;
|
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;
|
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) {
|
if (rc == 0) {
|
||||||
TAILQ_REMOVE(&group->socks, sock, link);
|
TAILQ_REMOVE(&group->socks, sock, link);
|
||||||
sock->cb_fn = NULL;
|
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;
|
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) {
|
if (num_events == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -822,8 +835,9 @@ spdk_sock_group_close(struct spdk_sock_group **group)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = (*group)->net_impl->group_close(*group);
|
rc = (*group)->net_impl->group_impl_close((*group)->group_impl);
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
|
free((*group)->group_impl);
|
||||||
free(*group);
|
free(*group);
|
||||||
*group = NULL;
|
*group = NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user