[U-Boot] [PATCH v3 0/3] Support for PXE options in DHCP requests

This patch series adds support for RFC 4578 compliant DHCP request options, which enhance the ability of DHCP servers to respond differently to different clients.
As an example, the last patch in this series enables support for the PXE DHCP options for the ca9x4_ct_vxp config.
changes in v2: - drop uuid.h in favor of common.h - alphabetical order for build targets
changes in v3: - add checks for NULL pointers in uuid conversion function
Jason Hobbs (3): lib: add uuid_str_to_bin for use with bootp and PXE uuid net: bootp: add PXE/RFC 4578 DHCP options support arm: ca9x4_ct_vxp: enable CONFIG_BOOTP_PXE
include/common.h | 3 ++ include/configs/ca9x4_ct_vxp.h | 5 ++++ lib/Makefile | 1 + lib/uuid.c | 53 ++++++++++++++++++++++++++++++++++++++++ net/bootp.c | 36 +++++++++++++++++++++++++++ 5 files changed, 98 insertions(+), 0 deletions(-) create mode 100644 lib/uuid.c

Signed-off-by: Jason Hobbs jason.hobbs@calxeda.com --- Changes for v2: - Move uuid_str_to_bin's prototype from uuid. to common.h - Place uuid.o make rule in sorted order and conditionalize
Changes for v3: - Check for NULL pointers in uuid conversion function
include/common.h | 3 +++ lib/Makefile | 1 + lib/uuid.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 0 deletions(-) create mode 100644 lib/uuid.c
diff --git a/include/common.h b/include/common.h index 1e21b7a..77c27a1 100644 --- a/include/common.h +++ b/include/common.h @@ -645,6 +645,9 @@ int strcmp_compar(const void *, const void *); /* lib/time.c */ void udelay (unsigned long);
+/* lib/uuid.c */ +void uuid_str_to_bin(const char *uuid, unsigned char *out); + /* lib/vsprintf.c */ ulong simple_strtoul(const char *cp,char **endp,unsigned int base); int strict_strtoul(const char *cp, unsigned int base, unsigned long *res); diff --git a/lib/Makefile b/lib/Makefile index afa6914..a8e0920 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -51,6 +51,7 @@ COBJS-$(CONFIG_SHA256) += sha256.o COBJS-y += string.o COBJS-y += strmhz.o COBJS-y += time.o +COBJS-$(CONFIG_BOOTP_PXE) += uuid.o COBJS-y += vsprintf.o COBJS-$(CONFIG_RBTREE) += rbtree.o
diff --git a/lib/uuid.c b/lib/uuid.c new file mode 100644 index 0000000..2270245 --- /dev/null +++ b/lib/uuid.c @@ -0,0 +1,53 @@ +/* + * Copyright 2011 Calxeda, Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include "common.h" + +/* + * 0 9 14 19 24 + * xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + * le le le be be + */ +void uuid_str_to_bin(const char *uuid, unsigned char *out) +{ + uint16_t tmp16; + uint32_t tmp32; + uint64_t tmp64; + + if (!uuid || !out) + return; + + tmp32 = cpu_to_le32(simple_strtoul(uuid, NULL, 16)); + memcpy(out, &tmp32, 4); + + tmp16 = cpu_to_le16(simple_strtoul(uuid + 9, NULL, 16)); + memcpy(out + 4, &tmp16, 2); + + tmp16 = cpu_to_le16(simple_strtoul(uuid + 14, NULL, 16)); + memcpy(out + 6, &tmp16, 2); + + tmp16 = cpu_to_be16(simple_strtoul(uuid + 19, NULL, 16)); + memcpy(out + 8, &tmp16, 2); + + tmp64 = cpu_to_be64(simple_strtoull(uuid + 24, NULL, 16)); + memcpy(out + 10, (char *)&tmp64 + 2, 6); +}

Dear "Jason Hobbs",
In message 1309366710-17400-2-git-send-email-jason.hobbs@calxeda.com you wrote:
Signed-off-by: Jason Hobbs jason.hobbs@calxeda.com
...
+void uuid_str_to_bin(const char *uuid, unsigned char *out) +{
- uint16_t tmp16;
- uint32_t tmp32;
- uint64_t tmp64;
- if (!uuid || !out)
return;
- tmp32 = cpu_to_le32(simple_strtoul(uuid, NULL, 16));
- memcpy(out, &tmp32, 4);
- tmp16 = cpu_to_le16(simple_strtoul(uuid + 9, NULL, 16));
- memcpy(out + 4, &tmp16, 2);
- tmp16 = cpu_to_le16(simple_strtoul(uuid + 14, NULL, 16));
- memcpy(out + 6, &tmp16, 2);
- tmp16 = cpu_to_be16(simple_strtoul(uuid + 19, NULL, 16));
- memcpy(out + 8, &tmp16, 2);
- tmp64 = cpu_to_be64(simple_strtoull(uuid + 24, NULL, 16));
- memcpy(out + 10, (char *)&tmp64 + 2, 6);
+}
I asked this before, and I repeat my question: Should we not add at least basic error checking? Like verifying that the input string is actually long enough for what we are doing here?
Best regards,
Wolfgang Denk

