xref: /illumos-gate/usr/src/uts/common/nfs/nfs4x.h (revision f44e1126)
1*f44e1126SVitaliy Gusev /*
2*f44e1126SVitaliy Gusev  * This file and its contents are supplied under the terms of the
3*f44e1126SVitaliy Gusev  * Common Development and Distribution License ("CDDL"), version 1.0.
4*f44e1126SVitaliy Gusev  * You may only use this file in accordance with the terms of version
5*f44e1126SVitaliy Gusev  * 1.0 of the CDDL.
6*f44e1126SVitaliy Gusev  *
7*f44e1126SVitaliy Gusev  * A full copy of the text of the CDDL should have accompanied this
8*f44e1126SVitaliy Gusev  * source.  A copy of the CDDL is also available via the Internet at
9*f44e1126SVitaliy Gusev  * http://www.illumos.org/license/CDDL.
10*f44e1126SVitaliy Gusev  */
11*f44e1126SVitaliy Gusev 
12*f44e1126SVitaliy Gusev /*
13*f44e1126SVitaliy Gusev  * Copyright 2017 RackTop Systems.
14*f44e1126SVitaliy Gusev  */
15*f44e1126SVitaliy Gusev 
16*f44e1126SVitaliy Gusev #ifndef _NFS4X_H
17*f44e1126SVitaliy Gusev #define	_NFS4X_H
18*f44e1126SVitaliy Gusev 
19*f44e1126SVitaliy Gusev #ifdef	__cplusplus
20*f44e1126SVitaliy Gusev extern "C" {
21*f44e1126SVitaliy Gusev #endif
22*f44e1126SVitaliy Gusev 
23*f44e1126SVitaliy Gusev #ifdef _KERNEL
24*f44e1126SVitaliy Gusev 
25*f44e1126SVitaliy Gusev #include <sys/cred.h>
26*f44e1126SVitaliy Gusev #include <nfs/nfs4_kprot.h>
27*f44e1126SVitaliy Gusev 
28*f44e1126SVitaliy Gusev /*
29*f44e1126SVitaliy Gusev  * NFSv4.1: slot support (reply cache)
30*f44e1126SVitaliy Gusev  */
31*f44e1126SVitaliy Gusev 
32*f44e1126SVitaliy Gusev #define	RFS4_SLOT_INUSE		(1 << 0)
33*f44e1126SVitaliy Gusev #define	RFS4_SLOT_CACHED	(1 << 1)
34*f44e1126SVitaliy Gusev 
35*f44e1126SVitaliy Gusev /* Slot entry structure */
36*f44e1126SVitaliy Gusev typedef struct rfs4_slot {
37*f44e1126SVitaliy Gusev 	uint32_t	se_flags;
38*f44e1126SVitaliy Gusev 	sequenceid4	se_seqid;
39*f44e1126SVitaliy Gusev 	COMPOUND4res	se_buf;	/* Buf for slot and replays */
40*f44e1126SVitaliy Gusev 	kmutex_t	se_lock;
41*f44e1126SVitaliy Gusev } rfs4_slot_t;
42*f44e1126SVitaliy Gusev 
43*f44e1126SVitaliy Gusev /*
44*f44e1126SVitaliy Gusev  * NFSv4.1 Sessions
45*f44e1126SVitaliy Gusev  */
46*f44e1126SVitaliy Gusev 
47*f44e1126SVitaliy Gusev typedef struct rfs41_csr {	/* contrived create_session result */
48*f44e1126SVitaliy Gusev 	sequenceid4		xi_sid;		/* seqid response to EXCHG_ID */
49*f44e1126SVitaliy Gusev 	nfsstat4		cs_status;
50*f44e1126SVitaliy Gusev 	CREATE_SESSION4resok	cs_res;		/* cached results if NFS4_OK */
51*f44e1126SVitaliy Gusev } rfs41_csr_t;
52*f44e1126SVitaliy Gusev 
53*f44e1126SVitaliy Gusev /*
54*f44e1126SVitaliy Gusev  * Sessions Callback Infrastructure
55*f44e1126SVitaliy Gusev  *
56*f44e1126SVitaliy Gusev  * Locking:
57*f44e1126SVitaliy Gusev  *
58*f44e1126SVitaliy Gusev  * . cn_lock protects all fields in sess_channel_t, but since
59*f44e1126SVitaliy Gusev  *   fore/back and dir don't change often, we serialize only
60*f44e1126SVitaliy Gusev  *   the occasional update.
61*f44e1126SVitaliy Gusev  *
62*f44e1126SVitaliy Gusev  * cn_lock:	cn_lock
63*f44e1126SVitaliy Gusev  * bsd_rwlock:	cn_lock -> bsd_rwlock
64*f44e1126SVitaliy Gusev  */
65*f44e1126SVitaliy Gusev 
66*f44e1126SVitaliy Gusev #define		MAX_CH_CACHE	10
67*f44e1126SVitaliy Gusev typedef struct {				/* Back Chan Specific Data */
68*f44e1126SVitaliy Gusev 	rfs4_slot_t		 *bsd_slots;	/* opaque token for slot tab */
69*f44e1126SVitaliy Gusev 	nfsstat4		  bsd_stat;
70*f44e1126SVitaliy Gusev 	krwlock_t		  bsd_rwlock;	/* protect slot tab info */
71*f44e1126SVitaliy Gusev 	uint64_t		  bsd_idx;	/* Index of next spare CLNT */
72*f44e1126SVitaliy Gusev 	uint64_t		  bsd_cur;	/* Most recent added CLNT */
73*f44e1126SVitaliy Gusev 	int			  bsd_ch_free;
74*f44e1126SVitaliy Gusev 	CLIENT			 *bsd_clnt[MAX_CH_CACHE];
75*f44e1126SVitaliy Gusev } sess_bcsd_t;
76*f44e1126SVitaliy Gusev 
77*f44e1126SVitaliy Gusev typedef struct {
78*f44e1126SVitaliy Gusev 	channel_dir_from_server4 cn_dir;		/* Chan Direction */
79*f44e1126SVitaliy Gusev 	channel_attrs4		 cn_attrs;		/* chan Attrs */
80*f44e1126SVitaliy Gusev 	channel_attrs4		 cn_back_attrs;		/* back channel Attrs */
81*f44e1126SVitaliy Gusev 	sess_bcsd_t		*cn_csd;		/* Chan Specific Data */
82*f44e1126SVitaliy Gusev 	krwlock_t		 cn_lock;
83*f44e1126SVitaliy Gusev } sess_channel_t;
84*f44e1126SVitaliy Gusev 
85*f44e1126SVitaliy Gusev /*
86*f44e1126SVitaliy Gusev  * Maximum number of concurrent COMPOUND requests per session
87*f44e1126SVitaliy Gusev  */
88*f44e1126SVitaliy Gusev #define	MAXSLOTS	256
89*f44e1126SVitaliy Gusev #define	MAXSLOTS_BACK	4
90*f44e1126SVitaliy Gusev 
91*f44e1126SVitaliy Gusev typedef struct {
92*f44e1126SVitaliy Gusev 	state_protect_how4	 sp_type;
93*f44e1126SVitaliy Gusev } rfs41_sprot_t;
94*f44e1126SVitaliy Gusev 
95*f44e1126SVitaliy Gusev /*
96*f44e1126SVitaliy Gusev  * NFSv4.1 Sessions (cont'd)
97*f44e1126SVitaliy Gusev  *
98*f44e1126SVitaliy Gusev  *   rfs4_session_t             rfs4_client_t
99*f44e1126SVitaliy Gusev  *   +-------------+           +--------------------+
100*f44e1126SVitaliy Gusev  *   | sn_sessid   |           | clientid           |
101*f44e1126SVitaliy Gusev  *   | sn_clnt *  -|---------->|    :               |
102*f44e1126SVitaliy Gusev  *   | sn_fore     |           +--------------------+
103*f44e1126SVitaliy Gusev  *   | sn_back     |
104*f44e1126SVitaliy Gusev  *   | sn_slots * -|---------> +--------------------------------+
105*f44e1126SVitaliy Gusev  *   +-------------+           |        (slot_ent_t)            |
106*f44e1126SVitaliy Gusev  *                             |  +----------------------------+|
107*f44e1126SVitaliy Gusev  *                             |  | status, slot, seqid, resp *||------><Res>
108*f44e1126SVitaliy Gusev  *                             |  +----------------------------+|
109*f44e1126SVitaliy Gusev  *                             |  | status, slot, seqid, resp *||
110*f44e1126SVitaliy Gusev  *                             |  +----------------------------+|
111*f44e1126SVitaliy Gusev  *                             |  | status, slot, seqid, resp *||
112*f44e1126SVitaliy Gusev  *                             |  +----------------------------+|
113*f44e1126SVitaliy Gusev  *			       | .				|
114*f44e1126SVitaliy Gusev  *			       | :				|
115*f44e1126SVitaliy Gusev  *                             +--------------------------------+
116*f44e1126SVitaliy Gusev  *                             stok_t
117*f44e1126SVitaliy Gusev  */
118*f44e1126SVitaliy Gusev struct rfs4_client;
119*f44e1126SVitaliy Gusev struct rfs4_dbe;
120*f44e1126SVitaliy Gusev 
121*f44e1126SVitaliy Gusev typedef struct {
122*f44e1126SVitaliy Gusev 	nfsstat4		 cs_error;
123*f44e1126SVitaliy Gusev 	struct rfs4_client	*cs_client;
124*f44e1126SVitaliy Gusev 	struct svc_req		*cs_req;
125*f44e1126SVitaliy Gusev 	uint32_t		 cs_id;
126*f44e1126SVitaliy Gusev 	CREATE_SESSION4args	 cs_aotw;
127*f44e1126SVitaliy Gusev } session41_create_t;
128*f44e1126SVitaliy Gusev 
129*f44e1126SVitaliy Gusev /*
130*f44e1126SVitaliy Gusev  * sn_seq4 - sequence result bit accounting info (session scope)
131*f44e1126SVitaliy Gusev  *	CB_PATH_DOWN_SESSION, CB_GSS_CONTEXT_EXPIRING,
132*f44e1126SVitaliy Gusev  *	CB_GSS_CONTEXT_EXPIRED, BACKCHANNEL_FAULT
133*f44e1126SVitaliy Gusev  */
134*f44e1126SVitaliy Gusev typedef struct rfs4_session {
135*f44e1126SVitaliy Gusev 	struct rfs4_dbe		*sn_dbe;
136*f44e1126SVitaliy Gusev 	sessionid4		 sn_sessid;	/* session id */
137*f44e1126SVitaliy Gusev 	struct rfs4_client	*sn_clnt;	/* back ptr to client state */
138*f44e1126SVitaliy Gusev 	sess_channel_t		*sn_fore;	/* fore chan for this session */
139*f44e1126SVitaliy Gusev 	sess_channel_t		*sn_back;	/* back chan for this session */
140*f44e1126SVitaliy Gusev 	rfs4_slot_t		*sn_slots;	/* slot replay cache */
141*f44e1126SVitaliy Gusev 	time_t			 sn_laccess;	/* struct was last accessed */
142*f44e1126SVitaliy Gusev 	int			 sn_csflags;	/* create_session only flags */
143*f44e1126SVitaliy Gusev 	uint32_t		 sn_flags;	/* SEQ4 status bits */
144*f44e1126SVitaliy Gusev 	list_node_t		 sn_node;	/* link node to rfs4_client */
145*f44e1126SVitaliy Gusev 	struct	{
146*f44e1126SVitaliy Gusev 		uint32_t	pngcnt;		/* conn pings outstanding */
147*f44e1126SVitaliy Gusev 		uint32_t	progno;		/* cb_program number */
148*f44e1126SVitaliy Gusev 		uint32_t	failed:1;	/* TRUE if no cb path avail */
149*f44e1126SVitaliy Gusev 		uint32_t	pnginprog:1;
150*f44e1126SVitaliy Gusev 	} sn_bc;
151*f44e1126SVitaliy Gusev 	uint32_t		 sn_rcached;	/* cached replies, for stat */
152*f44e1126SVitaliy Gusev } rfs4_session_t;
153*f44e1126SVitaliy Gusev 
154*f44e1126SVitaliy Gusev #define	SN_CB_CHAN_EST(x)	((x)->sn_back != NULL)
155*f44e1126SVitaliy Gusev #define	SN_CB_CHAN_OK(x)	((x)->sn_bc.failed == 0)
156*f44e1126SVitaliy Gusev 
157*f44e1126SVitaliy Gusev /* error code for internal use */
158*f44e1126SVitaliy Gusev #define	nfserr_replay_cache NFS4ERR_REPLAY_CACHE
159*f44e1126SVitaliy Gusev 
160*f44e1126SVitaliy Gusev /* Session end */
161*f44e1126SVitaliy Gusev 
162*f44e1126SVitaliy Gusev /*
163*f44e1126SVitaliy Gusev  * Set of RPC credentials used for a particular operation.
164*f44e1126SVitaliy Gusev  * Used for operations like SETCLIENTID_CONFIRM where the
165*f44e1126SVitaliy Gusev  * credentials needs to match those used at SETCLIENTID.
166*f44e1126SVitaliy Gusev  * For EXCHANGE_ID (NFSv4.1+)
167*f44e1126SVitaliy Gusev  */
168*f44e1126SVitaliy Gusev 
169*f44e1126SVitaliy Gusev typedef struct {
170*f44e1126SVitaliy Gusev 	cred_t	*cp_cr;
171*f44e1126SVitaliy Gusev 	int	 cp_aflavor;
172*f44e1126SVitaliy Gusev 	int	 cp_secmod;
173*f44e1126SVitaliy Gusev 	caddr_t	 cp_princ;
174*f44e1126SVitaliy Gusev } cred_set_t;
175*f44e1126SVitaliy Gusev 
176*f44e1126SVitaliy Gusev /* NFSv4.1 Functions */
177*f44e1126SVitaliy Gusev extern int rfs4x_dispatch(struct svc_req *, SVCXPRT *, char *);
178*f44e1126SVitaliy Gusev 
179*f44e1126SVitaliy Gusev void rfs4_free_cred_set(cred_set_t *);
180*f44e1126SVitaliy Gusev void rfs4x_session_rele(rfs4_session_t *);
181*f44e1126SVitaliy Gusev rfs4_session_t *rfs4x_createsession(session41_create_t *);
182*f44e1126SVitaliy Gusev nfsstat4 rfs4x_destroysession(rfs4_session_t *, unsigned useref);
183*f44e1126SVitaliy Gusev void rfs4x_client_session_remove(struct rfs4_client *);
184*f44e1126SVitaliy Gusev rfs4_session_t *rfs4x_findsession_by_id(sessionid4);
185*f44e1126SVitaliy Gusev void rfs4x_session_hold(rfs4_session_t *);
186*f44e1126SVitaliy Gusev void rfs4x_session_rele(rfs4_session_t *);
187*f44e1126SVitaliy Gusev 
188*f44e1126SVitaliy Gusev /* Some init/fini helpers */
189*f44e1126SVitaliy Gusev struct rfs4_srv;
190*f44e1126SVitaliy Gusev struct compound_state;
191*f44e1126SVitaliy Gusev void rfs4x_state_init_locked(struct nfs4_srv *);
192*f44e1126SVitaliy Gusev void rfs4x_state_fini(struct nfs4_srv *);
193*f44e1126SVitaliy Gusev int rfs4x_sequence_prep(COMPOUND4args *, COMPOUND4res *,
194*f44e1126SVitaliy Gusev     struct compound_state *);
195*f44e1126SVitaliy Gusev void rfs4x_sequence_done(COMPOUND4res *, struct compound_state *);
196*f44e1126SVitaliy Gusev 
197*f44e1126SVitaliy Gusev #endif	/* _KERNEL */
198*f44e1126SVitaliy Gusev 
199*f44e1126SVitaliy Gusev #ifdef	__cplusplus
200*f44e1126SVitaliy Gusev }
201*f44e1126SVitaliy Gusev #endif
202*f44e1126SVitaliy Gusev 
203*f44e1126SVitaliy Gusev #endif	/* _NFS4X_H */
204