Commit d4033356 authored by Jim Harris's avatar Jim Harris Committed by Daniel Verkamp
Browse files

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: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I6ae8f4aae619f326f28c40f28a387ada1b263e27

Reviewed-on: https://review.gerrithub.io/400335


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 8181153d
Loading
Loading
Loading
Loading
+73 −19
Original line number Diff line number Diff line
@@ -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;