rpcb_clnt.c 28.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * In-kernel rpcbind client supporting versions 2, 3, and 4 of the rpcbind
 * protocol
 *
 * Based on RFC 1833: "Binding Protocols for ONC RPC Version 2" and
 * RFC 3530: "Network File System (NFS) version 4 Protocol"
 *
 * Original: Gilles Quillard, Bull Open Source, 2005 <gilles.quillard@bull.net>
 * Updated: Chuck Lever, Oracle Corporation, 2007 <chuck.lever@oracle.com>
 *
 * Descended from net/sunrpc/pmap_clnt.c,
 *  Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
 */

15 16
#include <linux/module.h>

17 18
#include <linux/types.h>
#include <linux/socket.h>
19
#include <linux/un.h>
20 21
#include <linux/in.h>
#include <linux/in6.h>
22 23
#include <linux/kernel.h>
#include <linux/errno.h>
24
#include <linux/mutex.h>
25
#include <linux/slab.h>
26
#include <linux/nsproxy.h>
27
#include <net/ipv6.h>
28 29 30

#include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/sched.h>
31
#include <linux/sunrpc/xprtsock.h>
32

33 34
#include "netns.h"

35 36 37 38
#ifdef RPC_DEBUG
# define RPCDBG_FACILITY	RPCDBG_BIND
#endif

39 40
#define RPCBIND_SOCK_PATHNAME	"/var/run/rpcbind.sock"

41 42 43
#define RPCBIND_PROGRAM		(100000u)
#define RPCBIND_PORT		(111u)

44 45 46 47
#define RPCBVERS_2		(2u)
#define RPCBVERS_3		(3u)
#define RPCBVERS_4		(4u)

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
enum {
	RPCBPROC_NULL,
	RPCBPROC_SET,
	RPCBPROC_UNSET,
	RPCBPROC_GETPORT,
	RPCBPROC_GETADDR = 3,		/* alias for GETPORT */
	RPCBPROC_DUMP,
	RPCBPROC_CALLIT,
	RPCBPROC_BCAST = 5,		/* alias for CALLIT */
	RPCBPROC_GETTIME,
	RPCBPROC_UADDR2TADDR,
	RPCBPROC_TADDR2UADDR,
	RPCBPROC_GETVERSADDR,
	RPCBPROC_INDIRECT,
	RPCBPROC_GETADDRLIST,
	RPCBPROC_GETSTAT,
};

/*
 * r_owner
 *
 * The "owner" is allowed to unset a service in the rpcbind database.
70 71 72 73 74 75 76 77
 *
 * For AF_LOCAL SET/UNSET requests, rpcbind treats this string as a
 * UID which it maps to a local user name via a password lookup.
 * In all other cases it is ignored.
 *
 * For SET/UNSET requests, user space provides a value, even for
 * network requests, and GETADDR uses an empty string.  We follow
 * those precedents here.
78
 */
79
#define RPCB_OWNER_STRING	"0"
80 81
#define RPCB_MAXOWNERLEN	sizeof(RPCB_OWNER_STRING)

82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
/*
 * XDR data type sizes
 */
#define RPCB_program_sz		(1)
#define RPCB_version_sz		(1)
#define RPCB_protocol_sz	(1)
#define RPCB_port_sz		(1)
#define RPCB_boolean_sz		(1)

#define RPCB_netid_sz		(1 + XDR_QUADLEN(RPCBIND_MAXNETIDLEN))
#define RPCB_addr_sz		(1 + XDR_QUADLEN(RPCBIND_MAXUADDRLEN))
#define RPCB_ownerstring_sz	(1 + XDR_QUADLEN(RPCB_MAXOWNERLEN))

/*
 * XDR argument and result sizes
 */
#define RPCB_mappingargs_sz	(RPCB_program_sz + RPCB_version_sz + \
				RPCB_protocol_sz + RPCB_port_sz)
#define RPCB_getaddrargs_sz	(RPCB_program_sz + RPCB_version_sz + \
				RPCB_netid_sz + RPCB_addr_sz + \
				RPCB_ownerstring_sz)

#define RPCB_getportres_sz	RPCB_port_sz
#define RPCB_setres_sz		RPCB_boolean_sz

/*
 * Note that RFC 1833 does not put any size restrictions on the
 * address string returned by the remote rpcbind database.
 */
#define RPCB_getaddrres_sz	RPCB_addr_sz

113
static void			rpcb_getport_done(struct rpc_task *, void *);
114
static void			rpcb_map_release(void *data);
115
static struct rpc_program	rpcb_program;
116 117 118 119 120 121 122 123

struct rpcbind_args {
	struct rpc_xprt *	r_xprt;

	u32			r_prog;
	u32			r_vers;
	u32			r_prot;
	unsigned short		r_port;
124 125 126
	const char *		r_netid;
	const char *		r_addr;
	const char *		r_owner;
127 128

	int			r_status;
129 130 131 132
};

static struct rpc_procinfo rpcb_procedures2[];
static struct rpc_procinfo rpcb_procedures3[];
133
static struct rpc_procinfo rpcb_procedures4[];
134

135
struct rpcb_info {
136
	u32			rpc_vers;
137
	struct rpc_procinfo *	rpc_proc;
138 139 140 141
};

static struct rpcb_info rpcb_next_version[];
static struct rpcb_info rpcb_next_version6[];
142 143 144 145 146 147 148 149 150 151 152 153

static const struct rpc_call_ops rpcb_getport_ops = {
	.rpc_call_done		= rpcb_getport_done,
	.rpc_release		= rpcb_map_release,
};

