[PATCH 5/6] udhcp: Add DHCP address scheme client config

Samuel Mendoza-Jonas sam at mendozajonas.com
Tue May 8 06:30:24 UTC 2018


Allow the DHCP address scheme to be set in the client config so that it
is known in common functions used by both udhcpc and udhcpc6.

Signed-off-by: Samuel Mendoza-Jonas <sam at mendozajonas.com>
---
 networking/udhcp/common.c   | 7 ++++---
 networking/udhcp/common.h   | 8 +++++++-
 networking/udhcp/d6_dhcpc.c | 4 +++-
 networking/udhcp/dhcpc.c    | 4 +++-
 networking/udhcp/dhcpc.h    | 1 +
 networking/udhcp/dhcpd.c    | 2 +-
 6 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/networking/udhcp/common.c b/networking/udhcp/common.c
index fbf9c6878..2fdec1d55 100644
--- a/networking/udhcp/common.c
+++ b/networking/udhcp/common.c
@@ -383,7 +383,8 @@ static NOINLINE void attach_option(
 		struct option_set **opt_list,
 		const struct dhcp_optflag *optflag,
 		char *buffer,
-		int length)
+		int length,
+		enum client_addr_type addr_type)
 {
 	struct option_set *existing;
 	char *allocated = NULL;
@@ -450,7 +451,7 @@ static NOINLINE void attach_option(
 	free(allocated);
 }
 
-int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg, const struct dhcp_optflag *optflags, const char *option_strings)
+int FAST_FUNC udhcp_str2optset(const char *const_str, void *arg, const struct dhcp_optflag *optflags, const char *option_strings, enum client_addr_type addr_type)
 {
 	struct option_set **opt_list = arg;
 	char *opt;
@@ -601,7 +602,7 @@ case_OPTION_STRING:
 		}
 
 		if (retval)
-			attach_option(opt_list, optflag, opt, length);
+			attach_option(opt_list, optflag, opt, length, addr_type);
 	} while (retval && (optflag->flags & OPTION_LIST));
 
 	return retval;
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h
index 13059f106..e8c3dc2af 100644
--- a/networking/udhcp/common.h
+++ b/networking/udhcp/common.h
@@ -181,6 +181,11 @@ enum {
 #define DHCP_MINTYPE DHCPDISCOVER
 #define DHCP_MAXTYPE DHCPINFORM
 
+enum client_addr_type {
+	CLIENT_CONFIG_DHCPV4,
+	CLIENT_CONFIG_DHCPV6,
+};
+
 struct dhcp_optflag {
 	uint8_t flags;
 	uint8_t code;
@@ -293,7 +298,8 @@ int FAST_FUNC udhcp_str2nip(const char *str, void *arg);
 int FAST_FUNC udhcp_str2optset(const char *str,
 		void *arg,
 		const struct dhcp_optflag *optflags,
-		const char *option_strings);
+		const char *option_strings,
+		enum client_addr_type addr_type);
 
 #if ENABLE_UDHCPC || ENABLE_UDHCPD
 void udhcp_init_header(struct dhcp_packet *packet, char type) FAST_FUNC;
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
index 3ba2c4be5..0b6c4b28a 100644
--- a/networking/udhcp/d6_dhcpc.c
+++ b/networking/udhcp/d6_dhcpc.c
@@ -1161,6 +1161,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
 	IF_FEATURE_UDHCP_PORT(SERVER_PORT6 = 547;)
 	IF_FEATURE_UDHCP_PORT(CLIENT_PORT6 = 546;)
 	client_config.interface = "eth0";
+	client_config.dhcp_type = CLIENT_CONFIG_DHCPV6;
 	client_config.script = CONFIG_UDHCPC_DEFAULT_SCRIPT;
 
 	/* Parse command line */
@@ -1217,7 +1218,8 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
 	}
 	while (list_x) {
 		char *optstr = xstrdup(llist_pop(&list_x));
-		udhcp_str2optset(optstr, &client_config.options, d6_optflags, d6_option_strings);
+		udhcp_str2optset(optstr, &client_config.options, d6_optflags, d6_option_strings,
+				client_config.dhcp_type);
 		free(optstr);
 	}
 
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index bd9e8fdc2..73f044b6d 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -1265,6 +1265,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
 	IF_FEATURE_UDHCP_PORT(SERVER_PORT = 67;)
 	IF_FEATURE_UDHCP_PORT(CLIENT_PORT = 68;)
 	client_config.interface = "eth0";
+	client_config.dhcp_type = CLIENT_CONFIG_DHCPV4;
 	client_config.script = CONFIG_UDHCPC_DEFAULT_SCRIPT;
 	str_V = "udhcp "BB_VER;
 
@@ -1337,7 +1338,8 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
 	}
 	while (list_x) {
 		char *optstr = xstrdup(llist_pop(&list_x));
-		udhcp_str2optset(optstr, &client_config.options, dhcp_optflags, dhcp_option_strings);
+		udhcp_str2optset(optstr, &client_config.options, dhcp_optflags, dhcp_option_strings,
+				client_config.dhcp_type);
 		free(optstr);
 	}
 
diff --git a/networking/udhcp/dhcpc.h b/networking/udhcp/dhcpc.h
index 7fdbc9a6c..c6ab1225e 100644
--- a/networking/udhcp/dhcpc.h
+++ b/networking/udhcp/dhcpc.h
@@ -21,6 +21,7 @@ struct client_config_t {
 	uint8_t *vendorclass;           /* Optional vendor class-id to use */
 	uint8_t *hostname;              /* Optional hostname to use */
 	uint8_t *fqdn;                  /* Optional fully qualified domain name to use */
+	enum client_addr_type dhcp_type;
 
 	uint16_t first_secs;
 	uint16_t last_secs;
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index 19f94a2d7..54cf30a83 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -362,7 +362,7 @@ static int FAST_FUNC read_staticlease(const char *const_line, void *arg)
 }
 
 static int FAST_FUNC read_optset(const char *line, void *arg) {
-	return udhcp_str2optset(line, arg, dhcp_optflags, dhcp_option_strings);
+	return udhcp_str2optset(line, arg, dhcp_optflags, dhcp_option_strings, CLIENT_CONFIG_DHCPV4);
 }
 
 struct config_keyword {
-- 
2.17.0



More information about the busybox mailing list