Skip to content

Commit 3cc2eaa

Browse files
committed
Implement Uri device path
efidp_make_uri() implements Uri device path used when generating a IPv4 device path. efi_generate_ipv4_device_path() being public hence not modifiable, a new version called efi_generate_ipv4_device_path_with_uri() enables to specify the Uri. Signed-off-by: Renaud Métrich <rmetrich@redhat.com>
1 parent 90f2d19 commit 3cc2eaa

4 files changed

Lines changed: 74 additions & 10 deletions

File tree

src/creator.c

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -458,16 +458,17 @@ make_ipv4_path(uint8_t *buf, ssize_t size,
458458
}
459459

460460
ssize_t NONNULL(3, 4, 5, 6, 7) PUBLIC
461-
efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
462-
const char * const ifname,
463-
const char * const local_addr,
464-
const char * const remote_addr,
465-
const char * const gateway_addr,
466-
const char * const netmask,
467-
uint16_t local_port,
468-
uint16_t remote_port,
469-
uint16_t protocol,
470-
uint8_t addr_origin)
461+
efi_generate_ipv4_device_path_with_uri(uint8_t *buf, ssize_t size,
462+
const char * const ifname,
463+
const char * const local_addr,
464+
const char * const remote_addr,
465+
const char * const gateway_addr,
466+
const char * const netmask,
467+
uint16_t local_port,
468+
uint16_t remote_port,
469+
uint16_t protocol,
470+
uint8_t addr_origin,
471+
const char * const uri)
471472
{
472473
ssize_t off = 0;
473474
ssize_t sz;
@@ -488,6 +489,15 @@ efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
488489
}
489490
off += sz;
490491

492+
if (uri) {
493+
sz = efidp_make_uri(buf+off, size?size-off:0, uri);
494+
if (sz < 0) {
495+
efi_error("could not make URI DP node");
496+
return -1;
497+
}
498+
off += sz;
499+
}
500+
491501
sz = efidp_make_end_entire(buf+off, size?size-off:0);
492502
if (sz < 0) {
493503
efi_error("could not make EndEntire DP node");
@@ -498,6 +508,24 @@ efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
498508
return off;
499509
}
500510

511+
ssize_t NONNULL(3, 4, 5, 6, 7) PUBLIC
512+
efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
513+
const char * const ifname,
514+
const char * const local_addr,
515+
const char * const remote_addr,
516+
const char * const gateway_addr,
517+
const char * const netmask,
518+
uint16_t local_port,
519+
uint16_t remote_port,
520+
uint16_t protocol,
521+
uint8_t addr_origin)
522+
{
523+
return efi_generate_ipv4_device_path_with_uri(buf, size, ifname,
524+
local_addr, remote_addr, gateway_addr, netmask,
525+
local_port, remote_port, protocol, addr_origin,
526+
NULL);
527+
}
528+
501529
uint32_t PUBLIC
502530
efi_get_libefiboot_version(void)
503531
{

src/dp-message.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,25 @@ efidp_make_mac_addr(uint8_t *buf, ssize_t size, uint8_t if_type,
638638
return sz;
639639
}
640640

641+
ssize_t NONNULL(3) PUBLIC
642+
efidp_make_uri(uint8_t *buf, ssize_t size, const char * const uristring)
643+
{
644+
efidp_uri *uri = (efidp_uri *)buf;
645+
size_t urilen = strlen(uristring);
646+
ssize_t req = offsetof(efidp_uri, uri) + urilen;
647+
648+
ssize_t sz = efidp_make_generic(buf, size, EFIDP_MESSAGE_TYPE,
649+
EFIDP_MSG_URI, req);
650+
if (size && sz == req) {
651+
memcpy(uri->uri, (uint8_t *)uristring, urilen);
652+
}
653+
654+
if (sz < 0)
655+
efi_error("efidp_make_generic failed");
656+
657+
return sz;
658+
}
659+
641660
ssize_t PUBLIC
642661
efidp_make_ipv4(uint8_t *buf, ssize_t size, uint32_t local, uint32_t remote,
643662
uint32_t gateway, uint32_t netmask,

src/include/efivar/efiboot-creator.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,21 @@ extern ssize_t efi_generate_ipv4_device_path(uint8_t *buf, ssize_t size,
4747
__attribute__((__nonnull__ (3,4,5,6,7)))
4848
__attribute__((__visibility__ ("default")));
4949

50+
extern ssize_t efi_generate_ipv4_device_path_with_uri(
51+
uint8_t *buf, ssize_t size,
52+
const char * const ifname,
53+
const char * const local_addr,
54+
const char * const remote_addr,
55+
const char * const gateway_addr,
56+
const char * const netmask,
57+
uint16_t local_port,
58+
uint16_t remote_port,
59+
uint16_t protocol,
60+
uint8_t addr_origin,
61+
const char * const uri)
62+
__attribute__((__nonnull__ (3,4,5,6,7)))
63+
__attribute__((__visibility__ ("default")));
64+
5065
#ifdef __cplusplus
5166
} /* extern "C" */
5267
#endif

src/include/efivar/efivar-dp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,8 @@ typedef struct {
651651
efidp_header header;
652652
uint8_t uri[];
653653
} EFIVAR_PACKED efidp_uri;
654+
extern ssize_t efidp_make_uri(uint8_t *buf, ssize_t size,
655+
const char * const uristring);
654656

655657
#define EFIDP_MSG_UFS 0x19
656658
typedef struct {

0 commit comments

Comments
 (0)