static void rpcb_wake_rpcbind_waiters(struct rpc_xprt *xprt, int status)
{
	xprt_clear_binding(xprt);
	rpc_wake_up_status(&xprt->binding, status);
}

154 155 156 157 158 159
static void rpcb_map_release(void *data)
{
	struct rpcbind_args *map = data;

	rpcb_wake_rpcbind_waiters(map->r_xprt, map->r_status);
	xprt_put(map->r_xprt);
160
	kfree(map->r_addr);
161 162 163
	kfree(map);
}

164
static int rpcb_get_local(struct net *net)
165 166
{
	int cnt;
167
	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
168

169 170 171 172 173
	spin_lock(&sn->rpcb_clnt_lock);
	if (sn->rpcb_users)
		sn->rpcb_users++;
	cnt = sn->rpcb_users;
	spin_unlock(&sn->rpcb_clnt_lock);
174 175 176 177 178 179

	return cnt;
}

void rpcb_put_local(void)
{
180 181 182
	struct sunrpc_net *sn = net_generic(&init_net, sunrpc_net_id);
	struct rpc_clnt *clnt = sn->rpcb_local_clnt;
	struct rpc_clnt *clnt4 = sn->rpcb_local_clnt4;
183 184
	int shutdown;

185 186 187 188
	spin_lock(&sn->rpcb_clnt_lock);
	if (--sn->rpcb_users == 0) {
		sn->rpcb_local_clnt = NULL;
		sn->rpcb_local_clnt4 = NULL;
189
	}
190 191
	shutdown = !sn->rpcb_users;
	spin_unlock(&sn->rpcb_clnt_lock);
192 193 194 195 196 197 198 199 200 201 202 203

	if (shutdown) {
		/*
		 * cleanup_rpcb_clnt - remove xprtsock's sysctls, unregister
		 */
		if (clnt4)
			rpc_shutdown_client(clnt4);
		if (clnt)
			rpc_shutdown_client(clnt);
	}
}

204 205
static void rpcb_set_local(struct net *net, struct rpc_clnt *clnt,
			struct rpc_clnt *clnt4)
206
{
207
	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
208

209
	/* Protected by rpcb_create_local_mutex */
210 211
	sn->rpcb_local_clnt = clnt;
	sn->rpcb_local_clnt4 = clnt4;
212
	smp_wmb(); 
213
	sn->rpcb_users = 1;
214
	dprintk("RPC:       created new rpcb local clients (rpcb_local_clnt: "
215 216 217
			"%p, rpcb_local_clnt4: %p) for net %p%s\n",
			sn->rpcb_local_clnt, sn->rpcb_local_clnt4,
			net, (net == &init_net) ? " (init_net)" : "");
218 219
}

220 221 222 223
/*
 * Returns zero on success, otherwise a negative errno value
 * is returned.
 */
224
static int rpcb_create_local_unix(struct net *net)
225 226 227 228 229 230
{
	static const struct sockaddr_un rpcb_localaddr_rpcbind = {
		.sun_family		= AF_LOCAL,
		.sun_path		= RPCBIND_SOCK_PATHNAME,
	};
	struct rpc_create_args args = {
231
		.net		= net,
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
		.protocol	= XPRT_TRANSPORT_LOCAL,
		.address	= (struct sockaddr *)&rpcb_localaddr_rpcbind,
		.addrsize	= sizeof(rpcb_localaddr_rpcbind),
		.servername	= "localhost",
		.program	= &rpcb_program,
		.version	= RPCBVERS_2,
		.authflavor	= RPC_AUTH_NULL,
	};
	struct rpc_clnt *clnt, *clnt4;
	int result = 0;

	/*
	 * Because we requested an RPC PING at transport creation time,
	 * this works only if the user space portmapper is rpcbind, and
	 * it's listening on AF_LOCAL on the named socket.
	 */
	clnt = rpc_create(&args);
	if (IS_ERR(clnt)) {
		dprintk("RPC:       failed to create AF_LOCAL rpcbind "
				"client (errno %ld).\n", PTR_ERR(clnt));
		result = -PTR_ERR(clnt);
		goto out;
	}

	clnt4 = rpc_bind_new_program(clnt, &rpcb_program, RPCBVERS_4);
	if (IS_ERR(clnt4)) {
		dprintk("RPC:       failed to bind second program to "
				"rpcbind v4 client (errno %ld).\n",
				PTR_ERR(clnt4));
		clnt4 = NULL;
	}

264
	rpcb_set_local(net, clnt, clnt4);
265

266 267 268
out:
	return result;
}
269 270 271 272 273

/*
 * Returns zero on success, otherwise a negative errno value
 * is returned.
 */
