Since kernel 4.17 ->getname() does not take int *addrlen
argument anymore, instead it's returning the length to
the caller.
Linux-commit:
9b2c45d479d0fb8647c9e83359df69162b5fbe5f
Test-Parameters:trivial
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Change-Id: I4ad5de4a22f3fb23c07a356650ea7925acf07eed
Reviewed-on: https://review.whamcloud.com/34672
Tested-by: Jenkins
Reviewed-by: Gu Zheng <gzheng@ddn.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
]) # LN_CONFIG_SOCK_ACCEPT
#
+# LN_CONFIG_SOCK_GETNAME
+#
+# 4.17 commit 9b2c45d479d0fb8647c9e83359df69162b5fbe5f getname()
+# does not take the length *int argument and returns the length
+#
+AC_DEFUN([LN_CONFIG_SOCK_GETNAME], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if 'getname' has two args],
+kern_sock_getname_2args, [
+ #include <linux/net.h>
+],[
+ kernel_getsockname(NULL, NULL);
+],[
+ AC_DEFINE(HAVE_KERN_SOCK_GETNAME_2ARGS, 1,
+ ['getname' has two args])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LN_CONFIG_SOCK_GETNAME
+
+#
# LN_PROG_LINUX
#
# LNet linux kernel checks
LN_CONFIG_SOCK_CREATE_KERN
# 4.11
LN_CONFIG_SOCK_ACCEPT
+# 4.17
+LN_CONFIG_SOCK_GETNAME
]) # LN_PROG_LINUX
#
#define DEFAULT_PEER_TIMEOUT 180
#define LNET_LND_DEFAULT_TIMEOUT 5
+#ifdef HAVE_KERN_SOCK_GETNAME_2ARGS
+#define lnet_kernel_getpeername(sock, addr, addrlen) \
+ kernel_getpeername(sock, addr)
+#define lnet_kernel_getsockname(sock, addr, addrlen) \
+ kernel_getsockname(sock, addr)
+#else
+#define lnet_kernel_getpeername(sock, addr, addrlen) \
+ kernel_getpeername(sock, addr, addrlen)
+#define lnet_kernel_getsockname(sock, addr, addrlen) \
+ kernel_getsockname(sock, addr, addrlen)
+#endif
+
static inline int lnet_is_route_alive(struct lnet_route *route)
{
if (!route->lr_gateway->lpni_alive)
lnet_sock_getaddr(struct socket *sock, bool remote, __u32 *ip, int *port)
{
struct sockaddr_in sin;
- int len = sizeof(sin);
- int rc;
+ int rc;
+#ifndef HAVE_KERN_SOCK_GETNAME_2ARGS
+ int len = sizeof(sin);
+#endif
if (remote)
- rc = kernel_getpeername(sock, (struct sockaddr *)&sin, &len);
+ rc = lnet_kernel_getpeername(sock,
+ (struct sockaddr *)&sin, &len);
else
- rc = kernel_getsockname(sock, (struct sockaddr *)&sin, &len);
- if (rc != 0) {
+ rc = lnet_kernel_getsockname(sock,
+ (struct sockaddr *)&sin, &len);
+ if (rc < 0) {
CERROR("Error %d getting sock %s IP/port\n",
rc, remote ? "peer" : "local");
return rc;