1 #ifndef _IPXE_NFS_H
2 #define _IPXE_NFS_H
3 
4 #include <stdint.h>
5 #include <ipxe/oncrpc.h>
6 
7 /** @file
8  *
9  * Network File System protocol.
10  *
11  */
12 
13 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
14 
15 /** NFS protocol number */
16 #define ONCRPC_NFS 100003
17 
18 /** NFS protocol version */
19 #define NFS_VERS   3
20 
21 /** No error*/
22 #define NFS3_OK             0
23 /** Not owner */
24 #define NFS3ERR_PERM        1
25 /** No such file or directory */
26 #define NFS3ERR_NOENT       2
27 /** I/O error */
28 #define NFS3ERR_IO          5
29 /** No such device or address */
30 #define NFS3ERR_NXIO        6
31 /** Permission denied */
32 #define NFS3ERR_ACCES       13
33 /** The file specified already exists */
34 #define NFS3ERR_EXIST       17
35 /**  Attempt to do a cross-device hard link */
36 #define NFS3ERR_XDEV        18
37 /** No such device */
38 #define NFS3ERR_NODEV       19
39 /** Not a directory */
40 #define NFS3ERR_NOTDIR      20
41  /**Is a directory */
42 #define NFS3ERR_ISDIR       21
43 /** Invalid argument */
44 #define NFS3ERR_INVAL       22
45 /** Filename too long */
46 #define NFS3ERR_NAMETOOLONG 63
47 /** Invalid file handle */
48 #define NFS3ERR_STALE       70
49 /** Too many levels of remote in path */
50 #define NFS3ERR_REMOTE      71
51 /** Illegal NFS file handle */
52 #define NFS3ERR_BADHANDLE   10001
53 /**  READDIR or READDIRPLUS cookie is stale */
54 #define NFS3ERR_BAD_COOKIE  10003
55 /** Operation not supported */
56 #define NFS3ERR_NOTSUPP     10004
57 /** Buffer or request is too small */
58 #define NFS3ERR_TOOSMALL    10005
59 /** An error occurred on the server which does not map to any  of the legal NFS
60  * version 3 protocol error values */
61 #define NFS3ERR_SERVERFAULT 10006
62 /** The server initiated the request, but was not able to complete it in a
63  * timely fashion */
64 #define NFS3ERR_JUKEBOX     10008
65 
66 enum nfs_attr_type {
67 	NFS_ATTR_SYMLINK = 5,
68 };
69 
70 /**
71  * A NFS file handle
72  *
73  */
74 struct nfs_fh {
75 	uint8_t               fh[64];
76 	size_t                size;
77 };
78 
79 /**
80  * A NFS LOOKUP reply
81  *
82  */
83 struct nfs_lookup_reply {
84 	/** Reply status */
85 	uint32_t             status;
86 	/** Entity type */
87 	enum nfs_attr_type   ent_type;
88 	/** File handle */
89 	struct nfs_fh        fh;
90 };
91 
92 /**
93  * A NFS READLINK reply
94  *
95  */
96 struct nfs_readlink_reply {
97 	/** Reply status */
98 	uint32_t             status;
99 	/** File path length */
100 	uint32_t             path_len;
101 	/** File path */
102 	char                 *path;
103 };
104 
105 
106 /**
107  * A NFS READ reply
108  *
109  */
110 struct nfs_read_reply {
111 	/** Reply status */
112 	uint32_t             status;
113 	/** File size */
114 	uint64_t             filesize;
115 	/** Bytes read */
116 	uint32_t             count;
117 	/** End-of-File indicator */
118 	uint32_t             eof;
119 	/** Data length */
120 	uint32_t             data_len;
121 	/** Data read */
122 	void                 *data;
123 };
124 
125 size_t nfs_iob_get_fh ( struct io_buffer *io_buf, struct nfs_fh *fh );
126 size_t nfs_iob_add_fh ( struct io_buffer *io_buf, const struct nfs_fh *fh );
127 
128 /**
129  * Prepare an ONC RPC session to be used as a NFS session
130  *
131  * @v session           ONC RPC session
132  * @v credential        ONC RPC credential
133  *
134  * The credential parameter must not be NULL, use 'oncrpc_auth_none' if you
135  * don't want a particular scheme to be used.
136  */
nfs_init_session(struct oncrpc_session * session,struct oncrpc_cred * credential)137 static inline void nfs_init_session ( struct oncrpc_session *session,
138                                       struct oncrpc_cred *credential ) {
139 	oncrpc_init_session ( session, credential, &oncrpc_auth_none,
140 	                      ONCRPC_NFS, NFS_VERS );
141 }
142 
143 int nfs_lookup ( struct interface *intf, struct oncrpc_session *session,
144                  const struct nfs_fh *fh, const char *filename );
145 int nfs_readlink ( struct interface *intf, struct oncrpc_session *session,
146                    const struct nfs_fh *fh );
147 int nfs_read ( struct interface *intf, struct oncrpc_session *session,
148                const struct nfs_fh *fh, uint64_t offset, uint32_t count );
149 
150 int nfs_get_lookup_reply ( struct nfs_lookup_reply *lookup_reply,
151                            struct oncrpc_reply *reply );
152 int nfs_get_readlink_reply ( struct nfs_readlink_reply *readlink_reply,
153                              struct oncrpc_reply *reply );
154 int nfs_get_read_reply ( struct nfs_read_reply *read_reply,
155                          struct oncrpc_reply *reply );
156 
157 #endif /* _IPXE_NFS_H */
158