Pull misc-2.6.39 into release branch
[pandora-kernel.git] / net / sunrpc / rpcb_clnt.c
1 /*
2  * In-kernel rpcbind client supporting versions 2, 3, and 4 of the rpcbind
3  * protocol
4  *
5  * Based on RFC 1833: "Binding Protocols for ONC RPC Version 2" and
6  * RFC 3530: "Network File System (NFS) version 4 Protocol"
7  *
8  * Original: Gilles Quillard, Bull Open Source, 2005 <gilles.quillard@bull.net>
9  * Updated: Chuck Lever, Oracle Corporation, 2007 <chuck.lever@oracle.com>
10  *
11  * Descended from net/sunrpc/pmap_clnt.c,
12  *  Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
13  */
14
15 #include <linux/module.h>
16
17 #include <linux/types.h>
18 #include <linux/socket.h>
19 #include <linux/in.h>
20 #include <linux/in6.h>
21 #include <linux/kernel.h>
22 #include <linux/errno.h>
23 #include <linux/mutex.h>
24 #include <linux/slab.h>
25 #include <net/ipv6.h>
26
27 #include <linux/sunrpc/clnt.h>
28 #include <linux/sunrpc/sched.h>
29 #include <linux/sunrpc/xprtsock.h>
30
31 #ifdef RPC_DEBUG
32 # define RPCDBG_FACILITY        RPCDBG_BIND
33 #endif
34
35 #define RPCBIND_PROGRAM         (100000u)
36 #define RPCBIND_PORT            (111u)
37
38 #define RPCBVERS_2              (2u)
39 #define RPCBVERS_3              (3u)
40 #define RPCBVERS_4              (4u)
41
42 enum {
43         RPCBPROC_NULL,
44         RPCBPROC_SET,
45         RPCBPROC_UNSET,
46         RPCBPROC_GETPORT,
47         RPCBPROC_GETADDR = 3,           /* alias for GETPORT */
48         RPCBPROC_DUMP,
49         RPCBPROC_CALLIT,
50         RPCBPROC_BCAST = 5,             /* alias for CALLIT */
51         RPCBPROC_GETTIME,
52         RPCBPROC_UADDR2TADDR,
53         RPCBPROC_TADDR2UADDR,
54         RPCBPROC_GETVERSADDR,
55         RPCBPROC_INDIRECT,
56         RPCBPROC_GETADDRLIST,
57         RPCBPROC_GETSTAT,
58 };
59
60 /*
61  * r_owner
62  *
63  * The "owner" is allowed to unset a service in the rpcbind database.
64  *
65  * For AF_LOCAL SET/UNSET requests, rpcbind treats this string as a
66  * UID which it maps to a local user name via a password lookup.
67  * In all other cases it is ignored.
68  *
69  * For SET/UNSET requests, user space provides a value, even for
70  * network requests, and GETADDR uses an empty string.  We follow
71  * those precedents here.
72  */
73 #define RPCB_OWNER_STRING       "0"
74 #define RPCB_MAXOWNERLEN        sizeof(RPCB_OWNER_STRING)
75
76 /*
77  * XDR data type sizes
78  */
79 #define RPCB_program_sz         (1)
80 #define RPCB_version_sz         (1)
81 #define RPCB_protocol_sz        (1)
82 #define RPCB_port_sz            (1)
83 #define RPCB_boolean_sz         (1)
84
85 #define RPCB_netid_sz           (1 + XDR_QUADLEN(RPCBIND_MAXNETIDLEN))
86 #define RPCB_addr_sz            (1 + XDR_QUADLEN(RPCBIND_MAXUADDRLEN))
87 #define RPCB_ownerstring_sz     (1 + XDR_QUADLEN(RPCB_MAXOWNERLEN))
88
89 /*
90  * XDR argument and result sizes
91  */
92 #define RPCB_mappingargs_sz     (RPCB_program_sz + RPCB_version_sz + \
93                                 RPCB_protocol_sz + RPCB_port_sz)
94 #define RPCB_getaddrargs_sz     (RPCB_program_sz + RPCB_version_sz + \
95                                 RPCB_netid_sz + RPCB_addr_sz + \
96                                 RPCB_ownerstring_sz)
97
98 #define RPCB_getportres_sz      RPCB_port_sz
99 #define RPCB_setres_sz          RPCB_boolean_sz
100
101 /*
102  * Note that RFC 1833 does not put any size restrictions on the
103  * address string returned by the remote rpcbind database.
104  */
105 #define RPCB_getaddrres_sz      RPCB_addr_sz
106
107 static void                     rpcb_getport_done(struct rpc_task *, void *);
108 static void                     rpcb_map_release(void *data);
109 static struct rpc_program       rpcb_program;
110
111 static struct rpc_clnt *        rpcb_local_clnt;
112 static struct rpc_clnt *        rpcb_local_clnt4;
113
114 struct rpcbind_args {
115         struct rpc_xprt *       r_xprt;
116
117         u32                     r_prog;
118         u32                     r_vers;
119         u32                     r_prot;
120         unsigned short          r_port;
121         const char *            r_netid;
122         const char *            r_addr;
123         const char *            r_owner;
124
125         int                     r_status;
126 };
127
128 static struct rpc_procinfo rpcb_procedures2[];
129 static struct rpc_procinfo rpcb_procedures3[];
130 static struct rpc_procinfo rpcb_procedures4[];
131
132 struct rpcb_info {
133         u32                     rpc_vers;
134         struct rpc_procinfo *   rpc_proc;
135 };
136
137 static struct rpcb_info rpcb_next_version[];
138 static struct rpcb_info rpcb_next_version6[];
139
140 static const struct rpc_call_ops rpcb_getport_ops = {
141         .rpc_call_done          = rpcb_getport_done,
142         .rpc_release            = rpcb_map_release,
143 };
144
145 static void rpcb_wake_rpcbind_waiters(struct rpc_xprt *xprt, int status)
146 {
147         xprt_clear_binding(xprt);
148         rpc_wake_up_status(&xprt->binding, status);
149 }
150
151 static void rpcb_map_release(void *data)
152 {
153         struct rpcbind_args *map = data;
154
155         rpcb_wake_rpcbind_waiters(map->r_xprt, map->r_status);
156         xprt_put(map->r_xprt);
157         kfree(map->r_addr);
158         kfree(map);
159 }
160
161 static const struct sockaddr_in rpcb_inaddr_loopback = {
162         .sin_family             = AF_INET,
163         .sin_addr.s_addr        = htonl(INADDR_LOOPBACK),
164         .sin_port               = htons(RPCBIND_PORT),
165 };
166
167 static DEFINE_MUTEX(rpcb_create_local_mutex);
168
169 /*
170  * Returns zero on success, otherwise a negative errno value
171  * is returned.
172  */
173 static int rpcb_create_local(void)
174 {
175         struct rpc_create_args args = {
176                 .net            = &init_net,
177                 .protocol       = XPRT_TRANSPORT_TCP,
178                 .address        = (struct sockaddr *)&rpcb_inaddr_loopback,
179                 .addrsize       = sizeof(rpcb_inaddr_loopback),
180                 .servername     = "localhost",
181                 .program        = &rpcb_program,
182                 .version        = RPCBVERS_2,
183                 .authflavor     = RPC_AUTH_UNIX,
184                 .flags          = RPC_CLNT_CREATE_NOPING,
185         };
186         struct rpc_clnt *clnt, *clnt4;
187         int result = 0;
188
189         if (rpcb_local_clnt)
190                 return result;
191
192         mutex_lock(&rpcb_create_local_mutex);
193         if (rpcb_local_clnt)
194                 goto out;
195
196         clnt = rpc_create(&args);
197         if (IS_ERR(clnt)) {
198                 dprintk("RPC:       failed to create local rpcbind "
199                                 "client (errno %ld).\n", PTR_ERR(clnt));
200                 result = -PTR_ERR(clnt);
201                 goto out;
202         }
203
204         /*
205          * This results in an RPC ping.  On systems running portmapper,
206          * the v4 ping will fail.  Proceed anyway, but disallow rpcb
207          * v4 upcalls.
208          */
209         clnt4 = rpc_bind_new_program(clnt, &rpcb_program, RPCBVERS_4);
210         if (IS_ERR(clnt4)) {
211                 dprintk("RPC:       failed to bind second program to "
212                                 "rpcbind v4 client (errno %ld).\n",
213                                 PTR_ERR(clnt4));
214                 clnt4 = NULL;
215         }
216
217         rpcb_local_clnt = clnt;
218         rpcb_local_clnt4 = clnt4;
219
220 out:
221         mutex_unlock(&rpcb_create_local_mutex);
222         return result;
223 }
224
225 static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr,
226                                     size_t salen, int proto, u32 version)
227 {
228         struct rpc_create_args args = {
229                 .net            = &init_net,
230                 .protocol       = proto,
231                 .address        = srvaddr,
232                 .addrsize       = salen,
233                 .servername     = hostname,
234                 .program        = &rpcb_program,
235                 .version        = version,
236                 .authflavor     = RPC_AUTH_UNIX,
237                 .flags          = (RPC_CLNT_CREATE_NOPING |
238                                         RPC_CLNT_CREATE_NONPRIVPORT),
239         };
240
241         switch (srvaddr->sa_family) {
242         case AF_INET:
243                 ((struct sockaddr_in *)srvaddr)->sin_port = htons(RPCBIND_PORT);
244                 break;
245         case AF_INET6:
246                 ((struct sockaddr_in6 *)srvaddr)->sin6_port = htons(RPCBIND_PORT);
247                 break;
248         default:
249                 return ERR_PTR(-EAFNOSUPPORT);
250         }
251
252         return rpc_create(&args);
253 }
254
255 static int rpcb_register_call(struct rpc_clnt *clnt, struct rpc_message *msg)
256 {
257         int result, error = 0;
258
259         msg->rpc_resp = &result;
260
261         error = rpc_call_sync(clnt, msg, RPC_TASK_SOFTCONN);
262         if (error < 0) {
263                 dprintk("RPC:       failed to contact local rpcbind "
264                                 "server (errno %d).\n", -error);
265                 return error;
266         }
267
268         if (!result)
269                 return -EACCES;
270         return 0;
271 }
272
273 /**
274  * rpcb_register - set or unset a port registration with the local rpcbind svc
275  * @prog: RPC program number to bind
276  * @vers: RPC version number to bind
277  * @prot: transport protocol to register
278  * @port: port value to register
279  *
280  * Returns zero if the registration request was dispatched successfully
281  * and the rpcbind daemon returned success.  Otherwise, returns an errno
282  * value that reflects the nature of the error (request could not be
283  * dispatched, timed out, or rpcbind returned an error).
284  *
285  * RPC services invoke this function to advertise their contact
286  * information via the system's rpcbind daemon.  RPC services
287  * invoke this function once for each [program, version, transport]
288  * tuple they wish to advertise.
289  *
290  * Callers may also unregister RPC services that are no longer
291  * available by setting the passed-in port to zero.  This removes
292  * all registered transports for [program, version] from the local
293  * rpcbind database.
294  *
295  * This function uses rpcbind protocol version 2 to contact the
296  * local rpcbind daemon.
297  *
298  * Registration works over both AF_INET and AF_INET6, and services
299  * registered via this function are advertised as available for any
300  * address.  If the local rpcbind daemon is listening on AF_INET6,
301  * services registered via this function will be advertised on
302  * IN6ADDR_ANY (ie available for all AF_INET and AF_INET6
303  * addresses).
304  */
305 int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port)
306 {
307         struct rpcbind_args map = {
308                 .r_prog         = prog,
309                 .r_vers         = vers,
310                 .r_prot         = prot,
311                 .r_port         = port,
312         };
313         struct rpc_message msg = {
314                 .rpc_argp       = &map,
315         };
316         int error;
317
318         error = rpcb_create_local();
319         if (error)
320                 return error;
321
322         dprintk("RPC:       %sregistering (%u, %u, %d, %u) with local "
323                         "rpcbind\n", (port ? "" : "un"),
324                         prog, vers, prot, port);
325
326         msg.rpc_proc = &rpcb_procedures2[RPCBPROC_UNSET];
327         if (port)
328                 msg.rpc_proc = &rpcb_procedures2[RPCBPROC_SET];
329
330         return rpcb_register_call(rpcb_local_clnt, &msg);
331 }
332
333 /*
334  * Fill in AF_INET family-specific arguments to register
335  */
336 static int rpcb_register_inet4(const struct sockaddr *sap,
337                                struct rpc_message *msg)
338 {
339         const struct sockaddr_in *sin = (const struct sockaddr_in *)sap;
340         struct rpcbind_args *map = msg->rpc_argp;
341         unsigned short port = ntohs(sin->sin_port);
342         int result;
343
344         map->r_addr = rpc_sockaddr2uaddr(sap);
345
346         dprintk("RPC:       %sregistering [%u, %u, %s, '%s'] with "
347                 "local rpcbind\n", (port ? "" : "un"),
348                         map->r_prog, map->r_vers,
349                         map->r_addr, map->r_netid);
350
351         msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];
352         if (port)
353                 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET];
354
355         result = rpcb_register_call(rpcb_local_clnt4, msg);
356         kfree(map->r_addr);
357         return result;
358 }
359
360 /*
361  * Fill in AF_INET6 family-specific arguments to register
362  */
363 static int rpcb_register_inet6(const struct sockaddr *sap,
364                                struct rpc_message *msg)
365 {
366         const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sap;
367         struct rpcbind_args *map = msg->rpc_argp;
368         unsigned short port = ntohs(sin6->sin6_port);
369         int result;
370
371         map->r_addr = rpc_sockaddr2uaddr(sap);
372
373         dprintk("RPC:       %sregistering [%u, %u, %s, '%s'] with "
374                 "local rpcbind\n", (port ? "" : "un"),
375                         map->r_prog, map->r_vers,
376                         map->r_addr, map->r_netid);
377
378         msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];
379         if (port)
380                 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET];
381
382         result = rpcb_register_call(rpcb_local_clnt4, msg);
383         kfree(map->r_addr);
384         return result;
385 }
386
387 static int rpcb_unregister_all_protofamilies(struct rpc_message *msg)
388 {
389         struct rpcbind_args *map = msg->rpc_argp;
390
391         dprintk("RPC:       unregistering [%u, %u, '%s'] with "
392                 "local rpcbind\n",
393                         map->r_prog, map->r_vers, map->r_netid);
394
395         map->r_addr = "";
396         msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];
397
398         return rpcb_register_call(rpcb_local_clnt4, msg);
399 }
400
401 /**
402  * rpcb_v4_register - set or unset a port registration with the local rpcbind
403  * @program: RPC program number of service to (un)register
404  * @version: RPC version number of service to (un)register
405  * @address: address family, IP address, and port to (un)register
406  * @netid: netid of transport protocol to (un)register
407  *
408  * Returns zero if the registration request was dispatched successfully
409  * and the rpcbind daemon returned success.  Otherwise, returns an errno
410  * value that reflects the nature of the error (request could not be
411  * dispatched, timed out, or rpcbind returned an error).
412  *
413  * RPC services invoke this function to advertise their contact
414  * information via the system's rpcbind daemon.  RPC services
415  * invoke this function once for each [program, version, address,
416  * netid] tuple they wish to advertise.
417  *
418  * Callers may also unregister RPC services that are registered at a
419  * specific address by setting the port number in @address to zero.
420  * They may unregister all registered protocol families at once for
421  * a service by passing a NULL @address argument.  If @netid is ""
422  * then all netids for [program, version, address] are unregistered.
423  *
424  * This function uses rpcbind protocol version 4 to contact the
425  * local rpcbind daemon.  The local rpcbind daemon must support
426  * version 4 of the rpcbind protocol in order for these functions
427  * to register a service successfully.
428  *
429  * Supported netids include "udp" and "tcp" for UDP and TCP over
430  * IPv4, and "udp6" and "tcp6" for UDP and TCP over IPv6,
431  * respectively.
432  *
433  * The contents of @address determine the address family and the
434  * port to be registered.  The usual practice is to pass INADDR_ANY
435  * as the raw address, but specifying a non-zero address is also
436  * supported by this API if the caller wishes to advertise an RPC
437  * service on a specific network interface.
438  *
439  * Note that passing in INADDR_ANY does not create the same service
440  * registration as IN6ADDR_ANY.  The former advertises an RPC
441  * service on any IPv4 address, but not on IPv6.  The latter
442  * advertises the service on all IPv4 and IPv6 addresses.
443  */
444 int rpcb_v4_register(const u32 program, const u32 version,
445                      const struct sockaddr *address, const char *netid)
446 {
447         struct rpcbind_args map = {
448                 .r_prog         = program,
449                 .r_vers         = version,
450                 .r_netid        = netid,
451                 .r_owner        = RPCB_OWNER_STRING,
452         };
453         struct rpc_message msg = {
454                 .rpc_argp       = &map,
455         };
456         int error;
457
458         error = rpcb_create_local();
459         if (error)
460                 return error;
461         if (rpcb_local_clnt4 == NULL)
462                 return -EPROTONOSUPPORT;
463
464         if (address == NULL)
465                 return rpcb_unregister_all_protofamilies(&msg);
466
467         switch (address->sa_family) {
468         case AF_INET:
469                 return rpcb_register_inet4(address, &msg);
470         case AF_INET6:
471                 return rpcb_register_inet6(address, &msg);
472         }
473
474         return -EAFNOSUPPORT;
475 }
476
477 static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbind_args *map, struct rpc_procinfo *proc)
478 {
479         struct rpc_message msg = {
480                 .rpc_proc = proc,
481                 .rpc_argp = map,
482                 .rpc_resp = map,
483         };
484         struct rpc_task_setup task_setup_data = {
485                 .rpc_client = rpcb_clnt,
486                 .rpc_message = &msg,
487                 .callback_ops = &rpcb_getport_ops,
488                 .callback_data = map,
489                 .flags = RPC_TASK_ASYNC | RPC_TASK_SOFTCONN,
490         };
491
492         return rpc_run_task(&task_setup_data);
493 }
494
495 /*
496  * In the case where rpc clients have been cloned, we want to make
497  * sure that we use the program number/version etc of the actual
498  * owner of the xprt. To do so, we walk back up the tree of parents
499  * to find whoever created the transport and/or whoever has the
500  * autobind flag set.
501  */
502 static struct rpc_clnt *rpcb_find_transport_owner(struct rpc_clnt *clnt)
503 {
504         struct rpc_clnt *parent = clnt->cl_parent;
505
506         while (parent != clnt) {
507                 if (parent->cl_xprt != clnt->cl_xprt)
508                         break;
509                 if (clnt->cl_autobind)
510                         break;
511                 clnt = parent;
512                 parent = parent->cl_parent;
513         }
514         return clnt;
515 }
516
517 /**
518  * rpcb_getport_async - obtain the port for a given RPC service on a given host
519  * @task: task that is waiting for portmapper request
520  *
521  * This one can be called for an ongoing RPC request, and can be used in
522  * an async (rpciod) context.
523  */
524 void rpcb_getport_async(struct rpc_task *task)
525 {
526         struct rpc_clnt *clnt;
527         struct rpc_procinfo *proc;
528         u32 bind_version;
529         struct rpc_xprt *xprt;
530         struct rpc_clnt *rpcb_clnt;
531         static struct rpcbind_args *map;
532         struct rpc_task *child;
533         struct sockaddr_storage addr;
534         struct sockaddr *sap = (struct sockaddr *)&addr;
535         size_t salen;
536         int status;
537
538         clnt = rpcb_find_transport_owner(task->tk_client);
539         xprt = clnt->cl_xprt;
540
541         dprintk("RPC: %5u %s(%s, %u, %u, %d)\n",
542                 task->tk_pid, __func__,
543                 clnt->cl_server, clnt->cl_prog, clnt->cl_vers, xprt->prot);
544
545         /* Put self on the wait queue to ensure we get notified if
546          * some other task is already attempting to bind the port */
547         rpc_sleep_on(&xprt->binding, task, NULL);
548
549         if (xprt_test_and_set_binding(xprt)) {
550                 dprintk("RPC: %5u %s: waiting for another binder\n",
551                         task->tk_pid, __func__);
552                 return;
553         }
554
555         /* Someone else may have bound if we slept */
556         if (xprt_bound(xprt)) {
557                 status = 0;
558                 dprintk("RPC: %5u %s: already bound\n",
559                         task->tk_pid, __func__);
560                 goto bailout_nofree;
561         }
562
563         /* Parent transport's destination address */
564         salen = rpc_peeraddr(clnt, sap, sizeof(addr));
565
566         /* Don't ever use rpcbind v2 for AF_INET6 requests */
567         switch (sap->sa_family) {
568         case AF_INET:
569                 proc = rpcb_next_version[xprt->bind_index].rpc_proc;
570                 bind_version = rpcb_next_version[xprt->bind_index].rpc_vers;
571                 break;
572         case AF_INET6:
573                 proc = rpcb_next_version6[xprt->bind_index].rpc_proc;
574                 bind_version = rpcb_next_version6[xprt->bind_index].rpc_vers;
575                 break;
576         default:
577                 status = -EAFNOSUPPORT;
578                 dprintk("RPC: %5u %s: bad address family\n",
579                                 task->tk_pid, __func__);
580                 goto bailout_nofree;
581         }
582         if (proc == NULL) {
583                 xprt->bind_index = 0;
584                 status = -EPFNOSUPPORT;
585                 dprintk("RPC: %5u %s: no more getport versions available\n",
586                         task->tk_pid, __func__);
587                 goto bailout_nofree;
588         }
589
590         dprintk("RPC: %5u %s: trying rpcbind version %u\n",
591                 task->tk_pid, __func__, bind_version);
592
593         rpcb_clnt = rpcb_create(clnt->cl_server, sap, salen, xprt->prot,
594                                 bind_version);
595         if (IS_ERR(rpcb_clnt)) {
596                 status = PTR_ERR(rpcb_clnt);
597                 dprintk("RPC: %5u %s: rpcb_create failed, error %ld\n",
598                         task->tk_pid, __func__, PTR_ERR(rpcb_clnt));
599                 goto bailout_nofree;
600         }
601
602         map = kzalloc(sizeof(struct rpcbind_args), GFP_ATOMIC);
603         if (!map) {
604                 status = -ENOMEM;
605                 dprintk("RPC: %5u %s: no memory available\n",
606                         task->tk_pid, __func__);
607                 goto bailout_release_client;
608         }
609         map->r_prog = clnt->cl_prog;
610         map->r_vers = clnt->cl_vers;
611         map->r_prot = xprt->prot;
612         map->r_port = 0;
613         map->r_xprt = xprt_get(xprt);
614         map->r_status = -EIO;
615
616         switch (bind_version) {
617         case RPCBVERS_4:
618         case RPCBVERS_3:
619                 map->r_netid = rpc_peeraddr2str(clnt, RPC_DISPLAY_NETID);
620                 map->r_addr = rpc_sockaddr2uaddr(sap);
621                 map->r_owner = "";
622                 break;
623         case RPCBVERS_2:
624                 map->r_addr = NULL;
625                 break;
626         default:
627                 BUG();
628         }
629
630         child = rpcb_call_async(rpcb_clnt, map, proc);
631         rpc_release_client(rpcb_clnt);
632         if (IS_ERR(child)) {
633                 /* rpcb_map_release() has freed the arguments */
634                 dprintk("RPC: %5u %s: rpc_run_task failed\n",
635                         task->tk_pid, __func__);
636                 return;
637         }
638
639         xprt->stat.bind_count++;
640         rpc_put_task(child);
641         return;
642
643 bailout_release_client:
644         rpc_release_client(rpcb_clnt);
645 bailout_nofree:
646         rpcb_wake_rpcbind_waiters(xprt, status);
647         task->tk_status = status;
648 }
649 EXPORT_SYMBOL_GPL(rpcb_getport_async);
650
651 /*
652  * Rpcbind child task calls this callback via tk_exit.
653  */
654 static void rpcb_getport_done(struct rpc_task *child, void *data)
655 {
656         struct rpcbind_args *map = data;
657         struct rpc_xprt *xprt = map->r_xprt;
658         int status = child->tk_status;
659
660         /* Garbage reply: retry with a lesser rpcbind version */
661         if (status == -EIO)
662                 status = -EPROTONOSUPPORT;
663
664         /* rpcbind server doesn't support this rpcbind protocol version */
665         if (status == -EPROTONOSUPPORT)
666                 xprt->bind_index++;
667
668         if (status < 0) {
669                 /* rpcbind server not available on remote host? */
670                 xprt->ops->set_port(xprt, 0);
671         } else if (map->r_port == 0) {
672                 /* Requested RPC service wasn't registered on remote host */
673                 xprt->ops->set_port(xprt, 0);
674                 status = -EACCES;
675         } else {
676                 /* Succeeded */
677                 xprt->ops->set_port(xprt, map->r_port);
678                 xprt_set_bound(xprt);
679                 status = 0;
680         }
681
682         dprintk("RPC: %5u rpcb_getport_done(status %d, port %u)\n",
683                         child->tk_pid, status, map->r_port);
684
685         map->r_status = status;
686 }
687
688 /*
689  * XDR functions for rpcbind
690  */
691
692 static void rpcb_enc_mapping(struct rpc_rqst *req, struct xdr_stream *xdr,
693                              const struct rpcbind_args *rpcb)
694 {
695         struct rpc_task *task = req->rq_task;
696         __be32 *p;
697
698         dprintk("RPC: %5u encoding PMAP_%s call (%u, %u, %d, %u)\n",
699                         task->tk_pid, task->tk_msg.rpc_proc->p_name,
700                         rpcb->r_prog, rpcb->r_vers, rpcb->r_prot, rpcb->r_port);
701
702         p = xdr_reserve_space(xdr, RPCB_mappingargs_sz << 2);
703         *p++ = cpu_to_be32(rpcb->r_prog);
704         *p++ = cpu_to_be32(rpcb->r_vers);
705         *p++ = cpu_to_be32(rpcb->r_prot);
706         *p   = cpu_to_be32(rpcb->r_port);
707 }
708
709 static int rpcb_dec_getport(struct rpc_rqst *req, struct xdr_stream *xdr,
710                             struct rpcbind_args *rpcb)
711 {
712         struct rpc_task *task = req->rq_task;
713         unsigned long port;
714         __be32 *p;
715
716         rpcb->r_port = 0;
717
718         p = xdr_inline_decode(xdr, 4);
719         if (unlikely(p == NULL))
720                 return -EIO;
721
722         port = be32_to_cpup(p);
723         dprintk("RPC: %5u PMAP_%s result: %lu\n", task->tk_pid,
724                         task->tk_msg.rpc_proc->p_name, port);
725         if (unlikely(port > USHRT_MAX))
726                 return -EIO;
727
728         rpcb->r_port = port;
729         return 0;
730 }
731
732 static int rpcb_dec_set(struct rpc_rqst *req, struct xdr_stream *xdr,
733                         unsigned int *boolp)
734 {
735         struct rpc_task *task = req->rq_task;
736         __be32 *p;
737
738         p = xdr_inline_decode(xdr, 4);
739         if (unlikely(p == NULL))
740                 return -EIO;
741
742         *boolp = 0;
743         if (*p != xdr_zero)
744                 *boolp = 1;
745
746         dprintk("RPC: %5u RPCB_%s call %s\n",
747                         task->tk_pid, task->tk_msg.rpc_proc->p_name,
748                         (*boolp ? "succeeded" : "failed"));
749         return 0;
750 }
751
752 static void encode_rpcb_string(struct xdr_stream *xdr, const char *string,
753                                const u32 maxstrlen)
754 {
755         __be32 *p;
756         u32 len;
757
758         len = strlen(string);
759         BUG_ON(len > maxstrlen);
760         p = xdr_reserve_space(xdr, 4 + len);
761         xdr_encode_opaque(p, string, len);
762 }
763
764 static void rpcb_enc_getaddr(struct rpc_rqst *req, struct xdr_stream *xdr,
765                              const struct rpcbind_args *rpcb)
766 {
767         struct rpc_task *task = req->rq_task;
768         __be32 *p;
769
770         dprintk("RPC: %5u encoding RPCB_%s call (%u, %u, '%s', '%s')\n",
771                         task->tk_pid, task->tk_msg.rpc_proc->p_name,
772                         rpcb->r_prog, rpcb->r_vers,
773                         rpcb->r_netid, rpcb->r_addr);
774
775         p = xdr_reserve_space(xdr, (RPCB_program_sz + RPCB_version_sz) << 2);
776         *p++ = cpu_to_be32(rpcb->r_prog);
777         *p = cpu_to_be32(rpcb->r_vers);
778
779         encode_rpcb_string(xdr, rpcb->r_netid, RPCBIND_MAXNETIDLEN);
780         encode_rpcb_string(xdr, rpcb->r_addr, RPCBIND_MAXUADDRLEN);
781         encode_rpcb_string(xdr, rpcb->r_owner, RPCB_MAXOWNERLEN);
782 }
783
784 static int rpcb_dec_getaddr(struct rpc_rqst *req, struct xdr_stream *xdr,
785                             struct rpcbind_args *rpcb)
786 {
787         struct sockaddr_storage address;
788         struct sockaddr *sap = (struct sockaddr *)&address;
789         struct rpc_task *task = req->rq_task;
790         __be32 *p;
791         u32 len;
792
793         rpcb->r_port = 0;
794
795         p = xdr_inline_decode(xdr, 4);
796         if (unlikely(p == NULL))
797                 goto out_fail;
798         len = be32_to_cpup(p);
799
800         /*
801          * If the returned universal address is a null string,
802          * the requested RPC service was not registered.
803          */
804         if (len == 0) {
805                 dprintk("RPC: %5u RPCB reply: program not registered\n",
806                                 task->tk_pid);
807                 return 0;
808         }
809
810         if (unlikely(len > RPCBIND_MAXUADDRLEN))
811                 goto out_fail;
812
813         p = xdr_inline_decode(xdr, len);
814         if (unlikely(p == NULL))
815                 goto out_fail;
816         dprintk("RPC: %5u RPCB_%s reply: %s\n", task->tk_pid,
817                         task->tk_msg.rpc_proc->p_name, (char *)p);
818
819         if (rpc_uaddr2sockaddr((char *)p, len, sap, sizeof(address)) == 0)
820                 goto out_fail;
821         rpcb->r_port = rpc_get_port(sap);
822
823         return 0;
824
825 out_fail:
826         dprintk("RPC: %5u malformed RPCB_%s reply\n",
827                         task->tk_pid, task->tk_msg.rpc_proc->p_name);
828         return -EIO;
829 }
830
831 /*
832  * Not all rpcbind procedures described in RFC 1833 are implemented
833  * since the Linux kernel RPC code requires only these.
834  */
835
836 static struct rpc_procinfo rpcb_procedures2[] = {
837         [RPCBPROC_SET] = {
838                 .p_proc         = RPCBPROC_SET,
839                 .p_encode       = (kxdreproc_t)rpcb_enc_mapping,
840                 .p_decode       = (kxdrdproc_t)rpcb_dec_set,
841                 .p_arglen       = RPCB_mappingargs_sz,
842                 .p_replen       = RPCB_setres_sz,
843                 .p_statidx      = RPCBPROC_SET,
844                 .p_timer        = 0,
845                 .p_name         = "SET",
846         },
847         [RPCBPROC_UNSET] = {
848                 .p_proc         = RPCBPROC_UNSET,
849                 .p_encode       = (kxdreproc_t)rpcb_enc_mapping,
850                 .p_decode       = (kxdrdproc_t)rpcb_dec_set,
851                 .p_arglen       = RPCB_mappingargs_sz,
852                 .p_replen       = RPCB_setres_sz,
853                 .p_statidx      = RPCBPROC_UNSET,
854                 .p_timer        = 0,
855                 .p_name         = "UNSET",
856         },
857         [RPCBPROC_GETPORT] = {
858                 .p_proc         = RPCBPROC_GETPORT,
859                 .p_encode       = (kxdreproc_t)rpcb_enc_mapping,
860                 .p_decode       = (kxdrdproc_t)rpcb_dec_getport,
861                 .p_arglen       = RPCB_mappingargs_sz,
862                 .p_replen       = RPCB_getportres_sz,
863                 .p_statidx      = RPCBPROC_GETPORT,
864                 .p_timer        = 0,
865                 .p_name         = "GETPORT",
866         },
867 };
868
869 static struct rpc_procinfo rpcb_procedures3[] = {
870         [RPCBPROC_SET] = {
871                 .p_proc         = RPCBPROC_SET,
872                 .p_encode       = (kxdreproc_t)rpcb_enc_getaddr,
873                 .p_decode       = (kxdrdproc_t)rpcb_dec_set,
874                 .p_arglen       = RPCB_getaddrargs_sz,
875                 .p_replen       = RPCB_setres_sz,
876                 .p_statidx      = RPCBPROC_SET,
877                 .p_timer        = 0,
878                 .p_name         = "SET",
879         },
880         [RPCBPROC_UNSET] = {
881                 .p_proc         = RPCBPROC_UNSET,
882                 .p_encode       = (kxdreproc_t)rpcb_enc_getaddr,
883                 .p_decode       = (kxdrdproc_t)rpcb_dec_set,
884                 .p_arglen       = RPCB_getaddrargs_sz,
885                 .p_replen       = RPCB_setres_sz,
886                 .p_statidx      = RPCBPROC_UNSET,
887                 .p_timer        = 0,
888                 .p_name         = "UNSET",
889         },
890         [RPCBPROC_GETADDR] = {
891                 .p_proc         = RPCBPROC_GETADDR,
892                 .p_encode       = (kxdreproc_t)rpcb_enc_getaddr,
893                 .p_decode       = (kxdrdproc_t)rpcb_dec_getaddr,
894                 .p_arglen       = RPCB_getaddrargs_sz,
895                 .p_replen       = RPCB_getaddrres_sz,
896                 .p_statidx      = RPCBPROC_GETADDR,
897                 .p_timer        = 0,
898                 .p_name         = "GETADDR",
899         },
900 };
901
902 static struct rpc_procinfo rpcb_procedures4[] = {
903         [RPCBPROC_SET] = {
904                 .p_proc         = RPCBPROC_SET,
905                 .p_encode       = (kxdreproc_t)rpcb_enc_getaddr,
906                 .p_decode       = (kxdrdproc_t)rpcb_dec_set,
907                 .p_arglen       = RPCB_getaddrargs_sz,
908                 .p_replen       = RPCB_setres_sz,
909                 .p_statidx      = RPCBPROC_SET,
910                 .p_timer        = 0,
911                 .p_name         = "SET",
912         },
913         [RPCBPROC_UNSET] = {
914                 .p_proc         = RPCBPROC_UNSET,
915                 .p_encode       = (kxdreproc_t)rpcb_enc_getaddr,
916                 .p_decode       = (kxdrdproc_t)rpcb_dec_set,
917                 .p_arglen       = RPCB_getaddrargs_sz,
918                 .p_replen       = RPCB_setres_sz,
919                 .p_statidx      = RPCBPROC_UNSET,
920                 .p_timer        = 0,
921                 .p_name         = "UNSET",
922         },
923         [RPCBPROC_GETADDR] = {
924                 .p_proc         = RPCBPROC_GETADDR,
925                 .p_encode       = (kxdreproc_t)rpcb_enc_getaddr,
926                 .p_decode       = (kxdrdproc_t)rpcb_dec_getaddr,
927                 .p_arglen       = RPCB_getaddrargs_sz,
928                 .p_replen       = RPCB_getaddrres_sz,
929                 .p_statidx      = RPCBPROC_GETADDR,
930                 .p_timer        = 0,
931                 .p_name         = "GETADDR",
932         },
933 };
934
935 static struct rpcb_info rpcb_next_version[] = {
936         {
937                 .rpc_vers       = RPCBVERS_2,
938                 .rpc_proc       = &rpcb_procedures2[RPCBPROC_GETPORT],
939         },
940         {
941                 .rpc_proc       = NULL,
942         },
943 };
944
945 static struct rpcb_info rpcb_next_version6[] = {
946         {
947                 .rpc_vers       = RPCBVERS_4,
948                 .rpc_proc       = &rpcb_procedures4[RPCBPROC_GETADDR],
949         },
950         {
951                 .rpc_vers       = RPCBVERS_3,
952                 .rpc_proc       = &rpcb_procedures3[RPCBPROC_GETADDR],
953         },
954         {
955                 .rpc_proc       = NULL,
956         },
957 };
958
959 static struct rpc_version rpcb_version2 = {
960         .number         = RPCBVERS_2,
961         .nrprocs        = ARRAY_SIZE(rpcb_procedures2),
962         .procs          = rpcb_procedures2
963 };
964
965 static struct rpc_version rpcb_version3 = {
966         .number         = RPCBVERS_3,
967         .nrprocs        = ARRAY_SIZE(rpcb_procedures3),
968         .procs          = rpcb_procedures3
969 };
970
971 static struct rpc_version rpcb_version4 = {
972         .number         = RPCBVERS_4,
973         .nrprocs        = ARRAY_SIZE(rpcb_procedures4),
974         .procs          = rpcb_procedures4
975 };
976
977 static struct rpc_version *rpcb_version[] = {
978         NULL,
979         NULL,
980         &rpcb_version2,
981         &rpcb_version3,
982         &rpcb_version4
983 };
984
985 static struct rpc_stat rpcb_stats;
986
987 static struct rpc_program rpcb_program = {
988         .name           = "rpcbind",
989         .number         = RPCBIND_PROGRAM,
990         .nrvers         = ARRAY_SIZE(rpcb_version),
991         .version        = rpcb_version,
992         .stats          = &rpcb_stats,
993 };
994
995 /**
996  * cleanup_rpcb_clnt - remove xprtsock's sysctls, unregister
997  *
998  */
999 void cleanup_rpcb_clnt(void)
1000 {
1001         if (rpcb_local_clnt4)
1002                 rpc_shutdown_client(rpcb_local_clnt4);
1003         if (rpcb_local_clnt)
1004                 rpc_shutdown_client(rpcb_local_clnt);
1005 }