274
static int rpcb_create_local_net(struct net *net)
275
{
276 277 278 279 280
	static const struct sockaddr_in rpcb_inaddr_loopback = {
		.sin_family		= AF_INET,
		.sin_addr.s_addr	= htonl(INADDR_LOOPBACK),
		.sin_port		= htons(RPCBIND_PORT),
	};
281
	struct rpc_create_args args = {
282
		.net		= net,
283
		.protocol	= XPRT_TRANSPORT_TCP,
284 285
		.address	= (struct sockaddr *)&rpcb_inaddr_loopback,
		.addrsize	= sizeof(rpcb_inaddr_loopback),
286 287
		.servername	= "localhost",
		.program	= &rpcb_program,
288
		.version	= RPCBVERS_2,
289 290 291
		.authflavor	= RPC_AUTH_UNIX,
		.flags		= RPC_CLNT_CREATE_NOPING,
	};
292 293 294 295 296 297 298 299 300 301
	struct rpc_clnt *clnt, *clnt4;
	int result = 0;

	clnt = rpc_create(&args);
	if (IS_ERR(clnt)) {
		dprintk("RPC:       failed to create local rpcbind "
				"client (errno %ld).\n", PTR_ERR(clnt));
		result = -PTR_ERR(clnt);
		goto out;
	}
302

303 304 305 306 307 308 309
	/*
	 * This results in an RPC ping.  On systems running portmapper,
	 * the v4 ping will fail.  Proceed anyway, but disallow rpcb
	 * v4 upcalls.
	 */
	clnt4 = rpc_bind_new_program(clnt, &rpcb_program, RPCBVERS_4);
	if (IS_ERR(clnt4)) {
310 311 312
		dprintk("RPC:       failed to bind second program to "
				"rpcbind v4 client (errno %ld).\n",
				PTR_ERR(clnt4));
313 314 315
		clnt4 = NULL;
	}

316
	rpcb_set_local(net, clnt, clnt4);
317

318 319 320 321 322 323 324 325
out:
	return result;
}

/*
 * Returns zero on success, otherwise a negative errno value
 * is returned.
 */
326
int rpcb_create_local(void)
327 328 329
{
	static DEFINE_MUTEX(rpcb_create_local_mutex);
	int result = 0;
330
	struct net *net = &init_net;
331

332
	if (rpcb_get_local(net))
333 334 335
		return result;

	mutex_lock(&rpcb_create_local_mutex);
336
	if (rpcb_get_local(net))
337 338
		goto out;

339 340
	if (rpcb_create_local_unix(net) != 0)
		result = rpcb_create_local_net(net);
341

342 343 344
out:
	mutex_unlock(&rpcb_create_local_mutex);
	return result;
345 346
}

347
static struct rpc_clnt *rpcb_create(char *hostname, struct sockaddr *srvaddr,
348
				    size_t salen, int proto, u32 version)
349 350
{
	struct rpc_create_args args = {
351
		.net		= &init_net,
352 353
		.protocol	= proto,
		.address	= srvaddr,
354
		.addrsize	= salen,
355 356 357 358
		.servername	= hostname,
		.program	= &rpcb_program,
		.version	= version,
		.authflavor	= RPC_AUTH_UNIX,
359 360
		.flags		= (RPC_CLNT_CREATE_NOPING |
					RPC_CLNT_CREATE_NONPRIVPORT),
361 362
	};

363 364 365 366 367 368 369 370
	switch (srvaddr->sa_family) {
	case AF_INET:
		((struct sockaddr_in *)srvaddr)->sin_port = htons(RPCBIND_PORT);
		break;
	case AF_INET6:
		((struct sockaddr_in6 *)srvaddr)->sin6_port = htons(RPCBIND_PORT);
		break;
	default:
371
		return ERR_PTR(-EAFNOSUPPORT);
372 373
	}

374 375 376
	return rpc_create(&args);
}

377
static int rpcb_register_call(struct rpc_clnt *clnt, struct rpc_message *msg)
378
{
379
	int result, error = 0;
380

381
	msg->rpc_resp = &result;
382

383
	error = rpc_call_sync(clnt, msg, RPC_TASK_SOFTCONN);
384
	if (error < 0) {
385
		dprintk("RPC:       failed to contact local rpcbind "
386
				"server (errno %d).\n", -error);
387 388 389
		return error;
	}

390
	if (!result)
391 392
		return -EACCES;
	return 0;
393 394
}

395 396 397 398
/**
 * rpcb_register - set or unset a port registration with the local rpcbind svc
 * @prog: RPC program number to bind
 * @vers: RPC version number to bind
399
 * @prot: transport protocol to register
400
 * @port: port value to register
401 402 403 404 405
 *
 * Returns zero if the registration request was dispatched successfully
 * and the rpcbind daemon returned success.  Otherwise, returns an errno
 * value that reflects the nature of the error (request could not be
 * dispatched, timed out, or rpcbind returned an error).
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
 *
 * RPC services invoke this function to advertise their contact
 * information via the system's rpcbind daemon.  RPC services
 * invoke this function once for each [program, version, transport]
 * tuple they wish to advertise.
 *
 * Callers may also unregister RPC services that are no longer
 * available by setting the passed-in port to zero.  This removes
 * all registered transports for [program, version] from the local
 * rpcbind database.
 *
 * This function uses rpcbind protocol version 2 to contact the
 * local rpcbind daemon.
 *
 * Registration works over both AF_INET and AF_INET6, and services
 * registered via this function are advertised as available for any
 * address.  If the local rpcbind daemon is listening on AF_INET6,
 * services registered via this function will be advertised on
 * IN6ADDR_ANY (ie available for all AF_INET and AF_INET6
 * addresses).
426
 */
427
int rpcb_register(u32 prog, u32 vers, int prot, unsigned short port)
428 429 430 431 432 433 434 435 436 437
{
	struct rpcbind_args map = {
		.r_prog		= prog,
		.r_vers		= vers,
		.r_prot		= prot,
		.r_port		= port,
	};
	struct rpc_message msg = {
		.rpc_argp	= &map,
	};
438
	struct sunrpc_net *sn = net_generic(&init_net, sunrpc_net_id);
439 440 441 442 443

	dprintk("RPC:       %sregistering (%u, %u, %d, %u) with local "
			"rpcbind\n", (port ? "" : "un"),
			prog, vers, prot, port);

444 445 446
	msg.rpc_proc = &rpcb_procedures2[RPCBPROC_UNSET];
	if (port)
		msg.rpc_proc = &rpcb_procedures2[RPCBPROC_SET];
447

448
	return rpcb_register_call(sn->rpcb_local_clnt, &msg);
449 450
}

451 452 453
/*
 * Fill in AF_INET family-specific arguments to register
 */
454 455
static int rpcb_register_inet4(const struct sockaddr *sap,
			       struct rpc_message *msg)
456
{
457
	const struct sockaddr_in *sin = (const struct sockaddr_in *)sap;
458
	struct rpcbind_args *map = msg->rpc_argp;
459
	unsigned short port = ntohs(sin->sin_port);
460
	int result;
461
	struct sunrpc_net *sn = net_generic(&init_net, sunrpc_net_id);
462

T
Trond Myklebust 已提交
463
	map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL);
464 465 466 467 468 469 470 471 472 473

	dprintk("RPC:       %sregistering [%u, %u, %s, '%s'] with "
		"local rpcbind\n", (port ? "" : "un"),
			map->r_prog, map->r_vers,
			map->r_addr, map->r_netid);

	msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];
	if (port)
		msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET];

474
	result = rpcb_register_call(sn->rpcb_local_clnt4, msg);
475 476
	kfree(map->r_addr);
	return result;
477 478 479 480 481
}

/*
 * Fill in AF_INET6 family-specific arguments to register
 */
482 483
static int rpcb_register_inet6(const struct sockaddr *sap,
			       struct rpc_message *msg)
484
{
485
	const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sap;
486
	struct rpcbind_args *map = msg->rpc_argp;
487
	unsigned short port = ntohs(sin6->sin6_port);
488
	int result;
489
	struct sunrpc_net *sn = net_generic(&init_net, sunrpc_net_id);
490

T
Trond Myklebust 已提交
491
	map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL);
492 493 494 495 496 497 498 499 500 501

	dprintk("RPC:       %sregistering [%u, %u, %s, '%s'] with "
		"local rpcbind\n", (port ? "" : "un"),
			map->r_prog, map->r_vers,
			map->r_addr, map->r_netid);

	msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];
	if (port)
		msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET];

502
	result = rpcb_register_call(sn->rpcb_local_clnt4, msg);
503 504
	kfree(map->r_addr);
	return result;
505 506
}

507 508 509
static int rpcb_unregister_all_protofamilies(struct rpc_message *msg)
{
	struct rpcbind_args *map = msg->rpc_argp;
510
	struct sunrpc_net *sn = net_generic(&init_net, sunrpc_net_id);
511 512 513 514 515 516 517 518

	dprintk("RPC:       unregistering [%u, %u, '%s'] with "
		"local rpcbind\n",
			map->r_prog, map->r_vers, map->r_netid);

	map->r_addr = "";
	msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET];

519
	return rpcb_register_call(sn->rpcb_local_clnt4, msg);
520 521
}

522 523 524 525 526 527
/**
 * rpcb_v4_register - set or unset a port registration with the local rpcbind
 * @program: RPC program number of service to (un)register
 * @version: RPC version number of service to (un)register
 * @address: address family, IP address, and port to (un)register
 * @netid: netid of transport protocol to (un)register
528 529 530 531 532
 *
 * Returns zero if the registration request was dispatched successfully
 * and the rpcbind daemon returned success.  Otherwise, returns an errno
 * value that reflects the nature of the error (request could not be
 * dispatched, timed out, or rpcbind returned an error).
533 534 535 536 537 538
 *
 * RPC services invoke this function to advertise their contact
 * information via the system's rpcbind daemon.  RPC services
 * invoke this function once for each [program, version, address,
 * netid] tuple they wish to advertise.
 *
539 540 541 542 543
 * Callers may also unregister RPC services that are registered at a
 * specific address by setting the port number in @address to zero.
 * They may unregister all registered protocol families at once for
 * a service by passing a NULL @address argument.  If @netid is ""
 * then all netids for [program, version, address] are unregistered.
544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
 *
 * This function uses rpcbind protocol version 4 to contact the
 * local rpcbind daemon.  The local rpcbind daemon must support
 * version 4 of the rpcbind protocol in order for these functions
 * to register a service successfully.
 *
 * Supported netids include "udp" and "tcp" for UDP and TCP over
 * IPv4, and "udp6" and "tcp6" for UDP and TCP over IPv6,
 * respectively.
 *
 * The contents of @address determine the address family and the
 * port to be registered.  The usual practice is to pass INADDR_ANY
 * as the raw address, but specifying a non-zero address is also
 * supported by this API if the caller wishes to advertise an RPC
 * service on a specific network interface.
 *
 * Note that passing in INADDR_ANY does not create the same service
 * registration as IN6ADDR_ANY.  The former advertises an RPC
 * service on any IPv4 address, but not on IPv6.  The latter
 * advertises the service on all IPv4 and IPv6 addresses.
 */
int rpcb_v4_register(const u32 program, const u32 version,
566
		     const struct sockaddr *address, const char *netid)
