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

364 365 366 367 368 369 370 371
	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:
372
		return ERR_PTR(-EAFNOSUPPORT);
373 374
	}

375 376 377
	return rpc_create(&args);
}

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

382
	msg->rpc_resp = &result;
383

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

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

396 397 398 399
/**
 * 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
400
 * @prot: transport protocol to register
401
 * @port: port value to register
402 403 404 405 406
 *
 * 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).
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
 *
 * 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).
427
 */
428
int rpcb_register(struct net *net, u32 prog, u32 vers, int prot, unsigned short port)
429 430 431 432 433 434 435 436 437 438
{
	struct rpcbind_args map = {
		.r_prog		= prog,
		.r_vers		= vers,
		.r_prot		= prot,
		.r_port		= port,
	};
	struct rpc_message msg = {
		.rpc_argp	= &map,
	};
439
	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
440 441 442 443 444

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

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

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

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

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

	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];

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

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

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

	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];

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

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

	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];

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

523 524 525 526 527 528
/**
 * 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
529 530 531 532 533
 *
 * 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).
534 535 536 537 538 539
 *
 * 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.
 *
540 541 542 543 544
 * 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.
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.
 */
566
int rpcb_v4_register(struct net *net, const u32 program, const u32 version,
567
		     const struct sockaddr *address, const char *netid)
568 569 570 571 572 573 574 575 576 577
{
	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,
	};
578
	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
579

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

583
	if (address == NULL)
584
		return rpcb_unregister_all_protofamilies(sn, &msg);
585

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

	return -EAFNOSUPPORT;
}

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

	return rpc_run_task(&task_setup_data);
}

614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
/*
 * 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;
}

636
/**
637
 * rpcb_getport_async - obtain the port for a given RPC service on a given host
638 639 640 641 642
 * @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.
 */
643
void rpcb_getport_async(struct rpc_task *task)
644
{
645
	struct rpc_clnt *clnt;
646
	struct rpc_procinfo *proc;
647
	u32 bind_version;
648
	struct rpc_xprt *xprt;
649
	struct rpc_clnt	*rpcb_clnt;
650
	struct rpcbind_args *map;
651
	struct rpc_task	*child;
652 653 654
	struct sockaddr_storage addr;
	struct sockaddr *sap = (struct sockaddr *)&addr;
	size_t salen;
655 656
	int status;

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

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

664 665 666 667
	/* 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);

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

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

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

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

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

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

721 722 723
	map = kzalloc(sizeof(struct rpcbind_args), GFP_ATOMIC);
	if (!map) {
		status = -ENOMEM;
724
		dprintk("RPC: %5u %s: no memory available\n",
725
			task->tk_pid, __func__);
726
		goto bailout_release_client;
727 728 729 730 731 732
	}
	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);
733
	map->r_status = -EIO;
734

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

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

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

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

/*
 * 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 已提交
779 780 781 782
	/* Garbage reply: retry with a lesser rpcbind version */
	if (status == -EIO)
		status = -EPROTONOSUPPORT;

783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803
	/* 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);

804
	map->r_status = status;
805 806
}

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

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

	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);

821
	p = xdr_reserve_space(xdr, RPCB_mappingargs_sz << 2);
822 823 824 825
	*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);
826 827
}

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

	rpcb->r_port = 0;

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

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

	rpcb->r_port = port;
	return 0;
}

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

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

	*boolp = 0;
862
	if (*p != xdr_zero)
863 864 865 866 867 868 869 870
		*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;
}

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

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

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

	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);

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

898 899 900
	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);
901 902
}

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

	rpcb->r_port = 0;

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

	/*
	 * 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;

932
	p = xdr_inline_decode(xdr, len);
933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949
	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;
}

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

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

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

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

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

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

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

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

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

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

static struct rpc_stat rpcb_stats;

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