iPXE
Functions | Variables
nvo.c File Reference

Non-volatile stored options. More...

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <ipxe/dhcp.h>
#include <ipxe/nvs.h>
#include <ipxe/nvo.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
static unsigned int nvo_checksum (struct nvo_block *nvo)
 Calculate checksum over non-volatile stored options. More...
 
static int nvo_realloc (struct nvo_block *nvo, size_t len)
 Reallocate non-volatile stored options block. More...
 
static int nvo_realloc_dhcpopt (struct dhcp_options *options, size_t len)
 Reallocate non-volatile stored options DHCP option block. More...
 
static int nvo_load (struct nvo_block *nvo)
 Load non-volatile stored options from non-volatile storage device. More...
 
static int nvo_save (struct nvo_block *nvo)
 Save non-volatile stored options back to non-volatile storage device. More...
 
int nvo_applies (struct settings *settings __unused, const struct setting *setting)
 Check applicability of NVO setting. More...
 
static int nvo_store (struct settings *settings, const struct setting *setting, const void *data, size_t len)
 Store value of NVO setting. More...
 
static int nvo_fetch (struct settings *settings, struct setting *setting, void *data, size_t len)
 Fetch value of NVO setting. More...
 
void nvo_init (struct nvo_block *nvo, struct nvs_device *nvs, size_t address, size_t len, int(*resize)(struct nvo_block *nvo, size_t len), struct refcnt *refcnt)
 Initialise non-volatile stored options. More...
 
int register_nvo (struct nvo_block *nvo, struct settings *parent)
 Register non-volatile stored options. More...
 
void unregister_nvo (struct nvo_block *nvo)
 Unregister non-volatile stored options. More...
 

Variables

static struct settings_operations nvo_settings_operations
 NVO settings operations. More...
 

Detailed Description

Non-volatile stored options.

Definition in file nvo.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ nvo_checksum()

static unsigned int nvo_checksum ( struct nvo_block nvo)
static

Calculate checksum over non-volatile stored options.

Parameters
nvoNon-volatile options block
Return values
sumChecksum

Definition at line 47 of file nvo.c.

47  {
48  uint8_t *data = nvo->data;
49  uint8_t sum = 0;
50  unsigned int i;
51 
52  for ( i = 0 ; i < nvo->len ; i++ ) {
53  sum += *(data++);
54  }
55  return sum;
56 }
void * data
Option-containing data.
Definition: nvo.h:33
unsigned char uint8_t
Definition: stdint.h:10
uint8_t data[48]
Additional event data.
Definition: ena.h:22
size_t len
Length of options data.
Definition: nvo.h:31

References data, nvo_block::data, and nvo_block::len.

Referenced by nvo_load(), and nvo_save().

◆ nvo_realloc()

static int nvo_realloc ( struct nvo_block nvo,
size_t  len 
)
static

Reallocate non-volatile stored options block.

Parameters
nvoNon-volatile options block
lenNew length
Return values
rcReturn status code

Definition at line 65 of file nvo.c.

65  {
66  void *new_data;
67 
68  /* Reallocate data */
69  new_data = realloc ( nvo->data, len );
70  if ( ! new_data ) {
71  DBGC ( nvo, "NVO %p could not allocate %zd bytes\n",
72  nvo, len );
73  return -ENOMEM;
74  }
75  nvo->data = new_data;
76  nvo->len = len;
77 
78  /* Update DHCP option block */
79  if ( len ) {
80  nvo->dhcpopts.data = ( nvo->data + 1 /* checksum */ );
81  nvo->dhcpopts.alloc_len = ( len - 1 /* checksum */ );
82  } else {
83  nvo->dhcpopts.data = NULL;
84  nvo->dhcpopts.used_len = 0;
85  nvo->dhcpopts.alloc_len = 0;
86  }
87 
88  return 0;
89 }
struct dhcp_options dhcpopts
DHCP options block.
Definition: nvo.h:43
#define DBGC(...)
Definition: compiler.h:505
void * data
Option-containing data.
Definition: nvo.h:33
size_t alloc_len
Option block allocated length.
Definition: dhcpopts.h:22
#define ENOMEM
Not enough space.
Definition: errno.h:535
ring len
Length.
Definition: dwmac.h:231
void * data
Option block raw data.
Definition: dhcpopts.h:18
void * realloc(void *old_ptr, size_t new_size)
Reallocate memory.
Definition: malloc.c:607
size_t len
Length of options data.
Definition: nvo.h:31
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
size_t used_len
Option block used length.
Definition: dhcpopts.h:20

