1*bbaa8b60SDan Kruchinin /*
2*bbaa8b60SDan Kruchinin  * This file and its contents are supplied under the terms of the
3*bbaa8b60SDan Kruchinin  * Common Development and Distribution License ("CDDL"), version 1.0.
4*bbaa8b60SDan Kruchinin  * You may only use this file in accordance with the terms of version
5*bbaa8b60SDan Kruchinin  * 1.0 of the CDDL.
6*bbaa8b60SDan Kruchinin  *
7*bbaa8b60SDan Kruchinin  * A full copy of the text of the CDDL should have accompanied this
8*bbaa8b60SDan Kruchinin  * source.  A copy is of the CDDL is also available via the Internet
9*bbaa8b60SDan Kruchinin  * at http://www.illumos.org/license/CDDL.
10*bbaa8b60SDan Kruchinin  */
11*bbaa8b60SDan Kruchinin 
12*bbaa8b60SDan Kruchinin /*
13*bbaa8b60SDan Kruchinin  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
14*bbaa8b60SDan Kruchinin  */
15*bbaa8b60SDan Kruchinin 
16*bbaa8b60SDan Kruchinin /*
17*bbaa8b60SDan Kruchinin  * NFS Lock Manager, server-side dispatch tables and
18*bbaa8b60SDan Kruchinin  * dispatch programs: nlm_prog_3, nlm_prog4
19*bbaa8b60SDan Kruchinin  *
20*bbaa8b60SDan Kruchinin  * These are called by RPC framework after the RPC service
21*bbaa8b60SDan Kruchinin  * endpoints setup done in nlm_impl.c: nlm_svc_add_ep().
22*bbaa8b60SDan Kruchinin  *
23*bbaa8b60SDan Kruchinin  * Originally from rpcgen, then reduced.
24*bbaa8b60SDan Kruchinin  */
25*bbaa8b60SDan Kruchinin 
26*bbaa8b60SDan Kruchinin #include <sys/param.h>
27*bbaa8b60SDan Kruchinin #include <sys/systm.h>
28*bbaa8b60SDan Kruchinin #include <sys/sdt.h>
29*bbaa8b60SDan Kruchinin #include <rpcsvc/nlm_prot.h>
30*bbaa8b60SDan Kruchinin #include "nlm_impl.h"
31*bbaa8b60SDan Kruchinin 
32*bbaa8b60SDan Kruchinin /*
33*bbaa8b60SDan Kruchinin  * Dispatch entry function pointers.
34*bbaa8b60SDan Kruchinin  */
35*bbaa8b60SDan Kruchinin typedef bool_t (*nlm_svc_func_t)(void *, void *, struct svc_req *);
36*bbaa8b60SDan Kruchinin typedef void (*nlm_freeres_func_t)(void *);
37*bbaa8b60SDan Kruchinin 
38*bbaa8b60SDan Kruchinin /*
39*bbaa8b60SDan Kruchinin  * Entries in the dispatch tables below.
40*bbaa8b60SDan Kruchinin  */
41*bbaa8b60SDan Kruchinin struct dispatch_entry {
42*bbaa8b60SDan Kruchinin 	nlm_svc_func_t		de_svc;		/* service routine function */
43*bbaa8b60SDan Kruchinin 	xdrproc_t		de_xargs;	/* XDR args decode function */
44*bbaa8b60SDan Kruchinin 	xdrproc_t		de_xres;	/* XDR res encode function */
45*bbaa8b60SDan Kruchinin 	nlm_freeres_func_t	de_resfree;	/* free res function */
46*bbaa8b60SDan Kruchinin 	int			de_ressz;	/* size of result */
47*bbaa8b60SDan Kruchinin 	uint_t			de_flags;	/* flags */
48*bbaa8b60SDan Kruchinin };
49*bbaa8b60SDan Kruchinin 
50*bbaa8b60SDan Kruchinin /* Flag bits in de_flags */
51*bbaa8b60SDan Kruchinin #define	NLM_DISP_NOREMOTE	1	/* Local calls only */
52*bbaa8b60SDan Kruchinin 
53*bbaa8b60SDan Kruchinin /*
54*bbaa8b60SDan Kruchinin  * Cast macros for dispatch table function pointers.
55*bbaa8b60SDan Kruchinin  */
56*bbaa8b60SDan Kruchinin #define	NLM_SVC_FUNC(func)	(nlm_svc_func_t)func
57*bbaa8b60SDan Kruchinin #define	NLM_FREERES_FUNC(func)	(nlm_freeres_func_t)func
58*bbaa8b60SDan Kruchinin 
59*bbaa8b60SDan Kruchinin /* ARGSUSED */
60*bbaa8b60SDan Kruchinin static bool_t
nlm_null_svc(void * args,void * resp,struct svc_req * sr)61*bbaa8b60SDan Kruchinin nlm_null_svc(void *args, void *resp, struct svc_req *sr)
62*bbaa8b60SDan Kruchinin {
63*bbaa8b60SDan Kruchinin 	return (TRUE);
64*bbaa8b60SDan Kruchinin }
65*bbaa8b60SDan Kruchinin 
66*bbaa8b60SDan Kruchinin /*
67*bbaa8b60SDan Kruchinin  * The common NLM service dispatch function, used by
68*bbaa8b60SDan Kruchinin  * both: nlm_prog_3, nlm_prog_4
69*bbaa8b60SDan Kruchinin  */
70*bbaa8b60SDan Kruchinin void
nlm_dispatch(struct svc_req * rqstp,SVCXPRT * transp,const struct dispatch_entry * de)71*bbaa8b60SDan Kruchinin nlm_dispatch(
72*bbaa8b60SDan Kruchinin 	struct svc_req *rqstp,
73*bbaa8b60SDan Kruchinin 	SVCXPRT *transp,
74*bbaa8b60SDan Kruchinin 	const struct dispatch_entry *de)
75*bbaa8b60SDan Kruchinin {
76*bbaa8b60SDan Kruchinin 	union {
77*bbaa8b60SDan Kruchinin 		/* All the arg types */
78*bbaa8b60SDan Kruchinin 		nlm_cancargs	au_cancargs;
79*bbaa8b60SDan Kruchinin 		nlm_lockargs	au_lockargs;
80*bbaa8b60SDan Kruchinin 		nlm_notify	au_notify;
81*bbaa8b60SDan Kruchinin 		nlm_res		au_res;
82*bbaa8b60SDan Kruchinin 		nlm_shareargs	au_shareargs;
83*bbaa8b60SDan Kruchinin 		nlm_sm_status	au_sm_status;
84*bbaa8b60SDan Kruchinin 		nlm_testargs	au_testargs;
85*bbaa8b60SDan Kruchinin 		nlm_testres	au_testres;
86*bbaa8b60SDan Kruchinin 		nlm_unlockargs	au_unlockargs;
87*bbaa8b60SDan Kruchinin 		nlm4_cancargs	au_cancargs4;
88*bbaa8b60SDan Kruchinin 		nlm4_lockargs	au_lockargs4;
89*bbaa8b60SDan Kruchinin 		nlm4_notify	au_notify4;
90*bbaa8b60SDan Kruchinin 		nlm4_res	au_res4;
91*bbaa8b60SDan Kruchinin 		nlm4_shareargs	au_shareargs4;
92*bbaa8b60SDan Kruchinin 		nlm4_testargs	au_testargs4;
93*bbaa8b60SDan Kruchinin 		nlm4_testres	au_testres4;
94*bbaa8b60SDan Kruchinin 		nlm4_unlockargs	au_unlockargs4;
95*bbaa8b60SDan Kruchinin 	} argu;
96*bbaa8b60SDan Kruchinin 	void *args = &argu;
97*bbaa8b60SDan Kruchinin 	union {
98*bbaa8b60SDan Kruchinin 		/* All the ret types */
99*bbaa8b60SDan Kruchinin 		int		ru_int;
100*bbaa8b60SDan Kruchinin 		nlm_res		ru_res;
101*bbaa8b60SDan Kruchinin 		nlm_shareres	ru_shareres;
102*bbaa8b60SDan Kruchinin 		nlm_testres	ru_testres;
103*bbaa8b60SDan Kruchinin 		nlm4_res	ru_res4;
104*bbaa8b60SDan Kruchinin 		nlm4_shareres	ru_shareres4;
105*bbaa8b60SDan Kruchinin 		nlm4_testres	ru_testres4;
106*bbaa8b60SDan Kruchinin 
107*bbaa8b60SDan Kruchinin 	} resu;
108*bbaa8b60SDan Kruchinin 	void *res = &resu;
109*bbaa8b60SDan Kruchinin 	nlm_svc_func_t func;
110*bbaa8b60SDan Kruchinin 	bool_t do_reply = FALSE;
111*bbaa8b60SDan Kruchinin 	bool_t dupcached = FALSE;
112*bbaa8b60SDan Kruchinin 	struct dupreq *dr;
113*bbaa8b60SDan Kruchinin 	int dupstat;
114*bbaa8b60SDan Kruchinin 
115*bbaa8b60SDan Kruchinin 	if ((func = de->de_svc) == NULL) {
116*bbaa8b60SDan Kruchinin 		svcerr_noproc(transp);
117*bbaa8b60SDan Kruchinin 		return;
118*bbaa8b60SDan Kruchinin 	}
119*bbaa8b60SDan Kruchinin 
120*bbaa8b60SDan Kruchinin 	if ((de->de_flags & NLM_DISP_NOREMOTE) &&
121*bbaa8b60SDan Kruchinin 	    !nlm_caller_is_local(transp)) {
122*bbaa8b60SDan Kruchinin 		svcerr_noproc(transp);
123*bbaa8b60SDan Kruchinin 		return;
124*bbaa8b60SDan Kruchinin 	}
125*bbaa8b60SDan Kruchinin 
126*bbaa8b60SDan Kruchinin 	/*
127*bbaa8b60SDan Kruchinin 	 * This section from rpcgen, and then modified slightly.
128*bbaa8b60SDan Kruchinin 	 *
129*bbaa8b60SDan Kruchinin 	 * Dispatch entries that should _never_ send a response
130*bbaa8b60SDan Kruchinin 	 * (i.e. all the _MSG and _RES entries) put NULL in the
131*bbaa8b60SDan Kruchinin 	 * de_xres field to indicate that.  For such entries, we
132*bbaa8b60SDan Kruchinin 	 * will NOT call svc_sendreply nor xdr_free().  Normal
133*bbaa8b60SDan Kruchinin 	 * dispatch entries skip svc_sendreply if the dispatch
134*bbaa8b60SDan Kruchinin 	 * function returns zero, but always call xdr_free().
135*bbaa8b60SDan Kruchinin 	 *
136*bbaa8b60SDan Kruchinin 	 * There are more complex cases where some dispatch
137*bbaa8b60SDan Kruchinin 	 * functions need to send their own reply.  We chose
138*bbaa8b60SDan Kruchinin 	 * to indicate those by returning false from the
139*bbaa8b60SDan Kruchinin 	 * service routine.
140*bbaa8b60SDan Kruchinin 	 */
141*bbaa8b60SDan Kruchinin 	bzero(&argu, sizeof (argu));
142*bbaa8b60SDan Kruchinin 	if (!SVC_GETARGS(transp, de->de_xargs, args)) {
143*bbaa8b60SDan Kruchinin 		svcerr_decode(transp);
144*bbaa8b60SDan Kruchinin 		return;
145*bbaa8b60SDan Kruchinin 	}
146*bbaa8b60SDan Kruchinin 
147*bbaa8b60SDan Kruchinin 	/*
148*bbaa8b60SDan Kruchinin 	 * Duplicate request cache.
149*bbaa8b60SDan Kruchinin 	 *
150*bbaa8b60SDan Kruchinin 	 * Since none of the NLM replies are very large we have simplified the
151*bbaa8b60SDan Kruchinin 	 * DRC by not distinguishing between idempotent and non-idempotent
152*bbaa8b60SDan Kruchinin 	 * requests.
153*bbaa8b60SDan Kruchinin 	 */
154*bbaa8b60SDan Kruchinin 	dupstat = SVC_DUP_EXT(transp, rqstp, res, de->de_ressz, &dr,
155*bbaa8b60SDan Kruchinin 	    &dupcached);
156*bbaa8b60SDan Kruchinin 
157*bbaa8b60SDan Kruchinin 	switch (dupstat) {
158*bbaa8b60SDan Kruchinin 	case DUP_ERROR:
159*bbaa8b60SDan Kruchinin 		svcerr_systemerr(transp);
160*bbaa8b60SDan Kruchinin 		break;
161*bbaa8b60SDan Kruchinin 	case DUP_INPROGRESS:
162*bbaa8b60SDan Kruchinin 		break;
163*bbaa8b60SDan Kruchinin 	case DUP_NEW:
164*bbaa8b60SDan Kruchinin 	case DUP_DROP:
165*bbaa8b60SDan Kruchinin 		/*
166*bbaa8b60SDan Kruchinin 		 * When UFS is quiescing it uses lockfs to block vnode
167*bbaa8b60SDan Kruchinin 		 * operations until it has finished quiescing.  Set the
168*bbaa8b60SDan Kruchinin 		 * thread's T_DONTPEND flag to prevent the service routine
169*bbaa8b60SDan Kruchinin 		 * from blocking due to a lockfs lock. (See ufs_check_lockfs)
170*bbaa8b60SDan Kruchinin 		 */
171*bbaa8b60SDan Kruchinin 		curthread->t_flag |= T_DONTPEND;
172*bbaa8b60SDan Kruchinin 
173*bbaa8b60SDan Kruchinin 		bzero(&resu, sizeof (resu));
174*bbaa8b60SDan Kruchinin 		do_reply = (*func)(args, res, rqstp);
175*bbaa8b60SDan Kruchinin 
176*bbaa8b60SDan Kruchinin 		curthread->t_flag &= ~T_DONTPEND;
177*bbaa8b60SDan Kruchinin 		if (curthread->t_flag & T_WOULDBLOCK) {
178*bbaa8b60SDan Kruchinin 			curthread->t_flag &= ~T_WOULDBLOCK;
179*bbaa8b60SDan Kruchinin 			SVC_DUPDONE_EXT(transp, dr, res, NULL,
180*bbaa8b60SDan Kruchinin 			    de->de_ressz, DUP_DROP);
181*bbaa8b60SDan Kruchinin 			do_reply = FALSE;
182*bbaa8b60SDan Kruchinin 			break;
183*bbaa8b60SDan Kruchinin 		}
184*bbaa8b60SDan Kruchinin 		SVC_DUPDONE_EXT(transp, dr, res, de->de_resfree,
185*bbaa8b60SDan Kruchinin 		    de->de_ressz, DUP_DONE);
186*bbaa8b60SDan Kruchinin 		dupcached = TRUE;
187*bbaa8b60SDan Kruchinin 		break;
188*bbaa8b60SDan Kruchinin 	case DUP_DONE:
189*bbaa8b60SDan Kruchinin 		/*
190*bbaa8b60SDan Kruchinin 		 * The service routine may have been responsible for sending
191*bbaa8b60SDan Kruchinin 		 * the reply for the original request but for a re-xmitted
192*bbaa8b60SDan Kruchinin 		 * request we don't invoke the service routine so we must
193*bbaa8b60SDan Kruchinin 		 * re-xmit the reply from the dispatch function.
194*bbaa8b60SDan Kruchinin 		 *
195*bbaa8b60SDan Kruchinin 		 * If de_xres is NULL this is a one-way message so no reply is
196*bbaa8b60SDan Kruchinin 		 * needed.
197*bbaa8b60SDan Kruchinin 		 */
198*bbaa8b60SDan Kruchinin 		if (de->de_xres != NULL_xdrproc_t) {
199*bbaa8b60SDan Kruchinin 			do_reply = TRUE;
200*bbaa8b60SDan Kruchinin 		}
201*bbaa8b60SDan Kruchinin 		break;
202*bbaa8b60SDan Kruchinin 	}
203*bbaa8b60SDan Kruchinin 
204*bbaa8b60SDan Kruchinin 	if (do_reply) {
205*bbaa8b60SDan Kruchinin 		ASSERT(de->de_xres != NULL_xdrproc_t);
206*bbaa8b60SDan Kruchinin 		DTRACE_PROBE3(sendreply, struct svc_req *, rqstp,
207*bbaa8b60SDan Kruchinin 		    SVCXPRT *, transp, struct dispatch_entry *, de);
208*bbaa8b60SDan Kruchinin 
209*bbaa8b60SDan Kruchinin 		if (!svc_sendreply(transp, de->de_xres, res)) {
210*bbaa8b60SDan Kruchinin 			svcerr_systemerr(transp);
211*bbaa8b60SDan Kruchinin 			NLM_ERR("nlm_dispatch(): svc_sendreply() failed!\n");
212*bbaa8b60SDan Kruchinin 		}
213*bbaa8b60SDan Kruchinin 
214*bbaa8b60SDan Kruchinin 		if (!dupcached) {
215*bbaa8b60SDan Kruchinin 			xdr_free(de->de_xres, res);
216*bbaa8b60SDan Kruchinin 		}
217*bbaa8b60SDan Kruchinin 	}
218*bbaa8b60SDan Kruchinin 
219*bbaa8b60SDan Kruchinin 	if (!SVC_FREEARGS(transp, de->de_xargs, args))
220*bbaa8b60SDan Kruchinin 		NLM_WARN("nlm_dispatch(): unable to free arguments");
221*bbaa8b60SDan Kruchinin }
222*bbaa8b60SDan Kruchinin 
223*bbaa8b60SDan Kruchinin /*
224*bbaa8b60SDan Kruchinin  * Result free functions.  The functions are called by the RPC duplicate
225*bbaa8b60SDan Kruchinin  * request cache code when an entry is being evicted from the cache.
226*bbaa8b60SDan Kruchinin  */
227*bbaa8b60SDan Kruchinin static void
nlm_res_free(nlm_res * resp)228*bbaa8b60SDan Kruchinin nlm_res_free(nlm_res *resp)
229*bbaa8b60SDan Kruchinin {
230*bbaa8b60SDan Kruchinin 	xdr_free(xdr_nlm_res, (char *)resp);
231*bbaa8b60SDan Kruchinin }
232*bbaa8b60SDan Kruchinin 
233*bbaa8b60SDan Kruchinin static void
nlm_shareres_free(nlm_shareres * resp)234*bbaa8b60SDan Kruchinin nlm_shareres_free(nlm_shareres *resp)
235*bbaa8b60SDan Kruchinin {
236*bbaa8b60SDan Kruchinin 	xdr_free(xdr_nlm_shareres, (char *)resp);
237*bbaa8b60SDan Kruchinin }
238*bbaa8b60SDan Kruchinin 
239*bbaa8b60SDan Kruchinin static void
nlm_testres_free(nlm_testres * resp)240*bbaa8b60SDan Kruchinin nlm_testres_free(nlm_testres *resp)
241*bbaa8b60SDan Kruchinin {
242*bbaa8b60SDan Kruchinin 	xdr_free(xdr_nlm_testres, (char *)resp);
243*bbaa8b60SDan Kruchinin }
244*bbaa8b60SDan Kruchinin 
245*bbaa8b60SDan Kruchinin static void
nlm4_res_free(nlm4_res * resp)246*bbaa8b60SDan Kruchinin nlm4_res_free(nlm4_res *resp)
247*bbaa8b60SDan Kruchinin {
248*bbaa8b60SDan Kruchinin 	xdr_free(xdr_nlm4_res, (char *)resp);
249*bbaa8b60SDan Kruchinin }
250*bbaa8b60SDan Kruchinin 
251*bbaa8b60SDan Kruchinin static void
nlm4_shareres_free(nlm4_shareres * resp)252*bbaa8b60SDan Kruchinin nlm4_shareres_free(nlm4_shareres *resp)
253*bbaa8b60SDan Kruchinin {
254*bbaa8b60SDan Kruchinin 	xdr_free(xdr_nlm4_shareres, (char *)resp);
255*bbaa8b60SDan Kruchinin }
256*bbaa8b60SDan Kruchinin 
257*bbaa8b60SDan Kruchinin static void
nlm4_testres_free(nlm4_testres * resp)258*bbaa8b60SDan Kruchinin nlm4_testres_free(nlm4_testres *resp)
259*bbaa8b60SDan Kruchinin {
260*bbaa8b60SDan Kruchinin 	xdr_free(xdr_nlm4_testres, (char *)resp);
261*bbaa8b60SDan Kruchinin }
262*bbaa8b60SDan Kruchinin 
263*bbaa8b60SDan Kruchinin /*
264*bbaa8b60SDan Kruchinin  * Dispatch tables for each program version.
265*bbaa8b60SDan Kruchinin  *
266*bbaa8b60SDan Kruchinin  * The tables here were all originally from rpcgen,
267*bbaa8b60SDan Kruchinin  * but then arg/resp sizes removed, flags added.
268*bbaa8b60SDan Kruchinin  */
269*bbaa8b60SDan Kruchinin 
270*bbaa8b60SDan Kruchinin /*
271*bbaa8b60SDan Kruchinin  * Dispatch table for versions 1, 2, 3
272*bbaa8b60SDan Kruchinin  * (NLM_VERS, NLM_SM, NLM_VERSX)
273*bbaa8b60SDan Kruchinin  */
274*bbaa8b60SDan Kruchinin static const struct dispatch_entry
275*bbaa8b60SDan Kruchinin nlm_prog_3_dtable[] = {
276*bbaa8b60SDan Kruchinin 
277*bbaa8b60SDan Kruchinin 	/*
278*bbaa8b60SDan Kruchinin 	 * Version 1 (NLM_VERS) entries.
279*bbaa8b60SDan Kruchinin 	 */
280*bbaa8b60SDan Kruchinin 
281*bbaa8b60SDan Kruchinin 	{ /* 0: NULLPROC */
282*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_null_svc),
283*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_void,
284*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_void,
285*bbaa8b60SDan Kruchinin 	NULL,
286*bbaa8b60SDan Kruchinin 	0,
287*bbaa8b60SDan Kruchinin 	0 },
288*bbaa8b60SDan Kruchinin 
289*bbaa8b60SDan Kruchinin 	{ /* 1: NLM_TEST */
290*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_test_1_svc),
291*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_testargs,
292*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_testres,
293*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm_testres_free),
294*bbaa8b60SDan Kruchinin 	sizeof (nlm_testres),
295*bbaa8b60SDan Kruchinin 	0 },
296*bbaa8b60SDan Kruchinin 
297*bbaa8b60SDan Kruchinin 	{ /* 2: NLM_LOCK */
298*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_lock_1_svc),
299*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_lockargs,
300*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_res,
301*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm_res_free),
302*bbaa8b60SDan Kruchinin 	sizeof (nlm_res),
303*bbaa8b60SDan Kruchinin 	0 },
304*bbaa8b60SDan Kruchinin 
305*bbaa8b60SDan Kruchinin 	{ /* 3: NLM_CANCEL */
306*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_cancel_1_svc),
307*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_cancargs,
308*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_res,
309*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm_res_free),
310*bbaa8b60SDan Kruchinin 	sizeof (nlm_res),
311*bbaa8b60SDan Kruchinin 	0 },
312*bbaa8b60SDan Kruchinin 
313*bbaa8b60SDan Kruchinin 	{ /* 4: NLM_UNLOCK */
314*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_unlock_1_svc),
315*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_unlockargs,
316*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_res,
317*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm_res_free),
318*bbaa8b60SDan Kruchinin 	sizeof (nlm_res),
319*bbaa8b60SDan Kruchinin 	0 },
320*bbaa8b60SDan Kruchinin 
321*bbaa8b60SDan Kruchinin 	{ /* 5: NLM_GRANTED */
322*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_granted_1_svc),
323*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_testargs,
324*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_res,
325*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm_res_free),
326*bbaa8b60SDan Kruchinin 	sizeof (nlm_res),
327*bbaa8b60SDan Kruchinin 	0 },
328*bbaa8b60SDan Kruchinin 
329*bbaa8b60SDan Kruchinin 	/*
330*bbaa8b60SDan Kruchinin 	 * All the _MSG and _RES entries are "one way" calls that
331*bbaa8b60SDan Kruchinin 	 * skip the usual RPC reply.  We give them a null xdr_res
332*bbaa8b60SDan Kruchinin 	 * function so the dispatcher will not send a reply.
333*bbaa8b60SDan Kruchinin 	 */
334*bbaa8b60SDan Kruchinin 
335*bbaa8b60SDan Kruchinin 	{ /* 6: NLM_TEST_MSG */
336*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_test_msg_1_svc),
337*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_testargs,
338*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
339*bbaa8b60SDan Kruchinin 	NULL,
340*bbaa8b60SDan Kruchinin 	0,
341*bbaa8b60SDan Kruchinin 	0 },
342*bbaa8b60SDan Kruchinin 
343*bbaa8b60SDan Kruchinin 	{ /* 7: NLM_LOCK_MSG */
344*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_lock_msg_1_svc),
345*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_lockargs,
346*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
347*bbaa8b60SDan Kruchinin 	NULL,
348*bbaa8b60SDan Kruchinin 	0,
349*bbaa8b60SDan Kruchinin 	0 },
350*bbaa8b60SDan Kruchinin 
351*bbaa8b60SDan Kruchinin 	{ /* 8: NLM_CANCEL_MSG */
352*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_cancel_msg_1_svc),
353*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_cancargs,
354*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
355*bbaa8b60SDan Kruchinin 	NULL,
356*bbaa8b60SDan Kruchinin 	0,
357*bbaa8b60SDan Kruchinin 	0 },
358*bbaa8b60SDan Kruchinin 
359*bbaa8b60SDan Kruchinin 	{ /* 9: NLM_UNLOCK_MSG */
360*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_unlock_msg_1_svc),
361*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_unlockargs,
362*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
363*bbaa8b60SDan Kruchinin 	NULL,
364*bbaa8b60SDan Kruchinin 	0,
365*bbaa8b60SDan Kruchinin 	0 },
366*bbaa8b60SDan Kruchinin 
367*bbaa8b60SDan Kruchinin 	{ /* 10: NLM_GRANTED_MSG */
368*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_granted_msg_1_svc),
369*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_testargs,
370*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
371*bbaa8b60SDan Kruchinin 	NULL,
372*bbaa8b60SDan Kruchinin 	0,
373*bbaa8b60SDan Kruchinin 	0 },
374*bbaa8b60SDan Kruchinin 
375*bbaa8b60SDan Kruchinin 	{ /* 11: NLM_TEST_RES */
376*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_test_res_1_svc),
377*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_testres,
378*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
379*bbaa8b60SDan Kruchinin 	NULL,
380*bbaa8b60SDan Kruchinin 	0,
381*bbaa8b60SDan Kruchinin 	0 },
382*bbaa8b60SDan Kruchinin 
383*bbaa8b60SDan Kruchinin 	{ /* 12: NLM_LOCK_RES */
384*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_lock_res_1_svc),
385*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_res,
386*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
387*bbaa8b60SDan Kruchinin 	NULL,
388*bbaa8b60SDan Kruchinin 	0,
389*bbaa8b60SDan Kruchinin 	0 },
390*bbaa8b60SDan Kruchinin 
391*bbaa8b60SDan Kruchinin 	{ /* 13: NLM_CANCEL_RES */
392*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_cancel_res_1_svc),
393*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_res,
394*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
395*bbaa8b60SDan Kruchinin 	NULL,
396*bbaa8b60SDan Kruchinin 	0,
397*bbaa8b60SDan Kruchinin 	0 },
398*bbaa8b60SDan Kruchinin 
399*bbaa8b60SDan Kruchinin 	{ /* 14: NLM_UNLOCK_RES */
400*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_unlock_res_1_svc),
401*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_res,
402*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
403*bbaa8b60SDan Kruchinin 	NULL,
404*bbaa8b60SDan Kruchinin 	0,
405*bbaa8b60SDan Kruchinin 	0 },
406*bbaa8b60SDan Kruchinin 
407*bbaa8b60SDan Kruchinin 	{ /* 15: NLM_GRANTED_RES */
408*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_granted_res_1_svc),
409*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_res,
410*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
411*bbaa8b60SDan Kruchinin 	NULL,
412*bbaa8b60SDan Kruchinin 	0,
413*bbaa8b60SDan Kruchinin 	0 },
414*bbaa8b60SDan Kruchinin 
415*bbaa8b60SDan Kruchinin 	{ /* 16: not used */
416*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(0),
417*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
418*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
419*bbaa8b60SDan Kruchinin 	NULL,
420*bbaa8b60SDan Kruchinin 	0,
421*bbaa8b60SDan Kruchinin 	0 },
422*bbaa8b60SDan Kruchinin 
423*bbaa8b60SDan Kruchinin 	{ /* 17: NLM_SM_NOTIFY1 */
424*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_sm_notify1_2_svc),
425*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_sm_status,
426*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_void,
427*bbaa8b60SDan Kruchinin 	NULL,
428*bbaa8b60SDan Kruchinin 	0,
429*bbaa8b60SDan Kruchinin 	NLM_DISP_NOREMOTE },
430*bbaa8b60SDan Kruchinin 
431*bbaa8b60SDan Kruchinin 	{ /* 18: NLM_SM_NOTIFY2 */
432*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_sm_notify2_2_svc),
433*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_sm_status,
434*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_void,
435*bbaa8b60SDan Kruchinin 	NULL,
436*bbaa8b60SDan Kruchinin 	0,
437*bbaa8b60SDan Kruchinin 	NLM_DISP_NOREMOTE },
438*bbaa8b60SDan Kruchinin 
439*bbaa8b60SDan Kruchinin 	/*
440*bbaa8b60SDan Kruchinin 	 * Version 3 (NLM_VERSX) entries.
441*bbaa8b60SDan Kruchinin 	 */
442*bbaa8b60SDan Kruchinin 
443*bbaa8b60SDan Kruchinin 	{ /* 19: not used */
444*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(0),
445*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
446*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
447*bbaa8b60SDan Kruchinin 	NULL,
448*bbaa8b60SDan Kruchinin 	0,
449*bbaa8b60SDan Kruchinin 	0 },
450*bbaa8b60SDan Kruchinin 
451*bbaa8b60SDan Kruchinin 	{ /* 20: NLM_SHARE */
452*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_share_3_svc),
453*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_shareargs,
454*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_shareres,
455*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm_shareres_free),
456*bbaa8b60SDan Kruchinin 	sizeof (nlm_shareres),
457*bbaa8b60SDan Kruchinin 	0 },
458*bbaa8b60SDan Kruchinin 
459*bbaa8b60SDan Kruchinin 	{ /* 21: NLM_UNSHARE */
460*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_unshare_3_svc),
461*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_shareargs,
462*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_shareres,
463*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm_shareres_free),
464*bbaa8b60SDan Kruchinin 	sizeof (nlm_shareres),
465*bbaa8b60SDan Kruchinin 	0 },
466*bbaa8b60SDan Kruchinin 
467*bbaa8b60SDan Kruchinin 	{ /* 22: NLM_NM_LOCK */
468*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_nm_lock_3_svc),
469*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_lockargs,
470*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_res,
471*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm_res_free),
472*bbaa8b60SDan Kruchinin 	sizeof (nlm_res),
473*bbaa8b60SDan Kruchinin 	0 },
474*bbaa8b60SDan Kruchinin 
475*bbaa8b60SDan Kruchinin 	{ /* 23: NLM_FREE_ALL */
476*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_free_all_3_svc),
477*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm_notify,
478*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_void,
479*bbaa8b60SDan Kruchinin 	NULL,
480*bbaa8b60SDan Kruchinin 	0,
481*bbaa8b60SDan Kruchinin 	0 },
482*bbaa8b60SDan Kruchinin };
483*bbaa8b60SDan Kruchinin static int nlm_prog_3_dtsize =
484*bbaa8b60SDan Kruchinin 	sizeof (nlm_prog_3_dtable) /
485*bbaa8b60SDan Kruchinin 	sizeof (nlm_prog_3_dtable[0]);
486*bbaa8b60SDan Kruchinin 
487*bbaa8b60SDan Kruchinin /*
488*bbaa8b60SDan Kruchinin  * RPC dispatch function for nlm_prot versions: 1,2,3
489*bbaa8b60SDan Kruchinin  */
490*bbaa8b60SDan Kruchinin void
nlm_prog_3(struct svc_req * rqstp,register SVCXPRT * transp)491*bbaa8b60SDan Kruchinin nlm_prog_3(struct svc_req *rqstp, register SVCXPRT *transp)
492*bbaa8b60SDan Kruchinin {
493*bbaa8b60SDan Kruchinin 	const struct dispatch_entry *de;
494*bbaa8b60SDan Kruchinin 	rpcproc_t max_proc;
495*bbaa8b60SDan Kruchinin 
496*bbaa8b60SDan Kruchinin 	switch (rqstp->rq_vers) {
497*bbaa8b60SDan Kruchinin 	case NLM_VERS:
498*bbaa8b60SDan Kruchinin 		max_proc = NLM_GRANTED_RES;
499*bbaa8b60SDan Kruchinin 		break;
500*bbaa8b60SDan Kruchinin 	case NLM_SM:
501*bbaa8b60SDan Kruchinin 		max_proc = NLM_SM_NOTIFY2;
502*bbaa8b60SDan Kruchinin 		break;
503*bbaa8b60SDan Kruchinin 	case NLM_VERSX:
504*bbaa8b60SDan Kruchinin 		max_proc = NLM_FREE_ALL;
505*bbaa8b60SDan Kruchinin 		break;
506*bbaa8b60SDan Kruchinin 	default:
507*bbaa8b60SDan Kruchinin 		/* Our svc registration should prevent this. */
508*bbaa8b60SDan Kruchinin 		ASSERT(0); /* paranoid */
509*bbaa8b60SDan Kruchinin 		svcerr_noprog(transp);
510*bbaa8b60SDan Kruchinin 		return;
511*bbaa8b60SDan Kruchinin 	}
512*bbaa8b60SDan Kruchinin 	ASSERT(max_proc < nlm_prog_3_dtsize);
513*bbaa8b60SDan Kruchinin 
514*bbaa8b60SDan Kruchinin 	if (rqstp->rq_proc > max_proc) {
515*bbaa8b60SDan Kruchinin 		svcerr_noproc(transp);
516*bbaa8b60SDan Kruchinin 		return;
517*bbaa8b60SDan Kruchinin 	}
518*bbaa8b60SDan Kruchinin 
519*bbaa8b60SDan Kruchinin 	de = &nlm_prog_3_dtable[rqstp->rq_proc];
520*bbaa8b60SDan Kruchinin 
521*bbaa8b60SDan Kruchinin 	nlm_dispatch(rqstp, transp, de);
522*bbaa8b60SDan Kruchinin }
523*bbaa8b60SDan Kruchinin 
524*bbaa8b60SDan Kruchinin /*
525*bbaa8b60SDan Kruchinin  * Dispatch table for version 4 (NLM4_VERS)
526*bbaa8b60SDan Kruchinin  */
527*bbaa8b60SDan Kruchinin static const struct dispatch_entry
528*bbaa8b60SDan Kruchinin nlm_prog_4_dtable[] = {
529*bbaa8b60SDan Kruchinin 
530*bbaa8b60SDan Kruchinin 	{ /* 0: NULLPROC */
531*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm_null_svc),
532*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_void,
533*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_void,
534*bbaa8b60SDan Kruchinin 	NULL,
535*bbaa8b60SDan Kruchinin 	0,
536*bbaa8b60SDan Kruchinin 	0 },
537*bbaa8b60SDan Kruchinin 
538*bbaa8b60SDan Kruchinin 	{ /* 1: NLM4_TEST */
539*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_test_4_svc),
540*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_testargs,
541*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_testres,
542*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm4_testres_free),
543*bbaa8b60SDan Kruchinin 	sizeof (nlm4_testres),
544*bbaa8b60SDan Kruchinin 	0 },
545*bbaa8b60SDan Kruchinin 
546*bbaa8b60SDan Kruchinin 	{ /* 2: NLM4_LOCK */
547*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_lock_4_svc),
548*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_lockargs,
549*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_res,
550*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm4_res_free),
551*bbaa8b60SDan Kruchinin 	sizeof (nlm4_res),
552*bbaa8b60SDan Kruchinin 	0 },
553*bbaa8b60SDan Kruchinin 
554*bbaa8b60SDan Kruchinin 	{ /* 3: NLM4_CANCEL */
555*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_cancel_4_svc),
556*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_cancargs,
557*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_res,
558*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm4_res_free),
559*bbaa8b60SDan Kruchinin 	sizeof (nlm4_res),
560*bbaa8b60SDan Kruchinin 	0 },
561*bbaa8b60SDan Kruchinin 
562*bbaa8b60SDan Kruchinin 	{ /* 4: NLM4_UNLOCK */
563*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_unlock_4_svc),
564*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_unlockargs,
565*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_res,
566*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm4_res_free),
567*bbaa8b60SDan Kruchinin 	sizeof (nlm4_res),
568*bbaa8b60SDan Kruchinin 	0 },
569*bbaa8b60SDan Kruchinin 
570*bbaa8b60SDan Kruchinin 	{ /* 5: NLM4_GRANTED */
571*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_granted_4_svc),
572*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_testargs,
573*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_res,
574*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm4_res_free),
575*bbaa8b60SDan Kruchinin 	sizeof (nlm4_res),
576*bbaa8b60SDan Kruchinin 	0 },
577*bbaa8b60SDan Kruchinin 
578*bbaa8b60SDan Kruchinin 	/*
579*bbaa8b60SDan Kruchinin 	 * All the _MSG and _RES entries are "one way" calls that
580*bbaa8b60SDan Kruchinin 	 * skip the usual RPC reply.  We give them a null xdr_res
581*bbaa8b60SDan Kruchinin 	 * function so the dispatcher will not send a reply.
582*bbaa8b60SDan Kruchinin 	 */
583*bbaa8b60SDan Kruchinin 
584*bbaa8b60SDan Kruchinin 	{ /* 6: NLM4_TEST_MSG */
585*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_test_msg_4_svc),
586*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_testargs,
587*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
588*bbaa8b60SDan Kruchinin 	NULL,
589*bbaa8b60SDan Kruchinin 	0,
590*bbaa8b60SDan Kruchinin 	0 },
591*bbaa8b60SDan Kruchinin 
592*bbaa8b60SDan Kruchinin 	{ /* 7: NLM4_LOCK_MSG */
593*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_lock_msg_4_svc),
594*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_lockargs,
595*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
596*bbaa8b60SDan Kruchinin 	NULL,
597*bbaa8b60SDan Kruchinin 	0,
598*bbaa8b60SDan Kruchinin 	0 },
599*bbaa8b60SDan Kruchinin 
600*bbaa8b60SDan Kruchinin 	{ /* 8: NLM4_CANCEL_MSG */
601*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_cancel_msg_4_svc),
602*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_cancargs,
603*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
604*bbaa8b60SDan Kruchinin 	NULL,
605*bbaa8b60SDan Kruchinin 	0,
606*bbaa8b60SDan Kruchinin 	0 },
607*bbaa8b60SDan Kruchinin 
608*bbaa8b60SDan Kruchinin 	{ /* 9: NLM4_UNLOCK_MSG */
609*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_unlock_msg_4_svc),
610*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_unlockargs,
611*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
612*bbaa8b60SDan Kruchinin 	NULL,
613*bbaa8b60SDan Kruchinin 	0,
614*bbaa8b60SDan Kruchinin 	0 },
615*bbaa8b60SDan Kruchinin 
616*bbaa8b60SDan Kruchinin 	{ /* 10: NLM4_GRANTED_MSG */
617*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_granted_msg_4_svc),
618*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_testargs,
619*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
620*bbaa8b60SDan Kruchinin 	NULL,
621*bbaa8b60SDan Kruchinin 	0,
622*bbaa8b60SDan Kruchinin 	0 },
623*bbaa8b60SDan Kruchinin 
624*bbaa8b60SDan Kruchinin 	{ /* 11: NLM4_TEST_RES */
625*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_test_res_4_svc),
626*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_testres,
627*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
628*bbaa8b60SDan Kruchinin 	NULL,
629*bbaa8b60SDan Kruchinin 	0,
630*bbaa8b60SDan Kruchinin 	0 },
631*bbaa8b60SDan Kruchinin 
632*bbaa8b60SDan Kruchinin 	{ /* 12: NLM4_LOCK_RES */
633*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_lock_res_4_svc),
634*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_res,
635*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
636*bbaa8b60SDan Kruchinin 	NULL,
637*bbaa8b60SDan Kruchinin 	0,
638*bbaa8b60SDan Kruchinin 	0 },
639*bbaa8b60SDan Kruchinin 
640*bbaa8b60SDan Kruchinin 	{ /* 13: NLM4_CANCEL_RES */
641*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_cancel_res_4_svc),
642*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_res,
643*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
644*bbaa8b60SDan Kruchinin 	NULL,
645*bbaa8b60SDan Kruchinin 	0,
646*bbaa8b60SDan Kruchinin 	0 },
647*bbaa8b60SDan Kruchinin 
648*bbaa8b60SDan Kruchinin 	{ /* 14: NLM4_UNLOCK_RES */
649*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_unlock_res_4_svc),
650*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_res,
651*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
652*bbaa8b60SDan Kruchinin 	NULL,
653*bbaa8b60SDan Kruchinin 	0,
654*bbaa8b60SDan Kruchinin 	0 },
655*bbaa8b60SDan Kruchinin 
656*bbaa8b60SDan Kruchinin 	{ /* 15: NLM4_GRANTED_RES */
657*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_granted_res_4_svc),
658*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_res,
659*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
660*bbaa8b60SDan Kruchinin 	NULL,
661*bbaa8b60SDan Kruchinin 	0,
662*bbaa8b60SDan Kruchinin 	0 },
663*bbaa8b60SDan Kruchinin 
664*bbaa8b60SDan Kruchinin 	{ /* 16: not used */
665*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(0),
666*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
667*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
668*bbaa8b60SDan Kruchinin 	NULL,
669*bbaa8b60SDan Kruchinin 	0,
670*bbaa8b60SDan Kruchinin 	0 },
671*bbaa8b60SDan Kruchinin 
672*bbaa8b60SDan Kruchinin 	{ /* 17: NLM_SM_NOTIFY1 (not in v4) */
673*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(0),
674*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
675*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
676*bbaa8b60SDan Kruchinin 	NULL,
677*bbaa8b60SDan Kruchinin 	0,
678*bbaa8b60SDan Kruchinin 	0 },
679*bbaa8b60SDan Kruchinin 
680*bbaa8b60SDan Kruchinin 	{ /* 18: NLM_SM_NOTIFY2 (not in v4) */
681*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(0),
682*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
683*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
684*bbaa8b60SDan Kruchinin 	NULL,
685*bbaa8b60SDan Kruchinin 	0,
686*bbaa8b60SDan Kruchinin 	0 },
687*bbaa8b60SDan Kruchinin 
688*bbaa8b60SDan Kruchinin 	{ /* 19: not used */
689*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(0),
690*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
691*bbaa8b60SDan Kruchinin 	(xdrproc_t)0,
692*bbaa8b60SDan Kruchinin 	NULL,
693*bbaa8b60SDan Kruchinin 	0,
694*bbaa8b60SDan Kruchinin 	0 },
695*bbaa8b60SDan Kruchinin 
696*bbaa8b60SDan Kruchinin 	{ /* 20: NLM4_SHARE */
697*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_share_4_svc),
698*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_shareargs,
699*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_shareres,
700*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm4_shareres_free),
701*bbaa8b60SDan Kruchinin 	sizeof (nlm4_shareres),
702*bbaa8b60SDan Kruchinin 	0 },
703*bbaa8b60SDan Kruchinin 
704*bbaa8b60SDan Kruchinin 	{ /* 21: NLM4_UNSHARE */
705*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_unshare_4_svc),
706*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_shareargs,
707*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_shareres,
708*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm4_shareres_free),
709*bbaa8b60SDan Kruchinin 	sizeof (nlm4_shareres),
710*bbaa8b60SDan Kruchinin 	0 },
711*bbaa8b60SDan Kruchinin 
712*bbaa8b60SDan Kruchinin 	{ /* 22: NLM4_NM_LOCK */
713*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_nm_lock_4_svc),
714*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_lockargs,
715*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_res,
716*bbaa8b60SDan Kruchinin 	NLM_FREERES_FUNC(nlm4_res_free),
717*bbaa8b60SDan Kruchinin 	sizeof (nlm4_res),
718*bbaa8b60SDan Kruchinin 	0 },
719*bbaa8b60SDan Kruchinin 
720*bbaa8b60SDan Kruchinin 	{ /* 23: NLM4_FREE_ALL */
721*bbaa8b60SDan Kruchinin 	NLM_SVC_FUNC(nlm4_free_all_4_svc),
722*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_nlm4_notify,
723*bbaa8b60SDan Kruchinin 	(xdrproc_t)xdr_void,
724*bbaa8b60SDan Kruchinin 	NULL,
725*bbaa8b60SDan Kruchinin 	0,
726*bbaa8b60SDan Kruchinin 	0 },
727*bbaa8b60SDan Kruchinin };
728*bbaa8b60SDan Kruchinin static int nlm_prog_4_dtsize =
729*bbaa8b60SDan Kruchinin 	sizeof (nlm_prog_4_dtable) /
730*bbaa8b60SDan Kruchinin 	sizeof (nlm_prog_4_dtable[0]);
731*bbaa8b60SDan Kruchinin 
732*bbaa8b60SDan Kruchinin /*
733*bbaa8b60SDan Kruchinin  * RPC dispatch function for nlm_prot version 4.
734*bbaa8b60SDan Kruchinin  */
735*bbaa8b60SDan Kruchinin void
nlm_prog_4(struct svc_req * rqstp,register SVCXPRT * transp)736*bbaa8b60SDan Kruchinin nlm_prog_4(struct svc_req *rqstp, register SVCXPRT *transp)
737*bbaa8b60SDan Kruchinin {
738*bbaa8b60SDan Kruchinin 	const struct dispatch_entry *de;
739*bbaa8b60SDan Kruchinin 
740*bbaa8b60SDan Kruchinin 	if (rqstp->rq_vers != NLM4_VERS) {
741*bbaa8b60SDan Kruchinin 		/* Our svc registration should prevent this. */
742*bbaa8b60SDan Kruchinin 		ASSERT(0); /* paranoid */
743*bbaa8b60SDan Kruchinin 		svcerr_noprog(transp);
744*bbaa8b60SDan Kruchinin 		return;
745*bbaa8b60SDan Kruchinin 	}
746*bbaa8b60SDan Kruchinin 
747*bbaa8b60SDan Kruchinin 	if (rqstp->rq_proc >= nlm_prog_4_dtsize) {
748*bbaa8b60SDan Kruchinin 		svcerr_noproc(transp);
749*bbaa8b60SDan Kruchinin 		return;
750*bbaa8b60SDan Kruchinin 	}
751*bbaa8b60SDan Kruchinin 
752*bbaa8b60SDan Kruchinin 	de = &nlm_prog_4_dtable[rqstp->rq_proc];
753*bbaa8b60SDan Kruchinin 
754*bbaa8b60SDan Kruchinin 	nlm_dispatch(rqstp, transp, de);
755*bbaa8b60SDan Kruchinin }
756