xref: /openbmc/linux/net/sunrpc/rpcb_clnt.c (revision 384740dc)
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 
24 #include <linux/sunrpc/clnt.h>
25 #include <linux/sunrpc/sched.h>
26 #include <linux/sunrpc/xprtsock.h>
27 
28 #ifdef RPC_DEBUG
29 # define RPCDBG_FACILITY	RPCDBG_BIND
30 #endif
31 
32 #define RPCBIND_PROGRAM		(100000u)
33 #define RPCBIND_PORT		(111u)
34 
35 #define RPCBVERS_2		(2u)
36 #define RPCBVERS_3		(3u)
37 #define RPCBVERS_4		(4u)
38 
39 enum {
40 	RPCBPROC_NULL,
41 	RPCBPROC_SET,
42 	RPCBPROC_UNSET,
43 	RPCBPROC_GETPORT,
44 	RPCBPROC_GETADDR = 3,		/* alias for GETPORT */
45 	RPCBPROC_DUMP,
46 	RPCBPROC_CALLIT,
47 	RPCBPROC_BCAST = 5,		/* alias for CALLIT */
48 	RPCBPROC_GETTIME,
49 	RPCBPROC_UADDR2TADDR,
50 	RPCBPROC_TADDR2UADDR,
51 	RPCBPROC_GETVERSADDR,
52 	RPCBPROC_INDIRECT,
53 	RPCBPROC_GETADDRLIST,
54 	RPCBPROC_GETSTAT,
55 };
56 
57 #define RPCB_HIGHPROC_2		RPCBPROC_CALLIT
58 #define RPCB_HIGHPROC_3		RPCBPROC_TADDR2UADDR
59 #define RPCB_HIGHPROC_4		RPCBPROC_GETSTAT
60 
61 /*
62  * r_owner
63  *
64  * The "owner" is allowed to unset a service in the rpcbind database.
65  * We always use the following (arbitrary) fixed string.
66  */
67 #define RPCB_OWNER_STRING	"rpcb"
68 #define RPCB_MAXOWNERLEN	sizeof(RPCB_OWNER_STRING)
69 
70 static void			rpcb_getport_done(struct rpc_task *, void *);
71 static void			rpcb_map_release(void *data);
72 static struct rpc_program	rpcb_program;
73 
74 struct rpcbind_args {
75 	struct rpc_xprt *	r_xprt;
76 
77 	u32			r_prog;
78 	u32			r_vers;
79 	u32			r_prot;
80 	unsigned short		r_port;
81 	const char *		r_netid;
82 	const char *		r_addr;
83 	const char *		r_owner;
84 
85 	int			r_status;
86 };
87 
88 static struct rpc_procinfo rpcb_procedures2[];
89 static struct rpc_procinfo rpcb_procedures3[];
90 static struct rpc_procinfo rpcb_procedures4[];
91 
92 struct rpcb_info {
93 	u32			rpc_vers;
94 	struct rpc_procinfo *	rpc_proc;
95 };
96 
97 static struct rpcb_info rpcb_next_version[];
98 static struct rpcb_info rpcb_next_version6[];
99 
100 static const struct rpc_call_ops rpcb_getport_ops = {
101 	.rpc_call_done		= rpcb_getport_done,
102 	.rpc_release		= rpcb_map_release,
103 };
104 
105 static void rpcb_wake_rpcbind_waiters(struct rpc_xprt *xprt, int status)
106 {
107 	xprt_clear_binding(xprt);
108 	rpc_wake_up_status(&xprt->binding, status);
109 }
110 
111 static void rpcb_map_release(void *data)
112 {
113 	struct rpcbind_args *map = data;
114 
115 	rpcb_wake_rpcbind_waiters(map->r_xprt, map->r_status);
116 	xprt_put(map->r_xprt);
117 	kfree(map);
118 }
119 
120 static const struct sockaddr_in rpcb_inaddr_loopback = {
121 	.sin_family		= AF_INET,
122 	.sin_addr.s_addr	= htonl(INADDR_LOOPBACK),
123 	.sin_port		= htons(RPCBIND_PORT),
124 };
125 
126 static const struct sockaddr_in6 rpcb_in6addr_loopback = {
127 	.sin6_family		= AF_INET6,
128 	.sin6_addr		= IN6ADDR_LOOPBACK_INIT,
129 	.sin6_port		= htons(RPCBIND_PORT),
130 };
131 
132 static struct rpc_clnt *rpcb_create_local(struct sockaddr *addr,
133 					  size_t addrlen, u32 version)
134 {
135 	struct rpc_create_args args = {
136 		.protocol	= XPRT_TRANSPORT_UDP,
137 		.address	= addr,
138 		.addrsize	= addrlen,
139 		.servername	= "localhost",
140 		.program	= &rpcb_program,
141 		.version	= version,
142 		.authflavor	= RPC_AUTH_UNIX,
143 		.flags		= RPC_CLNT_CREATE_NOPING,
144 	};
145 
146 	return rpc_create(&args);
147 }
148 
149 static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr,
150 				    size_t salen, int proto, u32 version)
151 {
152 	struct rpc_create_args args = {
153 		.protocol	= proto,
154 		.address	= srvaddr,
155 		.addrsize	= salen,
156 		.servername	= hostname,
157 		.program	= &rpcb_program,
158 		.version	= version,
159 		.authflavor	= RPC_AUTH_UNIX,
160 		.flags		= (RPC_CLNT_CREATE_NOPING |
161 					RPC_CLNT_CREATE_NONPRIVPORT),
162 	};
163 
164 	switch (srvaddr->sa_family) {
165 	case AF_INET:
166 		((struct sockaddr_in *)srvaddr)->sin_port = htons(RPCBIND_PORT);
167 		break;
168 	case AF_INET6:
169 		((struct sockaddr_in6 *)srvaddr)->sin6_port = htons(RPCBIND_PORT);
170 		break;
171 	default:
172 		return NULL;
173 	}
174 
175 	return rpc_create(&args);
176 }
177 
178 static int rpcb_register_call(struct sockaddr *addr, size_t addrlen,
179 			      u32 version, struct rpc_message *msg,
180 			      int *result)
181 {
182 	struct rpc_clnt *rpcb_clnt;
183 	int error = 0;
184 
185 	*result = 0;
186 
187 	rpcb_clnt = rpcb_create_local(addr, addrlen, version);
188 	if (!IS_ERR(rpcb_clnt)) {
189 		error = rpc_call_sync(rpcb_clnt, msg, 0);
190 		rpc_shutdown_client(rpcb_clnt);
191 	} else
192 		error = PTR_ERR(rpcb_clnt);
193 
194 	if (error < 0)
195 		printk(KERN_WARNING "RPC: failed to contact local rpcbind "
196 				"server (errno %d).\n", -error);
197 	dprintk("RPC:       registration status %d/%d\n", error, *result);
198 
199 	return error;
200 }
201 
202 /**
203  * rpcb_register - set or unset a port registration with the local rpcbind svc
204  * @prog: RPC program number to bind
205  * @vers: RPC version number to bind
206  * @prot: transport protocol to register
207  * @port: port value to register
208  * @okay: OUT: result code
209  *
210  * RPC services invoke this function to advertise their contact
211  * information via the system's rpcbind daemon.  RPC services
212  * invoke this function once for each [program, version, transport]
213  * tuple they wish to advertise.
214  *
215  * Callers may also unregister RPC services that are no longer
216  * available by setting the passed-in port to zero.  This removes
217  * all registered transports for [program, version] from the local
218  * rpcbind database.
219  *
220  * Returns zero if the registration request was dispatched
221  * successfully and a reply was received.  The rpcbind daemon's
222  * boolean result code is stored in *okay.
223  *
224  * Returns an errno value and sets *result to zero if there was
225  * some problem that prevented the rpcbind request from being
226  * dispatched, or if the rpcbind daemon did not respond within
227  * the timeout.
228  *
229  * This function uses rpcbind protocol version 2 to contact the
230  * local rpcbind daemon.
231  *
232  * Registration works over both AF_INET and AF_INET6, and services
233  * registered via this function are advertised as available for any
234  * address.  If the local rpcbind daemon is listening on AF_INET6,
235  * services registered via this function will be advertised on
236  * IN6ADDR_ANY (ie available for all AF_INET and AF_INET6
237  * addresses).
238  */
239 int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
240 {
241 	struct rpcbind_args map = {
242 		.r_prog		= prog,
243 		.r_vers		= vers,
244 		.r_prot		= prot,
245 		.r_port		= port,
246 	};
247 	struct rpc_message msg = {
248 		.rpc_argp	= &map,
249 		.rpc_resp	= okay,
250 	};
251 
252 	dprintk("RPC:       %sregistering (%u, %u, %d, %u) with local "
253 			"rpcbind\n", (port ? "" : "un"),
254 			prog, vers, prot, port);
255 
256 	msg.rpc_proc = &rpcb_procedures2[RPCBPROC_UNSET];
257 	if (port)
258 		msg.rpc_proc = &rpcb_procedures2[RPCBPROC_SET];
259 
260 	return rpcb_register_call((struct sockaddr *)&rpcb_inaddr_loopback,
261 					sizeof(rpcb_inaddr_loopback),
262 					RPCBVERS_2, &msg, okay);
263 }
264 
265 /*
266  * Fill in AF_INET family-specific arguments to register
267  */
268 static int rpcb_register_netid4(struct sockaddr_in *address_to_register,
269 				struct rpc_message *msg)
270 {
271 	struct rpcbind_args *map = msg->rpc_argp;
272 	unsigned short port = ntohs(address_to_register->sin_port);
273 	char buf[32];
274 
275 	/* Construct AF_INET universal address */
276 	snprintf(buf, sizeof(buf),
277 			NIPQUAD_FMT".%u.%u",
278 			NIPQUAD(address_to_register->sin_addr.s_addr),
279 			port >> 8, port & 0xff);
280 	map->r_addr = buf;
281 
282 	dprintk("RPC:       %sregistering [%u, %u, %s, '%s'] with "
283 		"local rpcbind\n", (port ? "" : "un"),
284 			map->r_prog, map->r_vers,
285 			map->r_addr, map->r_netid);
286 
287 	msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];
288 	if (port)
289 		msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET];
290 
291 	return rpcb_register_call((struct sockaddr *)&rpcb_inaddr_loopback,
292 					sizeof(rpcb_inaddr_loopback),
293 					RPCBVERS_4, msg, msg->rpc_resp);
294 }
295 
296 /*
297  * Fill in AF_INET6 family-specific arguments to register
298  */
299 static int rpcb_register_netid6(struct sockaddr_in6 *address_to_register,
300 				struct rpc_message *msg)
301 {
302 	struct rpcbind_args *map = msg->rpc_argp;
303 	unsigned short port = ntohs(address_to_register->sin6_port);
304 	char buf[64];
305 
306 	/* Construct AF_INET6 universal address */
307 	snprintf(buf, sizeof(buf),
308 			NIP6_FMT".%u.%u",
309 			NIP6(address_to_register->sin6_addr),
310 			port >> 8, port & 0xff);
311 	map->r_addr = buf;
312 
313 	dprintk("RPC:       %sregistering [%u, %u, %s, '%s'] with "
314 		"local rpcbind\n", (port ? "" : "un"),
315 			map->r_prog, map->r_vers,
316 			map->r_addr, map->r_netid);
317 
318 	msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];
319 	if (port)
320 		msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET];
321 
322 	return rpcb_register_call((struct sockaddr *)&rpcb_in6addr_loopback,
323 					sizeof(rpcb_in6addr_loopback),
324 					RPCBVERS_4, msg, msg->rpc_resp);
325 }
326 
327 /**
328  * rpcb_v4_register - set or unset a port registration with the local rpcbind
329  * @program: RPC program number of service to (un)register
330  * @version: RPC version number of service to (un)register
331  * @address: address family, IP address, and port to (un)register
332  * @netid: netid of transport protocol to (un)register
333  * @result: result code from rpcbind RPC call
334  *
335  * RPC services invoke this function to advertise their contact
336  * information via the system's rpcbind daemon.  RPC services
337  * invoke this function once for each [program, version, address,
338  * netid] tuple they wish to advertise.
339  *
340  * Callers may also unregister RPC services that are no longer
341  * available by setting the port number in the passed-in address
342  * to zero.  Callers pass a netid of "" to unregister all
343  * transport netids associated with [program, version, address].
344  *
345  * Returns zero if the registration request was dispatched
346  * successfully and a reply was received.  The rpcbind daemon's
347  * result code is stored in *result.
348  *
349  * Returns an errno value and sets *result to zero if there was
350  * some problem that prevented the rpcbind request from being
351  * dispatched, or if the rpcbind daemon did not respond within
352  * the timeout.
353  *
354  * This function uses rpcbind protocol version 4 to contact the
355  * local rpcbind daemon.  The local rpcbind daemon must support
356  * version 4 of the rpcbind protocol in order for these functions
357  * to register a service successfully.
358  *
359  * Supported netids include "udp" and "tcp" for UDP and TCP over
360  * IPv4, and "udp6" and "tcp6" for UDP and TCP over IPv6,
361  * respectively.
362  *
363  * The contents of @address determine the address family and the
364  * port to be registered.  The usual practice is to pass INADDR_ANY
365  * as the raw address, but specifying a non-zero address is also
366  * supported by this API if the caller wishes to advertise an RPC
367  * service on a specific network interface.
368  *
369  * Note that passing in INADDR_ANY does not create the same service
370  * registration as IN6ADDR_ANY.  The former advertises an RPC
371  * service on any IPv4 address, but not on IPv6.  The latter
372  * advertises the service on all IPv4 and IPv6 addresses.
373  */
374 int rpcb_v4_register(const u32 program, const u32 version,
375 		     const struct sockaddr *address, const char *netid,
376 		     int *result)
377 {
378 	struct rpcbind_args map = {
379 		.r_prog		= program,
380 		.r_vers		= version,
381 		.r_netid	= netid,
382 		.r_owner	= RPCB_OWNER_STRING,
383 	};
384 	struct rpc_message msg = {
385 		.rpc_argp	= &map,
386 		.rpc_resp	= result,
387 	};
388 
389 	*result = 0;
390 
391 	switch (address->sa_family) {
392 	case AF_INET:
393 		return rpcb_register_netid4((struct sockaddr_in *)address,
394 					    &msg);
395 	case AF_INET6:
396 		return rpcb_register_netid6((struct sockaddr_in6 *)address,
397 					    &msg);
398 	}
399 
400 	return -EAFNOSUPPORT;
401 }
402 
403 /**
404  * rpcb_getport_sync - obtain the port for an RPC service on a given host
405  * @sin: address of remote peer
406  * @prog: RPC program number to bind
407  * @vers: RPC version number to bind
408  * @prot: transport protocol to use to make this request
409  *
410  * Return value is the requested advertised port number,
411  * or a negative errno value.
412  *
413  * Called from outside the RPC client in a synchronous task context.
414  * Uses default timeout parameters specified by underlying transport.
415  *
416  * XXX: Needs to support IPv6
417  */
418 int rpcb_getport_sync(struct sockaddr_in *sin, u32 prog, u32 vers, int prot)
419 {
420 	struct rpcbind_args map = {
421 		.r_prog		= prog,
422 		.r_vers		= vers,
423 		.r_prot		= prot,
424 		.r_port		= 0,
425 	};
426 	struct rpc_message msg = {
427 		.rpc_proc	= &rpcb_procedures2[RPCBPROC_GETPORT],
428 		.rpc_argp	= &map,
429 		.rpc_resp	= &map.r_port,
430 	};
431 	struct rpc_clnt	*rpcb_clnt;
432 	int status;
433 
434 	dprintk("RPC:       %s(" NIPQUAD_FMT ", %u, %u, %d)\n",
435 		__func__, NIPQUAD(sin->sin_addr.s_addr), prog, vers, prot);
436 
437 	rpcb_clnt = rpcb_create(NULL, (struct sockaddr *)sin,
438 				sizeof(*sin), prot, RPCBVERS_2);
439 	if (IS_ERR(rpcb_clnt))
440 		return PTR_ERR(rpcb_clnt);
441 
442 	status = rpc_call_sync(rpcb_clnt, &msg, 0);
443 	rpc_shutdown_client(rpcb_clnt);
444 
445 	if (status >= 0) {
446 		if (map.r_port != 0)
447 			return map.r_port;
448 		status = -EACCES;
449 	}
450 	return status;
451 }
452 EXPORT_SYMBOL_GPL(rpcb_getport_sync);
453 
454 static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbind_args *map, struct rpc_procinfo *proc)
455 {
456 	struct rpc_message msg = {
457 		.rpc_proc = proc,
458 		.rpc_argp = map,
459 		.rpc_resp = &map->r_port,
460 	};
461 	struct rpc_task_setup task_setup_data = {
462 		.rpc_client = rpcb_clnt,
463 		.rpc_message = &msg,
464 		.callback_ops = &rpcb_getport_ops,
465 		.callback_data = map,
466 		.flags = RPC_TASK_ASYNC,
467 	};
468 
469 	return rpc_run_task(&task_setup_data);
470 }
471 
472 /**
473  * rpcb_getport_async - obtain the port for a given RPC service on a given host
474  * @task: task that is waiting for portmapper request
475  *
476  * This one can be called for an ongoing RPC request, and can be used in
477  * an async (rpciod) context.
478  */
479 void rpcb_getport_async(struct rpc_task *task)
480 {
481 	struct rpc_clnt *clnt = task->tk_client;
482 	struct rpc_procinfo *proc;
483 	u32 bind_version;
484 	struct rpc_xprt *xprt = task->tk_xprt;
485 	struct rpc_clnt	*rpcb_clnt;
486 	static struct rpcbind_args *map;
487 	struct rpc_task	*child;
488 	struct sockaddr_storage addr;
489 	struct sockaddr *sap = (struct sockaddr *)&addr;
490 	size_t salen;
491 	int status;
492 
493 	dprintk("RPC: %5u %s(%s, %u, %u, %d)\n",
494 		task->tk_pid, __func__,
495 		clnt->cl_server, clnt->cl_prog, clnt->cl_vers, xprt->prot);
496 
497 	/* Autobind on cloned rpc clients is discouraged */
498 	BUG_ON(clnt->cl_parent != clnt);
499 
500 	/* Put self on the wait queue to ensure we get notified if
501 	 * some other task is already attempting to bind the port */
502 	rpc_sleep_on(&xprt->binding, task, NULL);
503 
504 	if (xprt_test_and_set_binding(xprt)) {
505 		dprintk("RPC: %5u %s: waiting for another binder\n",
506 			task->tk_pid, __func__);
507 		return;
508 	}
509 
510 	/* Someone else may have bound if we slept */
511 	if (xprt_bound(xprt)) {
512 		status = 0;
513 		dprintk("RPC: %5u %s: already bound\n",
514 			task->tk_pid, __func__);
515 		goto bailout_nofree;
516 	}
517 
518 	salen = rpc_peeraddr(clnt, sap, sizeof(addr));
519 
520 	/* Don't ever use rpcbind v2 for AF_INET6 requests */
521 	switch (sap->sa_family) {
522 	case AF_INET:
523 		proc = rpcb_next_version[xprt->bind_index].rpc_proc;
524 		bind_version = rpcb_next_version[xprt->bind_index].rpc_vers;
525 		break;
526 	case AF_INET6:
527 		proc = rpcb_next_version6[xprt->bind_index].rpc_proc;
528 		bind_version = rpcb_next_version6[xprt->bind_index].rpc_vers;
529 		break;
530 	default:
531 		status = -EAFNOSUPPORT;
532 		dprintk("RPC: %5u %s: bad address family\n",
533 				task->tk_pid, __func__);
534 		goto bailout_nofree;
535 	}
536 	if (proc == NULL) {
537 		xprt->bind_index = 0;
538 		status = -EPFNOSUPPORT;
539 		dprintk("RPC: %5u %s: no more getport versions available\n",
540 			task->tk_pid, __func__);
541 		goto bailout_nofree;
542 	}
543 
544 	dprintk("RPC: %5u %s: trying rpcbind version %u\n",
545 		task->tk_pid, __func__, bind_version);
546 
547 	rpcb_clnt = rpcb_create(clnt->cl_server, sap, salen, xprt->prot,
548 				bind_version);
549 	if (IS_ERR(rpcb_clnt)) {
550 		status = PTR_ERR(rpcb_clnt);
551 		dprintk("RPC: %5u %s: rpcb_create failed, error %ld\n",
552 			task->tk_pid, __func__, PTR_ERR(rpcb_clnt));
553 		goto bailout_nofree;
554 	}
555 
556 	map = kzalloc(sizeof(struct rpcbind_args), GFP_ATOMIC);
557 	if (!map) {
558 		status = -ENOMEM;
559 		dprintk("RPC: %5u %s: no memory available\n",
560 			task->tk_pid, __func__);
561 		goto bailout_nofree;
562 	}
563 	map->r_prog = clnt->cl_prog;
564 	map->r_vers = clnt->cl_vers;
565 	map->r_prot = xprt->prot;
566 	map->r_port = 0;
567 	map->r_xprt = xprt_get(xprt);
568 	map->r_netid = rpc_peeraddr2str(clnt, RPC_DISPLAY_NETID);
569 	map->r_addr = rpc_peeraddr2str(rpcb_clnt, RPC_DISPLAY_UNIVERSAL_ADDR);
570 	map->r_owner = RPCB_OWNER_STRING;	/* ignored for GETADDR */
571 	map->r_status = -EIO;
572 
573 	child = rpcb_call_async(rpcb_clnt, map, proc);
574 	rpc_release_client(rpcb_clnt);
575 	if (IS_ERR(child)) {
576 		/* rpcb_map_release() has freed the arguments */
577 		dprintk("RPC: %5u %s: rpc_run_task failed\n",
578 			task->tk_pid, __func__);
579 		return;
580 	}
581 	rpc_put_task(child);
582 
583 	task->tk_xprt->stat.bind_count++;
584 	return;
585 
586 bailout_nofree:
587 	rpcb_wake_rpcbind_waiters(xprt, status);
588 	task->tk_status = status;
589 }
590 EXPORT_SYMBOL_GPL(rpcb_getport_async);
591 
592 /*
593  * Rpcbind child task calls this callback via tk_exit.
594  */
595 static void rpcb_getport_done(struct rpc_task *child, void *data)
596 {
597 	struct rpcbind_args *map = data;
598 	struct rpc_xprt *xprt = map->r_xprt;
599 	int status = child->tk_status;
600 
601 	/* Garbage reply: retry with a lesser rpcbind version */
602 	if (status == -EIO)
603 		status = -EPROTONOSUPPORT;
604 
605 	/* rpcbind server doesn't support this rpcbind protocol version */
606 	if (status == -EPROTONOSUPPORT)
607 		xprt->bind_index++;
608 
609 	if (status < 0) {
610 		/* rpcbind server not available on remote host? */
611 		xprt->ops->set_port(xprt, 0);
612 	} else if (map->r_port == 0) {
613 		/* Requested RPC service wasn't registered on remote host */
614 		xprt->ops->set_port(xprt, 0);
615 		status = -EACCES;
616 	} else {
617 		/* Succeeded */
618 		xprt->ops->set_port(xprt, map->r_port);
619 		xprt_set_bound(xprt);
620 		status = 0;
621 	}
622 
623 	dprintk("RPC: %5u rpcb_getport_done(status %d, port %u)\n",
624 			child->tk_pid, status, map->r_port);
625 
626 	map->r_status = status;
627 }
628 
629 /*
630  * XDR functions for rpcbind
631  */
632 
633 static int rpcb_encode_mapping(struct rpc_rqst *req, __be32 *p,
634 			       struct rpcbind_args *rpcb)
635 {
636 	dprintk("RPC:       rpcb_encode_mapping(%u, %u, %d, %u)\n",
637 			rpcb->r_prog, rpcb->r_vers, rpcb->r_prot, rpcb->r_port);
638 	*p++ = htonl(rpcb->r_prog);
639 	*p++ = htonl(rpcb->r_vers);
640 	*p++ = htonl(rpcb->r_prot);
641 	*p++ = htonl(rpcb->r_port);
642 
643 	req->rq_slen = xdr_adjust_iovec(req->rq_svec, p);
644 	return 0;
645 }
646 
647 static int rpcb_decode_getport(struct rpc_rqst *req, __be32 *p,
648 			       unsigned short *portp)
649 {
650 	*portp = (unsigned short) ntohl(*p++);
651 	dprintk("RPC:       rpcb_decode_getport result %u\n",
652 			*portp);
653 	return 0;
654 }
655 
656 static int rpcb_decode_set(struct rpc_rqst *req, __be32 *p,
657 			   unsigned int *boolp)
658 {
659 	*boolp = (unsigned int) ntohl(*p++);
660 	dprintk("RPC:       rpcb_decode_set: call %s\n",
661 			(*boolp ? "succeeded" : "failed"));
662 	return 0;
663 }
664 
665 static int rpcb_encode_getaddr(struct rpc_rqst *req, __be32 *p,
666 			       struct rpcbind_args *rpcb)
667 {
668 	dprintk("RPC:       rpcb_encode_getaddr(%u, %u, %s)\n",
669 			rpcb->r_prog, rpcb->r_vers, rpcb->r_addr);
670 	*p++ = htonl(rpcb->r_prog);
671 	*p++ = htonl(rpcb->r_vers);
672 
673 	p = xdr_encode_string(p, rpcb->r_netid);
674 	p = xdr_encode_string(p, rpcb->r_addr);
675 	p = xdr_encode_string(p, rpcb->r_owner);
676 
677 	req->rq_slen = xdr_adjust_iovec(req->rq_svec, p);
678 
679 	return 0;
680 }
681 
682 static int rpcb_decode_getaddr(struct rpc_rqst *req, __be32 *p,
683 			       unsigned short *portp)
684 {
685 	char *addr;
686 	u32 addr_len;
687 	int c, i, f, first, val;
688 
689 	*portp = 0;
690 	addr_len = ntohl(*p++);
691 
692 	/*
693 	 * Simple sanity check.  The smallest possible universal
694 	 * address is an IPv4 address string containing 11 bytes.
695 	 */
696 	if (addr_len < 11 || addr_len > RPCBIND_MAXUADDRLEN)
697 		goto out_err;
698 
699 	/*
700 	 * Start at the end and walk backwards until the first dot
701 	 * is encountered.  When the second dot is found, we have
702 	 * both parts of the port number.
703 	 */
704 	addr = (char *)p;
705 	val = 0;
706 	first = 1;
707 	f = 1;
708 	for (i = addr_len - 1; i > 0; i--) {
709 		c = addr[i];
710 		if (c >= '0' && c <= '9') {
711 			val += (c - '0') * f;
712 			f *= 10;
713 		} else if (c == '.') {
714 			if (first) {
715 				*portp = val;
716 				val = first = 0;
717 				f = 1;
718 			} else {
719 				*portp |= (val << 8);
720 				break;
721 			}
722 		}
723 	}
724 
725 	/*
726 	 * Simple sanity check.  If we never saw a dot in the reply,
727 	 * then this was probably just garbage.
728 	 */
729 	if (first)
730 		goto out_err;
731 
732 	dprintk("RPC:       rpcb_decode_getaddr port=%u\n", *portp);
733 	return 0;
734 
735 out_err:
736 	dprintk("RPC:       rpcbind server returned malformed reply\n");
737 	return -EIO;
738 }
739 
740 #define RPCB_program_sz		(1u)
741 #define RPCB_version_sz		(1u)
742 #define RPCB_protocol_sz	(1u)
743 #define RPCB_port_sz		(1u)
744 #define RPCB_boolean_sz		(1u)
745 
746 #define RPCB_netid_sz		(1+XDR_QUADLEN(RPCBIND_MAXNETIDLEN))
747 #define RPCB_addr_sz		(1+XDR_QUADLEN(RPCBIND_MAXUADDRLEN))
748 #define RPCB_ownerstring_sz	(1+XDR_QUADLEN(RPCB_MAXOWNERLEN))
749 
750 #define RPCB_mappingargs_sz	RPCB_program_sz+RPCB_version_sz+	\
751 				RPCB_protocol_sz+RPCB_port_sz
752 #define RPCB_getaddrargs_sz	RPCB_program_sz+RPCB_version_sz+	\
753 				RPCB_netid_sz+RPCB_addr_sz+		\
754 				RPCB_ownerstring_sz
755 
756 #define RPCB_setres_sz		RPCB_boolean_sz
757 #define RPCB_getportres_sz	RPCB_port_sz
758 
759 /*
760  * Note that RFC 1833 does not put any size restrictions on the
761  * address string returned by the remote rpcbind database.
762  */
763 #define RPCB_getaddrres_sz	RPCB_addr_sz
764 
765 #define PROC(proc, argtype, restype)					\
766 	[RPCBPROC_##proc] = {						\
767 		.p_proc		= RPCBPROC_##proc,			\
768 		.p_encode	= (kxdrproc_t) rpcb_encode_##argtype,	\
769 		.p_decode	= (kxdrproc_t) rpcb_decode_##restype,	\
770 		.p_arglen	= RPCB_##argtype##args_sz,		\
771 		.p_replen	= RPCB_##restype##res_sz,		\
772 		.p_statidx	= RPCBPROC_##proc,			\
773 		.p_timer	= 0,					\
774 		.p_name		= #proc,				\
775 	}
776 
777 /*
778  * Not all rpcbind procedures described in RFC 1833 are implemented
779  * since the Linux kernel RPC code requires only these.
780  */
781 static struct rpc_procinfo rpcb_procedures2[] = {
782 	PROC(SET,		mapping,	set),
783 	PROC(UNSET,		mapping,	set),
784 	PROC(GETPORT,		mapping,	getport),
785 };
786 
787 static struct rpc_procinfo rpcb_procedures3[] = {
788 	PROC(SET,		getaddr,	set),
789 	PROC(UNSET,		getaddr,	set),
790 	PROC(GETADDR,		getaddr,	getaddr),
791 };
792 
793 static struct rpc_procinfo rpcb_procedures4[] = {
794 	PROC(SET,		getaddr,	set),
795 	PROC(UNSET,		getaddr,	set),
796 	PROC(GETADDR,		getaddr,	getaddr),
797 	PROC(GETVERSADDR,	getaddr,	getaddr),
798 };
799 
800 static struct rpcb_info rpcb_next_version[] = {
801 	{
802 		.rpc_vers	= RPCBVERS_2,
803 		.rpc_proc	= &rpcb_procedures2[RPCBPROC_GETPORT],
804 	},
805 	{
806 		.rpc_proc	= NULL,
807 	},
808 };
809 
810 static struct rpcb_info rpcb_next_version6[] = {
811 	{
812 		.rpc_vers	= RPCBVERS_4,
813 		.rpc_proc	= &rpcb_procedures4[RPCBPROC_GETADDR],
814 	},
815 	{
816 		.rpc_vers	= RPCBVERS_3,
817 		.rpc_proc	= &rpcb_procedures3[RPCBPROC_GETADDR],
818 	},
819 	{
820 		.rpc_proc	= NULL,
821 	},
822 };
823 
824 static struct rpc_version rpcb_version2 = {
825 	.number		= RPCBVERS_2,
826 	.nrprocs	= RPCB_HIGHPROC_2,
827 	.procs		= rpcb_procedures2
828 };
829 
830 static struct rpc_version rpcb_version3 = {
831 	.number		= RPCBVERS_3,
832 	.nrprocs	= RPCB_HIGHPROC_3,
833 	.procs		= rpcb_procedures3
834 };
835 
836 static struct rpc_version rpcb_version4 = {
837 	.number		= RPCBVERS_4,
838 	.nrprocs	= RPCB_HIGHPROC_4,
839 	.procs		= rpcb_procedures4
840 };
841 
842 static struct rpc_version *rpcb_version[] = {
843 	NULL,
844 	NULL,
845 	&rpcb_version2,
846 	&rpcb_version3,
847 	&rpcb_version4
848 };
849 
850 static struct rpc_stat rpcb_stats;
851 
852 static struct rpc_program rpcb_program = {
853 	.name		= "rpcbind",
854 	.number		= RPCBIND_PROGRAM,
855 	.nrvers		= ARRAY_SIZE(rpcb_version),
856 	.version	= rpcb_version,
857 	.stats		= &rpcb_stats,
858 };
859