Commit 22744fa0 authored by Konrad Sztyber's avatar Konrad Sztyber
Browse files

sock/uring: support src_{addr,port} in connect()



Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I29283d79abb186467e2489d5cef99ec3c8768742
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24067


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarTomasz Zawadzki <tomasz@tzawadzki.com>
parent 044b7416
Loading
Loading
Loading
Loading
+32 −1
Original line number Diff line number Diff line
@@ -476,7 +476,9 @@ uring_sock_create(const char *ip, int port,
	char buf[MAX_TMPBUF];
	char portnum[PORTNUMLEN];
	char *p;
	struct addrinfo hints, *res, *res0;
	const char *src_addr;
	uint16_t src_port;
	struct addrinfo hints, *res, *res0, *src_ai;
	int fd, flag;
	int val = 1;
	int rc;
@@ -627,6 +629,35 @@ 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);
				if (rc != 0) {
					SPDK_ERRLOG("bind() failed errno %d (%s:%s)\n", errno,
						    src_addr ? src_addr : "", portnum);
					close(fd);
					fd = -1;
					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);