Home | History | Annotate | Download | only in rpcsvc
      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) The Internet Society (1998-2003).
     24  *  All Rights Reserved.
     25  */
     26 
     27 /*
     28  *	nfs4_prot.x
     29  */
     30 
     31 %#pragma ident	"@(#)nfs4_prot.x	1.122"
     32 
     33 /*
     34  * Basic typedefs for RFC 1832 data type definitions
     35  */
     36 
     37 /*
     38  * typedef int		int32_t;
     39  * typedef unsigned int	uint32_t;
     40  * typedef hyper		int64_t;
     41  * typedef unsigned hyper	uint64_t;
     42  */
     43 
     44 /*
     45  * Sizes
     46  */
     47 const NFS4_FHSIZE		= 128;
     48 const NFS4_VERIFIER_SIZE	= 8;
     49 const NFS4_OPAQUE_LIMIT		= 1024;
     50 
     51 /*
     52  * File types
     53  */
     54 enum nfs_ftype4 {
     55 	NF4REG		= 1,	/* Regular File */
     56 	NF4DIR		= 2,	/* Directory */
     57 	NF4BLK		= 3,	/* Special File - block device */
     58 	NF4CHR		= 4,	/* Special File - character device */
     59 	NF4LNK		= 5,	/* Symbolic Link */
     60 	NF4SOCK		= 6,	/* Special File - socket */
     61 	NF4FIFO		= 7,	/* Special File - fifo */
     62 	NF4ATTRDIR	= 8,	/* Attribute Directory */
     63 	NF4NAMEDATTR	= 9	/* Named Attribute */
     64 };
     65 
     66 /*
     67  * Error status
     68  */
     69 enum nfsstat4 {
     70 	NFS4_OK			= 0,    /* everything is okay      */
     71 	NFS4ERR_PERM		= 1,    /* caller not privileged   */
     72 	NFS4ERR_NOENT		= 2,    /* no such file/directory  */
     73 	NFS4ERR_IO		= 5,    /* hard I/O error          */
     74 	NFS4ERR_NXIO		= 6,    /* no such device          */
     75 	NFS4ERR_ACCESS		= 13,   /* access denied           */
     76 	NFS4ERR_EXIST		= 17,   /* file already exists     */
     77 	NFS4ERR_XDEV		= 18,   /* different filesystems   */
     78 	/* Unused/reserved        19 */
     79 	NFS4ERR_NOTDIR		= 20,   /* should be a directory   */
     80 	NFS4ERR_ISDIR		= 21,   /* should not be directory */
     81 	NFS4ERR_INVAL		= 22,   /* invalid argument        */
     82 	NFS4ERR_FBIG		= 27,   /* file exceeds server max */
     83 	NFS4ERR_NOSPC		= 28,   /* no space on filesystem  */
     84 	NFS4ERR_ROFS		= 30,   /* read-only filesystem    */
     85 	NFS4ERR_MLINK		= 31,   /* too many hard links     */
     86 	NFS4ERR_NAMETOOLONG	= 63,   /* name exceeds server max */
     87 	NFS4ERR_NOTEMPTY	= 66,   /* directory not empty     */
     88 	NFS4ERR_DQUOT		= 69,   /* hard quota limit reached*/
     89 	NFS4ERR_STALE		= 70,   /* file no longer exists   */
     90 	NFS4ERR_BADHANDLE	= 10001,/* Illegal filehandle      */
     91 	NFS4ERR_BAD_COOKIE	= 10003,/* READDIR cookie is stale */
     92 	NFS4ERR_NOTSUPP		= 10004,/* operation not supported */
     93 	NFS4ERR_TOOSMALL	= 10005,/* response limit exceeded */
     94 	NFS4ERR_SERVERFAULT	= 10006,/* undefined server error  */
     95 	NFS4ERR_BADTYPE		= 10007,/* type invalid for CREATE */
     96 	NFS4ERR_DELAY		= 10008,/* file "busy" - retry     */
     97 	NFS4ERR_SAME		= 10009,/* nverify says attrs same */
     98 	NFS4ERR_DENIED		= 10010,/* lock unavailable	   */
     99 	NFS4ERR_EXPIRED		= 10011,/* lock lease expired	   */
    100 	NFS4ERR_LOCKED		= 10012,/* I/O failed due to lock  */
    101 	NFS4ERR_GRACE		= 10013,/* in grace period	   */
    102 	NFS4ERR_FHEXPIRED	= 10014,/* filehandle expired	   */
    103 	NFS4ERR_SHARE_DENIED	= 10015,/* share reserve denied	   */
    104 	NFS4ERR_WRONGSEC	= 10016,/* wrong security flavor   */
    105 	NFS4ERR_CLID_INUSE	= 10017,/* clientid in use	   */
    106 	NFS4ERR_RESOURCE	= 10018,/* resource exhaustion	   */
    107 	NFS4ERR_MOVED		= 10019,/* filesystem relocated	   */
    108 	NFS4ERR_NOFILEHANDLE	= 10020,/* current FH is not set   */
    109 	NFS4ERR_MINOR_VERS_MISMATCH = 10021,/* minor vers not supp */
    110 	NFS4ERR_STALE_CLIENTID	= 10022,/* server has rebooted     */
    111 	NFS4ERR_STALE_STATEID	= 10023,/* server has rebooted     */
    112 	NFS4ERR_OLD_STATEID	= 10024,/* state is out of sync    */
    113 	NFS4ERR_BAD_STATEID	= 10025,/* incorrect stateid       */
    114 	NFS4ERR_BAD_SEQID	= 10026,/* request is out of seq.  */
    115 	NFS4ERR_NOT_SAME	= 10027,/* verify - attrs not same */
    116 	NFS4ERR_LOCK_RANGE	= 10028,/* lock range not supported*/
    117 	NFS4ERR_SYMLINK		= 10029,/* should be file/directory*/
    118 	NFS4ERR_RESTOREFH	= 10030,/* no saved filehandle     */
    119 	NFS4ERR_LEASE_MOVED	= 10031,/* some filesystem moved   */
    120 	NFS4ERR_ATTRNOTSUPP	= 10032,/* recommended attr not sup*/
    121 	NFS4ERR_NO_GRACE	= 10033,/* reclaim outside of grace*/
    122 	NFS4ERR_RECLAIM_BAD	= 10034,/* reclaim error at server */
    123 	NFS4ERR_RECLAIM_CONFLICT = 10035,/* conflict on reclaim    */
    124 	NFS4ERR_BADXDR		= 10036,/* XDR decode failed       */
    125 	NFS4ERR_LOCKS_HELD	= 10037,/* file locks held at CLOSE*/
    126 	NFS4ERR_OPENMODE	= 10038,/* conflict in OPEN and I/O*/
    127 	NFS4ERR_BADOWNER	= 10039,/* owner translation bad   */
    128 	NFS4ERR_BADCHAR		= 10040,/* utf-8 char not supported*/
    129 	NFS4ERR_BADNAME		= 10041,/* name not supported      */
    130 	NFS4ERR_BAD_RANGE	= 10042,/* lock range not supported*/
    131 	NFS4ERR_LOCK_NOTSUPP	= 10043,/* no atomic up/downgrade  */
    132 	NFS4ERR_OP_ILLEGAL	= 10044,/* undefined operation     */
    133 	NFS4ERR_DEADLOCK	= 10045,/* file locking deadlock   */
    134 	NFS4ERR_FILE_OPEN	= 10046,/* open file blocks op.    */
    135 	NFS4ERR_ADMIN_REVOKED	= 10047,/* lockowner state revoked */
    136 	NFS4ERR_CB_PATH_DOWN    = 10048 /* callback path down      */
    137 };
    138 
    139 /*
    140  * Basic data types
    141  */
    142 typedef uint32_t	bitmap4<>;
    143 typedef uint64_t	offset4;
    144 typedef uint32_t	count4;
    145 typedef	uint64_t	length4;
    146 typedef uint64_t	clientid4;
    147 typedef uint32_t	seqid4;
    148 typedef opaque		utf8string<>;
    149 typedef utf8string	utf8str_cis;
    150 typedef utf8string	utf8str_cs;
    151 typedef utf8string	utf8str_mixed;
    152 typedef utf8str_cs	component4;
    153 typedef	component4	pathname4<>;
    154 typedef uint64_t	nfs_lockid4;
    155 typedef	uint64_t	nfs_cookie4;
    156 typedef	utf8str_cs	linktext4;
    157 typedef opaque		sec_oid4<>;
    158 typedef uint32_t	qop4;
    159 typedef	uint32_t	mode4;
    160 typedef	uint64_t	changeid4;
    161 typedef opaque		verifier4[NFS4_VERIFIER_SIZE];
    162 
    163 /*
    164  * Timeval
    165  */
    166 struct nfstime4 {
    167 	int64_t		seconds;
    168 	uint32_t	nseconds;
    169 };
    170 
    171 enum time_how4 {
    172 	SET_TO_SERVER_TIME4 = 0,
    173 	SET_TO_CLIENT_TIME4 = 1
    174 };
    175 
    176 union settime4 switch (time_how4 set_it) {
    177  case SET_TO_CLIENT_TIME4:
    178 	 nfstime4	time;
    179  default:
    180 	 void;
    181 };
    182 
    183 /*
    184  * File access handle
    185  */
    186 typedef	opaque	nfs_fh4<NFS4_FHSIZE>;
    187 
    188 
    189 /*
    190  * File attribute definitions
    191  */
    192 
    193 /*
    194  * FSID structure for major/minor
    195  */
    196 struct fsid4 {
    197 	uint64_t	major;
    198 	uint64_t	minor;
    199 };
    200 
    201 /*
    202  * Filesystem locations attribute for relocation/migration
    203  */
    204 struct fs_location4 {
    205 	utf8str_cis	server<>;
    206 	pathname4	rootpath;
    207 };
    208 
    209 struct fs_locations4 {
    210 	pathname4	fs_root;
    211 	fs_location4	locations<>;
    212 };
    213 
    214 /*
    215  * Various Access Control Entry definitions
    216  */
    217 
    218 /*
    219  * Mask that indicates which Access Control Entries are supported.
    220  * Values for the fattr4_aclsupport attribute.
    221  */
    222 const ACL4_SUPPORT_ALLOW_ACL	= 0x00000001;
    223 const ACL4_SUPPORT_DENY_ACL	= 0x00000002;
    224 const ACL4_SUPPORT_AUDIT_ACL	= 0x00000004;
    225 const ACL4_SUPPORT_ALARM_ACL	= 0x00000008;
    226 
    227 
    228 typedef	uint32_t	acetype4;
    229 
    230 /*
    231  * acetype4 values, others can be added as needed.
    232  */
    233 const ACE4_ACCESS_ALLOWED_ACE_TYPE	= 0x00000000;
    234 const ACE4_ACCESS_DENIED_ACE_TYPE	= 0x00000001;
    235 const ACE4_SYSTEM_AUDIT_ACE_TYPE	= 0x00000002;
    236 const ACE4_SYSTEM_ALARM_ACE_TYPE	= 0x00000003;
    237 
    238 
    239 /*
    240  * ACE flag
    241  */
    242 typedef uint32_t aceflag4;
    243 
    244 /*
    245  * ACE flag values
    246  */
    247 const ACE4_FILE_INHERIT_ACE		= 0x00000001;
    248 const ACE4_DIRECTORY_INHERIT_ACE	= 0x00000002;
    249 const ACE4_NO_PROPAGATE_INHERIT_ACE	= 0x00000004;
    250 const ACE4_INHERIT_ONLY_ACE		= 0x00000008;
    251 const ACE4_SUCCESSFUL_ACCESS_ACE_FLAG	= 0x00000010;
    252 const ACE4_FAILED_ACCESS_ACE_FLAG	= 0x00000020;
    253 const ACE4_IDENTIFIER_GROUP		= 0x00000040;
    254 
    255 
    256 /*
    257  * ACE mask
    258  */
    259 typedef uint32_t	acemask4;
    260 
    261 /*
    262  * ACE mask values
    263  */
    264 const ACE4_READ_DATA		= 0x00000001;
    265 const ACE4_LIST_DIRECTORY	= 0x00000001;
    266 const ACE4_WRITE_DATA		= 0x00000002;
    267 const ACE4_ADD_FILE		= 0x00000002;
    268 const ACE4_APPEND_DATA		= 0x00000004;
    269 const ACE4_ADD_SUBDIRECTORY	= 0x00000004;
    270 const ACE4_READ_NAMED_ATTRS	= 0x00000008;
    271 const ACE4_WRITE_NAMED_ATTRS	= 0x00000010;
    272 const ACE4_EXECUTE		= 0x00000020;
    273 const ACE4_DELETE_CHILD		= 0x00000040;
    274 const ACE4_READ_ATTRIBUTES	= 0x00000080;
    275 const ACE4_WRITE_ATTRIBUTES	= 0x00000100;
    276 
    277 const ACE4_DELETE		= 0x00010000;
    278 const ACE4_READ_ACL		= 0x00020000;
    279 const ACE4_WRITE_ACL		= 0x00040000;
    280 const ACE4_WRITE_OWNER		= 0x00080000;
    281 const ACE4_SYNCHRONIZE		= 0x00100000;
    282 
    283 /*
    284  * ACE4_GENERIC_READ -- defined as combination of
    285  *	ACE4_READ_ACL |
    286  *	ACE4_READ_DATA |
    287  *	ACE4_READ_ATTRIBUTES |
    288  *	ACE4_SYNCHRONIZE
    289  */
    290 
    291 const ACE4_GENERIC_READ	= 0x00120081;
    292 
    293 /*
    294  * ACE4_GENERIC_WRITE -- defined as combination of
    295  *	ACE4_READ_ACL |
    296  *	ACE4_WRITE_DATA |
    297  *	ACE4_WRITE_ATTRIBUTES |
    298  *	ACE4_WRITE_ACL |
    299  *	ACE4_APPEND_DATA |
    300  *	ACE4_SYNCHRONIZE
    301  */
    302 const ACE4_GENERIC_WRITE = 0x00160106;
    303 
    304 
    305 /*
    306  * ACE4_GENERIC_EXECUTE -- defined as combination of
    307  *	ACE4_READ_ACL
    308  *	ACE4_READ_ATTRIBUTES
    309  *	ACE4_EXECUTE
    310  *	ACE4_SYNCHRONIZE
    311  */
    312 const ACE4_GENERIC_EXECUTE = 0x001200A0;
    313 
    314 
    315 /*
    316  * Access Control Entry definition
    317  */
    318 struct nfsace4 {
    319 	acetype4	type;
    320 	aceflag4	flag;
    321 	acemask4	access_mask;
    322 	utf8str_mixed	who;
    323 };
    324 
    325 /*
    326  * Field definitions for the fattr4_mode attribute
    327  */
    328 const MODE4_SUID = 0x800;  /* set user id on execution */
    329 const MODE4_SGID = 0x400;  /* set group id on execution */
    330 const MODE4_SVTX = 0x200;  /* save text even after use */
    331 const MODE4_RUSR = 0x100;  /* read permission: owner */
    332 const MODE4_WUSR = 0x080;  /* write permission: owner */
    333 const MODE4_XUSR = 0x040;  /* execute permission: owner */
    334 const MODE4_RGRP = 0x020;  /* read permission: group */
    335 const MODE4_WGRP = 0x010;  /* write permission: group */
    336 const MODE4_XGRP = 0x008;  /* execute permission: group */
    337 const MODE4_ROTH = 0x004;  /* read permission: other */
    338 const MODE4_WOTH = 0x002;  /* write permission: other */
    339 const MODE4_XOTH = 0x001;  /* execute permission: other */
    340 
    341 /*
    342  * Special data/attribute associated with
    343  * file types NF4BLK and NF4CHR.
    344  */
    345 struct specdata4 {
    346 	uint32_t	specdata1;	/* major device number */
    347 	uint32_t	specdata2;	/* minor device number */
    348 };
    349 
    350 /*
    351  * Values for fattr4_fh_expire_type
    352  */
    353 const	FH4_PERSISTENT		= 0x00000000;
    354 const	FH4_NOEXPIRE_WITH_OPEN	= 0x00000001;
    355 const	FH4_VOLATILE_ANY	= 0x00000002;
    356 const	FH4_VOL_MIGRATION	= 0x00000004;
    357 const	FH4_VOL_RENAME		= 0x00000008;
    358 
    359 
    360 typedef bitmap4		fattr4_supported_attrs;
    361 typedef nfs_ftype4	fattr4_type;
    362 typedef	uint32_t	fattr4_fh_expire_type;
    363 typedef	changeid4	fattr4_change;
    364 typedef uint64_t	fattr4_size;
    365 typedef	bool		fattr4_link_support;
    366 typedef	bool		fattr4_symlink_support;
    367 typedef bool		fattr4_named_attr;
    368 typedef fsid4		fattr4_fsid;
    369 typedef	bool		fattr4_unique_handles;
    370 typedef uint32_t	fattr4_lease_time;
    371 typedef	nfsstat4	fattr4_rdattr_error;
    372 
    373 typedef nfsace4		fattr4_acl<>;
    374 typedef uint32_t	fattr4_aclsupport;
    375 typedef	bool		fattr4_archive;
    376 typedef	bool		fattr4_cansettime;
    377 typedef	bool		fattr4_case_insensitive;
    378 typedef	bool		fattr4_case_preserving;
    379 typedef	bool		fattr4_chown_restricted;
    380 typedef uint64_t	fattr4_fileid;
    381 typedef uint64_t	fattr4_files_avail;
    382 typedef nfs_fh4		fattr4_filehandle;
    383 typedef uint64_t	fattr4_files_free;
    384 typedef uint64_t	fattr4_files_total;
    385 typedef fs_locations4	fattr4_fs_locations;
    386 typedef bool		fattr4_hidden;
    387 typedef bool		fattr4_homogeneous;
    388 typedef uint64_t	fattr4_maxfilesize;
    389 typedef uint32_t	fattr4_maxlink;
    390 typedef uint32_t	fattr4_maxname;
    391 typedef uint64_t	fattr4_maxread;
    392 typedef uint64_t	fattr4_maxwrite;
    393 typedef	utf8str_cs	fattr4_mimetype;
    394 typedef mode4		fattr4_mode;
    395 typedef uint64_t	fattr4_mounted_on_fileid;
    396 typedef	bool		fattr4_no_trunc;
    397 typedef	uint32_t	fattr4_numlinks;
    398 typedef	utf8str_mixed	fattr4_owner;
    399 typedef	utf8str_mixed	fattr4_owner_group;
    400 typedef uint64_t	fattr4_quota_avail_hard;
    401 typedef uint64_t	fattr4_quota_avail_soft;
    402 typedef uint64_t	fattr4_quota_used;
    403 typedef specdata4	fattr4_rawdev;
    404 typedef uint64_t	fattr4_space_avail;
    405 typedef uint64_t	fattr4_space_free;
    406 typedef uint64_t	fattr4_space_total;
    407 typedef uint64_t	fattr4_space_used;
    408 typedef bool		fattr4_system;
    409 typedef nfstime4	fattr4_time_access;
    410 typedef settime4	fattr4_time_access_set;
    411 typedef nfstime4	fattr4_time_backup;
    412 typedef nfstime4	fattr4_time_create;
    413 typedef nfstime4	fattr4_time_delta;
    414 typedef nfstime4	fattr4_time_metadata;
    415 typedef nfstime4	fattr4_time_modify;
    416 typedef settime4	fattr4_time_modify_set;
    417 
    418 
    419 /*
    420  * Mandatory Attributes
    421  */
    422 const FATTR4_SUPPORTED_ATTRS	= 0;
    423 const FATTR4_TYPE		= 1;
    424 const FATTR4_FH_EXPIRE_TYPE	= 2;
    425 const FATTR4_CHANGE		= 3;
    426 const FATTR4_SIZE		= 4;
    427 const FATTR4_LINK_SUPPORT	= 5;
    428 const FATTR4_SYMLINK_SUPPORT	= 6;
    429 const FATTR4_NAMED_ATTR		= 7;
    430 const FATTR4_FSID		= 8;
    431 const FATTR4_UNIQUE_HANDLES	= 9;
    432 const FATTR4_LEASE_TIME		= 10;
    433 const FATTR4_RDATTR_ERROR	= 11;
    434 const FATTR4_FILEHANDLE		= 19;
    435 
    436 /*
    437  * Recommended Attributes
    438  */
    439 const FATTR4_ACL		= 12;
    440 const FATTR4_ACLSUPPORT		= 13;
    441 const FATTR4_ARCHIVE		= 14;
    442 const FATTR4_CANSETTIME		= 15;
    443 const FATTR4_CASE_INSENSITIVE	= 16;
    444 const FATTR4_CASE_PRESERVING	= 17;
    445 const FATTR4_CHOWN_RESTRICTED	= 18;
    446 const FATTR4_FILEID		= 20;
    447 const FATTR4_FILES_AVAIL	= 21;
    448 const FATTR4_FILES_FREE		= 22;
    449 const FATTR4_FILES_TOTAL	= 23;
    450 const FATTR4_FS_LOCATIONS	= 24;
    451 const FATTR4_HIDDEN		= 25;
    452 const FATTR4_HOMOGENEOUS	= 26;
    453 const FATTR4_MAXFILESIZE	= 27;
    454 const FATTR4_MAXLINK		= 28;
    455 const FATTR4_MAXNAME		= 29;
    456 const FATTR4_MAXREAD		= 30;
    457 const FATTR4_MAXWRITE		= 31;
    458 const FATTR4_MIMETYPE		= 32;
    459 const FATTR4_MODE		= 33;
    460 const FATTR4_NO_TRUNC		= 34;
    461 const FATTR4_NUMLINKS		= 35;
    462 const FATTR4_OWNER		= 36;
    463 const FATTR4_OWNER_GROUP	= 37;
    464 const FATTR4_QUOTA_AVAIL_HARD	= 38;
    465 const FATTR4_QUOTA_AVAIL_SOFT	= 39;
    466 const FATTR4_QUOTA_USED		= 40;
    467 const FATTR4_RAWDEV		= 41;
    468 const FATTR4_SPACE_AVAIL	= 42;
    469 const FATTR4_SPACE_FREE		= 43;
    470 const FATTR4_SPACE_TOTAL	= 44;
    471 const FATTR4_SPACE_USED		= 45;
    472 const FATTR4_SYSTEM		= 46;
    473 const FATTR4_TIME_ACCESS	= 47;
    474 const FATTR4_TIME_ACCESS_SET	= 48;
    475 const FATTR4_TIME_BACKUP	= 49;
    476 const FATTR4_TIME_CREATE	= 50;
    477 const FATTR4_TIME_DELTA		= 51;
    478 const FATTR4_TIME_METADATA	= 52;
    479 const FATTR4_TIME_MODIFY	= 53;
    480 const FATTR4_TIME_MODIFY_SET	= 54;
    481 const FATTR4_MOUNTED_ON_FILEID	= 55;
    482 
    483 typedef	opaque	attrlist4<>;
    484 
    485 /*
    486  * File attribute container
    487  */
    488 struct fattr4 {
    489 	bitmap4		attrmask;
    490 	attrlist4	attr_vals;
    491 };
    492 
    493 /*
    494  * Change info for the client
    495  */
    496 struct change_info4 {
    497 	bool		atomic;
    498 	changeid4	before;
    499 	changeid4	after;
    500 };
    501 
    502 struct clientaddr4 {
    503 	/* see struct rpcb in RFC 1833 */
    504 	string r_netid<>;		/* network id */
    505 	string r_addr<>;		/* universal address */
    506 };
    507 
    508 /*
    509  * Callback program info as provided by the client
    510  */
    511 struct cb_client4 {
    512 	uint32_t	cb_program;
    513 	clientaddr4	cb_location;
    514 };
    515 
    516 /*
    517  * Stateid
    518  */
    519 struct stateid4 {
    520 	uint32_t	seqid;
    521 	opaque		other[12];
    522 };
    523 
    524 /*
    525  * Client ID
    526  */
    527 struct nfs_client_id4 {
    528 	verifier4	verifier;
    529 	opaque		id<NFS4_OPAQUE_LIMIT>;
    530 };
    531 
    532 struct open_owner4 {
    533 	clientid4	clientid;
    534 	opaque		owner<NFS4_OPAQUE_LIMIT>;
    535 };
    536 
    537 struct lock_owner4 {
    538 	clientid4	clientid;
    539 	opaque		owner<NFS4_OPAQUE_LIMIT>;
    540 };
    541 
    542 enum nfs_lock_type4 {
    543 	READ_LT		= 1,
    544 	WRITE_LT	= 2,
    545 	READW_LT	= 3,	/* blocking read */
    546 	WRITEW_LT	= 4	/* blocking write */
    547 };
    548 
    549 /*
    550  * ACCESS: Check access permission
    551  */
    552 const ACCESS4_READ	= 0x00000001;
    553 const ACCESS4_LOOKUP	= 0x00000002;
    554 const ACCESS4_MODIFY	= 0x00000004;
    555 const ACCESS4_EXTEND	= 0x00000008;
    556 const ACCESS4_DELETE	= 0x00000010;
    557 const ACCESS4_EXECUTE	= 0x00000020;
    558 
    559 struct ACCESS4args {
    560 	/* CURRENT_FH: object */
    561 	uint32_t	access;
    562 };
    563 
    564 struct ACCESS4resok {
    565 	uint32_t	supported;
    566 	uint32_t	access;
    567 };
    568 
    569 union ACCESS4res switch (nfsstat4 status) {
    570  case NFS4_OK:
    571 	 ACCESS4resok	resok4;
    572  default:
    573 	 void;
    574 };
    575 
    576 /*
    577  * CLOSE: Close a file and release share reservations
    578  */
    579 struct CLOSE4args {
    580 	/* CURRENT_FH: object */
    581 	seqid4		seqid;
    582 	stateid4	open_stateid;
    583 };
    584 
    585 union CLOSE4res switch (nfsstat4 status) {
    586  case NFS4_OK:
    587 	 stateid4	open_stateid;
    588  default:
    589 	 void;
    590 };
    591 
    592 /*
    593  * COMMIT: Commit cached data on server to stable storage
    594  */
    595 struct COMMIT4args {
    596 	/* CURRENT_FH: file */
    597 	offset4		offset;
    598 	count4		count;
    599 };
    600 
    601 struct COMMIT4resok {
    602 	verifier4	writeverf;
    603 };
    604 
    605 
    606 union COMMIT4res switch (nfsstat4 status) {
    607  case NFS4_OK:
    608 	 COMMIT4resok	resok4;
    609  default:
    610 	 void;
    611 };
    612 
    613 /*
    614  * CREATE: Create a non-regular file
    615  */
    616 union createtype4 switch (nfs_ftype4 type) {
    617  case NF4LNK:
    618 	 linktext4	linkdata;
    619  case NF4BLK:
    620  case NF4CHR:
    621 	 specdata4	devdata;
    622  case NF4SOCK:
    623  case NF4FIFO:
    624  case NF4DIR:
    625 	 void;
    626  default:
    627 	 void;		/* server should return NFS4ERR_BADTYPE */
    628 };
    629 
    630 struct CREATE4args {
    631 	/* CURRENT_FH: directory for creation */
    632 	createtype4	objtype;
    633 	component4	objname;
    634 	fattr4		createattrs;
    635 };
    636 
    637 struct CREATE4resok {
    638 	change_info4	cinfo;
    639 	bitmap4		attrset;	/* attributes set */
    640 };
    641 
    642 union CREATE4res switch (nfsstat4 status) {
    643  case NFS4_OK:
    644 	 CREATE4resok resok4;
    645  default:
    646 	 void;
    647 };
    648 
    649 /*
    650  * DELEGPURGE: Purge Delegations Awaiting Recovery
    651  */
    652 struct DELEGPURGE4args {
    653 	clientid4	clientid;
    654 };
    655 
    656 struct DELEGPURGE4res {
    657 	nfsstat4	status;
    658 };
    659 
    660 /*
    661  * DELEGRETURN: Return a delegation
    662  */
    663 struct DELEGRETURN4args {
    664 	/* CURRENT_FH: delegated file */
    665 	stateid4	deleg_stateid;
    666 };
    667 
    668 struct DELEGRETURN4res {
    669 	nfsstat4	status;
    670 };
    671 
    672 /*
    673  * GETATTR: Get file attributes
    674  */
    675 struct GETATTR4args {
    676 	/* CURRENT_FH: directory or file */
    677 	bitmap4		attr_request;
    678 };
    679 
    680 struct GETATTR4resok {
    681 	fattr4		obj_attributes;
    682 };
    683 
    684 union GETATTR4res switch (nfsstat4 status) {
    685  case NFS4_OK:
    686 	 GETATTR4resok	resok4;
    687  default:
    688 	 void;
    689 };
    690 
    691 /*
    692  * GETFH: Get current filehandle
    693  */
    694 struct GETFH4resok {
    695 	nfs_fh4		object;
    696 };
    697 
    698 union GETFH4res switch (nfsstat4 status) {
    699  case NFS4_OK:
    700 	GETFH4resok	resok4;
    701  default:
    702 	void;
    703 };
    704 
    705 /*
    706  * LINK: Create link to an object
    707  */
    708 struct LINK4args {
    709 	/* SAVED_FH: source object */
    710 	/* CURRENT_FH: target directory */
    711 	component4	newname;
    712 };
    713 
    714 struct LINK4resok {
    715 	change_info4	cinfo;
    716 };
    717 
    718 union LINK4res switch (nfsstat4 status) {
    719  case NFS4_OK:
    720 	 LINK4resok resok4;
    721  default:
    722 	 void;
    723 };
    724 
    725 /*
    726  * For LOCK, transition from open_owner to new lock_owner
    727  */
    728 struct open_to_lock_owner4 {
    729 	seqid4		open_seqid;
    730 	stateid4	open_stateid;
    731 	seqid4		lock_seqid;
    732 	lock_owner4	lock_owner;
    733 };
    734 
    735 /*
    736  * For LOCK, existing lock_owner continues to request file locks
    737  */
    738 struct exist_lock_owner4 {
    739 	stateid4	lock_stateid;
    740 	seqid4		lock_seqid;
    741 };
    742 
    743 union locker4 switch (bool new_lock_owner) {
    744  case TRUE:
    745 	open_to_lock_owner4	open_owner;
    746  case FALSE:
    747 	exist_lock_owner4	lock_owner;
    748 };
    749 
    750 /*
    751  * LOCK/LOCKT/LOCKU: Record lock management
    752  */
    753 struct LOCK4args {
    754 	/* CURRENT_FH: file */
    755 	nfs_lock_type4	locktype;
    756 	bool		reclaim;
    757 	offset4		offset;
    758 	length4		length;
    759 	locker4		locker;
    760 };
    761 
    762 struct LOCK4denied {
    763 	offset4		offset;
    764 	length4		length;
    765 	nfs_lock_type4	locktype;
    766 	lock_owner4	owner;
    767 };
    768 
    769 struct LOCK4resok {
    770 	stateid4	lock_stateid;
    771 };
    772 
    773 union LOCK4res switch (nfsstat4 status) {
    774  case NFS4_OK:
    775 	 LOCK4resok	resok4;
    776  case NFS4ERR_DENIED:
    777 	 LOCK4denied	denied;
    778  default:
    779 	 void;
    780 };
    781 
    782 struct LOCKT4args {
    783 	/* CURRENT_FH: file */
    784 	nfs_lock_type4	locktype;
    785 	offset4		offset;
    786 	length4		length;
    787 	lock_owner4	owner;
    788 };
    789 
    790 union LOCKT4res switch (nfsstat4 status) {
    791  case NFS4ERR_DENIED:
    792 	 LOCK4denied	denied;
    793  case NFS4_OK:
    794 	 void;
    795  default:
    796 	 void;
    797 };
    798 
    799 struct LOCKU4args {
    800 	/* CURRENT_FH: file */
    801 	nfs_lock_type4	locktype;
    802 	seqid4		seqid;
    803 	stateid4	lock_stateid;
    804 	offset4		offset;
    805 	length4		length;
    806 };
    807 
    808 union LOCKU4res switch (nfsstat4 status) {
    809  case	NFS4_OK:
    810 	 stateid4	lock_stateid;
    811  default:
    812 	 void;
    813 };
    814 
    815 /*
    816  * LOOKUP: Lookup filename
    817  */
    818 struct LOOKUP4args {
    819 	/* CURRENT_FH: directory */
    820 	component4	objname;
    821 };
    822 
    823 struct LOOKUP4res {
    824 	/* CURRENT_FH: object */
    825 	nfsstat4	status;
    826 };
    827 
    828 /*
    829  * LOOKUPP: Lookup parent directory
    830  */
    831 struct LOOKUPP4res {
    832 	/* CURRENT_FH: directory */
    833 	nfsstat4	status;
    834 };
    835 
    836 /*
    837  * NVERIFY: Verify attributes different
    838  */
    839 struct NVERIFY4args {
    840 	/* CURRENT_FH: object */
    841 	fattr4		obj_attributes;
    842 };
    843 
    844 struct NVERIFY4res {
    845 	nfsstat4	status;
    846 };
    847 
    848 /*
    849  * Various definitions for OPEN
    850  */
    851 enum createmode4 {
    852 	UNCHECKED4	= 0,
    853 	GUARDED4	= 1,
    854 	EXCLUSIVE4	= 2
    855 };
    856 
    857 union createhow4 switch (createmode4 mode) {
    858  case UNCHECKED4:
    859  case GUARDED4:
    860 	 fattr4		createattrs;
    861  case EXCLUSIVE4:
    862 	 verifier4	createverf;
    863 };
    864 
    865 enum opentype4 {
    866 	OPEN4_NOCREATE	= 0,
    867 	OPEN4_CREATE	= 1
    868 };
    869 
    870 union openflag4 switch (opentype4 opentype) {
    871  case OPEN4_CREATE:
    872 	 createhow4	how;
    873  default:
    874 	 void;
    875 };
    876 
    877 /* Next definitions used for OPEN delegation */
    878 enum limit_by4 {
    879 	NFS_LIMIT_SIZE		= 1,
    880 	NFS_LIMIT_BLOCKS	= 2
    881 	/* others as needed */
    882 };
    883 
    884 struct nfs_modified_limit4 {
    885 	uint32_t	num_blocks;
    886 	uint32_t	bytes_per_block;
    887 };
    888 
    889 union nfs_space_limit4 switch (limit_by4 limitby) {
    890  /* limit specified as file size */
    891  case NFS_LIMIT_SIZE:
    892 	 uint64_t		filesize;
    893  /* limit specified by number of blocks */
    894  case NFS_LIMIT_BLOCKS:
    895 	 nfs_modified_limit4	mod_blocks;
    896 } ;
    897 
    898 /*
    899  * Share Access and Deny constants for open argument
    900  */
    901 const OPEN4_SHARE_ACCESS_READ	= 0x00000001;
    902 const OPEN4_SHARE_ACCESS_WRITE	= 0x00000002;
    903 const OPEN4_SHARE_ACCESS_BOTH	= 0x00000003;
    904 
    905 const OPEN4_SHARE_DENY_NONE	= 0x00000000;
    906 const OPEN4_SHARE_DENY_READ	= 0x00000001;
    907 const OPEN4_SHARE_DENY_WRITE	= 0x00000002;
    908 const OPEN4_SHARE_DENY_BOTH	= 0x00000003;
    909 
    910 enum open_delegation_type4 {
    911 	OPEN_DELEGATE_NONE	= 0,
    912 	OPEN_DELEGATE_READ	= 1,
    913 	OPEN_DELEGATE_WRITE	= 2
    914 };
    915 
    916 enum open_claim_type4 {
    917 	CLAIM_NULL		= 0,
    918 	CLAIM_PREVIOUS		= 1,
    919 	CLAIM_DELEGATE_CUR	= 2,
    920 	CLAIM_DELEGATE_PREV	= 3
    921 };
    922 
    923 struct open_claim_delegate_cur4 {
    924 	stateid4	delegate_stateid;
    925 	component4	file;
    926 };
    927 
    928 union open_claim4 switch (open_claim_type4 claim) {
    929  /*
    930   * No special rights to file. Ordinary OPEN of the specified file.
    931   */
    932  case CLAIM_NULL:
    933 	/* CURRENT_FH: directory */
    934 	component4	file;
    935 
    936  /*
    937   * Right to the file established by an open previous to server
    938   * reboot.  File identified by filehandle obtained at that time
    939   * rather than by name.
    940   */
    941  case CLAIM_PREVIOUS:
    942 	/* CURRENT_FH: file being reclaimed */
    943 	open_delegation_type4	delegate_type;
    944 
    945  /*
    946   * Right to file based on a delegation granted by the server.
    947   * File is specified by name.
    948   */
    949  case CLAIM_DELEGATE_CUR:
    950 	/* CURRENT_FH: directory */
    951 	open_claim_delegate_cur4	delegate_cur_info;
    952 
    953  /* Right to file based on a delegation granted to a previous boot
    954   * instance of the client.  File is specified by name.
    955   */
    956  case CLAIM_DELEGATE_PREV:
    957 	 /* CURRENT_FH: directory */
    958 	component4	file_delegate_prev;
    959 };
    960 
    961 /*
    962  * OPEN: Open a file, potentially receiving an open delegation
    963  */
    964 struct OPEN4args {
    965 	seqid4		seqid;
    966 	uint32_t	share_access;
    967 	uint32_t	share_deny;
    968 	open_owner4	owner;
    969 	openflag4	openhow;
    970 	open_claim4	claim;
    971 };
    972 
    973 struct open_read_delegation4 {
    974 	stateid4	stateid;	/* Stateid for delegation*/
    975 	bool		recall;		/* Pre-recalled flag for
    976 					   delegations obtained
    977 					   by reclaim
    978 					   (CLAIM_PREVIOUS) */
    979 	nfsace4		permissions;	/* Defines users who don't
    980 					   need an ACCESS call to
    981 					   open for read */
    982 };
    983 
    984 struct open_write_delegation4 {
    985 	stateid4	stateid;	/* Stateid for delegation */
    986 	bool		recall;		/* Pre-recalled flag for
    987 					   delegations obtained
    988 					   by reclaim
    989 					   (CLAIM_PREVIOUS) */
    990 	nfs_space_limit4 space_limit;	/* Defines condition that
    991 					   the client must check to
    992 					   determine whether the
    993 					   file needs to be flushed
    994 					   to the server on close.
    995 					   */
    996 	nfsace4		permissions;	/* Defines users who don't
    997 					   need an ACCESS call as
    998 					   part of a delegated
    999 					   open. */
   1000 };
   1001 
   1002 union open_delegation4
   1003 switch (open_delegation_type4 delegation_type) {
   1004 	case OPEN_DELEGATE_NONE:
   1005 		void;
   1006 	case OPEN_DELEGATE_READ:
   1007 		open_read_delegation4 read;
   1008 	case OPEN_DELEGATE_WRITE:
   1009 		open_write_delegation4 write;
   1010 };
   1011 
   1012 /*
   1013  * Result flags
   1014  */
   1015 /* Client must confirm open */
   1016 const OPEN4_RESULT_CONFIRM	= 0x00000002;
   1017 /* Type of file locking behavior at the server */
   1018 const OPEN4_RESULT_LOCKTYPE_POSIX = 0x00000004;
   1019 
   1020 struct OPEN4resok {
   1021 	stateid4	stateid;	/* Stateid for open */
   1022 	change_info4	cinfo;		/* Directory Change Info */
   1023 	uint32_t	rflags;		/* Result flags */
   1024 	bitmap4		attrset;	/* attribute set for create*/
   1025 	open_delegation4 delegation;	/* Info on any open
   1026 					   delegation */
   1027 };
   1028 
   1029 union OPEN4res switch (nfsstat4 status) {
   1030  case NFS4_OK:
   1031 	/* CURRENT_FH: opened file */
   1032 	OPEN4resok	resok4;
   1033  default:
   1034 	void;
   1035 };
   1036 
   1037 /*
   1038  * OPENATTR: open named attributes directory
   1039  */
   1040 struct OPENATTR4args {
   1041 	/* CURRENT_FH: object */
   1042 	bool	createdir;
   1043 };
   1044 
   1045 struct OPENATTR4res {
   1046 	/* CURRENT_FH: named attr directory */
   1047 	nfsstat4	status;
   1048 };
   1049 
   1050 /*
   1051  * OPEN_CONFIRM: confirm the open
   1052  */
   1053 struct OPEN_CONFIRM4args {
   1054 	/* CURRENT_FH: opened file */
   1055 	stateid4	open_stateid;
   1056 	seqid4		seqid;
   1057 };
   1058 
   1059 struct OPEN_CONFIRM4resok {
   1060 	stateid4	open_stateid;
   1061 };
   1062 
   1063 union OPEN_CONFIRM4res switch (nfsstat4 status) {
   1064  case NFS4_OK:
   1065 	 OPEN_CONFIRM4resok	resok4;
   1066  default:
   1067 	 void;
   1068 };
   1069 
   1070 /*
   1071  * OPEN_DOWNGRADE: downgrade the access/deny for a file
   1072  */
   1073 struct OPEN_DOWNGRADE4args {
   1074 	/* CURRENT_FH: opened file */
   1075 	stateid4	open_stateid;
   1076 	seqid4		seqid;
   1077 	uint32_t	share_access;
   1078 	uint32_t	share_deny;
   1079 };
   1080 
   1081 struct OPEN_DOWNGRADE4resok {
   1082 	stateid4	open_stateid;
   1083 };
   1084 
   1085 union OPEN_DOWNGRADE4res switch(nfsstat4 status) {
   1086  case NFS4_OK:
   1087 	OPEN_DOWNGRADE4resok	resok4;
   1088  default:
   1089 	 void;
   1090 };
   1091 
   1092 /*
   1093  * PUTFH: Set current filehandle
   1094  */
   1095 struct PUTFH4args {
   1096 	nfs_fh4		object;
   1097 };
   1098 
   1099 struct PUTFH4res {
   1100 	/* CURRENT_FH: */
   1101 	nfsstat4	status;
   1102 };
   1103 
   1104 /*
   1105  * PUTPUBFH: Set public filehandle
   1106  */
   1107 struct PUTPUBFH4res {
   1108 	/* CURRENT_FH: public fh */
   1109 	nfsstat4	status;
   1110 };
   1111 
   1112 /*
   1113  * PUTROOTFH: Set root filehandle
   1114  */
   1115 struct PUTROOTFH4res {
   1116 	/* CURRENT_FH: root fh */
   1117 	nfsstat4	status;
   1118 };
   1119 
   1120 /*
   1121  * READ: Read from file
   1122  */
   1123 struct READ4args {
   1124 	/* CURRENT_FH: file */
   1125 	stateid4	stateid;
   1126 	offset4		offset;
   1127 	count4		count;
   1128 };
   1129 
   1130 struct READ4resok {
   1131 	bool		eof;
   1132 	opaque		data<>;
   1133 };
   1134 
   1135 union READ4res switch (nfsstat4 status) {
   1136  case NFS4_OK:
   1137 	 READ4resok	resok4;
   1138  default:
   1139 	 void;
   1140 };
   1141 
   1142 /*
   1143  * READDIR: Read directory
   1144  */
   1145 struct READDIR4args {
   1146 	/* CURRENT_FH: directory */
   1147 	nfs_cookie4	cookie;
   1148 	verifier4	cookieverf;
   1149 	count4		dircount;
   1150 	count4		maxcount;
   1151 	bitmap4		attr_request;
   1152 };
   1153 
   1154 struct entry4 {
   1155 	nfs_cookie4	cookie;
   1156 	component4	name;
   1157 	fattr4		attrs;
   1158 	entry4		*nextentry;
   1159 };
   1160 
   1161 struct dirlist4 {
   1162 	entry4		*entries;
   1163 	bool		eof;
   1164 };
   1165 
   1166 struct READDIR4resok {
   1167 	verifier4	cookieverf;
   1168 	dirlist4	reply;
   1169 };
   1170 
   1171 
   1172 union READDIR4res switch (nfsstat4 status) {
   1173  case NFS4_OK:
   1174 	 READDIR4resok	resok4;
   1175  default:
   1176 	 void;
   1177 };
   1178 
   1179 
   1180 /*
   1181  * READLINK: Read symbolic link
   1182  */
   1183 struct READLINK4resok {
   1184 	linktext4	link;
   1185 };
   1186 
   1187 union READLINK4res switch (nfsstat4 status) {
   1188  case NFS4_OK:
   1189 	 READLINK4resok	resok4;
   1190  default:
   1191 	 void;
   1192 };
   1193 
   1194 /*
   1195  * REMOVE: Remove filesystem object
   1196  */
   1197 struct REMOVE4args {
   1198 	/* CURRENT_FH: directory */
   1199 	component4	target;
   1200 };
   1201 
   1202 struct REMOVE4resok {
   1203 	change_info4	cinfo;
   1204 };
   1205 
   1206 union REMOVE4res switch (nfsstat4 status) {
   1207  case NFS4_OK:
   1208 	 REMOVE4resok	resok4;
   1209  default:
   1210 	 void;
   1211 };
   1212 
   1213 /*
   1214  * RENAME: Rename directory entry
   1215  */
   1216 struct RENAME4args {
   1217 	/* SAVED_FH: source directory */
   1218 	component4	oldname;
   1219 	/* CURRENT_FH: target directory */
   1220 	component4	newname;
   1221 };
   1222 
   1223 struct RENAME4resok {
   1224 	change_info4	source_cinfo;
   1225 	change_info4	target_cinfo;
   1226 };
   1227 
   1228 union RENAME4res switch (nfsstat4 status) {
   1229  case NFS4_OK:
   1230 	RENAME4resok	resok4;
   1231  default:
   1232 	void;
   1233 };
   1234 
   1235 /*
   1236  * RENEW: Renew a Lease
   1237  */
   1238 struct RENEW4args {
   1239 	clientid4	clientid;
   1240 };
   1241 
   1242 struct RENEW4res {
   1243 	nfsstat4	status;
   1244 };
   1245 
   1246 /*
   1247  * RESTOREFH: Restore saved filehandle
   1248  */
   1249 
   1250 struct RESTOREFH4res {
   1251 	/* CURRENT_FH: value of saved fh */
   1252 	nfsstat4	status;
   1253 };
   1254 
   1255 /*
   1256  * SAVEFH: Save current filehandle
   1257  */
   1258 struct SAVEFH4res {
   1259 	/* SAVED_FH: value of current fh */
   1260 	nfsstat4	status;
   1261 };
   1262 
   1263 /*
   1264  * SECINFO: Obtain Available Security Mechanisms
   1265  */
   1266 struct SECINFO4args {
   1267 	/* CURRENT_FH: directory */
   1268 	component4	name;
   1269 };
   1270 
   1271 /*
   1272  * From RFC 2203
   1273  */
   1274 enum rpc_gss_svc_t {
   1275 	RPC_GSS_SVC_NONE	= 1,
   1276 	RPC_GSS_SVC_INTEGRITY	= 2,
   1277 	RPC_GSS_SVC_PRIVACY	= 3
   1278 };
   1279 
   1280 struct rpcsec_gss_info {
   1281 	sec_oid4	oid;
   1282 	qop4		qop;
   1283 	rpc_gss_svc_t	service;
   1284 };
   1285 
   1286 /* RPCSEC_GSS has a value of '6' - See RFC 2203 */
   1287 union secinfo4 switch (uint32_t flavor) {
   1288  case RPCSEC_GSS:
   1289 	 rpcsec_gss_info	flavor_info;
   1290  default:
   1291 	 void;
   1292 };
   1293 
   1294 typedef secinfo4 SECINFO4resok<>;
   1295 
   1296 union SECINFO4res switch (nfsstat4 status) {
   1297  case NFS4_OK:
   1298 	 SECINFO4resok resok4;
   1299  default:
   1300 	 void;
   1301 };
   1302 
   1303 /*
   1304  * SETATTR: Set attributes
   1305  */
   1306 struct SETATTR4args {
   1307 	/* CURRENT_FH: target object */
   1308 	stateid4	stateid;
   1309 	fattr4		obj_attributes;
   1310 };
   1311 
   1312 struct SETATTR4res {
   1313 	nfsstat4	status;
   1314 	bitmap4		attrsset;
   1315 };
   1316 
   1317 /*
   1318  * SETCLIENTID
   1319  */
   1320 struct SETCLIENTID4args {
   1321 	nfs_client_id4	client;
   1322 	cb_client4	callback;
   1323 	uint32_t	callback_ident;
   1324 };
   1325 
   1326 struct SETCLIENTID4resok {
   1327 	clientid4	clientid;
   1328 	verifier4	setclientid_confirm;
   1329 };
   1330 
   1331 union SETCLIENTID4res switch (nfsstat4 status) {
   1332  case NFS4_OK:
   1333 	 SETCLIENTID4resok	resok4;
   1334  case NFS4ERR_CLID_INUSE:
   1335 	 clientaddr4	client_using;
   1336  default:
   1337 	 void;
   1338 };
   1339 
   1340 struct SETCLIENTID_CONFIRM4args {
   1341 	clientid4	clientid;
   1342 	verifier4	setclientid_confirm;
   1343 };
   1344 
   1345 struct SETCLIENTID_CONFIRM4res {
   1346 	nfsstat4	status;
   1347 };
   1348 
   1349 /*
   1350  * VERIFY: Verify attributes same
   1351  */
   1352 struct VERIFY4args {
   1353 	/* CURRENT_FH: object */
   1354 	fattr4		obj_attributes;
   1355 };
   1356 
   1357 struct VERIFY4res {
   1358 	nfsstat4	status;
   1359 };
   1360 
   1361 /*
   1362  * WRITE: Write to file
   1363  */
   1364 enum stable_how4 {
   1365 	UNSTABLE4	= 0,
   1366 	DATA_SYNC4	= 1,
   1367 	FILE_SYNC4	= 2
   1368 };
   1369 
   1370 struct WRITE4args {
   1371 	/* CURRENT_FH: file */
   1372 	stateid4	stateid;
   1373 	offset4		offset;
   1374 	stable_how4	stable;
   1375 	opaque		data<>;
   1376 };
   1377 
   1378 struct WRITE4resok {
   1379 	count4		count;
   1380 	stable_how4	committed;
   1381 	verifier4	writeverf;
   1382 };
   1383 
   1384 union WRITE4res switch (nfsstat4 status) {
   1385  case NFS4_OK:
   1386 	 WRITE4resok	resok4;
   1387  default:
   1388 	 void;
   1389 };
   1390 
   1391 /*
   1392  * RELEASE_LOCKOWNER: Notify server to release lockowner
   1393  */
   1394 struct RELEASE_LOCKOWNER4args {
   1395 	lock_owner4	lock_owner;
   1396 };
   1397 
   1398 struct RELEASE_LOCKOWNER4res {
   1399 	nfsstat4	status;
   1400 };
   1401 
   1402 /*
   1403  * ILLEGAL: Response for illegal operation numbers
   1404  */
   1405 struct ILLEGAL4res {
   1406 	nfsstat4        status;
   1407 };
   1408 
   1409 /*
   1410  * Operation arrays
   1411  */
   1412 
   1413 enum nfs_opnum4 {
   1414 	OP_ACCESS		= 3,
   1415 	OP_CLOSE		= 4,
   1416 	OP_COMMIT		= 5,
   1417 	OP_CREATE		= 6,
   1418 	OP_DELEGPURGE		= 7,
   1419 	OP_DELEGRETURN		= 8,
   1420 	OP_GETATTR		= 9,
   1421 	OP_GETFH		= 10,
   1422 	OP_LINK			= 11,
   1423 	OP_LOCK			= 12,
   1424 	OP_LOCKT		= 13,
   1425 	OP_LOCKU		= 14,
   1426 	OP_LOOKUP		= 15,
   1427 	OP_LOOKUPP		= 16,
   1428 	OP_NVERIFY		= 17,
   1429 	OP_OPEN			= 18,
   1430 	OP_OPENATTR		= 19,
   1431 	OP_OPEN_CONFIRM		= 20,
   1432 	OP_OPEN_DOWNGRADE	= 21,
   1433 	OP_PUTFH		= 22,
   1434 	OP_PUTPUBFH		= 23,
   1435 	OP_PUTROOTFH		= 24,
   1436 	OP_READ			= 25,
   1437 	OP_READDIR		= 26,
   1438 	OP_READLINK		= 27,
   1439 	OP_REMOVE		= 28,
   1440 	OP_RENAME		= 29,
   1441 	OP_RENEW		= 30,
   1442 	OP_RESTOREFH		= 31,
   1443 	OP_SAVEFH		= 32,
   1444 	OP_SECINFO		= 33,
   1445 	OP_SETATTR		= 34,
   1446 	OP_SETCLIENTID		= 35,
   1447 	OP_SETCLIENTID_CONFIRM	= 36,
   1448 	OP_VERIFY		= 37,
   1449 	OP_WRITE		= 38,
   1450 	OP_RELEASE_LOCKOWNER	= 39,
   1451 	OP_ILLEGAL		= 10044
   1452 };
   1453 
   1454 union nfs_argop4 switch (nfs_opnum4 argop) {
   1455  case OP_ACCESS:	ACCESS4args opaccess;
   1456  case OP_CLOSE:		CLOSE4args opclose;
   1457  case OP_COMMIT:	COMMIT4args opcommit;
   1458  case OP_CREATE:	CREATE4args opcreate;
   1459  case OP_DELEGPURGE:	DELEGPURGE4args opdelegpurge;
   1460  case OP_DELEGRETURN:	DELEGRETURN4args opdelegreturn;
   1461  case OP_GETATTR:	GETATTR4args opgetattr;
   1462  case OP_GETFH:		void;
   1463  case OP_LINK:		LINK4args oplink;
   1464  case OP_LOCK:		LOCK4args oplock;
   1465  case OP_LOCKT:		LOCKT4args oplockt;
   1466  case OP_LOCKU:		LOCKU4args oplocku;
   1467  case OP_LOOKUP:	LOOKUP4args oplookup;
   1468  case OP_LOOKUPP:	void;
   1469  case OP_NVERIFY:	NVERIFY4args opnverify;
   1470  case OP_OPEN:		OPEN4args opopen;
   1471  case OP_OPENATTR:	OPENATTR4args opopenattr;
   1472  case OP_OPEN_CONFIRM:	OPEN_CONFIRM4args opopen_confirm;
   1473  case OP_OPEN_DOWNGRADE:	OPEN_DOWNGRADE4args opopen_downgrade;
   1474  case OP_PUTFH:		PUTFH4args opputfh;
   1475  case OP_PUTPUBFH:	void;
   1476  case OP_PUTROOTFH:	void;
   1477  case OP_READ:		READ4args opread;
   1478  case OP_READDIR:	READDIR4args opreaddir;
   1479  case OP_READLINK:	void;
   1480  case OP_REMOVE:	REMOVE4args opremove;
   1481  case OP_RENAME:	RENAME4args oprename;
   1482  case OP_RENEW:		RENEW4args oprenew;
   1483  case OP_RESTOREFH:	void;
   1484  case OP_SAVEFH:	void;
   1485  case OP_SECINFO:	SECINFO4args opsecinfo;
   1486  case OP_SETATTR:	SETATTR4args opsetattr;
   1487  case OP_SETCLIENTID:	SETCLIENTID4args opsetclientid;
   1488  case OP_SETCLIENTID_CONFIRM:	SETCLIENTID_CONFIRM4args
   1489 					opsetclientid_confirm;
   1490  case OP_VERIFY:	VERIFY4args opverify;
   1491  case OP_WRITE:		WRITE4args opwrite;
   1492  case OP_RELEASE_LOCKOWNER:	RELEASE_LOCKOWNER4args
   1493 				    oprelease_lockowner;
   1494  case OP_ILLEGAL:	void;
   1495 };
   1496 
   1497 union nfs_resop4 switch (nfs_opnum4 resop){
   1498  case OP_ACCESS:	ACCESS4res opaccess;
   1499  case OP_CLOSE:		CLOSE4res opclose;
   1500  case OP_COMMIT:	COMMIT4res opcommit;
   1501  case OP_CREATE:	CREATE4res opcreate;
   1502  case OP_DELEGPURGE:	DELEGPURGE4res opdelegpurge;
   1503  case OP_DELEGRETURN:	DELEGRETURN4res opdelegreturn;
   1504  case OP_GETATTR:	GETATTR4res opgetattr;
   1505  case OP_GETFH:		GETFH4res opgetfh;
   1506  case OP_LINK:		LINK4res oplink;
   1507  case OP_LOCK:		LOCK4res oplock;
   1508  case OP_LOCKT:		LOCKT4res oplockt;
   1509  case OP_LOCKU:		LOCKU4res oplocku;
   1510  case OP_LOOKUP:	LOOKUP4res oplookup;
   1511  case OP_LOOKUPP:	LOOKUPP4res oplookupp;
   1512  case OP_NVERIFY:	NVERIFY4res opnverify;
   1513  case OP_OPEN:		OPEN4res opopen;
   1514  case OP_OPENATTR:	OPENATTR4res opopenattr;
   1515  case OP_OPEN_CONFIRM:	OPEN_CONFIRM4res opopen_confirm;
   1516  case OP_OPEN_DOWNGRADE:	OPEN_DOWNGRADE4res opopen_downgrade;
   1517  case OP_PUTFH:		PUTFH4res opputfh;
   1518  case OP_PUTPUBFH:	PUTPUBFH4res opputpubfh;
   1519  case OP_PUTROOTFH:	PUTROOTFH4res opputrootfh;
   1520  case OP_READ:		READ4res opread;
   1521  case OP_READDIR:	READDIR4res opreaddir;
   1522  case OP_READLINK:	READLINK4res opreadlink;
   1523  case OP_REMOVE:	REMOVE4res opremove;
   1524  case OP_RENAME:	RENAME4res oprename;
   1525  case OP_RENEW:		RENEW4res oprenew;
   1526  case OP_RESTOREFH:	RESTOREFH4res oprestorefh;
   1527  case OP_SAVEFH:	SAVEFH4res opsavefh;
   1528  case OP_SECINFO:	SECINFO4res opsecinfo;
   1529  case OP_SETATTR:	SETATTR4res opsetattr;
   1530  case OP_SETCLIENTID:	SETCLIENTID4res opsetclientid;
   1531  case OP_SETCLIENTID_CONFIRM:	SETCLIENTID_CONFIRM4res
   1532 					opsetclientid_confirm;
   1533  case OP_VERIFY:	VERIFY4res opverify;
   1534  case OP_WRITE:		WRITE4res opwrite;
   1535  case OP_RELEASE_LOCKOWNER:	RELEASE_LOCKOWNER4res
   1536 				    oprelease_lockowner;
   1537  case OP_ILLEGAL:	ILLEGAL4res opillegal;
   1538 };
   1539 
   1540 struct COMPOUND4args {
   1541 	utf8str_cs	tag;
   1542 	uint32_t	minorversion;
   1543 	nfs_argop4	argarray<>;
   1544 };
   1545 
   1546 struct COMPOUND4res {
   1547 	nfsstat4 status;
   1548 	utf8str_cs	tag;
   1549 	nfs_resop4	resarray<>;
   1550 };
   1551 
   1552 /*
   1553  * Remote file service routines
   1554  */
   1555 program NFS4_PROGRAM {
   1556 	version NFS_V4 {
   1557 		void
   1558 			NFSPROC4_NULL(void) = 0;
   1559 
   1560 		COMPOUND4res
   1561 			NFSPROC4_COMPOUND(COMPOUND4args) = 1;
   1562 
   1563 	} = 4;
   1564 } = 100003;
   1565 
   1566 
   1567 
   1568 /*
   1569  * NFS4 Callback Procedure Definitions and Program
   1570  */
   1571 
   1572 /*
   1573  * CB_GETATTR: Get Current Attributes
   1574  */
   1575 struct CB_GETATTR4args {
   1576 	nfs_fh4	fh;
   1577 	bitmap4	attr_request;
   1578 };
   1579 
   1580 struct CB_GETATTR4resok {
   1581 	fattr4	obj_attributes;
   1582 };
   1583 
   1584 union CB_GETATTR4res switch (nfsstat4 status) {
   1585  case NFS4_OK:
   1586 	 CB_GETATTR4resok	resok4;
   1587  default:
   1588 	 void;
   1589 };
   1590 
   1591 /*
   1592  * CB_RECALL: Recall an Open Delegation
   1593  */
   1594 struct CB_RECALL4args {
   1595 	stateid4	stateid;
   1596 	bool		truncate;
   1597 	nfs_fh4		fh;
   1598 };
   1599 
   1600 struct CB_RECALL4res {
   1601 	nfsstat4	status;
   1602 };
   1603 
   1604 /*
   1605  * CB_ILLEGAL: Response for illegal operation numbers
   1606  */
   1607 struct CB_ILLEGAL4res {
   1608 	nfsstat4        status;
   1609 };
   1610 
   1611 /*
   1612  * Various definitions for CB_COMPOUND
   1613  */
   1614 enum nfs_cb_opnum4 {
   1615 	OP_CB_GETATTR		= 3,
   1616 	OP_CB_RECALL		= 4,
   1617 	OP_CB_ILLEGAL		= 10044
   1618 };
   1619 
   1620 union nfs_cb_argop4 switch (unsigned argop) {
   1621  case OP_CB_GETATTR:	CB_GETATTR4args opcbgetattr;
   1622  case OP_CB_RECALL:	CB_RECALL4args	opcbrecall;
   1623  case OP_CB_ILLEGAL:	void;
   1624 };
   1625 
   1626 union nfs_cb_resop4 switch (unsigned resop){
   1627  case OP_CB_GETATTR:	CB_GETATTR4res	opcbgetattr;
   1628  case OP_CB_RECALL:	CB_RECALL4res	opcbrecall;
   1629  case OP_CB_ILLEGAL:	CB_ILLEGAL4res	opcbillegal;
   1630 };
   1631 
   1632 struct CB_COMPOUND4args {
   1633 	utf8str_cs	tag;
   1634 	uint32_t	minorversion;
   1635 	uint32_t	callback_ident;
   1636 	nfs_cb_argop4	argarray<>;
   1637 };
   1638 
   1639 struct CB_COMPOUND4res {
   1640 	nfsstat4 status;
   1641 	utf8str_cs	tag;
   1642 	nfs_cb_resop4	resarray<>;
   1643 };
   1644 
   1645 
   1646 /*
   1647  * Program number is in the transient range since the client
   1648  * will assign the exact transient program number and provide
   1649  * that to the server via the SETCLIENTID operation.
   1650  */
   1651 program NFS4_CALLBACK {
   1652 	version NFS_CB {
   1653 		void
   1654 			CB_NULL(void) = 0;
   1655 		CB_COMPOUND4res
   1656 			CB_COMPOUND(CB_COMPOUND4args) = 1;
   1657 	} = 1;
   1658 } = 0x40000000;
   1659