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 * Copyright (C) 1986, 1992, 1993, 1997, 1999 by Sun Microsystems, Inc.
24 * All rights reserved.
25 *
26 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
27 *
28 * Protocol used between local lock manager and remote lock manager.
29 *
30 * There are currently 3 versions of the protocol in use. Versions 1
31 * and 3 are used with NFS version 2. Version 4 is used with NFS
32 * version 3.
33 *
34 * (Note: there is also a version 2, but it defines an orthogonal set of
35 * procedures that the status monitor uses to notify the lock manager of
36 * changes in monitored systems.)
37 */
38
39 #if RPC_HDR
40 %
41 %#include <rpc/rpc_sztypes.h>
42 %
43 #endif
44
45 #ifdef RPC_HDR
46 %#define LM_MAXSTRLEN 1024
47 %#define LM_MAXNAMELEN (LM_MAXSTRLEN + 1)
48 #endif
49
50 /*
51 * Types for versions 1 and 3.
52 */
53
54 /*
55 * Status of a call to the lock manager. The lower case enums violate the
56 * current style guide, but we're stuck with 'em.
57 */
58
59 enum nlm_stats {
60 nlm_granted = 0,
61 nlm_denied = 1,
62 nlm_denied_nolocks = 2,
63 nlm_blocked = 3,
64 nlm_denied_grace_period = 4,
65 nlm_deadlck = 5
66 };
67
68 /*
69 * The holder of a conflicting lock.
70 */
71
72 struct nlm_holder {
73 bool exclusive;
74 int svid;
75 netobj oh;
76 unsigned l_offset;
77 unsigned l_len;
78 };
79
80 union nlm_testrply switch (nlm_stats stat) {
81 case nlm_denied:
82 struct nlm_holder holder;
83 default:
84 void;
85 };
86
87 struct nlm_stat {
88 nlm_stats stat;
89 };
90
91 struct nlm_res {
92 netobj cookie;
93 nlm_stat stat;
94 };
95
96 struct nlm_testres {
97 netobj cookie;
98 nlm_testrply stat;
99 };
100
101 struct nlm_lock {
102 string caller_name<LM_MAXSTRLEN>;
103 netobj fh; /* identify a file */
104 netobj oh; /* identify owner of a lock */
105 int svid; /* generated from pid for svid */
106 unsigned l_offset;
107 unsigned l_len;
108 };
109
110 struct nlm_lockargs {
111 netobj cookie;
112 bool block;
113 bool exclusive;
114 struct nlm_lock alock;
115 bool reclaim; /* used for recovering locks */
116 int state; /* specify local status monitor state */
117 };
118
119 struct nlm_cancargs {
120 netobj cookie;
121 bool block;
122 bool exclusive;
123 struct nlm_lock alock;
124 };
125
126 struct nlm_testargs {
127 netobj cookie;
128 bool exclusive;
129 struct nlm_lock alock;
130 };
131
132 struct nlm_unlockargs {
133 netobj cookie;
134 struct nlm_lock alock;
135 };
136
137 #ifdef RPC_HDR
138 %/*
139 % * The following enums are actually bit encoded for efficient
140 % * boolean algebra.... DON'T change them.....
141 % * The mixed-case enums violate the present style guide, but we're
142 % * stuck with 'em.
143 % */
144 #endif
145
146 enum fsh_mode {
147 fsm_DN = 0, /* deny none */
148 fsm_DR = 1, /* deny read */
149 fsm_DW = 2, /* deny write */
150 fsm_DRW = 3 /* deny read/write */
151 };
152
153 enum fsh_access {
154 fsa_NONE = 0, /* for completeness */
155 fsa_R = 1, /* read only */
156 fsa_W = 2, /* write only */
157 fsa_RW = 3 /* read/write */
158 };
159
160 struct nlm_share {
161 string caller_name<LM_MAXSTRLEN>;
162 netobj fh;
163 netobj oh;
164 fsh_mode mode;
165 fsh_access access;
166 };
167
168 struct nlm_shareargs {
169 netobj cookie;
170 nlm_share share;
171 bool reclaim;
172 };
173
174 struct nlm_shareres {
175 netobj cookie;
176 nlm_stats stat;
177 int sequence;
178 };
179
180 struct nlm_notify {
181 string name<LM_MAXNAMELEN>;
182 int state;
183 };
184
185 /*
186 * Types for version 4.
187 *
188 * This revision is designed to work with NFS V3. The main changes from
189 * NFS V2 to V3 that affect the NLM protocol are that all file offsets
190 * and sizes are now unsigned 64-bit ints, and file handles are now
191 * variable length. In NLM V1 and V3, the fixed-length V2 file handle
192 * was encoded as a 'netobj', which is a count followed by the data
193 * bytes. For NLM 4, the file handle is already a count followed by
194 * data bytes, so the handle is copied directly into the netobj, rather
195 * than being encoded with an additional byte count.
196 */
197
198 /*
199 * Status of a call to the lock manager.
200 */
201
202 enum nlm4_stats {
203 nlm4_granted = 0, /* lock was granted */
204 nlm4_denied = 1, /* lock was not granted, usually */
205 /* due to conflicting lock */
206 nlm4_denied_nolocks = 2, /* not granted: out of resources */
207 nlm4_blocked = 3, /* not granted: expect callback */
208 /* when granted */
209 nlm4_denied_grace_period = 4, /* not granted: server is */
210 /* reestablishing old locks */
211 nlm4_deadlck = 5, /* not granted: deadlock detected */
212 nlm4_rofs = 6, /* not granted: read-only filesystem */
213 nlm4_stale_fh = 7, /* not granted: stale file handle */
214 nlm4_fbig = 8, /* not granted: offset or length */
215 /* too big */
216 nlm4_failed = 9 /* not granted: some other error */
217 };
218
219 /*
220 * The holder of a conflicting lock.
221 */
222
223 struct nlm4_holder {
224 bool exclusive;
225 int32 svid;
226 netobj oh;
227 uint64 l_offset;
228 uint64 l_len;
229 };
230
231 union nlm4_testrply switch (nlm4_stats stat) {
232 case nlm4_denied:
233 struct nlm4_holder holder;
234 default:
235 void;
236 };
237
238 struct nlm4_stat {
239 nlm4_stats stat;
240 };
241
242 struct nlm4_res {
243 netobj cookie;
244 nlm4_stat stat;
245 };
246
247 struct nlm4_testres {
248 netobj cookie;
249 nlm4_testrply stat;
250 };
251
252 struct nlm4_lock {
253 string caller_name<LM_MAXSTRLEN>;
254 netobj fh; /* identify a file */
255 netobj oh; /* identify owner of a lock */
256 int32 svid; /* generated from pid for svid */
257 uint64 l_offset;
258 uint64 l_len;
259 };
260
261 struct nlm4_lockargs {
262 netobj cookie;
263 bool block;
264 bool exclusive;
265 struct nlm4_lock alock;
266 bool reclaim; /* used for recovering locks */
267 int32 state; /* specify local status monitor state */
268 };
269
270 struct nlm4_cancargs {
271 netobj cookie;
272 bool block;
273 bool exclusive;
274 struct nlm4_lock alock;
275 };
276
277 struct nlm4_testargs {
278 netobj cookie;
279 bool exclusive;
280 struct nlm4_lock alock;
281 };
282
283 struct nlm4_unlockargs {
284 netobj cookie;
285 struct nlm4_lock alock;
286 };
287
288 struct nlm4_share {
289 string caller_name<LM_MAXSTRLEN>;
290 netobj fh;
291 netobj oh;
292 fsh_mode mode;
293 fsh_access access;
294 };
295
296 struct nlm4_shareargs {
297 netobj cookie;
298 nlm4_share share;
299 bool reclaim;
300 };
301
302 struct nlm4_shareres {
303 netobj cookie;
304 nlm4_stats stat;
305 int32 sequence;
306 };
307
308 struct nlm4_notify {
309 string name<LM_MAXNAMELEN>;
310 int32 state;
311 };
312
313 /*
314 * Argument for the NLM call-back procedure called by rpc.statd
315 * when a monitored host status changes. The statd calls the
316 * NLM prog,vers,proc specified in the SM_MON call.
317 * NB: This struct must exactly match sm_inter.x:sm_status
318 * and requires LM_MAXSTRLEN == SM_MAXSTRLEN
319 */
320 struct nlm_sm_status {
321 string mon_name<LM_MAXSTRLEN>; /* name of host */
322 int32 state; /* new state */
323 opaque priv[16]; /* private data */
324 };
325
326 /*
327 * Over-the-wire protocol used between the network lock managers
328 */
329
330 program NLM_PROG {
331
332 version NLM_VERS {
333
334 void
335 NLM_NULL(void) = 0;
336
337 nlm_testres
338 NLM_TEST(nlm_testargs) = 1;
339
340 nlm_res
341 NLM_LOCK(nlm_lockargs) = 2;
342
343 nlm_res
344 NLM_CANCEL(nlm_cancargs) = 3;
345
346 nlm_res
347 NLM_UNLOCK(nlm_unlockargs) = 4;
348 /*
349 * remote lock manager call-back to grant lock
350 */
351 nlm_res
352 NLM_GRANTED(nlm_testargs) = 5;
353
354 /*
355 * message passing style of requesting lock
356 */
357
358 void
359 NLM_TEST_MSG(nlm_testargs) = 6;
360 void
361 NLM_LOCK_MSG(nlm_lockargs) = 7;
362 void
363 NLM_CANCEL_MSG(nlm_cancargs) = 8;
364 void
365 NLM_UNLOCK_MSG(nlm_unlockargs) = 9;
366 void
367 NLM_GRANTED_MSG(nlm_testargs) = 10;
368 void
369 NLM_TEST_RES(nlm_testres) = 11;
370 void
371 NLM_LOCK_RES(nlm_res) = 12;
372 void
373 NLM_CANCEL_RES(nlm_res) = 13;
374 void
375 NLM_UNLOCK_RES(nlm_res) = 14;
376 void
377 NLM_GRANTED_RES(nlm_res) = 15;
378 } = 1;
379
380 /*
381 * Private (loopback-only) call-backs from statd,
382 * used to notify that some machine has restarted.
383 * The meaning of these is up to the lock manager
384 * implemenation. (See the SM_MON calls.)
385 */
386 version NLM_SM {
387 void NLM_SM_NOTIFY1(struct nlm_sm_status) = 17;
388 void NLM_SM_NOTIFY2(struct nlm_sm_status) = 18;
389 } = 2;
390
391 version NLM_VERSX {
392 nlm_shareres
393 NLM_SHARE(nlm_shareargs) = 20;
394 nlm_shareres
395 NLM_UNSHARE(nlm_shareargs) = 21;
396 nlm_res
397 NLM_NM_LOCK(nlm_lockargs) = 22;
398 void
399 NLM_FREE_ALL(nlm_notify) = 23;
400 } = 3;
401
402 version NLM4_VERS {
403 void
404 NLM4_NULL(void) = 0;
405 nlm4_testres
406 NLM4_TEST(nlm4_testargs) = 1;
407 nlm4_res
408 NLM4_LOCK(nlm4_lockargs) = 2;
409 nlm4_res
410 NLM4_CANCEL(nlm4_cancargs) = 3;
411 nlm4_res
412 NLM4_UNLOCK(nlm4_unlockargs) = 4;
413 /*
414 * remote lock manager call-back to grant lock
415 */
416 nlm4_res
417 NLM4_GRANTED(nlm4_testargs) = 5;
418
419 /*
420 * message passing style of requesting lock
421 */
422
423 void
424 NLM4_TEST_MSG(nlm4_testargs) = 6;
425 void
426 NLM4_LOCK_MSG(nlm4_lockargs) = 7;
427 void
428 NLM4_CANCEL_MSG(nlm4_cancargs) = 8;
429 void
430 NLM4_UNLOCK_MSG(nlm4_unlockargs) = 9;
431 void
432 NLM4_GRANTED_MSG(nlm4_testargs) = 10;
433 void
434 NLM4_TEST_RES(nlm4_testres) = 11;
435 void
436 NLM4_LOCK_RES(nlm4_res) = 12;
437 void
438 NLM4_CANCEL_RES(nlm4_res) = 13;
439 void
440 NLM4_UNLOCK_RES(nlm4_res) = 14;
441 void
442 NLM4_GRANTED_RES(nlm4_res) = 15;
443
444 /*
445 * DOS-style file sharing
446 */
447
448 nlm4_shareres
449 NLM4_SHARE(nlm4_shareargs) = 20;
450 nlm4_shareres
451 NLM4_UNSHARE(nlm4_shareargs) = 21;
452 nlm4_res
453 NLM4_NM_LOCK(nlm4_lockargs) = 22;
454 void
455 NLM4_FREE_ALL(nlm4_notify) = 23;
456 } = 4;
457
458 } = 100021;