From: Chuck Lever <chuck.lever@oracle.com>
To: steved@redhat.com
Cc: linux-nfs@vger.kernel.org
Subject: [PATCH 4/5] libexport.a: IPv6 support for client_init_subnet()
Date: Tue, 24 Aug 2010 12:35:52 -0400 [thread overview]
Message-ID: <20100824163552.2433.94979.stgit@matisse.1015granger.net> (raw)
In-Reply-To: <20100824162926.2433.7535.stgit@matisse.1015granger.net>
To parse and store an IPv6 host or subnet address, init_netmask()
needs to handle 128 bit subnet masks.
Unfortunately what once was a pretty simple little function has grown
much larger. This logic must now not only parse IPv6 addresses
correctly, but must also distinguish between IPv4 and IPv6.
To avoid code duplication, I'm "bending" the cardinal rule of not
using "#ifdef" inside functions.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
support/export/client.c | 32 ++++++++++++++++++++++++++++++++
1 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/support/export/client.c b/support/export/client.c
index 780c74d..4c6cd69 100644
--- a/support/export/client.c
+++ b/support/export/client.c
@@ -66,6 +66,12 @@ init_netmask(nfs_client *clp, const char *slash, const sa_family_t family)
};
unsigned long prefixlen;
uint32_t shift;
+#ifdef IPV6_SUPPORTED
+ struct sockaddr_in6 sin6 = {
+ .sin6_family = AF_INET6,
+ };
+ int i;
+#endif
/* No slash present; assume netmask is all ones */
if (slash == NULL) {
@@ -73,6 +79,11 @@ init_netmask(nfs_client *clp, const char *slash, const sa_family_t family)
case AF_INET:
prefixlen = 32;
break;
+#ifdef IPV6_SUPPORTED
+ case AF_INET6:
+ prefixlen = 128;
+ break;
+#endif
default:
goto out_badfamily;
}
@@ -87,6 +98,14 @@ init_netmask(nfs_client *clp, const char *slash, const sa_family_t family)
set_addrlist_in(clp, 1, &sin);
return 1;
}
+#ifdef IPV6_SUPPORTED
+ if (strchr(slash + 1, ':')) {
+ if (!inet_pton(AF_INET6, slash + 1, &sin6.sin6_addr))
+ goto out_badmask;
+ set_addrlist_in6(clp, 1, &sin6);
+ return 1;
+ }
+#endif
/* A prefixlen was given */
prefixlen = strtoul(slash + 1, &endptr, 10);
@@ -102,6 +121,19 @@ init_netmask(nfs_client *clp, const char *slash, const sa_family_t family)
sin.sin_addr.s_addr = htonl((uint32_t)~0 << shift);
set_addrlist_in(clp, 1, &sin);
return 1;
+#ifdef IPV6_SUPPORTED
+ case AF_INET6:
+ if (prefixlen > 128)
+ goto out_badprefix;
+ for (i = 0; prefixlen > 32; i++) {
+ sin6.sin6_addr.s6_addr32[i] = 0xffffffff;
+ prefixlen -= 32;
+ }
+ shift = 32 - (uint32_t)prefixlen;
+ sin6.sin6_addr.s6_addr32[i] = htonl((uint32_t)~0 << shift);
+ set_addrlist_in6(clp, 1, &sin6);
+ return 1;
+#endif
}
out_badfamily:
next prev parent reply other threads:[~2010-08-24 16:35 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-24 16:35 [PATCH 0/5] Support IPv6 in libexport.a Chuck Lever
2010-08-24 16:35 ` [PATCH 1/5] libexport.a: Prepare to recognize IPv6 addresses in client_gettype() Chuck Lever
2010-08-24 16:35 ` [PATCH 2/5] libexport.a: Use host helper to parse address in client_init() Chuck Lever
2010-08-24 16:35 ` [PATCH 3/5] libexport.a: Prepare init_subnetwork() for IPv6 support Chuck Lever
2010-08-24 16:35 ` Chuck Lever [this message]
2010-08-24 16:36 ` [PATCH 5/5] libexport.a: IPv6 support in client_check() Chuck Lever
2010-08-31 19:43 ` [PATCH 0/5] Support IPv6 in libexport.a Steve Dickson
[not found] ` <4C7D5B63.9060907-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>
2010-08-31 20:36 ` Chuck Lever
2010-08-31 23:41 ` Steve Dickson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100824163552.2433.94979.stgit@matisse.1015granger.net \
--to=chuck.lever@oracle.com \
--cc=linux-nfs@vger.kernel.org \
--cc=steved@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox