Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Implement optional Uri option to Netboot entry #217

Draft
wants to merge 6 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 38 additions & 10 deletions src/creator.c
Original file line number Diff line number Diff line change
Expand Up @@ -458,16 +458,17 @@ make_ipv4_path(uint8_t *buf, ssize_t size,
}

ssize_t NONNULL(3, 4, 5, 6, 7) PUBLIC
efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
const char * const ifname,
const char * const local_addr,
const char * const remote_addr,
const char * const gateway_addr,
const char * const netmask,
uint16_t local_port,
uint16_t remote_port,
uint16_t protocol,
uint8_t addr_origin)
efi_generate_ipv4_device_path_with_uri(uint8_t *buf, ssize_t size,
const char * const ifname,
const char * const local_addr,
const char * const remote_addr,
const char * const gateway_addr,
const char * const netmask,
uint16_t local_port,
uint16_t remote_port,
uint16_t protocol,
uint8_t addr_origin,
const char * const uri)
{
ssize_t off = 0;
ssize_t sz;
Expand All @@ -488,6 +489,15 @@ efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
}
off += sz;

if (uri) {
sz = efidp_make_uri(buf+off, size?size-off:0, uri);
if (sz < 0) {
efi_error("could not make URI DP node");
return -1;
}
off += sz;
}

sz = efidp_make_end_entire(buf+off, size?size-off:0);
if (sz < 0) {
efi_error("could not make EndEntire DP node");
Expand All @@ -498,6 +508,24 @@ efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
return off;
}

ssize_t NONNULL(3, 4, 5, 6, 7) PUBLIC
efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
const char * const ifname,
const char * const local_addr,
const char * const remote_addr,
const char * const gateway_addr,
const char * const netmask,
uint16_t local_port,
uint16_t remote_port,
uint16_t protocol,
uint8_t addr_origin)
{
return efi_generate_ipv4_device_path_with_uri(buf, size, ifname,
local_addr, remote_addr, gateway_addr, netmask,
local_port, remote_port, protocol, addr_origin,
NULL);
}

uint32_t PUBLIC
efi_get_libefiboot_version(void)
{
Expand Down
20 changes: 20 additions & 0 deletions src/dp-message.c
Original file line number Diff line number Diff line change
Expand Up @@ -628,6 +628,7 @@ efidp_make_mac_addr(uint8_t *buf, ssize_t size, uint8_t if_type,
ssize_t req = sizeof (*mac);
if (size && sz == req) {
mac->if_type = if_type;
memset(mac->mac_addr, 0, 32);
memcpy(mac->mac_addr, mac_addr,
mac_addr_size > 32 ? 32 : mac_addr_size);
}
Expand All @@ -638,6 +639,25 @@ efidp_make_mac_addr(uint8_t *buf, ssize_t size, uint8_t if_type,
return sz;
}

ssize_t NONNULL(3) PUBLIC
efidp_make_uri(uint8_t *buf, ssize_t size, const char * const uristring)
{
efidp_uri *uri = (efidp_uri *)buf;
size_t urilen = strlen(uristring);
ssize_t req = offsetof(efidp_uri, uri) + urilen;

ssize_t sz = efidp_make_generic(buf, size, EFIDP_MESSAGE_TYPE,
EFIDP_MSG_URI, req);
if (size && sz == req) {
memcpy(uri->uri, (uint8_t *)uristring, urilen);
}

if (sz < 0)
efi_error("efidp_make_generic failed");

return sz;
}

ssize_t PUBLIC
efidp_make_ipv4(uint8_t *buf, ssize_t size, uint32_t local, uint32_t remote,
uint32_t gateway, uint32_t netmask,
Expand Down
2 changes: 1 addition & 1 deletion src/efivar.c
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ usage(int ret)
" -a, --append append to variable specified by --name\n"
" -f, --datafile=<file> load or save variable contents from <file>\n"
" -e, --export=<file> export variable to <file>\n"
" -i, --import=<file> import variable from <file\n"
" -i, --import=<file> import variable from <file>\n"
" -L, --list-guids show internal guid list\n"
" -w, --write write to variable specified by --name\n\n"
"Help options:\n"
Expand Down
15 changes: 15 additions & 0 deletions src/include/efivar/efiboot-creator.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,21 @@ extern ssize_t efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
__attribute__((__nonnull__ (3,4,5,6,7)))
__attribute__((__visibility__ ("default")));

extern ssize_t efi_generate_ipv4_device_path_with_uri(
uint8_t *buf, ssize_t size,
const char * const ifname,
const char * const local_addr,
const char * const remote_addr,
const char * const gateway_addr,
const char * const netmask,
uint16_t local_port,
uint16_t remote_port,
uint16_t protocol,
uint8_t addr_origin,
const char * const uri)
__attribute__((__nonnull__ (3,4,5,6,7)))
__attribute__((__visibility__ ("default")));

#ifdef __cplusplus
} /* extern "C" */
#endif
Expand Down
2 changes: 2 additions & 0 deletions src/include/efivar/efivar-dp.h
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,8 @@ typedef struct {
efidp_header header;
uint8_t uri[];
} EFIVAR_PACKED efidp_uri;
extern ssize_t efidp_make_uri(uint8_t *buf, ssize_t size,
const char * const uristring);

#define EFIDP_MSG_UFS 0x19
typedef struct {
Expand Down
2 changes: 1 addition & 1 deletion src/include/version.mk
Original file line number Diff line number Diff line change
@@ -1 +1 @@
VERSION=38
VERSION=39
Loading