References dhcp_options::alloc_len, dhcp_options::data, nvo_block::data, DBGC, nvo_block::dhcpopts, ENOMEM, nvo_block::len, len, NULL, realloc(), and dhcp_options::used_len.

Referenced by nvo_realloc_dhcpopt(), register_nvo(), and unregister_nvo().

◆ nvo_realloc_dhcpopt()

static int nvo_realloc_dhcpopt ( struct dhcp_options options,
size_t  len 
)
static

Reallocate non-volatile stored options DHCP option block.

Parameters
optionsDHCP option block
lenNew length
Return values
rcReturn status code

Definition at line 98 of file nvo.c.

98  {
99  struct nvo_block *nvo =
100  container_of ( options, struct nvo_block, dhcpopts );
101  int rc;
102 
103  /* Refuse to reallocate if we have no way to resize the block */
104  if ( ! nvo->resize )
105  return dhcpopt_no_realloc ( options, len );
106 
107  /* Allow one byte for the checksum (if any data is present) */
108  if ( len )
109  len += 1;
110 
111  /* Resize underlying non-volatile options block */
112  if ( ( rc = nvo->resize ( nvo, len ) ) != 0 ) {
113  DBGC ( nvo, "NVO %p could not resize to %zd bytes: %s\n",
114  nvo, len, strerror ( rc ) );
115  return rc;
116  }
117 
118  /* Reallocate in-memory options block */
119  if ( ( rc = nvo_realloc ( nvo, len ) ) != 0 )
120  return rc;
121 
122  return 0;
123 }
struct dhcp_options dhcpopts
DHCP options block.
Definition: nvo.h:43
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
static int options
Definition: 3c515.c:286
ring len
Length.
Definition: dwmac.h:231
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
A block of non-volatile stored options.
Definition: nvo.h:23
int(* resize)(struct nvo_block *nvo, size_t len)
Resize non-volatile stored option block.
Definition: nvo.h:41
int dhcpopt_no_realloc(struct dhcp_options *options, size_t len)
Refuse to reallocate DHCP option block.
Definition: dhcpopts.c:185
static int nvo_realloc(struct nvo_block *nvo, size_t len)
Reallocate non-volatile stored options block.
Definition: nvo.c:65

References container_of, DBGC, dhcpopt_no_realloc(), nvo_block::dhcpopts, len, nvo_realloc(), options, rc, nvo_block::resize, and strerror().

Referenced by nvo_init().

◆ nvo_load()

static int nvo_load ( struct nvo_block nvo)
static

Load non-volatile stored options from non-volatile storage device.

Parameters
nvoNon-volatile options block
Return values
rcReturn status code

Definition at line 131 of file nvo.c.

131  {
132  uint8_t *options_data = nvo->dhcpopts.data;
133  int rc;
134 
135  /* Skip reading zero-length NVO fields */
136  if ( nvo->len == 0 ) {
137  DBGC ( nvo, "NVO %p is empty; skipping load\n", nvo );
138  return 0;
139  }
140 
141  /* Read data */
142  if ( ( rc = nvs_read ( nvo->nvs, nvo->address, nvo->data,
143  nvo->len ) ) != 0 ) {
144  DBGC ( nvo, "NVO %p could not read %zd bytes at %#04x: %s\n",
145  nvo, nvo->len, nvo->address, strerror ( rc ) );
146  return rc;
147  }
148 
149  /* If checksum fails, or options data starts with a zero,
150  * assume the whole block is invalid. This should capture the
151  * case of random initial contents.
152  */
153  if ( ( nvo_checksum ( nvo ) != 0 ) || ( options_data[0] == 0 ) ) {
154  DBGC ( nvo, "NVO %p has checksum %02x and initial byte %02x; "
155  "assuming empty\n", nvo, nvo_checksum ( nvo ),
156  options_data[0] );
157  memset ( nvo->data, 0, nvo->len );
158  }
159 
160  /* Rescan DHCP option block */
162 
163  DBGC ( nvo, "NVO %p loaded from non-volatile storage\n", nvo );
164  return 0;
165 }
struct dhcp_options dhcpopts
DHCP options block.
Definition: nvo.h:43
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
void * data
Option-containing data.
Definition: nvo.h:33
struct nvs_device * nvs
Underlying non-volatile storage device.
Definition: nvo.h:27
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
unsigned char uint8_t
Definition: stdint.h:10
unsigned int address
Address within NVS device.
Definition: nvo.h:29
void * data
Option block raw data.
Definition: dhcpopts.h:18
void dhcpopt_update_used_len(struct dhcp_options *options)
Recalculate length of DHCP options block.
Definition: dhcpopts.c:421
static unsigned int nvo_checksum(struct nvo_block *nvo)
Calculate checksum over non-volatile stored options.
Definition: nvo.c:47
int nvs_read(struct nvs_device *nvs, unsigned int address, void *data, size_t len)
Read from non-volatile storage device.
Definition: nvs.c:76
size_t len
Length of options data.
Definition: nvo.h:31
void * memset(void *dest, int character, size_t len) __nonnull