On Mon, Jul 25, 2011 at 11:37:34PM +0200, Wolfgang Denk wrote:
+void uuid_str_to_bin(const char *uuid, unsigned char *out)
I will add a separate function to verify the format of a UUID string. It doesn't belong in this function, which otherwise only needs to read the string once. It will check for length, that '-' is placed appropriately, and that proper hexadecimal numbers are used.
Thanks, Jason

These options are required to be present in RFC 4578 compliant DHCP requests. They give more information to DHCP servers to allow serving different DHCP responses to different systems based on client architecture, client capabilities, UUID, or vendor.
Signed-off-by: Jason Hobbs jason.hobbs@calxeda.com --- Changes for v2: - Use common.h to get uuid_str_to_bin prototype
net/bootp.c | 36 ++++++++++++++++++++++++++++++++++++ 1 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/net/bootp.c b/net/bootp.c index 4db63cb..06ff598 100644 --- a/net/bootp.c +++ b/net/bootp.c @@ -360,6 +360,11 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R { u8 *start = e; u8 *cnt; +#if defined(CONFIG_BOOTP_PXE) + char *uuid; + size_t vci_strlen; + u16 clientarch; +#endif
#if defined(CONFIG_BOOTP_VENDOREX) u8 *x; @@ -414,6 +419,37 @@ static int DhcpExtended (u8 * e, int message_type, IPaddr_t ServerID, IPaddr_t R } #endif
+#if defined(CONFIG_BOOTP_PXE) + clientarch = CONFIG_BOOTP_PXE_CLIENTARCH; + *e++ = 93; /* Client System Architecture */ + *e++ = 2; + *e++ = (clientarch >> 8) & 0xff; + *e++ = clientarch & 0xff; + + *e++ = 94; /* Client Network Interface Identifier */ + *e++ = 3; + *e++ = 1; /* type field for UNDI */ + *e++ = 0; /* major revision */ + *e++ = 0; /* minor revision */ + + uuid = getenv("pxeuuid"); + + if (uuid) { + *e++ = 97; /* Client Machine Identifier */ + *e++ = 17; + *e++ = 0; /* type 0 - UUID */ + + uuid_str_to_bin(uuid, e); + e += 16; + } + + *e++ = 60; /* Vendor Class Identifier */ + vci_strlen = strlen(CONFIG_BOOTP_VCI_STRING); + *e++ = vci_strlen; + memcpy(e, CONFIG_BOOTP_VCI_STRING, vci_strlen); + e += vci_strlen; +#endif + #if defined(CONFIG_BOOTP_VENDOREX) if ((x = dhcp_vendorex_prep (e))) return x - start;

Signed-off-by: Jason Hobbs jason.hobbs@calxeda.com --- Changes for v2: - Add armv7 architecture to VCI string
include/configs/ca9x4_ct_vxp.h | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/include/configs/ca9x4_ct_vxp.h b/include/configs/ca9x4_ct_vxp.h index 7f83249..fdf9a2a 100644 --- a/include/configs/ca9x4_ct_vxp.h +++ b/include/configs/ca9x4_ct_vxp.h @@ -100,6 +100,11 @@ #define CONFIG_BOOTP_GATEWAY #define CONFIG_BOOTP_HOSTNAME
+/* PXE support */ +#define CONFIG_BOOTP_PXE +#define CONFIG_BOOTP_PXE_CLIENTARCH 0x100 +#define CONFIG_BOOTP_VCI_STRING "U-boot.armv7.ca9x4_ct_vxp" + /* Miscellaneous configurable options */ #undef CONFIG_SYS_CLKS_IN_HZ #define CONFIG_SYS_LOAD_ADDR 0x60008000 /* load address */

Dear Wolfgang,
On Wed, Jun 29, 2011 at 11:58:27AM -0500, Jason Hobbs wrote:
This patch series adds support for RFC 4578 compliant DHCP request options, which enhance the ability of DHCP servers to respond differently to different clients.
As an example, the last patch in this series enables support for the PXE DHCP options for the ca9x4_ct_vxp config.
changes in v2:
- drop uuid.h in favor of common.h
- alphabetical order for build targets
changes in v3:
- add checks for NULL pointers in uuid conversion function
Jason Hobbs (3): lib: add uuid_str_to_bin for use with bootp and PXE uuid net: bootp: add PXE/RFC 4578 DHCP options support arm: ca9x4_ct_vxp: enable CONFIG_BOOTP_PXE
include/common.h | 3 ++ include/configs/ca9x4_ct_vxp.h | 5 ++++ lib/Makefile | 1 + lib/uuid.c | 53 ++++++++++++++++++++++++++++++++++++++++ net/bootp.c | 36 +++++++++++++++++++++++++++ 5 files changed, 98 insertions(+), 0 deletions(-) create mode 100644 lib/uuid.c
Similarly, the v3 version of this patch series has been out for about 10 days without any comments - can these patches please be pulled into mainline?
Thanks, Jason
participants (2)
-
Jason Hobbs
-
Wolfgang Denk