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