567 568 569 570 571 572 573 574 575 576
{
	struct rpcbind_args map = {
		.r_prog		= program,
		.r_vers		= version,
		.r_netid	= netid,
		.r_owner	= RPCB_OWNER_STRING,
	};
	struct rpc_message msg = {
		.rpc_argp	= &map,
	};
577
	struct sunrpc_net *sn = net_generic(&init_net, sunrpc_net_id);
578

579
	if (sn->rpcb_local_clnt4 == NULL)
580
		return -EPROTONOSUPPORT;
581

582 583 584
	if (address == NULL)
		return rpcb_unregister_all_protofamilies(&msg);

585 586
	switch (address->sa_family) {
	case AF_INET:
587
		return rpcb_register_inet4(address, &msg);
588
	case AF_INET6:
589
		return rpcb_register_inet6(address, &msg);
590 591 592 593 594
	}

	return -EAFNOSUPPORT;
}

595
static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbind_args *map, struct rpc_procinfo *proc)
596 597
{
	struct rpc_message msg = {
598
		.rpc_proc = proc,
599
		.rpc_argp = map,
600
		.rpc_resp = map,
601 602 603 604 605 606
	};
	struct rpc_task_setup task_setup_data = {
		.rpc_client = rpcb_clnt,
		.rpc_message = &msg,
		.callback_ops = &rpcb_getport_ops,
		.callback_data = map,
607
		.flags = RPC_TASK_ASYNC | RPC_TASK_SOFTCONN,
608 609 610 611 612
	};

	return rpc_run_task(&task_setup_data);
}

613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634
/*
 * In the case where rpc clients have been cloned, we want to make
 * sure that we use the program number/version etc of the actual
 * owner of the xprt. To do so, we walk back up the tree of parents
 * to find whoever created the transport and/or whoever has the
 * autobind flag set.
 */
static struct rpc_clnt *rpcb_find_transport_owner(struct rpc_clnt *clnt)
{
	struct rpc_clnt *parent = clnt->cl_parent;

	while (parent != clnt) {
		if (parent->cl_xprt != clnt->cl_xprt)
			break;
		if (clnt->cl_autobind)
			break;
		clnt = parent;
		parent = parent->cl_parent;
	}
	return clnt;
}

635
/**
636
 * rpcb_getport_async - obtain the port for a given RPC service on a given host
637 638 639 640 641
 * @task: task that is waiting for portmapper request
 *
 * This one can be called for an ongoing RPC request, and can be used in
 * an async (rpciod) context.
 */
642
void rpcb_getport_async(struct rpc_task *task)
643
{
644
	struct rpc_clnt *clnt;
645
	struct rpc_procinfo *proc;
646
	u32 bind_version;
647
	struct rpc_xprt *xprt;
648
	struct rpc_clnt	*rpcb_clnt;
649
	struct rpcbind_args *map;
650
	struct rpc_task	*child;
651 652 653
	struct sockaddr_storage addr;
	struct sockaddr *sap = (struct sockaddr *)&addr;
	size_t salen;
654 655
	int status;

656 657 658
	clnt = rpcb_find_transport_owner(task->tk_client);
	xprt = clnt->cl_xprt;

659
	dprintk("RPC: %5u %s(%s, %u, %u, %d)\n",
660
		task->tk_pid, __func__,
661
		clnt->cl_server, clnt->cl_prog, clnt->cl_vers, xprt->prot);
662

663 664 665 666
	/* Put self on the wait queue to ensure we get notified if
	 * some other task is already attempting to bind the port */
	rpc_sleep_on(&xprt->binding, task, NULL);

667
	if (xprt_test_and_set_binding(xprt)) {
668
		dprintk("RPC: %5u %s: waiting for another binder\n",
669
			task->tk_pid, __func__);
670
		return;
671 672 673 674 675
	}

	/* Someone else may have bound if we slept */
	if (xprt_bound(xprt)) {
		status = 0;
676
		dprintk("RPC: %5u %s: already bound\n",
677
			task->tk_pid, __func__);
678 679 680
		goto bailout_nofree;
	}

681
	/* Parent transport's destination address */
682
	salen = rpc_peeraddr(clnt, sap, sizeof(addr));
683 684

	/* Don't ever use rpcbind v2 for AF_INET6 requests */
685
	switch (sap->sa_family) {
686
	case AF_INET:
687 688
		proc = rpcb_next_version[xprt->bind_index].rpc_proc;
		bind_version = rpcb_next_version[xprt->bind_index].rpc_vers;
689 690
		break;
	case AF_INET6:
691 692
		proc = rpcb_next_version6[xprt->bind_index].rpc_proc;
		bind_version = rpcb_next_version6[xprt->bind_index].rpc_vers;
693 694 695 696
		break;
	default:
		status = -EAFNOSUPPORT;
		dprintk("RPC: %5u %s: bad address family\n",
697
				task->tk_pid, __func__);
698 699
		goto bailout_nofree;
	}
700
	if (proc == NULL) {
701
		xprt->bind_index = 0;
702
		status = -EPFNOSUPPORT;
703
		dprintk("RPC: %5u %s: no more getport versions available\n",
704
			task->tk_pid, __func__);
705 706 707
		goto bailout_nofree;
	}

708
	dprintk("RPC: %5u %s: trying rpcbind version %u\n",
709
		task->tk_pid, __func__, bind_version);
710

711
	rpcb_clnt = rpcb_create(clnt->cl_server, sap, salen, xprt->prot,
712
				bind_version);
713 714 715
	if (IS_ERR(rpcb_clnt)) {
		status = PTR_ERR(rpcb_clnt);
		dprintk("RPC: %5u %s: rpcb_create failed, error %ld\n",
716
			task->tk_pid, __func__, PTR_ERR(rpcb_clnt));
717 718 719
		goto bailout_nofree;
	}

720 721 722
	map = kzalloc(sizeof(struct rpcbind_args), GFP_ATOMIC);
	if (!map) {
		status = -ENOMEM;
723
		dprintk("RPC: %5u %s: no memory available\n",
724
			task->tk_pid, __func__);
725
		goto bailout_release_client;
726 727 728 729 730 731
	}
	map->r_prog = clnt->cl_prog;
	map->r_vers = clnt->cl_vers;
	map->r_prot = xprt->prot;
	map->r_port = 0;
	map->r_xprt = xprt_get(xprt);
732
	map->r_status = -EIO;
733

734 735 736 737
	switch (bind_version) {
	case RPCBVERS_4:
	case RPCBVERS_3:
		map->r_netid = rpc_peeraddr2str(clnt, RPC_DISPLAY_NETID);
T
Trond Myklebust 已提交
738
		map->r_addr = rpc_sockaddr2uaddr(sap, GFP_ATOMIC);
739 740 741 742 743 744 745 746 747
		map->r_owner = "";
		break;
	case RPCBVERS_2:
		map->r_addr = NULL;
		break;
	default:
		BUG();
	}

748
	child = rpcb_call_async(rpcb_clnt, map, proc);
749
	rpc_release_client(rpcb_clnt);
750
	if (IS_ERR(child)) {
751
		/* rpcb_map_release() has freed the arguments */
752
		dprintk("RPC: %5u %s: rpc_run_task failed\n",
753
			task->tk_pid, __func__);
754
		return;
755 756
	}

757 758
	xprt->stat.bind_count++;
	rpc_put_task(child);
759 760
	return;

761 762
bailout_release_client:
	rpc_release_client(rpcb_clnt);
763 764 765 766
bailout_nofree:
	rpcb_wake_rpcbind_waiters(xprt, status);
	task->tk_status = status;
}
767
EXPORT_SYMBOL_GPL(rpcb_getport_async);
768 769 770 771 772 773 774 775 776 777

