Commit 9645ea13 authored by Jim Harris's avatar Jim Harris
Browse files

util: move module/sock/sock_kernel.h contents to net.c



This header file contained helper functions that both posix and uring
sock modules were using to operate on file descriptors. Promote them
to the util library in the newly formed net.c file, and rename the
functions as follows:

get_addr_str => spdk_net_get_address_string
sock_is_loopback => spdk_net_is_loopback

Signed-off-by: default avatarJim Harris <jim.harris@samsung.com>
Change-Id: I89b6e766ad8cf272afcefb8bf5a87ad3b1db2d6b
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24047


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent e8671c89
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -29,6 +29,26 @@ extern "C" {
 */
int spdk_net_get_interface_name(const char *ip, char *ifc, size_t len);

/**
 * Gets the address string for a given struct sockaddr
 *
 * \param sa sockaddr to get the address string for
 * \param addr string to put the address
 * \param len length of the the addr parameter
 *
 * \return 0 if successful, negative -errno otherwise
 */
int spdk_net_get_address_string(struct sockaddr *sa, char *addr, size_t len);

/**
 * Checks if the given fd is a loopback interface or not.
 *
 * \param fd file descriptor to check
 *
 * \return true if the fd is loopback, false if not
 */
bool spdk_net_is_loopback(int fd);

#ifdef __cplusplus
}
#endif
+78 −0
Original line number Diff line number Diff line
@@ -37,3 +37,81 @@ ret:
	freeifaddrs(addrs);
	return rc;
}

int
spdk_net_get_address_string(struct sockaddr *sa, char *addr, size_t len)
{
	const char *result = NULL;

	if (sa == NULL || addr == NULL) {
		return -1;
	}

	switch (sa->sa_family) {
	case AF_INET:
		result = inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),
				   addr, len);
		break;
	case AF_INET6:
		result = inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),
				   addr, len);
		break;
	default:
		break;
	}

	if (result != NULL) {
		return 0;
	} else {
		return -errno;
	}
}

bool
spdk_net_is_loopback(int fd)
{
	struct ifaddrs *addrs, *tmp;
	struct sockaddr_storage sa = {};
	socklen_t salen;
	struct ifreq ifr = {};
	char ip_addr[256], ip_addr_tmp[256];
	int rc;
	bool is_loopback = false;

	salen = sizeof(sa);
	rc = getsockname(fd, (struct sockaddr *)&sa, &salen);
	if (rc != 0) {
		return is_loopback;
	}

	memset(ip_addr, 0, sizeof(ip_addr));
	rc = spdk_net_get_address_string((struct sockaddr *)&sa, ip_addr, sizeof(ip_addr));
	if (rc != 0) {
		return is_loopback;
	}

	getifaddrs(&addrs);
	for (tmp = addrs; tmp != NULL; tmp = tmp->ifa_next) {
		if (tmp->ifa_addr && (tmp->ifa_flags & IFF_UP) &&
		    (tmp->ifa_addr->sa_family == sa.ss_family)) {
			memset(ip_addr_tmp, 0, sizeof(ip_addr_tmp));
			rc = spdk_net_get_address_string(tmp->ifa_addr, ip_addr_tmp, sizeof(ip_addr_tmp));
			if (rc != 0) {
				continue;
			}

			if (strncmp(ip_addr, ip_addr_tmp, sizeof(ip_addr)) == 0) {
				memcpy(ifr.ifr_name, tmp->ifa_name, sizeof(ifr.ifr_name));
				ioctl(fd, SIOCGIFFLAGS, &ifr);
				if (ifr.ifr_flags & IFF_LOOPBACK) {
					is_loopback = true;
				}
				goto end;
			}
		}
	}

end:
	freeifaddrs(addrs);
	return is_loopback;
}
+2 −0
Original line number Diff line number Diff line
@@ -106,6 +106,8 @@

	# public functions in net.h
	spdk_net_get_interface_name;
	spdk_net_get_address_string;
	spdk_net_is_loopback;

	# public functions in pipe.h
	spdk_pipe_create;
+6 −6
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@
#include "spdk/util.h"
#include "spdk/string.h"
#include "spdk_internal/sock.h"
#include "../sock_kernel.h"
#include "spdk/net.h"

