iPXE
Macros | Functions
nfs.c File Reference

Network File System protocol. More...

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <libgen.h>
#include <byteswap.h>
#include <ipxe/time.h>
#include <ipxe/iobuf.h>
#include <ipxe/open.h>
#include <ipxe/features.h>
#include <ipxe/nfs.h>
#include <ipxe/oncrpc.h>
#include <ipxe/oncrpc_iob.h>
#include <ipxe/portmap.h>
#include <ipxe/mount.h>
#include <ipxe/settings.h>

Go to the source code of this file.

Macros

#define NFS_LOOKUP   3
 NFS LOOKUP procedure. More...
 
#define NFS_READLINK   5
 NFS READLINK procedure. More...
 
#define NFS_READ   6
 NFS READ procedure. More...
 

Functions

 FILE_SECBOOT (FORBIDDEN)
 
size_t nfs_iob_get_fh (struct io_buffer *io_buf, struct nfs_fh *fh)
 Extract a file handle from the beginning of an I/O buffer. More...
 
size_t nfs_iob_add_fh (struct io_buffer *io_buf, const struct nfs_fh *fh)
 Add a file handle to the end of an I/O buffer. More...
 
int nfs_lookup (struct interface *intf, struct oncrpc_session *session, const struct nfs_fh *fh, const char *filename)
 Send a LOOKUP request. More...
 
int nfs_readlink (struct interface *intf, struct oncrpc_session *session, const struct nfs_fh *fh)
 Send a READLINK request. More...
 
int nfs_read (struct interface *intf, struct oncrpc_session *session, const struct nfs_fh *fh, uint64_t offset, uint32_t count)
 Send a READ request. More...
 
int nfs_get_lookup_reply (struct nfs_lookup_reply *lookup_reply, struct oncrpc_reply *reply)
 Parse a LOOKUP reply. More...
 
int nfs_get_readlink_reply (struct nfs_readlink_reply *readlink_reply, struct oncrpc_reply *reply)
 Parse a READLINK reply. More...
 
int nfs_get_read_reply (struct nfs_read_reply *read_reply, struct oncrpc_reply *reply)
 Parse a READ reply. More...
 

Detailed Description

Network File System protocol.

Definition in file nfs.c.

Macro Definition Documentation

◆ NFS_LOOKUP

#define NFS_LOOKUP   3

NFS LOOKUP procedure.

Definition at line 48 of file nfs.c.

◆ NFS_READLINK

#define NFS_READLINK   5

NFS READLINK procedure.

Definition at line 50 of file nfs.c.

◆ NFS_READ

#define NFS_READ   6

NFS READ procedure.

Definition at line 52 of file nfs.c.

Function Documentation

◆ FILE_SECBOOT()

FILE_SECBOOT ( FORBIDDEN  )

◆ nfs_iob_get_fh()

size_t nfs_iob_get_fh ( struct io_buffer io_buf,
struct nfs_fh fh 
)

Extract a file handle from the beginning of an I/O buffer.

Parameters
io_bufI/O buffer
fhFile handle
Return values
sizeSize of the data read

Definition at line 61 of file nfs.c.

