[U-Boot] Subject: [PATCH v2] Support for sending DHCP client options
Gray Remlin
g_remlin at rocketmail.com
Wed Oct 20 18:48:29 CEST 2010
If CONFIG_BOOTP_OPTIONS is defined at compile-time, the environment
will be checked for the supported DHCPv4 client options during
construction of a "DHCP Discover" or "DHCP Request" packet. Any
found (as listed below, prefixed with dhcp_) will have their value
included in the dhcp packet.
dhcp_vendor-class-identifier
dhcp_user-class
dhcp_dhcp-client-identifier
Signed-off-by: Gray Remlin <g_remlin at rocketmail.com>
---
v2: Remove redundant return value from dhcp_options_prep function
Change dhcp_options_prep function return type to static void
Correct grammatical error in README
README | 7 +++++++
common/cmd_nvedit.c | 3 +++
net/bootp.c | 51
+++++++++++++++++++++++++++++++++++++++++++++++++++
tools/env/fw_env.c | 4 +++-
4 files changed, 64 insertions(+), 1 deletions(-)
diff --git a/README b/README
index a52f3bf..cd892cc 100644
--- a/README
+++ b/README
@@ -1279,6 +1279,7 @@ The following options need to be configured:
CONFIG_BOOTP_NTPSERVER
CONFIG_BOOTP_TIMEOFFSET
CONFIG_BOOTP_VENDOREX
+ CONFIG_BOOTP_OPTIONS
CONFIG_BOOTP_SERVERIP - TFTP server will be the serverip
environment variable, not the BOOTP server.
@@ -1299,6 +1300,12 @@ The following options need to be configured:
of the "hostname" environment variable is passed as
option 12 to the DHCP server.
+ CONFIG_BOOTP_OPTIONS - The environment is checked for the
+ supported DHCPv4 client options (prefixed with dhcp_), any
+ found are sent during a "DHCP Discover" and "DHCP Request".
+ The DHCP server can use this information to conditionally
+ tailor its response.
+
CONFIG_BOOTP_DHCP_REQUEST_DELAY
A 32bit value in microseconds for a delay between
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index 3d30c32..2094e8e 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -224,6 +224,9 @@ int _do_env_set (int flag, int argc, char * const
argv[])
if (ep) { /* variable exists */
#ifndef CONFIG_ENV_OVERWRITE
if ((strcmp (name, "serial#") == 0) ||
+#if defined(CONFIG_BOOTP_OPTIONS)
+ (strcmp(name, "dhcp_vendor-class-identifier") == 0) ||
+#endif /* CONFIG_BOOTP_OPTIONS */
((strcmp (name, "ethaddr") == 0)
#if defined(CONFIG_OVERWRITE_ETHADDR_ONCE) && defined(CONFIG_ETHADDR)
&& (strcmp (ep->data,MK_STR(CONFIG_ETHADDR)) != 0)
diff --git a/net/bootp.c b/net/bootp.c
index 1289e3b..61ecede 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -68,6 +68,53 @@ extern u8 *dhcp_vendorex_prep (u8 *e); /*rtn new e
after add own opts. */
extern u8 *dhcp_vendorex_proc (u8 *e); /*rtn next e if mine,else NULL */
#endif
+#if defined(CONFIG_BOOTP_OPTIONS) /* check environment for dhcp client
options */
+
+/*
+ * The vendor-specifiable options should not be changeable
+ * unless CONFIG_ENV_OVERWRITE has been defined, however
+ * user-specifiable options should be changeable regardless
+ */
+static void dhcp_options_prep(u8 **ep)
+{
+ u8 *e = *ep;
+ char *ptr;
+
+ debug("DHCP Client options start\n");
+
+ /* vendor-specifiable identification string */
+ if ((ptr = getenv("dhcp_vendor-class-identifier"))) {
+ debug("dhcp_vendor-class-identifier=%s\n",ptr);
+ *e++ = 60;
+ *e++ = strlen(ptr);
+ while (*ptr)
+ *e++ = *ptr++;
+ }
+
+ /* user-specifiable identification string */
+ if ((ptr = getenv("dhcp_dhcp-client-identifier"))) {
+ debug("dhcp_dhcp-client-identifier=%s\n",ptr);
+ *e++ = 61;
+ *e++ = strlen(ptr);
+ while (*ptr)
+ *e++ = *ptr++;
+ }
+
+ /* user-specifiable identification string */
+ if ((ptr = getenv("dhcp_user-class"))) {
+ debug("dhcp_user-class=%s\n",ptr);
+ *e++ = 77;
+ *e++ = strlen(ptr);
+ while (*ptr)
+ *e++ = *ptr++;
+ }
+
+ *ep = e;
+ debug("DHCP Client options end\n");
+}
+
+#endif /* CONFIG_BOOTP_OPTIONS */
+
#endif
static int BootpCheckPkt(uchar *pkt, unsigned dest, unsigned src,
unsigned len)
@@ -412,6 +459,10 @@ static int DhcpExtended (u8 * e, int message_type,
IPaddr_t ServerID, IPaddr_t R
}
#endif
+#if defined(CONFIG_BOOTP_OPTIONS)
+ dhcp_options_prep (&e);
+#endif
+
#if defined(CONFIG_BOOTP_VENDOREX)
if ((x = dhcp_vendorex_prep (e)))
return x - start;
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index 8ff7052..ae37d15 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -391,9 +391,11 @@ int fw_env_write(char *name, char *value)
*/
if (oldval) {
/*
- * Ethernet Address and serial# can be set only once
+ * Ethernet Address, vendor DHCP options,
+ * and serial# can be set only once
*/
if ((strcmp (name, "ethaddr") == 0) ||
+ (strcmp(name, "dhcp_vendor-class-identifier") ==
0) ||
(strcmp (name, "serial#") == 0)) {
fprintf (stderr, "Can't overwrite \"%s\"\n", name);
errno = EROFS;
--
More information about the U-Boot
mailing list