[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