From: Peter Staubach <staubach@redhat.com>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: trond.myklebust@fys.uio.no,
aurelien.charbon-Z51IpKcfGtLk1uMJSBkQmQ@public.gmane.org,
linux-nfs@vger.kernel.org
Subject: Re: [PATCH 01/27] SUNRPC: rpc_create() default hostname should support AF_INET6 addresses
Date: Mon, 10 Dec 2007 15:55:31 -0500 [thread overview]
Message-ID: <475DA7C3.1050703@redhat.com> (raw)
In-Reply-To: <E7A6950F-9651-42A0-A89D-F561C434CD42@oracle.com>
Chuck Lever wrote:
> On Dec 10, 2007, at 3:23 PM, Peter Staubach wrote:
>> Chuck Lever wrote:
>>> If the ULP doesn't pass a hostname string to rpc_create(), it
>>> manufactures
>>> one based on the passed-in address. Be smart enough to handle an
>>> AF_INET6
>>> address properly in this case.
>>>
>>> Move the default servername logic before the xprt_create_transport()
>>> call
>>> to simplify error handling in rpc_create().
>>>
>>> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
>>> ---
>>>
>>> net/sunrpc/clnt.c | 32 +++++++++++++++++++++++++++-----
>>> 1 files changed, 27 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
>>> index 76be83e..c297161 100644
>>> --- a/net/sunrpc/clnt.c
>>> +++ b/net/sunrpc/clnt.c
>>> @@ -30,6 +30,7 @@
>>> #include <linux/smp_lock.h>
>>> #include <linux/utsname.h>
>>> #include <linux/workqueue.h>
>>> +#include <linux/in6.h>
>>> #include <linux/sunrpc/clnt.h>
>>> #include <linux/sunrpc/rpc_pipe_fs.h>
>>> @@ -247,7 +248,7 @@ struct rpc_clnt *rpc_create(struct
>>> rpc_create_args *args)
>>> .addrlen = args->addrsize,
>>> .timeout = args->timeout
>>> };
>>> - char servername[20];
>>> + char servername[48];
>>>
>>>
>>
>> Just out of curiosity, how or why was 48 chosen?
>
> It's a multiple of 16 bytes for cache alignment, and it is just a bit
> larger than the largest size of a meaningful IPv6 address string
> (which is 46 bytes, I believe).
>
> If there's an appropriate pre-defined buffer size, I would gladly
> replace the naked integer with that. It would be nice if there was
> one defined along with the NIPQUAD/NIP6 macros.
>
Yes, it would be nice if there was a symbolic constant which would
make this a little more understandable.
It appears to me, from the definitions of NIP6 and NIP6_FMT,
that the maximum that the string will ever hold will be 40 bytes,
8 shorts printed as 4 byte hex values plus 7 intermediate ':'
characters plus the '\0' string terminator, so 48 should be
enough, currently. I think that we might run into a problem
if NIP6 or NIP6_FMT were ever changed to allow more bytes.
Having the symbolic constant defined near to NIP6 and NIP6_FMT
would eliminate this invisible dependency.
Thanx...
ps
>>> xprt = xprt_create_transport(&xprtargs);
>>> if (IS_ERR(xprt))
>>> @@ -258,13 +259,34 @@ struct rpc_clnt *rpc_create(struct
>>> rpc_create_args *args)
>>> * up a string representation of the passed-in address.
>>> */
>>> if (args->servername == NULL) {
>>> - struct sockaddr_in *addr =
>>> - (struct sockaddr_in *) args->address;
>>> - snprintf(servername, sizeof(servername), NIPQUAD_FMT,
>>> - NIPQUAD(addr->sin_addr.s_addr));
>>> + servername[0] = '\0';
>>> + switch (args->address->sa_family) {
>>> + case AF_INET: {
>>> + struct sockaddr_in *sin =
>>> + (struct sockaddr_in *)args->address;
>>> + snprintf(servername, sizeof(servername), NIPQUAD_FMT,
>>> + NIPQUAD(sin->sin_addr.s_addr));
>>> + break;
>>> + }
>>> + case AF_INET6: {
>>> + struct sockaddr_in6 *sin =
>>> + (struct sockaddr_in6 *)args->address;
>>> + snprintf(servername, sizeof(servername), NIP6_FMT,
>>> + NIP6(sin->sin6_addr));
>>> + break;
>>> + }
>>> + default:
>>> + /* caller wants default server name, but
>>> + * address family isn't recognized. */
>>> + return ERR_PTR(-EINVAL);
>>> + }
>>> args->servername = servername;
>>> }
>>> + xprt = xprt_create_transport(&xprtargs);
>>> + if (IS_ERR(xprt))
>>> + return (struct rpc_clnt *)xprt;
>>> +
>>> /*
>>> * By default, kernel RPC client connects from a reserved port.
>>> * CAP_NET_BIND_SERVICE will not be set for unprivileged
>>> requesters,
>
> --
> Chuck Lever
> chuck[dot]lever[at]oracle[dot]com
>
>
>
next prev parent reply other threads:[~2007-12-10 20:57 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-10 19:56 [PATCH 00/27] IPv6 infrastructure for NFS client Chuck Lever
[not found] ` <20071210195106.2823.43884.stgit-meopP2rzCrTwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2007-12-10 19:56 ` [PATCH 01/27] SUNRPC: rpc_create() default hostname should support AF_INET6 addresses Chuck Lever
[not found] ` <20071210195623.2823.13011.stgit-meopP2rzCrTwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2007-12-10 20:23 ` Peter Staubach
2007-12-10 20:37 ` Chuck Lever
2007-12-10 20:55 ` Peter Staubach [this message]
2007-12-10 19:56 ` [PATCH 02/27] SUNRPC: Fix socket address handling in rpcb_clnt Chuck Lever
2007-12-10 19:56 ` [PATCH 03/27] SUNRPC: RPC version numbers are u32 Chuck Lever
2007-12-10 19:56 ` [PATCH 04/27] SUNRPC: Move universal address definitions to global header Chuck Lever
2007-12-10 19:56 ` [PATCH 05/27] NFS: Ensure NFSv4 SETCLIENTID send buffer is large enough Chuck Lever
2007-12-10 19:57 ` [PATCH 06/27] NFS: Increase size of cl_ipaddr field to hold IPv6 addresses Chuck Lever
2007-12-10 19:57 ` [PATCH 07/27] NFS: Enable NFS client to generate CLIENTID strings with " Chuck Lever
2007-12-10 19:57 ` [PATCH 08/27] NFS: eliminate NIPQUAD(clp->cl_addr.sin_addr) Chuck Lever
2007-12-10 19:57 ` [PATCH 09/27] NFS: Move dprintks from callback.c to callback_proc.c Chuck Lever
2007-12-10 19:57 ` [PATCH 10/27] NFS: Address a couple of nits in nfs_follow_referral() Chuck Lever
2007-12-10 19:57 ` [PATCH 11/27] NFS: Add support for AF_INET6 addresses in nfs_compare_super() Chuck Lever
2007-12-10 19:57 ` [PATCH 12/27] NFS: Verify IPv6 addresses properly Chuck Lever
2007-12-10 19:57 ` [PATCH 13/27] NFS: Make setting a port number agostic Chuck Lever
2007-12-10 19:58 ` [PATCH 14/27] NFS: Set default port for NFSv4, with support for AF_INET6 Chuck Lever
2007-12-10 19:58 ` [PATCH 15/27] NFS: Add support for AF_INET6 addresses in __nfs_find_client() Chuck Lever
2007-12-10 19:58 ` [PATCH 16/27] NFS: Expand server address storage in nfs_client struct Chuck Lever
2007-12-10 19:58 ` [PATCH 17/27] NFS: Change cb_getattrargs to pass "struct sockaddr *" instead of sockaddr_in Chuck Lever
2007-12-10 19:58 ` [PATCH 18/27] NFS: Change cb_recallargs " Chuck Lever
2007-12-10 19:58 ` [PATCH 19/27] NFS: Make nfs_alloc_client() take (sockaddr, len) " Chuck Lever
2007-12-10 19:58 ` [PATCH 20/27] NFS: Change nfs_find_client() to take "struct sockaddr *" Chuck Lever
2007-12-10 19:58 ` [PATCH 21/27] NFS: Change nfs_get_client() to take sockaddr * Chuck Lever
2007-12-10 19:58 ` [PATCH 22/27] NFS: Change nfs4_set_client() to accept struct " Chuck Lever
2007-12-10 19:59 ` [PATCH 23/27] NFS: Adjust nfs_clone_mount structure to store "struct sockaddr *" Chuck Lever
2007-12-10 19:59 ` [PATCH 24/27] NFS: Remove the NIPQUAD from nfs_try_mount Chuck Lever
2007-12-10 19:59 ` [PATCH 25/27] NFS: Refactor mount option address parsing into separate function Chuck Lever
2007-12-10 19:59 ` [PATCH 26/27] NFS: Support non-IPv4 addresses in nfs_parsed_mount_data Chuck Lever
2007-12-10 19:59 ` [PATCH 27/27] NFS: Pull covers off IPv6 address parsing Chuck Lever
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=475DA7C3.1050703@redhat.com \
--to=staubach@redhat.com \
--cc=aurelien.charbon-Z51IpKcfGtLk1uMJSBkQmQ@public.gmane.org \
--cc=chuck.lever@oracle.com \
--cc=linux-nfs@vger.kernel.org \
--cc=trond.myklebust@fys.uio.no \
/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