summaryrefslogtreecommitdiffstats
path: root/discover
diff options
context:
space:
mode:
Diffstat (limited to 'discover')
-rw-r--r--discover/device-handler.c1
-rw-r--r--discover/device-handler.h1
-rw-r--r--discover/network.c13
-rw-r--r--discover/network.h3
-rw-r--r--discover/pxe-parser.c18
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);
}
OpenPOWER on IntegriCloud