All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] Subject: [PATCH v2] Support for sending DHCP client options
@ 2010-10-20 16:48 Gray Remlin
  0 siblings, 0 replies; only message in thread
From: Gray Remlin @ 2010-10-20 16:48 UTC (permalink / raw)
  To: u-boot


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@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;
--

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2010-10-20 16:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-20 16:48 [U-Boot] Subject: [PATCH v2] Support for sending DHCP client options Gray Remlin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.