xref: /illumos-gate/usr/src/uts/common/nfs/nfs4_kprot.h (revision f44e1126d9eae71c48c5d1de51e24750c6ec20a4)
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 (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
24  * Copyright 2020 RackTop Systems, Inc.
25  */
26 
27 /*
28  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
29  * Use is subject to license terms.
30  */
31 
32 #ifndef _NFS4_KPROT_H
33 #define	_NFS4_KPROT_H
34 
35 /*
36  * Kernel specific version.
37  * NFS Version 4 protocol definitions.  From nfs4_prot.x RFC 5662
38  */
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 #include <rpc/rpc.h>
45 #ifdef _KERNEL
46 #include <rpc/rpc_rdma.h>
47 #endif
48 #include <sys/stream.h>
49 
50 #include <rpc/auth_sys.h>
51 typedef struct authsys_parms authsys_parms;
52 
53 #define	NFS4_FHSIZE 128
54 #define	NFS4_VERIFIER_SIZE 8
55 #define	NFS4_OTHER_SIZE 12
56 
57 /*
58  * Reasonable upper bounds to catch badly behaving partners
59  */
60 #define	NFS4_OPAQUE_LIMIT	1024
61 #define	NFS4_COMPOUND_LIMIT	2048
62 #define	NFS4_FS_LOCATIONS_LIMIT	65536
63 #define	NFS4_ACL_LIMIT		65536
64 #define	NFS4_SECINFO_LIMIT	65536
65 #define	NFS4_FATTR4_LIMIT	1048576
66 #define	NFS4_DATA_LIMIT		134217728
67 
68 #define	NFS4_SESSIONID_SIZE	16
69 
70 enum nfs_ftype4 {
71 	NF4REG = 1,
72 	NF4DIR = 2,
73 	NF4BLK = 3,
74 	NF4CHR = 4,
75 	NF4LNK = 5,
76 	NF4SOCK = 6,
77 	NF4FIFO = 7,
78 	NF4ATTRDIR = 8,
79 	NF4NAMEDATTR = 9
80 };
81 typedef enum nfs_ftype4 nfs_ftype4;
82 
83 enum nfsstat4 {
84 	NFS4_OK = 0,
85 	NFS4ERR_PERM = 1,
86 	NFS4ERR_NOENT = 2,
87 	NFS4ERR_IO = 5,
88 	NFS4ERR_NXIO = 6,
89 	NFS4ERR_ACCESS = 13,
90 	NFS4ERR_EXIST = 17,
91 	NFS4ERR_XDEV = 18,
92 	NFS4ERR_NOTDIR = 20,
93 	NFS4ERR_ISDIR = 21,
94 	NFS4ERR_INVAL = 22,
95 	NFS4ERR_FBIG = 27,
96 	NFS4ERR_NOSPC = 28,
97 	NFS4ERR_ROFS = 30,
98 	NFS4ERR_MLINK = 31,
99 	NFS4ERR_NAMETOOLONG = 63,
100 	NFS4ERR_NOTEMPTY = 66,
101 	NFS4ERR_DQUOT = 69,
102 	NFS4ERR_STALE = 70,
103 	NFS4ERR_BADHANDLE = 10001,
104 	NFS4ERR_BAD_COOKIE = 10003,
105 	NFS4ERR_NOTSUPP = 10004,
106 	NFS4ERR_TOOSMALL = 10005,
107 	NFS4ERR_SERVERFAULT = 10006,
108 	NFS4ERR_BADTYPE = 10007,
109 	NFS4ERR_DELAY = 10008,
110 	NFS4ERR_SAME = 10009,
111 	NFS4ERR_DENIED = 10010,
112 	NFS4ERR_EXPIRED = 10011,
113 	NFS4ERR_LOCKED = 10012,
114 	NFS4ERR_GRACE = 10013,
115 	NFS4ERR_FHEXPIRED = 10014,
116 	NFS4ERR_SHARE_DENIED = 10015,
117 	NFS4ERR_WRONGSEC = 10016,
118 	NFS4ERR_CLID_INUSE = 10017,
119 	NFS4ERR_RESOURCE = 10018,
120 	NFS4ERR_MOVED = 10019,
121 	NFS4ERR_NOFILEHANDLE = 10020,
122 	NFS4ERR_MINOR_VERS_MISMATCH = 10021,
123 	NFS4ERR_STALE_CLIENTID = 10022,
124 	NFS4ERR_STALE_STATEID = 10023,
125 	NFS4ERR_OLD_STATEID = 10024,
126 	NFS4ERR_BAD_STATEID = 10025,
127 	NFS4ERR_BAD_SEQID = 10026,
128 	NFS4ERR_NOT_SAME = 10027,
129 	NFS4ERR_LOCK_RANGE = 10028,
130 	NFS4ERR_SYMLINK = 10029,
131 	NFS4ERR_RESTOREFH = 10030,
132 	NFS4ERR_LEASE_MOVED = 10031,
133 	NFS4ERR_ATTRNOTSUPP = 10032,
134 	NFS4ERR_NO_GRACE = 10033,
135 	NFS4ERR_RECLAIM_BAD = 10034,
136 	NFS4ERR_RECLAIM_CONFLICT = 10035,
137 	NFS4ERR_BADXDR = 10036,
138 	NFS4ERR_LOCKS_HELD = 10037,
139 	NFS4ERR_OPENMODE = 10038,
140 	NFS4ERR_BADOWNER = 10039,
141 	NFS4ERR_BADCHAR = 10040,
142 	NFS4ERR_BADNAME = 10041,
143 	NFS4ERR_BAD_RANGE = 10042,
144 	NFS4ERR_LOCK_NOTSUPP = 10043,
145 	NFS4ERR_OP_ILLEGAL = 10044,
146 	NFS4ERR_DEADLOCK = 10045,
147 	NFS4ERR_FILE_OPEN = 10046,
148 	NFS4ERR_ADMIN_REVOKED = 10047,
149 	NFS4ERR_CB_PATH_DOWN = 10048,
150 	NFS4ERR_BADIOMODE = 10049,	/*  nfsv4.1 */
151 	NFS4ERR_BADLAYOUT = 10050,
152 	NFS4ERR_BAD_SESSION_DIGEST = 10051,
153 	NFS4ERR_BADSESSION = 10052,
154 	NFS4ERR_BADSLOT = 10053,
155 	NFS4ERR_COMPLETE_ALREADY = 10054,
156 	NFS4ERR_CONN_NOT_BOUND_TO_SESSION = 10055,
157 	NFS4ERR_DELEG_ALREADY_WANTED = 10056,
158 	NFS4ERR_BACK_CHAN_BUSY = 10057,
159 	NFS4ERR_LAYOUTTRYLATER = 10058,
160 	NFS4ERR_LAYOUTUNAVAILABLE = 10059,
161 	NFS4ERR_NOMATCHING_LAYOUT = 10060,
162 	NFS4ERR_RECALLCONFLICT = 10061,
163 	NFS4ERR_UNKNOWN_LAYOUTTYPE = 10062,
164 	NFS4ERR_SEQ_MISORDERED = 10063,
165 	NFS4ERR_SEQUENCE_POS = 10064,
166 	NFS4ERR_REQ_TOO_BIG = 10065,
167 	NFS4ERR_REP_TOO_BIG = 10066,
168 	NFS4ERR_REP_TOO_BIG_TO_CACHE = 10067,
169 	NFS4ERR_RETRY_UNCACHED_REP = 10068,
170 	NFS4ERR_UNSAFE_COMPOUND = 10069,
171 	NFS4ERR_TOO_MANY_OPS = 10070,
172 	NFS4ERR_OP_NOT_IN_SESSION = 10071,
173 	NFS4ERR_HASH_ALG_UNSUPP = 10072,
174 	NFS4ERR_CLIENTID_BUSY = 10074,
175 	NFS4ERR_PNFS_IO_HOLE = 10075,
176 	NFS4ERR_SEQ_FALSE_RETRY = 10076,
177 	NFS4ERR_BAD_HIGH_SLOT = 10077,
178 	NFS4ERR_DEADSESSION = 10078,
179 	NFS4ERR_ENCR_ALG_UNSUPP = 10079,
180 	NFS4ERR_PNFS_NO_LAYOUT = 10080,
181 	NFS4ERR_NOT_ONLY_OP = 10081,
182 	NFS4ERR_WRONG_CRED = 10082,
183 	NFS4ERR_WRONG_TYPE = 10083,
184 	NFS4ERR_DIRDELEG_UNAVAIL = 10084,
185 	NFS4ERR_REJECT_DELEG = 10085,
186 	NFS4ERR_RETURNCONFLICT = 10086,
187 	NFS4ERR_DELEG_REVOKED = 10087,
188 
189 	/* for internal use */
190 	NFS4ERR_REPLAY_CACHE = 30000
191 };
192 typedef enum nfsstat4 nfsstat4;
193 
194 /*
195  * A bitmap can only be 56 bits, treat it as a uint64_t for now
196  */
197 typedef uint64_t bitmap4;
198 
199 typedef struct {
200 	uint_t attrlist4_len;
201 	char *attrlist4_val;
202 } attrlist4;
203 
204 typedef uint64_t offset4;
205 
206 typedef uint32_t count4;
207 
208 typedef uint64_t length4;
209 
210 typedef uint64_t clientid4;
211 
212 typedef uint32_t nfs_lease4;
213 
214 typedef uint32_t seqid4;
215 
216 typedef uint32_t sequenceid4;
217 
218 typedef char sessionid4[NFS4_SESSIONID_SIZE];
219 
220 typedef uint32_t slotid4;
221 
222 typedef struct {
223 	uint_t utf8string_len;
224 	char *utf8string_val;
225 } utf8string;
226 
227 typedef utf8string component4;
228 
229 typedef utf8string utf8str_cis;
230 
231 typedef utf8string utf8str_cs;
232 
233 typedef utf8string utf8str_mixed;
234 
235 typedef struct {
236 	uint_t pathname4_len;
237 	component4 *pathname4_val;
238 } pathname4;
239 
240 typedef uint64_t nfs_cookie4;
241 
242 typedef struct {
243 	uint_t linktext4_len;
244 	char *linktext4_val;
245 } linktext4;
246 
247 typedef utf8string ascii_REQUIRED4;
248 
249 typedef struct {
250 	uint_t sec_oid4_len;
251 	char *sec_oid4_val;
252 } sec_oid4;
253 
254 typedef uint32_t qop4;
255 
256 typedef uint32_t mode4;
257 
258 typedef uint64_t changeid4;
259 
260 typedef uint64_t verifier4;
261 
262 struct nfstime4 {
263 	int64_t seconds;
264 	uint32_t nseconds;
265 };
266 typedef struct nfstime4 nfstime4;
267 
268 enum time_how4 {
269 	SET_TO_SERVER_TIME4 = 0,
270 	SET_TO_CLIENT_TIME4 = 1
271 };
272 typedef enum time_how4 time_how4;
273 
274 struct settime4 {
275 	time_how4 set_it;
276 	nfstime4 time;
277 };
278 typedef struct settime4 settime4;
279 
280 typedef struct {
281 	uint_t nfs_fh4_len;
282 	char *nfs_fh4_val;
283 } nfs_fh4;
284 
285 struct fsid4 {
286 	uint64_t major;
287 	uint64_t minor;
288 };
289 typedef struct fsid4 fsid4;
290 
291 struct change_policy4 {
292 	uint64_t cp_major;
293 	uint64_t cp_minor;
294 };
295 typedef struct change_policy4 change_policy4;
296 
297 struct fs_location4 {
298 	uint_t server_len;
299 	utf8string *server_val;
300 	pathname4 rootpath;
301 };
302 typedef struct fs_location4 fs_location4;
303 
304 struct fs_locations4 {
305 	pathname4 fs_root;
306 	uint_t locations_len;
307 	fs_location4 *locations_val;
308 };
309 typedef struct fs_locations4 fs_locations4;
310 
311 /*
312  * This structure is declared in nfs4.h
313  */
314 struct nfs_fsl_info;
315 
316 /*
317  * ACL support
318  */
319 
320 #define	ACL4_SUPPORT_ALLOW_ACL 0x00000001
321 #define	ACL4_SUPPORT_DENY_ACL 0x00000002
322 #define	ACL4_SUPPORT_AUDIT_ACL 0x00000004
323 #define	ACL4_SUPPORT_ALARM_ACL 0x00000008
324 
325 typedef uint32_t acetype4;
326 #define	ACE4_ACCESS_ALLOWED_ACE_TYPE 0x00000000
327 #define	ACE4_ACCESS_DENIED_ACE_TYPE 0x00000001
328 #define	ACE4_SYSTEM_AUDIT_ACE_TYPE 0x00000002
329 #define	ACE4_SYSTEM_ALARM_ACE_TYPE 0x00000003
330 
331 typedef uint32_t aceflag4;
332 #define	ACE4_FILE_INHERIT_ACE 0x00000001
333 #define	ACE4_DIRECTORY_INHERIT_ACE 0x00000002
334 #define	ACE4_NO_PROPAGATE_INHERIT_ACE 0x00000004
335 #define	ACE4_INHERIT_ONLY_ACE 0x00000008
336 #define	ACE4_SUCCESSFUL_ACCESS_ACE_FLAG 0x00000010
337 #define	ACE4_FAILED_ACCESS_ACE_FLAG 0x00000020
338 #define	ACE4_IDENTIFIER_GROUP 0x00000040
339 #define	ACE4_INHERITED_ACE 0x00000080
340 
341 /*
342  * This defines all valid flag bits, as defined by RFC 7530.  If
343  * any additional flag bits are deemed part of the NFSv4 spec,
344  * you must also add them to the definition below.
345  */
346 #define	ACE4_VALID_FLAG_BITS (\
347     ACE4_FILE_INHERIT_ACE | \
348     ACE4_DIRECTORY_INHERIT_ACE | \
349     ACE4_NO_PROPAGATE_INHERIT_ACE | \
350     ACE4_INHERIT_ONLY_ACE | \
351     ACE4_SUCCESSFUL_ACCESS_ACE_FLAG | \
352     ACE4_FAILED_ACCESS_ACE_FLAG | \
353     ACE4_IDENTIFIER_GROUP)
354 
355 typedef uint32_t acemask4;
356 #define	ACE4_READ_DATA 0x00000001
357 #define	ACE4_LIST_DIRECTORY 0x00000001
358 #define	ACE4_WRITE_DATA 0x00000002
359 #define	ACE4_ADD_FILE 0x00000002
360 #define	ACE4_APPEND_DATA 0x00000004
361 #define	ACE4_ADD_SUBDIRECTORY 0x00000004
362 #define	ACE4_READ_NAMED_ATTRS 0x00000008
363 #define	ACE4_WRITE_NAMED_ATTRS 0x00000010
364 #define	ACE4_EXECUTE 0x00000020
365 #define	ACE4_DELETE_CHILD 0x00000040
366 #define	ACE4_READ_ATTRIBUTES 0x00000080
367 #define	ACE4_WRITE_ATTRIBUTES 0x00000100
368 #define	ACE4_WRITE_RETENTION 0x00000200
369 #define	ACE4_WRITE_RETENTION_HOLD 0x00000400
370 #define	ACE4_DELETE 0x00010000
371 #define	ACE4_READ_ACL 0x00020000
372 #define	ACE4_WRITE_ACL 0x00040000
373 #define	ACE4_WRITE_OWNER 0x00080000
374 #define	ACE4_SYNCHRONIZE 0x00100000
375 #define	ACE4_GENERIC_READ 0x00120081
376 #define	ACE4_GENERIC_WRITE 0x00160106
377 #define	ACE4_GENERIC_EXECUTE 0x001200A0
378 /*
379  * This defines all valid access mask bits, as defined by RFC 7530.  If
380  * any additional access mask bits are deemed part of the NFSv4 spec,
381  * you must also add them to the definition below.
382  */
383 #define	ACE4_VALID_MASK_BITS (\
384     ACE4_READ_DATA | \
385     ACE4_LIST_DIRECTORY | \
386     ACE4_WRITE_DATA | \
387     ACE4_ADD_FILE | \
388     ACE4_APPEND_DATA | \
389     ACE4_ADD_SUBDIRECTORY | \
390     ACE4_READ_NAMED_ATTRS | \
391     ACE4_WRITE_NAMED_ATTRS | \
392     ACE4_EXECUTE | \
393     ACE4_DELETE_CHILD | \
394     ACE4_READ_ATTRIBUTES | \
395     ACE4_WRITE_ATTRIBUTES | \
396     ACE4_DELETE | \
397     ACE4_READ_ACL | \
398     ACE4_WRITE_ACL | \
399     ACE4_WRITE_OWNER | \
400     ACE4_SYNCHRONIZE)
401 
402 /* Used to signify an undefined value for an acemask4 */
403 #define	ACE4_MASK_UNDEFINED 0x80000000
404 
405 #define	ACE4_WHO_OWNER		"OWNER@"
406 #define	ACE4_WHO_GROUP		"GROUP@"
407 #define	ACE4_WHO_EVERYONE	"EVERYONE@"
408 
409 struct nfsace4 {
410 	acetype4 type;
411 	aceflag4 flag;
412 	acemask4 access_mask;
413 	utf8string who;
414 };
415 typedef struct nfsace4 nfsace4;
416 
417 typedef uint32_t aclflag4;		/* 4.1 */
418 #define	ACL4_AUTO_INHERIT 0x00000001
419 #define	ACL4_PROTECTED 0x00000002
420 #define	ACL4_DEFAULTED 0x00000004
421 
422 struct nfsacl41 {			/* 4.1 */
423 	aclflag4 na41_flag;
424 	struct {
425 		uint_t na41_aces_len;
426 		nfsace4 *na41_aces_val;
427 	} na41_aces;
428 };
429 typedef struct nfsacl41 nfsacl41;
430 
431 #define	MODE4_SUID 0x800
432 #define	MODE4_SGID 0x400
433 #define	MODE4_SVTX 0x200
434 #define	MODE4_RUSR 0x100
435 #define	MODE4_WUSR 0x080
436 #define	MODE4_XUSR 0x040
437 #define	MODE4_RGRP 0x020
438 #define	MODE4_WGRP 0x010
439 #define	MODE4_XGRP 0x008
440 #define	MODE4_ROTH 0x004
441 #define	MODE4_WOTH 0x002
442 #define	MODE4_XOTH 0x001
443 
444 struct mode_masked4 {			/* 4.1 */
445 	mode4 mm_value_to_set;
446 	mode4 mm_mask_bits;
447 };
448 typedef struct mode_masked4 mode_masked4;
449 
450 /*
451  * ACL conversion helpers
452  */
453 
454 typedef enum {
455 	ace4_unused,
456 	ace4_user_obj,
457 	ace4_user,
458 	ace4_group, /* includes GROUP and GROUP_OBJ */
459 	ace4_other_obj
460 } ace4_to_aent_state_t;
461 
462 typedef struct ace4vals {
463 	utf8string *key; /* NB: not allocated here; points to existing utf8 */
464 	avl_node_t avl;
465 	acemask4 mask;
466 	acemask4 allowed;
467 	acemask4 denied;
468 	int aent_type;
469 } ace4vals_t;
470 
471 typedef struct ace4_list {
472 	ace4vals_t user_obj;
473 	avl_tree_t user;
474 	int numusers;
475 	ace4vals_t group_obj;
476 	avl_tree_t group;
477 	int numgroups;
478 	ace4vals_t other_obj;
479 	acemask4 acl_mask;
480 	int hasmask;
481 	int dfacl_flag;
482 	ace4_to_aent_state_t state;
483 	int seen; /* bitmask of all aclent_t a_type values seen */
484 } ace4_list_t;
485 
486 struct specdata4 {
487 	uint32_t specdata1;
488 	uint32_t specdata2;
489 };
490 typedef struct specdata4 specdata4;
491 #define	FH4_PERSISTENT 0x00000000
492 #define	FH4_NOEXPIRE_WITH_OPEN 0x00000001
493 #define	FH4_VOLATILE_ANY 0x00000002
494 #define	FH4_VOL_MIGRATION 0x00000004
495 #define	FH4_VOL_RENAME 0x00000008
496 
497 /*
498  * nfsv4.1
499  */
500 struct netaddr4 {
501 	char *na_r_netid;
502 	char *na_r_addr;
503 };
504 typedef struct netaddr4 netaddr4;
505 
506 struct nfs_impl_id4 {
507 	utf8str_cis nii_domain;
508 	utf8str_cs nii_name;
509 	nfstime4 nii_date;
510 };
511 typedef struct nfs_impl_id4 nfs_impl_id4;
512 
513 struct stateid4 {
514 	uint32_t seqid;
515 	char other[NFS4_OTHER_SIZE];
516 };
517 typedef struct stateid4 stateid4;
518 
519 enum layouttype4 {
520 	LAYOUT4_NFSV4_1_FILES = 0x1,
521 	LAYOUT4_OSD2_OBJECTS = 0x2,
522 	LAYOUT4_BLOCK_VOLUME = 0x3
523 };
524 typedef enum layouttype4 layouttype4;
525 
526 struct layout_content4 {
527 	layouttype4 loc_type;
528 	struct {
529 		uint_t loc_body_len;
530 		char *loc_body_val;
531 	} loc_body;
532 };
533 typedef struct layout_content4 layout_content4;
534 
535 /*
536  * LAYOUT4_OSD2_OBJECTS loc_body description
537  * is in a separate .x file
538  */
539 
540 /*
541  * LAYOUT4_BLOCK_VOLUME loc_body description
542  * is in a separate .x file
543  */
544 
545 struct layouthint4 {
546 	layouttype4 loh_type;
547 	struct {
548 		uint_t loh_body_len;
549 		char *loh_body_val;
550 	} loh_body;
551 };
552 typedef struct layouthint4 layouthint4;
553 
554 enum layoutiomode4 {
555 	LAYOUTIOMODE4_READ = 1,
556 	LAYOUTIOMODE4_RW = 2,
557 	LAYOUTIOMODE4_ANY = 3
558 };
559 typedef enum layoutiomode4 layoutiomode4;
560 
561 struct layout4 {
562 	offset4 lo_offset;
563 	length4 lo_length;
564 	layoutiomode4 lo_iomode;
565 	layout_content4 lo_content;
566 };
567 typedef struct layout4 layout4;
568 #define	NFS4_DEVICEID4_SIZE 16
569 
570 typedef char deviceid4[NFS4_DEVICEID4_SIZE];
571 
572 struct device_addr4 {
573 	layouttype4 da_layout_type;
574 	struct {
575 		uint_t da_addr_body_len;
576 		char *da_addr_body_val;
577 	} da_addr_body;
578 };
579 typedef struct device_addr4 device_addr4;
580 
581 struct layoutupdate4 {
582 	layouttype4 lou_type;
583 	struct {
584 		uint_t lou_body_len;
585 		char *lou_body_val;
586 	} lou_body;
587 };
588 typedef struct layoutupdate4 layoutupdate4;
589 
590 #define	LAYOUT4_RET_REC_FILE 1
591 #define	LAYOUT4_RET_REC_FSID 2
592 #define	LAYOUT4_RET_REC_ALL 3
593 
594 enum layoutreturn_type4 {
595 	LAYOUTRETURN4_FILE = LAYOUT4_RET_REC_FILE,
596 	LAYOUTRETURN4_FSID = LAYOUT4_RET_REC_FSID,
597 	LAYOUTRETURN4_ALL = LAYOUT4_RET_REC_ALL
598 };
599 typedef enum layoutreturn_type4 layoutreturn_type4;
600 
601 /* layouttype4 specific data */
602 
603 struct layoutreturn_file4 {
604 	offset4 lrf_offset;
605 	length4 lrf_length;
606 	stateid4 lrf_stateid;
607 	struct {
608 		uint_t lrf_body_len;
609 		char *lrf_body_val;
610 	} lrf_body;
611 };
612 typedef struct layoutreturn_file4 layoutreturn_file4;
613 
614 struct layoutreturn4 {
615 	layoutreturn_type4 lr_returntype;
616 	union {
617 		layoutreturn_file4 lr_layout;
618 	} layoutreturn4_u;
619 };
620 typedef struct layoutreturn4 layoutreturn4;
621 
622 enum fs4_status_type {
623 	STATUS4_FIXED = 1,
624 	STATUS4_UPDATED = 2,
625 	STATUS4_VERSIONED = 3,
626 	STATUS4_WRITABLE = 4,
627 	STATUS4_REFERRAL = 5
628 };
629 typedef enum fs4_status_type fs4_status_type;
630 
631 struct fs4_status {
632 	bool_t fss_absent;
633 	fs4_status_type fss_type;
634 	utf8str_cs fss_source;
635 	utf8str_cs fss_current;
636 	int32_t fss_age;
637 	nfstime4 fss_version;
638 };
639 typedef struct fs4_status fs4_status;
640 
641 #define	TH4_READ_SIZE 0
642 #define	TH4_WRITE_SIZE 1
643 #define	TH4_READ_IOSIZE 2
644 #define	TH4_WRITE_IOSIZE 3
645 
646 typedef length4 threshold4_read_size;
647 
648 typedef length4 threshold4_write_size;
649 
650 typedef length4 threshold4_read_iosize;
651 
652 typedef length4 threshold4_write_iosize;
653 
654 struct threshold_item4 {
655 	layouttype4 thi_layout_type;
656 	bitmap4 thi_hintset;
657 	struct {
658 		uint_t thi_hintlist_len;
659 		char *thi_hintlist_val;
660 	} thi_hintlist;
661 };
662 typedef struct threshold_item4 threshold_item4;
663 
664 struct mdsthreshold4 {
665 	struct {
666 		uint_t mth_hints_len;
667 		threshold_item4 *mth_hints_val;
668 	} mth_hints;
669 };
670 typedef struct mdsthreshold4 mdsthreshold4;
671 #define	RET4_DURATION_INFINITE 0xffffffffffffffff
672 
673 struct retention_get4 {
674 	uint64_t rg_duration;
675 	struct {
676 		uint_t rg_begin_time_len;
677 		nfstime4 *rg_begin_time_val;
678 	} rg_begin_time;
679 };
680 typedef struct retention_get4 retention_get4;
681 
682 struct retention_set4 {
683 	bool_t rs_enable;
684 	struct {
685 		uint_t rs_duration_len;
686 		uint64_t *rs_duration_val;
687 	} rs_duration;
688 };
689 typedef struct retention_set4 retention_set4;
690 #define	FSCHARSET_CAP4_CONTAINS_NON_UTF8 0x1
691 #define	FSCHARSET_CAP4_ALLOWS_ONLY_UTF8 0x2
692 
693 typedef uint32_t fs_charset_cap4;
694 
695 /* nfsv4.1 end */
696 
697 typedef bitmap4 fattr4_supported_attrs;
698 
699 typedef nfs_ftype4 fattr4_type;
700 
701 typedef uint32_t fattr4_fh_expire_type;
702 
703 typedef changeid4 fattr4_change;
704 
705 typedef uint64_t fattr4_size;
706 
707 typedef bool_t fattr4_link_support;
708 
709 typedef bool_t fattr4_symlink_support;
710 
711 typedef bool_t fattr4_named_attr;
712 
713 typedef fsid4 fattr4_fsid;
714 
715 typedef bool_t fattr4_unique_handles;
716 
717 typedef nfs_lease4 fattr4_lease_time;
718 
719 typedef nfsstat4 fattr4_rdattr_error;
720 
721 typedef struct {
722 	uint_t fattr4_acl_len;
723 	nfsace4 *fattr4_acl_val;
724 } fattr4_acl;
725 
726 typedef uint32_t fattr4_aclsupport;
727 
728 typedef bool_t fattr4_archive;
729 
730 typedef bool_t fattr4_cansettime;
731 
732 typedef bool_t fattr4_case_insensitive;
733 
734 typedef bool_t fattr4_case_preserving;
735 
736 typedef bool_t fattr4_chown_restricted;
737 
738 typedef uint64_t fattr4_fileid;
739 
740 typedef uint64_t fattr4_files_avail;
741 
742 typedef nfs_fh4 fattr4_filehandle;
743 
744 typedef uint64_t fattr4_files_free;
745 
746 typedef uint64_t fattr4_files_total;
747 
748 typedef fs_locations4 fattr4_fs_locations;
749 
750 typedef bool_t fattr4_hidden;
751 
752 typedef bool_t fattr4_homogeneous;
753 
754 typedef uint64_t fattr4_maxfilesize;
755 
756 typedef uint32_t fattr4_maxlink;
757 
758 typedef uint32_t fattr4_maxname;
759 
760 typedef uint64_t fattr4_maxread;
761 
762 typedef uint64_t fattr4_maxwrite;
763 
764 typedef ascii_REQUIRED4 fattr4_mimetype;
765 
766 typedef mode4 fattr4_mode;
767 
768 typedef mode_masked4 fattr4_mode_set_masked;
769 
770 typedef uint64_t fattr4_mounted_on_fileid;
771 
772 typedef bool_t fattr4_no_trunc;
773 
774 typedef uint32_t fattr4_numlinks;
775 
776 typedef utf8string fattr4_owner;
777 
778 typedef utf8string fattr4_owner_group;
779 
780 typedef uint64_t fattr4_quota_avail_hard;
781 
782 typedef uint64_t fattr4_quota_avail_soft;
783 
784 typedef uint64_t fattr4_quota_used;
785 
786 typedef specdata4 fattr4_rawdev;
787 
788 typedef uint64_t fattr4_space_avail;
789 
790 typedef uint64_t fattr4_space_free;
791 
792 typedef uint64_t fattr4_space_total;
793 
794 typedef uint64_t fattr4_space_used;
795 
796 typedef bool_t fattr4_system;
797 
798 typedef nfstime4 fattr4_time_access;
799 
800 typedef settime4 fattr4_time_access_set;
801 
802 typedef nfstime4 fattr4_time_backup;
803 
804 typedef nfstime4 fattr4_time_create;
805 
806 typedef nfstime4 fattr4_time_delta;
807 
808 typedef nfstime4 fattr4_time_metadata;
809 
810 typedef nfstime4 fattr4_time_modify;
811 
812 typedef settime4 fattr4_time_modify_set;
813 
814 /* nfsv4.1 */
815 typedef bitmap4 fattr4_suppattr_exclcreat;
816 
817 typedef nfstime4 fattr4_dir_notif_delay;
818 
819 typedef nfstime4 fattr4_dirent_notif_delay;
820 
821 typedef struct {
822 	uint_t fattr4_fs_layout_types_len;
823 	layouttype4 *fattr4_fs_layout_types_val;
824 } fattr4_fs_layout_types;
825 
826 typedef fs4_status fattr4_fs_status;
827 
828 typedef fs_charset_cap4 fattr4_fs_charset_cap;
829 
830 typedef uint32_t fattr4_layout_alignment;
831 
832 typedef uint32_t fattr4_layout_blksize;
833 
834 typedef layouthint4 fattr4_layout_hint;
835 
836 typedef struct {
837 	uint_t fattr4_layout_types_len;
838 	layouttype4 *fattr4_layout_types_val;
839 } fattr4_layout_types;
840 
841 typedef mdsthreshold4 fattr4_mdsthreshold;
842 
843 typedef retention_get4 fattr4_retention_get;
844 
845 typedef retention_set4 fattr4_retention_set;
846 
847 typedef retention_get4 fattr4_retentevt_get;
848 
849 typedef retention_set4 fattr4_retentevt_set;
850 
851 typedef uint64_t fattr4_retention_hold;
852 
853 typedef nfsacl41 fattr4_dacl;
854 
855 typedef nfsacl41 fattr4_sacl;
856 
857 typedef change_policy4 fattr4_change_policy;
858 
859 /* nfsv4.1 end */
860 
861 /*
862  * REQUIRED Attributes
863  */
864 #define	FATTR4_SUPPORTED_ATTRS 0
865 #define	FATTR4_TYPE 1
866 #define	FATTR4_FH_EXPIRE_TYPE 2
867 #define	FATTR4_CHANGE 3
868 #define	FATTR4_SIZE 4
869 #define	FATTR4_LINK_SUPPORT 5
870 #define	FATTR4_SYMLINK_SUPPORT 6
871 #define	FATTR4_NAMED_ATTR 7
872 #define	FATTR4_FSID 8
873 #define	FATTR4_UNIQUE_HANDLES 9
874 #define	FATTR4_LEASE_TIME 10
875 #define	FATTR4_RDATTR_ERROR 11
876 #define	FATTR4_FILEHANDLE 19
877 /* new to NFSV4.1 */
878 #define	FATTR4_SUPPATTR_EXCLCREAT 75
879 
880 /*
881  * RECOMMENDED Attributes
882  */
883 #define	FATTR4_ACL 12
884 #define	FATTR4_ACLSUPPORT 13
885 #define	FATTR4_ARCHIVE 14
886 #define	FATTR4_CANSETTIME 15
887 #define	FATTR4_CASE_INSENSITIVE 16
888 #define	FATTR4_CASE_PRESERVING 17
889 #define	FATTR4_CHOWN_RESTRICTED 18
890 #define	FATTR4_FILEID 20
891 #define	FATTR4_FILES_AVAIL 21
892 #define	FATTR4_FILES_FREE 22
893 #define	FATTR4_FILES_TOTAL 23
894 #define	FATTR4_FS_LOCATIONS 24
895 #define	FATTR4_HIDDEN 25
896 #define	FATTR4_HOMOGENEOUS 26
897 #define	FATTR4_MAXFILESIZE 27
898 #define	FATTR4_MAXLINK 28
899 #define	FATTR4_MAXNAME 29
900 #define	FATTR4_MAXREAD 30
901 #define	FATTR4_MAXWRITE 31
902 #define	FATTR4_MIMETYPE 32
903 #define	FATTR4_MODE 33
904 #define	FATTR4_NO_TRUNC 34
905 #define	FATTR4_NUMLINKS 35
906 #define	FATTR4_OWNER 36
907 #define	FATTR4_OWNER_GROUP 37
908 #define	FATTR4_QUOTA_AVAIL_HARD 38
909 #define	FATTR4_QUOTA_AVAIL_SOFT 39
910 #define	FATTR4_QUOTA_USED 40
911 #define	FATTR4_RAWDEV 41
912 #define	FATTR4_SPACE_AVAIL 42
913 #define	FATTR4_SPACE_FREE 43
914 #define	FATTR4_SPACE_TOTAL 44
915 #define	FATTR4_SPACE_USED 45
916 #define	FATTR4_SYSTEM 46
917 #define	FATTR4_TIME_ACCESS 47
918 #define	FATTR4_TIME_ACCESS_SET 48
919 #define	FATTR4_TIME_BACKUP 49
920 #define	FATTR4_TIME_CREATE 50
921 #define	FATTR4_TIME_DELTA 51
922 #define	FATTR4_TIME_METADATA 52
923 #define	FATTR4_TIME_MODIFY 53
924 #define	FATTR4_TIME_MODIFY_SET 54
925 #define	FATTR4_MOUNTED_ON_FILEID 55
926 
927 /* new to NFSV4.1 */
928 #define	FATTR4_DIR_NOTIF_DELAY 56
929 #define	FATTR4_DIRENT_NOTIF_DELAY 57
930 #define	FATTR4_DACL 58
931 #define	FATTR4_SACL 59
932 #define	FATTR4_CHANGE_POLICY 60
933 #define	FATTR4_FS_STATUS 61
934 #define	FATTR4_FS_LAYOUT_TYPES 62
935 #define	FATTR4_LAYOUT_HINT 63
936 #define	FATTR4_LAYOUT_TYPES 64
937 #define	FATTR4_LAYOUT_BLKSIZE 65
938 #define	FATTR4_LAYOUT_ALIGNMENT 66
939 #define	FATTR4_FS_LOCATIONS_INFO 67
940 #define	FATTR4_MDSTHRESHOLD 68
941 #define	FATTR4_RETENTION_GET 69
942 #define	FATTR4_RETENTION_SET 70
943 #define	FATTR4_RETENTEVT_GET 71
944 #define	FATTR4_RETENTEVT_SET 72
945 #define	FATTR4_RETENTION_HOLD 73
946 #define	FATTR4_MODE_SET_MASKED 74
947 #define	FATTR4_SUPPATTR_EXCLCREAT 75
948 #define	FATTR4_FS_CHARSET_CAP 76
949 
950 /* new to NFSv4.2 */
951 #define	FATTR4_SEC_LABEL 80
952 
953 struct fattr4 {
954 	bitmap4 attrmask;
955 	char *attrlist4;
956 	uint_t attrlist4_len;
957 };
958 typedef struct fattr4 fattr4;
959 
960 struct change_info4 {
961 	bool_t atomic;
962 	changeid4 before;
963 	changeid4 after;
964 };
965 typedef struct change_info4 change_info4;
966 
967 struct clientaddr4 {
968 	char *r_netid;
969 	char *r_addr;
970 };
971 typedef struct clientaddr4 clientaddr4;
972 
973 struct cb_client4 {
974 	uint_t cb_program;
975 	clientaddr4 cb_location;
976 };
977 typedef struct cb_client4 cb_client4;
978 
979 struct nfs_client_id4 {
980 	verifier4 verifier;
981 	uint_t id_len;
982 	char *id_val;
983 	struct sockaddr *cl_addr;
984 };
985 typedef struct nfs_client_id4 nfs_client_id4;
986 
987 struct client_owner4 {
988 	verifier4 co_verifier;
989 	struct {
990 		uint_t co_ownerid_len;
991 		char *co_ownerid_val;
992 	} co_ownerid;
993 };
994 typedef struct client_owner4 client_owner4;
995 
996 struct server_owner4 {
997 	uint64_t so_minor_id;
998 	struct {
999 		uint_t so_major_id_len;
1000 		char *so_major_id_val;
1001 	} so_major_id;
1002 };
1003 typedef struct server_owner4 server_owner4;
1004 
1005 struct state_owner4 {
1006 	clientid4 clientid;
1007 	struct {
1008 		uint_t owner_len;
1009 		char *owner_val;
1010 	} owner;
1011 };
1012 typedef struct state_owner4 state_owner4;
1013 
1014 struct open_owner4 {
1015 	clientid4 clientid;
1016 	uint_t owner_len;
1017 	char *owner_val;
1018 };
1019 typedef struct open_owner4 open_owner4;
1020 
1021 struct lock_owner4 {
1022 	clientid4 clientid;
1023 	uint_t owner_len;
1024 	char *owner_val;
1025 };
1026 typedef struct lock_owner4 lock_owner4;
1027 
1028 enum nfs_lock_type4 {
1029 	READ_LT = 1,
1030 	WRITE_LT = 2,
1031 	READW_LT = 3,
1032 	WRITEW_LT = 4
1033 };
1034 typedef enum nfs_lock_type4 nfs_lock_type4;
1035 
1036 /*
1037  * nfsv4.1
1038  */
1039 
1040 /* Input for computing subkeys */
1041 
1042 enum ssv_subkey4 {
1043 	SSV4_SUBKEY_MIC_I2T = 1,
1044 	SSV4_SUBKEY_MIC_T2I = 2,
1045 	SSV4_SUBKEY_SEAL_I2T = 3,
1046 	SSV4_SUBKEY_SEAL_T2I = 4
1047 };
1048 typedef enum ssv_subkey4 ssv_subkey4;
1049 
1050 /* Input for computing smt_hmac */
1051 
1052 struct ssv_mic_plain_tkn4 {
1053 	uint32_t smpt_ssv_seq;
1054 	struct {
1055 		uint_t smpt_orig_plain_len;
1056 		char *smpt_orig_plain_val;
1057 	} smpt_orig_plain;
1058 };
1059 typedef struct ssv_mic_plain_tkn4 ssv_mic_plain_tkn4;
1060 
1061 /* SSV GSS PerMsgToken token */
1062 
1063 struct ssv_mic_tkn4 {
1064 	uint32_t smt_ssv_seq;
1065 	struct {
1066 		uint_t smt_hmac_len;
1067 		char *smt_hmac_val;
1068 	} smt_hmac;
1069 };
1070 typedef struct ssv_mic_tkn4 ssv_mic_tkn4;
1071 
1072 /* Input for computing ssct_encr_data and ssct_hmac */
1073 
1074 struct ssv_seal_plain_tkn4 {
1075 	struct {
1076 		uint_t sspt_confounder_len;
1077 		char *sspt_confounder_val;
1078 	} sspt_confounder;
1079 	uint32_t sspt_ssv_seq;
1080 	struct {
1081 		uint_t sspt_orig_plain_len;
1082 		char *sspt_orig_plain_val;
1083 	} sspt_orig_plain;
1084 	struct {
1085 		uint_t sspt_pad_len;
1086 		char *sspt_pad_val;
1087 	} sspt_pad;
1088 };
1089 typedef struct ssv_seal_plain_tkn4 ssv_seal_plain_tkn4;
1090 
1091 /* SSV GSS SealedMessage token */
1092 
1093 struct ssv_seal_cipher_tkn4 {
1094 	uint32_t ssct_ssv_seq;
1095 	struct {
1096 		uint_t ssct_iv_len;
1097 		char *ssct_iv_val;
1098 	} ssct_iv;
1099 	struct {
1100 		uint_t ssct_encr_data_len;
1101 		char *ssct_encr_data_val;
1102 	} ssct_encr_data;
1103 	struct {
1104 		uint_t ssct_hmac_len;
1105 		char *ssct_hmac_val;
1106 	} ssct_hmac;
1107 };
1108 typedef struct ssv_seal_cipher_tkn4 ssv_seal_cipher_tkn4;
1109 
1110 struct fs_locations_server4 {
1111 	int32_t fls_currency;
1112 	struct {
1113 		uint_t fls_info_len;
1114 		char *fls_info_val;
1115 	} fls_info;
1116 	utf8str_cis fls_server;
1117 };
1118 typedef struct fs_locations_server4 fs_locations_server4;
1119 #define	FSLI4BX_GFLAGS 0
1120 #define	FSLI4BX_TFLAGS 1
1121 #define	FSLI4BX_CLSIMUL 2
1122 #define	FSLI4BX_CLHANDLE 3
1123 #define	FSLI4BX_CLFILEID 4
1124 #define	FSLI4BX_CLWRITEVER 5
1125 #define	FSLI4BX_CLCHANGE 6
1126 #define	FSLI4BX_CLREADDIR 7
1127 #define	FSLI4BX_READRANK 8
1128 #define	FSLI4BX_WRITERANK 9
1129 #define	FSLI4BX_READORDER 10
1130 #define	FSLI4BX_WRITEORDER 11
1131 #define	FSLI4GF_WRITABLE 0x01
1132 #define	FSLI4GF_CUR_REQ 0x02
1133 #define	FSLI4GF_ABSENT 0x04
1134 #define	FSLI4GF_GOING 0x08
1135 #define	FSLI4GF_SPLIT 0x10
1136 #define	FSLI4TF_RDMA 0x01
1137 
1138 struct fs_locations_item4 {
1139 	struct {
1140 		uint_t fli_entries_len;
1141 		fs_locations_server4 *fli_entries_val;
1142 	} fli_entries;
1143 	pathname4 fli_rootpath;
1144 };
1145 typedef struct fs_locations_item4 fs_locations_item4;
1146 
1147 struct fs_locations_info4 {
1148 	uint32_t fli_flags;
1149 	int32_t fli_valid_for;
1150 	pathname4 fli_fs_root;
1151 	struct {
1152 		uint_t fli_items_len;
1153 		fs_locations_item4 *fli_items_val;
1154 	} fli_items;
1155 };
1156 typedef struct fs_locations_info4 fs_locations_info4;
1157 #define	FSLI4IF_VAR_SUB 0x00000001
1158 
1159 typedef fs_locations_info4 fattr4_fs_locations_info;
1160 #define	NFL4_UFLG_MASK			0x0000003F
1161 #define	NFL4_UFLG_DENSE			0x00000001
1162 #define	NFL4_UFLG_COMMIT_THRU_MDS	0x00000002
1163 #define	NFL4_UFLG_STRIPE_UNIT_SIZE_MASK	0xFFFFFFC0
1164 
1165 typedef uint32_t nfl_util4;
1166 
1167 enum filelayout_hint_care4 {
1168 	NFLH4_CARE_DENSE = NFL4_UFLG_DENSE,
1169 	NFLH4_CARE_COMMIT_THRU_MDS = NFL4_UFLG_COMMIT_THRU_MDS,
1170 	NFLH4_CARE_STRIPE_UNIT_SIZE = 0x00000040,
1171 	NFLH4_CARE_STRIPE_COUNT = 0x00000080
1172 };
1173 typedef enum filelayout_hint_care4 filelayout_hint_care4;
1174 
1175 /* Encoded in the loh_body field of data type layouthint4: */
1176 
1177 struct nfsv4_1_file_layouthint4 {
1178 	uint32_t nflh_care;
1179 	nfl_util4 nflh_util;
1180 	count4 nflh_stripe_count;
1181 };
1182 typedef struct nfsv4_1_file_layouthint4 nfsv4_1_file_layouthint4;
1183 
1184 typedef struct {
1185 	uint_t multipath_list4_len;
1186 	netaddr4 *multipath_list4_val;
1187 } multipath_list4;
1188 
1189 /*
1190  * Encoded in the da_addr_body field of
1191  * data type device_addr4:
1192  */
1193 
1194 struct nfsv4_1_file_layout_ds_addr4 {
1195 	struct {
1196 		uint_t nflda_stripe_indices_len;
1197 		uint32_t *nflda_stripe_indices_val;
1198 	} nflda_stripe_indices;
1199 	struct {
1200 		uint_t nflda_multipath_ds_list_len;
1201 		multipath_list4 *nflda_multipath_ds_list_val;
1202 	} nflda_multipath_ds_list;
1203 };
1204 typedef struct nfsv4_1_file_layout_ds_addr4 nfsv4_1_file_layout_ds_addr4;
1205 
1206 /*
1207  * Encoded in the loc_body field of
1208  * data type layout_content4:
1209  */
1210 
1211 struct nfsv4_1_file_layout4 {
1212 	deviceid4 nfl_deviceid;
1213 	nfl_util4 nfl_util;
1214 	uint32_t nfl_first_stripe_index;
1215 	offset4 nfl_pattern_offset;
1216 	struct {
1217 		uint_t nfl_fh_list_len;
1218 		nfs_fh4 *nfl_fh_list_val;
1219 	} nfl_fh_list;
1220 };
1221 typedef struct nfsv4_1_file_layout4 nfsv4_1_file_layout4;
1222 
1223 /*
1224  * Encoded in the lou_body field of data type layoutupdate4:
1225  *      Nothing. lou_body is a zero length array of bytes.
1226  */
1227 
1228 /*
1229  * Encoded in the lrf_body field of
1230  * data type layoutreturn_file4:
1231  *      Nothing. lrf_body is a zero length array of bytes.
1232  */
1233 
1234 /* nfsv4.1 end */
1235 
1236 #define	ACCESS4_READ 0x00000001
1237 #define	ACCESS4_LOOKUP 0x00000002
1238 #define	ACCESS4_MODIFY 0x00000004
1239 #define	ACCESS4_EXTEND 0x00000008
1240 #define	ACCESS4_DELETE 0x00000010
1241 #define	ACCESS4_EXECUTE 0x00000020
1242 
1243 struct ACCESS4args {
1244 	uint32_t access;
1245 };
1246 typedef struct ACCESS4args ACCESS4args;
1247 
1248 struct ACCESS4res {
1249 	nfsstat4 status;
1250 	uint32_t supported;
1251 	uint32_t access;
1252 };
1253 typedef struct ACCESS4res ACCESS4res;
1254 
1255 struct CLOSE4args {
1256 	seqid4 seqid;
1257 	stateid4 open_stateid;
1258 };
1259 typedef struct CLOSE4args CLOSE4args;
1260 
1261 struct CLOSE4res {
1262 	nfsstat4 status;
1263 	stateid4 open_stateid;
1264 };
1265 typedef struct CLOSE4res CLOSE4res;
1266 
1267 struct COMMIT4args {
1268 	offset4 offset;
1269 	count4 count;
1270 };
1271 typedef struct COMMIT4args COMMIT4args;
1272 
1273 struct COMMIT4res {
1274 	nfsstat4 status;
1275 	verifier4 writeverf;
1276 };
1277 typedef struct COMMIT4res COMMIT4res;
1278 
1279 struct CREATE4args {
1280 	nfs_ftype4 type;
1281 	union {
1282 		linktext4 linkdata;
1283 		specdata4 devdata;
1284 	} ftype4_u;
1285 	component4 objname;
1286 	fattr4 createattrs;
1287 };
1288 typedef struct CREATE4args CREATE4args;
1289 
1290 struct CREATE4cargs {
1291 	nfs_ftype4 type;
1292 	union {
1293 		char *clinkdata;
1294 		specdata4 devdata;
1295 	} ftype4_u;
1296 	char *cname;
1297 	fattr4 createattrs;
1298 };
1299 typedef struct CREATE4cargs CREATE4cargs;
1300 
1301 struct CREATE4res {
1302 	nfsstat4 status;
1303 	change_info4 cinfo;
1304 	bitmap4 attrset;
1305 };
1306 typedef struct CREATE4res CREATE4res;
1307 
1308 struct DELEGPURGE4args {
1309 	clientid4 clientid;
1310 };
1311 typedef struct DELEGPURGE4args DELEGPURGE4args;
1312 
1313 struct DELEGPURGE4res {
1314 	nfsstat4 status;
1315 };
1316 typedef struct DELEGPURGE4res DELEGPURGE4res;
1317 
1318 struct DELEGRETURN4args {
1319 	stateid4 deleg_stateid;
1320 };
1321 typedef struct DELEGRETURN4args DELEGRETURN4args;
1322 
1323 struct DELEGRETURN4res {
1324 	nfsstat4 status;
1325 };
1326 typedef struct DELEGRETURN4res DELEGRETURN4res;
1327 
1328 struct mntinfo4;
1329 
1330 struct GETATTR4args {
1331 	bitmap4 attr_request;
1332 	struct mntinfo4 *mi;
1333 };
1334 typedef struct GETATTR4args GETATTR4args;
1335 
1336 struct nfs4_ga_ext_res;
1337 
1338 struct nfs4_ga_res {
1339 	vattr_t				n4g_va;
1340 	unsigned			n4g_change_valid:1;
1341 	unsigned			n4g_mon_fid_valid:1;
1342 	unsigned			n4g_fsid_valid:1;
1343 	uint_t				n4g_attrerr;
1344 	uint_t				n4g_attrwhy;
1345 	bitmap4				n4g_resbmap;
1346 	fattr4_change			n4g_change;
1347 	fattr4_fsid			n4g_fsid;
1348 	fattr4_mounted_on_fileid	n4g_mon_fid;
1349 	struct nfs4_ga_ext_res		*n4g_ext_res;
1350 	vsecattr_t			n4g_vsa;
1351 };
1352 typedef struct nfs4_ga_res nfs4_ga_res_t;
1353 
1354 struct GETATTR4res {
1355 	nfsstat4 status;
1356 	fattr4 obj_attributes;
1357 	nfsstat4	ga_status;
1358 	struct nfs4_ga_res ga_res;
1359 };
1360 typedef struct GETATTR4res GETATTR4res;
1361 
1362 struct GETFH4res {
1363 	nfsstat4 status;
1364 	nfs_fh4 object;
1365 };
1366 typedef struct GETFH4res GETFH4res;
1367 
1368 struct LINK4args {
1369 	component4 newname;
1370 };
1371 typedef struct LINK4args LINK4args;
1372 
1373 struct LINK4cargs {
1374 	char *cnewname;
1375 };
1376 typedef struct LINK4cargs LINK4cargs;
1377 
1378 struct LINK4res {
1379 	nfsstat4 status;
1380 	change_info4 cinfo;
1381 };
1382 typedef struct LINK4res LINK4res;
1383 
1384 struct open_to_lock_owner4 {
1385 	seqid4 open_seqid;
1386 	stateid4 open_stateid;
1387 	seqid4 lock_seqid;
1388 	lock_owner4 lock_owner;
1389 };
1390 typedef struct open_to_lock_owner4 open_to_lock_owner4;
1391 
1392 struct exist_lock_owner4 {
1393 	stateid4 lock_stateid;
1394 	seqid4 lock_seqid;
1395 };
1396 typedef struct exist_lock_owner4 exist_lock_owner4;
1397 
1398 struct locker4 {
1399 	bool_t new_lock_owner;
1400 	union {
1401 		open_to_lock_owner4 open_owner;
1402 		exist_lock_owner4 lock_owner;
1403 	} locker4_u;
1404 };
1405 typedef struct locker4 locker4;
1406 
1407 struct LOCK4args {
1408 	nfs_lock_type4 locktype;
1409 	bool_t reclaim;
1410 	offset4 offset;
1411 	length4 length;
1412 	locker4 locker;
1413 };
1414 typedef struct LOCK4args LOCK4args;
1415 
1416 struct LOCK4denied {
1417 	offset4 offset;
1418 	length4 length;
1419 	nfs_lock_type4 locktype;
1420 	lock_owner4 owner;
1421 };
1422 typedef struct LOCK4denied LOCK4denied;
1423 
1424 struct LOCK4res {
1425 	nfsstat4 status;
1426 	union {
1427 		stateid4 lock_stateid;
1428 		LOCK4denied denied;
1429 	} LOCK4res_u;
1430 };
1431 typedef struct LOCK4res LOCK4res;
1432 
1433 struct LOCKT4args {
1434 	nfs_lock_type4 locktype;
1435 	offset4 offset;
1436 	length4 length;
1437 	lock_owner4 owner;
1438 };
1439 typedef struct LOCKT4args LOCKT4args;
1440 
1441 struct LOCKT4res {
1442 	nfsstat4 status;
1443 	LOCK4denied denied;
1444 };
1445 typedef struct LOCKT4res LOCKT4res;
1446 
1447 struct LOCKU4args {
1448 	nfs_lock_type4 locktype;
1449 	seqid4 seqid;
1450 	stateid4 lock_stateid;
1451 	offset4 offset;
1452 	length4 length;
1453 };
1454 typedef struct LOCKU4args LOCKU4args;
1455 
1456 struct LOCKU4res {
1457 	nfsstat4 status;
1458 	stateid4 lock_stateid;
1459 };
1460 typedef struct LOCKU4res LOCKU4res;
1461 
1462 struct LOOKUP4args {
1463 	component4 objname;
1464 };
1465 typedef struct LOOKUP4args LOOKUP4args;
1466 
1467 struct LOOKUP4cargs {
1468 	char *cname;
1469 };
1470 typedef struct LOOKUP4cargs LOOKUP4cargs;
1471 
1472 struct LOOKUP4res {
1473 	nfsstat4 status;
1474 };
1475 typedef struct LOOKUP4res LOOKUP4res;
1476 
1477 struct LOOKUPP4res {
1478 	nfsstat4 status;
1479 };
1480 typedef struct LOOKUPP4res LOOKUPP4res;
1481 
1482 struct NVERIFY4args {
1483 	fattr4 obj_attributes;
1484 };
1485 typedef struct NVERIFY4args NVERIFY4args;
1486 
1487 struct NVERIFY4res {
1488 	nfsstat4 status;
1489 };
1490 typedef struct NVERIFY4res NVERIFY4res;
1491 
1492 enum createmode4 {
1493 	UNCHECKED4 = 0,
1494 	GUARDED4 = 1,
1495 	EXCLUSIVE4 = 2,
1496 	EXCLUSIVE4_1 = 3
1497 };
1498 typedef enum createmode4 createmode4;
1499 
1500 struct creatverfattr {
1501 	verifier4 cva_verf;
1502 	fattr4 cva_attrs;
1503 };
1504 typedef struct creatverfattr creatverfattr;
1505 
1506 struct createhow4 {
1507 	createmode4 mode;
1508 	union {
1509 		fattr4 createattrs;
1510 		verifier4 createverf;
1511 		creatverfattr ch_createboth;
1512 	} createhow4_u;
1513 };
1514 typedef struct createhow4 createhow4;
1515 
1516 enum opentype4 {
1517 	OPEN4_NOCREATE = 0,
1518 	OPEN4_CREATE = 1
1519 };
1520 typedef enum opentype4 opentype4;
1521 
1522 struct openflag4 {
1523 	opentype4 opentype;
1524 	union {
1525 		createhow4 how;
1526 	} openflag4_u;
1527 };
1528 typedef struct openflag4 openflag4;
1529 
1530 enum limit_by4 {
1531 	NFS_LIMIT_SIZE = 1,
1532 	NFS_LIMIT_BLOCKS = 2
1533 };
1534 typedef enum limit_by4 limit_by4;
1535 
1536 struct nfs_modified_limit4 {
1537 	uint32_t num_blocks;
1538 	uint32_t bytes_per_block;
1539 };
1540 typedef struct nfs_modified_limit4 nfs_modified_limit4;
1541 
1542 struct nfs_space_limit4 {
1543 	limit_by4 limitby;
1544 	union {
1545 		uint64_t filesize;
1546 		nfs_modified_limit4 mod_blocks;
1547 	} nfs_space_limit4_u;
1548 };
1549 typedef struct nfs_space_limit4 nfs_space_limit4;
1550 
1551 #define	OPEN4_SHARE_ACCESS_MASK 0x00FF
1552 #define	OPEN4_SHARE_ACCESS_READ 0x00000001
1553 #define	OPEN4_SHARE_ACCESS_WRITE 0x00000002
1554 #define	OPEN4_SHARE_ACCESS_BOTH 0x00000003
1555 #define	OPEN4_SHARE_DENY_NONE 0x00000000
1556 #define	OPEN4_SHARE_DENY_READ 0x00000001
1557 #define	OPEN4_SHARE_DENY_WRITE 0x00000002
1558 #define	OPEN4_SHARE_DENY_BOTH 0x00000003
1559 /* nfsv4.1 */
1560 #define	OPEN4_SHARE_WANT_MASK		0xFF00
1561 #define	OPEN4_SHARE_WANT_NO_PREFERENCE	0x0000
1562 #define	OPEN4_SHARE_WANT_READ_DELEG	0x0100
1563 #define	OPEN4_SHARE_WANT_WRITE_DELEG	0x0200
1564 #define	OPEN4_SHARE_WANT_ANY_DELEG	0x0300
1565 #define	OPEN4_SHARE_WANT_NO_DELEG	0x0400
1566 #define	OPEN4_SHARE_WANT_CANCEL		0x0500
1567 
1568 #define	OPEN4_SHARE_WHEN_MASK			  0xF0000
1569 #define	OPEN4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL 0x10000
1570 #define	OPEN4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED   0x20000
1571 
1572 enum open_delegation_type4 {
1573 	OPEN_DELEGATE_NONE = 0,
1574 	OPEN_DELEGATE_READ = 1,
1575 	OPEN_DELEGATE_WRITE = 2,
1576 	OPEN_DELEGATE_NONE_EXT = 3
1577 };
1578 typedef enum open_delegation_type4 open_delegation_type4;
1579 
1580 enum open_claim_type4 {
1581 	CLAIM_NULL = 0,
1582 	CLAIM_PREVIOUS = 1,
1583 	CLAIM_DELEGATE_CUR = 2,
1584 	CLAIM_DELEGATE_PREV = 3,
1585 	CLAIM_FH = 4,
1586 	CLAIM_DELEG_CUR_FH = 5,
1587 	CLAIM_DELEG_PREV_FH = 6
1588 };
1589 typedef enum open_claim_type4 open_claim_type4;
1590 
1591 struct open_claim_delegate_cur4 {
1592 	stateid4 delegate_stateid;
1593 	component4 file;
1594 };
1595 typedef struct open_claim_delegate_cur4 open_claim_delegate_cur4;
1596 
1597 struct copen_claim_delegate_cur4 {
1598 	stateid4 delegate_stateid;
1599 	char *cfile;
1600 };
1601 typedef struct copen_claim_delegate_cur4 copen_claim_delegate_cur4;
1602 
1603 struct open_claim4 {
1604 	open_claim_type4 claim;
1605 	union {
1606 		component4 file;
1607 		open_delegation_type4 delegate_type;
1608 		open_claim_delegate_cur4 delegate_cur_info;
1609 		component4 file_delegate_prev;
1610 		stateid4 oc_delegate_stateid;
1611 	} open_claim4_u;
1612 };
1613 typedef struct open_claim4 open_claim4;
1614 
1615 struct OPEN4args {
1616 	seqid4 seqid;
1617 	uint32_t share_access;
1618 	uint32_t deleg_want;	/* nfsv4.1 */
1619 	uint32_t share_deny;
1620 	open_owner4 owner;
1621 	opentype4 opentype;
1622 	createmode4 mode;
1623 	union {
1624 		fattr4 createattrs;
1625 		verifier4 createverf;
1626 		creatverfattr ch_createboth; /* for nfsv4.1 */
1627 	} createhow4_u;
1628 	open_claim4 claim;
1629 };
1630 typedef struct OPEN4args OPEN4args;
1631 
1632 struct OPEN4cargs {
1633 	seqid4 seqid;
1634 	uint32_t share_access;
1635 	uint32_t share_deny;
1636 	open_owner4 owner;
1637 	opentype4 opentype;
1638 	createmode4 mode;
1639 	union {
1640 		fattr4 createattrs;
1641 		verifier4 createverf;
1642 	} createhow4_u;
1643 	open_claim_type4 claim;
1644 	union {
1645 		char *cfile;
1646 		open_delegation_type4 delegate_type;
1647 		copen_claim_delegate_cur4 delegate_cur_info;
1648 		char *cfile_delegate_prev;
1649 	} open_claim4_u;
1650 };
1651 typedef struct OPEN4cargs OPEN4cargs;
1652 
1653 struct open_read_delegation4 {
1654 	stateid4 stateid;
1655 	bool_t recall;
1656 	nfsace4 permissions;
1657 };
1658 typedef struct open_read_delegation4 open_read_delegation4;
1659 
1660 struct open_write_delegation4 {
1661 	stateid4 stateid;
1662 	bool_t recall;
1663 	nfs_space_limit4 space_limit;
1664 	nfsace4 permissions;
1665 };
1666 typedef struct open_write_delegation4 open_write_delegation4;
1667 
1668 /* nfsv4.1 */
1669 enum why_no_delegation4 {
1670 	WND4_NOT_WANTED = 0,
1671 	WND4_CONTENTION = 1,
1672 	WND4_RESOURCE = 2,
1673 	WND4_NOT_SUPP_FTYPE = 3,
1674 	WND4_WRITE_DELEG_NOT_SUPP_FTYPE = 4,
1675 	WND4_NOT_SUPP_UPGRADE = 5,
1676 	WND4_NOT_SUPP_DOWNGRADE = 6,
1677 	WND4_CANCELLED = 7,
1678 	WND4_IS_DIR = 8
1679 };
1680 typedef enum why_no_delegation4 why_no_delegation4;
1681 
1682 struct open_none_delegation4 {
1683 	why_no_delegation4 ond_why;
1684 	union {
1685 		bool_t ond_server_will_push_deleg;
1686 		bool_t ond_server_will_signal_avail;
1687 	} open_none_delegation4_u;
1688 };
1689 typedef struct open_none_delegation4 open_none_delegation4;
1690 
1691 /* nfsv4.1 end */
1692 
1693 struct open_delegation4 {
1694 	open_delegation_type4 delegation_type;
1695 	union {
1696 		open_read_delegation4 read;
1697 		open_write_delegation4 write;
1698 		open_none_delegation4 od_whynone; /* nfsv4.1 */
1699 	} open_delegation4_u;
1700 };
1701 typedef struct open_delegation4 open_delegation4;
1702 #define	OPEN4_RESULT_CONFIRM 0x00000002
1703 #define	OPEN4_RESULT_LOCKTYPE_POSIX 0x00000004
1704 #define	OPEN4_RESULT_PRESERVE_UNLINKED 0x00000008 /* nfsv4.1 */
1705 #define	OPEN4_RESULT_MAY_NOTIFY_LOCK 0x00000020	  /* nfsv4.1 */
1706 
1707 struct OPEN4res {
1708 	nfsstat4 status;
1709 	stateid4 stateid;
1710 	change_info4 cinfo;
1711 	uint32_t rflags;
1712 	bitmap4 attrset;
1713 	open_delegation4 delegation;
1714 };
1715 typedef struct OPEN4res OPEN4res;
1716 
1717 struct OPENATTR4args {
1718 	bool_t createdir;
1719 };
1720 typedef struct OPENATTR4args OPENATTR4args;
1721 
1722 struct OPENATTR4res {
1723 	nfsstat4 status;
1724 };
1725 typedef struct OPENATTR4res OPENATTR4res;
1726 
1727 struct OPEN_CONFIRM4args {
1728 	stateid4 open_stateid;
1729 	seqid4 seqid;
1730 };
1731 typedef struct OPEN_CONFIRM4args OPEN_CONFIRM4args;
1732 
1733 struct OPEN_CONFIRM4res {
1734 	nfsstat4 status;
1735 	stateid4 open_stateid;
1736 };
1737 typedef struct OPEN_CONFIRM4res OPEN_CONFIRM4res;
1738 
1739 struct OPEN_DOWNGRADE4args {
1740 	stateid4 open_stateid;
1741 	seqid4 seqid;
1742 	uint32_t share_access;
1743 	uint32_t deleg_want;	/* nfsv4.1 */
1744 	uint32_t share_deny;
1745 };
1746 typedef struct OPEN_DOWNGRADE4args OPEN_DOWNGRADE4args;
1747 
1748 struct OPEN_DOWNGRADE4res {
1749 	nfsstat4 status;
1750 	stateid4 open_stateid;
1751 };
1752 typedef struct OPEN_DOWNGRADE4res OPEN_DOWNGRADE4res;
1753 
1754 struct PUTFH4args {
1755 	nfs_fh4 object;
1756 };
1757 typedef struct PUTFH4args PUTFH4args;
1758 
1759 /*
1760  * Client only side PUTFH arguments
1761  * This is really a nfs4_sharedfh_t * but the forward declaration
1762  * is problematic;
1763  */
1764 struct PUTFH4cargs {
1765 	void *sfh;
1766 };
1767 typedef struct PUTFH4cargs PUTFH4cargs;
1768 
1769 struct PUTFH4res {
1770 	nfsstat4 status;
1771 };
1772 typedef struct PUTFH4res PUTFH4res;
1773 
1774 struct PUTPUBFH4res {
1775 	nfsstat4 status;
1776 };
1777 typedef struct PUTPUBFH4res PUTPUBFH4res;
1778 
1779 struct PUTROOTFH4res {
1780 	nfsstat4 status;
1781 };
1782 typedef struct PUTROOTFH4res PUTROOTFH4res;
1783 
1784 struct READ4args {
1785 	stateid4 stateid;
1786 	offset4 offset;
1787 	count4 count;
1788 	/* The following are used for the XDR decode path */
1789 	char *res_data_val_alt;
1790 	mblk_t *res_mblk;
1791 	struct uio *res_uiop;
1792 	uint_t res_maxsize;
1793 #ifdef _KERNEL
1794 	struct clist *wlist;
1795 	CONN *conn;
1796 #endif
1797 };
1798 typedef struct READ4args READ4args;
1799 
1800 struct READ4res {
1801 	nfsstat4 status;
1802 	bool_t eof;
1803 	uint_t data_len;
1804 	char *data_val;
1805 	mblk_t *mblk;
1806 #ifdef _KERNEL
1807 	struct clist *wlist;
1808 	uint_t wlist_len;
1809 #endif
1810 };
1811 typedef struct READ4res READ4res;
1812 
1813 struct rddir4_cache;
1814 
1815 struct READDIR4args {
1816 	nfs_cookie4 cookie;
1817 	verifier4 cookieverf;
1818 	count4 dircount;
1819 	count4 maxcount;
1820 	bitmap4 attr_request;
1821 	vnode_t *dvp;
1822 	struct mntinfo4 *mi;
1823 	cred_t *cr;
1824 	struct rddir4_cache *rdc;
1825 	hrtime_t t;
1826 };
1827 typedef struct READDIR4args READDIR4args;
1828 
1829 struct READDIR4res_clnt {
1830 	nfsstat4 status;
1831 	verifier4 cookieverf;
1832 	bool_t eof;
1833 	struct dirent64 *dotp, *dotdotp;
1834 	struct rddir4_cache *rdc;
1835 };
1836 typedef struct READDIR4res_clnt READDIR4res_clnt;
1837 
1838 struct READDIR4res {
1839 	nfsstat4 status;
1840 	verifier4 cookieverf;
1841 	mblk_t *mblk;
1842 	uint_t data_len;
1843 };
1844 typedef struct READDIR4res READDIR4res;
1845 
1846 struct READLINK4res {
1847 	nfsstat4 status;
1848 	linktext4 link;
1849 };
1850 typedef struct READLINK4res READLINK4res;
1851 
1852 struct REMOVE4args {
1853 	component4 target;
1854 };
1855 typedef struct REMOVE4args REMOVE4args;
1856 
1857 struct REMOVE4cargs {
1858 	char *ctarget;
1859 };
1860 typedef struct REMOVE4cargs REMOVE4cargs;
1861 
1862 struct REMOVE4res {
1863 	nfsstat4 status;
1864 	change_info4 cinfo;
1865 };
1866 typedef struct REMOVE4res REMOVE4res;
1867 
1868 struct RENAME4args {
1869 	component4 oldname;
1870 	component4 newname;
1871 };
1872 typedef struct RENAME4args RENAME4args;
1873 
1874 struct RENAME4cargs {
1875 	char *coldname;
1876 	char *cnewname;
1877 };
1878 typedef struct RENAME4cargs RENAME4cargs;
1879 
1880 struct RENAME4res {
1881 	nfsstat4 status;
1882 	change_info4 source_cinfo;
1883 	change_info4 target_cinfo;
1884 };
1885 typedef struct RENAME4res RENAME4res;
1886 
1887 struct RENEW4args {
1888 	clientid4 clientid;
1889 };
1890 typedef struct RENEW4args RENEW4args;
1891 
1892 struct RENEW4res {
1893 	nfsstat4 status;
1894 };
1895 typedef struct RENEW4res RENEW4res;
1896 
1897 struct RESTOREFH4res {
1898 	nfsstat4 status;
1899 };
1900 typedef struct RESTOREFH4res RESTOREFH4res;
1901 
1902 struct SAVEFH4res {
1903 	nfsstat4 status;
1904 };
1905 typedef struct SAVEFH4res SAVEFH4res;
1906 
1907 struct SECINFO4args {
1908 	component4 name;
1909 };
1910 typedef struct SECINFO4args SECINFO4args;
1911 
1912 struct SECINFO4cargs {
1913 	char *cname;
1914 };
1915 typedef struct SECINFO4cargs SECINFO4cargs;
1916 
1917 enum rpc_gss_svc_t {
1918 	RPC_GSS_SVC_NONE = 1,
1919 	RPC_GSS_SVC_INTEGRITY = 2,
1920 	RPC_GSS_SVC_PRIVACY = 3
1921 };
1922 typedef enum rpc_gss_svc_t rpc_gss_svc_t;
1923 
1924 struct rpcsec_gss_info {
1925 	sec_oid4 oid;
1926 	qop4 qop;
1927 	rpc_gss_svc_t service;
1928 };
1929 typedef struct rpcsec_gss_info rpcsec_gss_info;
1930 
1931 struct secinfo4 {
1932 	uint32_t flavor;
1933 	rpcsec_gss_info flavor_info;
1934 };
1935 typedef struct secinfo4 secinfo4;
1936 
1937 struct SECINFO4res {
1938 	nfsstat4 status;
1939 	uint_t SECINFO4resok_len;
1940 	secinfo4 *SECINFO4resok_val;
1941 };
1942 typedef struct SECINFO4res SECINFO4res;
1943 
1944 struct SETATTR4args {
1945 	stateid4 stateid;
1946 	fattr4 obj_attributes;
1947 };
1948 typedef struct SETATTR4args SETATTR4args;
1949 
1950 struct SETATTR4res {
1951 	nfsstat4 status;
1952 	bitmap4 attrsset;
1953 };
1954 typedef struct SETATTR4res SETATTR4res;
1955 
1956 struct SETCLIENTID4args {
1957 	nfs_client_id4 client;
1958 	cb_client4 callback;
1959 	uint32_t callback_ident;
1960 };
1961 typedef struct SETCLIENTID4args SETCLIENTID4args;
1962 
1963 struct SETCLIENTID4resok {
1964 	clientid4 clientid;
1965 	verifier4 setclientid_confirm;
1966 };
1967 typedef struct SETCLIENTID4resok SETCLIENTID4resok;
1968 
1969 struct SETCLIENTID4res {
1970 	nfsstat4 status;
1971 	union {
1972 		SETCLIENTID4resok resok4;
1973 		clientaddr4 client_using;
1974 	} SETCLIENTID4res_u;
1975 };
1976 typedef struct SETCLIENTID4res SETCLIENTID4res;
1977 
1978 struct SETCLIENTID_CONFIRM4args {
1979 	clientid4 clientid;
1980 	verifier4 setclientid_confirm;
1981 };
1982 typedef struct SETCLIENTID_CONFIRM4args SETCLIENTID_CONFIRM4args;
1983 
1984 struct SETCLIENTID_CONFIRM4res {
1985 	nfsstat4 status;
1986 };
1987 typedef struct SETCLIENTID_CONFIRM4res SETCLIENTID_CONFIRM4res;
1988 
1989 struct VERIFY4args {
1990 	fattr4 obj_attributes;
1991 };
1992 typedef struct VERIFY4args VERIFY4args;
1993 
1994 struct VERIFY4res {
1995 	nfsstat4 status;
1996 };
1997 typedef struct VERIFY4res VERIFY4res;
1998 
1999 enum stable_how4 {
2000 	UNSTABLE4 = 0,
2001 	DATA_SYNC4 = 1,
2002 	FILE_SYNC4 = 2
2003 };
2004 typedef enum stable_how4 stable_how4;
2005 
2006 /*
2007  * mblk doesn't go over the wire.  If non-NULL, it points to an mblk chain
2008  * for the write data.
2009  */
2010 
2011 struct WRITE4args {
2012 	stateid4 stateid;
2013 	offset4 offset;
2014 	stable_how4 stable;
2015 	uint_t data_len;
2016 	char *data_val;
2017 	mblk_t *mblk;
2018 #ifdef _KERNEL
2019 	struct clist *rlist;
2020 	CONN *conn;
2021 #endif
2022 };
2023 typedef struct WRITE4args WRITE4args;
2024 
2025 struct WRITE4res {
2026 	nfsstat4 status;
2027 	count4 count;
2028 	stable_how4 committed;
2029 	verifier4 writeverf;
2030 };
2031 typedef struct WRITE4res WRITE4res;
2032 
2033 struct RELEASE_LOCKOWNER4args {
2034 	lock_owner4 lock_owner;
2035 };
2036 typedef struct RELEASE_LOCKOWNER4args RELEASE_LOCKOWNER4args;
2037 
2038 struct RELEASE_LOCKOWNER4res {
2039 	nfsstat4 status;
2040 };
2041 typedef struct RELEASE_LOCKOWNER4res RELEASE_LOCKOWNER4res;
2042 
2043 struct ILLEGAL4res {
2044 	nfsstat4 status;
2045 };
2046 typedef struct ILLEGAL4res ILLEGAL4res;
2047 
2048 /*
2049  * New operations for nfsv4.1
2050  */
2051 typedef struct {
2052 	uint_t gsshandle4_t_len;
2053 	char *gsshandle4_t_val;
2054 } gsshandle4_t;
2055 
2056 struct gss_cb_handles4 {
2057 	rpc_gss_svc_t gcbp_service;
2058 	gsshandle4_t gcbp_handle_from_server;
2059 	gsshandle4_t gcbp_handle_from_client;
2060 };
2061 typedef struct gss_cb_handles4 gss_cb_handles4;
2062 
2063 struct callback_sec_parms4 {
2064 	uint32_t cb_secflavor;
2065 	union {
2066 		authsys_parms cbsp_sys_cred;
2067 		gss_cb_handles4 cbsp_gss_handles;
2068 	} callback_sec_parms4_u;
2069 };
2070 typedef struct callback_sec_parms4 callback_sec_parms4;
2071 
2072 struct BACKCHANNEL_CTL4args {
2073 	uint32_t bca_cb_program;
2074 	struct {
2075 		uint_t bca_sec_parms_len;
2076 		callback_sec_parms4 *bca_sec_parms_val;
2077 	} bca_sec_parms;
2078 };
2079 typedef struct BACKCHANNEL_CTL4args BACKCHANNEL_CTL4args;
2080 
2081 struct BACKCHANNEL_CTL4res {
2082 	nfsstat4 bcr_status;
2083 };
2084 typedef struct BACKCHANNEL_CTL4res BACKCHANNEL_CTL4res;
2085 
2086 enum channel_dir_from_client4 {
2087 	CDFC4_FORE = 0x1,
2088 	CDFC4_BACK = 0x2,
2089 	CDFC4_FORE_OR_BOTH = 0x3,
2090 	CDFC4_BACK_OR_BOTH = 0x7
2091 };
2092 typedef enum channel_dir_from_client4 channel_dir_from_client4;
2093 
2094 struct BIND_CONN_TO_SESSION4args {
2095 	sessionid4 bctsa_sessid;
2096 	channel_dir_from_client4 bctsa_dir;
2097 	bool_t bctsa_use_conn_in_rdma_mode;
2098 };
2099 typedef struct BIND_CONN_TO_SESSION4args BIND_CONN_TO_SESSION4args;
2100 
2101 enum channel_dir_from_server4 {
2102 	CDFS4_FORE = 0x1,
2103 	CDFS4_BACK = 0x2,
2104 	CDFS4_BOTH = 0x3
2105 };
2106 typedef enum channel_dir_from_server4 channel_dir_from_server4;
2107 
2108 struct BIND_CONN_TO_SESSION4resok {
2109 	sessionid4 bctsr_sessid;
2110 	channel_dir_from_server4 bctsr_dir;
2111 	bool_t bctsr_use_conn_in_rdma_mode;
2112 };
2113 typedef struct BIND_CONN_TO_SESSION4resok BIND_CONN_TO_SESSION4resok;
2114 
2115 struct BIND_CONN_TO_SESSION4res {
2116 	nfsstat4 bctsr_status;
2117 	union {
2118 		BIND_CONN_TO_SESSION4resok bctsr_resok4;
2119 	} BIND_CONN_TO_SESSION4res_u;
2120 };
2121 typedef struct BIND_CONN_TO_SESSION4res BIND_CONN_TO_SESSION4res;
2122 
2123 #define	EXCHGID4_FLAG_SUPP_MOVED_REFER	  0x00000001
2124 #define	EXCHGID4_FLAG_SUPP_MOVED_MIGR	  0x00000002
2125 #define	EXCHGID4_FLAG_BIND_PRINC_STATEID  0x00000100
2126 
2127 #define	EXCHGID4_FLAG_USE_NON_PNFS	  0x00010000
2128 #define	EXCHGID4_FLAG_USE_PNFS_MDS	  0x00020000
2129 #define	EXCHGID4_FLAG_USE_PNFS_DS	  0x00040000
2130 #define	EXCHGID4_FLAG_MASK_PNFS		  0x00070000
2131 
2132 #define	EXCHGID4_FLAG_UPD_CONFIRMED_REC_A 0x40000000
2133 #define	EXCHGID4_FLAG_CONFIRMED_R	  0x80000000
2134 
2135 #define	EXID4_FLAG_MASK		0x40070103
2136 
2137 struct state_protect_ops4 {
2138 	bitmap4 spo_must_enforce;
2139 	bitmap4 spo_must_allow;
2140 };
2141 typedef struct state_protect_ops4 state_protect_ops4;
2142 
2143 struct ssv_sp_parms4 {
2144 	state_protect_ops4 ssp_ops;
2145 	struct {
2146 		uint_t ssp_hash_algs_len;
2147 		sec_oid4 *ssp_hash_algs_val;
2148 	} ssp_hash_algs;
2149 	struct {
2150 		uint_t ssp_encr_algs_len;
2151 		sec_oid4 *ssp_encr_algs_val;
2152 	} ssp_encr_algs;
2153 	uint32_t ssp_window;
2154 	uint32_t ssp_num_gss_handles;
2155 };
2156 typedef struct ssv_sp_parms4 ssv_sp_parms4;
2157 
2158 enum state_protect_how4 {
2159 	SP4_NONE = 0,
2160 	SP4_MACH_CRED = 1,
2161 	SP4_SSV = 2
2162 };
2163 typedef enum state_protect_how4 state_protect_how4;
2164 
2165 struct state_protect4_a {
2166 	state_protect_how4 spa_how;
2167 	union {
2168 		state_protect_ops4 spa_mach_ops;
2169 		ssv_sp_parms4 spa_ssv_parms;
2170 	} state_protect4_a_u;
2171 };
2172 typedef struct state_protect4_a state_protect4_a;
2173 
2174 struct EXCHANGE_ID4args {
2175 	client_owner4 eia_clientowner;
2176 	uint32_t eia_flags;
2177 	state_protect4_a eia_state_protect;
2178 	struct {
2179 		uint_t eia_client_impl_id_len;
2180 		nfs_impl_id4 *eia_client_impl_id_val;
2181 	} eia_client_impl_id;
2182 };
2183 typedef struct EXCHANGE_ID4args EXCHANGE_ID4args;
2184 
2185 struct ssv_prot_info4 {
2186 	state_protect_ops4 spi_ops;
2187 	uint32_t spi_hash_alg;
2188 	uint32_t spi_encr_alg;
2189 	uint32_t spi_ssv_len;
2190 	uint32_t spi_window;
2191 	struct {
2192 		uint_t spi_handles_len;
2193 		gsshandle4_t *spi_handles_val;
2194 	} spi_handles;
2195 };
2196 typedef struct ssv_prot_info4 ssv_prot_info4;
2197 
2198 struct state_protect4_r {
2199 	state_protect_how4 spr_how;
2200 	union {
2201 		state_protect_ops4 spr_mach_ops;
2202 		ssv_prot_info4 spr_ssv_info;
2203 	} state_protect4_r_u;
2204 };
2205 typedef struct state_protect4_r state_protect4_r;
2206 
2207 struct EXCHANGE_ID4resok {
2208 	clientid4 eir_clientid;
2209 	sequenceid4 eir_sequenceid;
2210 	uint32_t eir_flags;
2211 	state_protect4_r eir_state_protect;
2212 	server_owner4 eir_server_owner;
2213 	struct eir_server_scope {
2214 		uint_t eir_server_scope_len;
2215 		char *eir_server_scope_val;
2216 	} eir_server_scope;
2217 	struct {
2218 		uint_t eir_server_impl_id_len;
2219 		nfs_impl_id4 *eir_server_impl_id_val;
2220 	} eir_server_impl_id;
2221 };
2222 typedef struct EXCHANGE_ID4resok EXCHANGE_ID4resok;
2223 
2224 struct EXCHANGE_ID4res {
2225 	nfsstat4 eir_status;
2226 	union {
2227 		EXCHANGE_ID4resok eir_resok4;
2228 	} EXCHANGE_ID4res_u;
2229 };
2230 typedef struct EXCHANGE_ID4res EXCHANGE_ID4res;
2231 
2232 struct channel_attrs4 {
2233 	count4 ca_headerpadsize;
2234 	count4 ca_maxrequestsize;
2235 	count4 ca_maxresponsesize;
2236 	count4 ca_maxresponsesize_cached;
2237 	count4 ca_maxoperations;
2238 	count4 ca_maxrequests;
2239 	struct {
2240 		uint_t ca_rdma_ird_len;
2241 		uint32_t *ca_rdma_ird_val;
2242 	} ca_rdma_ird;
2243 };
2244 typedef struct channel_attrs4 channel_attrs4;
2245 
2246 #define	CREATE_SESSION4_FLAG_PERSIST 0x00000001
2247 #define	CREATE_SESSION4_FLAG_CONN_BACK_CHAN 0x00000002
2248 #define	CREATE_SESSION4_FLAG_CONN_RDMA 0x00000004
2249 
2250 #define	CREATE_SESSION4_FLAG_MASK 0x07
2251 
2252 struct CREATE_SESSION4args {
2253 	clientid4 csa_clientid;
2254 	sequenceid4 csa_sequence;
2255 	uint32_t csa_flags;
2256 	channel_attrs4 csa_fore_chan_attrs;
2257 	channel_attrs4 csa_back_chan_attrs;
2258 	uint32_t csa_cb_program;
2259 	struct {
2260 		uint_t csa_sec_parms_len;
2261 		callback_sec_parms4 *csa_sec_parms_val;
2262 	} csa_sec_parms;
2263 };
2264 typedef struct CREATE_SESSION4args CREATE_SESSION4args;
2265 
2266 struct CREATE_SESSION4resok {
2267 	sessionid4 csr_sessionid;
2268 	sequenceid4 csr_sequence;
2269 	uint32_t csr_flags;
2270 	channel_attrs4 csr_fore_chan_attrs;
2271 	channel_attrs4 csr_back_chan_attrs;
2272 };
2273 typedef struct CREATE_SESSION4resok CREATE_SESSION4resok;
2274 
2275 struct CREATE_SESSION4res {
2276 	nfsstat4 csr_status;
2277 	union {
2278 		CREATE_SESSION4resok csr_resok4;
2279 	} CREATE_SESSION4res_u;
2280 };
2281 typedef struct CREATE_SESSION4res CREATE_SESSION4res;
2282 
2283 struct DESTROY_SESSION4args {
2284 	sessionid4 dsa_sessionid;
2285 };
2286 typedef struct DESTROY_SESSION4args DESTROY_SESSION4args;
2287 
2288 struct DESTROY_SESSION4res {
2289 	nfsstat4 dsr_status;
2290 };
2291 typedef struct DESTROY_SESSION4res DESTROY_SESSION4res;
2292 
2293 struct FREE_STATEID4args {
2294 	stateid4 fsa_stateid;
2295 };
2296 typedef struct FREE_STATEID4args FREE_STATEID4args;
2297 
2298 struct FREE_STATEID4res {
2299 	nfsstat4 fsr_status;
2300 };
2301 typedef struct FREE_STATEID4res FREE_STATEID4res;
2302 
2303 typedef nfstime4 attr_notice4;
2304 
2305 struct GET_DIR_DELEGATION4args {
2306 	bool_t gdda_signal_deleg_avail;
2307 	bitmap4 gdda_notification_types;
2308 	attr_notice4 gdda_child_attr_delay;
2309 	attr_notice4 gdda_dir_attr_delay;
2310 	bitmap4 gdda_child_attributes;
2311 	bitmap4 gdda_dir_attributes;
2312 };
2313 typedef struct GET_DIR_DELEGATION4args GET_DIR_DELEGATION4args;
2314 
2315 struct GET_DIR_DELEGATION4resok {
2316 	verifier4 gddr_cookieverf;
2317 	stateid4 gddr_stateid;
2318 	bitmap4 gddr_notification;
2319 	bitmap4 gddr_child_attributes;
2320 	bitmap4 gddr_dir_attributes;
2321 };
2322 typedef struct GET_DIR_DELEGATION4resok GET_DIR_DELEGATION4resok;
2323 
2324 enum gddrnf4_status {
2325 	GDD4_OK = 0,
2326 	GDD4_UNAVAIL = 1
2327 };
2328 typedef enum gddrnf4_status gddrnf4_status;
2329 
2330 struct GET_DIR_DELEGATION4res_non_fatal {
2331 	gddrnf4_status gddrnf_status;
2332 	union {
2333 		GET_DIR_DELEGATION4resok gddrnf_resok4;
2334 		bool_t gddrnf_will_signal_deleg_avail;
2335 	} GET_DIR_DELEGATION4res_non_fatal_u;
2336 };
2337 typedef struct GET_DIR_DELEGATION4res_non_fatal
2338     GET_DIR_DELEGATION4res_non_fatal;
2339 
2340 struct GET_DIR_DELEGATION4res {
2341 	nfsstat4 gddr_status;
2342 	union {
2343 		GET_DIR_DELEGATION4res_non_fatal gddr_res_non_fatal4;
2344 	} GET_DIR_DELEGATION4res_u;
2345 };
2346 typedef struct GET_DIR_DELEGATION4res GET_DIR_DELEGATION4res;
2347 
2348 struct GETDEVICEINFO4args {
2349 	deviceid4 gdia_device_id;
2350 	layouttype4 gdia_layout_type;
2351 	count4 gdia_maxcount;
2352 	bitmap4 gdia_notify_types;
2353 };
2354 typedef struct GETDEVICEINFO4args GETDEVICEINFO4args;
2355 
2356 struct GETDEVICEINFO4resok {
2357 	device_addr4 gdir_device_addr;
2358 	bitmap4 gdir_notification;
2359 };
2360 typedef struct GETDEVICEINFO4resok GETDEVICEINFO4resok;
2361 
2362 struct GETDEVICEINFO4res {
2363 	nfsstat4 gdir_status;
2364 	union {
2365 		GETDEVICEINFO4resok gdir_resok4;
2366 		count4 gdir_mincount;
2367 	} GETDEVICEINFO4res_u;
2368 };
2369 typedef struct GETDEVICEINFO4res GETDEVICEINFO4res;
2370 
2371 struct GETDEVICELIST4args {
2372 	layouttype4 gdla_layout_type;
2373 	count4 gdla_maxdevices;
2374 	nfs_cookie4 gdla_cookie;
2375 	verifier4 gdla_cookieverf;
2376 };
2377 typedef struct GETDEVICELIST4args GETDEVICELIST4args;
2378 
2379 struct GETDEVICELIST4resok {
2380 	nfs_cookie4 gdlr_cookie;
2381 	verifier4 gdlr_cookieverf;
2382 	struct {
2383 		uint_t gdlr_deviceid_list_len;
2384 		deviceid4 *gdlr_deviceid_list_val;
2385 	} gdlr_deviceid_list;
2386 	bool_t gdlr_eof;
2387 };
2388 typedef struct GETDEVICELIST4resok GETDEVICELIST4resok;
2389 
2390 struct GETDEVICELIST4res {
2391 	nfsstat4 gdlr_status;
2392 	union {
2393 		GETDEVICELIST4resok gdlr_resok4;
2394 	} GETDEVICELIST4res_u;
2395 };
2396 typedef struct GETDEVICELIST4res GETDEVICELIST4res;
2397 
2398 struct newtime4 {
2399 	bool_t nt_timechanged;
2400 	union {
2401 		nfstime4 nt_time;
2402 	} newtime4_u;
2403 };
2404 typedef struct newtime4 newtime4;
2405 
2406 struct newoffset4 {
2407 	bool_t no_newoffset;
2408 	union {
2409 		offset4 no_offset;
2410 	} newoffset4_u;
2411 };
2412 typedef struct newoffset4 newoffset4;
2413 
2414 struct LAYOUTCOMMIT4args {
2415 	offset4 loca_offset;
2416 	length4 loca_length;
2417 	bool_t loca_reclaim;
2418 	stateid4 loca_stateid;
2419 	newoffset4 loca_last_write_offset;
2420 	newtime4 loca_time_modify;
2421 	layoutupdate4 loca_layoutupdate;
2422 };
2423 typedef struct LAYOUTCOMMIT4args LAYOUTCOMMIT4args;
2424 
2425 struct newsize4 {
2426 	bool_t ns_sizechanged;
2427 	union {
2428 		length4 ns_size;
2429 	} newsize4_u;
2430 };
2431 typedef struct newsize4 newsize4;
2432 
2433 struct LAYOUTCOMMIT4resok {
2434 	newsize4 locr_newsize;
2435 };
2436 typedef struct LAYOUTCOMMIT4resok LAYOUTCOMMIT4resok;
2437 
2438 struct LAYOUTCOMMIT4res {
2439 	nfsstat4 locr_status;
2440 	union {
2441 		LAYOUTCOMMIT4resok locr_resok4;
2442 	} LAYOUTCOMMIT4res_u;
2443 };
2444 typedef struct LAYOUTCOMMIT4res LAYOUTCOMMIT4res;
2445 
2446 struct LAYOUTGET4args {
2447 	bool_t loga_signal_layout_avail;
2448 	layouttype4 loga_layout_type;
2449 	layoutiomode4 loga_iomode;
2450 	offset4 loga_offset;
2451 	length4 loga_length;
2452 	length4 loga_minlength;
2453 	stateid4 loga_stateid;
2454 	count4 loga_maxcount;
2455 };
2456 typedef struct LAYOUTGET4args LAYOUTGET4args;
2457 
2458 struct LAYOUTGET4resok {
2459 	bool_t logr_return_on_close;
2460 	stateid4 logr_stateid;
2461 	struct {
2462 		uint_t logr_layout_len;
2463 		layout4 *logr_layout_val;
2464 	} logr_layout;
2465 };
2466 typedef struct LAYOUTGET4resok LAYOUTGET4resok;
2467 
2468 struct LAYOUTGET4res {
2469 	nfsstat4 logr_status;
2470 	union {
2471 		LAYOUTGET4resok logr_resok4;
2472 		bool_t logr_will_signal_layout_avail;
2473 	} LAYOUTGET4res_u;
2474 };
2475 typedef struct LAYOUTGET4res LAYOUTGET4res;
2476 
2477 struct LAYOUTRETURN4args {
2478 	bool_t lora_reclaim;
2479 	layouttype4 lora_layout_type;
2480 	layoutiomode4 lora_iomode;
2481 	layoutreturn4 lora_layoutreturn;
2482 };
2483 typedef struct LAYOUTRETURN4args LAYOUTRETURN4args;
2484 
2485 struct layoutreturn_stateid {
2486 	bool_t lrs_present;
2487 	union {
2488 		stateid4 lrs_stateid;
2489 	} layoutreturn_stateid_u;
2490 };
2491 typedef struct layoutreturn_stateid layoutreturn_stateid;
2492 
2493 struct LAYOUTRETURN4res {
2494 	nfsstat4 lorr_status;
2495 	union {
2496 		layoutreturn_stateid lorr_stateid;
2497 	} LAYOUTRETURN4res_u;
2498 };
2499 typedef struct LAYOUTRETURN4res LAYOUTRETURN4res;
2500 
2501 enum secinfo_style4 {
2502 	SECINFO_STYLE4_CURRENT_FH = 0,
2503 	SECINFO_STYLE4_PARENT = 1
2504 };
2505 typedef enum secinfo_style4 secinfo_style4;
2506 
2507 typedef secinfo_style4 SECINFO_NO_NAME4args;
2508 
2509 typedef SECINFO4res SECINFO_NO_NAME4res;
2510 
2511 struct SEQUENCE4args {
2512 	sessionid4 sa_sessionid;
2513 	sequenceid4 sa_sequenceid;
2514 	slotid4 sa_slotid;
2515 	slotid4 sa_highest_slotid;
2516 	bool_t sa_cachethis;
2517 };
2518 typedef struct SEQUENCE4args SEQUENCE4args;
2519 #define	SEQ4_STATUS_CB_PATH_DOWN 0x00000001
2520 #define	SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING 0x00000002
2521 #define	SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRED 0x00000004
2522 #define	SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED 0x00000008
2523 #define	SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED 0x00000010
2524 #define	SEQ4_STATUS_ADMIN_STATE_REVOKED 0x00000020
2525 #define	SEQ4_STATUS_RECALLABLE_STATE_REVOKED 0x00000040
2526 #define	SEQ4_STATUS_LEASE_MOVED 0x00000080
2527 #define	SEQ4_STATUS_RESTART_RECLAIM_NEEDED 0x00000100
2528 #define	SEQ4_STATUS_CB_PATH_DOWN_SESSION 0x00000200
2529 #define	SEQ4_STATUS_BACKCHANNEL_FAULT 0x00000400
2530 #define	SEQ4_STATUS_DEVID_CHANGED 0x00000800
2531 #define	SEQ4_STATUS_DEVID_DELETED 0x00001000
2532 #define	SEQ4_HIGH_BIT SEQ4_STATUS_DEVID_DELETED /* highest defined flag */
2533 
2534 struct SEQUENCE4resok {
2535 	sessionid4 sr_sessionid;
2536 	sequenceid4 sr_sequenceid;
2537 	slotid4 sr_slotid;
2538 	slotid4 sr_highest_slotid;
2539 	slotid4 sr_target_highest_slotid;
2540 	uint32_t sr_status_flags;
2541 };
2542 typedef struct SEQUENCE4resok SEQUENCE4resok;
2543 
2544 struct SEQUENCE4res {
2545 	nfsstat4 sr_status;
2546 	union {
2547 		SEQUENCE4resok sr_resok4;
2548 	} SEQUENCE4res_u;
2549 };
2550 typedef struct SEQUENCE4res SEQUENCE4res;
2551 
2552 struct ssa_digest_input4 {
2553 	SEQUENCE4args sdi_seqargs;
2554 };
2555 typedef struct ssa_digest_input4 ssa_digest_input4;
2556 
2557 struct SET_SSV4args {
2558 	struct {
2559 		uint_t ssa_ssv_len;
2560 		char *ssa_ssv_val;
2561 	} ssa_ssv;
2562 	struct {
2563 		uint_t ssa_digest_len;
2564 		char *ssa_digest_val;
2565 	} ssa_digest;
2566 };
2567 typedef struct SET_SSV4args SET_SSV4args;
2568 
2569 struct ssr_digest_input4 {
2570 	SEQUENCE4res sdi_seqres;
2571 };
2572 typedef struct ssr_digest_input4 ssr_digest_input4;
2573 
2574 struct SET_SSV4resok {
2575 	struct {
2576 		uint_t ssr_digest_len;
2577 		char *ssr_digest_val;
2578 	} ssr_digest;
2579 };
2580 typedef struct SET_SSV4resok SET_SSV4resok;
2581 
2582 struct SET_SSV4res {
2583 	nfsstat4 ssr_status;
2584 	union {
2585 		SET_SSV4resok ssr_resok4;
2586 	} SET_SSV4res_u;
2587 };
2588 typedef struct SET_SSV4res SET_SSV4res;
2589 
2590 struct TEST_STATEID4args {
2591 	struct {
2592 		uint_t ts_stateids_len;
2593 		stateid4 *ts_stateids_val;
2594 	} ts_stateids;
2595 };
2596 typedef struct TEST_STATEID4args TEST_STATEID4args;
2597 
2598 struct TEST_STATEID4resok {
2599 	struct {
2600 		uint_t tsr_status_codes_len;
2601 		nfsstat4 *tsr_status_codes_val;
2602 	} tsr_status_codes;
2603 };
2604 typedef struct TEST_STATEID4resok TEST_STATEID4resok;
2605 
2606 struct TEST_STATEID4res {
2607 	nfsstat4 tsr_status;
2608 	union {
2609 		TEST_STATEID4resok tsr_resok4;
2610 	} TEST_STATEID4res_u;
2611 };
2612 typedef struct TEST_STATEID4res TEST_STATEID4res;
2613 
2614 struct deleg_claim4 {
2615 	open_claim_type4 dc_claim;
2616 	union {
2617 		open_delegation_type4 dc_delegate_type;
2618 	} deleg_claim4_u;
2619 };
2620 typedef struct deleg_claim4 deleg_claim4;
2621 
2622 struct WANT_DELEGATION4args {
2623 	uint32_t wda_want;
2624 	deleg_claim4 wda_claim;
2625 };
2626 typedef struct WANT_DELEGATION4args WANT_DELEGATION4args;
2627 
2628 struct WANT_DELEGATION4res {
2629 	nfsstat4 wdr_status;
2630 	union {
2631 		open_delegation4 wdr_resok4;
2632 	} WANT_DELEGATION4res_u;
2633 };
2634 typedef struct WANT_DELEGATION4res WANT_DELEGATION4res;
2635 
2636 struct DESTROY_CLIENTID4args {
2637 	clientid4 dca_clientid;
2638 };
2639 typedef struct DESTROY_CLIENTID4args DESTROY_CLIENTID4args;
2640 
2641 struct DESTROY_CLIENTID4res {
2642 	nfsstat4 dcr_status;
2643 };
2644 typedef struct DESTROY_CLIENTID4res DESTROY_CLIENTID4res;
2645 
2646 struct RECLAIM_COMPLETE4args {
2647 	bool_t rca_one_fs;
2648 };
2649 typedef struct RECLAIM_COMPLETE4args RECLAIM_COMPLETE4args;
2650 
2651 struct RECLAIM_COMPLETE4res {
2652 	nfsstat4 rcr_status;
2653 };
2654 typedef struct RECLAIM_COMPLETE4res RECLAIM_COMPLETE4res;
2655 
2656 /* new operations for NFSv4.1 end */
2657 
2658 enum nfs_opnum4 {
2659 	OP_ACCESS = 3,
2660 	OP_CLOSE = 4,
2661 	OP_COMMIT = 5,
2662 	OP_CREATE = 6,
2663 	OP_DELEGPURGE = 7,
2664 	OP_DELEGRETURN = 8,
2665 	OP_GETATTR = 9,
2666 	OP_GETFH = 10,
2667 	OP_LINK = 11,
2668 	OP_LOCK = 12,
2669 	OP_LOCKT = 13,
2670 	OP_LOCKU = 14,
2671 	OP_LOOKUP = 15,
2672 	OP_LOOKUPP = 16,
2673 	OP_NVERIFY = 17,
2674 	OP_OPEN = 18,
2675 	OP_OPENATTR = 19,
2676 	OP_OPEN_CONFIRM = 20,
2677 	OP_OPEN_DOWNGRADE = 21,
2678 	OP_PUTFH = 22,
2679 	OP_PUTPUBFH = 23,
2680 	OP_PUTROOTFH = 24,
2681 	OP_READ = 25,
2682 	OP_READDIR = 26,
2683 	OP_READLINK = 27,
2684 	OP_REMOVE = 28,
2685 	OP_RENAME = 29,
2686 	OP_RENEW = 30,
2687 	OP_RESTOREFH = 31,
2688 	OP_SAVEFH = 32,
2689 	OP_SECINFO = 33,
2690 	OP_SETATTR = 34,
2691 	OP_SETCLIENTID = 35,
2692 	OP_SETCLIENTID_CONFIRM = 36,
2693 	OP_VERIFY = 37,
2694 	OP_WRITE = 38,
2695 	OP_RELEASE_LOCKOWNER = 39,
2696 
2697 	/* nfsv4.1 */
2698 	OP_BACKCHANNEL_CTL = 40,
2699 	OP_BIND_CONN_TO_SESSION = 41,
2700 	OP_EXCHANGE_ID = 42,
2701 	OP_CREATE_SESSION = 43,
2702 	OP_DESTROY_SESSION = 44,
2703 	OP_FREE_STATEID = 45,
2704 	OP_GET_DIR_DELEGATION = 46,
2705 	OP_GETDEVICEINFO = 47,
2706 	OP_GETDEVICELIST = 48,
2707 	OP_LAYOUTCOMMIT = 49,
2708 	OP_LAYOUTGET = 50,
2709 	OP_LAYOUTRETURN = 51,
2710 	OP_SECINFO_NO_NAME = 52,
2711 	OP_SEQUENCE = 53,
2712 	OP_SET_SSV = 54,
2713 	OP_TEST_STATEID = 55,
2714 	OP_WANT_DELEGATION = 56,
2715 	OP_DESTROY_CLIENTID = 57,
2716 	OP_RECLAIM_COMPLETE = 58,
2717 
2718 	OP_ILLEGAL = 10044,
2719 /*
2720  * These are internal client pseudo ops that *MUST* never go over the wire
2721  */
2722 #define	SUNW_PRIVATE_OP	0x10000000
2723 #define	REAL_OP4(op)	((op) & ~SUNW_PRIVATE_OP)
2724 	OP_CCREATE = OP_CREATE | SUNW_PRIVATE_OP,
2725 	OP_CLINK = OP_LINK | SUNW_PRIVATE_OP,
2726 	OP_CLOOKUP = OP_LOOKUP | SUNW_PRIVATE_OP,
2727 	OP_COPEN = OP_OPEN | SUNW_PRIVATE_OP,
2728 	OP_CPUTFH = OP_PUTFH | SUNW_PRIVATE_OP,
2729 	OP_CREMOVE = OP_REMOVE | SUNW_PRIVATE_OP,
2730 	OP_CRENAME = OP_RENAME | SUNW_PRIVATE_OP,
2731 	OP_CSECINFO = OP_SECINFO | SUNW_PRIVATE_OP
2732 };
2733 typedef enum nfs_opnum4 nfs_opnum4;
2734 
2735 struct nfs_argop4 {
2736 	nfs_opnum4 argop;
2737 	union {
2738 		ACCESS4args opaccess;
2739 		CLOSE4args opclose;
2740 		COMMIT4args opcommit;
2741 		CREATE4args opcreate;
2742 		CREATE4cargs opccreate;
2743 		DELEGPURGE4args opdelegpurge;
2744 		DELEGRETURN4args opdelegreturn;
2745 		GETATTR4args opgetattr;
2746 		LINK4args oplink;
2747 		LINK4cargs opclink;
2748 		LOCK4args oplock;
2749 		LOCKT4args oplockt;
2750 		LOCKU4args oplocku;
2751 		LOOKUP4args oplookup;
2752 		LOOKUP4cargs opclookup;
2753 		NVERIFY4args opnverify;
2754 		OPEN4args opopen;
2755 		OPEN4cargs opcopen;
2756 		OPENATTR4args opopenattr;
2757 		OPEN_CONFIRM4args opopen_confirm;
2758 		OPEN_DOWNGRADE4args opopen_downgrade;
2759 		PUTFH4args opputfh;
2760 		PUTFH4cargs opcputfh;
2761 		READ4args opread;
2762 		READDIR4args opreaddir;
2763 		REMOVE4args opremove;
2764 		REMOVE4cargs opcremove;
2765 		RENAME4args oprename;
2766 		RENAME4cargs opcrename;
2767 		RENEW4args oprenew;
2768 		SECINFO4args opsecinfo;
2769 		SECINFO4cargs opcsecinfo;
2770 		SETATTR4args opsetattr;
2771 		SETCLIENTID4args opsetclientid;
2772 		SETCLIENTID_CONFIRM4args opsetclientid_confirm;
2773 		VERIFY4args opverify;
2774 		WRITE4args opwrite;
2775 		RELEASE_LOCKOWNER4args oprelease_lockowner;
2776 		BACKCHANNEL_CTL4args opbackchannel_ctl;		/* nfsv4.1 */
2777 		BIND_CONN_TO_SESSION4args opbind_conn_to_session;
2778 		EXCHANGE_ID4args opexchange_id;
2779 		CREATE_SESSION4args opcreate_session;
2780 		DESTROY_SESSION4args opdestroy_session;
2781 		FREE_STATEID4args opfree_stateid;
2782 		GET_DIR_DELEGATION4args opget_dir_delegation;
2783 		GETDEVICEINFO4args opgetdeviceinfo;
2784 		GETDEVICELIST4args opgetdevicelist;
2785 		LAYOUTCOMMIT4args oplayoutcommit;
2786 		LAYOUTGET4args oplayoutget;
2787 		LAYOUTRETURN4args oplayoutreturn;
2788 		SECINFO_NO_NAME4args opsecinfo_no_name;
2789 		SEQUENCE4args opsequence;
2790 		SET_SSV4args opset_ssv;
2791 		TEST_STATEID4args optest_stateid;
2792 		WANT_DELEGATION4args opwant_delegation;
2793 		DESTROY_CLIENTID4args opdestroy_clientid;
2794 		RECLAIM_COMPLETE4args opreclaim_complete;
2795 	} nfs_argop4_u;
2796 };
2797 typedef struct nfs_argop4 nfs_argop4;
2798 
2799 struct nfs_resop4 {
2800 	nfs_opnum4 resop;
2801 	union {
2802 		ACCESS4res opaccess;
2803 		CLOSE4res opclose;
2804 		COMMIT4res opcommit;
2805 		CREATE4res opcreate;
2806 		DELEGPURGE4res opdelegpurge;
2807 		DELEGRETURN4res opdelegreturn;
2808 		GETATTR4res opgetattr;
2809 		GETFH4res opgetfh;
2810 		LINK4res oplink;
2811 		LOCK4res oplock;
2812 		LOCKT4res oplockt;
2813 		LOCKU4res oplocku;
2814 		LOOKUP4res oplookup;
2815 		LOOKUPP4res oplookupp;
2816 		NVERIFY4res opnverify;
2817 		OPEN4res opopen;
2818 		OPENATTR4res opopenattr;
2819 		OPEN_CONFIRM4res opopen_confirm;
2820 		OPEN_DOWNGRADE4res opopen_downgrade;
2821 		PUTFH4res opputfh;
2822 		PUTPUBFH4res opputpubfh;
2823 		PUTROOTFH4res opputrootfh;
2824 		READ4res opread;
2825 		READDIR4res opreaddir;
2826 		READDIR4res_clnt opreaddirclnt;
2827 		READLINK4res opreadlink;
2828 		REMOVE4res opremove;
2829 		RENAME4res oprename;
2830 		RENEW4res oprenew;
2831 		RESTOREFH4res oprestorefh;
2832 		SAVEFH4res opsavefh;
2833 		SECINFO4res opsecinfo;
2834 		SETATTR4res opsetattr;
2835 		SETCLIENTID4res opsetclientid;
2836 		SETCLIENTID_CONFIRM4res opsetclientid_confirm;
2837 		VERIFY4res opverify;
2838 		WRITE4res opwrite;
2839 		RELEASE_LOCKOWNER4res oprelease_lockowner;
2840 		BACKCHANNEL_CTL4res opbackchannel_ctl;		/* nfsv4.1 */
2841 		BIND_CONN_TO_SESSION4res opbind_conn_to_session;
2842 		EXCHANGE_ID4res opexchange_id;
2843 		CREATE_SESSION4res opcreate_session;
2844 		DESTROY_SESSION4res opdestroy_session;
2845 		FREE_STATEID4res opfree_stateid;
2846 		GET_DIR_DELEGATION4res opget_dir_delegation;
2847 		GETDEVICEINFO4res opgetdeviceinfo;
2848 		GETDEVICELIST4res opgetdevicelist;
2849 		LAYOUTCOMMIT4res oplayoutcommit;
2850 		LAYOUTGET4res oplayoutget;
2851 		LAYOUTRETURN4res oplayoutreturn;
2852 		SECINFO_NO_NAME4res opsecinfo_no_name;
2853 		SEQUENCE4res opsequence;
2854 		SET_SSV4res opset_ssv;
2855 		TEST_STATEID4res optest_stateid;
2856 		WANT_DELEGATION4res opwant_delegation;
2857 		DESTROY_CLIENTID4res opdestroy_clientid;
2858 		RECLAIM_COMPLETE4res opreclaim_complete;
2859 		ILLEGAL4res opillegal;
2860 	} nfs_resop4_u;
2861 };
2862 typedef struct nfs_resop4 nfs_resop4;
2863 
2864 /*
2865  * Fixed size tag string for easy client encoding
2866  */
2867 struct _ctag {
2868 	int ct_type;
2869 	char *ct_str;
2870 	uint32_t ct_tag[3];
2871 };
2872 typedef struct _ctag ctag_t;
2873 
2874 /*
2875  * Client-only encode-only version
2876  */
2877 struct COMPOUND4args_clnt {
2878 	int ctag;
2879 	uint_t array_len;
2880 	nfs_argop4 *array;
2881 };
2882 typedef struct COMPOUND4args_clnt COMPOUND4args_clnt;
2883 
2884 struct COMPOUND4args {
2885 	utf8string tag;
2886 	uint32_t minorversion;
2887 	uint_t array_len;
2888 	nfs_argop4 *array;
2889 };
2890 typedef struct COMPOUND4args COMPOUND4args;
2891 
2892 struct COMPOUND4res_clnt {
2893 	nfsstat4 status;
2894 	uint_t array_len;
2895 	uint_t decode_len;
2896 	nfs_resop4 *array;
2897 	COMPOUND4args_clnt *argsp;
2898 };
2899 typedef struct COMPOUND4res_clnt COMPOUND4res_clnt;
2900 
2901 struct COMPOUND4res {
2902 	nfsstat4 status;
2903 	utf8string tag;
2904 	uint_t array_len;
2905 	nfs_resop4 *array;
2906 };
2907 typedef struct COMPOUND4res COMPOUND4res;
2908 
2909 struct CB_GETATTR4args {
2910 	nfs_fh4 fh;
2911 	bitmap4 attr_request;
2912 };
2913 typedef struct CB_GETATTR4args CB_GETATTR4args;
2914 
2915 struct CB_GETATTR4res {
2916 	nfsstat4 status;
2917 	fattr4 obj_attributes;
2918 };
2919 typedef struct CB_GETATTR4res CB_GETATTR4res;
2920 
2921 struct CB_RECALL4args {
2922 	stateid4 stateid;
2923 	bool_t truncate;
2924 	nfs_fh4 fh;
2925 };
2926 typedef struct CB_RECALL4args CB_RECALL4args;
2927 
2928 struct CB_RECALL4res {
2929 	nfsstat4 status;
2930 };
2931 typedef struct CB_RECALL4res CB_RECALL4res;
2932 
2933 struct CB_ILLEGAL4res {
2934 	nfsstat4 status;
2935 };
2936 typedef struct CB_ILLEGAL4res CB_ILLEGAL4res;
2937 
2938 /*
2939  * New to nfsv4.1
2940  */
2941 enum layoutrecall_type4 {
2942 	LAYOUTRECALL4_FILE = LAYOUT4_RET_REC_FILE,
2943 	LAYOUTRECALL4_FSID = LAYOUT4_RET_REC_FSID,
2944 	LAYOUTRECALL4_ALL = LAYOUT4_RET_REC_ALL
2945 };
2946 typedef enum layoutrecall_type4 layoutrecall_type4;
2947 
2948 struct layoutrecall_file4 {
2949 	nfs_fh4 lor_fh;
2950 	offset4 lor_offset;
2951 	length4 lor_length;
2952 	stateid4 lor_stateid;
2953 };
2954 typedef struct layoutrecall_file4 layoutrecall_file4;
2955 
2956 struct layoutrecall4 {
2957 	layoutrecall_type4 lor_recalltype;
2958 	union {
2959 		layoutrecall_file4 lor_layout;
2960 		fsid4 lor_fsid;
2961 	} layoutrecall4_u;
2962 };
2963 typedef struct layoutrecall4 layoutrecall4;
2964 
2965 struct CB_LAYOUTRECALL4args {
2966 	layouttype4 clora_type;
2967 	layoutiomode4 clora_iomode;
2968 	bool_t clora_changed;
2969 	layoutrecall4 clora_recall;
2970 };
2971 typedef struct CB_LAYOUTRECALL4args CB_LAYOUTRECALL4args;
2972 
2973 struct CB_LAYOUTRECALL4res {
2974 	nfsstat4 clorr_status;
2975 };
2976 typedef struct CB_LAYOUTRECALL4res CB_LAYOUTRECALL4res;
2977 
2978 enum notify_type4 {
2979 	NOTIFY4_CHANGE_CHILD_ATTRS = 0,
2980 	NOTIFY4_CHANGE_DIR_ATTRS = 1,
2981 	NOTIFY4_REMOVE_ENTRY = 2,
2982 	NOTIFY4_ADD_ENTRY = 3,
2983 	NOTIFY4_RENAME_ENTRY = 4,
2984 	NOTIFY4_CHANGE_COOKIE_VERIFIER = 5
2985 };
2986 typedef enum notify_type4 notify_type4;
2987 
2988 struct notify_entry4 {
2989 	component4 ne_file;
2990 	fattr4 ne_attrs;
2991 };
2992 typedef struct notify_entry4 notify_entry4;
2993 
2994 struct prev_entry4 {
2995 	notify_entry4 pe_prev_entry;
2996 	nfs_cookie4 pe_prev_entry_cookie;
2997 };
2998 typedef struct prev_entry4 prev_entry4;
2999 
3000 struct notify_remove4 {
3001 	notify_entry4 nrm_old_entry;
3002 	nfs_cookie4 nrm_old_entry_cookie;
3003 };
3004 typedef struct notify_remove4 notify_remove4;
3005 
3006 struct notify_add4 {
3007 	struct {
3008 		uint_t nad_old_entry_len;
3009 		notify_remove4 *nad_old_entry_val;
3010 	} nad_old_entry;
3011 	notify_entry4 nad_new_entry;
3012 	struct {
3013 		uint_t nad_new_entry_cookie_len;
3014 		nfs_cookie4 *nad_new_entry_cookie_val;
3015 } nad_new_entry_cookie;
3016 	struct {
3017 		uint_t nad_prev_entry_len;
3018 		prev_entry4 *nad_prev_entry_val;
3019 	} nad_prev_entry;
3020 	bool_t nad_last_entry;
3021 };
3022 typedef struct notify_add4 notify_add4;
3023 
3024 struct notify_attr4 {
3025 	notify_entry4 na_changed_entry;
3026 };
3027 typedef struct notify_attr4 notify_attr4;
3028 
3029 struct notify_rename4 {
3030 	notify_remove4 nrn_old_entry;
3031 	notify_add4 nrn_new_entry;
3032 };
3033 typedef struct notify_rename4 notify_rename4;
3034 
3035 struct notify_verifier4 {
3036 	verifier4 nv_old_cookieverf;
3037 	verifier4 nv_new_cookieverf;
3038 };
3039 typedef struct notify_verifier4 notify_verifier4;
3040 
3041 typedef struct {
3042 	uint_t notifylist4_len;
3043 	char *notifylist4_val;
3044 } notifylist4;
3045 
3046 struct notify4 {
3047 	bitmap4 notify_mask;
3048 	notifylist4 notify_vals;
3049 };
3050 typedef struct notify4 notify4;
3051 
3052 struct CB_NOTIFY4args {
3053 	stateid4 cna_stateid;
3054 	nfs_fh4 cna_fh;
3055 	struct {
3056 		uint_t cna_changes_len;
3057 		notify4 *cna_changes_val;
3058 	} cna_changes;
3059 };
3060 typedef struct CB_NOTIFY4args CB_NOTIFY4args;
3061 
3062 struct CB_NOTIFY4res {
3063 	nfsstat4 cnr_status;
3064 };
3065 typedef struct CB_NOTIFY4res CB_NOTIFY4res;
3066 
3067 struct CB_PUSH_DELEG4args {
3068 	nfs_fh4 cpda_fh;
3069 	open_delegation4 cpda_delegation;
3070 };
3071 typedef struct CB_PUSH_DELEG4args CB_PUSH_DELEG4args;
3072 
3073 struct CB_PUSH_DELEG4res {
3074 	nfsstat4 cpdr_status;
3075 };
3076 typedef struct CB_PUSH_DELEG4res CB_PUSH_DELEG4res;
3077 #define	RCA4_TYPE_MASK_RDATA_DLG 0
3078 #define	RCA4_TYPE_MASK_WDATA_DLG 1
3079 #define	RCA4_TYPE_MASK_DIR_DLG 2
3080 #define	RCA4_TYPE_MASK_FILE_LAYOUT 3
3081 #define	RCA4_TYPE_MASK_BLK_LAYOUT 4
3082 #define	RCA4_TYPE_MASK_OBJ_LAYOUT_MIN 8
3083 #define	RCA4_TYPE_MASK_OBJ_LAYOUT_MAX 9
3084 #define	RCA4_TYPE_MASK_OTHER_LAYOUT_MIN 12
3085 #define	RCA4_TYPE_MASK_OTHER_LAYOUT_MAX 15
3086 
3087 struct CB_RECALL_ANY4args {
3088 	uint32_t craa_objects_to_keep;
3089 	bitmap4 craa_type_mask;
3090 };
3091 typedef struct CB_RECALL_ANY4args CB_RECALL_ANY4args;
3092 
3093 struct CB_RECALL_ANY4res {
3094 	nfsstat4 crar_status;
3095 };
3096 typedef struct CB_RECALL_ANY4res CB_RECALL_ANY4res;
3097 
3098 typedef CB_RECALL_ANY4args CB_RECALLABLE_OBJ_AVAIL4args;
3099 
3100 struct CB_RECALLABLE_OBJ_AVAIL4res {
3101 	nfsstat4 croa_status;
3102 };
3103 typedef struct CB_RECALLABLE_OBJ_AVAIL4res CB_RECALLABLE_OBJ_AVAIL4res;
3104 
3105 struct CB_RECALL_SLOT4args {
3106 	slotid4 rsa_target_highest_slotid;
3107 };
3108 typedef struct CB_RECALL_SLOT4args CB_RECALL_SLOT4args;
3109 
3110 struct CB_RECALL_SLOT4res {
3111 	nfsstat4 rsr_status;
3112 };
3113 typedef struct CB_RECALL_SLOT4res CB_RECALL_SLOT4res;
3114 
3115 struct referring_call4 {
3116 	sequenceid4 rc_sequenceid;
3117 	slotid4 rc_slotid;
3118 };
3119 typedef struct referring_call4 referring_call4;
3120 
3121 struct referring_call_list4 {
3122 	sessionid4 rcl_sessionid;
3123 	struct {
3124 		uint_t rcl_referring_calls_len;
3125 		referring_call4 *rcl_referring_calls_val;
3126 	} rcl_referring_calls;
3127 };
3128 typedef struct referring_call_list4 referring_call_list4;
3129 
3130 struct CB_SEQUENCE4args {
3131 	sessionid4 csa_sessionid;
3132 	sequenceid4 csa_sequenceid;
3133 	slotid4 csa_slotid;
3134 	slotid4 csa_highest_slotid;
3135 	bool_t csa_cachethis;
3136 	struct {
3137 		uint_t csa_referring_call_lists_len;
3138 		referring_call_list4 *csa_referring_call_lists_val;
3139 	} csa_referring_call_lists;
3140 };
3141 typedef struct CB_SEQUENCE4args CB_SEQUENCE4args;
3142 
3143 struct CB_SEQUENCE4resok {
3144 	sessionid4 csr_sessionid;
3145 	sequenceid4 csr_sequenceid;
3146 	slotid4 csr_slotid;
3147 	slotid4 csr_highest_slotid;
3148 	slotid4 csr_target_highest_slotid;
3149 };
3150 typedef struct CB_SEQUENCE4resok CB_SEQUENCE4resok;
3151 
3152 struct CB_SEQUENCE4res {
3153 	nfsstat4 csr_status;
3154 	union {
3155 		CB_SEQUENCE4resok csr_resok4;
3156 	} CB_SEQUENCE4res_u;
3157 };
3158 typedef struct CB_SEQUENCE4res CB_SEQUENCE4res;
3159 
3160 struct CB_WANTS_CANCELLED4args {
3161 	bool_t cwca_contended_wants_cancelled;
3162 	bool_t cwca_resourced_wants_cancelled;
3163 };
3164 typedef struct CB_WANTS_CANCELLED4args CB_WANTS_CANCELLED4args;
3165 
3166 struct CB_WANTS_CANCELLED4res {
3167 	nfsstat4 cwcr_status;
3168 };
3169 typedef struct CB_WANTS_CANCELLED4res CB_WANTS_CANCELLED4res;
3170 
3171 struct CB_NOTIFY_LOCK4args {
3172 	nfs_fh4 cnla_fh;
3173 	lock_owner4 cnla_lock_owner;
3174 };
3175 typedef struct CB_NOTIFY_LOCK4args CB_NOTIFY_LOCK4args;
3176 
3177 struct CB_NOTIFY_LOCK4res {
3178 	nfsstat4 cnlr_status;
3179 };
3180 typedef struct CB_NOTIFY_LOCK4res CB_NOTIFY_LOCK4res;
3181 
3182 enum notify_deviceid_type4 {
3183 	NOTIFY_DEVICEID4_CHANGE = 1,
3184 	NOTIFY_DEVICEID4_DELETE = 2
3185 };
3186 typedef enum notify_deviceid_type4 notify_deviceid_type4;
3187 
3188 struct notify_deviceid_delete4 {
3189 	layouttype4 ndd_layouttype;
3190 	deviceid4 ndd_deviceid;
3191 };
3192 typedef struct notify_deviceid_delete4 notify_deviceid_delete4;
3193 
3194 struct notify_deviceid_change4 {
3195 	layouttype4 ndc_layouttype;
3196 	deviceid4 ndc_deviceid;
3197 	bool_t ndc_immediate;
3198 };
3199 typedef struct notify_deviceid_change4 notify_deviceid_change4;
3200 
3201 struct CB_NOTIFY_DEVICEID4args {
3202 	struct {
3203 		uint_t cnda_changes_len;
3204 		notify4 *cnda_changes_val;
3205 	} cnda_changes;
3206 };
3207 typedef struct CB_NOTIFY_DEVICEID4args CB_NOTIFY_DEVICEID4args;
3208 
3209 struct CB_NOTIFY_DEVICEID4res {
3210 	nfsstat4 cndr_status;
3211 };
3212 typedef struct CB_NOTIFY_DEVICEID4res CB_NOTIFY_DEVICEID4res;
3213 
3214 /* Callback operations new to NFSv4.1 */
3215 
3216 enum nfs_cb_opnum4 {
3217 	OP_CB_GETATTR = 3,
3218 	OP_CB_RECALL = 4,
3219 	OP_CB_LAYOUTRECALL = 5,
3220 	OP_CB_NOTIFY = 6,
3221 	OP_CB_PUSH_DELEG = 7,
3222 	OP_CB_RECALL_ANY = 8,
3223 	OP_CB_RECALLABLE_OBJ_AVAIL = 9,
3224 	OP_CB_RECALL_SLOT = 10,
3225 	OP_CB_SEQUENCE = 11,
3226 	OP_CB_WANTS_CANCELLED = 12,
3227 	OP_CB_NOTIFY_LOCK = 13,
3228 	OP_CB_NOTIFY_DEVICEID = 14,
3229 	OP_CB_ILLEGAL = 10044
3230 };
3231 typedef enum nfs_cb_opnum4 nfs_cb_opnum4;
3232 
3233 struct nfs_cb_argop4 {
3234 	uint_t argop;
3235 	union {
3236 		CB_GETATTR4args opcbgetattr;
3237 		CB_RECALL4args opcbrecall;
3238 		CB_LAYOUTRECALL4args opcblayoutrecall;
3239 		CB_NOTIFY4args opcbnotify;
3240 		CB_PUSH_DELEG4args opcbpush_deleg;
3241 		CB_RECALL_ANY4args opcbrecall_any;
3242 		CB_RECALLABLE_OBJ_AVAIL4args opcbrecallable_obj_avail;
3243 		CB_RECALL_SLOT4args opcbrecall_slot;
3244 		CB_SEQUENCE4args opcbsequence;
3245 		CB_WANTS_CANCELLED4args opcbwants_cancelled;
3246 		CB_NOTIFY_LOCK4args opcbnotify_lock;
3247 		CB_NOTIFY_DEVICEID4args opcbnotify_deviceid;
3248 	} nfs_cb_argop4_u;
3249 };
3250 typedef struct nfs_cb_argop4 nfs_cb_argop4;
3251 
3252 struct nfs_cb_resop4 {
3253 	uint_t resop;
3254 	union {
3255 		CB_GETATTR4res opcbgetattr;
3256 		CB_RECALL4res opcbrecall;
3257 		CB_LAYOUTRECALL4res opcblayoutrecall;
3258 		CB_NOTIFY4res opcbnotify;
3259 		CB_PUSH_DELEG4res opcbpush_deleg;
3260 		CB_RECALL_ANY4res opcbrecall_any;
3261 		CB_RECALLABLE_OBJ_AVAIL4res opcbrecallable_obj_avail;
3262 		CB_RECALL_SLOT4res opcbrecall_slot;
3263 		CB_SEQUENCE4res opcbsequence;
3264 		CB_WANTS_CANCELLED4res opcbwants_cancelled;
3265 		CB_NOTIFY_LOCK4res opcbnotify_lock;
3266 		CB_NOTIFY_DEVICEID4res opcbnotify_deviceid;
3267 		CB_ILLEGAL4res opcbillegal;
3268 	} nfs_cb_resop4_u;
3269 };
3270 typedef struct nfs_cb_resop4 nfs_cb_resop4;
3271 
3272 struct CB_COMPOUND4args {
3273 	utf8string tag;
3274 	uint32_t minorversion;
3275 	uint32_t callback_ident;
3276 	uint_t array_len;
3277 	nfs_cb_argop4 *array;
3278 };
3279 typedef struct CB_COMPOUND4args CB_COMPOUND4args;
3280 
3281 struct CB_COMPOUND4res {
3282 	nfsstat4 status;
3283 	utf8string tag;
3284 	uint_t array_len;
3285 	nfs_cb_resop4 *array;
3286 };
3287 typedef struct CB_COMPOUND4res CB_COMPOUND4res;
3288 
3289 #define	NFS4_PROGRAM		100003
3290 #define	NFS_V4			4
3291 #define	NFSPROC4_NULL		0
3292 #define	NFSPROC4_COMPOUND	1
3293 
3294 #define	NFS4_CALLBACK		0x40000000
3295 #define	NFS_CB			1
3296 #define	CB_NULL			0
3297 #define	CB_COMPOUND		1
3298 
3299 extern  bool_t xdr_bitmap4(XDR *, bitmap4 *);
3300 extern  bool_t xdr_utf8string(XDR *, utf8string *);
3301 extern  bool_t xdr_nfs_fh4(XDR *, nfs_fh4 *);
3302 extern  bool_t xdr_fattr4_fsid(XDR *, fattr4_fsid *);
3303 extern  bool_t xdr_fattr4_acl(XDR *, fattr4_acl *);
3304 extern  bool_t xdr_fattr4_fs_locations(XDR *, fattr4_fs_locations *);
3305 extern  bool_t xdr_fattr4_rawdev(XDR *, fattr4_rawdev *);
3306 extern  bool_t xdr_nfstime4(XDR *, nfstime4 *);
3307 extern  bool_t xdr_settime4(XDR *, settime4 *);
3308 extern  bool_t xdr_COMPOUND4args_clnt(XDR *, COMPOUND4args_clnt *);
3309 extern  bool_t xdr_COMPOUND4args_srv(XDR *, COMPOUND4args *);
3310 extern  bool_t xdr_COMPOUND4res_clnt(XDR *, COMPOUND4res_clnt *);
3311 extern  bool_t xdr_COMPOUND4res_srv(XDR *, COMPOUND4res *);
3312 extern  bool_t xdr_CB_COMPOUND4args_clnt(XDR *, CB_COMPOUND4args *);
3313 extern  bool_t xdr_CB_COMPOUND4args_srv(XDR *, CB_COMPOUND4args *);
3314 extern  bool_t xdr_CB_COMPOUND4res(XDR *, CB_COMPOUND4res *);
3315 
3316 /* New XDR to nfsv4.1 */
3317 extern  bool_t xdr_nfs_ftype4(XDR *, nfs_ftype4*);
3318 extern  bool_t xdr_nfsstat4(XDR *, nfsstat4*);
3319 extern  bool_t xdr_attrlist4(XDR *, attrlist4*);
3320 extern  bool_t xdr_bitmap4(XDR *, bitmap4*);
3321 extern  bool_t xdr_changeid4(XDR *, changeid4*);
3322 extern  bool_t xdr_clientid4(XDR *, clientid4*);
3323 extern  bool_t xdr_count4(XDR *, count4*);
3324 extern  bool_t xdr_length4(XDR *, length4*);
3325 extern  bool_t xdr_mode4(XDR *, mode4*);
3326 extern  bool_t xdr_nfs_cookie4(XDR *, nfs_cookie4*);
3327 extern  bool_t xdr_nfs_fh4(XDR *, nfs_fh4*);
3328 extern  bool_t xdr_offset4(XDR *, offset4*);
3329 extern  bool_t xdr_qop4(XDR *, qop4*);
3330 extern  bool_t xdr_sec_oid4(XDR *, sec_oid4*);
3331 extern  bool_t xdr_sequenceid4(XDR *, sequenceid4*);
3332 extern  bool_t xdr_seqid4(XDR *, seqid4*);
3333 extern  bool_t xdr_sessionid4(XDR *, sessionid4);
3334 extern  bool_t xdr_slotid4(XDR *, slotid4*);
3335 extern  bool_t xdr_utf8string(XDR *, utf8string*);
3336 extern  bool_t xdr_utf8str_cis(XDR *, utf8str_cis*);
3337 extern  bool_t xdr_utf8str_cs(XDR *, utf8str_cs*);
3338 extern  bool_t xdr_utf8str_mixed(XDR *, utf8str_mixed*);
3339 extern  bool_t xdr_component4(XDR *, component4*);
3340 extern  bool_t xdr_linktext4(XDR *, linktext4*);
3341 extern  bool_t xdr_pathname4(XDR *, pathname4*);
3342 extern  bool_t xdr_verifier4(XDR *, verifier4*);
3343 extern  bool_t xdr_nfstime4(XDR *, nfstime4*);
3344 extern  bool_t xdr_time_how4(XDR *, time_how4*);
3345 extern  bool_t xdr_settime4(XDR *, settime4*);
3346 extern  bool_t xdr_nfs_lease4(XDR *, nfs_lease4*);
3347 extern  bool_t xdr_fsid4(XDR *, fsid4*);
3348 extern  bool_t xdr_change_policy4(XDR *, change_policy4*);
3349 extern  bool_t xdr_fs_locations4(XDR *, fs_locations4*);
3350 extern  bool_t xdr_acetype4(XDR *, acetype4*);
3351 extern  bool_t xdr_aceflag4(XDR *, aceflag4*);
3352 extern  bool_t xdr_acemask4(XDR *, acemask4*);
3353 extern  bool_t xdr_nfsace4(XDR *, nfsace4*);
3354 extern  bool_t xdr_aclflag4(XDR *, aclflag4*);
3355 extern  bool_t xdr_nfsacl41(XDR *, nfsacl41*);
3356 extern  bool_t xdr_mode_masked4(XDR *, mode_masked4*);
3357 extern  bool_t xdr_specdata4(XDR *, specdata4*);
3358 extern  bool_t xdr_netaddr4(XDR *, netaddr4*);
3359 extern  bool_t xdr_nfs_impl_id4(XDR *, nfs_impl_id4*);
3360 extern  bool_t xdr_stateid4(XDR *, stateid4*);
3361 extern  bool_t xdr_layouttype4(XDR *, layouttype4*);
3362 extern  bool_t xdr_layout_content4(XDR *, layout_content4*);
3363 extern  bool_t xdr_layouthint4(XDR *, layouthint4*);
3364 extern  bool_t xdr_layoutiomode4(XDR *, layoutiomode4*);
3365 extern  bool_t xdr_layout4(XDR *, layout4*);
3366 extern  bool_t xdr_deviceid4(XDR *, deviceid4);
3367 extern  bool_t xdr_device_addr4(XDR *, device_addr4*);
3368 extern  bool_t xdr_layoutupdate4(XDR *, layoutupdate4*);
3369 extern  bool_t xdr_layoutreturn_type4(XDR *, layoutreturn_type4*);
3370 extern  bool_t xdr_layoutreturn_file4(XDR *, layoutreturn_file4*);
3371 extern  bool_t xdr_layoutreturn4(XDR *, layoutreturn4*);
3372 extern  bool_t xdr_fs4_status_type(XDR *, fs4_status_type*);
3373 extern  bool_t xdr_fs4_status(XDR *, fs4_status*);
3374 extern  bool_t xdr_threshold4_read_size(XDR *, threshold4_read_size*);
3375 extern  bool_t xdr_threshold4_write_size(XDR *, threshold4_write_size*);
3376 extern  bool_t xdr_threshold4_read_iosize(XDR *, threshold4_read_iosize*);
3377 extern  bool_t xdr_threshold4_write_iosize(XDR *, threshold4_write_iosize*);
3378 extern  bool_t xdr_threshold_item4(XDR *, threshold_item4*);
3379 extern  bool_t xdr_mdsthreshold4(XDR *, mdsthreshold4*);
3380 extern  bool_t xdr_retention_get4(XDR *, retention_get4*);
3381 extern  bool_t xdr_retention_set4(XDR *, retention_set4*);
3382 extern  bool_t xdr_fs_charset_cap4(XDR *, fs_charset_cap4*);
3383 extern  bool_t xdr_fattr4_supported_attrs(XDR *, fattr4_supported_attrs*);
3384 extern  bool_t xdr_fattr4_type(XDR *, fattr4_type*);
3385 extern  bool_t xdr_fattr4_fh_expire_type(XDR *, fattr4_fh_expire_type*);
3386 extern  bool_t xdr_fattr4_change(XDR *, fattr4_change*);
3387 extern  bool_t xdr_fattr4_size(XDR *, fattr4_size*);
3388 extern  bool_t xdr_fattr4_link_support(XDR *, fattr4_link_support*);
3389 extern  bool_t xdr_fattr4_symlink_support(XDR *, fattr4_symlink_support*);
3390 extern  bool_t xdr_fattr4_named_attr(XDR *, fattr4_named_attr*);
3391 extern  bool_t xdr_fattr4_fsid(XDR *, fattr4_fsid*);
3392 extern  bool_t xdr_fattr4_unique_handles(XDR *, fattr4_unique_handles*);
3393 extern  bool_t xdr_fattr4_lease_time(XDR *, fattr4_lease_time*);
3394 extern  bool_t xdr_fattr4_rdattr_error(XDR *, fattr4_rdattr_error*);
3395 extern  bool_t xdr_fattr4_acl(XDR *, fattr4_acl*);
3396 extern  bool_t xdr_fattr4_aclsupport(XDR *, fattr4_aclsupport*);
3397 extern  bool_t xdr_fattr4_archive(XDR *, fattr4_archive*);
3398 extern  bool_t xdr_fattr4_cansettime(XDR *, fattr4_cansettime*);
3399 extern  bool_t xdr_fattr4_case_insensitive(XDR *, fattr4_case_insensitive*);
3400 extern  bool_t xdr_fattr4_case_preserving(XDR *, fattr4_case_preserving*);
3401 extern  bool_t xdr_fattr4_chown_restricted(XDR *, fattr4_chown_restricted*);
3402 extern  bool_t xdr_fattr4_fileid(XDR *, fattr4_fileid*);
3403 extern  bool_t xdr_fattr4_files_avail(XDR *, fattr4_files_avail*);
3404 extern  bool_t xdr_fattr4_filehandle(XDR *, fattr4_filehandle*);
3405 extern  bool_t xdr_fattr4_files_free(XDR *, fattr4_files_free*);
3406 extern  bool_t xdr_fattr4_files_total(XDR *, fattr4_files_total*);
3407 extern  bool_t xdr_fattr4_fs_locations(XDR *, fattr4_fs_locations*);
3408 extern  bool_t xdr_fattr4_hidden(XDR *, fattr4_hidden*);
3409 extern  bool_t xdr_fattr4_homogeneous(XDR *, fattr4_homogeneous*);
3410 extern  bool_t xdr_fattr4_maxfilesize(XDR *, fattr4_maxfilesize*);
3411 extern  bool_t xdr_fattr4_maxlink(XDR *, fattr4_maxlink*);
3412 extern  bool_t xdr_fattr4_maxname(XDR *, fattr4_maxname*);
3413 extern  bool_t xdr_fattr4_maxread(XDR *, fattr4_maxread*);
3414 extern  bool_t xdr_fattr4_maxwrite(XDR *, fattr4_maxwrite*);
3415 extern  bool_t xdr_fattr4_mimetype(XDR *, fattr4_mimetype*);
3416 extern  bool_t xdr_fattr4_mode(XDR *, fattr4_mode*);
3417 extern  bool_t xdr_fattr4_mode_set_masked(XDR *, fattr4_mode_set_masked*);
3418 extern  bool_t xdr_fattr4_mounted_on_fileid(XDR *, fattr4_mounted_on_fileid*);
3419 extern  bool_t xdr_fattr4_no_trunc(XDR *, fattr4_no_trunc*);
3420 extern  bool_t xdr_fattr4_numlinks(XDR *, fattr4_numlinks*);
3421 extern  bool_t xdr_fattr4_owner(XDR *, fattr4_owner*);
3422 extern  bool_t xdr_fattr4_owner_group(XDR *, fattr4_owner_group*);
3423 extern  bool_t xdr_fattr4_quota_avail_hard(XDR *, fattr4_quota_avail_hard*);
3424 extern  bool_t xdr_fattr4_quota_avail_soft(XDR *, fattr4_quota_avail_soft*);
3425 extern  bool_t xdr_fattr4_quota_used(XDR *, fattr4_quota_used*);
3426 extern  bool_t xdr_fattr4_rawdev(XDR *, fattr4_rawdev*);
3427 extern  bool_t xdr_fattr4_space_avail(XDR *, fattr4_space_avail*);
3428 extern  bool_t xdr_fattr4_space_free(XDR *, fattr4_space_free*);
3429 extern  bool_t xdr_fattr4_space_total(XDR *, fattr4_space_total*);
3430 extern  bool_t xdr_fattr4_space_used(XDR *, fattr4_space_used*);
3431 extern  bool_t xdr_fattr4_system(XDR *, fattr4_system*);
3432 extern  bool_t xdr_fattr4_time_access(XDR *, fattr4_time_access*);
3433 extern  bool_t xdr_fattr4_time_access_set(XDR *, fattr4_time_access_set*);
3434 extern  bool_t xdr_fattr4_time_backup(XDR *, fattr4_time_backup*);
3435 extern  bool_t xdr_fattr4_time_create(XDR *, fattr4_time_create*);
3436 extern  bool_t xdr_fattr4_time_delta(XDR *, fattr4_time_delta*);
3437 extern  bool_t xdr_fattr4_time_metadata(XDR *, fattr4_time_metadata*);
3438 extern  bool_t xdr_fattr4_time_modify(XDR *, fattr4_time_modify*);
3439 extern  bool_t xdr_fattr4_time_modify_set(XDR *, fattr4_time_modify_set*);
3440 extern  bool_t xdr_fattr4_suppattr_exclcreat(XDR *, fattr4_suppattr_exclcreat*);
3441 extern  bool_t xdr_fattr4_dir_notif_delay(XDR *, fattr4_dir_notif_delay*);
3442 extern  bool_t xdr_fattr4_dirent_notif_delay(XDR *, fattr4_dirent_notif_delay*);
3443 extern  bool_t xdr_fattr4_fs_layout_types(XDR *, fattr4_fs_layout_types*);
3444 extern  bool_t xdr_fattr4_fs_status(XDR *, fattr4_fs_status*);
3445 extern  bool_t xdr_fattr4_fs_charset_cap(XDR *, fattr4_fs_charset_cap*);
3446 extern  bool_t xdr_fattr4_layout_alignment(XDR *, fattr4_layout_alignment*);
3447 extern  bool_t xdr_fattr4_layout_blksize(XDR *, fattr4_layout_blksize*);
3448 extern  bool_t xdr_fattr4_layout_hint(XDR *, fattr4_layout_hint*);
3449 extern  bool_t xdr_fattr4_layout_types(XDR *, fattr4_layout_types*);
3450 extern  bool_t xdr_fattr4_mdsthreshold(XDR *, fattr4_mdsthreshold*);
3451 extern  bool_t xdr_fattr4_retention_get(XDR *, fattr4_retention_get*);
3452 extern  bool_t xdr_fattr4_retention_set(XDR *, fattr4_retention_set*);
3453 extern  bool_t xdr_fattr4_retentevt_get(XDR *, fattr4_retentevt_get*);
3454 extern  bool_t xdr_fattr4_retentevt_set(XDR *, fattr4_retentevt_set*);
3455 extern  bool_t xdr_fattr4_retention_hold(XDR *, fattr4_retention_hold*);
3456 extern  bool_t xdr_fattr4_dacl(XDR *, fattr4_dacl*);
3457 extern  bool_t xdr_fattr4_sacl(XDR *, fattr4_sacl*);
3458 extern  bool_t xdr_fattr4_change_policy(XDR *, fattr4_change_policy*);
3459 extern  bool_t xdr_fattr4(XDR *, fattr4*);
3460 extern  bool_t xdr_change_info4(XDR *, change_info4*);
3461 extern  bool_t xdr_clientaddr4(XDR *, clientaddr4*);
3462 extern  bool_t xdr_cb_client4(XDR *, cb_client4*);
3463 extern  bool_t xdr_nfs_client_id4(XDR *, nfs_client_id4*);
3464 extern  bool_t xdr_client_owner4(XDR *, client_owner4*);
3465 extern  bool_t xdr_server_owner4(XDR *, server_owner4*);
3466 extern  bool_t xdr_state_owner4(XDR *, state_owner4*);
3467 extern  bool_t xdr_open_owner4(XDR *, open_owner4*);
3468 extern  bool_t xdr_lock_owner4(XDR *, lock_owner4*);
3469 extern  bool_t xdr_nfs_lock_type4(XDR *, nfs_lock_type4*);
3470 extern  bool_t xdr_ssv_subkey4(XDR *, ssv_subkey4*);
3471 extern  bool_t xdr_ssv_mic_plain_tkn4(XDR *, ssv_mic_plain_tkn4*);
3472 extern  bool_t xdr_ssv_mic_tkn4(XDR *, ssv_mic_tkn4*);
3473 extern  bool_t xdr_ssv_seal_plain_tkn4(XDR *, ssv_seal_plain_tkn4*);
3474 extern  bool_t xdr_ssv_seal_cipher_tkn4(XDR *, ssv_seal_cipher_tkn4*);
3475 extern  bool_t xdr_fs_locations_server4(XDR *, fs_locations_server4*);
3476 extern  bool_t xdr_fs_locations_item4(XDR *, fs_locations_item4*);
3477 extern  bool_t xdr_fs_locations_info4(XDR *, fs_locations_info4*);
3478 extern  bool_t xdr_fattr4_fs_locations_info(XDR *, fattr4_fs_locations_info*);
3479 extern  bool_t xdr_nfl_util4(XDR *, nfl_util4*);
3480 extern  bool_t xdr_filelayout_hint_care4(XDR *, filelayout_hint_care4*);
3481 extern  bool_t xdr_nfsv4_1_file_layouthint4(XDR *, nfsv4_1_file_layouthint4*);
3482 extern  bool_t xdr_multipath_list4(XDR *, multipath_list4*);
3483 extern  bool_t xdr_nfsv4_1_file_layout_ds_addr4(XDR *,
3484 	nfsv4_1_file_layout_ds_addr4*);
3485 extern  bool_t xdr_nfsv4_1_file_layout4(XDR *, nfsv4_1_file_layout4*);
3486 extern  bool_t xdr_ACCESS4args(XDR *, ACCESS4args*);
3487 extern  bool_t xdr_COMMIT4args(XDR *, COMMIT4args*);
3488 extern  bool_t xdr_COMMIT4res(XDR *, COMMIT4res*);
3489 extern  bool_t xdr_DELEGPURGE4args(XDR *, DELEGPURGE4args*);
3490 extern  bool_t xdr_DELEGPURGE4res(XDR *, DELEGPURGE4res*);
3491 extern  bool_t xdr_DELEGRETURN4args(XDR *, DELEGRETURN4args*);
3492 extern  bool_t xdr_DELEGRETURN4res(XDR *, DELEGRETURN4res*);
3493 extern  bool_t xdr_GETATTR4args(XDR *, GETATTR4args*);
3494 extern  bool_t xdr_GETATTR4res(XDR *, GETATTR4res*);
3495 extern  bool_t xdr_GETFH4res(XDR *, GETFH4res*);
3496 extern  bool_t xdr_open_to_lock_owner4(XDR *, open_to_lock_owner4*);
3497 extern  bool_t xdr_exist_lock_owner4(XDR *, exist_lock_owner4*);
3498 extern  bool_t xdr_locker4(XDR *, locker4*);
3499 extern  bool_t xdr_LOCK4denied(XDR *, LOCK4denied*);
3500 extern  bool_t xdr_LOOKUP4args(XDR *, LOOKUP4args*);
3501 extern  bool_t xdr_LOOKUP4res(XDR *, LOOKUP4res*);
3502 extern  bool_t xdr_LOOKUPP4res(XDR *, LOOKUPP4res*);
3503 extern  bool_t xdr_NVERIFY4args(XDR *, NVERIFY4args*);
3504 extern  bool_t xdr_NVERIFY4res(XDR *, NVERIFY4res*);
3505 extern  bool_t xdr_createmode4(XDR *, createmode4*);
3506 extern  bool_t xdr_creatverfattr(XDR *, creatverfattr*);
3507 extern  bool_t xdr_createhow4(XDR *, createhow4*);
3508 extern  bool_t xdr_opentype4(XDR *, opentype4*);
3509 extern  bool_t xdr_openflag4(XDR *, openflag4*);
3510 extern  bool_t xdr_limit_by4(XDR *, limit_by4*);
3511 extern  bool_t xdr_nfs_modified_limit4(XDR *, nfs_modified_limit4*);
3512 extern  bool_t xdr_nfs_space_limit4(XDR *, nfs_space_limit4*);
3513 extern  bool_t xdr_open_delegation_type4(XDR *, open_delegation_type4*);
3514 extern  bool_t xdr_open_claim_type4(XDR *, open_claim_type4*);
3515 extern  bool_t xdr_open_claim_delegate_cur4(XDR *, open_claim_delegate_cur4*);
3516 extern  bool_t xdr_open_claim4(XDR *, open_claim4*);
3517 extern  bool_t xdr_open_read_delegation4(XDR *, open_read_delegation4*);
3518 extern  bool_t xdr_open_write_delegation4(XDR *, open_write_delegation4*);
3519 extern  bool_t xdr_why_no_delegation4(XDR *, why_no_delegation4*);
3520 extern  bool_t xdr_open_none_delegation4(XDR *, open_none_delegation4*);
3521 extern  bool_t xdr_open_delegation4(XDR *, open_delegation4*);
3522 extern  bool_t xdr_PUTFH4args(XDR *, PUTFH4args*);
3523 extern  bool_t xdr_PUTFH4res(XDR *, PUTFH4res*);
3524 extern  bool_t xdr_PUTPUBFH4res(XDR *, PUTPUBFH4res*);
3525 extern  bool_t xdr_PUTROOTFH4res(XDR *, PUTROOTFH4res*);
3526 extern  bool_t xdr_RENEW4args(XDR *, RENEW4args*);
3527 extern  bool_t xdr_RENEW4res(XDR *, RENEW4res*);
3528 extern  bool_t xdr_RESTOREFH4res(XDR *, RESTOREFH4res*);
3529 extern  bool_t xdr_SAVEFH4res(XDR *, SAVEFH4res*);
3530 extern  bool_t xdr_SECINFO4args(XDR *, SECINFO4args*);
3531 extern  bool_t xdr_rpc_gss_svc_t(XDR *, rpc_gss_svc_t *);
3532 extern  bool_t xdr_rpcsec_gss_info(XDR *, rpcsec_gss_info*);
3533 extern  bool_t xdr_SECINFO4res(XDR *, SECINFO4res*);
3534 extern  bool_t xdr_SETATTR4args(XDR *, SETATTR4args*);
3535 extern  bool_t xdr_SETATTR4res(XDR *, SETATTR4res*);
3536 extern  bool_t xdr_SETCLIENTID_CONFIRM4args(XDR *, SETCLIENTID_CONFIRM4args*);
3537 extern  bool_t xdr_SETCLIENTID_CONFIRM4res(XDR *, SETCLIENTID_CONFIRM4res*);
3538 extern  bool_t xdr_VERIFY4args(XDR *, VERIFY4args*);
3539 extern  bool_t xdr_VERIFY4res(XDR *, VERIFY4res*);
3540 extern  bool_t xdr_stable_how4(XDR *, stable_how4*);
3541 extern  bool_t xdr_RELEASE_LOCKOWNER4args(XDR *, RELEASE_LOCKOWNER4args*);
3542 extern  bool_t xdr_RELEASE_LOCKOWNER4res(XDR *, RELEASE_LOCKOWNER4res*);
3543 extern  bool_t xdr_ILLEGAL4res(XDR *, ILLEGAL4res*);
3544 extern  bool_t xdr_gsshandle4_t(XDR *, gsshandle4_t *);
3545 extern  bool_t xdr_gss_cb_handles4(XDR *, gss_cb_handles4*);
3546 extern  bool_t xdr_callback_sec_parms4(XDR *, callback_sec_parms4*);
3547 extern  bool_t xdr_BACKCHANNEL_CTL4args(XDR *, BACKCHANNEL_CTL4args*);
3548 extern  bool_t xdr_BACKCHANNEL_CTL4res(XDR *, BACKCHANNEL_CTL4res*);
3549 extern  bool_t xdr_channel_dir_from_client4(XDR *, channel_dir_from_client4*);
3550 extern  bool_t xdr_BIND_CONN_TO_SESSION4args(XDR *, BIND_CONN_TO_SESSION4args*);
3551 extern  bool_t xdr_channel_dir_from_server4(XDR *, channel_dir_from_server4*);
3552 extern  bool_t xdr_BIND_CONN_TO_SESSION4resok(XDR *,
3553 	BIND_CONN_TO_SESSION4resok*);
3554 extern  bool_t xdr_BIND_CONN_TO_SESSION4res(XDR *, BIND_CONN_TO_SESSION4res*);
3555 extern  bool_t xdr_state_protect_ops4(XDR *, state_protect_ops4*);
3556 extern  bool_t xdr_ssv_sp_parms4(XDR *, ssv_sp_parms4*);
3557 extern  bool_t xdr_state_protect_how4(XDR *, state_protect_how4*);
3558 extern  bool_t xdr_state_protect4_a(XDR *, state_protect4_a*);
3559 extern  bool_t xdr_EXCHANGE_ID4args(XDR *, EXCHANGE_ID4args*);
3560 extern  bool_t xdr_ssv_prot_info4(XDR *, ssv_prot_info4*);
3561 extern  bool_t xdr_state_protect4_r(XDR *, state_protect4_r*);
3562 extern  bool_t xdr_EXCHANGE_ID4resok(XDR *, EXCHANGE_ID4resok*);
3563 extern  bool_t xdr_EXCHANGE_ID4res(XDR *, EXCHANGE_ID4res*);
3564 extern  bool_t xdr_channel_attrs4(XDR *, channel_attrs4*);
3565 extern  bool_t xdr_CREATE_SESSION4args(XDR *, CREATE_SESSION4args*);
3566 extern  bool_t xdr_CREATE_SESSION4resok(XDR *, CREATE_SESSION4resok*);
3567 extern  bool_t xdr_CREATE_SESSION4res(XDR *, CREATE_SESSION4res*);
3568 extern  bool_t xdr_DESTROY_SESSION4args(XDR *, DESTROY_SESSION4args*);
3569 extern  bool_t xdr_DESTROY_SESSION4res(XDR *, DESTROY_SESSION4res*);
3570 extern  bool_t xdr_FREE_STATEID4args(XDR *, FREE_STATEID4args*);
3571 extern  bool_t xdr_FREE_STATEID4res(XDR *, FREE_STATEID4res*);
3572 extern  bool_t xdr_attr_notice4(XDR *, attr_notice4*);
3573 extern  bool_t xdr_GET_DIR_DELEGATION4args(XDR *, GET_DIR_DELEGATION4args*);
3574 extern  bool_t xdr_GET_DIR_DELEGATION4resok(XDR *, GET_DIR_DELEGATION4resok*);
3575 extern  bool_t xdr_gddrnf4_status(XDR *, gddrnf4_status*);
3576 extern  bool_t xdr_GET_DIR_DELEGATION4res_non_fatal(XDR *,
3577 	GET_DIR_DELEGATION4res_non_fatal*);
3578 extern  bool_t xdr_GET_DIR_DELEGATION4res(XDR *, GET_DIR_DELEGATION4res*);
3579 extern  bool_t xdr_GETDEVICEINFO4args(XDR *, GETDEVICEINFO4args*);
3580 extern  bool_t xdr_GETDEVICEINFO4resok(XDR *, GETDEVICEINFO4resok*);
3581 extern  bool_t xdr_GETDEVICEINFO4res(XDR *, GETDEVICEINFO4res*);
3582 extern  bool_t xdr_GETDEVICELIST4args(XDR *, GETDEVICELIST4args*);
3583 extern  bool_t xdr_GETDEVICELIST4resok(XDR *, GETDEVICELIST4resok*);
3584 extern  bool_t xdr_GETDEVICELIST4res(XDR *, GETDEVICELIST4res*);
3585 extern  bool_t xdr_newtime4(XDR *, newtime4*);
3586 extern  bool_t xdr_newoffset4(XDR *, newoffset4*);
3587 extern  bool_t xdr_LAYOUTCOMMIT4args(XDR *, LAYOUTCOMMIT4args*);
3588 extern  bool_t xdr_newsize4(XDR *, newsize4*);
3589 extern  bool_t xdr_LAYOUTCOMMIT4resok(XDR *, LAYOUTCOMMIT4resok*);
3590 extern  bool_t xdr_LAYOUTCOMMIT4res(XDR *, LAYOUTCOMMIT4res*);
3591 extern  bool_t xdr_LAYOUTGET4args(XDR *, LAYOUTGET4args*);
3592 extern  bool_t xdr_LAYOUTGET4resok(XDR *, LAYOUTGET4resok*);
3593 extern  bool_t xdr_LAYOUTGET4res(XDR *, LAYOUTGET4res*);
3594 extern  bool_t xdr_LAYOUTRETURN4args(XDR *, LAYOUTRETURN4args*);
3595 extern  bool_t xdr_layoutreturn_stateid(XDR *, layoutreturn_stateid*);
3596 extern  bool_t xdr_LAYOUTRETURN4res(XDR *, LAYOUTRETURN4res*);
3597 extern  bool_t xdr_secinfo_style4(XDR *, secinfo_style4*);
3598 extern  bool_t xdr_SECINFO_NO_NAME4args(XDR *, SECINFO_NO_NAME4args*);
3599 extern  bool_t xdr_SECINFO_NO_NAME4res(XDR *, SECINFO_NO_NAME4res*);
3600 extern  bool_t xdr_SEQUENCE4args(XDR *, SEQUENCE4args*);
3601 extern  bool_t xdr_SEQUENCE4resok(XDR *, SEQUENCE4resok*);
3602 extern  bool_t xdr_SEQUENCE4res(XDR *, SEQUENCE4res*);
3603 extern  bool_t xdr_ssa_digest_input4(XDR *, ssa_digest_input4*);
3604 extern  bool_t xdr_SET_SSV4args(XDR *, SET_SSV4args*);
3605 extern  bool_t xdr_ssr_digest_input4(XDR *, ssr_digest_input4*);
3606 extern  bool_t xdr_SET_SSV4resok(XDR *, SET_SSV4resok*);
3607 extern  bool_t xdr_SET_SSV4res(XDR *, SET_SSV4res*);
3608 extern  bool_t xdr_TEST_STATEID4args(XDR *, TEST_STATEID4args*);
3609 extern  bool_t xdr_TEST_STATEID4resok(XDR *, TEST_STATEID4resok*);
3610 extern  bool_t xdr_TEST_STATEID4res(XDR *, TEST_STATEID4res*);
3611 extern  bool_t xdr_deleg_claim4(XDR *, deleg_claim4*);
3612 extern  bool_t xdr_WANT_DELEGATION4args(XDR *, WANT_DELEGATION4args*);
3613 extern  bool_t xdr_WANT_DELEGATION4res(XDR *, WANT_DELEGATION4res*);
3614 extern  bool_t xdr_DESTROY_CLIENTID4args(XDR *, DESTROY_CLIENTID4args*);
3615 extern  bool_t xdr_DESTROY_CLIENTID4res(XDR *, DESTROY_CLIENTID4res*);
3616 extern  bool_t xdr_RECLAIM_COMPLETE4args(XDR *, RECLAIM_COMPLETE4args*);
3617 extern  bool_t xdr_RECLAIM_COMPLETE4res(XDR *, RECLAIM_COMPLETE4res*);
3618 extern  bool_t xdr_nfs_opnum4(XDR *, nfs_opnum4*);
3619 extern  bool_t xdr_COMPOUND4args(XDR *, COMPOUND4args*);
3620 extern  bool_t xdr_COMPOUND4res(XDR *, COMPOUND4res*);
3621 extern  bool_t xdr_CB_GETATTR4args(XDR *, CB_GETATTR4args*);
3622 extern  bool_t xdr_CB_GETATTR4res(XDR *, CB_GETATTR4res*);
3623 extern  bool_t xdr_CB_RECALL4args(XDR *, CB_RECALL4args*);
3624 extern  bool_t xdr_CB_RECALL4res(XDR *, CB_RECALL4res*);
3625 extern  bool_t xdr_CB_ILLEGAL4res(XDR *, CB_ILLEGAL4res*);
3626 extern  bool_t xdr_layoutrecall_type4(XDR *, layoutrecall_type4*);
3627 extern  bool_t xdr_layoutrecall_file4(XDR *, layoutrecall_file4*);
3628 extern  bool_t xdr_layoutrecall4(XDR *, layoutrecall4*);
3629 extern  bool_t xdr_CB_LAYOUTRECALL4args(XDR *, CB_LAYOUTRECALL4args*);
3630 extern  bool_t xdr_CB_LAYOUTRECALL4res(XDR *, CB_LAYOUTRECALL4res*);
3631 extern  bool_t xdr_notify_type4(XDR *, notify_type4*);
3632 extern  bool_t xdr_notify_entry4(XDR *, notify_entry4*);
3633 extern  bool_t xdr_prev_entry4(XDR *, prev_entry4*);
3634 extern  bool_t xdr_notify_remove4(XDR *, notify_remove4*);
3635 extern  bool_t xdr_notify_add4(XDR *, notify_add4*);
3636 extern  bool_t xdr_notify_attr4(XDR *, notify_attr4*);
3637 extern  bool_t xdr_notify_rename4(XDR *, notify_rename4*);
3638 extern  bool_t xdr_notify_verifier4(XDR *, notify_verifier4*);
3639 extern  bool_t xdr_notifylist4(XDR *, notifylist4*);
3640 extern  bool_t xdr_notify4(XDR *, notify4*);
3641 extern  bool_t xdr_CB_NOTIFY4args(XDR *, CB_NOTIFY4args*);
3642 extern  bool_t xdr_CB_NOTIFY4res(XDR *, CB_NOTIFY4res*);
3643 extern  bool_t xdr_CB_PUSH_DELEG4args(XDR *, CB_PUSH_DELEG4args*);
3644 extern  bool_t xdr_CB_PUSH_DELEG4res(XDR *, CB_PUSH_DELEG4res*);
3645 extern  bool_t xdr_CB_RECALL_ANY4args(XDR *, CB_RECALL_ANY4args*);
3646 extern  bool_t xdr_CB_RECALL_ANY4res(XDR *, CB_RECALL_ANY4res*);
3647 extern  bool_t xdr_CB_RECALLABLE_OBJ_AVAIL4args(XDR *,
3648 	CB_RECALLABLE_OBJ_AVAIL4args*);
3649 extern  bool_t xdr_CB_RECALLABLE_OBJ_AVAIL4res(XDR *,
3650 	CB_RECALLABLE_OBJ_AVAIL4res*);
3651 extern  bool_t xdr_CB_RECALL_SLOT4args(XDR *, CB_RECALL_SLOT4args*);
3652 extern  bool_t xdr_CB_RECALL_SLOT4res(XDR *, CB_RECALL_SLOT4res*);
3653 extern  bool_t xdr_referring_call4(XDR *, referring_call4*);
3654 extern  bool_t xdr_referring_call_list4(XDR *, referring_call_list4*);
3655 extern  bool_t xdr_CB_SEQUENCE4args(XDR *, CB_SEQUENCE4args*);
3656 extern  bool_t xdr_CB_SEQUENCE4resok(XDR *, CB_SEQUENCE4resok*);
3657 extern  bool_t xdr_CB_SEQUENCE4res(XDR *, CB_SEQUENCE4res*);
3658 extern  bool_t xdr_CB_WANTS_CANCELLED4args(XDR *, CB_WANTS_CANCELLED4args*);
3659 extern  bool_t xdr_CB_WANTS_CANCELLED4res(XDR *, CB_WANTS_CANCELLED4res*);
3660 extern  bool_t xdr_CB_NOTIFY_LOCK4args(XDR *, CB_NOTIFY_LOCK4args*);
3661 extern  bool_t xdr_CB_NOTIFY_LOCK4res(XDR *, CB_NOTIFY_LOCK4res*);
3662 extern  bool_t xdr_notify_deviceid_type4(XDR *, notify_deviceid_type4*);
3663 extern  bool_t xdr_notify_deviceid_delete4(XDR *, notify_deviceid_delete4*);
3664 extern  bool_t xdr_notify_deviceid_change4(XDR *, notify_deviceid_change4*);
3665 extern  bool_t xdr_CB_NOTIFY_DEVICEID4args(XDR *, CB_NOTIFY_DEVICEID4args*);
3666 extern  bool_t xdr_CB_NOTIFY_DEVICEID4res(XDR *, CB_NOTIFY_DEVICEID4res*);
3667 extern  bool_t xdr_nfs_cb_opnum4(XDR *, nfs_cb_opnum4*);
3668 extern  bool_t xdr_nfs_cb_argop4(XDR *, nfs_cb_argop4*);
3669 extern  bool_t xdr_nfs_cb_resop4(XDR *, nfs_cb_resop4*);
3670 extern  bool_t xdr_CB_COMPOUND4args(XDR *, CB_COMPOUND4args*);
3671 extern  bool_t xdr_CB_COMPOUND4res(XDR *, CB_COMPOUND4res*);
3672 /*  nfsv4.1 end */
3673 
3674 /* nfsv4.2 */
3675 struct sec_label4 {
3676 	uint_t slai_len;
3677 	char  *slai_val;
3678 };
3679 
3680 typedef struct sec_label4 sec_label4;
3681 typedef sec_label4 fattr4_sec_label;
3682 
3683 extern  bool_t xdr_fattr4_sec_label(XDR *xdrs, fattr4_sec_label *objp);
3684 /* nfsv4.2 end */
3685 
3686 /* NFSv4.x xdr */
3687 extern bool_t xdr_nfs4x_argop4(XDR *xdrs, nfs_argop4 *objp);
3688 extern bool_t xdr_nfs4x_resop4(XDR *xdrs, nfs_resop4 *objp);
3689 
3690 /*
3691  * xdr for referrrals upcall
3692  */
3693 extern	bool_t xdr_knetconfig(XDR *, struct knetconfig *);
3694 extern	bool_t xdr_nfs_fsl_info(XDR *, struct nfs_fsl_info *);
3695 
3696 
3697 #ifdef __cplusplus
3698 }
3699 #endif
3700 
3701 #endif /* _NFS4_KPROT_H */
3702