References nvo_block::address, dhcp_options::data, nvo_block::data, DBGC, dhcpopt_update_used_len(), nvo_block::dhcpopts, nvo_block::len, memset(), nvo_checksum(), nvo_block::nvs, nvs_read(), rc, and strerror().

Referenced by register_nvo().

◆ nvo_save()

static int nvo_save ( struct nvo_block nvo)
static

Save non-volatile stored options back to non-volatile storage device.

Parameters
nvoNon-volatile options block
Return values
rcReturn status code

Definition at line 173 of file nvo.c.

173  {
174  uint8_t *checksum = nvo->data;
175  int rc;
176 
177  /* Recalculate checksum, if applicable */
178  if ( nvo->len > 0 )
179  *checksum -= nvo_checksum ( nvo );
180 
181  /* Write data */
182  if ( ( rc = nvs_write ( nvo->nvs, nvo->address, nvo->data,
183  nvo->len ) ) != 0 ) {
184  DBGC ( nvo, "NVO %p could not write %zd bytes at %#04x: %s\n",
185  nvo, nvo->len, nvo->address, strerror ( rc ) );
186  return rc;
187  }
188 
189  DBGC ( nvo, "NVO %p saved to non-volatile storage\n", nvo );
190  return 0;
191 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint8_t checksum
Checksum.
Definition: pnpbios.c:37
#define DBGC(...)
Definition: compiler.h:505
int nvs_write(struct nvs_device *nvs, unsigned int address, const void *data, size_t len)
Write to non-volatile storage device.
Definition: nvs.c:141
void * data
Option-containing data.
Definition: nvo.h:33
struct nvs_device * nvs
Underlying non-volatile storage device.
Definition: nvo.h:27
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
unsigned char uint8_t
Definition: stdint.h:10
unsigned int address
Address within NVS device.
Definition: nvo.h:29
static unsigned int nvo_checksum(struct nvo_block *nvo)
Calculate checksum over non-volatile stored options.
Definition: nvo.c:47
size_t len
Length of options data.
Definition: nvo.h:31

References nvo_block::address, checksum, nvo_block::data, DBGC, nvo_block::len, nvo_checksum(), nvo_block::nvs, nvs_write(), rc, and strerror().

Referenced by nvo_store().

◆ nvo_applies()

int nvo_applies ( struct settings *settings  __unused,
const struct setting setting 
)

Check applicability of NVO setting.

Parameters
settingsSettings block
settingSetting
Return values
appliesSetting applies within this settings block

Definition at line 200 of file nvo.c.

201  {
202 
203  return ( ( setting->scope == NULL ) &&
204  dhcpopt_applies ( setting->tag ) );
205 }
uint64_t tag
Setting tag, if applicable.
Definition: settings.h:44
A setting.
Definition: settings.h:24
const struct settings_scope * scope
Setting scope (or NULL)
Definition: settings.h:50
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
int dhcpopt_applies(unsigned int tag)
Check applicability of DHCP option setting.
Definition: dhcpopts.c:360

References dhcpopt_applies(), NULL, setting::scope, and setting::tag.

Referenced by efi_snp_hii_setting_applies().

◆ nvo_store()

static int nvo_store ( struct settings settings,
const struct setting setting,
const void *  data,
size_t  len 
)
static

Store value of NVO setting.

Parameters
settingsSettings block
settingSetting to store
dataSetting data, or NULL to clear setting
lenLength of setting data
Return values
rcReturn status code

Definition at line 216 of file nvo.c.

217  {
218  struct nvo_block *nvo =
220  int rc;
221 
222  /* Update stored options */
223  if ( ( rc = dhcpopt_store ( &nvo->dhcpopts, setting->tag,
224  data, len ) ) != 0 ) {
225  DBGC ( nvo, "NVO %p could not store %zd bytes: %s\n",
226  nvo, len, strerror ( rc ) );
227  return rc;
228  }
229 
230  /* Save updated options to NVS */
231  if ( ( rc = nvo_save ( nvo ) ) != 0 )
232  return rc;
233 
234  return 0;
235 }
struct dhcp_options dhcpopts
DHCP options block.
Definition: nvo.h:43
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
uint64_t tag
Setting tag, if applicable.
Definition: settings.h:44
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
ring len
Length.
Definition: dwmac.h:231
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
A block of non-volatile stored options.
Definition: nvo.h:23
A settings block.
Definition: settings.h:133
A setting.
Definition: settings.h:24
static int nvo_save(struct nvo_block *nvo)
Save non-volatile stored options back to non-volatile storage device.
Definition: nvo.c:173
uint8_t data[48]
Additional event data.
Definition: ena.h:22
int dhcpopt_store(struct dhcp_options *options, unsigned int tag, const void *data, size_t len)
Store value of DHCP option setting.
Definition: dhcpopts.c:375

References container_of, data, DBGC, dhcpopt_store(), nvo_block::dhcpopts, len, nvo_save(), rc, strerror(), and setting::tag.

◆ nvo_fetch()

static int nvo_fetch ( struct settings settings,
struct setting setting,
void *  data,
size_t  len 
)
static

Fetch value of NVO setting.

Parameters
settingsSettings block
settingSetting to fetch
dataBuffer to fill with setting data
lenLength of buffer
Return values
lenLength of setting data, or negative error

The actual length of the setting will be returned even if the buffer was too small.

Definition at line 249 of file nvo.c.

250  {
251  struct nvo_block *nvo =
253 
254  return dhcpopt_fetch ( &nvo->dhcpopts, setting->tag, data, len );
255 }
struct dhcp_options dhcpopts
DHCP options block.
Definition: nvo.h:43
uint64_t tag
Setting tag, if applicable.
Definition: settings.h:44
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
ring len
Length.
Definition: dwmac.h:231
A block of non-volatile stored options.
Definition: nvo.h:23
A settings block.
Definition: settings.h:133
A setting.
Definition: settings.h:24
uint8_t data[48]
Additional event data.
Definition: ena.h:22
int dhcpopt_fetch(struct dhcp_options *options, unsigned int tag, void *data, size_t len)
Fetch value of DHCP option setting.
Definition: dhcpopts.c:394

References container_of, data, dhcpopt_fetch(), nvo_block::dhcpopts, len, and setting::tag.

◆ nvo_init()

void nvo_init ( struct nvo_block nvo,
struct nvs_device nvs,
size_t  address,
size_t  len,
int(*)(struct nvo_block *nvo, size_t len resize,
struct refcnt refcnt 
)

Initialise non-volatile stored options.

Parameters
nvoNon-volatile options block
nvsUnderlying non-volatile storage device
addressAddress within NVS device
lenLength of non-volatile options data
resizeResize method
refcntContaining object reference counter, or NULL

Definition at line 274 of file nvo.c.

277  {
278  nvo->nvs = nvs;
279  nvo->address = address;
280  nvo->len = len;
281  nvo->resize = resize;
284  refcnt, NULL );
285 }
struct dhcp_options dhcpopts
DHCP options block.
Definition: nvo.h:43
void dhcpopt_init(struct dhcp_options *options, void *data, size_t alloc_len, int(*realloc)(struct dhcp_options *options, size_t len))
Initialise prepopulated block of DHCP options.
Definition: dhcpopts.c:452
uint64_t address
Base address.
Definition: ena.h:24
static void settings_init(struct settings *settings, struct settings_operations *op, struct refcnt *refcnt, const struct settings_scope *default_scope)
Initialise a settings block.
Definition: settings.h:503
A reference counter.
Definition: refcnt.h:27
ring len
Length.
Definition: dwmac.h:231
static int nvo_realloc_dhcpopt(struct dhcp_options *options, size_t len)
Reallocate non-volatile stored options DHCP option block.
Definition: nvo.c:98
struct nvs_device * nvs
Underlying non-volatile storage device.
Definition: nvo.h:27
int(* resize)(struct nvo_block *nvo, size_t len)
Resize non-volatile stored option block.
Definition: nvo.h:41
struct settings settings
Settings block.
Definition: nvo.h:25
unsigned int address
Address within NVS device.
Definition: nvo.h:29
static struct settings_operations nvo_settings_operations
NVO settings operations.
Definition: nvo.c:258
size_t len
Length of options data.
Definition: nvo.h:31
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

References address, nvo_block::address, dhcpopt_init(), nvo_block::dhcpopts, nvo_block::len, len, NULL, nvo_realloc_dhcpopt(), nvo_settings_operations, nvo_block::nvs, nvo_block::resize, nvo_block::settings, and settings_init().

Referenced by falcon_probe_spi(), myri10ge_nv_init(), nvs_vpd_nvo_init(), and realtek_init_eeprom().

◆ register_nvo()

int register_nvo ( struct nvo_block nvo,
struct settings parent 
)

Register non-volatile stored options.

Parameters
nvoNon-volatile options block
parentParent settings block, or NULL
Return values
rcReturn status code

Definition at line 294 of file nvo.c.

294  {
295  int rc;
296 
297  /* Allocate memory for options */
298  if ( ( rc = nvo_realloc ( nvo, nvo->len ) ) != 0 )
299  goto err_realloc;
300 
301  /* Read data from NVS */
302  if ( ( rc = nvo_load ( nvo ) ) != 0 )
303  goto err_load;
304 
305  /* Register settings */
306  if ( ( rc = register_settings ( &nvo->settings, parent,
307  NVO_SETTINGS_NAME ) ) != 0 )
308  goto err_register;
309 
310  DBGC ( nvo, "NVO %p registered\n", nvo );
311  return 0;
312 
313  err_register:
314  err_load:
315  nvo_realloc ( nvo, 0 );
316  err_realloc:
317  return rc;
318 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DBGC(...)
Definition: compiler.h:505
struct settings settings
Settings block.
Definition: nvo.h:25
static int nvo_realloc(struct nvo_block *nvo, size_t len)
Reallocate non-volatile stored options block.
Definition: nvo.c:65
static int nvo_load(struct nvo_block *nvo)
Load non-volatile stored options from non-volatile storage device.
Definition: nvo.c:131
#define NVO_SETTINGS_NAME
Name of non-volatile options settings block.
Definition: nvo.h:47
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition: settings.c:476
size_t len
Length of options data.
Definition: nvo.h:31

References DBGC, nvo_block::len, nvo_load(), nvo_realloc(), NVO_SETTINGS_NAME, rc, register_settings(), and nvo_block::settings.

Referenced by efab_probe(), hermon_register_netdev(), myri10ge_nv_init(), and realtek_probe().

◆ unregister_nvo()

void unregister_nvo ( struct nvo_block nvo)

Unregister non-volatile stored options.

Parameters
nvoNon-volatile options block

Definition at line 325 of file nvo.c.

325  {
326  unregister_settings ( &nvo->settings );
327  nvo_realloc ( nvo, 0 );
328  DBGC ( nvo, "NVO %p unregistered\n", nvo );
329 }
void unregister_settings(struct settings *settings)
Unregister settings block.
Definition: settings.c:515
#define DBGC(...)
Definition: compiler.h:505
struct settings settings
Settings block.
Definition: nvo.h:25
static int nvo_realloc(struct nvo_block *nvo, size_t len)
Reallocate non-volatile stored options block.
Definition: nvo.c:65

References DBGC, nvo_realloc(), nvo_block::settings, and unregister_settings().

Referenced by efab_remove(), hermon_register_netdev(), hermon_unregister_netdev(), myri10ge_nv_fini(), and realtek_remove().

Variable Documentation

◆ nvo_settings_operations

struct settings_operations nvo_settings_operations
static
Initial value:
= {
.applies = nvo_applies,
.store = nvo_store,
.fetch = nvo_fetch,
}
int nvo_applies(struct settings *settings __unused, const struct setting *setting)
Check applicability of NVO setting.
Definition: nvo.c:200
static int nvo_fetch(struct settings *settings, struct setting *setting, void *data, size_t len)
Fetch value of NVO setting.
Definition: nvo.c:249
static int nvo_store(struct settings *settings, const struct setting *setting, const void *data, size_t len)
Store value of NVO setting.
Definition: nvo.c:216

NVO settings operations.

Definition at line 258 of file nvo.c.

Referenced by nvo_init().