Skip to content
Open
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
9 changes: 8 additions & 1 deletion docs/efidp_make_generic.3
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
.SH NAME
efidp_make_generic, efidp_make_end_instance, efidp_make_end_entire,
efidp_make_vendor, efidp_make_file, efidp_make_hd, efidp_make_nvme,
efidp_make_sas, efidp_make_ipv4, efidp_make_mac_addr, efidp_make_sata,
efidp_make_sas, efidp_make_ipv4, efidp_make_ipv6, efidp_make_mac_addr, efidp_make_sata,
efidp_make_scsi, efidp_make_acpi_hid, efidp_make_acpi_hid_ex, efidp_make_edd10,
efidp_make_pci, efidp_make_hw_vendor, efidp_make_msg_vendor, efidp_make_media_vendor \-
Create EFI Device Path node data structures for specific device types
Expand Down Expand Up @@ -62,6 +62,13 @@ Format EFI Device Path structures as printable strings.
uint16_t \fIlocal_port\fB, uint16_t \fIremote_port\fB,
uint16_t \fIprotocol\fB, int \fIis_static\fB);\fR

\fBssize_t \fRefidp_make_ipv6\fB(\kZuint8_t *\fIbuf\fB, ssize_t \fIsize\fB,
.ta \nZu
uint8_t *\fIlocal\fB, uint8_t *\fIremote\fB,
uint8_t *\fIgateway\fB, uint8_t \fIprefix_length\fB,
uint16_t \fIlocal_port\fB, uint16_t \fIremote_port\fB,
uint16_t \fIprotocol\fB, uint8_t \fIaddr_origin\fB);\fR

\fBssize_t \fRefidp_make_mac_addr\fB(\kZuint8_t *\fIbuf\fB, ssize_t \fIsize\fB,
.ta \nZu
uint8_t \fIif_type\fB,
Expand Down
62 changes: 62 additions & 0 deletions src/creator.c
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,68 @@ efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
return off;
}

static ssize_t NONNULL(3, 4, 5)
make_ipv6_path(uint8_t *buf, ssize_t size,
const char * const local_addr UNUSED,
const char * const remote_addr UNUSED,
const char * const gateway_addr UNUSED,
uint8_t prefix_length UNUSED,
uint16_t local_port UNUSED,
uint16_t remote_port UNUSED,
uint16_t protocol UNUSED,
uint8_t addr_origin)
{
ssize_t ret;

ret = efidp_make_ipv6(buf, size, 0, 0, 0, 64, 0, 0, 0, addr_origin);
if (ret < 0)
efi_error("could not make ipv6 DP node");
return ret;
}

ssize_t NONNULL(3, 4, 5, 6) PUBLIC
efi_generate_ipv6_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,
uint8_t prefix_length,
uint16_t local_port,
uint16_t remote_port,
uint16_t protocol,
uint8_t addr_origin)
{
ssize_t off = 0;
ssize_t sz;

sz = make_mac_path(buf, size, ifname);
if (sz < 0) {
efi_error("could not make MAC DP node");
return -1;
}
off += sz;

sz = make_ipv6_path(buf+off, size?size-off:0,
local_addr, remote_addr,
gateway_addr, prefix_length,
local_port, remote_port,
protocol, addr_origin);
if (sz < 0) {
efi_error("could not make IPV6 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");
return -1;
}
off += sz;

return off;
}

uint32_t PUBLIC
efi_get_libefiboot_version(void)
{
Expand Down
31 changes: 31 additions & 0 deletions src/dp-message.c
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,37 @@ efidp_make_ipv4(uint8_t *buf, ssize_t size, uint32_t local, uint32_t remote,
return sz;
}

ssize_t PUBLIC
efidp_make_ipv6(uint8_t *buf, ssize_t size,
uint8_t *local_ipv6_addr, uint8_t *remote_ipv6_addr,
uint8_t *gateway_ipv6_addr, uint8_t prefix_length,
uint16_t local_port, uint16_t remote_port,
uint16_t protocol, uint8_t addr_origin)
{
efidp_ipv6_addr *ipv6 = (efidp_ipv6_addr *)buf;
ssize_t sz = efidp_make_generic(buf, size, EFIDP_MESSAGE_TYPE,
EFIDP_MSG_IPv6, sizeof (*ipv6));
ssize_t req = sizeof (*ipv6);
if (size && sz == req) {
memcpy(ipv6->local_ipv6_addr, local_ipv6_addr,
sizeof(ipv6->local_ipv6_addr));
memcpy(ipv6->remote_ipv6_addr, remote_ipv6_addr,
sizeof(ipv6->remote_ipv6_addr));
ipv6->local_port = htons(local_port);
ipv6->remote_port = htons(remote_port);
ipv6->protocol = htons(protocol);
ipv6->ip_addr_origin = addr_origin;
ipv6->prefix_length = prefix_length;
memcpy(ipv6->gateway_ipv6_addr, gateway_ipv6_addr,
sizeof(ipv6->gateway_ipv6_addr));
}

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

return sz;
}

ssize_t PUBLIC
efidp_make_scsi(uint8_t *buf, ssize_t size, uint16_t target, uint16_t lun)
{
Expand Down
13 changes: 13 additions & 0 deletions src/include/efivar/efiboot-creator.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,19 @@ 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_ipv6_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,
uint8_t prefix_length,
uint16_t local_port,
uint16_t remote_port,
uint16_t protocol,
uint8_t addr_origin)
__attribute__((__nonnull__ (3,4,5,6)))
__attribute__((__visibility__ ("default")));

#ifdef __cplusplus
} /* extern "C" */
#endif
Expand Down
5 changes: 5 additions & 0 deletions src/include/efivar/efivar-dp.h
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,11 @@ typedef struct {
uint8_t prefix_length;
uint8_t gateway_ipv6_addr[16];
} EFIVAR_PACKED efidp_ipv6_addr;
extern ssize_t efidp_make_ipv6(uint8_t *buf, ssize_t size,
uint8_t *local_ipv6_addr, uint8_t *remote_ipv6_addr,
uint8_t *gateway_ipv6_addr, uint8_t prefix_length,
uint16_t local_port, uint16_t remote_port,
uint16_t protocol, uint8_t addr_origin);

#define EFIDP_IPv6_ORIGIN_MANUAL 0x00
#define EFIDP_IPv6_ORIGIN_STATIC 0x00
Expand Down