[PATCH] discover: Format IPAPPEND mac addresses correctly

Samuel Mendoza-Jonas sam.mj at au1.ibm.com
Wed Dec 3 10:40:09 AEDT 2014


Update pxe-parser to format mac addresses correctly for
sysappend/ipappend, and update the associated test case.

Signed-off-by: Samuel Mendoza-Jonas <sam.mj at au1.ibm.com>
---
 discover/device-handler.c       |  1 +
 discover/device-handler.h       |  1 +
 discover/network.c              | 13 ++++++++++
 discover/network.h              |  3 +++
 discover/pxe-parser.c           | 18 +++++++++++---
 test/parser/Makefile.am         |  1 +
 test/parser/network.c           | 53 +++++++++++++++++++++++++++++++++++++++++
 test/parser/parser-test.h       |  1 +
 test/parser/test-pxe-ipappend.c |  6 ++---
 test/parser/utils.c             |  5 ++++
 10 files changed, 96 insertions(+), 6 deletions(-)
 create mode 100644 test/parser/network.c

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);
 		}
diff --git a/test/parser/Makefile.am b/test/parser/Makefile.am
index d24e720..8f32726 100644
--- a/test/parser/Makefile.am
+++ b/test/parser/Makefile.am
@@ -90,6 +90,7 @@ test_parser_libtest_ro_SOURCES = \
 	test/parser/main.c \
 	test/parser/utils.c \
 	test/parser/handler.c \
+	test/parser/network.c \
 	test/parser/parser-test.h \
 	discover/yaboot-parser.c \
 	discover/kboot-parser.c \
diff --git a/test/parser/network.c b/test/parser/network.c
new file mode 100644
index 0000000..9c57309
--- /dev/null
+++ b/test/parser/network.c
@@ -0,0 +1,53 @@
+#include <string.h>
+#include <types/types.h>
+#include <talloc/talloc.h>
+#include <sys/socket.h>
+#include <linux/if.h>
+#include "network.h"
+
+struct interface {
+	int	ifindex;
+	char	name[IFNAMSIZ];
+	uint8_t	hwaddr[HWADDR_SIZE];
+
+	enum {
+		IFSTATE_NEW,
+		IFSTATE_UP_WAITING_LINK,
+		IFSTATE_CONFIGURED,
+		IFSTATE_IGNORED,
+	} state;
+
+	struct list_item list;
+	struct process *udhcpc_process;
+	struct discover_device *dev;
+};
+
+static struct interface test = {
+	.name = "em1",
+	.hwaddr = {1,2,3,4,5,6},
+};
+
+static struct interface *find_interface_by_name(struct network *network,
+				const char *name)
+{
+	(void)network;
+
+	if (!strcmp(test.name, name))
+		return &test;
+
+	return NULL;
+}
+
+uint8_t *find_mac_by_name(void *ctx, struct network *network,
+		const char *name)
+{
+	struct interface *interface;
+	(void)network;
+
+	interface = find_interface_by_name(network, name);
+	if (!interface)
+		return NULL;
+
+	return talloc_memdup(ctx, &interface->hwaddr,
+			     sizeof(uint8_t) * HWADDR_SIZE);
+}
diff --git a/test/parser/parser-test.h b/test/parser/parser-test.h
index c0339b8..21b5b9c 100644
--- a/test/parser/parser-test.h
+++ b/test/parser/parser-test.h
@@ -40,6 +40,7 @@ void test_add_dir(struct parser_test *test, struct discover_device *dev,
 void test_set_event_source(struct parser_test *test);
 void test_set_event_param(struct event *event, const char *name,
 		const char *value);
+void test_set_event_device(struct event *event, const char *dev);
 
 #define test_add_file_string(test, dev, filename, str) \
 	test_add_file_data(test, dev, filename, str, sizeof(str) - 1)
diff --git a/test/parser/test-pxe-ipappend.c b/test/parser/test-pxe-ipappend.c
index 4719b5c..3fec6a7 100644
--- a/test/parser/test-pxe-ipappend.c
+++ b/test/parser/test-pxe-ipappend.c
@@ -1,5 +1,6 @@
 
 #include "parser-test.h"
+#include "network.h"
 
 #if 0 /* PARSER_EMBEDDED_CONFIG */
 default linux
@@ -20,8 +21,7 @@ void run_test(struct parser_test *test)
 	test_set_event_source(test);
 	test_set_event_param(test->ctx->event, "pxeconffile",
 			"tftp://host/dir/conf.txt");
-	test_set_event_param(test->ctx->event, "mac",
-			"01:02:03:04:05:06");
+	test_set_event_device(test->ctx->event, "em1");
 
 	test_run_parser(test, "pxe");
 
@@ -31,5 +31,5 @@ void run_test(struct parser_test *test)
 	opt = get_boot_option(ctx, 0);
 
 	check_name(opt, "linux");
-	check_args(opt, "command line BOOTIF=01:02:03:04:05:06");
+	check_args(opt, "command line BOOTIF=01-01-02-03-04-05-06");
 }
diff --git a/test/parser/utils.c b/test/parser/utils.c
index 8a6314b..0050d13 100644
--- a/test/parser/utils.c
+++ b/test/parser/utils.c
@@ -207,6 +207,11 @@ void test_set_event_param(struct event *event, const char *name,
         event_set_param(event, name, value);
 }
 
+void test_set_event_device(struct event *event, const char *dev)
+{
+	event->device = talloc_strdup(event, dev);
+}
+
 int parser_request_file(struct discover_context *ctx,
 		struct discover_device *dev, const char *filename,
 		char **buf, int *len)
-- 
1.9.3



More information about the Petitboot mailing list