/*
 * Rpcbind child task calls this callback via tk_exit.
 */
static void rpcb_getport_done(struct rpc_task *child, void *data)
{
	struct rpcbind_args *map = data;
	struct rpc_xprt *xprt = map->r_xprt;
	int status = child->tk_status;

C
Chuck Lever 已提交
778 779 780 781
	/* Garbage reply: retry with a lesser rpcbind version */
	if (status == -EIO)
		status = -EPROTONOSUPPORT;

782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802
	/* rpcbind server doesn't support this rpcbind protocol version */
	if (status == -EPROTONOSUPPORT)
		xprt->bind_index++;

	if (status < 0) {
		/* rpcbind server not available on remote host? */
		xprt->ops->set_port(xprt, 0);
	} else if (map->r_port == 0) {
		/* Requested RPC service wasn't registered on remote host */
		xprt->ops->set_port(xprt, 0);
		status = -EACCES;
	} else {
		/* Succeeded */
		xprt->ops->set_port(xprt, map->r_port);
		xprt_set_bound(xprt);
		status = 0;
	}

	dprintk("RPC: %5u rpcb_getport_done(status %d, port %u)\n",
			child->tk_pid, status, map->r_port);

803
	map->r_status = status;
804 805
}

806 807 808 809
/*
 * XDR functions for rpcbind
 */

810 811
static void rpcb_enc_mapping(struct rpc_rqst *req, struct xdr_stream *xdr,
			     const struct rpcbind_args *rpcb)
812 813
{
	struct rpc_task *task = req->rq_task;
814
	__be32 *p;
815 816 817 818 819

	dprintk("RPC: %5u encoding PMAP_%s call (%u, %u, %d, %u)\n",
			task->tk_pid, task->tk_msg.rpc_proc->p_name,
			rpcb->r_prog, rpcb->r_vers, rpcb->r_prot, rpcb->r_port);

820
	p = xdr_reserve_space(xdr, RPCB_mappingargs_sz << 2);
821 822 823 824
	*p++ = cpu_to_be32(rpcb->r_prog);
	*p++ = cpu_to_be32(rpcb->r_vers);
	*p++ = cpu_to_be32(rpcb->r_prot);
	*p   = cpu_to_be32(rpcb->r_port);
825 826
}

827
static int rpcb_dec_getport(struct rpc_rqst *req, struct xdr_stream *xdr,
828 829 830 831
			    struct rpcbind_args *rpcb)
{
	struct rpc_task *task = req->rq_task;
	unsigned long port;
832
	__be32 *p;
833 834 835

	rpcb->r_port = 0;

836
	p = xdr_inline_decode(xdr, 4);
837 838 839
	if (unlikely(p == NULL))
		return -EIO;

840
	port = be32_to_cpup(p);
841 842
	dprintk("RPC: %5u PMAP_%s result: %lu\n", task->tk_pid,
			task->tk_msg.rpc_proc->p_name, port);
843
	if (unlikely(port > USHRT_MAX))
844 845 846 847 848 849
		return -EIO;

	rpcb->r_port = port;
	return 0;
}

850
static int rpcb_dec_set(struct rpc_rqst *req, struct xdr_stream *xdr,
851 852 853
			unsigned int *boolp)
{
	struct rpc_task *task = req->rq_task;
854
	__be32 *p;
855

856
	p = xdr_inline_decode(xdr, 4);
857 858 859 860
	if (unlikely(p == NULL))
		return -EIO;

	*boolp = 0;
861
	if (*p != xdr_zero)
862 863 864 865 866 867 868 869
		*boolp = 1;

	dprintk("RPC: %5u RPCB_%s call %s\n",
			task->tk_pid, task->tk_msg.rpc_proc->p_name,
			(*boolp ? "succeeded" : "failed"));
	return 0;
}

