19ec7b004SRick Macklem /*- 251369649SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 351369649SPedro F. Giffuni * 49ec7b004SRick Macklem * Copyright (c) 1989, 1993 59ec7b004SRick Macklem * The Regents of the University of California. All rights reserved. 69ec7b004SRick Macklem * 79ec7b004SRick Macklem * This code is derived from software contributed to Berkeley by 89ec7b004SRick Macklem * Rick Macklem at The University of Guelph. 99ec7b004SRick Macklem * 109ec7b004SRick Macklem * Redistribution and use in source and binary forms, with or without 119ec7b004SRick Macklem * modification, are permitted provided that the following conditions 129ec7b004SRick Macklem * are met: 139ec7b004SRick Macklem * 1. Redistributions of source code must retain the above copyright 149ec7b004SRick Macklem * notice, this list of conditions and the following disclaimer. 159ec7b004SRick Macklem * 2. Redistributions in binary form must reproduce the above copyright 169ec7b004SRick Macklem * notice, this list of conditions and the following disclaimer in the 179ec7b004SRick Macklem * documentation and/or other materials provided with the distribution. 18fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 199ec7b004SRick Macklem * may be used to endorse or promote products derived from this software 209ec7b004SRick Macklem * without specific prior written permission. 219ec7b004SRick Macklem * 229ec7b004SRick Macklem * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 239ec7b004SRick Macklem * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 249ec7b004SRick Macklem * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 259ec7b004SRick Macklem * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 269ec7b004SRick Macklem * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 279ec7b004SRick Macklem * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 289ec7b004SRick Macklem * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 299ec7b004SRick Macklem * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 309ec7b004SRick Macklem * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 319ec7b004SRick Macklem * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 329ec7b004SRick Macklem * SUCH DAMAGE. 339ec7b004SRick Macklem */ 349ec7b004SRick Macklem 359ec7b004SRick Macklem #ifndef _NFS_NFS_H_ 369ec7b004SRick Macklem #define _NFS_NFS_H_ 379ec7b004SRick Macklem /* 389ec7b004SRick Macklem * Tunable constants for nfs 399ec7b004SRick Macklem */ 409ec7b004SRick Macklem 419ec7b004SRick Macklem #define NFS_MAXIOVEC 34 4208aadbe3SAlexander Motin #define NFS_TICKINTVL 500 /* Desired time for a tick (msec) */ 439ec7b004SRick Macklem #define NFS_HZ (hz / nfscl_ticks) /* Ticks/sec */ 449ec7b004SRick Macklem #define NFS_TIMEO (1 * NFS_HZ) /* Default timeout = 1 second */ 459ec7b004SRick Macklem #define NFS_MINTIMEO (1 * NFS_HZ) /* Min timeout to use */ 469ec7b004SRick Macklem #define NFS_MAXTIMEO (60 * NFS_HZ) /* Max timeout to backoff to */ 479ec7b004SRick Macklem #define NFS_TCPTIMEO 300 /* TCP timeout */ 489ec7b004SRick Macklem #define NFS_MAXRCVTIMEO 60 /* 1 minute in seconds */ 499ec7b004SRick Macklem #define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/ 509ec7b004SRick Macklem #define NFS_MAXREXMIT 100 /* Stop counting after this many */ 51fc0dc940SRick Macklem #define NFSV4_CALLBACKTIMEO 800 /* Timeout in msec */ 529ec7b004SRick Macklem #define NFSV4_CALLBACKRETRY 5 /* Number of retries before failure */ 53c59e4cc3SRick Macklem #define NFSV4_SLOTS 64 /* Number of slots, fore channel */ 54c59e4cc3SRick Macklem #define NFSV4_CBSLOTS 8 /* Number of slots, back channel */ 559ec7b004SRick Macklem #define NFSV4_CBRETRYCNT 4 /* # of CBRecall retries upon err */ 569ec7b004SRick Macklem #define NFSV4_UPCALLTIMEO (15 * NFS_HZ) /* Timeout in ticks for upcalls */ 579ec7b004SRick Macklem /* to gssd or nfsuserd */ 589ec7b004SRick Macklem #define NFSV4_UPCALLRETRY 4 /* Number of retries before failure */ 599ec7b004SRick Macklem #define NFS_MAXWINDOW 1024 /* Max number of outstanding requests */ 609ec7b004SRick Macklem #define NFS_RETRANS 10 /* Num of retrans for soft mounts */ 618e82d541SRick Macklem #define NFS_RETRANS_TCP 2 /* Num of retrans for TCP soft mounts */ 629ec7b004SRick Macklem #define NFS_MAXGRPS 16 /* Max. size of groups list */ 639ec7b004SRick Macklem #define NFS_TRYLATERDEL 15 /* Maximum delay timeout (sec) */ 649ec7b004SRick Macklem #ifndef NFS_REMOVETIMEO 659ec7b004SRick Macklem #define NFS_REMOVETIMEO 15 /* # sec to wait for delegret in local syscall */ 669ec7b004SRick Macklem #endif 679ec7b004SRick Macklem #ifndef NFS_MINATTRTIMO 689ec7b004SRick Macklem #define NFS_MINATTRTIMO 5 /* Attribute cache timeout in sec */ 699ec7b004SRick Macklem #endif 709ec7b004SRick Macklem #ifndef NFS_MAXATTRTIMO 719ec7b004SRick Macklem #define NFS_MAXATTRTIMO 60 729ec7b004SRick Macklem #endif 739ec7b004SRick Macklem #define NFS_WSIZE 8192 /* Def. write data size <= 8192 */ 749ec7b004SRick Macklem #define NFS_RSIZE 8192 /* Def. read data size <= 8192 */ 759ec7b004SRick Macklem #define NFS_READDIRSIZE 8192 /* Def. readdir size */ 767b8c319bSRick Macklem #define NFS_DEFRAHEAD 1 /* Def. read ahead # blocks */ 777b8c319bSRick Macklem #define NFS_MAXRAHEAD 16 /* Max. read ahead # blocks */ 787b8c319bSRick Macklem #define NFS_MAXASYNCDAEMON 64 /* Max. number async_daemons runnable */ 799ec7b004SRick Macklem #define NFS_MAXUIDHASH 64 /* Max. # of hashed uid entries/mp */ 809ec7b004SRick Macklem #ifndef NFSRV_LEASE 819ec7b004SRick Macklem #define NFSRV_LEASE 120 /* Lease time in seconds for V4 */ 829ec7b004SRick Macklem #endif /* assigned to nfsrv_lease */ 839ec7b004SRick Macklem #ifndef NFSRV_STALELEASE 849ec7b004SRick Macklem #define NFSRV_STALELEASE (5 * nfsrv_lease) 859ec7b004SRick Macklem #endif 869ec7b004SRick Macklem #ifndef NFSRV_MOULDYLEASE 879ec7b004SRick Macklem #define NFSRV_MOULDYLEASE 604800 /* One week (in sec) */ 889ec7b004SRick Macklem #endif 899ec7b004SRick Macklem #ifndef NFSCLIENTHASHSIZE 909ec7b004SRick Macklem #define NFSCLIENTHASHSIZE 20 /* Size of server client hash table */ 919ec7b004SRick Macklem #endif 929ec7b004SRick Macklem #ifndef NFSLOCKHASHSIZE 939ec7b004SRick Macklem #define NFSLOCKHASHSIZE 20 /* Size of server nfslock hash table */ 949ec7b004SRick Macklem #endif 95c59e4cc3SRick Macklem #ifndef NFSSESSIONHASHSIZE 96c59e4cc3SRick Macklem #define NFSSESSIONHASHSIZE 20 /* Size of server session hash table */ 97c59e4cc3SRick Macklem #endif 989ec7b004SRick Macklem #define NFSSTATEHASHSIZE 10 /* Size of server stateid hash table */ 9990d2dfabSRick Macklem #define NFSLAYOUTHIGHWATER 1000000 /* Upper limit for # of layouts */ 1009ec7b004SRick Macklem #ifndef NFSCLDELEGHIGHWATER 1019ec7b004SRick Macklem #define NFSCLDELEGHIGHWATER 10000 /* limit for client delegations */ 1029ec7b004SRick Macklem #endif 1031f60bfd8SRick Macklem #ifndef NFSCLLAYOUTHIGHWATER 1041f60bfd8SRick Macklem #define NFSCLLAYOUTHIGHWATER 10000 /* limit for client pNFS layouts */ 1051f60bfd8SRick Macklem #endif 1069ec7b004SRick Macklem #ifndef NFSNOOPEN /* Inactive open owner (sec) */ 1079ec7b004SRick Macklem #define NFSNOOPEN 120 1089ec7b004SRick Macklem #endif 1099ec7b004SRick Macklem #define NFSRV_LEASEDELTA 15 /* # of seconds to delay beyond lease */ 1109ec7b004SRick Macklem #define NFS_IDMAXSIZE 4 /* max sizeof (in_addr_t) */ 1119ec7b004SRick Macklem #ifndef NFSRVCACHE_UDPTIMEOUT 1129ec7b004SRick Macklem #define NFSRVCACHE_UDPTIMEOUT 30 /* # of sec to hold cached rpcs(udp) */ 1139ec7b004SRick Macklem #endif 1149ec7b004SRick Macklem #ifndef NFSRVCACHE_UDPHIGHWATER 1159ec7b004SRick Macklem #define NFSRVCACHE_UDPHIGHWATER 500 /* Max # of udp cache entries */ 1169ec7b004SRick Macklem #endif 1179ec7b004SRick Macklem #ifndef NFSRVCACHE_TCPTIMEOUT 1189ec7b004SRick Macklem #define NFSRVCACHE_TCPTIMEOUT (3600*12) /*#of sec to hold cached rpcs(tcp) */ 1199ec7b004SRick Macklem #endif 1209ec7b004SRick Macklem #ifndef NFSRVCACHE_FLOODLEVEL 1219ec7b004SRick Macklem #define NFSRVCACHE_FLOODLEVEL 16384 /* Very high water mark for cache */ 1229ec7b004SRick Macklem #endif 1239ec7b004SRick Macklem #ifndef NFSRV_CLIENTHIGHWATER 1249ec7b004SRick Macklem #define NFSRV_CLIENTHIGHWATER 1000 1259ec7b004SRick Macklem #endif 1269ec7b004SRick Macklem #ifndef NFSRV_MAXDUMPLIST 1279ec7b004SRick Macklem #define NFSRV_MAXDUMPLIST 10000 1289ec7b004SRick Macklem #endif 1299ec7b004SRick Macklem #ifndef NFS_ACCESSCACHESIZE 1309ec7b004SRick Macklem #define NFS_ACCESSCACHESIZE 8 1319ec7b004SRick Macklem #endif 1329ec7b004SRick Macklem #define NFSV4_CBPORT 7745 /* Callback port for testing */ 1339ec7b004SRick Macklem 1349ec7b004SRick Macklem /* 1359ec7b004SRick Macklem * This macro defines the high water mark for issuing V4 delegations. 1361f54e596SRick Macklem * (It is currently set at a conservative 20% of nfsrv_v4statelimit. This 1379ec7b004SRick Macklem * may want to increase when clients can make more effective use of 1389ec7b004SRick Macklem * delegations.) 1399ec7b004SRick Macklem */ 1401f54e596SRick Macklem #define NFSRV_V4DELEGLIMIT(c) (((c) * 5) > nfsrv_v4statelimit) 1419ec7b004SRick Macklem 1429ec7b004SRick Macklem #define NFS_READDIRBLKSIZ DIRBLKSIZ /* Minimal nm_readdirsize */ 1439ec7b004SRick Macklem 1449ec7b004SRick Macklem /* 145ef4edb70SRick Macklem * The NFSv4 RFCs do not define an upper limit on the length of Owner and 146ef4edb70SRick Macklem * OwnerGroup strings. Since FreeBSD handles a group name > 1024bytes in 147ef4edb70SRick Macklem * length, set a generous sanity limit of 10Kbytes. 148ef4edb70SRick Macklem */ 149ef4edb70SRick Macklem #define NFSV4_MAXOWNERGROUPLEN (10 * 1024) 150ef4edb70SRick Macklem 151ef4edb70SRick Macklem /* 1529ec7b004SRick Macklem * Oddballs 1539ec7b004SRick Macklem */ 1549ec7b004SRick Macklem #define NFS_CMPFH(n, f, s) \ 1559ec7b004SRick Macklem ((n)->n_fhp->nfh_len == (s) && !NFSBCMP((n)->n_fhp->nfh_fh, (caddr_t)(f), (s))) 1569ec7b004SRick Macklem #define NFSRV_CMPFH(nf, ns, f, s) \ 1579ec7b004SRick Macklem ((ns) == (s) && !NFSBCMP((caddr_t)(nf), (caddr_t)(f), (s))) 1589ec7b004SRick Macklem #define NFS_CMPTIME(t1, t2) \ 1599ec7b004SRick Macklem ((t1).tv_sec == (t2).tv_sec && (t1).tv_nsec == (t2).tv_nsec) 1609ec7b004SRick Macklem #define NFS_SETTIME(t) do { \ 1619ec7b004SRick Macklem (t).tv_sec = time.tv_sec; (t).tv_nsec = 1000 * time.tv_usec; } while (0) 1629ec7b004SRick Macklem #define NFS_SRVMAXDATA(n) \ 1639ec7b004SRick Macklem (((n)->nd_flag & (ND_NFSV3 | ND_NFSV4)) ? \ 164ee29e6f3SRick Macklem nfs_srvmaxio : NFS_V2MAXDATA) 1659ec7b004SRick Macklem #define NFS64BITSSET 0xffffffffffffffffull 1669ec7b004SRick Macklem #define NFS64BITSMINUS1 0xfffffffffffffffeull 1679ec7b004SRick Macklem 1689ec7b004SRick Macklem /* 1699ec7b004SRick Macklem * Structures for the nfssvc(2) syscall. Not that anyone but nfsd, mount_nfs 1709ec7b004SRick Macklem * and nfsloaduser should ever try and use it. 1719ec7b004SRick Macklem */ 1721c6c0ed9SRick Macklem struct nfsd_addsock_args { 1739ec7b004SRick Macklem int sock; /* Socket to serve */ 1749ec7b004SRick Macklem caddr_t name; /* Client addr for connection based sockets */ 1759ec7b004SRick Macklem int namelen; /* Length of name */ 1769ec7b004SRick Macklem }; 1779ec7b004SRick Macklem 1789ec7b004SRick Macklem /* 1799ec7b004SRick Macklem * nfsd argument for new krpc. 18090d2dfabSRick Macklem * (New version supports pNFS, indicated by NFSSVC_NEWSTRUCT flag.) 1819ec7b004SRick Macklem */ 1829ec7b004SRick Macklem struct nfsd_nfsd_args { 1839ec7b004SRick Macklem const char *principal; /* GSS-API service principal name */ 1849ec7b004SRick Macklem int minthreads; /* minimum service thread count */ 1859ec7b004SRick Macklem int maxthreads; /* maximum service thread count */ 18690d2dfabSRick Macklem int version; /* Allow multiple variants */ 18790d2dfabSRick Macklem char *addr; /* pNFS DS addresses */ 18890d2dfabSRick Macklem int addrlen; /* Length of addrs */ 18990d2dfabSRick Macklem char *dnshost; /* DNS names for DS addresses */ 19090d2dfabSRick Macklem int dnshostlen; /* Length of DNS names */ 19190d2dfabSRick Macklem char *dspath; /* DS Mount path on MDS */ 19290d2dfabSRick Macklem int dspathlen; /* Length of DS Mount path on MDS */ 1932f32675cSRick Macklem char *mdspath; /* MDS mount for DS path on MDS */ 1942f32675cSRick Macklem int mdspathlen; /* Length of MDS mount for DS path on MDS */ 19590d2dfabSRick Macklem int mirrorcnt; /* Number of mirrors to create on DSs */ 1969ec7b004SRick Macklem }; 1979ec7b004SRick Macklem 1989ec7b004SRick Macklem /* 199d506aa14SRick Macklem * NFSDEV_MAXMIRRORS - Maximum level of mirroring for a DS. 200d506aa14SRick Macklem * (Most will only put files on two DSs, but this setting allows up to 4.) 2016b43e060SRick Macklem * NFSDEV_MAXVERS - maximum number of NFS versions supported by Flex File. 2026b43e060SRick Macklem */ 2036b43e060SRick Macklem #define NFSDEV_MAXMIRRORS 4 2046b43e060SRick Macklem #define NFSDEV_MAXVERS 4 2056b43e060SRick Macklem 20690d2dfabSRick Macklem struct nfsd_pnfsd_args { 20790d2dfabSRick Macklem int op; /* Which pNFSd op to perform. */ 20890d2dfabSRick Macklem char *mdspath; /* Path of MDS file. */ 20990d2dfabSRick Macklem char *dspath; /* Path of recovered DS mounted on dir. */ 21090d2dfabSRick Macklem char *curdspath; /* Path of current DS mounted on dir. */ 21190d2dfabSRick Macklem }; 21290d2dfabSRick Macklem 21390d2dfabSRick Macklem #define PNFSDOP_DELDSSERVER 1 21490d2dfabSRick Macklem #define PNFSDOP_COPYMR 2 215de9a1a70SRick Macklem #define PNFSDOP_FORCEDELDS 3 21690d2dfabSRick Macklem 21790d2dfabSRick Macklem /* Old version. */ 21890d2dfabSRick Macklem struct nfsd_nfsd_oargs { 21990d2dfabSRick Macklem const char *principal; /* GSS-API service principal name */ 22090d2dfabSRick Macklem int minthreads; /* minimum service thread count */ 22190d2dfabSRick Macklem int maxthreads; /* maximum service thread count */ 22290d2dfabSRick Macklem }; 22390d2dfabSRick Macklem 2246b43e060SRick Macklem /* 2259ec7b004SRick Macklem * Arguments for use by the callback daemon. 2269ec7b004SRick Macklem */ 2279ec7b004SRick Macklem struct nfsd_nfscbd_args { 2289ec7b004SRick Macklem const char *principal; /* GSS-API service principal name */ 2299ec7b004SRick Macklem }; 2309ec7b004SRick Macklem 2319ec7b004SRick Macklem struct nfscbd_args { 2329ec7b004SRick Macklem int sock; /* Socket to serve */ 2339ec7b004SRick Macklem caddr_t name; /* Client addr for connection based sockets */ 2349ec7b004SRick Macklem int namelen; /* Length of name */ 2359ec7b004SRick Macklem u_short port; /* Port# for callbacks */ 2369ec7b004SRick Macklem }; 2379ec7b004SRick Macklem 2389ec7b004SRick Macklem struct nfsd_idargs { 2399ec7b004SRick Macklem int nid_flag; /* Flags (see below) */ 2409ec7b004SRick Macklem uid_t nid_uid; /* user/group id */ 2419ec7b004SRick Macklem gid_t nid_gid; 2429ec7b004SRick Macklem int nid_usermax; /* Upper bound on user name cache */ 2439ec7b004SRick Macklem int nid_usertimeout;/* User name timeout (minutes) */ 2449ec7b004SRick Macklem u_char *nid_name; /* Name */ 2459ec7b004SRick Macklem int nid_namelen; /* and its length */ 24684be7e09SRick Macklem gid_t *nid_grps; /* and the list */ 24784be7e09SRick Macklem int nid_ngroup; /* Size of groups list */ 24884be7e09SRick Macklem }; 24984be7e09SRick Macklem 25084be7e09SRick Macklem struct nfsd_oidargs { 25184be7e09SRick Macklem int nid_flag; /* Flags (see below) */ 25284be7e09SRick Macklem uid_t nid_uid; /* user/group id */ 25384be7e09SRick Macklem gid_t nid_gid; 25484be7e09SRick Macklem int nid_usermax; /* Upper bound on user name cache */ 25584be7e09SRick Macklem int nid_usertimeout;/* User name timeout (minutes) */ 25684be7e09SRick Macklem u_char *nid_name; /* Name */ 25784be7e09SRick Macklem int nid_namelen; /* and its length */ 2589ec7b004SRick Macklem }; 2599ec7b004SRick Macklem 26080405bcfSRick Macklem struct nfsuserd_args { 26180405bcfSRick Macklem sa_family_t nuserd_family; /* Address family to use */ 26280405bcfSRick Macklem u_short nuserd_port; /* Port# */ 26380405bcfSRick Macklem }; 26480405bcfSRick Macklem 2659ec7b004SRick Macklem struct nfsd_clid { 2669ec7b004SRick Macklem int nclid_idlen; /* Length of client id */ 2679ec7b004SRick Macklem u_char nclid_id[NFSV4_OPAQUELIMIT]; /* and name */ 2689ec7b004SRick Macklem }; 2699ec7b004SRick Macklem 2709ec7b004SRick Macklem struct nfsd_dumplist { 2719ec7b004SRick Macklem int ndl_size; /* Number of elements */ 2729ec7b004SRick Macklem void *ndl_list; /* and the list of elements */ 2739ec7b004SRick Macklem }; 2749ec7b004SRick Macklem 2759ec7b004SRick Macklem struct nfsd_dumpclients { 2769ec7b004SRick Macklem u_int32_t ndcl_flags; /* LCL_xxx flags */ 2779ec7b004SRick Macklem u_int32_t ndcl_nopenowners; /* Number of openowners */ 2789ec7b004SRick Macklem u_int32_t ndcl_nopens; /* and opens */ 2799ec7b004SRick Macklem u_int32_t ndcl_nlockowners; /* and of lockowners */ 2809ec7b004SRick Macklem u_int32_t ndcl_nlocks; /* and of locks */ 2819ec7b004SRick Macklem u_int32_t ndcl_ndelegs; /* and of delegations */ 2829ec7b004SRick Macklem u_int32_t ndcl_nolddelegs; /* and old delegations */ 2839ec7b004SRick Macklem sa_family_t ndcl_addrfam; /* Callback address */ 2849ec7b004SRick Macklem union { 2859ec7b004SRick Macklem struct in_addr sin_addr; 2869ec7b004SRick Macklem struct in6_addr sin6_addr; 2879ec7b004SRick Macklem } ndcl_cbaddr; 2889ec7b004SRick Macklem struct nfsd_clid ndcl_clid; /* and client id */ 2899ec7b004SRick Macklem }; 2909ec7b004SRick Macklem 2919ec7b004SRick Macklem struct nfsd_dumplocklist { 2929ec7b004SRick Macklem char *ndllck_fname; /* File Name */ 2939ec7b004SRick Macklem int ndllck_size; /* Number of elements */ 2949ec7b004SRick Macklem void *ndllck_list; /* and the list of elements */ 2959ec7b004SRick Macklem }; 2969ec7b004SRick Macklem 2979ec7b004SRick Macklem struct nfsd_dumplocks { 2989ec7b004SRick Macklem u_int32_t ndlck_flags; /* state flags NFSLCK_xxx */ 2999ec7b004SRick Macklem nfsv4stateid_t ndlck_stateid; /* stateid */ 3009ec7b004SRick Macklem u_int64_t ndlck_first; /* lock byte range */ 3019ec7b004SRick Macklem u_int64_t ndlck_end; 3029ec7b004SRick Macklem struct nfsd_clid ndlck_owner; /* Owner of open/lock */ 3039ec7b004SRick Macklem sa_family_t ndlck_addrfam; /* Callback address */ 3049ec7b004SRick Macklem union { 3059ec7b004SRick Macklem struct in_addr sin_addr; 3069ec7b004SRick Macklem struct in6_addr sin6_addr; 3079ec7b004SRick Macklem } ndlck_cbaddr; 3089ec7b004SRick Macklem struct nfsd_clid ndlck_clid; /* and client id */ 3099ec7b004SRick Macklem }; 3109ec7b004SRick Macklem 3119ec7b004SRick Macklem /* 3129ec7b004SRick Macklem * Structure for referral information. 3139ec7b004SRick Macklem */ 3149ec7b004SRick Macklem struct nfsreferral { 3159ec7b004SRick Macklem u_char *nfr_srvlist; /* List of servers */ 3169ec7b004SRick Macklem int nfr_srvcnt; /* number of servers */ 3179ec7b004SRick Macklem vnode_t nfr_vp; /* vnode for referral */ 31895ac7f1aSRick Macklem uint64_t nfr_dfileno; /* assigned dir inode# */ 3199ec7b004SRick Macklem }; 3209ec7b004SRick Macklem 3219ec7b004SRick Macklem /* 3229ec7b004SRick Macklem * Flags for lc_flags and opsflags for nfsrv_getclient(). 3239ec7b004SRick Macklem */ 3249ec7b004SRick Macklem #define LCL_NEEDSCONFIRM 0x00000001 3259ec7b004SRick Macklem #define LCL_DONTCLEAN 0x00000002 3269ec7b004SRick Macklem #define LCL_WAKEUPWANTED 0x00000004 3279ec7b004SRick Macklem #define LCL_TCPCALLBACK 0x00000008 3289ec7b004SRick Macklem #define LCL_CALLBACKSON 0x00000010 3299ec7b004SRick Macklem #define LCL_INDEXNOTOK 0x00000020 3309ec7b004SRick Macklem #define LCL_STAMPEDSTABLE 0x00000040 3319ec7b004SRick Macklem #define LCL_EXPIREIT 0x00000080 3329ec7b004SRick Macklem #define LCL_CBDOWN 0x00000100 3339ec7b004SRick Macklem #define LCL_KERBV 0x00000400 3349ec7b004SRick Macklem #define LCL_NAME 0x00000800 3359ec7b004SRick Macklem #define LCL_NEEDSCBNULL 0x00001000 3369ec7b004SRick Macklem #define LCL_GSSINTEGRITY 0x00002000 3379ec7b004SRick Macklem #define LCL_GSSPRIVACY 0x00004000 3389ec7b004SRick Macklem #define LCL_ADMINREVOKED 0x00008000 339c59e4cc3SRick Macklem #define LCL_RECLAIMCOMPLETE 0x00010000 340c59e4cc3SRick Macklem #define LCL_NFSV41 0x00020000 3419442a64eSRick Macklem #define LCL_DONEBINDCONN 0x00040000 342a3e709cdSRick Macklem #define LCL_RECLAIMONEFS 0x00080000 3432096ce03SRick Macklem #define LCL_NFSV42 0x00100000 34402511d21SRick Macklem #define LCL_TLSCB 0x00200000 345f4179ad4SRick Macklem #define LCL_MACHCRED 0x00400000 3469ec7b004SRick Macklem 3479ec7b004SRick Macklem #define LCL_GSS LCL_KERBV /* Or of all mechs */ 3489ec7b004SRick Macklem 3499ec7b004SRick Macklem /* 3509ec7b004SRick Macklem * Bits for flags in nfslock and nfsstate. 3519ec7b004SRick Macklem * The access, deny, NFSLCK_READ and NFSLCK_WRITE bits must be defined as 3529ec7b004SRick Macklem * below, in the correct order, so the shifts work for tests. 3539ec7b004SRick Macklem */ 3549ec7b004SRick Macklem #define NFSLCK_READACCESS 0x00000001 3559ec7b004SRick Macklem #define NFSLCK_WRITEACCESS 0x00000002 3569ec7b004SRick Macklem #define NFSLCK_ACCESSBITS (NFSLCK_READACCESS | NFSLCK_WRITEACCESS) 3579ec7b004SRick Macklem #define NFSLCK_SHIFT 2 3589ec7b004SRick Macklem #define NFSLCK_READDENY 0x00000004 3599ec7b004SRick Macklem #define NFSLCK_WRITEDENY 0x00000008 3609ec7b004SRick Macklem #define NFSLCK_DENYBITS (NFSLCK_READDENY | NFSLCK_WRITEDENY) 3619ec7b004SRick Macklem #define NFSLCK_SHAREBITS \ 3629ec7b004SRick Macklem (NFSLCK_READACCESS|NFSLCK_WRITEACCESS|NFSLCK_READDENY|NFSLCK_WRITEDENY) 3639ec7b004SRick Macklem #define NFSLCK_LOCKSHIFT 4 3649ec7b004SRick Macklem #define NFSLCK_READ 0x00000010 3659ec7b004SRick Macklem #define NFSLCK_WRITE 0x00000020 3669ec7b004SRick Macklem #define NFSLCK_BLOCKING 0x00000040 3679ec7b004SRick Macklem #define NFSLCK_RECLAIM 0x00000080 3689ec7b004SRick Macklem #define NFSLCK_OPENTOLOCK 0x00000100 3699ec7b004SRick Macklem #define NFSLCK_TEST 0x00000200 3709ec7b004SRick Macklem #define NFSLCK_LOCK 0x00000400 3719ec7b004SRick Macklem #define NFSLCK_UNLOCK 0x00000800 3729ec7b004SRick Macklem #define NFSLCK_OPEN 0x00001000 3739ec7b004SRick Macklem #define NFSLCK_CLOSE 0x00002000 3749ec7b004SRick Macklem #define NFSLCK_CHECK 0x00004000 3759ec7b004SRick Macklem #define NFSLCK_RELEASE 0x00008000 3769ec7b004SRick Macklem #define NFSLCK_NEEDSCONFIRM 0x00010000 3779ec7b004SRick Macklem #define NFSLCK_CONFIRM 0x00020000 3789ec7b004SRick Macklem #define NFSLCK_DOWNGRADE 0x00040000 3799ec7b004SRick Macklem #define NFSLCK_DELEGREAD 0x00080000 3809ec7b004SRick Macklem #define NFSLCK_DELEGWRITE 0x00100000 3819ec7b004SRick Macklem #define NFSLCK_DELEGCUR 0x00200000 3829ec7b004SRick Macklem #define NFSLCK_DELEGPREV 0x00400000 3839ec7b004SRick Macklem #define NFSLCK_OLDDELEG 0x00800000 3849ec7b004SRick Macklem #define NFSLCK_DELEGRECALL 0x01000000 3859ec7b004SRick Macklem #define NFSLCK_SETATTR 0x02000000 3869ec7b004SRick Macklem #define NFSLCK_DELEGPURGE 0x04000000 3879ec7b004SRick Macklem #define NFSLCK_DELEGRETURN 0x08000000 388c59e4cc3SRick Macklem #define NFSLCK_WANTWDELEG 0x10000000 389c59e4cc3SRick Macklem #define NFSLCK_WANTRDELEG 0x20000000 390c59e4cc3SRick Macklem #define NFSLCK_WANTNODELEG 0x40000000 391c59e4cc3SRick Macklem #define NFSLCK_WANTBITS \ 392c59e4cc3SRick Macklem (NFSLCK_WANTWDELEG | NFSLCK_WANTRDELEG | NFSLCK_WANTNODELEG) 3939ec7b004SRick Macklem 3949ec7b004SRick Macklem /* And bits for nid_flag */ 3959ec7b004SRick Macklem #define NFSID_INITIALIZE 0x0001 3969ec7b004SRick Macklem #define NFSID_ADDUID 0x0002 3979ec7b004SRick Macklem #define NFSID_DELUID 0x0004 3989ec7b004SRick Macklem #define NFSID_ADDUSERNAME 0x0008 3999ec7b004SRick Macklem #define NFSID_DELUSERNAME 0x0010 4009ec7b004SRick Macklem #define NFSID_ADDGID 0x0020 4019ec7b004SRick Macklem #define NFSID_DELGID 0x0040 4029ec7b004SRick Macklem #define NFSID_ADDGROUPNAME 0x0080 4039ec7b004SRick Macklem #define NFSID_DELGROUPNAME 0x0100 4049ec7b004SRick Macklem 4059ec7b004SRick Macklem /* 4069ec7b004SRick Macklem * fs.nfs sysctl(3) identifiers 4079ec7b004SRick Macklem */ 4089ec7b004SRick Macklem #define NFS_NFSSTATS 1 /* struct: struct nfsstats */ 4099ec7b004SRick Macklem 4109ec7b004SRick Macklem /* 4119ec7b004SRick Macklem * Here is the definition of the attribute bits array and macros that 4129ec7b004SRick Macklem * manipulate it. 4139ec7b004SRick Macklem * THE MACROS MUST BE MANUALLY MODIFIED IF NFSATTRBIT_MAXWORDS CHANGES!! 4149ec7b004SRick Macklem * It is (NFSATTRBIT_MAX + 31) / 32. 4159ec7b004SRick Macklem */ 416c59e4cc3SRick Macklem #define NFSATTRBIT_MAXWORDS 3 4179ec7b004SRick Macklem 4189ec7b004SRick Macklem typedef struct { 4199ec7b004SRick Macklem u_int32_t bits[NFSATTRBIT_MAXWORDS]; 4209ec7b004SRick Macklem } nfsattrbit_t; 4219ec7b004SRick Macklem 422c59e4cc3SRick Macklem #define NFSZERO_ATTRBIT(b) do { \ 423c59e4cc3SRick Macklem (b)->bits[0] = 0; \ 424c59e4cc3SRick Macklem (b)->bits[1] = 0; \ 425c59e4cc3SRick Macklem (b)->bits[2] = 0; \ 426c59e4cc3SRick Macklem } while (0) 427c59e4cc3SRick Macklem 428c59e4cc3SRick Macklem #define NFSSET_ATTRBIT(t, f) do { \ 429c59e4cc3SRick Macklem (t)->bits[0] = (f)->bits[0]; \ 430c59e4cc3SRick Macklem (t)->bits[1] = (f)->bits[1]; \ 431c59e4cc3SRick Macklem (t)->bits[2] = (f)->bits[2]; \ 432c59e4cc3SRick Macklem } while (0) 433c59e4cc3SRick Macklem 434ea5776ecSRick Macklem #define NFSSETSUPP_ATTRBIT(b, n) do { \ 4359ec7b004SRick Macklem (b)->bits[0] = NFSATTRBIT_SUPP0; \ 436ea5776ecSRick Macklem (b)->bits[1] = (NFSATTRBIT_SUPP1 | NFSATTRBIT_SUPPSETONLY1); \ 437ea5776ecSRick Macklem (b)->bits[2] = (NFSATTRBIT_SUPP2 | NFSATTRBIT_SUPPSETONLY2); \ 438ea5776ecSRick Macklem if (((n)->nd_flag & ND_NFSV41) == 0) { \ 439ea5776ecSRick Macklem (b)->bits[1] &= ~NFSATTRBIT_NFSV41_1; \ 440ea5776ecSRick Macklem (b)->bits[2] &= ~NFSATTRBIT_NFSV41_2; \ 441ea5776ecSRick Macklem } \ 4422096ce03SRick Macklem if (((n)->nd_flag & ND_NFSV42) == 0) \ 4432096ce03SRick Macklem (b)->bits[2] &= ~NFSATTRBIT_NFSV42_2; \ 444c59e4cc3SRick Macklem } while (0) 445c59e4cc3SRick Macklem 4469ec7b004SRick Macklem #define NFSISSET_ATTRBIT(b, p) ((b)->bits[(p) / 32] & (1 << ((p) % 32))) 4479ec7b004SRick Macklem #define NFSSETBIT_ATTRBIT(b, p) ((b)->bits[(p) / 32] |= (1 << ((p) % 32))) 4489ec7b004SRick Macklem #define NFSCLRBIT_ATTRBIT(b, p) ((b)->bits[(p) / 32] &= ~(1 << ((p) % 32))) 449c59e4cc3SRick Macklem 4509ec7b004SRick Macklem #define NFSCLRALL_ATTRBIT(b, a) do { \ 4519ec7b004SRick Macklem (b)->bits[0] &= ~((a)->bits[0]); \ 4529ec7b004SRick Macklem (b)->bits[1] &= ~((a)->bits[1]); \ 453c59e4cc3SRick Macklem (b)->bits[2] &= ~((a)->bits[2]); \ 4549ec7b004SRick Macklem } while (0) 455c59e4cc3SRick Macklem 4569ec7b004SRick Macklem #define NFSCLRNOT_ATTRBIT(b, a) do { \ 4579ec7b004SRick Macklem (b)->bits[0] &= ((a)->bits[0]); \ 4589ec7b004SRick Macklem (b)->bits[1] &= ((a)->bits[1]); \ 459c59e4cc3SRick Macklem (b)->bits[2] &= ((a)->bits[2]); \ 4609ec7b004SRick Macklem } while (0) 461c59e4cc3SRick Macklem 462ea5776ecSRick Macklem #define NFSCLRNOTFILLABLE_ATTRBIT(b, n) do { \ 4639ec7b004SRick Macklem (b)->bits[0] &= NFSATTRBIT_SUPP0; \ 464c59e4cc3SRick Macklem (b)->bits[1] &= NFSATTRBIT_SUPP1; \ 465c59e4cc3SRick Macklem (b)->bits[2] &= NFSATTRBIT_SUPP2; \ 466ea5776ecSRick Macklem if (((n)->nd_flag & ND_NFSV41) == 0) { \ 467ea5776ecSRick Macklem (b)->bits[1] &= ~NFSATTRBIT_NFSV41_1; \ 468ea5776ecSRick Macklem (b)->bits[2] &= ~NFSATTRBIT_NFSV41_2; \ 469ea5776ecSRick Macklem } \ 4702096ce03SRick Macklem if (((n)->nd_flag & ND_NFSV42) == 0) \ 4712096ce03SRick Macklem (b)->bits[2] &= ~NFSATTRBIT_NFSV42_2; \ 472c59e4cc3SRick Macklem } while (0) 473c59e4cc3SRick Macklem 474ea5776ecSRick Macklem #define NFSCLRNOTSETABLE_ATTRBIT(b, n) do { \ 4759ec7b004SRick Macklem (b)->bits[0] &= NFSATTRBIT_SETABLE0; \ 476c59e4cc3SRick Macklem (b)->bits[1] &= NFSATTRBIT_SETABLE1; \ 477c59e4cc3SRick Macklem (b)->bits[2] &= NFSATTRBIT_SETABLE2; \ 478ea5776ecSRick Macklem if (((n)->nd_flag & ND_NFSV41) == 0) \ 479ea5776ecSRick Macklem (b)->bits[2] &= ~NFSATTRBIT_NFSV41_2; \ 4802096ce03SRick Macklem if (((n)->nd_flag & ND_NFSV42) == 0) \ 4812096ce03SRick Macklem (b)->bits[2] &= ~NFSATTRBIT_NFSV42_2; \ 482c59e4cc3SRick Macklem } while (0) 483c59e4cc3SRick Macklem 484c59e4cc3SRick Macklem #define NFSNONZERO_ATTRBIT(b) ((b)->bits[0] || (b)->bits[1] || (b)->bits[2]) 485c59e4cc3SRick Macklem #define NFSEQUAL_ATTRBIT(b, p) ((b)->bits[0] == (p)->bits[0] && \ 486c59e4cc3SRick Macklem (b)->bits[1] == (p)->bits[1] && (b)->bits[2] == (p)->bits[2]) 487c59e4cc3SRick Macklem 4889ec7b004SRick Macklem #define NFSGETATTR_ATTRBIT(b) do { \ 4899ec7b004SRick Macklem (b)->bits[0] = NFSATTRBIT_GETATTR0; \ 490c59e4cc3SRick Macklem (b)->bits[1] = NFSATTRBIT_GETATTR1; \ 491c59e4cc3SRick Macklem (b)->bits[2] = NFSATTRBIT_GETATTR2; \ 492c59e4cc3SRick Macklem } while (0) 493c59e4cc3SRick Macklem 4949ec7b004SRick Macklem #define NFSWCCATTR_ATTRBIT(b) do { \ 4959ec7b004SRick Macklem (b)->bits[0] = NFSATTRBIT_WCCATTR0; \ 496c59e4cc3SRick Macklem (b)->bits[1] = NFSATTRBIT_WCCATTR1; \ 497c59e4cc3SRick Macklem (b)->bits[2] = NFSATTRBIT_WCCATTR2; \ 498c59e4cc3SRick Macklem } while (0) 499c59e4cc3SRick Macklem 5009ec7b004SRick Macklem #define NFSWRITEGETATTR_ATTRBIT(b) do { \ 5019ec7b004SRick Macklem (b)->bits[0] = NFSATTRBIT_WRITEGETATTR0; \ 502c59e4cc3SRick Macklem (b)->bits[1] = NFSATTRBIT_WRITEGETATTR1; \ 503c59e4cc3SRick Macklem (b)->bits[2] = NFSATTRBIT_WRITEGETATTR2; \ 504c59e4cc3SRick Macklem } while (0) 505c59e4cc3SRick Macklem 5069ec7b004SRick Macklem #define NFSCBGETATTR_ATTRBIT(b, c) do { \ 5079ec7b004SRick Macklem (c)->bits[0] = ((b)->bits[0] & NFSATTRBIT_CBGETATTR0); \ 508c59e4cc3SRick Macklem (c)->bits[1] = ((b)->bits[1] & NFSATTRBIT_CBGETATTR1); \ 509c59e4cc3SRick Macklem (c)->bits[2] = ((b)->bits[2] & NFSATTRBIT_CBGETATTR2); \ 510c59e4cc3SRick Macklem } while (0) 511c59e4cc3SRick Macklem 5129ec7b004SRick Macklem #define NFSPATHCONF_GETATTRBIT(b) do { \ 5139ec7b004SRick Macklem (b)->bits[0] = NFSGETATTRBIT_PATHCONF0; \ 514c59e4cc3SRick Macklem (b)->bits[1] = NFSGETATTRBIT_PATHCONF1; \ 515c59e4cc3SRick Macklem (b)->bits[2] = NFSGETATTRBIT_PATHCONF2; \ 516c59e4cc3SRick Macklem } while (0) 517c59e4cc3SRick Macklem 5189ec7b004SRick Macklem #define NFSSTATFS_GETATTRBIT(b) do { \ 5199ec7b004SRick Macklem (b)->bits[0] = NFSGETATTRBIT_STATFS0; \ 520c59e4cc3SRick Macklem (b)->bits[1] = NFSGETATTRBIT_STATFS1; \ 521c59e4cc3SRick Macklem (b)->bits[2] = NFSGETATTRBIT_STATFS2; \ 522c59e4cc3SRick Macklem } while (0) 523c59e4cc3SRick Macklem 524896516e5SRick Macklem #define NFSROOTFS_GETATTRBIT(b) do { \ 525896516e5SRick Macklem (b)->bits[0] = NFSGETATTRBIT_STATFS0 | NFSATTRBIT_GETATTR0 | \ 526896516e5SRick Macklem NFSATTRBM_LEASETIME; \ 527896516e5SRick Macklem (b)->bits[1] = NFSGETATTRBIT_STATFS1 | NFSATTRBIT_GETATTR1; \ 528896516e5SRick Macklem (b)->bits[2] = NFSGETATTRBIT_STATFS2 | NFSATTRBIT_GETATTR2; \ 529896516e5SRick Macklem } while (0) 530896516e5SRick Macklem 5319ec7b004SRick Macklem #define NFSISSETSTATFS_ATTRBIT(b) \ 5329ec7b004SRick Macklem (((b)->bits[0] & NFSATTRBIT_STATFS0) || \ 533c59e4cc3SRick Macklem ((b)->bits[1] & NFSATTRBIT_STATFS1) || \ 534c59e4cc3SRick Macklem ((b)->bits[2] & NFSATTRBIT_STATFS2)) 535c59e4cc3SRick Macklem 5369ec7b004SRick Macklem #define NFSCLRSTATFS_ATTRBIT(b) do { \ 5379ec7b004SRick Macklem (b)->bits[0] &= ~NFSATTRBIT_STATFS0; \ 538c59e4cc3SRick Macklem (b)->bits[1] &= ~NFSATTRBIT_STATFS1; \ 539c59e4cc3SRick Macklem (b)->bits[2] &= ~NFSATTRBIT_STATFS2; \ 540c59e4cc3SRick Macklem } while (0) 541c59e4cc3SRick Macklem 5429ec7b004SRick Macklem #define NFSREADDIRPLUS_ATTRBIT(b) do { \ 5439ec7b004SRick Macklem (b)->bits[0] = NFSATTRBIT_READDIRPLUS0; \ 544c59e4cc3SRick Macklem (b)->bits[1] = NFSATTRBIT_READDIRPLUS1; \ 545c59e4cc3SRick Macklem (b)->bits[2] = NFSATTRBIT_READDIRPLUS2; \ 546c59e4cc3SRick Macklem } while (0) 547c59e4cc3SRick Macklem 5489ec7b004SRick Macklem #define NFSREFERRAL_ATTRBIT(b) do { \ 5499ec7b004SRick Macklem (b)->bits[0] = NFSATTRBIT_REFERRAL0; \ 550c59e4cc3SRick Macklem (b)->bits[1] = NFSATTRBIT_REFERRAL1; \ 551c59e4cc3SRick Macklem (b)->bits[2] = NFSATTRBIT_REFERRAL2; \ 552c59e4cc3SRick Macklem } while (0) 5539ec7b004SRick Macklem 5549ec7b004SRick Macklem /* 555f4179ad4SRick Macklem * Here is the definition of the operation bits array and macros that 556f4179ad4SRick Macklem * manipulate it. 557f4179ad4SRick Macklem * THE MACROS MUST BE MANUALLY MODIFIED IF NFSOPBIT_MAXWORDS CHANGES!! 558f4179ad4SRick Macklem * It is (NFSV42_NOPS + 31) / 32. 559f4179ad4SRick Macklem */ 560f4179ad4SRick Macklem #define NFSOPBIT_MAXWORDS 3 561f4179ad4SRick Macklem 562f4179ad4SRick Macklem typedef struct { 563f4179ad4SRick Macklem uint32_t bits[NFSOPBIT_MAXWORDS]; 564f4179ad4SRick Macklem } nfsopbit_t; 565f4179ad4SRick Macklem 566f4179ad4SRick Macklem #define NFSZERO_OPBIT(b) do { \ 567f4179ad4SRick Macklem (b)->bits[0] = 0; \ 568f4179ad4SRick Macklem (b)->bits[1] = 0; \ 569f4179ad4SRick Macklem (b)->bits[2] = 0; \ 570f4179ad4SRick Macklem } while (0) 571f4179ad4SRick Macklem 572f4179ad4SRick Macklem #define NFSSET_OPBIT(t, f) do { \ 573f4179ad4SRick Macklem (t)->bits[0] = (f)->bits[0]; \ 574f4179ad4SRick Macklem (t)->bits[1] = (f)->bits[1]; \ 575f4179ad4SRick Macklem (t)->bits[2] = (f)->bits[2]; \ 576f4179ad4SRick Macklem } while (0) 577f4179ad4SRick Macklem 578f4179ad4SRick Macklem #define NFSISSET_OPBIT(b, p) ((b)->bits[(p) / 32] & (1 << ((p) % 32))) 579f4179ad4SRick Macklem #define NFSSETBIT_OPBIT(b, p) ((b)->bits[(p) / 32] |= (1 << ((p) % 32))) 580f4179ad4SRick Macklem #define NFSCLRBIT_OPBIT(b, p) ((b)->bits[(p) / 32] &= ~(1 << ((p) % 32))) 581f4179ad4SRick Macklem 582f4179ad4SRick Macklem /* 5832c1e6cceSRick Macklem * Store uid, gid creds that were used when the stateid was acquired. 58465cc6600SRick Macklem * The RPC layer allows NFS_MAXGRPS + 1 groups to go out on the wire, 5852c1e6cceSRick Macklem * so that's how many gets stored here. 5869ec7b004SRick Macklem */ 5879ec7b004SRick Macklem struct nfscred { 5889ec7b004SRick Macklem uid_t nfsc_uid; 58965cc6600SRick Macklem gid_t nfsc_groups[NFS_MAXGRPS + 1]; 5909ec7b004SRick Macklem int nfsc_ngroups; 5919ec7b004SRick Macklem }; 5929ec7b004SRick Macklem 5939ec7b004SRick Macklem /* 5949ec7b004SRick Macklem * Constants that define the file handle for the V4 root directory. 5959ec7b004SRick Macklem * (The FSID must never be used by other file systems that are exported.) 5969ec7b004SRick Macklem */ 5979ec7b004SRick Macklem #define NFSV4ROOT_FSID0 ((int32_t) -1) 5989ec7b004SRick Macklem #define NFSV4ROOT_FSID1 ((int32_t) -1) 5999ec7b004SRick Macklem #define NFSV4ROOT_REFERRAL ((int32_t) -2) 6009ec7b004SRick Macklem #define NFSV4ROOT_INO 2 /* It's traditional */ 6019ec7b004SRick Macklem #define NFSV4ROOT_GEN 1 6029ec7b004SRick Macklem 6039ec7b004SRick Macklem /* 6049ec7b004SRick Macklem * The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts. 6059ec7b004SRick Macklem * What should be in this set is open to debate, but I believe that since 6069ec7b004SRick Macklem * I/O system calls on ufs are never interrupted by signals the set should 6079ec7b004SRick Macklem * be minimal. My reasoning is that many current programs that use signals 6089ec7b004SRick Macklem * such as SIGALRM will not expect file I/O system calls to be interrupted 6099ec7b004SRick Macklem * by them and break. 6109ec7b004SRick Macklem */ 6119ec7b004SRick Macklem #if defined(_KERNEL) || defined(KERNEL) 6129ec7b004SRick Macklem 6139ec7b004SRick Macklem struct uio; struct buf; struct vattr; struct nameidata; /* XXX */ 6149ec7b004SRick Macklem 6159ec7b004SRick Macklem /* 6169ec7b004SRick Macklem * Socket errors ignored for connectionless sockets? 6179ec7b004SRick Macklem * For now, ignore them all 6189ec7b004SRick Macklem */ 6199ec7b004SRick Macklem #define NFSIGNORE_SOERROR(s, e) \ 6209ec7b004SRick Macklem ((e) != EINTR && (e) != ERESTART && (e) != EWOULDBLOCK && \ 6219ec7b004SRick Macklem ((s) & PR_CONNREQUIRED) == 0) 6229ec7b004SRick Macklem 6239ec7b004SRick Macklem /* 6249ec7b004SRick Macklem * This structure holds socket information for a connection. Used by the 6259ec7b004SRick Macklem * client and the server for callbacks. 6269ec7b004SRick Macklem */ 6279ec7b004SRick Macklem struct nfssockreq { 6289ec7b004SRick Macklem NFSSOCKADDR_T nr_nam; 6299ec7b004SRick Macklem int nr_sotype; 6309ec7b004SRick Macklem int nr_soproto; 6319ec7b004SRick Macklem int nr_soflags; 6329ec7b004SRick Macklem struct ucred *nr_cred; 6339ec7b004SRick Macklem int nr_lock; 6349ec7b004SRick Macklem NFSMUTEX_T nr_mtx; 6359ec7b004SRick Macklem u_int32_t nr_prog; 6369ec7b004SRick Macklem u_int32_t nr_vers; 6379ec7b004SRick Macklem struct __rpc_client *nr_client; 63888a2437aSRick Macklem AUTH *nr_auth; 639*dd7d42a1SRick Macklem char nr_srvprinc[1]; 6409ec7b004SRick Macklem }; 6419ec7b004SRick Macklem 6429ec7b004SRick Macklem /* 6439ec7b004SRick Macklem * And associated nr_lock bits. 6449ec7b004SRick Macklem */ 6459ec7b004SRick Macklem #define NFSR_SNDLOCK 0x01 6469ec7b004SRick Macklem #define NFSR_WANTSND 0x02 6479ec7b004SRick Macklem #define NFSR_RCVLOCK 0x04 6489ec7b004SRick Macklem #define NFSR_WANTRCV 0x08 6499ec7b004SRick Macklem #define NFSR_RESERVEDPORT 0x10 6509ec7b004SRick Macklem #define NFSR_LOCALHOST 0x20 6519ec7b004SRick Macklem 6529ec7b004SRick Macklem /* 6539ec7b004SRick Macklem * Queue head for nfsreq's 6549ec7b004SRick Macklem */ 6559ec7b004SRick Macklem TAILQ_HEAD(nfsreqhead, nfsreq); 6569ec7b004SRick Macklem 65779512355SRick Macklem /* This is the only nfsreq R_xxx flag still used. */ 6589ec7b004SRick Macklem #define R_DONTRECOVER 0x00000100 /* don't initiate recovery when this 6599ec7b004SRick Macklem rpc gets a stale state reply */ 6609ec7b004SRick Macklem 6619ec7b004SRick Macklem /* 6629ec7b004SRick Macklem * Network address hash list element 6639ec7b004SRick Macklem */ 6649ec7b004SRick Macklem union nethostaddr { 6659ec7b004SRick Macklem struct in_addr had_inet; 6669ec7b004SRick Macklem struct in6_addr had_inet6; 6679ec7b004SRick Macklem }; 6689ec7b004SRick Macklem 6699ec7b004SRick Macklem /* 6709ec7b004SRick Macklem * Structure of list of mechanisms. 6719ec7b004SRick Macklem */ 6729ec7b004SRick Macklem struct nfsgss_mechlist { 6739ec7b004SRick Macklem int len; 6749ec7b004SRick Macklem const u_char *str; 6759ec7b004SRick Macklem int totlen; 6769ec7b004SRick Macklem }; 6779ec7b004SRick Macklem #define KERBV_MECH 0 /* position in list */ 6789ec7b004SRick Macklem 6799ec7b004SRick Macklem /* 6809ec7b004SRick Macklem * This structure is used by the server for describing each request. 6819ec7b004SRick Macklem */ 6829ec7b004SRick Macklem struct nfsrv_descript { 683ae070589SRick Macklem struct mbuf *nd_mrep; /* Request mbuf list */ 684ae070589SRick Macklem struct mbuf *nd_md; /* Current dissect mbuf */ 685ae070589SRick Macklem struct mbuf *nd_mreq; /* Reply mbuf list */ 686ae070589SRick Macklem struct mbuf *nd_mb; /* Current build mbuf */ 6879ec7b004SRick Macklem NFSSOCKADDR_T nd_nam; /* and socket addr */ 6889ec7b004SRick Macklem NFSSOCKADDR_T nd_nam2; /* return socket addr */ 6899ec7b004SRick Macklem caddr_t nd_dpos; /* Current dissect pos */ 6909ec7b004SRick Macklem caddr_t nd_bpos; /* Current build pos */ 69190d2dfabSRick Macklem u_int64_t nd_flag; /* nd_flag */ 6929ec7b004SRick Macklem u_int16_t nd_procnum; /* RPC # */ 6939ec7b004SRick Macklem u_int32_t nd_repstat; /* Reply status */ 6949ec7b004SRick Macklem int *nd_errp; /* Pointer to ret status */ 6959ec7b004SRick Macklem u_int32_t nd_retxid; /* Reply xid */ 6969ec7b004SRick Macklem struct nfsrvcache *nd_rp; /* Assoc. cache entry */ 6979ec7b004SRick Macklem fhandle_t nd_fh; /* File handle */ 6989ec7b004SRick Macklem struct ucred *nd_cred; /* Credentials */ 6999ec7b004SRick Macklem uid_t nd_saveduid; /* Saved uid */ 7009ec7b004SRick Macklem u_int64_t nd_sockref; /* Rcv socket ref# */ 7019ec7b004SRick Macklem u_int64_t nd_compref; /* Compound RPC ref# */ 7029ec7b004SRick Macklem time_t nd_tcpconntime; /* Time TCP connection est. */ 7039ec7b004SRick Macklem nfsquad_t nd_clientid; /* Implied clientid */ 7049ec7b004SRick Macklem int nd_gssnamelen; /* principal name length */ 7059ec7b004SRick Macklem char *nd_gssname; /* principal name */ 7061f60bfd8SRick Macklem uint32_t *nd_slotseq; /* ptr to slot seq# in req */ 707c59e4cc3SRick Macklem uint8_t nd_sessionid[NFSX_V4SESSIONID]; /* Session id */ 708c59e4cc3SRick Macklem uint32_t nd_slotid; /* Slotid for this RPC */ 709c59e4cc3SRick Macklem SVCXPRT *nd_xprt; /* Server RPC handle */ 710b2fc0141SRick Macklem uint32_t *nd_sequence; /* Sequence Op. ptr */ 71190d2dfabSRick Macklem nfsv4stateid_t nd_curstateid; /* Current StateID */ 71290d2dfabSRick Macklem nfsv4stateid_t nd_savedcurstateid; /* Saved Current StateID */ 713c057a378SRick Macklem uint32_t nd_maxreq; /* Max. request (session). */ 714c057a378SRick Macklem uint32_t nd_maxresp; /* Max. reply (session). */ 7154476c1deSRick Macklem int nd_bextpg; /* Current ext_pgs page */ 7164476c1deSRick Macklem int nd_bextpgsiz; /* Bytes left in page */ 7174476c1deSRick Macklem int nd_maxextsiz; /* Max ext_pgs mbuf size */ 718f4179ad4SRick Macklem nfsopbit_t nd_allowops; /* Allowed ops ND_MACHCRED */ 7199ec7b004SRick Macklem }; 7209ec7b004SRick Macklem 7219ec7b004SRick Macklem #define nd_princlen nd_gssnamelen 7229ec7b004SRick Macklem #define nd_principal nd_gssname 7239ec7b004SRick Macklem 7249ec7b004SRick Macklem /* Bits for "nd_flag" */ 7259ec7b004SRick Macklem #define ND_DONTSAVEREPLY 0x00000001 7269ec7b004SRick Macklem #define ND_SAVEREPLY 0x00000002 7279ec7b004SRick Macklem #define ND_NFSV2 0x00000004 7289ec7b004SRick Macklem #define ND_NFSV3 0x00000008 7299ec7b004SRick Macklem #define ND_NFSV4 0x00000010 7309ec7b004SRick Macklem #define ND_KERBV 0x00000020 7319ec7b004SRick Macklem #define ND_GSSINTEGRITY 0x00000040 7329ec7b004SRick Macklem #define ND_GSSPRIVACY 0x00000080 7339ec7b004SRick Macklem #define ND_WINDOWVERF 0x00000100 7349ec7b004SRick Macklem #define ND_GSSINITREPLY 0x00000200 7359ec7b004SRick Macklem #define ND_STREAMSOCK 0x00000400 7369ec7b004SRick Macklem #define ND_PUBLOOKUP 0x00000800 7379ec7b004SRick Macklem #define ND_USEGSSNAME 0x00001000 7389ec7b004SRick Macklem #define ND_SAMETCPCONN 0x00002000 7399ec7b004SRick Macklem #define ND_IMPLIEDCLID 0x00004000 7409ec7b004SRick Macklem #define ND_NOMOREDATA 0x00008000 7419ec7b004SRick Macklem #define ND_V4WCCATTR 0x00010000 7429ec7b004SRick Macklem #define ND_NFSCB 0x00020000 7439ec7b004SRick Macklem #define ND_AUTHNONE 0x00040000 74498ad4453SRick Macklem #define ND_EXAUTHSYS 0x00080000 74598ad4453SRick Macklem #define ND_EXGSS 0x00100000 74698ad4453SRick Macklem #define ND_EXGSSINTEGRITY 0x00200000 74798ad4453SRick Macklem #define ND_EXGSSPRIVACY 0x00400000 74898ad4453SRick Macklem #define ND_INCRSEQID 0x00800000 749c52005a3SRick Macklem #define ND_NFSCL 0x01000000 7501f60bfd8SRick Macklem #define ND_NFSV41 0x02000000 7511f60bfd8SRick Macklem #define ND_HASSEQUENCE 0x04000000 752c59e4cc3SRick Macklem #define ND_CACHETHIS 0x08000000 753c59e4cc3SRick Macklem #define ND_LASTOP 0x10000000 754b2fc0141SRick Macklem #define ND_LOOPBADSESS 0x20000000 75590d2dfabSRick Macklem #define ND_DSSERVER 0x40000000 75690d2dfabSRick Macklem #define ND_CURSTATEID 0x80000000 75790d2dfabSRick Macklem #define ND_SAVEDCURSTATEID 0x100000000 758b18130d3SRick Macklem #define ND_HASSLOTID 0x200000000 7592096ce03SRick Macklem #define ND_NFSV42 0x400000000 7604476c1deSRick Macklem #define ND_EXTPG 0x800000000 7614476c1deSRick Macklem #define ND_TLS 0x1000000000 7624476c1deSRick Macklem #define ND_TLSCERT 0x2000000000 7634476c1deSRick Macklem #define ND_TLSCERTUSER 0x4000000000 7644476c1deSRick Macklem #define ND_EXTLS 0x8000000000 7654476c1deSRick Macklem #define ND_EXTLSCERT 0x10000000000 7664476c1deSRick Macklem #define ND_EXTLSCERTUSER 0x20000000000 767dc78533aSRick Macklem #define ND_ERELOOKUP 0x40000000000 768f4179ad4SRick Macklem #define ND_MACHCRED 0x80000000000 7699ec7b004SRick Macklem 7709ec7b004SRick Macklem /* 7719ec7b004SRick Macklem * ND_GSS should be the "or" of all GSS type authentications. 7729ec7b004SRick Macklem */ 7739ec7b004SRick Macklem #define ND_GSS (ND_KERBV) 7749ec7b004SRick Macklem 7759ec7b004SRick Macklem struct nfsv4_opflag { 7769ec7b004SRick Macklem int retfh; 7779ec7b004SRick Macklem int needscfh; 7789ec7b004SRick Macklem int savereply; 7799ec7b004SRick Macklem int modifyfs; 78017891d00SRick Macklem int lktype; 7811f60bfd8SRick Macklem int needsseq; 782b2fc0141SRick Macklem int loopbadsess; 7839ec7b004SRick Macklem }; 7849ec7b004SRick Macklem 7859ec7b004SRick Macklem /* 7869ec7b004SRick Macklem * Flags used to indicate what to do w.r.t. seqid checking. 7879ec7b004SRick Macklem */ 7889ec7b004SRick Macklem #define NFSRVSEQID_FIRST 0x01 7899ec7b004SRick Macklem #define NFSRVSEQID_LAST 0x02 7909ec7b004SRick Macklem #define NFSRVSEQID_OPEN 0x04 7919ec7b004SRick Macklem 7929ec7b004SRick Macklem /* 7939ec7b004SRick Macklem * assign a doubly linked list to a new head 7949ec7b004SRick Macklem * and prepend one list into another. 7959ec7b004SRick Macklem */ 7969ec7b004SRick Macklem #define LIST_NEWHEAD(nhead, ohead, field) do { \ 7979ec7b004SRick Macklem if (((nhead)->lh_first = (ohead)->lh_first) != NULL) \ 7989ec7b004SRick Macklem (ohead)->lh_first->field.le_prev = &(nhead)->lh_first; \ 7999ec7b004SRick Macklem (ohead)->lh_first = NULL; \ 8009ec7b004SRick Macklem } while (0) 8019ec7b004SRick Macklem 8029ec7b004SRick Macklem #define LIST_PREPEND(head, phead, lelm, field) do { \ 8039ec7b004SRick Macklem if ((head)->lh_first != NULL) { \ 8049ec7b004SRick Macklem (lelm)->field.le_next = (head)->lh_first; \ 8059ec7b004SRick Macklem (lelm)->field.le_next->field.le_prev = \ 8069ec7b004SRick Macklem &(lelm)->field.le_next; \ 8079ec7b004SRick Macklem } \ 8089ec7b004SRick Macklem (head)->lh_first = (phead)->lh_first; \ 8099ec7b004SRick Macklem (head)->lh_first->field.le_prev = &(head)->lh_first; \ 8109ec7b004SRick Macklem } while (0) 8119ec7b004SRick Macklem 8129ec7b004SRick Macklem /* 8139ec7b004SRick Macklem * File handle structure for client. Malloc'd to the correct length with 8149ec7b004SRick Macklem * malloc type M_NFSFH. 8159ec7b004SRick Macklem */ 8169ec7b004SRick Macklem struct nfsfh { 8179ec7b004SRick Macklem u_int16_t nfh_len; /* Length of file handle */ 8189ec7b004SRick Macklem u_int8_t nfh_fh[1]; /* and the file handle */ 8199ec7b004SRick Macklem }; 8209ec7b004SRick Macklem 8219ec7b004SRick Macklem /* 8229ec7b004SRick Macklem * File handle structure for server. The NFSRV_MAXFH constant is 8239ec7b004SRick Macklem * set in nfsdport.h. I use a 32bit length, so that alignment is 8249ec7b004SRick Macklem * preserved. 8259ec7b004SRick Macklem */ 8269ec7b004SRick Macklem struct nfsrvfh { 8279ec7b004SRick Macklem u_int32_t nfsrvfh_len; 8289ec7b004SRick Macklem u_int8_t nfsrvfh_data[NFSRV_MAXFH]; 8299ec7b004SRick Macklem }; 8309ec7b004SRick Macklem 8319ec7b004SRick Macklem /* 8329ec7b004SRick Macklem * This structure is used for sleep locks on the NFSv4 nfsd threads and 8339ec7b004SRick Macklem * NFSv4 client data structures. 8349ec7b004SRick Macklem */ 8359ec7b004SRick Macklem struct nfsv4lock { 8369ec7b004SRick Macklem u_int32_t nfslock_usecnt; 8379ec7b004SRick Macklem u_int8_t nfslock_lock; 8389ec7b004SRick Macklem }; 8399ec7b004SRick Macklem #define NFSV4LOCK_LOCK 0x01 8409ec7b004SRick Macklem #define NFSV4LOCK_LOCKWANTED 0x02 8419ec7b004SRick Macklem #define NFSV4LOCK_WANTED 0x04 8429ec7b004SRick Macklem 8439ec7b004SRick Macklem /* 8449ec7b004SRick Macklem * Values for the override argument for nfsvno_accchk(). 8459ec7b004SRick Macklem */ 8469ec7b004SRick Macklem #define NFSACCCHK_NOOVERRIDE 0 8479ec7b004SRick Macklem #define NFSACCCHK_ALLOWROOT 1 8489ec7b004SRick Macklem #define NFSACCCHK_ALLOWOWNER 2 8499ec7b004SRick Macklem 8509ec7b004SRick Macklem /* 8519ec7b004SRick Macklem * and values for the vpislocked argument for nfsvno_accchk(). 8529ec7b004SRick Macklem */ 8539ec7b004SRick Macklem #define NFSACCCHK_VPNOTLOCKED 0 8549ec7b004SRick Macklem #define NFSACCCHK_VPISLOCKED 1 8559ec7b004SRick Macklem 8561f60bfd8SRick Macklem /* 8571f60bfd8SRick Macklem * Slot for the NFSv4.1 Sequence Op. 8581f60bfd8SRick Macklem */ 8591f60bfd8SRick Macklem struct nfsslot { 8601f60bfd8SRick Macklem int nfssl_inprog; 8611f60bfd8SRick Macklem uint32_t nfssl_seq; 8621f60bfd8SRick Macklem struct mbuf *nfssl_reply; 8631f60bfd8SRick Macklem }; 8641f60bfd8SRick Macklem 865e1cda5eeSRick Macklem /* Enumerated type for nfsuserd state. */ 866e1cda5eeSRick Macklem typedef enum { NOTRUNNING=0, STARTSTOP=1, RUNNING=2 } nfsuserd_state; 867e1cda5eeSRick Macklem 8689ec7b004SRick Macklem #endif /* _KERNEL */ 8699ec7b004SRick Macklem 8709ec7b004SRick Macklem #endif /* _NFS_NFS_H */ 871