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;