xref: /freebsd/lib/libc/rpc/svc_raw.c (revision dc36d6f9bb1753f3808552f3afd30eda9a7b206a)
18360efbdSAlfred Perlstein /*	$NetBSD: svc_raw.c,v 1.14 2000/07/06 03:10:35 christos Exp $	*/
28360efbdSAlfred Perlstein 
32e322d37SHiroki Sato /*-
4*8a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
5*8a16b7a1SPedro F. Giffuni  *
62e322d37SHiroki Sato  * Copyright (c) 2009, Sun Microsystems, Inc.
72e322d37SHiroki Sato  * All rights reserved.
899064799SGarrett Wollman  *
92e322d37SHiroki Sato  * Redistribution and use in source and binary forms, with or without
102e322d37SHiroki Sato  * modification, are permitted provided that the following conditions are met:
112e322d37SHiroki Sato  * - Redistributions of source code must retain the above copyright notice,
122e322d37SHiroki Sato  *   this list of conditions and the following disclaimer.
132e322d37SHiroki Sato  * - Redistributions in binary form must reproduce the above copyright notice,
142e322d37SHiroki Sato  *   this list of conditions and the following disclaimer in the documentation
152e322d37SHiroki Sato  *   and/or other materials provided with the distribution.
162e322d37SHiroki Sato  * - Neither the name of Sun Microsystems, Inc. nor the names of its
172e322d37SHiroki Sato  *   contributors may be used to endorse or promote products derived
182e322d37SHiroki Sato  *   from this software without specific prior written permission.
1999064799SGarrett Wollman  *
202e322d37SHiroki Sato  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
212e322d37SHiroki Sato  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
222e322d37SHiroki Sato  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
232e322d37SHiroki Sato  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
242e322d37SHiroki Sato  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
252e322d37SHiroki Sato  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
262e322d37SHiroki Sato  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
272e322d37SHiroki Sato  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
282e322d37SHiroki Sato  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
292e322d37SHiroki Sato  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
302e322d37SHiroki Sato  * POSSIBILITY OF SUCH DAMAGE.
3199064799SGarrett Wollman  */
328360efbdSAlfred Perlstein /*
338360efbdSAlfred Perlstein  * Copyright (c) 1986-1991 by Sun Microsystems Inc.
348360efbdSAlfred Perlstein  */
3599064799SGarrett Wollman 
3699064799SGarrett Wollman /*
3799064799SGarrett Wollman  * svc_raw.c,   This a toy for simple testing and timing.
3899064799SGarrett Wollman  * Interface to create an rpc client and server in the same UNIX process.
3999064799SGarrett Wollman  * This lets us similate rpc and get rpc (round trip) overhead, without
405814ff29SAlfred Perlstein  * any interference from the kernel.
4199064799SGarrett Wollman  *
4299064799SGarrett Wollman  */
4399064799SGarrett Wollman 
448360efbdSAlfred Perlstein #include "namespace.h"
459f5afc13SIan Dowse #include "reentrant.h"
4699064799SGarrett Wollman #include <rpc/rpc.h>
478360efbdSAlfred Perlstein #include <sys/types.h>
488360efbdSAlfred Perlstein #include <rpc/raw.h>
494c3af266SPoul-Henning Kamp #include <stdlib.h>
508360efbdSAlfred Perlstein #include "un-namespace.h"
51235baf26SDaniel Eischen #include "mt_misc.h"
528360efbdSAlfred Perlstein 
538360efbdSAlfred Perlstein #ifndef UDPMSGSIZE
548360efbdSAlfred Perlstein #define	UDPMSGSIZE 8800
558360efbdSAlfred Perlstein #endif
5699064799SGarrett Wollman 
5799064799SGarrett Wollman /*
5899064799SGarrett Wollman  * This is the "network" that we will be moving data over
5999064799SGarrett Wollman  */
608360efbdSAlfred Perlstein static struct svc_raw_private {
618360efbdSAlfred Perlstein 	char	*raw_buf;	/* should be shared with the cl handle */
628f55a568SDoug Rabson 	SVCXPRT	*server;
6399064799SGarrett Wollman 	XDR	xdr_stream;
6499064799SGarrett Wollman 	char	verf_body[MAX_AUTH_BYTES];
658360efbdSAlfred Perlstein } *svc_raw_private;
6699064799SGarrett Wollman 
67c05ac53bSDavid E. O'Brien static enum xprt_stat svc_raw_stat(SVCXPRT *);
68c05ac53bSDavid E. O'Brien static bool_t svc_raw_recv(SVCXPRT *, struct rpc_msg *);
69c05ac53bSDavid E. O'Brien static bool_t svc_raw_reply(SVCXPRT *, struct rpc_msg *);
70f249dbccSDag-Erling Smørgrav static bool_t svc_raw_getargs(SVCXPRT *, xdrproc_t, void *);
71f249dbccSDag-Erling Smørgrav static bool_t svc_raw_freeargs(SVCXPRT *, xdrproc_t, void *);
72c05ac53bSDavid E. O'Brien static void svc_raw_destroy(SVCXPRT *);
73c05ac53bSDavid E. O'Brien static void svc_raw_ops(SVCXPRT *);
74c05ac53bSDavid E. O'Brien static bool_t svc_raw_control(SVCXPRT *, const u_int, void *);
758360efbdSAlfred Perlstein 
768360efbdSAlfred Perlstein char *__rpc_rawcombuf = NULL;
7799064799SGarrett Wollman 
7899064799SGarrett Wollman SVCXPRT *
svc_raw_create(void)79587cf682SCraig Rodrigues svc_raw_create(void)
8099064799SGarrett Wollman {
818360efbdSAlfred Perlstein 	struct svc_raw_private *srp;
828360efbdSAlfred Perlstein /* VARIABLES PROTECTED BY svcraw_lock: svc_raw_private, srp */
8399064799SGarrett Wollman 
848360efbdSAlfred Perlstein 	mutex_lock(&svcraw_lock);
858360efbdSAlfred Perlstein 	srp = svc_raw_private;
868360efbdSAlfred Perlstein 	if (srp == NULL) {
878360efbdSAlfred Perlstein 		srp = (struct svc_raw_private *)calloc(1, sizeof (*srp));
888360efbdSAlfred Perlstein 		if (srp == NULL) {
898360efbdSAlfred Perlstein 			mutex_unlock(&svcraw_lock);
908360efbdSAlfred Perlstein 			return (NULL);
9199064799SGarrett Wollman 		}
92ed8ddc6eSKonstantin Belousov 		if (__rpc_rawcombuf == NULL) {
938360efbdSAlfred Perlstein 			__rpc_rawcombuf = calloc(UDPMSGSIZE, sizeof (char));
94ed8ddc6eSKonstantin Belousov 			if (__rpc_rawcombuf == NULL) {
95ed8ddc6eSKonstantin Belousov 				free(srp);
96ed8ddc6eSKonstantin Belousov 				mutex_unlock(&svcraw_lock);
97ed8ddc6eSKonstantin Belousov 				return (NULL);
98ed8ddc6eSKonstantin Belousov 			}
99ed8ddc6eSKonstantin Belousov 		}
1008360efbdSAlfred Perlstein 		srp->raw_buf = __rpc_rawcombuf; /* Share it with the client */
1018f55a568SDoug Rabson 		srp->server = svc_xprt_alloc();
102ed8ddc6eSKonstantin Belousov 		if (srp->server == NULL) {
103ed8ddc6eSKonstantin Belousov 			free(__rpc_rawcombuf);
104ed8ddc6eSKonstantin Belousov 			free(srp);
105ed8ddc6eSKonstantin Belousov 			mutex_unlock(&svcraw_lock);
106ed8ddc6eSKonstantin Belousov 			return (NULL);
107ed8ddc6eSKonstantin Belousov 		}
1088360efbdSAlfred Perlstein 		svc_raw_private = srp;
1098360efbdSAlfred Perlstein 	}
1108f55a568SDoug Rabson 	srp->server->xp_fd = FD_SETSIZE;
1118f55a568SDoug Rabson 	srp->server->xp_port = 0;
1128f55a568SDoug Rabson 	svc_raw_ops(srp->server);
1138f55a568SDoug Rabson 	srp->server->xp_verf.oa_base = srp->verf_body;
1148360efbdSAlfred Perlstein 	xdrmem_create(&srp->xdr_stream, srp->raw_buf, UDPMSGSIZE, XDR_DECODE);
1158f55a568SDoug Rabson 	xprt_register(srp->server);
1168360efbdSAlfred Perlstein 	mutex_unlock(&svcraw_lock);
1178f55a568SDoug Rabson 	return (srp->server);
11899064799SGarrett Wollman }
11999064799SGarrett Wollman 
1208360efbdSAlfred Perlstein /*ARGSUSED*/
12199064799SGarrett Wollman static enum xprt_stat
svc_raw_stat(SVCXPRT * xprt)122587cf682SCraig Rodrigues svc_raw_stat(SVCXPRT *xprt)
12399064799SGarrett Wollman {
12499064799SGarrett Wollman 	return (XPRT_IDLE);
12599064799SGarrett Wollman }
12699064799SGarrett Wollman 
1278360efbdSAlfred Perlstein /*ARGSUSED*/
12899064799SGarrett Wollman static bool_t
svc_raw_recv(SVCXPRT * xprt,struct rpc_msg * msg)129587cf682SCraig Rodrigues svc_raw_recv(SVCXPRT *xprt, struct rpc_msg *msg)
13099064799SGarrett Wollman {
1318360efbdSAlfred Perlstein 	struct svc_raw_private *srp;
1328360efbdSAlfred Perlstein 	XDR *xdrs;
13399064799SGarrett Wollman 
1348360efbdSAlfred Perlstein 	mutex_lock(&svcraw_lock);
1358360efbdSAlfred Perlstein 	srp = svc_raw_private;
1368360efbdSAlfred Perlstein 	if (srp == NULL) {
1378360efbdSAlfred Perlstein 		mutex_unlock(&svcraw_lock);
1388360efbdSAlfred Perlstein 		return (FALSE);
1398360efbdSAlfred Perlstein 	}
1408360efbdSAlfred Perlstein 	mutex_unlock(&svcraw_lock);
1418360efbdSAlfred Perlstein 
14299064799SGarrett Wollman 	xdrs = &srp->xdr_stream;
14399064799SGarrett Wollman 	xdrs->x_op = XDR_DECODE;
1448360efbdSAlfred Perlstein 	(void) XDR_SETPOS(xdrs, 0);
1458360efbdSAlfred Perlstein 	if (! xdr_callmsg(xdrs, msg)) {
14699064799SGarrett Wollman 		return (FALSE);
1478360efbdSAlfred Perlstein 	}
14899064799SGarrett Wollman 	return (TRUE);
14999064799SGarrett Wollman }
15099064799SGarrett Wollman 
1518360efbdSAlfred Perlstein /*ARGSUSED*/
15299064799SGarrett Wollman static bool_t
svc_raw_reply(SVCXPRT * xprt,struct rpc_msg * msg)153587cf682SCraig Rodrigues svc_raw_reply(SVCXPRT *xprt, struct rpc_msg *msg)
15499064799SGarrett Wollman {
1558360efbdSAlfred Perlstein 	struct svc_raw_private *srp;
1568360efbdSAlfred Perlstein 	XDR *xdrs;
1578f55a568SDoug Rabson 	bool_t stat;
1588f55a568SDoug Rabson 	xdrproc_t xdr_proc;
1598f55a568SDoug Rabson 	caddr_t xdr_where;
16099064799SGarrett Wollman 
1618360efbdSAlfred Perlstein 	mutex_lock(&svcraw_lock);
1628360efbdSAlfred Perlstein 	srp = svc_raw_private;
1638360efbdSAlfred Perlstein 	if (srp == NULL) {
1648360efbdSAlfred Perlstein 		mutex_unlock(&svcraw_lock);
16599064799SGarrett Wollman 		return (FALSE);
1668360efbdSAlfred Perlstein 	}
1678360efbdSAlfred Perlstein 	mutex_unlock(&svcraw_lock);
1688360efbdSAlfred Perlstein 
16999064799SGarrett Wollman 	xdrs = &srp->xdr_stream;
17099064799SGarrett Wollman 	xdrs->x_op = XDR_ENCODE;
1718360efbdSAlfred Perlstein 	(void) XDR_SETPOS(xdrs, 0);
1728f55a568SDoug Rabson 	if (msg->rm_reply.rp_stat == MSG_ACCEPTED &&
1738f55a568SDoug Rabson 	    msg->rm_reply.rp_acpt.ar_stat == SUCCESS) {
1748f55a568SDoug Rabson 		xdr_proc = msg->acpted_rply.ar_results.proc;
1758f55a568SDoug Rabson 		xdr_where = msg->acpted_rply.ar_results.where;
1768f55a568SDoug Rabson 		msg->acpted_rply.ar_results.proc = (xdrproc_t) xdr_void;
1778f55a568SDoug Rabson 		msg->acpted_rply.ar_results.where = NULL;
1788f55a568SDoug Rabson 
179fcbfc882SGarrett Wollman 		stat = xdr_replymsg(xdrs, msg) &&
180fcbfc882SGarrett Wollman 		    SVCAUTH_WRAP(&SVC_AUTH(xprt), xdrs, xdr_proc, xdr_where);
1818f55a568SDoug Rabson 	} else {
1828f55a568SDoug Rabson 		stat = xdr_replymsg(xdrs, msg);
1838f55a568SDoug Rabson 	}
1848f55a568SDoug Rabson 	if (!stat) {
18599064799SGarrett Wollman 		return (FALSE);
1868360efbdSAlfred Perlstein 	}
18799064799SGarrett Wollman 	(void) XDR_GETPOS(xdrs);  /* called just for overhead */
18899064799SGarrett Wollman 	return (TRUE);
18999064799SGarrett Wollman }
19099064799SGarrett Wollman 
1918360efbdSAlfred Perlstein /*ARGSUSED*/
19299064799SGarrett Wollman static bool_t
svc_raw_getargs(SVCXPRT * xprt,xdrproc_t xdr_args,void * args_ptr)193587cf682SCraig Rodrigues svc_raw_getargs(SVCXPRT *xprt, xdrproc_t xdr_args, void *args_ptr)
19499064799SGarrett Wollman {
1958360efbdSAlfred Perlstein 	struct svc_raw_private *srp;
19699064799SGarrett Wollman 
1978360efbdSAlfred Perlstein 	mutex_lock(&svcraw_lock);
1988360efbdSAlfred Perlstein 	srp = svc_raw_private;
1998360efbdSAlfred Perlstein 	if (srp == NULL) {
2008360efbdSAlfred Perlstein 		mutex_unlock(&svcraw_lock);
20199064799SGarrett Wollman 		return (FALSE);
2028360efbdSAlfred Perlstein 	}
2038360efbdSAlfred Perlstein 	mutex_unlock(&svcraw_lock);
2048f55a568SDoug Rabson 
2058f55a568SDoug Rabson 	return (SVCAUTH_UNWRAP(&SVC_AUTH(xprt), &srp->xdr_stream,
2068f55a568SDoug Rabson 		xdr_args, args_ptr));
20799064799SGarrett Wollman }
20899064799SGarrett Wollman 
2098360efbdSAlfred Perlstein /*ARGSUSED*/
21099064799SGarrett Wollman static bool_t
svc_raw_freeargs(SVCXPRT * xprt,xdrproc_t xdr_args,void * args_ptr)211587cf682SCraig Rodrigues svc_raw_freeargs(SVCXPRT *xprt, xdrproc_t xdr_args, void *args_ptr)
21299064799SGarrett Wollman {
2138360efbdSAlfred Perlstein 	struct svc_raw_private *srp;
2148360efbdSAlfred Perlstein 	XDR *xdrs;
21599064799SGarrett Wollman 
2168360efbdSAlfred Perlstein 	mutex_lock(&svcraw_lock);
2178360efbdSAlfred Perlstein 	srp = svc_raw_private;
2188360efbdSAlfred Perlstein 	if (srp == NULL) {
2198360efbdSAlfred Perlstein 		mutex_unlock(&svcraw_lock);
22099064799SGarrett Wollman 		return (FALSE);
2218360efbdSAlfred Perlstein 	}
2228360efbdSAlfred Perlstein 	mutex_unlock(&svcraw_lock);
2238360efbdSAlfred Perlstein 
22499064799SGarrett Wollman 	xdrs = &srp->xdr_stream;
22599064799SGarrett Wollman 	xdrs->x_op = XDR_FREE;
2268360efbdSAlfred Perlstein 	return (*xdr_args)(xdrs, args_ptr);
2278360efbdSAlfred Perlstein }
2288360efbdSAlfred Perlstein 
2298360efbdSAlfred Perlstein /*ARGSUSED*/
2308360efbdSAlfred Perlstein static void
svc_raw_destroy(SVCXPRT * xprt)231587cf682SCraig Rodrigues svc_raw_destroy(SVCXPRT *xprt)
2328360efbdSAlfred Perlstein {
2338360efbdSAlfred Perlstein }
2348360efbdSAlfred Perlstein 
2358360efbdSAlfred Perlstein /*ARGSUSED*/
2368360efbdSAlfred Perlstein static bool_t
svc_raw_control(SVCXPRT * xprt,const u_int rq,void * in)237587cf682SCraig Rodrigues svc_raw_control(SVCXPRT *xprt, const u_int rq, void *in)
2388360efbdSAlfred Perlstein {
2398360efbdSAlfred Perlstein 	return (FALSE);
24099064799SGarrett Wollman }
24199064799SGarrett Wollman 
24299064799SGarrett Wollman static void
svc_raw_ops(SVCXPRT * xprt)243587cf682SCraig Rodrigues svc_raw_ops(SVCXPRT *xprt)
24499064799SGarrett Wollman {
2458360efbdSAlfred Perlstein 	static struct xp_ops ops;
2468360efbdSAlfred Perlstein 	static struct xp_ops2 ops2;
2478360efbdSAlfred Perlstein 
2488360efbdSAlfred Perlstein /* VARIABLES PROTECTED BY ops_lock: ops */
2498360efbdSAlfred Perlstein 
2508360efbdSAlfred Perlstein 	mutex_lock(&ops_lock);
2518360efbdSAlfred Perlstein 	if (ops.xp_recv == NULL) {
2528360efbdSAlfred Perlstein 		ops.xp_recv = svc_raw_recv;
2538360efbdSAlfred Perlstein 		ops.xp_stat = svc_raw_stat;
2548360efbdSAlfred Perlstein 		ops.xp_getargs = svc_raw_getargs;
2558360efbdSAlfred Perlstein 		ops.xp_reply = svc_raw_reply;
2568360efbdSAlfred Perlstein 		ops.xp_freeargs = svc_raw_freeargs;
2578360efbdSAlfred Perlstein 		ops.xp_destroy = svc_raw_destroy;
2588360efbdSAlfred Perlstein 		ops2.xp_control = svc_raw_control;
2598360efbdSAlfred Perlstein 	}
2608360efbdSAlfred Perlstein 	xprt->xp_ops = &ops;
2618360efbdSAlfred Perlstein 	xprt->xp_ops2 = &ops2;
2628360efbdSAlfred Perlstein 	mutex_unlock(&ops_lock);
26399064799SGarrett Wollman }
264