Commit 044b7416 authored by Konrad Sztyber's avatar Konrad Sztyber
Browse files

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



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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz@tzawadzki.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
parent b4e49c37
Loading
Loading
Loading
Loading
+31 −1
Original line number Diff line number Diff line
@@ -938,7 +938,9 @@ posix_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 rc;
	bool enable_zcopy_user_opts = true;
@@ -1018,6 +1020,34 @@ 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);