]) # LIBCFS_HAVE_PROC_OPS
#
+# LIBCFS_IP6_SET_PREF
+#
+# kernel v5.8-rc1~165^2~71^2~3 commit 18d5ad62327576cbb1e5b9938a59d63ac0c15832
+# ipv6: add ip6_sock_set_addr_preferences
+#
+AC_DEFUN([LIBCFS_IP6_SET_PREF], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if ip6_sock_set_addr_preferences() exists],
+ip6_set_pref_test, [
+ #include <net/ipv6.h>
+],[
+ ip6_sock_set_addr_preferences(NULL, 0);
+],[
+ AC_DEFINE(HAVE_IP6_SET_PREF, 1,
+ [if ip6_sock_set_addr_preferences exists])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_IP6_SET_PREF
+
+#
# LIBCFS_VMALLOC_2ARGS
#
# kernel v5.8-rc1~201^2~19
LIBCFS_VMALLOC_2ARGS
LIBCFS_HAVE_NR_UNSTABLE_NFS
LIBCFS_SEC_RELEASE_SECCTX
+LIBCFS_IP6_SET_PREF
# 5.10
LIBCFS_HAVE_KFREE_SENSITIVE
LIBCFS_HAVE_CRYPTO_SHA2_HEADER
(char *)&opt, sizeof(opt));
}
#endif /* HAVE_TCP_SOCK_SET_KEEPCNT */
+
+#if !defined(HAVE_IP6_SET_PREF)
+static inline void ip6_sock_set_addr_preferences(struct sock *sk,
+ unsigned int pref)
+{
+ kernel_setsockopt(sk->sk_socket, SOL_IPV6, IPV6_ADDR_PREFERENCES,
+ (char *)&pref, sizeof(pref));
+}
+#endif /* HAVE_IP6_SET_PREF */
#endif /* HAVE_KERNEL_SETSOCKOPT */
#endif /* __LIBCFS_LINUX_NET_H__ */
if (IS_ERR(sock))
return sock;
+ /* Avoid temporary address, they are bad for long-lived
+ * connections such as lustre mounts.
+ * RFC4941, section 3.6 suggests that:
+ * Individual applications, which have specific
+ * knowledge about the normal duration of connections,
+ * MAY override this as appropriate.
+ */
+ if (peeraddr->sa_family == PF_INET6)
+ ip6_sock_set_addr_preferences(sock->sk,
+ IPV6_PREFER_SRC_PUBLIC);
+
rc = kernel_connect(sock, peeraddr, sizeof(struct sockaddr_in6), 0);
if (rc == 0)
return sock;