|
@@ -2236,6 +2236,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
|
|
|
unsigned int keepcnt = xprt->timeout->to_retries + 1;
|
|
|
unsigned int opt_on = 1;
|
|
|
unsigned int timeo;
|
|
|
+ unsigned int addr_pref = IPV6_PREFER_SRC_PUBLIC;
|
|
|
|
|
|
/* TCP Keepalive options */
|
|
|
kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
|
|
@@ -2247,6 +2248,16 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
|
|
|
kernel_setsockopt(sock, SOL_TCP, TCP_KEEPCNT,
|
|
|
(char *)&keepcnt, sizeof(keepcnt));
|
|
|
|
|
|
+ /* Avoid temporary address, they are bad for long-lived
|
|
|
+ * connections such as NFS mounts.
|
|
|
+ * RFC4941, section 3.6 suggests that:
|
|
|
+ * Individual applications, which have specific
|
|
|
+ * knowledge about the normal duration of connections,
|
|
|
+ * MAY override this as appropriate.
|
|
|
+ */
|
|
|
+ kernel_setsockopt(sock, SOL_IPV6, IPV6_ADDR_PREFERENCES,
|
|
|
+ (char *)&addr_pref, sizeof(addr_pref));
|
|
|
+
|
|
|
/* TCP user timeout (see RFC5482) */
|
|
|
timeo = jiffies_to_msecs(xprt->timeout->to_initval) *
|
|
|
(xprt->timeout->to_retries + 1);
|