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