174462Salfred/*	$NetBSD: svc_raw.c,v 1.14 2000/07/06 03:10:35 christos Exp $	*/
274462Salfred
3261057Smav/*-
4261057Smav * Copyright (c) 2009, Sun Microsystems, Inc.
5261057Smav * All rights reserved.
68870Srgrimes *
7261057Smav * Redistribution and use in source and binary forms, with or without
8261057Smav * modification, are permitted provided that the following conditions are met:
9261057Smav * - Redistributions of source code must retain the above copyright notice,
10261057Smav *   this list of conditions and the following disclaimer.
11261057Smav * - Redistributions in binary form must reproduce the above copyright notice,
12261057Smav *   this list of conditions and the following disclaimer in the documentation
13261057Smav *   and/or other materials provided with the distribution.
14261057Smav * - Neither the name of Sun Microsystems, Inc. nor the names of its
15261057Smav *   contributors may be used to endorse or promote products derived
16261057Smav *   from this software without specific prior written permission.
17261057Smav *
18261057Smav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19261057Smav * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20261057Smav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21261057Smav * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22261057Smav * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23261057Smav * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24261057Smav * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25261057Smav * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26261057Smav * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27261057Smav * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28261057Smav * POSSIBILITY OF SUCH DAMAGE.
291901Swollman */
3074462Salfred/*
3174462Salfred * Copyright (c) 1986-1991 by Sun Microsystems Inc.
3274462Salfred */
331901Swollman
3474462Salfred/* #ident	"@(#)svc_raw.c	1.16	94/04/24 SMI" */
3574462Salfred
36136581Sobrien#if defined(LIBC_SCCS) && !defined(lint)
3774462Salfredstatic char sccsid[] = "@(#)svc_raw.c 1.25 89/01/31 Copyr 1984 Sun Micro";
381901Swollman#endif
3992990Sobrien#include <sys/cdefs.h>
4092990Sobrien__FBSDID("$FreeBSD$");
411901Swollman
421901Swollman/*
431901Swollman * svc_raw.c,   This a toy for simple testing and timing.
441901Swollman * Interface to create an rpc client and server in the same UNIX process.
451901Swollman * This lets us similate rpc and get rpc (round trip) overhead, without
4685138Salfred * any interference from the kernel.
471901Swollman *
481901Swollman */
491901Swollman
5075094Siedowse#include "namespace.h"
5174462Salfred#include "reentrant.h"
521901Swollman#include <rpc/rpc.h>
5374462Salfred#include <sys/types.h>
5474462Salfred#include <rpc/raw.h>
5511666Sphk#include <stdlib.h>
5674462Salfred#include "un-namespace.h"
57156090Sdeischen#include "mt_misc.h"
581901Swollman
5974462Salfred#ifndef UDPMSGSIZE
6074462Salfred#define	UDPMSGSIZE 8800
6174462Salfred#endif
6274462Salfred
631901Swollman/*
641901Swollman * This is the "network" that we will be moving data over
651901Swollman */
6674462Salfredstatic struct svc_raw_private {
6774462Salfred	char	*raw_buf;	/* should be shared with the cl handle */
68181344Sdfr	SVCXPRT	*server;
691901Swollman	XDR	xdr_stream;
701901Swollman	char	verf_body[MAX_AUTH_BYTES];
7174462Salfred} *svc_raw_private;
721901Swollman
7392905Sobrienstatic enum xprt_stat svc_raw_stat(SVCXPRT *);
7492905Sobrienstatic bool_t svc_raw_recv(SVCXPRT *, struct rpc_msg *);
7592905Sobrienstatic bool_t svc_raw_reply(SVCXPRT *, struct rpc_msg *);
7695658Sdesstatic bool_t svc_raw_getargs(SVCXPRT *, xdrproc_t, void *);
7795658Sdesstatic bool_t svc_raw_freeargs(SVCXPRT *, xdrproc_t, void *);
7892905Sobrienstatic void svc_raw_destroy(SVCXPRT *);
7992905Sobrienstatic void svc_raw_ops(SVCXPRT *);
8092905Sobrienstatic bool_t svc_raw_control(SVCXPRT *, const u_int, void *);
811901Swollman
8274462Salfredchar *__rpc_rawcombuf = NULL;
8374462Salfred
841901SwollmanSVCXPRT *
8574462Salfredsvc_raw_create()
861901Swollman{
8774462Salfred	struct svc_raw_private *srp;
8874462Salfred/* VARIABLES PROTECTED BY svcraw_lock: svc_raw_private, srp */
891901Swollman
9074462Salfred	mutex_lock(&svcraw_lock);
9174462Salfred	srp = svc_raw_private;
9274462Salfred	if (srp == NULL) {
9374462Salfred		srp = (struct svc_raw_private *)calloc(1, sizeof (*srp));
9474462Salfred		if (srp == NULL) {
9574462Salfred			mutex_unlock(&svcraw_lock);
9674462Salfred			return (NULL);
9774462Salfred		}
98235045Skib		if (__rpc_rawcombuf == NULL) {
9974462Salfred			__rpc_rawcombuf = calloc(UDPMSGSIZE, sizeof (char));
100235045Skib			if (__rpc_rawcombuf == NULL) {
101235045Skib				free(srp);
102235045Skib				mutex_unlock(&svcraw_lock);
103235045Skib				return (NULL);
104235045Skib			}
105235045Skib		}
10674462Salfred		srp->raw_buf = __rpc_rawcombuf; /* Share it with the client */
107181344Sdfr		srp->server = svc_xprt_alloc();
108235045Skib		if (srp->server == NULL) {
109235045Skib			free(__rpc_rawcombuf);
110235045Skib			free(srp);
111235045Skib			mutex_unlock(&svcraw_lock);
112235045Skib			return (NULL);
113235045Skib		}
11474462Salfred		svc_raw_private = srp;
1151901Swollman	}
116181344Sdfr	srp->server->xp_fd = FD_SETSIZE;
117181344Sdfr	srp->server->xp_port = 0;
118181344Sdfr	svc_raw_ops(srp->server);
119181344Sdfr	srp->server->xp_verf.oa_base = srp->verf_body;
12074462Salfred	xdrmem_create(&srp->xdr_stream, srp->raw_buf, UDPMSGSIZE, XDR_DECODE);
121181344Sdfr	xprt_register(srp->server);
12274462Salfred	mutex_unlock(&svcraw_lock);
123181344Sdfr	return (srp->server);
1241901Swollman}
1251901Swollman
12674462Salfred/*ARGSUSED*/
1271901Swollmanstatic enum xprt_stat
12874462Salfredsvc_raw_stat(xprt)
12974462SalfredSVCXPRT *xprt; /* args needed to satisfy ANSI-C typechecking */
1301901Swollman{
1311901Swollman	return (XPRT_IDLE);
1321901Swollman}
1331901Swollman
13474462Salfred/*ARGSUSED*/
1351901Swollmanstatic bool_t
13674462Salfredsvc_raw_recv(xprt, msg)
1371901Swollman	SVCXPRT *xprt;
1381901Swollman	struct rpc_msg *msg;
1391901Swollman{
14074462Salfred	struct svc_raw_private *srp;
14174462Salfred	XDR *xdrs;
1421901Swollman
14374462Salfred	mutex_lock(&svcraw_lock);
14474462Salfred	srp = svc_raw_private;
14574462Salfred	if (srp == NULL) {
14674462Salfred		mutex_unlock(&svcraw_lock);
14774462Salfred		return (FALSE);
14874462Salfred	}
14974462Salfred	mutex_unlock(&svcraw_lock);
15074462Salfred
1511901Swollman	xdrs = &srp->xdr_stream;
1521901Swollman	xdrs->x_op = XDR_DECODE;
15374462Salfred	(void) XDR_SETPOS(xdrs, 0);
15474462Salfred	if (! xdr_callmsg(xdrs, msg)) {
15574462Salfred		return (FALSE);
15674462Salfred	}
1571901Swollman	return (TRUE);
1581901Swollman}
1591901Swollman
16074462Salfred/*ARGSUSED*/
1611901Swollmanstatic bool_t
16274462Salfredsvc_raw_reply(xprt, msg)
1631901Swollman	SVCXPRT *xprt;
1641901Swollman	struct rpc_msg *msg;
1651901Swollman{
16674462Salfred	struct svc_raw_private *srp;
16774462Salfred	XDR *xdrs;
168181344Sdfr	bool_t stat;
169181344Sdfr	xdrproc_t xdr_proc;
170181344Sdfr	caddr_t xdr_where;
1711901Swollman
17274462Salfred	mutex_lock(&svcraw_lock);
17374462Salfred	srp = svc_raw_private;
17474462Salfred	if (srp == NULL) {
17574462Salfred		mutex_unlock(&svcraw_lock);
1761901Swollman		return (FALSE);
17774462Salfred	}
17874462Salfred	mutex_unlock(&svcraw_lock);
17974462Salfred
1801901Swollman	xdrs = &srp->xdr_stream;
1811901Swollman	xdrs->x_op = XDR_ENCODE;
18274462Salfred	(void) XDR_SETPOS(xdrs, 0);
183181344Sdfr	if (msg->rm_reply.rp_stat == MSG_ACCEPTED &&
184181344Sdfr	    msg->rm_reply.rp_acpt.ar_stat == SUCCESS) {
185181344Sdfr		xdr_proc = msg->acpted_rply.ar_results.proc;
186181344Sdfr		xdr_where = msg->acpted_rply.ar_results.where;
187181344Sdfr		msg->acpted_rply.ar_results.proc = (xdrproc_t) xdr_void;
188181344Sdfr		msg->acpted_rply.ar_results.where = NULL;
189181344Sdfr
190199785Swollman		stat = xdr_replymsg(xdrs, msg) &&
191199785Swollman		    SVCAUTH_WRAP(&SVC_AUTH(xprt), xdrs, xdr_proc, xdr_where);
192181344Sdfr	} else {
193181344Sdfr		stat = xdr_replymsg(xdrs, msg);
194181344Sdfr	}
195181344Sdfr	if (!stat) {
19674462Salfred		return (FALSE);
19774462Salfred	}
19874462Salfred	(void) XDR_GETPOS(xdrs);  /* called just for overhead */
1991901Swollman	return (TRUE);
2001901Swollman}
2011901Swollman
20274462Salfred/*ARGSUSED*/
2031901Swollmanstatic bool_t
20474462Salfredsvc_raw_getargs(xprt, xdr_args, args_ptr)
2051901Swollman	SVCXPRT *xprt;
2061901Swollman	xdrproc_t xdr_args;
20795658Sdes	void *args_ptr;
2081901Swollman{
20974462Salfred	struct svc_raw_private *srp;
2101901Swollman
21174462Salfred	mutex_lock(&svcraw_lock);
21274462Salfred	srp = svc_raw_private;
21374462Salfred	if (srp == NULL) {
21474462Salfred		mutex_unlock(&svcraw_lock);
2151901Swollman		return (FALSE);
21674462Salfred	}
21774462Salfred	mutex_unlock(&svcraw_lock);
218181344Sdfr
219181344Sdfr	return (SVCAUTH_UNWRAP(&SVC_AUTH(xprt), &srp->xdr_stream,
220181344Sdfr		xdr_args, args_ptr));
2211901Swollman}
2221901Swollman
22374462Salfred/*ARGSUSED*/
2241901Swollmanstatic bool_t
22574462Salfredsvc_raw_freeargs(xprt, xdr_args, args_ptr)
2261901Swollman	SVCXPRT *xprt;
2271901Swollman	xdrproc_t xdr_args;
22895658Sdes	void *args_ptr;
2298870Srgrimes{
23074462Salfred	struct svc_raw_private *srp;
23174462Salfred	XDR *xdrs;
2321901Swollman
23374462Salfred	mutex_lock(&svcraw_lock);
23474462Salfred	srp = svc_raw_private;
23574462Salfred	if (srp == NULL) {
23674462Salfred		mutex_unlock(&svcraw_lock);
2371901Swollman		return (FALSE);
23874462Salfred	}
23974462Salfred	mutex_unlock(&svcraw_lock);
24074462Salfred
2411901Swollman	xdrs = &srp->xdr_stream;
2421901Swollman	xdrs->x_op = XDR_FREE;
24374462Salfred	return (*xdr_args)(xdrs, args_ptr);
2448870Srgrimes}
2451901Swollman
24674462Salfred/*ARGSUSED*/
2471901Swollmanstatic void
24874462Salfredsvc_raw_destroy(xprt)
24974462SalfredSVCXPRT *xprt;
2501901Swollman{
2511901Swollman}
25274462Salfred
25374462Salfred/*ARGSUSED*/
25474462Salfredstatic bool_t
25574462Salfredsvc_raw_control(xprt, rq, in)
25674462Salfred	SVCXPRT *xprt;
25774462Salfred	const u_int	rq;
25874462Salfred	void		*in;
25974462Salfred{
26074462Salfred	return (FALSE);
26174462Salfred}
26274462Salfred
26374462Salfredstatic void
26474462Salfredsvc_raw_ops(xprt)
26574462Salfred	SVCXPRT *xprt;
26674462Salfred{
26774462Salfred	static struct xp_ops ops;
26874462Salfred	static struct xp_ops2 ops2;
26974462Salfred
27074462Salfred/* VARIABLES PROTECTED BY ops_lock: ops */
27174462Salfred
27274462Salfred	mutex_lock(&ops_lock);
27374462Salfred	if (ops.xp_recv == NULL) {
27474462Salfred		ops.xp_recv = svc_raw_recv;
27574462Salfred		ops.xp_stat = svc_raw_stat;
27674462Salfred		ops.xp_getargs = svc_raw_getargs;
27774462Salfred		ops.xp_reply = svc_raw_reply;
27874462Salfred		ops.xp_freeargs = svc_raw_freeargs;
27974462Salfred		ops.xp_destroy = svc_raw_destroy;
28074462Salfred		ops2.xp_control = svc_raw_control;
28174462Salfred	}
28274462Salfred	xprt->xp_ops = &ops;
28374462Salfred	xprt->xp_ops2 = &ops2;
28474462Salfred	mutex_unlock(&ops_lock);
28574462Salfred}
286