xref: /onnv-gate/usr/src/head/rpcsvc/nlm_prot.x (revision 0:68f95e015346)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Network lock manager protocol definition
24  * Copyright (C) 1986, 1992, 1993, 1997, 1999 by Sun Microsystems, Inc.
25  * All rights reserved.
26  *
27  * Protocol used between local lock manager and remote lock manager.
28  *
29  * There are currently 3 versions of the protocol in use.  Versions 1
30  * and 3 are used with NFS version 2.  Version 4 is used with NFS
31  * version 3.
32  *
33  * (Note: there is also a version 2, but it defines an orthogonal set of
34  * procedures that the status monitor uses to notify the lock manager of
35  * changes in monitored systems.)
36  */
37 
38 %#pragma ident	"%Z%%M%	%I%	%E% SMI"
39 
40 #if RPC_HDR
41 %
42 %#include <rpc/rpc_sztypes.h>
43 %
44 #endif
45 
46 #ifdef RPC_HDR
47 %#define LM_MAXSTRLEN	1024
48 %#define LM_MAXNAMELEN	(LM_MAXSTRLEN + 1)
49 #endif
50 
51 /*
52  * Types for versions 1 and 3.
53  */
54 
55 /*
56  * Status of a call to the lock manager.  The lower case enums violate the
57  * current style guide, but we're stuck with 'em.
58  */
59 
60 enum nlm_stats {
61 	nlm_granted = 0,
62 	nlm_denied = 1,
63 	nlm_denied_nolocks = 2,
64 	nlm_blocked = 3,
65 	nlm_denied_grace_period = 4,
66 	nlm_deadlck = 5
67 };
68 
69 /*
70  * The holder of a conflicting lock.
71  */
72 
73 struct nlm_holder {
74 	bool exclusive;
75 	int svid;
76 	netobj oh;
77 	unsigned l_offset;
78 	unsigned l_len;
79 };
80 
81 union nlm_testrply switch (nlm_stats stat) {
82 	case nlm_denied:
83 		struct nlm_holder holder;
84 	default:
85 		void;
86 };
87 
88 struct nlm_stat {
89 	nlm_stats stat;
90 };
91 
92 struct nlm_res {
93 	netobj cookie;
94 	nlm_stat stat;
95 };
96 
97 struct nlm_testres {
98 	netobj cookie;
99 	nlm_testrply stat;
100 };
101 
102 struct nlm_lock {
103 	string caller_name<LM_MAXSTRLEN>;
104 	netobj fh;		/* identify a file */
105 	netobj oh;		/* identify owner of a lock */
106 	int svid;		/* generated from pid for svid */
107 	unsigned l_offset;
108 	unsigned l_len;
109 };
110 
111 struct nlm_lockargs {
112 	netobj cookie;
113 	bool block;
114 	bool exclusive;
115 	struct nlm_lock alock;
116 	bool reclaim;		/* used for recovering locks */
117 	int state;		/* specify local status monitor state */
118 };
119 
120 struct nlm_cancargs {
121 	netobj cookie;
122 	bool block;
123 	bool exclusive;
124 	struct nlm_lock alock;
125 };
126 
127 struct nlm_testargs {
128 	netobj cookie;
129 	bool exclusive;
130 	struct nlm_lock alock;
131 };
132 
133 struct nlm_unlockargs {
134 	netobj cookie;
135 	struct nlm_lock alock;
136 };
137 
138 #ifdef RPC_HDR
139 %/*
140 % * The following enums are actually bit encoded for efficient
141 % * boolean algebra.... DON'T change them.....
142 % * The mixed-case enums violate the present style guide, but we're
143 % * stuck with 'em.
144 % */
145 #endif
146 
147 enum	fsh_mode {
148 	fsm_DN  = 0,	/* deny none */
149 	fsm_DR  = 1,	/* deny read */
150 	fsm_DW  = 2,	/* deny write */
151 	fsm_DRW = 3	/* deny read/write */
152 };
153 
154 enum	fsh_access {
155 	fsa_NONE = 0,	/* for completeness */
156 	fsa_R    = 1,	/* read only */
157 	fsa_W    = 2,	/* write only */
158 	fsa_RW   = 3	/* read/write */
159 };
160 
161 struct	nlm_share {
162 	string caller_name<LM_MAXSTRLEN>;
163 	netobj	fh;
164 	netobj	oh;
165 	fsh_mode	mode;
166 	fsh_access	access;
167 };
168 
169 struct	nlm_shareargs {
170 	netobj	cookie;
171 	nlm_share	share;
172 	bool	reclaim;
173 };
174 
175 struct	nlm_shareres {
176 	netobj	cookie;
177 	nlm_stats	stat;
178 	int	sequence;
179 };
180 
181 struct	nlm_notify {
182 	string name<LM_MAXNAMELEN>;
183 	int state;
184 };
185 
186 /*
187  * Types for version 4.
188  *
189  * This revision is designed to work with NFS V3.  The main changes from
190  * NFS V2 to V3 that affect the NLM protocol are that all file offsets
191  * and sizes are now unsigned 64-bit ints, and file handles are now
192  * variable length.  In NLM V1 and V3, the fixed-length V2 file handle
193  * was encoded as a 'netobj', which is a count followed by the data
194  * bytes.  For NLM 4, the file handle is already a count followed by
195  * data bytes, so the handle is copied directly into the netobj, rather
196  * than being encoded with an additional byte count.
197  */
198 
199 /*
200  * Status of a call to the lock manager.
201  */
202 
203 enum nlm4_stats {
204 	NLM4_GRANTED = 0,		/* lock was granted */
205 	NLM4_DENIED = 1,		/* lock was not granted, usually */
206 					/* due to conflicting lock */
207 	NLM4_DENIED_NOLOCKS = 2,	/* not granted: out of resources */
208 	NLM4_BLOCKED = 3,		/* not granted: expect callback */
209 					/* when granted */
210 	NLM4_DENIED_GRACE_PERIOD = 4,	/* not granted: server is */
211 					/* reestablishing old locks */
212 	NLM4_DEADLCK = 5,		/* not granted: deadlock detected */
213 	NLM4_ROFS = 6,			/* not granted: read-only filesystem */
214 	NLM4_STALE_FH = 7,		/* not granted: stale file handle */
215 	NLM4_FBIG = 8,			/* not granted: offset or length */
216 					/* too big */
217 	NLM4_FAILED = 9			/* not granted: some other error */
218 };
219 
220 /*
221  * The holder of a conflicting lock.
222  */
223 
224 struct nlm4_holder {
225 	bool exclusive;
226 	int32 svid;
227 	netobj oh;
228 	uint64 l_offset;
229 	uint64 l_len;
230 };
231 
232 union nlm4_testrply switch (nlm4_stats stat) {
233 	case NLM4_DENIED:
234 		struct nlm4_holder holder;
235 	default:
236 		void;
237 };
238 
239 struct nlm4_stat {
240 	nlm4_stats stat;
241 };
242 
243 struct nlm4_res {
244 	netobj cookie;
245 	nlm4_stat stat;
246 };
247 
248 struct nlm4_testres {
249 	netobj cookie;
250 	nlm4_testrply stat;
251 };
252 
253 struct nlm4_lock {
254 	string caller_name<LM_MAXSTRLEN>;
255 	netobj fh;		/* identify a file */
256 	netobj oh;		/* identify owner of a lock */
257 	int32 svid;		/* generated from pid for svid */
258 	uint64 l_offset;
259 	uint64 l_len;
260 };
261 
262 struct nlm4_lockargs {
263 	netobj cookie;
264 	bool block;
265 	bool exclusive;
266 	struct nlm4_lock alock;
267 	bool reclaim;		/* used for recovering locks */
268 	int32 state;		/* specify local status monitor state */
269 };
270 
271 struct nlm4_cancargs {
272 	netobj cookie;
273 	bool block;
274 	bool exclusive;
275 	struct nlm4_lock alock;
276 };
277 
278 struct nlm4_testargs {
279 	netobj cookie;
280 	bool exclusive;
281 	struct nlm4_lock alock;
282 };
283 
284 struct nlm4_unlockargs {
285 	netobj cookie;
286 	struct nlm4_lock alock;
287 };
288 
289 #ifdef RPC_HDR
290 %/*
291 % * The following enums are actually bit encoded for efficient
292 % * boolean algebra.... DON'T change them.....
293 % */
294 #endif
295 
296 enum	fsh4_mode {
297 	FSM_DN  = 0,	/* deny none */
298 	FSM_DR  = 1,	/* deny read */
299 	FSM_DW  = 2,	/* deny write */
300 	FSM_DRW = 3	/* deny read/write */
301 };
302 
303 enum	fsh4_access {
304 	FSA_NONE = 0,	/* for completeness */
305 	FSA_R    = 1,	/* read only */
306 	FSA_W    = 2,	/* write only */
307 	FSA_RW   = 3	/* read/write */
308 };
309 
310 struct	nlm4_share {
311 	string caller_name<LM_MAXSTRLEN>;
312 	netobj	fh;
313 	netobj	oh;
314 	fsh4_mode	mode;
315 	fsh4_access	access;
316 };
317 
318 struct	nlm4_shareargs {
319 	netobj	cookie;
320 	nlm4_share	share;
321 	bool	reclaim;
322 };
323 
324 struct	nlm4_shareres {
325 	netobj	cookie;
326 	nlm4_stats	stat;
327 	int32	sequence;
328 };
329 
330 struct	nlm4_notify {
331 	string name<LM_MAXNAMELEN>;
332 	int32 state;
333 };
334 
335 /*
336  * Over-the-wire protocol used between the network lock managers
337  */
338 
339 program NLM_PROG {
340 	version NLM_VERS {
341 
342 		nlm_testres
343 			NLM_TEST(nlm_testargs) =		1;
344 
345 		nlm_res
346 			NLM_LOCK(nlm_lockargs) =		2;
347 
348 		nlm_res
349 			NLM_CANCEL(nlm_cancargs) =		3;
350 
351 		nlm_res
352 			NLM_UNLOCK(nlm_unlockargs) =		4;
353 		/*
354 		 * remote lock manager call-back to grant lock
355 		 */
356 		nlm_res
357 			NLM_GRANTED(nlm_testargs) =		5;
358 
359 		/*
360 		 * message passing style of requesting lock
361 		 */
362 
363 		void
364 			NLM_TEST_MSG(nlm_testargs) =		6;
365 		void
366 			NLM_LOCK_MSG(nlm_lockargs) =		7;
367 		void
368 			NLM_CANCEL_MSG(nlm_cancargs) =		8;
369 		void
370 			NLM_UNLOCK_MSG(nlm_unlockargs) =	9;
371 		void
372 			NLM_GRANTED_MSG(nlm_testargs) =		10;
373 		void
374 			NLM_TEST_RES(nlm_testres) =		11;
375 		void
376 			NLM_LOCK_RES(nlm_res) =			12;
377 		void
378 			NLM_CANCEL_RES(nlm_res) =		13;
379 		void
380 			NLM_UNLOCK_RES(nlm_res) =		14;
381 		void
382 			NLM_GRANTED_RES(nlm_res) =		15;
383 	} = 1;
384 
385 	version NLM_VERSX {
386 		nlm_shareres
387 			NLM_SHARE(nlm_shareargs) =		20;
388 		nlm_shareres
389 			NLM_UNSHARE(nlm_shareargs) =		21;
390 		nlm_res
391 			NLM_NM_LOCK(nlm_lockargs) =		22;
392 		void
393 			NLM_FREE_ALL(nlm_notify) =		23;
394 	} = 3;
395 
396 	version NLM4_VERS {
397 		void
398 			NLMPROC4_NULL(void) =			0;
399 		nlm4_testres
400 			NLMPROC4_TEST(nlm4_testargs) =		1;
401 		nlm4_res
402 			NLMPROC4_LOCK(nlm4_lockargs) =		2;
403 		nlm4_res
404 			NLMPROC4_CANCEL(nlm4_cancargs) =	3;
405 		nlm4_res
406 			NLMPROC4_UNLOCK(nlm4_unlockargs) =	4;
407 		/*
408 		 * remote lock manager call-back to grant lock
409 		 */
410 		nlm4_res
411 			NLMPROC4_GRANTED(nlm4_testargs) =	5;
412 
413 		/*
414 		 * message passing style of requesting lock
415 		 */
416 
417 		void
418 			NLMPROC4_TEST_MSG(nlm4_testargs) =	6;
419 		void
420 			NLMPROC4_LOCK_MSG(nlm4_lockargs) =	7;
421 		void
422 			NLMPROC4_CANCEL_MSG(nlm4_cancargs) =	8;
423 		void
424 			NLMPROC4_UNLOCK_MSG(nlm4_unlockargs) =	9;
425 		void
426 			NLMPROC4_GRANTED_MSG(nlm4_testargs) =	10;
427 		void
428 			NLMPROC4_TEST_RES(nlm4_testres) =	11;
429 		void
430 			NLMPROC4_LOCK_RES(nlm4_res) =		12;
431 		void
432 			NLMPROC4_CANCEL_RES(nlm4_res) =		13;
433 		void
434 			NLMPROC4_UNLOCK_RES(nlm4_res) =		14;
435 		void
436 			NLMPROC4_GRANTED_RES(nlm4_res) =	15;
437 
438 		/*
439 		 * DOS-style file sharing
440 		 */
441 
442 		nlm4_shareres
443 			NLMPROC4_SHARE(nlm4_shareargs) =	20;
444 		nlm4_shareres
445 			NLMPROC4_UNSHARE(nlm4_shareargs) =	21;
446 		nlm4_res
447 			NLMPROC4_NM_LOCK(nlm4_lockargs) =	22;
448 		void
449 			NLMPROC4_FREE_ALL(nlm4_notify) =	23;
450 	} = 4;
451 
452 } = 100021;
453