Lines Matching +full:rpc +full:- +full:if
1 // SPDX-License-Identifier: GPL-2.0-only
3 * In-kernel rpcbind client supporting versions 2, 3, and 4 of the rpcbind
6 * Based on RFC 1833: "Binding Protocols for ONC RPC Version 2" and
150 rpc_wake_up_status(&xprt->binding, status); in rpcb_wake_rpcbind_waiters()
157 rpcb_wake_rpcbind_waiters(map->r_xprt, map->r_status); in rpcb_map_release()
158 xprt_put(map->r_xprt); in rpcb_map_release()
159 kfree(map->r_addr); in rpcb_map_release()
168 spin_lock(&sn->rpcb_clnt_lock); in rpcb_get_local()
169 if (sn->rpcb_users) in rpcb_get_local()
170 sn->rpcb_users++; in rpcb_get_local()
171 cnt = sn->rpcb_users; in rpcb_get_local()
172 spin_unlock(&sn->rpcb_clnt_lock); in rpcb_get_local()
180 struct rpc_clnt *clnt = sn->rpcb_local_clnt; in rpcb_put_local()
181 struct rpc_clnt *clnt4 = sn->rpcb_local_clnt4; in rpcb_put_local()
184 spin_lock(&sn->rpcb_clnt_lock); in rpcb_put_local()
185 if (sn->rpcb_users) { in rpcb_put_local()
186 if (--sn->rpcb_users == 0) { in rpcb_put_local()
187 sn->rpcb_local_clnt = NULL; in rpcb_put_local()
188 sn->rpcb_local_clnt4 = NULL; in rpcb_put_local()
190 shutdown = !sn->rpcb_users; in rpcb_put_local()
192 spin_unlock(&sn->rpcb_clnt_lock); in rpcb_put_local()
194 if (shutdown) { in rpcb_put_local()
196 * cleanup_rpcb_clnt - remove xprtsock's sysctls, unregister in rpcb_put_local()
198 if (clnt4) in rpcb_put_local()
200 if (clnt) in rpcb_put_local()
212 sn->rpcb_local_clnt = clnt; in rpcb_set_local()
213 sn->rpcb_local_clnt4 = clnt4; in rpcb_set_local()
214 sn->rpcb_is_af_local = is_af_local ? 1 : 0; in rpcb_set_local()
216 sn->rpcb_users = 1; in rpcb_set_local()
252 * Because we requested an RPC PING at transport creation time, in rpcb_create_local_unix()
253 * this works only if the user space portmapper is rpcbind, and in rpcb_create_local_unix()
257 if (IS_ERR(clnt)) { in rpcb_create_local_unix()
263 if (IS_ERR(clnt4)) in rpcb_create_local_unix()
299 if (IS_ERR(clnt)) { in rpcb_create_local_net()
305 * This results in an RPC ping. On systems running portmapper, in rpcb_create_local_net()
310 if (IS_ERR(clnt4)) in rpcb_create_local_net()
328 if (rpcb_get_local(net)) in rpcb_create_local()
332 if (rpcb_get_local(net)) in rpcb_create_local()
335 if (rpcb_create_local_unix(net) != 0) in rpcb_create_local()
364 switch (srvaddr->sa_family) { in rpcb_create()
366 ((struct sockaddr_in *)srvaddr)->sin_port = htons(RPCBIND_PORT); in rpcb_create()
369 ((struct sockaddr_in6 *)srvaddr)->sin6_port = htons(RPCBIND_PORT); in rpcb_create()
372 return ERR_PTR(-EAFNOSUPPORT); in rpcb_create()
383 if (is_set || !sn->rpcb_is_af_local) in rpcb_register_call()
385 msg->rpc_resp = &result; in rpcb_register_call()
388 if (error < 0) in rpcb_register_call()
391 if (!result) in rpcb_register_call()
392 return -EACCES; in rpcb_register_call()
397 * rpcb_register - set or unset a port registration with the local rpcbind svc
399 * @prog: RPC program number to bind
400 * @vers: RPC version number to bind
404 * Returns zero if the registration request was dispatched successfully
409 * RPC services invoke this function to advertise their contact
410 * information via the system's rpcbind daemon. RPC services
414 * Callers may also unregister RPC services that are no longer
415 * available by setting the passed-in port to zero. This removes
424 * address. If the local rpcbind daemon is listening on AF_INET6,
446 if (port != 0) { in rpcb_register()
451 return rpcb_register_call(sn, sn->rpcb_local_clnt, &msg, is_set); in rpcb_register()
455 * Fill in AF_INET family-specific arguments to register
462 struct rpcbind_args *map = msg->rpc_argp; in rpcb_register_inet4()
463 unsigned short port = ntohs(sin->sin_port); in rpcb_register_inet4()
467 map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL); in rpcb_register_inet4()
469 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; in rpcb_register_inet4()
470 if (port != 0) { in rpcb_register_inet4()
471 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET]; in rpcb_register_inet4()
475 result = rpcb_register_call(sn, sn->rpcb_local_clnt4, msg, is_set); in rpcb_register_inet4()
476 kfree(map->r_addr); in rpcb_register_inet4()
481 * Fill in AF_INET6 family-specific arguments to register
488 struct rpcbind_args *map = msg->rpc_argp; in rpcb_register_inet6()
489 unsigned short port = ntohs(sin6->sin6_port); in rpcb_register_inet6()
493 map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL); in rpcb_register_inet6()
495 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; in rpcb_register_inet6()
496 if (port != 0) { in rpcb_register_inet6()
497 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET]; in rpcb_register_inet6()
501 result = rpcb_register_call(sn, sn->rpcb_local_clnt4, msg, is_set); in rpcb_register_inet6()
502 kfree(map->r_addr); in rpcb_register_inet6()
509 struct rpcbind_args *map = msg->rpc_argp; in rpcb_unregister_all_protofamilies()
511 trace_rpcb_unregister(map->r_prog, map->r_vers, map->r_netid); in rpcb_unregister_all_protofamilies()
513 map->r_addr = ""; in rpcb_unregister_all_protofamilies()
514 msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; in rpcb_unregister_all_protofamilies()
516 return rpcb_register_call(sn, sn->rpcb_local_clnt4, msg, false); in rpcb_unregister_all_protofamilies()
520 * rpcb_v4_register - set or unset a port registration with the local rpcbind
522 * @program: RPC program number of service to (un)register
523 * @version: RPC version number of service to (un)register
527 * Returns zero if the registration request was dispatched successfully
532 * RPC services invoke this function to advertise their contact
533 * information via the system's rpcbind daemon. RPC services
537 * Callers may also unregister RPC services that are registered at a
540 * a service by passing a NULL @address argument. If @netid is ""
554 * as the raw address, but specifying a non-zero address is also
555 * supported by this API if the caller wishes to advertise an RPC
559 * registration as IN6ADDR_ANY. The former advertises an RPC
577 if (sn->rpcb_local_clnt4 == NULL) in rpcb_v4_register()
578 return -EPROTONOSUPPORT; in rpcb_v4_register()
580 if (address == NULL) in rpcb_v4_register()
585 switch (address->sa_family) { in rpcb_v4_register()
592 return -EAFNOSUPPORT; in rpcb_v4_register()
615 * In the case where rpc clients have been cloned, we want to make
623 struct rpc_clnt *parent = clnt->cl_parent; in rpcb_find_transport_owner()
624 struct rpc_xprt_switch *xps = rcu_access_pointer(clnt->cl_xpi.xpi_xpswitch); in rpcb_find_transport_owner()
627 if (rcu_access_pointer(parent->cl_xpi.xpi_xpswitch) != xps) in rpcb_find_transport_owner()
629 if (clnt->cl_autobind) in rpcb_find_transport_owner()
632 parent = parent->cl_parent; in rpcb_find_transport_owner()
638 * rpcb_getport_async - obtain the port for a given RPC service on a given host
641 * This one can be called for an ongoing RPC request, and can be used in
659 clnt = rpcb_find_transport_owner(task->tk_client); in rpcb_getport_async()
661 xprt = xprt_get(task->tk_xprt); in rpcb_getport_async()
663 /* Put self on the wait queue to ensure we get notified if in rpcb_getport_async()
665 rpc_sleep_on_timeout(&xprt->binding, task, in rpcb_getport_async()
666 NULL, jiffies + xprt->bind_timeout); in rpcb_getport_async()
668 if (xprt_test_and_set_binding(xprt)) { in rpcb_getport_async()
673 /* Someone else may have bound if we slept */ in rpcb_getport_async()
674 if (xprt_bound(xprt)) { in rpcb_getport_async()
683 switch (sap->sa_family) { in rpcb_getport_async()
685 proc = rpcb_next_version[xprt->bind_index].rpc_proc; in rpcb_getport_async()
686 bind_version = rpcb_next_version[xprt->bind_index].rpc_vers; in rpcb_getport_async()
689 proc = rpcb_next_version6[xprt->bind_index].rpc_proc; in rpcb_getport_async()
690 bind_version = rpcb_next_version6[xprt->bind_index].rpc_vers; in rpcb_getport_async()
693 status = -EAFNOSUPPORT; in rpcb_getport_async()
696 if (proc == NULL) { in rpcb_getport_async()
697 xprt->bind_index = 0; in rpcb_getport_async()
698 status = -EPFNOSUPPORT; in rpcb_getport_async()
704 rpcb_clnt = rpcb_create(xprt->xprt_net, in rpcb_getport_async()
705 clnt->cl_nodename, in rpcb_getport_async()
706 xprt->servername, sap, salen, in rpcb_getport_async()
707 xprt->prot, bind_version, in rpcb_getport_async()
708 clnt->cl_cred); in rpcb_getport_async()
709 if (IS_ERR(rpcb_clnt)) { in rpcb_getport_async()
715 if (!map) { in rpcb_getport_async()
716 status = -ENOMEM; in rpcb_getport_async()
719 map->r_prog = clnt->cl_prog; in rpcb_getport_async()
720 map->r_vers = clnt->cl_vers; in rpcb_getport_async()
721 map->r_prot = xprt->prot; in rpcb_getport_async()
722 map->r_port = 0; in rpcb_getport_async()
723 map->r_xprt = xprt; in rpcb_getport_async()
724 map->r_status = -EIO; in rpcb_getport_async()
729 map->r_netid = xprt->address_strings[RPC_DISPLAY_NETID]; in rpcb_getport_async()
730 map->r_addr = rpc_sockaddr2uaddr(sap, GFP_NOFS); in rpcb_getport_async()
731 if (!map->r_addr) { in rpcb_getport_async()
732 status = -ENOMEM; in rpcb_getport_async()
735 map->r_owner = ""; in rpcb_getport_async()
738 map->r_addr = NULL; in rpcb_getport_async()
747 xprt->stat.bind_count++; in rpcb_getport_async()
757 task->tk_status = status; in rpcb_getport_async()
768 struct rpc_xprt *xprt = map->r_xprt; in rpcb_getport_done()
770 map->r_status = child->tk_status; in rpcb_getport_done()
773 if (map->r_status == -EIO) in rpcb_getport_done()
774 map->r_status = -EPROTONOSUPPORT; in rpcb_getport_done()
777 if (map->r_status == -EPROTONOSUPPORT) in rpcb_getport_done()
778 xprt->bind_index++; in rpcb_getport_done()
780 if (map->r_status < 0) { in rpcb_getport_done()
782 map->r_port = 0; in rpcb_getport_done()
784 } else if (map->r_port == 0) { in rpcb_getport_done()
785 /* Requested RPC service wasn't registered on remote host */ in rpcb_getport_done()
786 map->r_status = -EACCES; in rpcb_getport_done()
789 map->r_status = 0; in rpcb_getport_done()
792 trace_rpcb_setport(child, map->r_status, map->r_port); in rpcb_getport_done()
793 xprt->ops->set_port(xprt, map->r_port); in rpcb_getport_done()
794 if (map->r_port) in rpcb_getport_done()
809 *p++ = cpu_to_be32(rpcb->r_prog); in rpcb_enc_mapping()
810 *p++ = cpu_to_be32(rpcb->r_vers); in rpcb_enc_mapping()
811 *p++ = cpu_to_be32(rpcb->r_prot); in rpcb_enc_mapping()
812 *p = cpu_to_be32(rpcb->r_port); in rpcb_enc_mapping()
822 rpcb->r_port = 0; in rpcb_dec_getport()
825 if (unlikely(p == NULL)) in rpcb_dec_getport()
826 return -EIO; in rpcb_dec_getport()
829 if (unlikely(port > USHRT_MAX)) in rpcb_dec_getport()
830 return -EIO; in rpcb_dec_getport()
832 rpcb->r_port = port; in rpcb_dec_getport()
843 if (unlikely(p == NULL)) in rpcb_dec_set()
844 return -EIO; in rpcb_dec_set()
847 if (*p != xdr_zero) in rpcb_dec_set()
860 if (len > maxstrlen) in encode_rpcb_string()
874 *p++ = cpu_to_be32(rpcb->r_prog); in rpcb_enc_getaddr()
875 *p = cpu_to_be32(rpcb->r_vers); in rpcb_enc_getaddr()
877 encode_rpcb_string(xdr, rpcb->r_netid, RPCBIND_MAXNETIDLEN); in rpcb_enc_getaddr()
878 encode_rpcb_string(xdr, rpcb->r_addr, RPCBIND_MAXUADDRLEN); in rpcb_enc_getaddr()
879 encode_rpcb_string(xdr, rpcb->r_owner, RPCB_MAXOWNERLEN); in rpcb_enc_getaddr()
891 rpcb->r_port = 0; in rpcb_dec_getaddr()
894 if (unlikely(p == NULL)) in rpcb_dec_getaddr()
899 * If the returned universal address is a null string, in rpcb_dec_getaddr()
900 * the requested RPC service was not registered. in rpcb_dec_getaddr()
902 if (len == 0) in rpcb_dec_getaddr()
905 if (unlikely(len > RPCBIND_MAXUADDRLEN)) in rpcb_dec_getaddr()
909 if (unlikely(p == NULL)) in rpcb_dec_getaddr()
912 if (rpc_uaddr2sockaddr(req->rq_xprt->xprt_net, (char *)p, len, in rpcb_dec_getaddr()
915 rpcb->r_port = rpc_get_port(sap); in rpcb_dec_getaddr()
920 return -EIO; in rpcb_dec_getaddr()
925 * since the Linux kernel RPC code requires only these.