/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * * nfs_inet.h contains definitions specific to inetboot's nfs implementation. */ #ifndef _NFS_INET_H #define _NFS_INET_H #pragma ident "%Z%%M% %I% %E% SMI" #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include #include #include #include #include "clnt.h" #include #include #define NFSBUF_SIZE (READ_SIZE+1024) #define READ_SIZE (8192) /* NFS readsize */ #define NFS_READ_DECR (1024) /* NFS readsize decrement */ #define NFS3BUF_SIZE (READ3_SIZE+1024) #define READ3_SIZE (32 * 1024) /* NFS3 readsize */ #define NFS4BUF_SIZE (READ4_SIZE+1024) #define READ4_SIZE (32 * 1024) /* NFS4 readsize */ #define NFS4_MAX_UTF8STRING (8 * 1024) #define NFS4_MAX_BITWORDS (2) #define NFS_MAX_FERRS (3) /* MAX frame errors before decr read size */ #define NFS_REXMIT_MIN (3) /* NFS retry min in secs */ #define NFS_REXMIT_MAX (15) /* NFS retry max in secs */ extern int nfs_readsize; extern struct nfs_file roothandle; extern CLIENT *root_CLIENT; /* * Boot specific V4 fh with maximum allowed data statically allocated */ struct nfs_bfh4 { uint_t len; char data[NFS4_FHSIZE]; }; /* * Boot specific V3 fh with maximum allowed data statically allocated */ struct nfs_bfh3 { uint_t len; char data[NFS3_FHSIZE]; }; union _nfs_fh { nfs_fh fh2; struct nfs_bfh3 fh3; struct nfs_bfh4 fh4; }; union _nfs_cookie { nfscookie cookie2; cookie3 cookie3; nfs_cookie4 cookie4; }; union _nfs_ftype { ftype type2; ftype3 type3; nfs_ftype4 type4; }; /* * NFS: This structure represents the current open file. */ struct nfs_file { int version; ulong_t offset; union _nfs_ftype ftype; union _nfs_fh fh; union _nfs_cookie cookie; }; struct nfs_fid { ushort_t nf_len; ushort_t nf_pad; struct nfs_fh fh; }; #define cfile_is_dir(cf) (((cf)->version == NFS_VERSION) ? \ ((cf)->ftype.type2 == NFDIR) : \ (((cf)->version == NFS_V3) ? \ ((cf)->ftype.type3 == NF3DIR) : \ (((cf)->version == NFS_V4) ? \ ((cf)->ftype.type4 == NF4DIR) : 0))) #define cfile_is_lnk(cf) (((cf)->version == NFS_VERSION) ? \ ((cf)->ftype.type2 == NFLNK) : \ (((cf)->version == NFS_V3) ? \ ((cf)->ftype.type3 == NF3LNK) : \ (((cf)->version == NFS_V4) ? \ ((cf)->ftype.type4 == NF4LNK) : 0))) /* * Predefine an attribute bitmap that inetboot will most likely be * interested in. */ typedef union attr4_bitmap1_u { struct { unsigned int #ifdef _BIT_FIELDS_HTOL b_pad4: 11, b_fattr4_fileid: 1, b_fattr4_filehandle: 1, b_pad3: 10, b_fattr4_fsid: 1, b_pad2: 3, b_fattr4_size: 1, b_pad1: 2, b_fattr4_type: 1, b_supported_attrs: 1; #endif #ifdef _BIT_FIELDS_LTOH b_supported_attrs: 1, b_fattr4_type: 1, b_pad1: 2, b_fattr4_size: 1, b_pad2: 3, b_fattr4_fsid: 1, b_pad3: 10, b_fattr4_filehandle: 1, b_fattr4_fileid: 1, b_pad4: 11; #endif } bitmap_s; uint_t word; } attr4_bitmap1_t; #define bm_supported_attrs bitmap_s.b_supported_attrs #define bm_fattr4_type bitmap_s.b_fattr4_type #define bm_fattr4_size bitmap_s.b_fattr4_size #define bm_fattr4_fsid bitmap_s.b_fattr4_fsid #define bm_fattr4_fileid bitmap_s.b_fattr4_fileid #define bm_fattr4_filehandle bitmap_s.b_fattr4_filehandle typedef union attr4_bitmap2_u { struct { unsigned int #ifdef _BIT_FIELDS_HTOL b_pad4: 10, b_fattr4_time_modify: 1, b_fattr4_time_metadata: 1, b_pad3: 4, b_fattr4_time_access: 1, b_pad2: 13, b_fattr4_mode: 1, b_pad1: 1; #endif #ifdef _BIT_FIELDS_LTOH b_pad1: 1, b_fattr4_mode: 1, b_pad2: 13, b_fattr4_time_access: 1, b_pad3: 4, b_fattr4_time_metadata: 1, b_fattr4_time_modify: 1, b_pad4: 10; #endif } bitmap_s; uint_t word; } attr4_bitmap2_t; #define bm_fattr4_mode bitmap_s.b_fattr4_mode #define bm_fattr4_time_access bitmap_s.b_fattr4_time_access #define bm_fattr4_time_metadata bitmap_s.b_fattr4_time_metadata #define bm_fattr4_time_modify bitmap_s.b_fattr4_time_modify typedef struct b_bitmap4 { uint_t b_bitmap_len; uint_t b_bitmap_val[NFS4_MAX_BITWORDS]; } b_bitmap4_t; /* * Define a usable set of v4 atttributes for inetboot. */ typedef struct b_fattr4_s { b_bitmap4_t b_supported_attrs; nfs_ftype4 b_fattr4_type; uint64_t b_fattr4_size; fsid4 b_fattr4_fsid; struct nfs_bfh4 b_fattr4_filehandle; uint64_t b_fattr4_fileid; mode4 b_fattr4_mode; nfstime4 b_fattr4_time_access; nfstime4 b_fattr4_time_metadata; nfstime4 b_fattr4_time_modify; } b_fattr4_t; /* * common to putfh and putfhroot. */ typedef struct putfh4arg_s { uint_t pf_opnum; /* can either be putfh or putrootfh */ struct nfs_bfh4 pf_filehandle; /* only used by putfh */ } putfh4arg_t; /* * Use this struct to construct our OTW compound procedures. Layout makes for * easy XDR'ing. Include putfh. */ typedef union compound_u { struct { utf8string tag; uint_t minorversion; /* 0 */ uint_t argarray_len; /* 1 + n for putfh */ bool_t isputrootfh; /* flag */ putfh4arg_t opputfh; /* putfh args */ } compound_ua_s; struct { nfsstat4 status; /* status of last op */ utf8string tag; uint_t resarray_len; /* 1 + n for putfh */ uint_t opputfh; /* putfh opnum */ nfsstat4 putfh_status; /* putfh status */ } compound_ur_s; } b_compound_t; /* * Define some macros for easy access into the compound structrue */ #define ca_tag compound_ua_s.tag #define ca_minorversion compound_ua_s.minorversion #define ca_argarray_len compound_ua_s.argarray_len #define ca_isputrootfh compound_ua_s.isputrootfh #define ca_opputfh compound_ua_s.opputfh #define cr_status compound_ur_s.status #define cr_tag compound_ur_s.tag #define cr_resarray_len compound_ur_s.resarray_len #define cr_opputfh compound_ur_s.opputfh #define cr_putfh_status compound_ur_s.putfh_status /* * Define simple compound structs that include op specific data */ typedef struct getattrres_cmn { uint_t gc_opgetattr; /* getattr opnum */ nfsstat4 gc_attr_status; /* getattr result */ b_bitmap4_t gc_retattr; /* getattr result */ uint_t gc_attrlist_len; /* getattr result */ b_fattr4_t gc_attrs; /* getattr result */ } getattrres_cmn_t; /* * getattr: putfh/getattr */ typedef struct getattr4arg_s { b_compound_t ga_arg; /* compound + putfh */ uint_t ga_opgetattr; /* getattr opnum */ b_bitmap4_t ga_attr_req; /* getattr arg */ } getattr4arg_t; typedef struct getattr4res_s { b_compound_t gr_res; /* compound + putfh */ getattrres_cmn_t gr_cmn; } getattr4res_t; #define gr_opgetattr gr_cmn.gc_opgetattr #define gr_attr_status gr_cmn.gc_attr_status #define gr_retattr gr_cmn.gc_retattr #define gr_attrs gr_cmn.gc_attrs /* * lookup: putfh/lookup/getattr */ typedef struct lookup4arg_s { b_compound_t la_arg; /* compound + putfh */ uint_t la_oplookup; /* lookup opnum */ component4 la_pathname; /* lookup arg */ uint_t la_opgetattr; /* getattr opnum */ b_bitmap4_t la_attr_req; /* getattr arg */ } lookup4arg_t; typedef struct lookup4res_s { b_compound_t lr_res; /* compound + putfh */ uint_t lr_oplookup; /* lookup opnum */ nfsstat4 lr_lookup_status; /* lookup result */ getattrres_cmn_t lr_gcmn; /* getattr result */ } lookup4res_t; #define lr_opgetattr lr_gcmn.gc_opgetattr #define lr_attr_status lr_gcmn.gc_attr_status #define lr_retattr lr_gcmn.gc_retattr #define lr_attrs lr_gcmn.gc_attrs /* * lookupp: putfh/lookupp/getattr * * For results: use the lookup4res_t */ typedef struct lookupp4arg_s { b_compound_t la_arg; /* compound + putfh */ uint_t la_oplookupp; /* lookupp opnum */ uint_t la_opgetattr; /* lookupp arg */ b_bitmap4_t la_attr_req; /* lookupp arg */ } lookupp4arg_t; /* * read: putfh/read */ typedef struct read4arg_s { b_compound_t r_arg; /* compound + putfh */ uint_t r_opread; /* read opnum */ stateid4 r_stateid; /* read arg */ offset4 r_offset; /* read arg */ count4 r_count; /* read arg */ } read4arg_t; typedef struct read4res_s { b_compound_t r_res; /* compound + putfh */ uint_t r_opread; /* read opnum */ nfsstat4 r_status; /* read result */ bool_t r_eof; /* read result */ uint_t r_data_len; /* read result */ char *r_data_val; /* read result */ } read4res_t; typedef struct b_entry4_s { nfs_cookie4 b_cookie; utf8string b_name; uint64_t b_fileid; struct b_entry4_s *b_nextentry; } b_entry4_t; /* * readdir: putfh/readdir/getattr */ typedef struct readdir4arg_s { b_compound_t rd_arg; /* compoud + putfh */ uint_t rd_opreaddir; /* readdir opnum */ nfs_cookie4 rd_cookie; /* readdir arg */ verifier4 rd_cookieverf; /* readdir arg */ count4 rd_dircount; /* readdir arg */ count4 rd_maxcount; /* readdir arg */ b_bitmap4_t rd_attr_req; /* readdir arg */ } readdir4arg_t; typedef struct readdir4res_s { b_compound_t rd_res; /* compound + putfh */ uint_t rd_opreaddir; /* readdir opnum */ nfsstat4 rd_status; /* readdir result */ verifier4 rd_cookieverf; /* readdir result */ b_entry4_t *rd_entries; /* readdir result */ bool_t rd_eof; /* readdir result */ } readdir4res_t; /* * readlink: putfh/readlink */ typedef struct readlink4arg_s { b_compound_t rl_arg; /* compound + putfh */ uint_t rl_opreadlink; /* readlink opnum */ } readlink4arg_t; typedef struct readlink4res_s { b_compound_t rl_res; /* compound + putfh */ uint_t rl_opreadlink; /* readlink opnum */ nfsstat4 rl_status; /* readlink result */ utf8string rl_link; /* readlink result */ } readlink4res_t; /* * Generic NFS functions */ extern int boot_nfs_mountroot(char *); extern int boot_nfs_unmountroot(void); extern int lookup(char *pathname, struct nfs_file *, bool_t); extern bool_t whoami(void); extern bool_t getfile(char *, char *, struct in_addr *, char *); /* * NFS Version 2 specific functions */ extern void nfs_error(enum nfsstat); extern ssize_t nfsread(struct nfs_file *, char *, size_t); extern int nfsgetattr(struct nfs_file *, struct vattr *); extern int nfsgetdents(struct nfs_file *, struct dirent *, unsigned); extern struct nfs_file *nfslookup(struct nfs_file *, char *, int *); extern int nfsgetsymlink(struct nfs_file *cfile, char **path); /* * NFS Version 3 specific functions */ extern void nfs3_error(enum nfsstat3); extern ssize_t nfs3read(struct nfs_file *, char *, size_t); extern int nfs3getattr(struct nfs_file *, struct vattr *); extern int nfs3getdents(struct nfs_file *, struct dirent *, unsigned); extern struct nfs_file *nfs3lookup(struct nfs_file *, char *, int *); extern int nfs3getsymlink(struct nfs_file *, char **); /* * NFS Version 4 specific functions */ extern void nfs4_error(enum nfsstat4); extern ssize_t nfs4read(struct nfs_file *, char *, size_t); extern int nfs4getattr(struct nfs_file *, struct vattr *); extern int nfs4_getdents(struct nfs_file *, struct dirent *, unsigned); extern struct nfs_file *nfs4lookup(struct nfs_file *, char *, int *); extern struct nfs_file *nfs4lookupp(struct nfs_file *, int *, uint64_t *); extern int nfs4getsymlink(struct nfs_file *, char **); extern void compound_init(b_compound_t *, utf8string *, uint_t, uint_t, struct nfs_bfh4 *); /* * NFSv4 xdr ops */ extern bool_t xdr_getattr4_args(XDR *, getattr4arg_t *); extern bool_t xdr_getattr4_res(XDR *, getattr4res_t *); extern bool_t xdr_lookup4_args(XDR *, lookup4arg_t *); extern bool_t xdr_lookup4_res(XDR *, lookup4res_t *); extern bool_t xdr_lookupp4_args(XDR *, lookupp4arg_t *); extern bool_t xdr_read4_args(XDR *, read4arg_t *); extern bool_t xdr_read4_res(XDR *, read4res_t *); extern bool_t xdr_readdir4_args(XDR *, readdir4arg_t *); extern bool_t xdr_readdir4_res(XDR *, readdir4res_t *); extern bool_t xdr_readlink4_args(XDR *, readlink4arg_t *); extern bool_t xdr_readlink4_res(XDR *, readlink4res_t *); #ifdef __cplusplus } #endif #endif /* _NFS_INET_H */