Commit e9938f77 authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

sock: add util to connect



Just moved common code from both posix.c and uring.c.

It is a prework for further changes to add connect timeout.

Change-Id: Ib8479daa86c61df241dc2147c5bf9582a7c47833
Signed-off-by: default avatarJacek Kalwas <jacek.kalwas@nutanix.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/25807


Reviewed-by: default avatarTomasz Zawadzki <tomasz@tzawadzki.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent ec1f0bd7
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ extern "C" {
#define MIN_SO_RCVBUF_SIZE (4 * 1024)
#define MIN_SO_SNDBUF_SIZE (4 * 1024)
#define IOV_BATCH_SIZE 64
#define PORTNUMLEN 32

struct spdk_sock {
	struct spdk_net_impl		*net_impl;
@@ -394,6 +395,13 @@ spdk_sock_get_placement_id(int fd, enum spdk_placement_mode mode, int *placement
int spdk_sock_posix_fd_create(struct addrinfo *res, struct spdk_sock_opts *opts,
			      struct spdk_sock_impl_opts *impl_opts);

/**
 * Connects the socket to the address.
 *
 * \return 0 on success, -1 on failure, 1 to retry with different address if available.
 */
int spdk_sock_posix_fd_connect(int fd, struct addrinfo *res, struct spdk_sock_opts *opts);

/**
 * Insert a group into the placement map.
 * If the group is already in the map, take a reference.
+42 −0
Original line number Diff line number Diff line
@@ -409,6 +409,48 @@ spdk_sock_posix_fd_create(struct addrinfo *res, struct spdk_sock_opts *opts,
	return fd;
}

int
spdk_sock_posix_fd_connect(int fd, struct addrinfo *res, struct spdk_sock_opts *opts)
{
	char portnum[PORTNUMLEN];
	const char *src_addr;
	uint16_t src_port;
	struct addrinfo hints, *src_ai;
	int rc;

	src_addr = SPDK_GET_FIELD(opts, src_addr, NULL, opts->opts_size);
	src_port = SPDK_GET_FIELD(opts, src_port, 0, opts->opts_size);
	if (src_addr != NULL || src_port != 0) {
		snprintf(portnum, sizeof(portnum), "%"PRIu16, src_port);
		memset(&hints, 0, sizeof hints);
		hints.ai_family = AF_UNSPEC;
		hints.ai_socktype = SOCK_STREAM;
		hints.ai_flags = AI_NUMERICSERV | AI_NUMERICHOST | AI_PASSIVE;
		rc = getaddrinfo(src_addr, src_port > 0 ? portnum : NULL, &hints, &src_ai);
		if (rc != 0 || src_ai == NULL) {
			SPDK_ERRLOG("getaddrinfo() failed %s (%d)\n", rc != 0 ? gai_strerror(rc) : "", rc);
			return -1;
		}

		rc = bind(fd, src_ai->ai_addr, src_ai->ai_addrlen);
		if (rc != 0) {
			SPDK_ERRLOG("bind() failed errno %d (%s:%s)\n", errno, src_addr ? src_addr : "", portnum);
			freeaddrinfo(src_ai);
			return -1;
		}

		freeaddrinfo(src_ai);
	}

	rc = connect(fd, res->ai_addr, res->ai_addrlen);
	if (rc != 0) {
		SPDK_ERRLOG("connect() failed, errno = %d\n", errno);
		return 1;
	}

	return 0;
}

struct spdk_sock *
spdk_sock_connect(const char *ip, int port, const char *impl_name)
{
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@
	# internal function in spdk_internal/sock_module.h
	spdk_net_impl_register;
	spdk_sock_posix_fd_create;
	spdk_sock_posix_fd_connect;
	spdk_sock_group_get_buf;
	spdk_sock_map_insert;
	spdk_sock_map_release;
+8 −38
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@
#include "openssl/ssl.h"

#define MAX_TMPBUF 1024
#define PORTNUMLEN 32

#if defined(SO_ZEROCOPY) && defined(MSG_ZEROCOPY)
#define SPDK_ZEROCOPY
@@ -861,9 +860,7 @@ posix_sock_create(const char *ip, int port,
	char buf[MAX_TMPBUF];
	char portnum[PORTNUMLEN];
	char *p;
	const char *src_addr;
	uint16_t src_port;
	struct addrinfo hints, *res, *res0, *src_ai;
	struct addrinfo hints, *res, *res0;
	int fd;
	int rc;
	bool enable_zcopy_user_opts = true;
@@ -943,44 +940,17 @@ retry:
			}
			enable_zcopy_impl_opts = impl_opts.enable_zerocopy_send_server;
		} else if (type == SPDK_SOCK_CREATE_CONNECT) {
			src_addr = SPDK_GET_FIELD(opts, src_addr, NULL, opts->opts_size);
			src_port = SPDK_GET_FIELD(opts, src_port, 0, opts->opts_size);
			if (src_addr != NULL || src_port != 0) {
				snprintf(portnum, sizeof(portnum), "%"PRIu16, src_port);
				memset(&hints, 0, sizeof hints);
				hints.ai_family = AF_UNSPEC;
				hints.ai_socktype = SOCK_STREAM;
				hints.ai_flags = AI_NUMERICSERV | AI_NUMERICHOST | AI_PASSIVE;
				rc = getaddrinfo(src_addr, src_port > 0 ? portnum : NULL,
						 &hints, &src_ai);
				if (rc != 0 || src_ai == NULL) {
					SPDK_ERRLOG("getaddrinfo() failed %s (%d)\n",
						    rc != 0 ? gai_strerror(rc) : "", rc);
					close(fd);
					fd = -1;
					break;
				}
				rc = bind(fd, src_ai->ai_addr, src_ai->ai_addrlen);
			rc = spdk_sock_posix_fd_connect(fd, res, opts);
			if (rc != 0) {
					SPDK_ERRLOG("bind() failed errno %d (%s:%s)\n", errno,
						    src_addr ? src_addr : "", portnum);
				close(fd);
				fd = -1;
					freeaddrinfo(src_ai);
					src_ai = NULL;
				if (rc == 1) {
					continue;
				} else {
					break;
				}
				freeaddrinfo(src_ai);
				src_ai = NULL;
			}
			rc = connect(fd, res->ai_addr, res->ai_addrlen);
			if (rc != 0) {
				SPDK_ERRLOG("connect() failed, errno = %d\n", errno);
				/* try next family */
				close(fd);
				fd = -1;
				continue;
			}

			enable_zcopy_impl_opts = impl_opts.enable_zerocopy_send_client;
			if (enable_ssl) {
				ctx = posix_sock_create_ssl_context(TLS_client_method(), opts, &impl_opts);
+7 −39
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@
#include "spdk/net.h"

#define MAX_TMPBUF 1024
#define PORTNUMLEN 32
#define SPDK_SOCK_GROUP_QUEUE_DEPTH 4096
#define SPDK_SOCK_CMG_INFO_SIZE (sizeof(struct cmsghdr) + sizeof(struct sock_extended_err))

@@ -478,9 +477,7 @@ uring_sock_create(const char *ip, int port,
	char buf[MAX_TMPBUF];
	char portnum[PORTNUMLEN];
	char *p;
	const char *src_addr;
	uint16_t src_port;
	struct addrinfo hints, *res, *res0, *src_ai;
	struct addrinfo hints, *res, *res0;
	int fd;
	int rc;
	bool enable_zcopy_impl_opts = false;
@@ -562,44 +559,15 @@ retry:

			enable_zcopy_impl_opts = impl_opts.enable_zerocopy_send_server;
		} else if (type == SPDK_SOCK_CREATE_CONNECT) {
			src_addr = SPDK_GET_FIELD(opts, src_addr, NULL, opts->opts_size);
			src_port = SPDK_GET_FIELD(opts, src_port, 0, opts->opts_size);
			if (src_addr != NULL || src_port != 0) {
				snprintf(portnum, sizeof(portnum), "%"PRIu16, src_port);
				memset(&hints, 0, sizeof hints);
				hints.ai_family = AF_UNSPEC;
				hints.ai_socktype = SOCK_STREAM;
				hints.ai_flags = AI_NUMERICSERV | AI_NUMERICHOST | AI_PASSIVE;
				rc = getaddrinfo(src_addr, src_port > 0 ? portnum : NULL,
						 &hints, &src_ai);
				if (rc != 0 || src_ai == NULL) {
					SPDK_ERRLOG("getaddrinfo() failed %s (%d)\n",
						    rc != 0 ? gai_strerror(rc) : "", rc);
					close(fd);
					fd = -1;
					break;
				}
				rc = bind(fd, src_ai->ai_addr, src_ai->ai_addrlen);
			rc = spdk_sock_posix_fd_connect(fd, res, opts);
			if (rc != 0) {
					SPDK_ERRLOG("bind() failed errno %d (%s:%s)\n", errno,
						    src_addr ? src_addr : "", portnum);
				close(fd);
				fd = -1;
					freeaddrinfo(src_ai);
					src_ai = NULL;
				if (rc == 1) {
					continue;
				} else {
					break;
				}
				freeaddrinfo(src_ai);
				src_ai = NULL;
			}

			rc = connect(fd, res->ai_addr, res->ai_addrlen);
			if (rc != 0) {
				SPDK_ERRLOG("connect() failed, errno = %d\n", errno);
				/* try next family */
				close(fd);
				fd = -1;
				continue;
			}

			if (spdk_fd_clear_nonblock(fd) < 0) {
Loading