Commit 6e98729c authored by Konrad Sztyber's avatar Konrad Sztyber
Browse files

nvme: allow NULL address/port in nvme_parse_addr()



Omitting port can be useful when specifying local address to use for
establishing the connection.

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


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>
Community-CI: Mellanox Build Bot
parent 22744fa0
Loading
Loading
Loading
Loading
+6 −9
Original line number Diff line number Diff line
@@ -1631,16 +1631,13 @@ nvme_parse_addr(struct sockaddr_storage *sa, int family, const char *addr, const
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = 0;

	if (addr == NULL || service == NULL) {
		SPDK_ERRLOG("addr and service must both be non-NULL\n");
		return -EINVAL;
	}

	if (service != NULL) {
		*port = spdk_strtol(service, 10);
		if (*port <= 0 || *port >= 65536) {
			SPDK_ERRLOG("Invalid port: %s\n", service);
			return -EINVAL;
		}
	}

	ret = getaddrinfo(addr, service, &hints, &res);
	if (ret) {
+5 −2
Original line number Diff line number Diff line
@@ -1185,7 +1185,7 @@ nvme_rdma_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qp
	struct sockaddr_storage dst_addr;
	struct sockaddr_storage src_addr;
	bool src_addr_specified;
	long int port, src_port;
	long int port, src_port = 0;
	int rc;
	struct nvme_rdma_ctrlr *rctrlr;
	struct nvme_rdma_qpair *rqpair;
@@ -1221,7 +1221,10 @@ nvme_rdma_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qp

	if (ctrlr->opts.src_addr[0] || ctrlr->opts.src_svcid[0]) {
		memset(&src_addr, 0, sizeof(src_addr));
		rc = nvme_parse_addr(&src_addr, family, ctrlr->opts.src_addr, ctrlr->opts.src_svcid, &src_port);
		rc = nvme_parse_addr(&src_addr, family,
				     ctrlr->opts.src_addr[0] ? ctrlr->opts.src_addr : NULL,
				     ctrlr->opts.src_svcid[0] ? ctrlr->opts.src_svcid : NULL,
				     &src_port);
		if (rc != 0) {
			SPDK_ERRLOG("src_addr nvme_parse_addr() failed\n");
			return -1;
+5 −2
Original line number Diff line number Diff line
@@ -2313,7 +2313,7 @@ nvme_tcp_qpair_connect_sock(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpai
	int rc;
	struct nvme_tcp_qpair *tqpair;
	int family;
	long int port, src_port;
	long int port, src_port = 0;
	char *sock_impl_name;
	struct spdk_sock_impl_opts impl_opts = {};
	size_t impl_opts_size = sizeof(impl_opts);
@@ -2348,7 +2348,10 @@ nvme_tcp_qpair_connect_sock(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpai

	if (ctrlr->opts.src_addr[0] || ctrlr->opts.src_svcid[0]) {
		memset(&src_addr, 0, sizeof(src_addr));
		rc = nvme_parse_addr(&src_addr, family, ctrlr->opts.src_addr, ctrlr->opts.src_svcid, &src_port);
		rc = nvme_parse_addr(&src_addr, family,
				     ctrlr->opts.src_addr[0] ? ctrlr->opts.src_addr : NULL,
				     ctrlr->opts.src_svcid[0] ? ctrlr->opts.src_svcid : NULL,
				     &src_port);
		if (rc != 0) {
			SPDK_ERRLOG("src_addr nvme_parse_addr() failed\n");
			return rc;