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 */
25
26/*
27 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
28 * Use is subject to license terms.
29 */
30
31#ifndef _NFS4_KPROT_H
32#define	_NFS4_KPROT_H
33
34/*
35 * Kernel specific version.
36 * NFS Version 4 protocol definitions.  From nfs4_prot.x rev 1.119.
37 */
38
39#ifdef __cplusplus
40extern "C" {
41#endif
42
43#include <rpc/rpc.h>
44#ifdef _KERNEL
45#include <rpc/rpc_rdma.h>
46#endif
47#include <sys/stream.h>
48
49#define	NFS4_FHSIZE 128
50#define	NFS4_VERIFIER_SIZE 8
51#define	NFS4_OTHER_SIZE 12
52
53/*
54 * Reasonable upper bounds to catch badly behaving partners
55 */
56#define	NFS4_OPAQUE_LIMIT	1024
57#define	NFS4_COMPOUND_LIMIT	2048
58#define	NFS4_FS_LOCATIONS_LIMIT	65536
59#define	NFS4_ACL_LIMIT		65536
60#define	NFS4_SECINFO_LIMIT	65536
61#define	NFS4_FATTR4_LIMIT	1048576
62#define	NFS4_DATA_LIMIT		134217728
63
64enum nfs_ftype4 {
65	NF4REG = 1,
66	NF4DIR = 2,
67	NF4BLK = 3,
68	NF4CHR = 4,
69	NF4LNK = 5,
70	NF4SOCK = 6,
71	NF4FIFO = 7,
72	NF4ATTRDIR = 8,
73	NF4NAMEDATTR = 9
74};
75typedef enum nfs_ftype4 nfs_ftype4;
76
77enum nfsstat4 {
78	NFS4_OK = 0,
79	NFS4ERR_PERM = 1,
80	NFS4ERR_NOENT = 2,
81	NFS4ERR_IO = 5,
82	NFS4ERR_NXIO = 6,
83	NFS4ERR_ACCESS = 13,
84	NFS4ERR_EXIST = 17,
85	NFS4ERR_XDEV = 18,
86	NFS4ERR_NOTDIR = 20,
87	NFS4ERR_ISDIR = 21,
88	NFS4ERR_INVAL = 22,
89	NFS4ERR_FBIG = 27,
90	NFS4ERR_NOSPC = 28,
91	NFS4ERR_ROFS = 30,
92	NFS4ERR_MLINK = 31,
93	NFS4ERR_NAMETOOLONG = 63,
94	NFS4ERR_NOTEMPTY = 66,
95	NFS4ERR_DQUOT = 69,
96	NFS4ERR_STALE = 70,
97	NFS4ERR_BADHANDLE = 10001,
98	NFS4ERR_BAD_COOKIE = 10003,
99	NFS4ERR_NOTSUPP = 10004,
100	NFS4ERR_TOOSMALL = 10005,
101	NFS4ERR_SERVERFAULT = 10006,
102	NFS4ERR_BADTYPE = 10007,
103	NFS4ERR_DELAY = 10008,
104	NFS4ERR_SAME = 10009,
105	NFS4ERR_DENIED = 10010,
106	NFS4ERR_EXPIRED = 10011,
107	NFS4ERR_LOCKED = 10012,
108	NFS4ERR_GRACE = 10013,
109	NFS4ERR_FHEXPIRED = 10014,
110	NFS4ERR_SHARE_DENIED = 10015,
111	NFS4ERR_WRONGSEC = 10016,
112	NFS4ERR_CLID_INUSE = 10017,
113	NFS4ERR_RESOURCE = 10018,
114	NFS4ERR_MOVED = 10019,
115	NFS4ERR_NOFILEHANDLE = 10020,
116	NFS4ERR_MINOR_VERS_MISMATCH = 10021,
117	NFS4ERR_STALE_CLIENTID = 10022,
118	NFS4ERR_STALE_STATEID = 10023,
119	NFS4ERR_OLD_STATEID = 10024,
120	NFS4ERR_BAD_STATEID = 10025,
121	NFS4ERR_BAD_SEQID = 10026,
122	NFS4ERR_NOT_SAME = 10027,
123	NFS4ERR_LOCK_RANGE = 10028,
124	NFS4ERR_SYMLINK = 10029,
125	NFS4ERR_RESTOREFH = 10030,
126	NFS4ERR_LEASE_MOVED = 10031,
127	NFS4ERR_ATTRNOTSUPP = 10032,
128	NFS4ERR_NO_GRACE = 10033,
129	NFS4ERR_RECLAIM_BAD = 10034,
130	NFS4ERR_RECLAIM_CONFLICT = 10035,
131	NFS4ERR_BADXDR = 10036,
132	NFS4ERR_LOCKS_HELD = 10037,
133	NFS4ERR_OPENMODE = 10038,
134	NFS4ERR_BADOWNER = 10039,
135	NFS4ERR_BADCHAR = 10040,
136	NFS4ERR_BADNAME = 10041,
137	NFS4ERR_BAD_RANGE = 10042,
138	NFS4ERR_LOCK_NOTSUPP = 10043,
139	NFS4ERR_OP_ILLEGAL = 10044,
140	NFS4ERR_DEADLOCK = 10045,
141	NFS4ERR_FILE_OPEN = 10046,
142	NFS4ERR_ADMIN_REVOKED = 10047,
143	NFS4ERR_CB_PATH_DOWN = 10048
144};
145typedef enum nfsstat4 nfsstat4;
146
147/*
148 * A bitmap can only be 56 bits, treat it as a uint64_t for now
149 */
150typedef uint64_t bitmap4;
151
152typedef uint64_t offset4;
153
154typedef uint32_t count4;
155
156typedef uint64_t length4;
157
158typedef uint64_t clientid4;
159
160typedef uint32_t nfs_lease4;
161
162typedef uint32_t seqid4;
163
164typedef struct {
165	uint_t utf8string_len;
166	char *utf8string_val;
167} utf8string;
168
169typedef utf8string component4;
170
171typedef struct {
172	uint_t pathname4_len;
173	component4 *pathname4_val;
174} pathname4;
175
176typedef uint64_t nfs_lockid4;
177
178typedef uint64_t nfs_cookie4;
179
180typedef struct {
181	uint_t linktext4_len;
182	char *linktext4_val;
183} linktext4;
184
185typedef utf8string ascii_REQUIRED4;
186
187typedef struct {
188	uint_t sec_oid4_len;
189	char *sec_oid4_val;
190} sec_oid4;
191
192typedef uint32_t qop4;
193
194typedef uint32_t mode4;
195
196typedef uint64_t changeid4;
197
198typedef uint64_t verifier4;
199
200struct nfstime4 {
201	int64_t seconds;
202	uint32_t nseconds;
203};
204typedef struct nfstime4 nfstime4;
205
206enum time_how4 {
207	SET_TO_SERVER_TIME4 = 0,
208	SET_TO_CLIENT_TIME4 = 1
209};
210typedef enum time_how4 time_how4;
211
212struct settime4 {
213	time_how4 set_it;
214	nfstime4 time;
215};
216typedef struct settime4 settime4;
217
218typedef struct {
219	uint_t nfs_fh4_len;
220	char *nfs_fh4_val;
221} nfs_fh4;
222
223struct fsid4 {
224	uint64_t major;
225	uint64_t minor;
226};
227typedef struct fsid4 fsid4;
228
229struct fs_location4 {
230	uint_t server_len;
231	utf8string *server_val;
232	pathname4 rootpath;
233};
234typedef struct fs_location4 fs_location4;
235
236struct fs_locations4 {
237	pathname4 fs_root;
238	uint_t locations_len;
239	fs_location4 *locations_val;
240};
241typedef struct fs_locations4 fs_locations4;
242
243/*
244 * This structure is declared in nfs4.h
245 */
246struct nfs_fsl_info;
247
248/*
249 * ACL support
250 */
251
252#define	ACL4_SUPPORT_ALLOW_ACL 0x00000001
253#define	ACL4_SUPPORT_DENY_ACL 0x00000002
254#define	ACL4_SUPPORT_AUDIT_ACL 0x00000004
255#define	ACL4_SUPPORT_ALARM_ACL 0x00000008
256
257typedef uint32_t acetype4;
258#define	ACE4_ACCESS_ALLOWED_ACE_TYPE 0x00000000
259#define	ACE4_ACCESS_DENIED_ACE_TYPE 0x00000001
260#define	ACE4_SYSTEM_AUDIT_ACE_TYPE 0x00000002
261#define	ACE4_SYSTEM_ALARM_ACE_TYPE 0x00000003
262
263typedef uint32_t aceflag4;
264#define	ACE4_FILE_INHERIT_ACE 0x00000001
265#define	ACE4_DIRECTORY_INHERIT_ACE 0x00000002
266#define	ACE4_NO_PROPAGATE_INHERIT_ACE 0x00000004
267#define	ACE4_INHERIT_ONLY_ACE 0x00000008
268#define	ACE4_SUCCESSFUL_ACCESS_ACE_FLAG 0x00000010
269#define	ACE4_FAILED_ACCESS_ACE_FLAG 0x00000020
270#define	ACE4_IDENTIFIER_GROUP 0x00000040
271/*
272 * This defines all valid flag bits, as defined by RFC 7530.  If
273 * any additional flag bits are deemed part of the NFSv4 spec,
274 * you must also add them to the definition below.
275 */
276#define	ACE4_VALID_FLAG_BITS (\
277    ACE4_FILE_INHERIT_ACE | \
278    ACE4_DIRECTORY_INHERIT_ACE | \
279    ACE4_NO_PROPAGATE_INHERIT_ACE | \
280    ACE4_INHERIT_ONLY_ACE | \
281    ACE4_SUCCESSFUL_ACCESS_ACE_FLAG | \
282    ACE4_FAILED_ACCESS_ACE_FLAG | \
283    ACE4_IDENTIFIER_GROUP)
284
285typedef uint32_t acemask4;
286#define	ACE4_READ_DATA 0x00000001
287#define	ACE4_LIST_DIRECTORY 0x00000001
288#define	ACE4_WRITE_DATA 0x00000002
289#define	ACE4_ADD_FILE 0x00000002
290#define	ACE4_APPEND_DATA 0x00000004
291#define	ACE4_ADD_SUBDIRECTORY 0x00000004
292#define	ACE4_READ_NAMED_ATTRS 0x00000008
293#define	ACE4_WRITE_NAMED_ATTRS 0x00000010
294#define	ACE4_EXECUTE 0x00000020
295#define	ACE4_DELETE_CHILD 0x00000040
296#define	ACE4_READ_ATTRIBUTES 0x00000080
297#define	ACE4_WRITE_ATTRIBUTES 0x00000100
298#define	ACE4_DELETE 0x00010000
299#define	ACE4_READ_ACL 0x00020000
300#define	ACE4_WRITE_ACL 0x00040000
301#define	ACE4_WRITE_OWNER 0x00080000
302#define	ACE4_SYNCHRONIZE 0x00100000
303#define	ACE4_GENERIC_READ 0x00120081
304#define	ACE4_GENERIC_WRITE 0x00160106
305#define	ACE4_GENERIC_EXECUTE 0x001200A0
306/*
307 * This defines all valid access mask bits, as defined by RFC 7530.  If
308 * any additional access mask bits are deemed part of the NFSv4 spec,
309 * you must also add them to the definition below.
310 */
311#define	ACE4_VALID_MASK_BITS (\
312    ACE4_READ_DATA | \
313    ACE4_LIST_DIRECTORY | \
314    ACE4_WRITE_DATA | \
315    ACE4_ADD_FILE | \
316    ACE4_APPEND_DATA | \
317    ACE4_ADD_SUBDIRECTORY | \
318    ACE4_READ_NAMED_ATTRS | \
319    ACE4_WRITE_NAMED_ATTRS | \
320    ACE4_EXECUTE | \
321    ACE4_DELETE_CHILD | \
322    ACE4_READ_ATTRIBUTES | \
323    ACE4_WRITE_ATTRIBUTES | \
324    ACE4_DELETE | \
325    ACE4_READ_ACL | \
326    ACE4_WRITE_ACL | \
327    ACE4_WRITE_OWNER | \
328    ACE4_SYNCHRONIZE)
329
330/* Used to signify an undefined value for an acemask4 */
331#define	ACE4_MASK_UNDEFINED 0x80000000
332
333#define	ACE4_WHO_OWNER		"OWNER@"
334#define	ACE4_WHO_GROUP		"GROUP@"
335#define	ACE4_WHO_EVERYONE	"EVERYONE@"
336
337struct nfsace4 {
338	acetype4 type;
339	aceflag4 flag;
340	acemask4 access_mask;
341	utf8string who;
342};
343typedef struct nfsace4 nfsace4;
344#define	MODE4_SUID 0x800
345#define	MODE4_SGID 0x400
346#define	MODE4_SVTX 0x200
347#define	MODE4_RUSR 0x100
348#define	MODE4_WUSR 0x080
349#define	MODE4_XUSR 0x040
350#define	MODE4_RGRP 0x020
351#define	MODE4_WGRP 0x010
352#define	MODE4_XGRP 0x008
353#define	MODE4_ROTH 0x004
354#define	MODE4_WOTH 0x002
355#define	MODE4_XOTH 0x001
356
357/*
358 * ACL conversion helpers
359 */
360
361typedef enum {
362	ace4_unused,
363	ace4_user_obj,
364	ace4_user,
365	ace4_group, /* includes GROUP and GROUP_OBJ */
366	ace4_other_obj
367} ace4_to_aent_state_t;
368
369typedef struct ace4vals {
370	utf8string *key; /* NB: not allocated here; points to existing utf8 */
371	avl_node_t avl;
372	acemask4 mask;
373	acemask4 allowed;
374	acemask4 denied;
375	int aent_type;
376} ace4vals_t;
377
378typedef struct ace4_list {
379	ace4vals_t user_obj;
380	avl_tree_t user;
381	int numusers;
382	ace4vals_t group_obj;
383	avl_tree_t group;
384	int numgroups;
385	ace4vals_t other_obj;
386	acemask4 acl_mask;
387	int hasmask;
388	int dfacl_flag;
389	ace4_to_aent_state_t state;
390	int seen; /* bitmask of all aclent_t a_type values seen */
391} ace4_list_t;
392
393struct specdata4 {
394	uint32_t specdata1;
395	uint32_t specdata2;
396};
397typedef struct specdata4 specdata4;
398#define	FH4_PERSISTENT 0x00000000
399#define	FH4_NOEXPIRE_WITH_OPEN 0x00000001
400#define	FH4_VOLATILE_ANY 0x00000002
401#define	FH4_VOL_MIGRATION 0x00000004
402#define	FH4_VOL_RENAME 0x00000008
403
404typedef bitmap4 fattr4_supported_attrs;
405
406typedef nfs_ftype4 fattr4_type;
407
408typedef uint32_t fattr4_fh_expire_type;
409
410typedef changeid4 fattr4_change;
411
412typedef uint64_t fattr4_size;
413
414typedef bool_t fattr4_link_support;
415
416typedef bool_t fattr4_symlink_support;
417
418typedef bool_t fattr4_named_attr;
419
420typedef fsid4 fattr4_fsid;
421
422typedef bool_t fattr4_unique_handles;
423
424typedef nfs_lease4 fattr4_lease_time;
425
426typedef nfsstat4 fattr4_rdattr_error;
427
428typedef struct {
429	uint_t fattr4_acl_len;
430	nfsace4 *fattr4_acl_val;
431} fattr4_acl;
432
433typedef uint32_t fattr4_aclsupport;
434
435typedef bool_t fattr4_archive;
436
437typedef bool_t fattr4_cansettime;
438
439typedef bool_t fattr4_case_insensitive;
440
441typedef bool_t fattr4_case_preserving;
442
443typedef bool_t fattr4_chown_restricted;
444
445typedef uint64_t fattr4_fileid;
446
447typedef uint64_t fattr4_files_avail;
448
449typedef nfs_fh4 fattr4_filehandle;
450
451typedef uint64_t fattr4_files_free;
452
453typedef uint64_t fattr4_files_total;
454
455typedef fs_locations4 fattr4_fs_locations;
456
457typedef bool_t fattr4_hidden;
458
459typedef bool_t fattr4_homogeneous;
460
461typedef uint64_t fattr4_maxfilesize;
462
463typedef uint32_t fattr4_maxlink;
464
465typedef uint32_t fattr4_maxname;
466
467typedef uint64_t fattr4_maxread;
468
469typedef uint64_t fattr4_maxwrite;
470
471typedef ascii_REQUIRED4 fattr4_mimetype;
472
473typedef mode4 fattr4_mode;
474
475typedef uint64_t fattr4_mounted_on_fileid;
476
477typedef bool_t fattr4_no_trunc;
478
479typedef uint32_t fattr4_numlinks;
480
481typedef utf8string fattr4_owner;
482
483typedef utf8string fattr4_owner_group;
484
485typedef uint64_t fattr4_quota_avail_hard;
486
487typedef uint64_t fattr4_quota_avail_soft;
488
489typedef uint64_t fattr4_quota_used;
490
491typedef specdata4 fattr4_rawdev;
492
493typedef uint64_t fattr4_space_avail;
494
495typedef uint64_t fattr4_space_free;
496
497typedef uint64_t fattr4_space_total;
498
499typedef uint64_t fattr4_space_used;
500
501typedef bool_t fattr4_system;
502
503typedef nfstime4 fattr4_time_access;
504
505typedef settime4 fattr4_time_access_set;
506
507typedef nfstime4 fattr4_time_backup;
508
509typedef nfstime4 fattr4_time_create;
510
511typedef nfstime4 fattr4_time_delta;
512
513typedef nfstime4 fattr4_time_metadata;
514
515typedef nfstime4 fattr4_time_modify;
516
517typedef settime4 fattr4_time_modify_set;
518#define	FATTR4_SUPPORTED_ATTRS 0
519#define	FATTR4_TYPE 1
520#define	FATTR4_FH_EXPIRE_TYPE 2
521#define	FATTR4_CHANGE 3
522#define	FATTR4_SIZE 4
523#define	FATTR4_LINK_SUPPORT 5
524#define	FATTR4_SYMLINK_SUPPORT 6
525#define	FATTR4_NAMED_ATTR 7
526#define	FATTR4_FSID 8
527#define	FATTR4_UNIQUE_HANDLES 9
528#define	FATTR4_LEASE_TIME 10
529#define	FATTR4_RDATTR_ERROR 11
530#define	FATTR4_FILEHANDLE 19
531#define	FATTR4_ACL 12
532#define	FATTR4_ACLSUPPORT 13
533#define	FATTR4_ARCHIVE 14
534#define	FATTR4_CANSETTIME 15
535#define	FATTR4_CASE_INSENSITIVE 16
536#define	FATTR4_CASE_PRESERVING 17
537#define	FATTR4_CHOWN_RESTRICTED 18
538#define	FATTR4_FILEID 20
539#define	FATTR4_FILES_AVAIL 21
540#define	FATTR4_FILES_FREE 22
541#define	FATTR4_FILES_TOTAL 23
542#define	FATTR4_FS_LOCATIONS 24
543#define	FATTR4_HIDDEN 25
544#define	FATTR4_HOMOGENEOUS 26
545#define	FATTR4_MAXFILESIZE 27
546#define	FATTR4_MAXLINK 28
547#define	FATTR4_MAXNAME 29
548#define	FATTR4_MAXREAD 30
549#define	FATTR4_MAXWRITE 31
550#define	FATTR4_MIMETYPE 32
551#define	FATTR4_MODE 33
552#define	FATTR4_NO_TRUNC 34
553#define	FATTR4_NUMLINKS 35
554#define	FATTR4_OWNER 36
555#define	FATTR4_OWNER_GROUP 37
556#define	FATTR4_QUOTA_AVAIL_HARD 38
557#define	FATTR4_QUOTA_AVAIL_SOFT 39
558#define	FATTR4_QUOTA_USED 40
559#define	FATTR4_RAWDEV 41
560#define	FATTR4_SPACE_AVAIL 42
561#define	FATTR4_SPACE_FREE 43
562#define	FATTR4_SPACE_TOTAL 44
563#define	FATTR4_SPACE_USED 45
564#define	FATTR4_SYSTEM 46
565#define	FATTR4_TIME_ACCESS 47
566#define	FATTR4_TIME_ACCESS_SET 48
567#define	FATTR4_TIME_BACKUP 49
568#define	FATTR4_TIME_CREATE 50
569#define	FATTR4_TIME_DELTA 51
570#define	FATTR4_TIME_METADATA 52
571#define	FATTR4_TIME_MODIFY 53
572#define	FATTR4_TIME_MODIFY_SET 54
573#define	FATTR4_MOUNTED_ON_FILEID 55
574
575struct fattr4 {
576	bitmap4 attrmask;
577	char *attrlist4;
578	uint_t attrlist4_len;
579};
580typedef struct fattr4 fattr4;
581
582struct change_info4 {
583	bool_t atomic;
584	changeid4 before;
585	changeid4 after;
586};
587typedef struct change_info4 change_info4;
588
589struct clientaddr4 {
590	char *r_netid;
591	char *r_addr;
592};
593typedef struct clientaddr4 clientaddr4;
594
595struct cb_client4 {
596	uint_t cb_program;
597	clientaddr4 cb_location;
598};
599typedef struct cb_client4 cb_client4;
600
601struct stateid4 {
602	uint32_t seqid;
603	char other[NFS4_OTHER_SIZE];
604};
605typedef struct stateid4 stateid4;
606
607struct nfs_client_id4 {
608	verifier4 verifier;
609	uint_t id_len;
610	char *id_val;
611	struct sockaddr *cl_addr;
612};
613typedef struct nfs_client_id4 nfs_client_id4;
614
615struct open_owner4 {
616	clientid4 clientid;
617	uint_t owner_len;
618	char *owner_val;
619};
620typedef struct open_owner4 open_owner4;
621
622struct lock_owner4 {
623	clientid4 clientid;
624	uint_t owner_len;
625	char *owner_val;
626};
627typedef struct lock_owner4 lock_owner4;
628
629enum nfs_lock_type4 {
630	READ_LT = 1,
631	WRITE_LT = 2,
632	READW_LT = 3,
633	WRITEW_LT = 4
634};
635typedef enum nfs_lock_type4 nfs_lock_type4;
636#define	ACCESS4_READ 0x00000001
637#define	ACCESS4_LOOKUP 0x00000002
638#define	ACCESS4_MODIFY 0x00000004
639#define	ACCESS4_EXTEND 0x00000008
640#define	ACCESS4_DELETE 0x00000010
641#define	ACCESS4_EXECUTE 0x00000020
642
643struct ACCESS4args {
644	uint32_t access;
645};
646typedef struct ACCESS4args ACCESS4args;
647
648struct ACCESS4res {
649	nfsstat4 status;
650	uint32_t supported;
651	uint32_t access;
652};
653typedef struct ACCESS4res ACCESS4res;
654
655struct CLOSE4args {
656	seqid4 seqid;
657	stateid4 open_stateid;
658};
659typedef struct CLOSE4args CLOSE4args;
660
661struct CLOSE4res {
662	nfsstat4 status;
663	stateid4 open_stateid;
664};
665typedef struct CLOSE4res CLOSE4res;
666
667struct COMMIT4args {
668	offset4 offset;
669	count4 count;
670};
671typedef struct COMMIT4args COMMIT4args;
672
673struct COMMIT4res {
674	nfsstat4 status;
675	verifier4 writeverf;
676};
677typedef struct COMMIT4res COMMIT4res;
678
679struct CREATE4args {
680	nfs_ftype4 type;
681	union {
682		linktext4 linkdata;
683		specdata4 devdata;
684	} ftype4_u;
685	component4 objname;
686	fattr4 createattrs;
687};
688typedef struct CREATE4args CREATE4args;
689
690struct CREATE4cargs {
691	nfs_ftype4 type;
692	union {
693		char *clinkdata;
694		specdata4 devdata;
695	} ftype4_u;
696	char *cname;
697	fattr4 createattrs;
698};
699typedef struct CREATE4cargs CREATE4cargs;
700
701struct CREATE4res {
702	nfsstat4 status;
703	change_info4 cinfo;
704	bitmap4 attrset;
705};
706typedef struct CREATE4res CREATE4res;
707
708struct DELEGPURGE4args {
709	clientid4 clientid;
710};
711typedef struct DELEGPURGE4args DELEGPURGE4args;
712
713struct DELEGPURGE4res {
714	nfsstat4 status;
715};
716typedef struct DELEGPURGE4res DELEGPURGE4res;
717
718struct DELEGRETURN4args {
719	stateid4 deleg_stateid;
720};
721typedef struct DELEGRETURN4args DELEGRETURN4args;
722
723struct DELEGRETURN4res {
724	nfsstat4 status;
725};
726typedef struct DELEGRETURN4res DELEGRETURN4res;
727
728struct mntinfo4;
729
730struct GETATTR4args {
731	bitmap4 attr_request;
732	struct mntinfo4 *mi;
733};
734typedef struct GETATTR4args GETATTR4args;
735
736struct nfs4_ga_ext_res;
737
738struct nfs4_ga_res {
739	vattr_t				n4g_va;
740	unsigned			n4g_change_valid:1;
741	unsigned			n4g_mon_fid_valid:1;
742	unsigned			n4g_fsid_valid:1;
743	uint_t				n4g_attrerr;
744	uint_t				n4g_attrwhy;
745	bitmap4				n4g_resbmap;
746	fattr4_change			n4g_change;
747	fattr4_fsid			n4g_fsid;
748	fattr4_mounted_on_fileid	n4g_mon_fid;
749	struct nfs4_ga_ext_res		*n4g_ext_res;
750	vsecattr_t			n4g_vsa;
751};
752typedef struct nfs4_ga_res nfs4_ga_res_t;
753
754struct GETATTR4res {
755	nfsstat4 status;
756	fattr4 obj_attributes;
757	nfsstat4	ga_status;
758	struct nfs4_ga_res ga_res;
759};
760typedef struct GETATTR4res GETATTR4res;
761
762struct GETFH4res {
763	nfsstat4 status;
764	nfs_fh4 object;
765};
766typedef struct GETFH4res GETFH4res;
767
768struct LINK4args {
769	component4 newname;
770};
771typedef struct LINK4args LINK4args;
772
773struct LINK4cargs {
774	char *cnewname;
775};
776typedef struct LINK4cargs LINK4cargs;
777
778struct LINK4res {
779	nfsstat4 status;
780	change_info4 cinfo;
781};
782typedef struct LINK4res LINK4res;
783
784struct open_to_lock_owner4 {
785	seqid4 open_seqid;
786	stateid4 open_stateid;
787	seqid4 lock_seqid;
788	lock_owner4 lock_owner;
789};
790typedef struct open_to_lock_owner4 open_to_lock_owner4;
791
792struct exist_lock_owner4 {
793	stateid4 lock_stateid;
794	seqid4 lock_seqid;
795};
796typedef struct exist_lock_owner4 exist_lock_owner4;
797
798struct locker4 {
799	bool_t new_lock_owner;
800	union {
801		open_to_lock_owner4 open_owner;
802		exist_lock_owner4 lock_owner;
803	} locker4_u;
804};
805typedef struct locker4 locker4;
806
807struct LOCK4args {
808	nfs_lock_type4 locktype;
809	bool_t reclaim;
810	offset4 offset;
811	length4 length;
812	locker4 locker;
813};
814typedef struct LOCK4args LOCK4args;
815
816struct LOCK4denied {
817	offset4 offset;
818	length4 length;
819	nfs_lock_type4 locktype;
820	lock_owner4 owner;
821};
822typedef struct LOCK4denied LOCK4denied;
823
824struct LOCK4res {
825	nfsstat4 status;
826	union {
827		stateid4 lock_stateid;
828		LOCK4denied denied;
829	} LOCK4res_u;
830};
831typedef struct LOCK4res LOCK4res;
832
833struct LOCKT4args {
834	nfs_lock_type4 locktype;
835	offset4 offset;
836	length4 length;
837	lock_owner4 owner;
838};
839typedef struct LOCKT4args LOCKT4args;
840
841struct LOCKT4res {
842	nfsstat4 status;
843	LOCK4denied denied;
844};
845typedef struct LOCKT4res LOCKT4res;
846
847struct LOCKU4args {
848	nfs_lock_type4 locktype;
849	seqid4 seqid;
850	stateid4 lock_stateid;
851	offset4 offset;
852	length4 length;
853};
854typedef struct LOCKU4args LOCKU4args;
855
856struct LOCKU4res {
857	nfsstat4 status;
858	stateid4 lock_stateid;
859};
860typedef struct LOCKU4res LOCKU4res;
861
862struct LOOKUP4args {
863	component4 objname;
864};
865typedef struct LOOKUP4args LOOKUP4args;
866
867struct LOOKUP4cargs {
868	char *cname;
869};
870typedef struct LOOKUP4cargs LOOKUP4cargs;
871
872struct LOOKUP4res {
873	nfsstat4 status;
874};
875typedef struct LOOKUP4res LOOKUP4res;
876
877struct LOOKUPP4res {
878	nfsstat4 status;
879};
880typedef struct LOOKUPP4res LOOKUPP4res;
881
882struct NVERIFY4args {
883	fattr4 obj_attributes;
884};
885typedef struct NVERIFY4args NVERIFY4args;
886
887struct NVERIFY4res {
888	nfsstat4 status;
889};
890typedef struct NVERIFY4res NVERIFY4res;
891
892enum createmode4 {
893	UNCHECKED4 = 0,
894	GUARDED4 = 1,
895	EXCLUSIVE4 = 2
896};
897typedef enum createmode4 createmode4;
898
899enum opentype4 {
900	OPEN4_NOCREATE = 0,
901	OPEN4_CREATE = 1
902};
903typedef enum opentype4 opentype4;
904
905enum limit_by4 {
906	NFS_LIMIT_SIZE = 1,
907	NFS_LIMIT_BLOCKS = 2
908};
909typedef enum limit_by4 limit_by4;
910
911struct nfs_modified_limit4 {
912	uint32_t num_blocks;
913	uint32_t bytes_per_block;
914};
915typedef struct nfs_modified_limit4 nfs_modified_limit4;
916
917struct nfs_space_limit4 {
918	limit_by4 limitby;
919	union {
920		uint64_t filesize;
921		nfs_modified_limit4 mod_blocks;
922	} nfs_space_limit4_u;
923};
924typedef struct nfs_space_limit4 nfs_space_limit4;
925#define	OPEN4_SHARE_ACCESS_READ 0x00000001
926#define	OPEN4_SHARE_ACCESS_WRITE 0x00000002
927#define	OPEN4_SHARE_ACCESS_BOTH 0x00000003
928#define	OPEN4_SHARE_DENY_NONE 0x00000000
929#define	OPEN4_SHARE_DENY_READ 0x00000001
930#define	OPEN4_SHARE_DENY_WRITE 0x00000002
931#define	OPEN4_SHARE_DENY_BOTH 0x00000003
932
933enum open_delegation_type4 {
934	OPEN_DELEGATE_NONE = 0,
935	OPEN_DELEGATE_READ = 1,
936	OPEN_DELEGATE_WRITE = 2
937};
938typedef enum open_delegation_type4 open_delegation_type4;
939
940enum open_claim_type4 {
941	CLAIM_NULL = 0,
942	CLAIM_PREVIOUS = 1,
943	CLAIM_DELEGATE_CUR = 2,
944	CLAIM_DELEGATE_PREV = 3
945};
946typedef enum open_claim_type4 open_claim_type4;
947
948struct open_claim_delegate_cur4 {
949	stateid4 delegate_stateid;
950	component4 file;
951};
952typedef struct open_claim_delegate_cur4 open_claim_delegate_cur4;
953
954struct copen_claim_delegate_cur4 {
955	stateid4 delegate_stateid;
956	char *cfile;
957};
958typedef struct copen_claim_delegate_cur4 copen_claim_delegate_cur4;
959
960struct OPEN4args {
961	seqid4 seqid;
962	uint32_t share_access;
963	uint32_t share_deny;
964	open_owner4 owner;
965	opentype4 opentype;
966	createmode4 mode;
967	union {
968		fattr4 createattrs;
969		verifier4 createverf;
970	} createhow4_u;
971	open_claim_type4 claim;
972	union {
973		component4 file;
974		open_delegation_type4 delegate_type;
975		open_claim_delegate_cur4 delegate_cur_info;
976		component4 file_delegate_prev;
977	} open_claim4_u;
978};
979typedef struct OPEN4args OPEN4args;
980
981struct OPEN4cargs {
982	seqid4 seqid;
983	uint32_t share_access;
984	uint32_t share_deny;
985	open_owner4 owner;
986	opentype4 opentype;
987	createmode4 mode;
988	union {
989		fattr4 createattrs;
990		verifier4 createverf;
991	} createhow4_u;
992	open_claim_type4 claim;
993	union {
994		char *cfile;
995		open_delegation_type4 delegate_type;
996		copen_claim_delegate_cur4 delegate_cur_info;
997		char *cfile_delegate_prev;
998	} open_claim4_u;
999};
1000typedef struct OPEN4cargs OPEN4cargs;
1001
1002struct open_read_delegation4 {
1003	stateid4 stateid;
1004	bool_t recall;
1005	nfsace4 permissions;
1006};
1007typedef struct open_read_delegation4 open_read_delegation4;
1008
1009struct open_write_delegation4 {
1010	stateid4 stateid;
1011	bool_t recall;
1012	nfs_space_limit4 space_limit;
1013	nfsace4 permissions;
1014};
1015typedef struct open_write_delegation4 open_write_delegation4;
1016
1017struct open_delegation4 {
1018	open_delegation_type4 delegation_type;
1019	union {
1020		open_read_delegation4 read;
1021		open_write_delegation4 write;
1022	} open_delegation4_u;
1023};
1024typedef struct open_delegation4 open_delegation4;
1025#define	OPEN4_RESULT_CONFIRM 0x00000002
1026#define	OPEN4_RESULT_LOCKTYPE_POSIX 0x00000004
1027
1028struct OPEN4res {
1029	nfsstat4 status;
1030	stateid4 stateid;
1031	change_info4 cinfo;
1032	uint32_t rflags;
1033	bitmap4 attrset;
1034	open_delegation4 delegation;
1035};
1036typedef struct OPEN4res OPEN4res;
1037
1038struct OPENATTR4args {
1039	bool_t createdir;
1040};
1041typedef struct OPENATTR4args OPENATTR4args;
1042
1043struct OPENATTR4res {
1044	nfsstat4 status;
1045};
1046typedef struct OPENATTR4res OPENATTR4res;
1047
1048struct OPEN_CONFIRM4args {
1049	stateid4 open_stateid;
1050	seqid4 seqid;
1051};
1052typedef struct OPEN_CONFIRM4args OPEN_CONFIRM4args;
1053
1054struct OPEN_CONFIRM4res {
1055	nfsstat4 status;
1056	stateid4 open_stateid;
1057};
1058typedef struct OPEN_CONFIRM4res OPEN_CONFIRM4res;
1059
1060struct OPEN_DOWNGRADE4args {
1061	stateid4 open_stateid;
1062	seqid4 seqid;
1063	uint32_t share_access;
1064	uint32_t share_deny;
1065};
1066typedef struct OPEN_DOWNGRADE4args OPEN_DOWNGRADE4args;
1067
1068struct OPEN_DOWNGRADE4res {
1069	nfsstat4 status;
1070	stateid4 open_stateid;
1071};
1072typedef struct OPEN_DOWNGRADE4res OPEN_DOWNGRADE4res;
1073
1074struct PUTFH4args {
1075	nfs_fh4 object;
1076};
1077typedef struct PUTFH4args PUTFH4args;
1078
1079/*
1080 * Client only side PUTFH arguments
1081 * This is really a nfs4_sharedfh_t * but the forward declaration
1082 * is problematic;
1083 */
1084struct PUTFH4cargs {
1085	void *sfh;
1086};
1087typedef struct PUTFH4cargs PUTFH4cargs;
1088
1089struct PUTFH4res {
1090	nfsstat4 status;
1091};
1092typedef struct PUTFH4res PUTFH4res;
1093
1094struct PUTPUBFH4res {
1095	nfsstat4 status;
1096};
1097typedef struct PUTPUBFH4res PUTPUBFH4res;
1098
1099struct PUTROOTFH4res {
1100	nfsstat4 status;
1101};
1102typedef struct PUTROOTFH4res PUTROOTFH4res;
1103
1104struct READ4args {
1105	stateid4 stateid;
1106	offset4 offset;
1107	count4 count;
1108	/* The following are used for the XDR decode path */
1109	char *res_data_val_alt;
1110	mblk_t *res_mblk;
1111	struct uio *res_uiop;
1112	uint_t res_maxsize;
1113#ifdef _KERNEL
1114	struct clist *wlist;
1115	CONN *conn;
1116#endif
1117};
1118typedef struct READ4args READ4args;
1119
1120struct READ4res {
1121	nfsstat4 status;
1122	bool_t eof;
1123	uint_t data_len;
1124	char *data_val;
1125	mblk_t *mblk;
1126#ifdef _KERNEL
1127	struct clist *wlist;
1128	uint_t wlist_len;
1129#endif
1130};
1131typedef struct READ4res READ4res;
1132
1133struct rddir4_cache;
1134
1135struct READDIR4args {
1136	nfs_cookie4 cookie;
1137	verifier4 cookieverf;
1138	count4 dircount;
1139	count4 maxcount;
1140	bitmap4 attr_request;
1141	vnode_t *dvp;
1142	struct mntinfo4 *mi;
1143	cred_t *cr;
1144	struct rddir4_cache *rdc;
1145	hrtime_t t;
1146};
1147typedef struct READDIR4args READDIR4args;
1148
1149struct READDIR4res_clnt {
1150	nfsstat4 status;
1151	verifier4 cookieverf;
1152	bool_t eof;
1153	struct dirent64 *dotp, *dotdotp;
1154	struct rddir4_cache *rdc;
1155};
1156typedef struct READDIR4res_clnt READDIR4res_clnt;
1157
1158struct READDIR4res {
1159	nfsstat4 status;
1160	verifier4 cookieverf;
1161	mblk_t *mblk;
1162	uint_t data_len;
1163};
1164typedef struct READDIR4res READDIR4res;
1165
1166struct READLINK4res {
1167	nfsstat4 status;
1168	linktext4 link;
1169};
1170typedef struct READLINK4res READLINK4res;
1171
1172struct REMOVE4args {
1173	component4 target;
1174};
1175typedef struct REMOVE4args REMOVE4args;
1176
1177struct REMOVE4cargs {
1178	char *ctarget;
1179};
1180typedef struct REMOVE4cargs REMOVE4cargs;
1181
1182struct REMOVE4res {
1183	nfsstat4 status;
1184	change_info4 cinfo;
1185};
1186typedef struct REMOVE4res REMOVE4res;
1187
1188struct RENAME4args {
1189	component4 oldname;
1190	component4 newname;
1191};
1192typedef struct RENAME4args RENAME4args;
1193
1194struct RENAME4cargs {
1195	char *coldname;
1196	char *cnewname;
1197};
1198typedef struct RENAME4cargs RENAME4cargs;
1199
1200struct RENAME4res {
1201	nfsstat4 status;
1202	change_info4 source_cinfo;
1203	change_info4 target_cinfo;
1204};
1205typedef struct RENAME4res RENAME4res;
1206
1207struct RENEW4args {
1208	clientid4 clientid;
1209};
1210typedef struct RENEW4args RENEW4args;
1211
1212struct RENEW4res {
1213	nfsstat4 status;
1214};
1215typedef struct RENEW4res RENEW4res;
1216
1217struct RESTOREFH4res {
1218	nfsstat4 status;
1219};
1220typedef struct RESTOREFH4res RESTOREFH4res;
1221
1222struct SAVEFH4res {
1223	nfsstat4 status;
1224};
1225typedef struct SAVEFH4res SAVEFH4res;
1226
1227struct SECINFO4args {
1228	component4 name;
1229};
1230typedef struct SECINFO4args SECINFO4args;
1231
1232struct SECINFO4cargs {
1233	char *cname;
1234};
1235typedef struct SECINFO4cargs SECINFO4cargs;
1236
1237enum rpc_gss_svc_t {
1238	RPC_GSS_SVC_NONE = 1,
1239	RPC_GSS_SVC_INTEGRITY = 2,
1240	RPC_GSS_SVC_PRIVACY = 3
1241};
1242typedef enum rpc_gss_svc_t rpc_gss_svc_t;
1243
1244struct rpcsec_gss_info {
1245	sec_oid4 oid;
1246	qop4 qop;
1247	rpc_gss_svc_t service;
1248};
1249typedef struct rpcsec_gss_info rpcsec_gss_info;
1250
1251struct secinfo4 {
1252	uint32_t flavor;
1253	rpcsec_gss_info flavor_info;
1254};
1255typedef struct secinfo4 secinfo4;
1256
1257struct SECINFO4res {
1258	nfsstat4 status;
1259	uint_t SECINFO4resok_len;
1260	secinfo4 *SECINFO4resok_val;
1261};
1262typedef struct SECINFO4res SECINFO4res;
1263
1264struct SETATTR4args {
1265	stateid4 stateid;
1266	fattr4 obj_attributes;
1267};
1268typedef struct SETATTR4args SETATTR4args;
1269
1270struct SETATTR4res {
1271	nfsstat4 status;
1272	bitmap4 attrsset;
1273};
1274typedef struct SETATTR4res SETATTR4res;
1275
1276struct SETCLIENTID4args {
1277	nfs_client_id4 client;
1278	cb_client4 callback;
1279	uint32_t callback_ident;
1280};
1281typedef struct SETCLIENTID4args SETCLIENTID4args;
1282
1283struct SETCLIENTID4resok {
1284	clientid4 clientid;
1285	verifier4 setclientid_confirm;
1286};
1287typedef struct SETCLIENTID4resok SETCLIENTID4resok;
1288
1289struct SETCLIENTID4res {
1290	nfsstat4 status;
1291	union {
1292		SETCLIENTID4resok resok4;
1293		clientaddr4 client_using;
1294	} SETCLIENTID4res_u;
1295};
1296typedef struct SETCLIENTID4res SETCLIENTID4res;
1297
1298struct SETCLIENTID_CONFIRM4args {
1299	clientid4 clientid;
1300	verifier4 setclientid_confirm;
1301};
1302typedef struct SETCLIENTID_CONFIRM4args SETCLIENTID_CONFIRM4args;
1303
1304struct SETCLIENTID_CONFIRM4res {
1305	nfsstat4 status;
1306};
1307typedef struct SETCLIENTID_CONFIRM4res SETCLIENTID_CONFIRM4res;
1308
1309struct VERIFY4args {
1310	fattr4 obj_attributes;
1311};
1312typedef struct VERIFY4args VERIFY4args;
1313
1314struct VERIFY4res {
1315	nfsstat4 status;
1316};
1317typedef struct VERIFY4res VERIFY4res;
1318
1319enum stable_how4 {
1320	UNSTABLE4 = 0,
1321	DATA_SYNC4 = 1,
1322	FILE_SYNC4 = 2
1323};
1324typedef enum stable_how4 stable_how4;
1325
1326/*
1327 * mblk doesn't go over the wire.  If non-NULL, it points to an mblk chain
1328 * for the write data.
1329 */
1330
1331struct WRITE4args {
1332	stateid4 stateid;
1333	offset4 offset;
1334	stable_how4 stable;
1335	uint_t data_len;
1336	char *data_val;
1337	mblk_t *mblk;
1338#ifdef _KERNEL
1339	struct clist *rlist;
1340	CONN *conn;
1341#endif
1342};
1343typedef struct WRITE4args WRITE4args;
1344
1345struct WRITE4res {
1346	nfsstat4 status;
1347	count4 count;
1348	stable_how4 committed;
1349	verifier4 writeverf;
1350};
1351typedef struct WRITE4res WRITE4res;
1352
1353struct RELEASE_LOCKOWNER4args {
1354	lock_owner4 lock_owner;
1355};
1356typedef struct RELEASE_LOCKOWNER4args RELEASE_LOCKOWNER4args;
1357
1358struct RELEASE_LOCKOWNER4res {
1359	nfsstat4 status;
1360};
1361typedef struct RELEASE_LOCKOWNER4res RELEASE_LOCKOWNER4res;
1362
1363struct ILLEGAL4res {
1364	nfsstat4 status;
1365};
1366typedef struct ILLEGAL4res ILLEGAL4res;
1367
1368enum nfs_opnum4 {
1369	OP_ACCESS = 3,
1370	OP_CLOSE = 4,
1371	OP_COMMIT = 5,
1372	OP_CREATE = 6,
1373	OP_DELEGPURGE = 7,
1374	OP_DELEGRETURN = 8,
1375	OP_GETATTR = 9,
1376	OP_GETFH = 10,
1377	OP_LINK = 11,
1378	OP_LOCK = 12,
1379	OP_LOCKT = 13,
1380	OP_LOCKU = 14,
1381	OP_LOOKUP = 15,
1382	OP_LOOKUPP = 16,
1383	OP_NVERIFY = 17,
1384	OP_OPEN = 18,
1385	OP_OPENATTR = 19,
1386	OP_OPEN_CONFIRM = 20,
1387	OP_OPEN_DOWNGRADE = 21,
1388	OP_PUTFH = 22,
1389	OP_PUTPUBFH = 23,
1390	OP_PUTROOTFH = 24,
1391	OP_READ = 25,
1392	OP_READDIR = 26,
1393	OP_READLINK = 27,
1394	OP_REMOVE = 28,
1395	OP_RENAME = 29,
1396	OP_RENEW = 30,
1397	OP_RESTOREFH = 31,
1398	OP_SAVEFH = 32,
1399	OP_SECINFO = 33,
1400	OP_SETATTR = 34,
1401	OP_SETCLIENTID = 35,
1402	OP_SETCLIENTID_CONFIRM = 36,
1403	OP_VERIFY = 37,
1404	OP_WRITE = 38,
1405	OP_RELEASE_LOCKOWNER = 39,
1406	OP_ILLEGAL = 10044,
1407/*
1408 * These are internal client pseudo ops that *MUST* never go over the wire
1409 */
1410#define	SUNW_PRIVATE_OP	0x10000000
1411#define	REAL_OP4(op)	((op) & ~SUNW_PRIVATE_OP)
1412	OP_CCREATE = OP_CREATE | SUNW_PRIVATE_OP,
1413	OP_CLINK = OP_LINK | SUNW_PRIVATE_OP,
1414	OP_CLOOKUP = OP_LOOKUP | SUNW_PRIVATE_OP,
1415	OP_COPEN = OP_OPEN | SUNW_PRIVATE_OP,
1416	OP_CPUTFH = OP_PUTFH | SUNW_PRIVATE_OP,
1417	OP_CREMOVE = OP_REMOVE | SUNW_PRIVATE_OP,
1418	OP_CRENAME = OP_RENAME | SUNW_PRIVATE_OP,
1419	OP_CSECINFO = OP_SECINFO | SUNW_PRIVATE_OP
1420};
1421typedef enum nfs_opnum4 nfs_opnum4;
1422
1423struct nfs_argop4 {
1424	nfs_opnum4 argop;
1425	union {
1426		ACCESS4args opaccess;
1427		CLOSE4args opclose;
1428		COMMIT4args opcommit;
1429		CREATE4args opcreate;
1430		CREATE4cargs opccreate;
1431		DELEGPURGE4args opdelegpurge;
1432		DELEGRETURN4args opdelegreturn;
1433		GETATTR4args opgetattr;
1434		LINK4args oplink;
1435		LINK4cargs opclink;
1436		LOCK4args oplock;
1437		LOCKT4args oplockt;
1438		LOCKU4args oplocku;
1439		LOOKUP4args oplookup;
1440		LOOKUP4cargs opclookup;
1441		NVERIFY4args opnverify;
1442		OPEN4args opopen;
1443		OPEN4cargs opcopen;
1444		OPENATTR4args opopenattr;
1445		OPEN_CONFIRM4args opopen_confirm;
1446		OPEN_DOWNGRADE4args opopen_downgrade;
1447		PUTFH4args opputfh;
1448		PUTFH4cargs opcputfh;
1449		READ4args opread;
1450		READDIR4args opreaddir;
1451		REMOVE4args opremove;
1452		REMOVE4cargs opcremove;
1453		RENAME4args oprename;
1454		RENAME4cargs opcrename;
1455		RENEW4args oprenew;
1456		SECINFO4args opsecinfo;
1457		SECINFO4cargs opcsecinfo;
1458		SETATTR4args opsetattr;
1459		SETCLIENTID4args opsetclientid;
1460		SETCLIENTID_CONFIRM4args opsetclientid_confirm;
1461		VERIFY4args opverify;
1462		WRITE4args opwrite;
1463		RELEASE_LOCKOWNER4args oprelease_lockowner;
1464	} nfs_argop4_u;
1465};
1466typedef struct nfs_argop4 nfs_argop4;
1467
1468struct nfs_resop4 {
1469	nfs_opnum4 resop;
1470	union {
1471		ACCESS4res opaccess;
1472		CLOSE4res opclose;
1473		COMMIT4res opcommit;
1474		CREATE4res opcreate;
1475		DELEGPURGE4res opdelegpurge;
1476		DELEGRETURN4res opdelegreturn;
1477		GETATTR4res opgetattr;
1478		GETFH4res opgetfh;
1479		LINK4res oplink;
1480		LOCK4res oplock;
1481		LOCKT4res oplockt;
1482		LOCKU4res oplocku;
1483		LOOKUP4res oplookup;
1484		LOOKUPP4res oplookupp;
1485		NVERIFY4res opnverify;
1486		OPEN4res opopen;
1487		OPENATTR4res opopenattr;
1488		OPEN_CONFIRM4res opopen_confirm;
1489		OPEN_DOWNGRADE4res opopen_downgrade;
1490		PUTFH4res opputfh;
1491		PUTPUBFH4res opputpubfh;
1492		PUTROOTFH4res opputrootfh;
1493		READ4res opread;
1494		READDIR4res opreaddir;
1495		READDIR4res_clnt opreaddirclnt;
1496		READLINK4res opreadlink;
1497		REMOVE4res opremove;
1498		RENAME4res oprename;
1499		RENEW4res oprenew;
1500		RESTOREFH4res oprestorefh;
1501		SAVEFH4res opsavefh;
1502		SECINFO4res opsecinfo;
1503		SETATTR4res opsetattr;
1504		SETCLIENTID4res opsetclientid;
1505		SETCLIENTID_CONFIRM4res opsetclientid_confirm;
1506		VERIFY4res opverify;
1507		WRITE4res opwrite;
1508		RELEASE_LOCKOWNER4res oprelease_lockowner;
1509		ILLEGAL4res opillegal;
1510	} nfs_resop4_u;
1511};
1512typedef struct nfs_resop4 nfs_resop4;
1513
1514/*
1515 * Fixed size tag string for easy client encoding
1516 */
1517struct _ctag {
1518	int ct_type;
1519	char *ct_str;
1520	uint32_t ct_tag[3];
1521};
1522typedef struct _ctag ctag_t;
1523
1524/*
1525 * Client-only encode-only version
1526 */
1527struct COMPOUND4args_clnt {
1528	int ctag;
1529	uint_t array_len;
1530	nfs_argop4 *array;
1531};
1532typedef struct COMPOUND4args_clnt COMPOUND4args_clnt;
1533
1534struct COMPOUND4args {
1535	utf8string tag;
1536	uint32_t minorversion;
1537	uint_t array_len;
1538	nfs_argop4 *array;
1539};
1540typedef struct COMPOUND4args COMPOUND4args;
1541
1542struct COMPOUND4res_clnt {
1543	nfsstat4 status;
1544	uint_t array_len;
1545	uint_t decode_len;
1546	nfs_resop4 *array;
1547	COMPOUND4args_clnt *argsp;
1548};
1549typedef struct COMPOUND4res_clnt COMPOUND4res_clnt;
1550
1551struct COMPOUND4res {
1552	nfsstat4 status;
1553	utf8string tag;
1554	uint_t array_len;
1555	nfs_resop4 *array;
1556};
1557typedef struct COMPOUND4res COMPOUND4res;
1558
1559struct CB_GETATTR4args {
1560	nfs_fh4 fh;
1561	bitmap4 attr_request;
1562};
1563typedef struct CB_GETATTR4args CB_GETATTR4args;
1564
1565struct CB_GETATTR4res {
1566	nfsstat4 status;
1567	fattr4 obj_attributes;
1568};
1569typedef struct CB_GETATTR4res CB_GETATTR4res;
1570
1571struct CB_RECALL4args {
1572	stateid4 stateid;
1573	bool_t truncate;
1574	nfs_fh4 fh;
1575};
1576typedef struct CB_RECALL4args CB_RECALL4args;
1577
1578struct CB_RECALL4res {
1579	nfsstat4 status;
1580};
1581typedef struct CB_RECALL4res CB_RECALL4res;
1582
1583struct CB_ILLEGAL4res {
1584	nfsstat4 status;
1585};
1586typedef struct CB_ILLEGAL4res CB_ILLEGAL4res;
1587
1588enum nfs_cb_opnum4 {
1589	OP_CB_GETATTR = 3,
1590	OP_CB_RECALL = 4,
1591	OP_CB_ILLEGAL = 10044
1592};
1593typedef enum nfs_cb_opnum4 nfs_cb_opnum4;
1594
1595struct nfs_cb_argop4 {
1596	uint_t argop;
1597	union {
1598		CB_GETATTR4args opcbgetattr;
1599		CB_RECALL4args opcbrecall;
1600	} nfs_cb_argop4_u;
1601};
1602typedef struct nfs_cb_argop4 nfs_cb_argop4;
1603
1604struct nfs_cb_resop4 {
1605	uint_t resop;
1606	union {
1607		CB_GETATTR4res opcbgetattr;
1608		CB_RECALL4res opcbrecall;
1609		CB_ILLEGAL4res opcbillegal;
1610	} nfs_cb_resop4_u;
1611};
1612typedef struct nfs_cb_resop4 nfs_cb_resop4;
1613
1614struct CB_COMPOUND4args {
1615	utf8string tag;
1616	uint32_t minorversion;
1617	uint32_t callback_ident;
1618	uint_t array_len;
1619	nfs_cb_argop4 *array;
1620};
1621typedef struct CB_COMPOUND4args CB_COMPOUND4args;
1622
1623struct CB_COMPOUND4res {
1624	nfsstat4 status;
1625	utf8string tag;
1626	uint_t array_len;
1627	nfs_cb_resop4 *array;
1628};
1629typedef struct CB_COMPOUND4res CB_COMPOUND4res;
1630
1631#define	NFS4_PROGRAM		100003
1632#define	NFS_V4			4
1633#define	NFSPROC4_NULL		0
1634#define	NFSPROC4_COMPOUND	1
1635
1636#define	NFS4_CALLBACK		0x40000000
1637#define	NFS_CB			1
1638#define	CB_NULL			0
1639#define	CB_COMPOUND		1
1640
1641extern  bool_t xdr_bitmap4(XDR *, bitmap4 *);
1642extern  bool_t xdr_utf8string(XDR *, utf8string *);
1643extern  bool_t xdr_nfs_fh4(XDR *, nfs_fh4 *);
1644extern  bool_t xdr_fattr4_fsid(XDR *, fattr4_fsid *);
1645extern  bool_t xdr_fattr4_acl(XDR *, fattr4_acl *);
1646extern  bool_t xdr_fattr4_fs_locations(XDR *, fattr4_fs_locations *);
1647extern  bool_t xdr_fattr4_rawdev(XDR *, fattr4_rawdev *);
1648extern  bool_t xdr_nfstime4(XDR *, nfstime4 *);
1649extern  bool_t xdr_settime4(XDR *, settime4 *);
1650extern  bool_t xdr_COMPOUND4args_clnt(XDR *, COMPOUND4args_clnt *);
1651extern  bool_t xdr_COMPOUND4args_srv(XDR *, COMPOUND4args *);
1652extern  bool_t xdr_COMPOUND4res_clnt(XDR *, COMPOUND4res_clnt *);
1653extern  bool_t xdr_COMPOUND4res_srv(XDR *, COMPOUND4res *);
1654extern  bool_t xdr_CB_COMPOUND4args_clnt(XDR *, CB_COMPOUND4args *);
1655extern  bool_t xdr_CB_COMPOUND4args_srv(XDR *, CB_COMPOUND4args *);
1656extern  bool_t xdr_CB_COMPOUND4res(XDR *, CB_COMPOUND4res *);
1657
1658/*
1659 * xdr for referrrals upcall
1660 */
1661extern	bool_t xdr_knetconfig(XDR *, struct knetconfig *);
1662extern	bool_t xdr_nfs_fsl_info(XDR *, struct nfs_fsl_info *);
1663
1664
1665#ifdef __cplusplus
1666}
1667#endif
1668
1669#endif /* _NFS4_KPROT_H */
1670