870 871
static void encode_rpcb_string(struct xdr_stream *xdr, const char *string,
			       const u32 maxstrlen)
872 873
{
	__be32 *p;
874
	u32 len;
875 876

	len = strlen(string);
877 878
	BUG_ON(len > maxstrlen);
	p = xdr_reserve_space(xdr, 4 + len);
879 880 881
	xdr_encode_opaque(p, string, len);
}

882 883
static void rpcb_enc_getaddr(struct rpc_rqst *req, struct xdr_stream *xdr,
			     const struct rpcbind_args *rpcb)
884 885
{
	struct rpc_task *task = req->rq_task;
886
	__be32 *p;
887 888 889 890 891 892

	dprintk("RPC: %5u encoding RPCB_%s call (%u, %u, '%s', '%s')\n",
			task->tk_pid, task->tk_msg.rpc_proc->p_name,
			rpcb->r_prog, rpcb->r_vers,
			rpcb->r_netid, rpcb->r_addr);

893
	p = xdr_reserve_space(xdr, (RPCB_program_sz + RPCB_version_sz) << 2);
894 895
	*p++ = cpu_to_be32(rpcb->r_prog);
	*p = cpu_to_be32(rpcb->r_vers);
896

897 898 899
	encode_rpcb_string(xdr, rpcb->r_netid, RPCBIND_MAXNETIDLEN);
	encode_rpcb_string(xdr, rpcb->r_addr, RPCBIND_MAXUADDRLEN);
	encode_rpcb_string(xdr, rpcb->r_owner, RPCB_MAXOWNERLEN);
900 901
}

902
static int rpcb_dec_getaddr(struct rpc_rqst *req, struct xdr_stream *xdr,
903 904 905 906 907
			    struct rpcbind_args *rpcb)
{
	struct sockaddr_storage address;
	struct sockaddr *sap = (struct sockaddr *)&address;
	struct rpc_task *task = req->rq_task;
908
	__be32 *p;
909 910 911 912
	u32 len;

	rpcb->r_port = 0;

913
	p = xdr_inline_decode(xdr, 4);
914 915
	if (unlikely(p == NULL))
		goto out_fail;
916
	len = be32_to_cpup(p);
917 918 919 920 921 922 923 924 925 926 927 928 929 930

	/*
	 * If the returned universal address is a null string,
	 * the requested RPC service was not registered.
	 */
	if (len == 0) {
		dprintk("RPC: %5u RPCB reply: program not registered\n",
				task->tk_pid);
		return 0;
	}

	if (unlikely(len > RPCBIND_MAXUADDRLEN))
		goto out_fail;

931
	p = xdr_inline_decode(xdr, len);
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948
	if (unlikely(p == NULL))
		goto out_fail;
	dprintk("RPC: %5u RPCB_%s reply: %s\n", task->tk_pid,
			task->tk_msg.rpc_proc->p_name, (char *)p);

	if (rpc_uaddr2sockaddr((char *)p, len, sap, sizeof(address)) == 0)
		goto out_fail;
	rpcb->r_port = rpc_get_port(sap);

	return 0;

out_fail:
	dprintk("RPC: %5u malformed RPCB_%s reply\n",
			task->tk_pid, task->tk_msg.rpc_proc->p_name);
	return -EIO;
}

949 950 951 952
/*
 * Not all rpcbind procedures described in RFC 1833 are implemented
 * since the Linux kernel RPC code requires only these.
 */
953

954
static struct rpc_procinfo rpcb_procedures2[] = {
955 956
	[RPCBPROC_SET] = {
		.p_proc		= RPCBPROC_SET,
957
		.p_encode	= (kxdreproc_t)rpcb_enc_mapping,
958
		.p_decode	= (kxdrdproc_t)rpcb_dec_set,
959 960 961 962 963 964 965 966
		.p_arglen	= RPCB_mappingargs_sz,
		.p_replen	= RPCB_setres_sz,
		.p_statidx	= RPCBPROC_SET,
		.p_timer	= 0,
		.p_name		= "SET",
	},
	[RPCBPROC_UNSET] = {
		.p_proc		= RPCBPROC_UNSET,
967
		.p_encode	= (kxdreproc_t)rpcb_enc_mapping,
968
		.p_decode	= (kxdrdproc_t)rpcb_dec_set,
969 970 971 972 973 974 975 976
		.p_arglen	= RPCB_mappingargs_sz,
		.p_replen	= RPCB_setres_sz,
		.p_statidx	= RPCBPROC_UNSET,
		.p_timer	= 0,
		.p_name		= "UNSET",
	},
	[RPCBPROC_GETPORT] = {
		.p_proc		= RPCBPROC_GETPORT,
977
		.p_encode	= (kxdreproc_t)rpcb_enc_mapping,
978
		.p_decode	= (kxdrdproc_t)rpcb_dec_getport,
979 980 981 982 983 984
		.p_arglen	= RPCB_mappingargs_sz,
		.p_replen	= RPCB_getportres_sz,
		.p_statidx	= RPCBPROC_GETPORT,
		.p_timer	= 0,
		.p_name		= "GETPORT",
	},
985 986 987
};

