summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.com>2016-08-03 13:13:49 -0400
committerSteve Dickson <steved@redhat.com>2016-08-03 14:24:57 -0400
commit2d0683f3843446a479cd9c451ea01e005937eebb (patch)
treec19ab0f0ced482921ab9791dc5dbc263849daa14
parent8cd75bc7b179294347f88baa25e12df0461d8f29 (diff)
downloadnfs-utils-2d0683f3843446a479cd9c451ea01e005937eebb.tar.gz
nfs-utils-2d0683f3843446a479cd9c451ea01e005937eebb.tar.xz
nfs-utils-2d0683f3843446a479cd9c451ea01e005937eebb.zip
mount: use a public address for IPv6 callback.
If IPv6 address privacy is active, the "clientaddr" given to the server will likely be a temporary address which will eventually expire, thus breaking callback. So ask for a public address to ensure continued service. Acked-by: J. Bruce Fields <bfields@fieldses.org> Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r--utils/mount/network.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/utils/mount/network.c b/utils/mount/network.c
index 0d12613..7dceb2d 100644
--- a/utils/mount/network.c
+++ b/utils/mount/network.c
@@ -38,6 +38,7 @@
#include <sys/socket.h>
#include <sys/wait.h>
#include <sys/stat.h>
+#include <linux/in6.h>
#include <netinet/in.h>
#include <rpc/rpc.h>
#include <rpc/pmap_prot.h>
@@ -1113,6 +1114,7 @@ static int nfs_ca_sockname(const struct sockaddr *sap, const socklen_t salen,
.sin6_addr = IN6ADDR_ANY_INIT,
};
int sock, result = 0;
+ int val;
sock = socket(sap->sa_family, SOCK_DGRAM, IPPROTO_UDP);
if (sock < 0)
@@ -1124,6 +1126,9 @@ static int nfs_ca_sockname(const struct sockaddr *sap, const socklen_t salen,
goto out;
break;
case AF_INET6:
+ /* Make sure the call-back address is public/permanent */
+ val = IPV6_PREFER_SRC_PUBLIC;
+ setsockopt(sock, SOL_IPV6, IPV6_ADDR_PREFERENCES, &val, sizeof(val));
if (bind(sock, SAFE_SOCKADDR(&sin6), sizeof(sin6)) < 0)
goto out;
break;