diff options
author | NeilBrown <neilb@suse.com> | 2016-08-03 13:13:49 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2016-08-03 14:24:57 -0400 |
commit | 2d0683f3843446a479cd9c451ea01e005937eebb (patch) | |
tree | c19ab0f0ced482921ab9791dc5dbc263849daa14 | |
parent | 8cd75bc7b179294347f88baa25e12df0461d8f29 (diff) | |
download | nfs-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.c | 5 |
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; |