static struct rpc_procinfo rpcb_procedures3[] = {
988 989
	[RPCBPROC_SET] = {
		.p_proc		= RPCBPROC_SET,
990
		.p_encode	= (kxdreproc_t)rpcb_enc_getaddr,
991
		.p_decode	= (kxdrdproc_t)rpcb_dec_set,
992 993 994 995 996 997 998 999
		.p_arglen	= RPCB_getaddrargs_sz,
		.p_replen	= RPCB_setres_sz,
		.p_statidx	= RPCBPROC_SET,
		.p_timer	= 0,
		.p_name		= "SET",
	},
	[RPCBPROC_UNSET] = {
		.p_proc		= RPCBPROC_UNSET,
1000
		.p_encode	= (kxdreproc_t)rpcb_enc_getaddr,
1001
		.p_decode	= (kxdrdproc_t)rpcb_dec_set,
1002 1003 1004 1005 1006 1007 1008 1009
		.p_arglen	= RPCB_getaddrargs_sz,
		.p_replen	= RPCB_setres_sz,
		.p_statidx	= RPCBPROC_UNSET,
		.p_timer	= 0,
		.p_name		= "UNSET",
	},
	[RPCBPROC_GETADDR] = {
		.p_proc		= RPCBPROC_GETADDR,
1010
		.p_encode	= (kxdreproc_t)rpcb_enc_getaddr,
1011
		.p_decode	= (kxdrdproc_t)rpcb_dec_getaddr,
1012 1013 1014 1015 1016 1017
		.p_arglen	= RPCB_getaddrargs_sz,
		.p_replen	= RPCB_getaddrres_sz,
		.p_statidx	= RPCBPROC_GETADDR,
		.p_timer	= 0,
		.p_name		= "GETADDR",
	},
1018 1019 1020
};

static struct rpc_procinfo rpcb_procedures4[] = {
1021 1022
	[RPCBPROC_SET] = {
		.p_proc		= RPCBPROC_SET,
1023
		.p_encode	= (kxdreproc_t)rpcb_enc_getaddr,
1024
		.p_decode	= (kxdrdproc_t)rpcb_dec_set,
1025 1026 1027 1028 1029 1030 1031 1032
		.p_arglen	= RPCB_getaddrargs_sz,
		.p_replen	= RPCB_setres_sz,
		.p_statidx	= RPCBPROC_SET,
		.p_timer	= 0,
		.p_name		= "SET",
	},
	[RPCBPROC_UNSET] = {
		.p_proc		= RPCBPROC_UNSET,
1033
		.p_encode	= (kxdreproc_t)rpcb_enc_getaddr,
1034
		.p_decode	= (kxdrdproc_t)rpcb_dec_set,
1035 1036 1037 1038 1039 1040 1041 1042
		.p_arglen	= RPCB_getaddrargs_sz,
		.p_replen	= RPCB_setres_sz,
		.p_statidx	= RPCBPROC_UNSET,
		.p_timer	= 0,
		.p_name		= "UNSET",
	},
	[RPCBPROC_GETADDR] = {
		.p_proc		= RPCBPROC_GETADDR,
1043
		.p_encode	= (kxdreproc_t)rpcb_enc_getaddr,
1044
		.p_decode	= (kxdrdproc_t)rpcb_dec_getaddr,
1045 1046 1047 1048 1049 1050
		.p_arglen	= RPCB_getaddrargs_sz,
		.p_replen	= RPCB_getaddrres_sz,
		.p_statidx	= RPCBPROC_GETADDR,
		.p_timer	= 0,
		.p_name		= "GETADDR",
	},
1051 1052 1053
};

static struct rpcb_info rpcb_next_version[] = {
1054 1055 1056 1057 1058 1059 1060
	{
		.rpc_vers	= RPCBVERS_2,
		.rpc_proc	= &rpcb_procedures2[RPCBPROC_GETPORT],
	},
	{
		.rpc_proc	= NULL,
	},
1061 1062
};

1063
static struct rpcb_info rpcb_next_version6[] = {
1064 1065
	{
		.rpc_vers	= RPCBVERS_4,
1066
		.rpc_proc	= &rpcb_procedures4[RPCBPROC_GETADDR],
1067 1068 1069 1070 1071 1072 1073 1074
	},
	{
		.rpc_vers	= RPCBVERS_3,
		.rpc_proc	= &rpcb_procedures3[RPCBPROC_GETADDR],
	},
	{
		.rpc_proc	= NULL,
	},
1075 1076
};

1077
static struct rpc_version rpcb_version2 = {
1078
	.number		= RPCBVERS_2,
1079
	.nrprocs	= ARRAY_SIZE(rpcb_procedures2),
1080 1081 1082 1083
	.procs		= rpcb_procedures2
};

static struct rpc_version rpcb_version3 = {
1084
	.number		= RPCBVERS_3,
1085
	.nrprocs	= ARRAY_SIZE(rpcb_procedures3),
1086 1087 1088 1089
	.procs		= rpcb_procedures3
};

static struct rpc_version rpcb_version4 = {
1090
	.number		= RPCBVERS_4,
1091
	.nrprocs	= ARRAY_SIZE(rpcb_procedures4),
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
	.procs		= rpcb_procedures4
};

static struct rpc_version *rpcb_version[] = {
	NULL,
	NULL,
	&rpcb_version2,
	&rpcb_version3,
	&rpcb_version4
};

static struct rpc_stat rpcb_stats;

1105
static struct rpc_program rpcb_program = {
1106 1107 1108 1109 1110 1111
	.name		= "rpcbind",
	.number		= RPCBIND_PROGRAM,
	.nrvers		= ARRAY_SIZE(rpcb_version),
	.version	= rpcb_version,
	.stats		= &rpcb_stats,
};