61  {
62  fh->size = oncrpc_iob_get_int ( io_buf );
63 
64  if ( fh->size > 64 )
65  return sizeof ( uint32_t );
66 
67  memcpy (fh->fh, io_buf->data, fh->size );
68  iob_pull ( io_buf, fh->size );
69 
70  return fh->size + sizeof ( uint32_t );
71 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:107
uint8_t fh[64]
Definition: nfs.h:75
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define oncrpc_iob_get_int(buf)
Get a 32 bits integer from the beginning of an I/O buffer.
Definition: oncrpc_iob.h:38
size_t size
Definition: nfs.h:76
unsigned int uint32_t
Definition: stdint.h:12
void * data
Start of data.
Definition: iobuf.h:53

References io_buffer::data, nfs_fh::fh, iob_pull, memcpy(), oncrpc_iob_get_int, and nfs_fh::size.

Referenced by mount_get_mnt_reply(), and nfs_get_lookup_reply().

◆ nfs_iob_add_fh()

size_t nfs_iob_add_fh ( struct io_buffer io_buf,
const struct nfs_fh fh 
)

Add a file handle to the end of an I/O buffer.

Parameters
io_bufI/O buffer
fhFile handle
Return values
sizeSize of the data written

Definition at line 80 of file nfs.c.

80  {
81  size_t s;
82 
83  s = oncrpc_iob_add_int ( io_buf, fh->size );
84  memcpy ( iob_put ( io_buf, fh->size ), &fh->fh, fh->size );
85 
86  return s + fh->size;
87 }
#define iob_put(iobuf, len)
Definition: iobuf.h:125
uint8_t fh[64]
Definition: nfs.h:75
void * memcpy(void *dest, const void *src, size_t len) __nonnull
size_t size
Definition: nfs.h:76
static size_t oncrpc_iob_add_int(struct io_buffer *io_buf, uint32_t val)
Add a 32 bits integer to the end of an I/O buffer.
Definition: oncrpc_iob.h:83

References nfs_fh::fh, iob_put, memcpy(), oncrpc_iob_add_int(), and nfs_fh::size.

◆ nfs_lookup()

int nfs_lookup ( struct interface intf,
struct oncrpc_session session,
const struct nfs_fh fh,
const char *  filename 
)

Send a LOOKUP request.

Parameters
intfInterface to send the request on
sessionONC RPC session
fhThe file handle of the the directory
filenameThe file name
Return values
rcReturn status code

Definition at line 98 of file nfs.c.

99  {
100  struct oncrpc_field fields[] = {
101  ONCRPC_SUBFIELD ( array, fh->size, &fh->fh ),
102  ONCRPC_FIELD ( str, filename ),
104  };
105 
106  return oncrpc_call ( intf, session, NFS_LOOKUP, fields );
107 }
#define ONCRPC_FIELD(type, value)
Definition: oncrpc.h:28
#define NFS_LOOKUP
NFS LOOKUP procedure.
Definition: nfs.c:48
uint8_t fh[64]
Definition: nfs.h:75
int oncrpc_call(struct interface *intf, struct oncrpc_session *session, uint32_t proc_name, const struct oncrpc_field fields[])
Definition: oncrpc.c:129
size_t size
Definition: nfs.h:76
uint32_t array
Array number.
Definition: edd.h:31
#define ONCRPC_SUBFIELD(type, args...)
Definition: oncrpc.h:29
#define ONCRPC_FIELD_END
Definition: oncrpc.h:32

References array, nfs_fh::fh, NFS_LOOKUP, oncrpc_call(), ONCRPC_FIELD, ONCRPC_FIELD_END, ONCRPC_SUBFIELD, and nfs_fh::size.

Referenced by nfs_step().

◆ nfs_readlink()

int nfs_readlink ( struct interface intf,
struct oncrpc_session session,
const struct nfs_fh fh 
)

Send a READLINK request.

Parameters
intfInterface to send the request on
sessionONC RPC session
fhThe symlink file handle
Return values
rcReturn status code

Definition at line 117 of file nfs.c.

118  {
119  struct oncrpc_field fields[] = {
120  ONCRPC_SUBFIELD ( array, fh->size, &fh->fh ),
122  };
123 
124  return oncrpc_call ( intf, session, NFS_READLINK, fields );
125 }
uint8_t fh[64]
Definition: nfs.h:75
#define NFS_READLINK
NFS READLINK procedure.
Definition: nfs.c:50
int oncrpc_call(struct interface *intf, struct oncrpc_session *session, uint32_t proc_name, const struct oncrpc_field fields[])
Definition: oncrpc.c:129
size_t size
Definition: nfs.h:76
uint32_t array
Array number.
Definition: edd.h:31
#define ONCRPC_SUBFIELD(type, args...)
Definition: oncrpc.h:29
#define ONCRPC_FIELD_END
Definition: oncrpc.h:32

References array, nfs_fh::fh, NFS_READLINK, oncrpc_call(), ONCRPC_FIELD_END, ONCRPC_SUBFIELD, and nfs_fh::size.

Referenced by nfs_step().

◆ nfs_read()

int nfs_read ( struct interface intf,
struct oncrpc_session session,
const struct nfs_fh fh,
uint64_t  offset,
uint32_t  count 
)

Send a READ request.

Parameters
intfInterface to send the request on
sessionONC RPC session
fhThe file handle
offsetOffset
countByte count
Return values
rcReturn status code

Definition at line 137 of file nfs.c.

138  {
139  struct oncrpc_field fields[] = {
140  ONCRPC_SUBFIELD ( array, fh->size, &fh->fh ),
142  ONCRPC_FIELD ( int32, count ),
144  };
145 
146  return oncrpc_call ( intf, session, NFS_READ, fields );
147 }
#define ONCRPC_FIELD(type, value)
Definition: oncrpc.h:28
uint8_t fh[64]
Definition: nfs.h:75
int oncrpc_call(struct interface *intf, struct oncrpc_session *session, uint32_t proc_name, const struct oncrpc_field fields[])
Definition: oncrpc.c:129
int64_t int64
Definition: stdint.h:34
size_t size
Definition: nfs.h:76
uint32_t array
Array number.
Definition: edd.h:31
int32_t int32
Definition: stdint.h:32
static unsigned int count
Number of entries.
Definition: dwmac.h:225
#define ONCRPC_SUBFIELD(type, args...)
Definition: oncrpc.h:29
#define ONCRPC_FIELD_END
Definition: oncrpc.h:32
#define NFS_READ
NFS READ procedure.
Definition: nfs.c:52
uint16_t offset
Offset to command line.
Definition: bzimage.h:8

References array, count, nfs_fh::fh, NFS_READ, offset, oncrpc_call(), ONCRPC_FIELD, ONCRPC_FIELD_END, ONCRPC_SUBFIELD, and nfs_fh::size.

Referenced by nfs_step().

◆ nfs_get_lookup_reply()

int nfs_get_lookup_reply ( struct nfs_lookup_reply lookup_reply,
struct oncrpc_reply reply 
)

Parse a LOOKUP reply.

Parameters
lookup_replyA structure where the data will be saved
replyThe ONC RPC reply to get data from
Return values
rcReturn status code

Definition at line 156 of file nfs.c.

157  {
158  if ( ! lookup_reply || ! reply )
159  return -EINVAL;
160 
161  lookup_reply->status = oncrpc_iob_get_int ( reply->data );
162  switch ( lookup_reply->status )
163  {
164  case NFS3_OK:
165  break;
166  case NFS3ERR_PERM:
167  return -EPERM;
168  case NFS3ERR_NOENT:
169  return -ENOENT;
170  case NFS3ERR_IO:
171  return -EIO;
172  case NFS3ERR_ACCES:
173  return -EACCES;
174  case NFS3ERR_NOTDIR:
175  return -ENOTDIR;
176  case NFS3ERR_NAMETOOLONG:
177  return -ENAMETOOLONG;
178  case NFS3ERR_STALE:
179  return -ESTALE;
180  case NFS3ERR_BADHANDLE:
181  case NFS3ERR_SERVERFAULT:
182  default:
183  return -EPROTO;
184  }
185 
186  nfs_iob_get_fh ( reply->data, &lookup_reply->fh );
187 
188  if ( oncrpc_iob_get_int ( reply->data ) == 1 )
189  lookup_reply->ent_type = oncrpc_iob_get_int ( reply->data );
190 
191  return 0;
192 }
#define NFS3ERR_NAMETOOLONG
Filename too long.
Definition: nfs.h:46
#define EINVAL
Invalid argument.
Definition: errno.h:429
uint32_t status
Reply status.
Definition: nfs.h:85
#define NFS3_OK
No error.
Definition: nfs.h:22
struct nfs_fh fh
File handle.
Definition: nfs.h:89
#define ENOENT
No such file or directory.
Definition: errno.h:515
#define EACCES
Permission denied.
Definition: errno.h:299
enum nfs_attr_type ent_type
Entity type.
Definition: nfs.h:87
#define oncrpc_iob_get_int(buf)
Get a 32 bits integer from the beginning of an I/O buffer.
Definition: oncrpc_iob.h:38
#define NFS3ERR_SERVERFAULT
An error occurred on the server which does not map to any of the legal NFS version 3 protocol error v...
Definition: nfs.h:61
#define NFS3ERR_PERM
Not owner.
Definition: nfs.h:24
#define ENOTDIR
Not a directory.
Definition: errno.h:575
#define EPROTO
Protocol error.
Definition: errno.h:625
size_t nfs_iob_get_fh(struct io_buffer *io_buf, struct nfs_fh *fh)
Extract a file handle from the beginning of an I/O buffer.
Definition: nfs.c:61
#define NFS3ERR_IO
I/O error.
Definition: nfs.h:28
#define EPERM
Operation not permitted.
Definition: errno.h:615
#define NFS3ERR_NOENT
No such file or directory.
Definition: nfs.h:26
#define EIO
Input/output error.
Definition: errno.h:434
#define NFS3ERR_BADHANDLE
Illegal NFS file handle.
Definition: nfs.h:52
#define ENAMETOOLONG
Filename too long.
Definition: errno.h:474
#define NFS3ERR_STALE
Invalid file handle.
Definition: nfs.h:48
#define ESTALE
Stale file handle.
Definition: errno.h:660
#define NFS3ERR_ACCES
Permission denied.
Definition: nfs.h:32
struct io_buffer * data
Definition: oncrpc.h:68
#define NFS3ERR_NOTDIR
Not a directory.
Definition: nfs.h:40

References oncrpc_reply::data, EACCES, EINVAL, EIO, ENAMETOOLONG, ENOENT, ENOTDIR, nfs_lookup_reply::ent_type, EPERM, EPROTO, ESTALE, nfs_lookup_reply::fh, NFS3_OK, NFS3ERR_ACCES, NFS3ERR_BADHANDLE, NFS3ERR_IO, NFS3ERR_NAMETOOLONG, NFS3ERR_NOENT, NFS3ERR_NOTDIR, NFS3ERR_PERM, NFS3ERR_SERVERFAULT, NFS3ERR_STALE, nfs_iob_get_fh(), oncrpc_iob_get_int, and nfs_lookup_reply::status.

Referenced by nfs_deliver().

◆ nfs_get_readlink_reply()

int nfs_get_readlink_reply ( struct nfs_readlink_reply readlink_reply,
struct oncrpc_reply reply 
)

Parse a READLINK reply.

Parameters
readlink_replyA structure where the data will be saved
replyThe ONC RPC reply to get data from
Return values
rcReturn status code

Definition at line 200 of file nfs.c.

201  {
202  if ( ! readlink_reply || ! reply )
203  return -EINVAL;
204 
205  readlink_reply->status = oncrpc_iob_get_int ( reply->data );
206  switch ( readlink_reply->status )
207  {
208  case NFS3_OK:
209  break;
210  case NFS3ERR_IO:
211  return -EIO;
212  case NFS3ERR_ACCES:
213  return -EACCES;
214  case NFS3ERR_INVAL:
215  return -EINVAL;
216  case NFS3ERR_NOTSUPP:
217  return -ENOTSUP;
218  case NFS3ERR_STALE:
219  return -ESTALE;
220  case NFS3ERR_BADHANDLE:
221  case NFS3ERR_SERVERFAULT:
222  default:
223  return -EPROTO;
224  }
225 
226  if ( oncrpc_iob_get_int ( reply->data ) == 1 )
227  iob_pull ( reply->data, 5 * sizeof ( uint32_t ) +
228  8 * sizeof ( uint64_t ) );
229 
230  readlink_reply->path_len = oncrpc_iob_get_int ( reply->data );
231  readlink_reply->path = reply->data->data;
232 
233  return 0;
234 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:107
#define EINVAL
Invalid argument.
Definition: errno.h:429
#define NFS3_OK
No error.
Definition: nfs.h:22
unsigned long long uint64_t
Definition: stdint.h:13
#define EACCES
Permission denied.
Definition: errno.h:299
#define ENOTSUP
Operation not supported.
Definition: errno.h:590
#define oncrpc_iob_get_int(buf)
Get a 32 bits integer from the beginning of an I/O buffer.
Definition: oncrpc_iob.h:38
#define NFS3ERR_SERVERFAULT
An error occurred on the server which does not map to any of the legal NFS version 3 protocol error v...
Definition: nfs.h:61
#define EPROTO
Protocol error.
Definition: errno.h:625
#define NFS3ERR_IO
I/O error.
Definition: nfs.h:28
#define NFS3ERR_NOTSUPP
Operation not supported.
Definition: nfs.h:56
unsigned int uint32_t
Definition: stdint.h:12
void * data
Start of data.
Definition: iobuf.h:53
#define EIO
Input/output error.
Definition: errno.h:434
#define NFS3ERR_BADHANDLE
Illegal NFS file handle.
Definition: nfs.h:52
#define NFS3ERR_STALE
Invalid file handle.
Definition: nfs.h:48
#define NFS3ERR_INVAL
Invalid argument.
Definition: nfs.h:44
#define ESTALE
Stale file handle.
Definition: errno.h:660
#define NFS3ERR_ACCES
Permission denied.
Definition: nfs.h:32
struct io_buffer * data
Definition: oncrpc.h:68

References io_buffer::data, oncrpc_reply::data, EACCES, EINVAL, EIO, ENOTSUP, EPROTO, ESTALE, iob_pull, NFS3_OK, NFS3ERR_ACCES, NFS3ERR_BADHANDLE, NFS3ERR_INVAL, NFS3ERR_IO, NFS3ERR_NOTSUPP, NFS3ERR_SERVERFAULT, NFS3ERR_STALE, oncrpc_iob_get_int, nfs_readlink_reply::path, nfs_readlink_reply::path_len, and nfs_readlink_reply::status.

Referenced by nfs_deliver().

◆ nfs_get_read_reply()

int nfs_get_read_reply ( struct nfs_read_reply read_reply,
struct oncrpc_reply reply 
)

Parse a READ reply.

Parameters
read_replyA structure where the data will be saved
replyThe ONC RPC reply to get data from
Return values
rcReturn status code

Definition at line 243 of file nfs.c.

244  {
245  if ( ! read_reply || ! reply )
246  return -EINVAL;
247 
248  read_reply->status = oncrpc_iob_get_int ( reply->data );
249  switch ( read_reply->status )
250  {
251  case NFS3_OK:
252  break;
253  case NFS3ERR_PERM:
254  return -EPERM;
255  case NFS3ERR_NOENT:
256  return -ENOENT;
257  case NFS3ERR_IO:
258  return -EIO;
259  case NFS3ERR_NXIO:
260  return -ENXIO;
261  case NFS3ERR_ACCES:
262  return -EACCES;
263  case NFS3ERR_INVAL:
264  return -EINVAL;
265  case NFS3ERR_STALE:
266  return -ESTALE;
267  case NFS3ERR_BADHANDLE:
268  case NFS3ERR_SERVERFAULT:
269  default:
270  return -EPROTO;
271  }
272 
273  if ( oncrpc_iob_get_int ( reply->data ) == 1 )
274  {
275  iob_pull ( reply->data, 5 * sizeof ( uint32_t ) );
276  read_reply->filesize = oncrpc_iob_get_int64 ( reply->data );
277  iob_pull ( reply->data, 7 * sizeof ( uint64_t ) );
278  }
279 
280  read_reply->count = oncrpc_iob_get_int ( reply->data );
281  read_reply->eof = oncrpc_iob_get_int ( reply->data );
282  read_reply->data_len = oncrpc_iob_get_int ( reply->data );
283  read_reply->data = reply->data->data;
284 
285  if ( read_reply->count != read_reply->data_len )
286  return -EPROTO;
287 
288  return 0;
289 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:107
#define EINVAL
Invalid argument.
Definition: errno.h:429
uint32_t status
Reply status.
Definition: nfs.h:112
uint32_t count
Bytes read.
Definition: nfs.h:116
#define oncrpc_iob_get_int64(buf)
Get a 64 bits integer from the beginning of an I/O buffer.
Definition: oncrpc_iob.h:52
#define NFS3_OK
No error.
Definition: nfs.h:22
#define ENOENT
No such file or directory.
Definition: errno.h:515
unsigned long long uint64_t
Definition: stdint.h:13
#define EACCES
Permission denied.
Definition: errno.h:299
uint32_t eof
End-of-File indicator.
Definition: nfs.h:118
#define oncrpc_iob_get_int(buf)
Get a 32 bits integer from the beginning of an I/O buffer.
Definition: oncrpc_iob.h:38
#define NFS3ERR_SERVERFAULT
An error occurred on the server which does not map to any of the legal NFS version 3 protocol error v...
Definition: nfs.h:61
#define NFS3ERR_PERM
Not owner.
Definition: nfs.h:24
#define EPROTO
Protocol error.
Definition: errno.h:625
#define NFS3ERR_NXIO
No such device or address.
Definition: nfs.h:30
uint32_t data_len
Data length.
Definition: nfs.h:120
#define NFS3ERR_IO
I/O error.
Definition: nfs.h:28
unsigned int uint32_t
Definition: stdint.h:12
#define EPERM
Operation not permitted.
Definition: errno.h:615
#define ENXIO
No such device or address.
Definition: errno.h:600
#define NFS3ERR_NOENT
No such file or directory.
Definition: nfs.h:26
void * data
Start of data.
Definition: iobuf.h:53
#define EIO
Input/output error.
Definition: errno.h:434
#define NFS3ERR_BADHANDLE
Illegal NFS file handle.
Definition: nfs.h:52
#define NFS3ERR_STALE
Invalid file handle.
Definition: nfs.h:48
void * data
Data read.
Definition: nfs.h:122
#define NFS3ERR_INVAL
Invalid argument.
Definition: nfs.h:44
#define ESTALE
Stale file handle.
Definition: errno.h:660
#define NFS3ERR_ACCES
Permission denied.
Definition: nfs.h:32
struct io_buffer * data
Definition: oncrpc.h:68
uint64_t filesize
File size.
Definition: nfs.h:114

References nfs_read_reply::count, io_buffer::data, oncrpc_reply::data, nfs_read_reply::data, nfs_read_reply::data_len, EACCES, EINVAL, EIO, ENOENT, ENXIO, nfs_read_reply::eof, EPERM, EPROTO, ESTALE, nfs_read_reply::filesize, iob_pull, NFS3_OK, NFS3ERR_ACCES, NFS3ERR_BADHANDLE, NFS3ERR_INVAL, NFS3ERR_IO, NFS3ERR_NOENT, NFS3ERR_NXIO, NFS3ERR_PERM, NFS3ERR_SERVERFAULT, NFS3ERR_STALE, oncrpc_iob_get_int, oncrpc_iob_get_int64, and nfs_read_reply::status.

Referenced by nfs_deliver().