| #ifndef _IPXE_NFS_H |
| #define _IPXE_NFS_H |
| |
| #include <stdint.h> |
| #include <ipxe/oncrpc.h> |
| |
| /** @file |
| * |
| * Network File System protocol. |
| * |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); |
| |
| /** NFS protocol number */ |
| #define ONCRPC_NFS 100003 |
| |
| /** NFS protocol version */ |
| #define NFS_VERS 3 |
| |
| /** No error*/ |
| #define NFS3_OK 0 |
| /** Not owner */ |
| #define NFS3ERR_PERM 1 |
| /** No such file or directory */ |
| #define NFS3ERR_NOENT 2 |
| /** I/O error */ |
| #define NFS3ERR_IO 5 |
| /** No such device or address */ |
| #define NFS3ERR_NXIO 6 |
| /** Permission denied */ |
| #define NFS3ERR_ACCES 13 |
| /** The file specified already exists */ |
| #define NFS3ERR_EXIST 17 |
| /** Attempt to do a cross-device hard link */ |
| #define NFS3ERR_XDEV 18 |
| /** No such device */ |
| #define NFS3ERR_NODEV 19 |
| /** Not a directory */ |
| #define NFS3ERR_NOTDIR 20 |
| /**Is a directory */ |
| #define NFS3ERR_ISDIR 21 |
| /** Invalid argument */ |
| #define NFS3ERR_INVAL 22 |
| /** Filename too long */ |
| #define NFS3ERR_NAMETOOLONG 63 |
| /** Invalid file handle */ |
| #define NFS3ERR_STALE 70 |
| /** Too many levels of remote in path */ |
| #define NFS3ERR_REMOTE 71 |
| /** Illegal NFS file handle */ |
| #define NFS3ERR_BADHANDLE 10001 |
| /** READDIR or READDIRPLUS cookie is stale */ |
| #define NFS3ERR_BAD_COOKIE 10003 |
| /** Operation not supported */ |
| #define NFS3ERR_NOTSUPP 10004 |
| /** Buffer or request is too small */ |
| #define NFS3ERR_TOOSMALL 10005 |
| /** An error occurred on the server which does not map to any of the legal NFS |
| * version 3 protocol error values */ |
| #define NFS3ERR_SERVERFAULT 10006 |
| /** The server initiated the request, but was not able to complete it in a |
| * timely fashion */ |
| #define NFS3ERR_JUKEBOX 10008 |
| |
| enum nfs_attr_type { |
| NFS_ATTR_SYMLINK = 5, |
| }; |
| |
| /** |
| * A NFS file handle |
| * |
| */ |
| struct nfs_fh { |
| uint8_t fh[64]; |
| size_t size; |
| }; |
| |
| /** |
| * A NFS LOOKUP reply |
| * |
| */ |
| struct nfs_lookup_reply { |
| /** Reply status */ |
| uint32_t status; |
| /** Entity type */ |
| enum nfs_attr_type ent_type; |
| /** File handle */ |
| struct nfs_fh fh; |
| }; |
| |
| /** |
| * A NFS READLINK reply |
| * |
| */ |
| struct nfs_readlink_reply { |
| /** Reply status */ |
| uint32_t status; |
| /** File path length */ |
| uint32_t path_len; |
| /** File path */ |
| char *path; |
| }; |
| |
| |
| /** |
| * A NFS READ reply |
| * |
| */ |
| struct nfs_read_reply { |
| /** Reply status */ |
| uint32_t status; |
| /** File size */ |
| uint64_t filesize; |
| /** Bytes read */ |
| uint32_t count; |
| /** End-of-File indicator */ |
| uint32_t eof; |
| /** Data length */ |
| uint32_t data_len; |
| /** Data read */ |
| void *data; |
| }; |
| |
| size_t nfs_iob_get_fh ( struct io_buffer *io_buf, struct nfs_fh *fh ); |
| size_t nfs_iob_add_fh ( struct io_buffer *io_buf, const struct nfs_fh *fh ); |
| |
| /** |
| * Prepare an ONC RPC session to be used as a NFS session |
| * |
| * @v session ONC RPC session |
| * @v credential ONC RPC credential |
| * |
| * The credential parameter must not be NULL, use 'oncrpc_auth_none' if you |
| * don't want a particular scheme to be used. |
| */ |
| static inline void nfs_init_session ( struct oncrpc_session *session, |
| struct oncrpc_cred *credential ) { |
| oncrpc_init_session ( session, credential, &oncrpc_auth_none, |
| ONCRPC_NFS, NFS_VERS ); |
| } |
| |
| int nfs_lookup ( struct interface *intf, struct oncrpc_session *session, |
| const struct nfs_fh *fh, const char *filename ); |
| int nfs_readlink ( struct interface *intf, struct oncrpc_session *session, |
| const struct nfs_fh *fh ); |
| int nfs_read ( struct interface *intf, struct oncrpc_session *session, |
| const struct nfs_fh *fh, uint64_t offset, uint32_t count ); |
| |
| int nfs_get_lookup_reply ( struct nfs_lookup_reply *lookup_reply, |
| struct oncrpc_reply *reply ); |
| int nfs_get_readlink_reply ( struct nfs_readlink_reply *readlink_reply, |
| struct oncrpc_reply *reply ); |
| int nfs_get_read_reply ( struct nfs_read_reply *read_reply, |
| struct oncrpc_reply *reply ); |
| |
| #endif /* _IPXE_NFS_H */ |