iPXE
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.
static int nvo_realloc (struct nvo_block *nvo, size_t len)
 Reallocate non-volatile stored options block.
static int nvo_realloc_dhcpopt (struct dhcp_options *options, size_t len)
 Reallocate non-volatile stored options DHCP option block.
static int nvo_load (struct nvo_block *nvo)
 Load non-volatile stored options from non-volatile storage device.
static int nvo_save (struct nvo_block *nvo)
 Save non-volatile stored options back to non-volatile storage device.
int nvo_applies (struct settings *settings __unused, const struct setting *setting)
 Check applicability of NVO setting.
static int nvo_store (struct settings *settings, const struct setting *setting, const void *data, size_t len)
 Store value of NVO setting.
static int nvo_fetch (struct settings *settings, struct setting *setting, void *data, size_t len)
 Fetch value of NVO setting.
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.
int register_nvo (struct nvo_block *nvo, struct settings *parent)
 Register non-volatile stored options.
void unregister_nvo (struct nvo_block *nvo)
 Unregister non-volatile stored options.

Variables

static struct settings_operations nvo_settings_operations
 NVO settings operations.

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()

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}
unsigned char uint8_t
Definition stdint.h:10
uint8_t data[48]
Additional event data.
Definition ena.h:11
size_t len
Length of options data.
Definition nvo.h:31
void * data
Option-containing data.
Definition nvo.h:33

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

Referenced by nvo_load(), and nvo_save().

◆ nvo_realloc()

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}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
ring len
Length.
Definition dwmac.h:226
#define DBGC(...)
Definition compiler.h:505
#define ENOMEM
Not enough space.
Definition errno.h:535
void * realloc(void *old_ptr, size_t new_size)
Reallocate memory.
Definition malloc.c:607
void * data
Option block raw data.
Definition dhcpopts.h:18
size_t used_len
Option block used length.
Definition dhcpopts.h:20
size_t alloc_len
Option block allocated length.
Definition dhcpopts.h:22
struct dhcp_options dhcpopts
DHCP options block.
Definition nvo.h:43

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

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

◆ nvo_realloc_dhcpopt()

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 =
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}
static int options
Definition 3c515.c:286
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
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
#define container_of(ptr, type, field)
Get containing structure.
Definition stddef.h:36
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

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()

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}
void dhcpopt_update_used_len(struct dhcp_options *options)
Recalculate length of DHCP options block.
Definition dhcpopts.c:421
void * memset(void *dest, int character, size_t len) __nonnull
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
unsigned int address
Address within NVS device.
Definition nvo.h:29
struct nvs_device * nvs
Underlying non-volatile storage device.
Definition nvo.h:27

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()

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}
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
uint8_t checksum
Checksum.
Definition pnpbios.c:12

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 ) &&
205}
int dhcpopt_applies(unsigned int tag)
Check applicability of DHCP option setting.
Definition dhcpopts.c:360
A setting.
Definition settings.h:24
const struct settings_scope * scope
Setting scope (or NULL)
Definition settings.h:50
uint64_t tag
Setting tag, if applicable.
Definition settings.h:44

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

Referenced by efi_snp_hii_setting_applies().

◆ nvo_store()

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}
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
static int nvo_save(struct nvo_block *nvo)
Save non-volatile stored options back to non-volatile storage device.
Definition nvo.c:173
A settings block.
Definition settings.h:133

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

◆ nvo_fetch()

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}
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(* resize )(struct nvo_block *nvo, size_t len),
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}
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:13
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
static int nvo_realloc_dhcpopt(struct dhcp_options *options, size_t len)
Reallocate non-volatile stored options DHCP option block.
Definition nvo.c:98
static struct settings_operations nvo_settings_operations
NVO settings operations.
Definition nvo.c:258
struct settings settings
Settings block.
Definition nvo.h:25
A reference counter.
Definition refcnt.h:27

References address, nvo_block::address, dhcpopt_init(), nvo_block::dhcpopts, len, nvo_block::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}
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

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 {
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

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,
}
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
int nvo_applies(struct settings *settings __unused, const struct setting *setting)
Check applicability of NVO setting.
Definition nvo.c:200

NVO settings operations.

Definition at line 258 of file nvo.c.

258 {
259 .applies = nvo_applies,
260 .store = nvo_store,
261 .fetch = nvo_fetch,
262};

Referenced by nvo_init().