#include "openssl/crypto.h"
#include "openssl/err.h"
@@ -253,9 +253,9 @@ posix_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, uint16_t *spo
		return -1;
	}

	rc = get_addr_str((struct sockaddr *)&sa, saddr, slen);
	rc = spdk_net_get_address_string((struct sockaddr *)&sa, saddr, slen);
	if (rc != 0) {
		SPDK_ERRLOG("getnameinfo() failed (errno=%d)\n", errno);
		SPDK_ERRLOG("getnameinfo() failed (errno=%d)\n", rc);
		return -1;
	}

@@ -275,9 +275,9 @@ posix_sock_getaddr(struct spdk_sock *_sock, char *saddr, int slen, uint16_t *spo
		return -1;
	}

	rc = get_addr_str((struct sockaddr *)&sa, caddr, clen);
	rc = spdk_net_get_address_string((struct sockaddr *)&sa, caddr, clen);
	if (rc != 0) {
		SPDK_ERRLOG("getnameinfo() failed (errno=%d)\n", errno);
		SPDK_ERRLOG("getnameinfo() failed (errno=%d)\n", rc);
		return -1;
	}

@@ -1079,7 +1079,7 @@ retry:
	}

	/* Only enable zero copy for non-loopback and non-ssl sockets. */
	enable_zcopy_user_opts = opts->zcopy && !sock_is_loopback(fd) && !enable_ssl;
	enable_zcopy_user_opts = opts->zcopy && !spdk_net_is_loopback(fd) && !enable_ssl;

	sock = posix_sock_alloc(fd, &impl_opts, enable_zcopy_user_opts && enable_zcopy_impl_opts);
	if (sock == NULL) {

module/sock/sock_kernel.h

deleted100644 → 0
+0 −81
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright (C) 2021 Intel Corporation. All rights reserved.
 */

static int
get_addr_str(struct sockaddr *sa, char *host, size_t hlen)
{
	const char *result = NULL;

	if (sa == NULL || host == NULL) {
		return -1;
	}

	switch (sa->sa_family) {
	case AF_INET:
		result = inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),
				   host, hlen);
		break;
	case AF_INET6:
		result = inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),
				   host, hlen);
		break;
	default:
		break;
	}

	if (result != NULL) {
		return 0;
	} else {
		return -1;
	}
}

static bool
sock_is_loopback(int fd)
{
	struct ifaddrs *addrs, *tmp;
	struct sockaddr_storage sa = {};
	socklen_t salen;
	struct ifreq ifr = {};
	char ip_addr[256], ip_addr_tmp[256];
	int rc;
	bool is_loopback = false;

	salen = sizeof(sa);
	rc = getsockname(fd, (struct sockaddr *)&sa, &salen);
	if (rc != 0) {
		return is_loopback;
	}

	memset(ip_addr, 0, sizeof(ip_addr));
	rc = get_addr_str((struct sockaddr *)&sa, ip_addr, sizeof(ip_addr));
	if (rc != 0) {
		return is_loopback;
	}

	getifaddrs(&addrs);
	for (tmp = addrs; tmp != NULL; tmp = tmp->ifa_next) {
		if (tmp->ifa_addr && (tmp->ifa_flags & IFF_UP) &&
		    (tmp->ifa_addr->sa_family == sa.ss_family)) {
			memset(ip_addr_tmp, 0, sizeof(ip_addr_tmp));
			rc = get_addr_str(tmp->ifa_addr, ip_addr_tmp, sizeof(ip_addr_tmp));
			if (rc != 0) {
				continue;
			}

			if (strncmp(ip_addr, ip_addr_tmp, sizeof(ip_addr)) == 0) {
				memcpy(ifr.ifr_name, tmp->ifa_name, sizeof(ifr.ifr_name));
				ioctl(fd, SIOCGIFFLAGS, &ifr);
				if (ifr.ifr_flags & IFF_LOOPBACK) {
					is_loopback = true;
				}
				goto end;
			}
		}
	}

end:
	freeifaddrs(addrs);
	return is_loopback;
}
Loading