net: convert posix routines into an spdk_net_impl
Also convert the primary spdk_sock/spdk_sock_group routines to use the spdk_net_impl abstraction instead of calling the posix routines directly. Signed-off-by: Jim Harris <james.r.harris@intel.com> Change-Id: I6ae8f4aae619f326f28c40f28a387ada1b263e27 Reviewed-on: https://review.gerrithub.io/400335 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
8181153da0
commit
d4033356dc
@ -52,6 +52,7 @@
|
||||
STAILQ_HEAD(, spdk_net_impl) g_net_impls = STAILQ_HEAD_INITIALIZER(g_net_impls);
|
||||
|
||||
struct spdk_sock {
|
||||
struct spdk_net_impl *net_impl;
|
||||
spdk_sock_cb cb_fn;
|
||||
void *cb_arg;
|
||||
TAILQ_ENTRY(spdk_sock) link;
|
||||
@ -63,6 +64,7 @@ struct spdk_posix_sock {
|
||||
};
|
||||
|
||||
struct spdk_sock_group {
|
||||
struct spdk_net_impl *net_impl;
|
||||
TAILQ_HEAD(, spdk_sock) socks;
|
||||
};
|
||||
|
||||
@ -514,8 +516,7 @@ spdk_posix_sock_group_remove_sock(struct spdk_sock_group *_group, struct spdk_so
|
||||
}
|
||||
|
||||
static int
|
||||
spdk_posix_sock_group_poll_count(struct spdk_sock_group *_group, int max_events,
|
||||
struct spdk_sock **socks)
|
||||
spdk_posix_sock_group_poll(struct spdk_sock_group *_group, int max_events, struct spdk_sock **socks)
|
||||
{
|
||||
struct spdk_posix_sock_group *group = __posix_group(_group);
|
||||
int num_events, i;
|
||||
@ -554,28 +555,80 @@ spdk_posix_sock_group_close(struct spdk_sock_group *_group)
|
||||
return close(group->fd);
|
||||
}
|
||||
|
||||
static struct spdk_net_impl g_posix_net_impl = {
|
||||
.name = "posix",
|
||||
.getaddr = spdk_posix_sock_getaddr,
|
||||
.connect = spdk_posix_sock_connect,
|
||||
.listen = spdk_posix_sock_listen,
|
||||
.accept = spdk_posix_sock_accept,
|
||||
.close = spdk_posix_sock_close,
|
||||
.recv = spdk_posix_sock_recv,
|
||||
.writev = spdk_posix_sock_writev,
|
||||
.set_recvlowat = spdk_posix_sock_set_recvlowat,
|
||||
.set_recvbuf = spdk_posix_sock_set_recvbuf,
|
||||
.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,
|
||||
};
|
||||
|
||||
SPDK_NET_IMPL_REGISTER(posix, &g_posix_net_impl);
|
||||
|
||||
int
|
||||
spdk_sock_getaddr(struct spdk_sock *sock, char *saddr, int slen, char *caddr, int clen)
|
||||
{
|
||||
return spdk_posix_sock_getaddr(sock, saddr, slen, caddr, clen);
|
||||
return sock->net_impl->getaddr(sock, saddr, slen, caddr, clen);
|
||||
}
|
||||
|
||||
struct spdk_sock *
|
||||
spdk_sock_connect(const char *ip, int port)
|
||||
{
|
||||
return spdk_posix_sock_connect(ip, port);
|
||||
struct spdk_net_impl *impl = NULL;
|
||||
struct spdk_sock *sock;
|
||||
|
||||
STAILQ_FOREACH_FROM(impl, &g_net_impls, link) {
|
||||
sock = impl->connect(ip, port);
|
||||
if (sock != NULL) {
|
||||
sock->net_impl = impl;
|
||||
return sock;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct spdk_sock *
|
||||
spdk_sock_listen(const char *ip, int port)
|
||||
{
|
||||
return spdk_posix_sock_listen(ip, port);
|
||||
struct spdk_net_impl *impl = NULL;
|
||||
struct spdk_sock *sock;
|
||||
|
||||
STAILQ_FOREACH_FROM(impl, &g_net_impls, link) {
|
||||
sock = impl->listen(ip, port);
|
||||
if (sock != NULL) {
|
||||
sock->net_impl = impl;
|
||||
return sock;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct spdk_sock *
|
||||
spdk_sock_accept(struct spdk_sock *sock)
|
||||
{
|
||||
return spdk_posix_sock_accept(sock);
|
||||
struct spdk_sock *new_sock;
|
||||
|
||||
new_sock = sock->net_impl->accept(sock);
|
||||
if (new_sock != NULL) {
|
||||
new_sock->net_impl = sock->net_impl;
|
||||
}
|
||||
|
||||
return new_sock;
|
||||
}
|
||||
|
||||
int
|
||||
@ -594,7 +647,7 @@ spdk_sock_close(struct spdk_sock **sock)
|
||||
return -1;
|
||||
}
|
||||
|
||||
rc = spdk_posix_sock_close(*sock);
|
||||
rc = (*sock)->net_impl->close(*sock);
|
||||
if (rc == 0) {
|
||||
free(*sock);
|
||||
*sock = NULL;
|
||||
@ -611,7 +664,7 @@ spdk_sock_recv(struct spdk_sock *sock, void *buf, size_t len)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return spdk_posix_sock_recv(sock, buf, len);
|
||||
return sock->net_impl->recv(sock, buf, len);
|
||||
}
|
||||
|
||||
ssize_t
|
||||
@ -622,38 +675,38 @@ spdk_sock_writev(struct spdk_sock *sock, struct iovec *iov, int iovcnt)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return spdk_posix_sock_writev(sock, iov, iovcnt);
|
||||
return sock->net_impl->writev(sock, iov, iovcnt);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
spdk_sock_set_recvlowat(struct spdk_sock *sock, int nbytes)
|
||||
{
|
||||
return spdk_posix_sock_set_recvlowat(sock, nbytes);
|
||||
return sock->net_impl->set_recvlowat(sock, nbytes);
|
||||
}
|
||||
|
||||
int
|
||||
spdk_sock_set_recvbuf(struct spdk_sock *sock, int sz)
|
||||
{
|
||||
return spdk_posix_sock_set_recvbuf(sock, sz);
|
||||
return sock->net_impl->set_recvbuf(sock, sz);
|
||||
}
|
||||
|
||||
int
|
||||
spdk_sock_set_sendbuf(struct spdk_sock *sock, int sz)
|
||||
{
|
||||
return spdk_posix_sock_set_sendbuf(sock, sz);
|
||||
return sock->net_impl->set_sendbuf(sock, sz);
|
||||
}
|
||||
|
||||
bool
|
||||
spdk_sock_is_ipv6(struct spdk_sock *sock)
|
||||
{
|
||||
return spdk_posix_sock_is_ipv6(sock);
|
||||
return sock->net_impl->is_ipv6(sock);
|
||||
}
|
||||
|
||||
bool
|
||||
spdk_sock_is_ipv4(struct spdk_sock *sock)
|
||||
{
|
||||
return spdk_posix_sock_is_ipv4(sock);
|
||||
return sock->net_impl->is_ipv4(sock);
|
||||
}
|
||||
|
||||
struct spdk_sock_group *
|
||||
@ -661,9 +714,10 @@ spdk_sock_group_create(void)
|
||||
{
|
||||
struct spdk_sock_group *group;
|
||||
|
||||
group = spdk_posix_sock_group_create();
|
||||
group = STAILQ_FIRST(&g_net_impls)->group_create();
|
||||
if (group != NULL) {
|
||||
TAILQ_INIT(&group->socks);
|
||||
group->net_impl = STAILQ_FIRST(&g_net_impls);
|
||||
}
|
||||
|
||||
return group;
|
||||
@ -689,7 +743,7 @@ spdk_sock_group_add_sock(struct spdk_sock_group *group, struct spdk_sock *sock,
|
||||
return -1;
|
||||
}
|
||||
|
||||
rc = spdk_posix_sock_group_add_sock(group, sock);
|
||||
rc = group->net_impl->group_add_sock(group, sock);
|
||||
if (rc == 0) {
|
||||
TAILQ_INSERT_TAIL(&group->socks, sock, link);
|
||||
sock->cb_fn = cb_fn;
|
||||
@ -704,7 +758,7 @@ spdk_sock_group_remove_sock(struct spdk_sock_group *group, struct spdk_sock *soc
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = spdk_posix_sock_group_remove_sock(group, sock);
|
||||
rc = group->net_impl->group_remove_sock(group, sock);
|
||||
if (rc == 0) {
|
||||
TAILQ_REMOVE(&group->socks, sock, link);
|
||||
sock->cb_fn = NULL;
|
||||
@ -739,7 +793,7 @@ spdk_sock_group_poll_count(struct spdk_sock_group *group, int max_events)
|
||||
max_events = MAX_EVENTS_PER_POLL;
|
||||
}
|
||||
|
||||
num_events = spdk_posix_sock_group_poll_count(group, max_events, socks);
|
||||
num_events = group->net_impl->group_poll(group, max_events, socks);
|
||||
if (num_events == -1) {
|
||||
return -1;
|
||||
}
|
||||
@ -768,7 +822,7 @@ spdk_sock_group_close(struct spdk_sock_group **group)
|
||||
return -1;
|
||||
}
|
||||
|
||||
rc = spdk_posix_sock_group_close(*group);
|
||||
rc = (*group)->net_impl->group_close(*group);
|
||||
if (rc == 0) {
|
||||
free(*group);
|
||||
*group = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user