[linux-cifs-client] [PATCH] cifs: add a v6scope= option for
specifying the ipv6 scopeid
Jeff Layton
jlayton at redhat.com
Wed Jun 10 13:57:56 GMT 2009
This should allow people to mount servers on IPv6 link-local addresses.
Signed-off-by: Jeff Layton <jlayton at redhat.com>
---
fs/cifs/connect.c | 22 +++++++++++++++++-----
1 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 7a39c22..2fc0cb8 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -102,6 +102,7 @@ struct smb_vol {
unsigned int wsize;
unsigned int sockopt;
unsigned short int port;
+ unsigned int v6scope;
char *prepath;
};
@@ -801,7 +802,7 @@ static int
cifs_parse_mount_options(char *options, const char *devname,
struct smb_vol *vol)
{
- char *value;
+ char *value, *endptr;
char *data;
unsigned int temp_len, i, j;
char separator[2];
@@ -958,6 +959,14 @@ cifs_parse_mount_options(char *options, const char *devname,
}
strcpy(vol->password, value);
}
+ } else if (!strnicmp(data, "v6scope", 7)) {
+ vol->v6scope = (unsigned int) simple_strtoul(value,
+ &endptr, 0);
+ if (!*value || *endptr) {
+ cERROR(1, ("Invalid scope_id specified!\n"));
+ return 1;
+ }
+ continue;
} else if (!strnicmp(data, "ip", 2) ||
!strnicmp(data, "addr", 4)) {
if (!value || !*value) {
@@ -1387,8 +1396,10 @@ cifs_find_tcp_session(struct sockaddr_storage *addr)
server->addr.sockAddr.sin_addr.s_addr))
continue;
else if (addr->ss_family == AF_INET6 &&
- !ipv6_addr_equal(&server->addr.sockAddr6.sin6_addr,
- &addr6->sin6_addr))
+ (!ipv6_addr_equal(&server->addr.sockAddr6.sin6_addr,
+ &addr6->sin6_addr) ||
+ server->addr.sockAddr6.sin6_scope_id !=
+ addr6->sin6_scope_id))
continue;
++server->srv_count;
@@ -1442,8 +1453,8 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
/* not ipv4 address, try ipv6 */
rc = cifs_inet_pton(AF_INET6, volume_info->UNCip,
&sin_server6->sin6_addr.in6_u);
- if (rc > 0)
- addr.ss_family = AF_INET6;
+ addr.ss_family = AF_INET6;
+ sin_server6->sin6_scope_id = volume_info->v6scope;
} else {
addr.ss_family = AF_INET;
}
@@ -1517,6 +1528,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
memcpy(&tcp_ses->addr.sockAddr6, sin_server6,
sizeof(struct sockaddr_in6));
sin_server6->sin6_port = htons(volume_info->port);
+ sin_server6->sin6_scope_id = volume_info->v6scope;
rc = ipv6_connect(tcp_ses);
} else {
memcpy(&tcp_ses->addr.sockAddr, sin_server,
--
1.6.0.6
More information about the linux-cifs-client
mailing list