diff options
author | Samuel Mendoza-Jonas <sam.mj@au1.ibm.com> | 2014-12-03 15:08:23 +1100 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2014-12-03 12:12:47 +0800 |
commit | 9c33c54f7b431074a7d0daddce34140044aaadf6 (patch) | |
tree | f726dca93146b8218f4c5711a49b4eb1fe49c12a /discover | |
parent | ba1633025d93d7b41bda9bd32fa1d2337c7c4365 (diff) | |
download | petitboot-9c33c54f7b431074a7d0daddce34140044aaadf6.zip petitboot-9c33c54f7b431074a7d0daddce34140044aaadf6.tar.gz |
discover/pxe: Format IPAPPEND mac addresses correctly
The SYSAPPEND/IPAPPEND option 2 in PXE configs requires
the MAC address of the booting interface to be appended
to the boot options. Previously we formatted this as
"BOOTIF=01:02:03:04:05:06",
but syslinux/pxelinux implementation use this format:
"BOOTIF=01-01-02-03-04-05-06",
where the leading '01' represents the hardware type.
The relevant part of the pxelinux doc is at:
http://www.syslinux.org/wiki/index.php/SYSLINUX#SYSAPPEND_bitmask
Signed-off-by: Samuel Mendoza-Jonas <sam.mj@au1.ibm.com>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover')
-rw-r--r-- | discover/device-handler.c | 1 | ||||
-rw-r--r-- | discover/device-handler.h | 1 | ||||
-rw-r--r-- | discover/network.c | 13 | ||||
-rw-r--r-- | discover/network.h | 3 | ||||
-rw-r--r-- | discover/pxe-parser.c | 18 |
5 files changed, 33 insertions, 3 deletions
diff --git a/discover/device-handler.c b/discover/device-handler.c index 7cf5263..64fc9fa 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -626,6 +626,7 @@ struct discover_context *device_handler_discover_context_create( ctx = talloc_zero(handler, struct discover_context); ctx->device = device; + ctx->network = handler->network; list_init(&ctx->boot_options); return ctx; diff --git a/discover/device-handler.h b/discover/device-handler.h index e8e71ad..b592c46 100644 --- a/discover/device-handler.h +++ b/discover/device-handler.h @@ -55,6 +55,7 @@ struct discover_context { struct discover_device *device; struct list boot_options; struct pb_url *conf_url; + struct network *network; void *test_data; }; diff --git a/discover/network.c b/discover/network.c index c9460ac..3946694 100644 --- a/discover/network.c +++ b/discover/network.c @@ -109,6 +109,19 @@ static struct interface *find_interface_by_name(struct network *network, return NULL; } +uint8_t *find_mac_by_name(void *ctx, struct network *network, + const char *name) +{ + struct interface *interface; + + interface = find_interface_by_name(network, name); + if (!interface) + return NULL; + + return talloc_memdup(ctx, &interface->hwaddr, + sizeof(uint8_t) * HWADDR_SIZE); +} + static int network_init_netlink(struct network *network) { struct sockaddr_nl addr; diff --git a/discover/network.h b/discover/network.h index bfd1ab1..e5e05d5 100644 --- a/discover/network.h +++ b/discover/network.h @@ -15,5 +15,8 @@ void network_register_device(struct network *network, void network_unregister_device(struct network *network, struct discover_device *dev); +uint8_t *find_mac_by_name(void *ctx, struct network *network, + const char *name); + #endif /* NETWORK_H */ diff --git a/discover/pxe-parser.c b/discover/pxe-parser.c index 0456f5b..95547c3 100644 --- a/discover/pxe-parser.c +++ b/discover/pxe-parser.c @@ -16,6 +16,7 @@ #include "paths.h" #include "event.h" #include "user-event.h" +#include "network.h" static const char *pxelinux_prefix = "pxelinux.cfg/"; @@ -79,6 +80,16 @@ static void pxe_append_string(struct discover_boot_option *opt, opt->option->boot_args = talloc_strdup(opt->option, str); } +static char *pxe_sysappend_mac(void *ctx, uint8_t *mac) +{ + if (!mac) + return NULL; + + return talloc_asprintf(ctx, + "BOOTIF=01-%02x-%02x-%02x-%02x-%02x-%02x", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); +} + static void pxe_process_sysappend(struct discover_context *ctx, struct discover_boot_option *opt, unsigned long val) @@ -90,9 +101,10 @@ static void pxe_process_sysappend(struct discover_context *ctx, return; if (val & 0x2) { - const char *mac = event_get_param(event, "mac"); - if (mac) { - str = talloc_asprintf(ctx, "BOOTIF=%s", mac); + uint8_t *mac = find_mac_by_name(ctx, ctx->network, + event->device); + str = pxe_sysappend_mac(ctx, mac); + if (str) { pxe_append_string(opt, str); talloc_free(str); } |