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

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.
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/configs/ca9x4_ct_vxp.h | 5 ++++ include/uuid.h | 28 ++++++++++++++++++++++ lib/Makefile | 1 + lib/uuid.c | 50 ++++++++++++++++++++++++++++++++++++++++ net/bootp.c | 37 +++++++++++++++++++++++++++++ 5 files changed, 121 insertions(+), 0 deletions(-) create mode 100644 include/uuid.h create mode 100644 lib/uuid.c

Signed-off-by: Jason Hobbs jason.hobbs@calxeda.com --- include/uuid.h | 28 ++++++++++++++++++++++++++++ lib/Makefile | 1 + lib/uuid.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 0 deletions(-) create mode 100644 include/uuid.h create mode 100644 lib/uuid.c
diff --git a/include/uuid.h b/include/uuid.h new file mode 100644 index 0000000..f5a242b --- /dev/null +++ b/include/uuid.h @@ -0,0 +1,28 @@ +/* + * 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 + */ + +#ifndef __UUID_H_ +#define __UUID_H_ + +void uuid_str_to_bin(const char *uuid, unsigned char *out); + +#endif /* __UUID_H_ */ diff --git a/lib/Makefile b/lib/Makefile index afa6914..82b318d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -53,6 +53,7 @@ COBJS-y += strmhz.o COBJS-y += time.o COBJS-y += vsprintf.o COBJS-$(CONFIG_RBTREE) += rbtree.o +COBJS-y += uuid.o
COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c) diff --git a/lib/uuid.c b/lib/uuid.c new file mode 100644 index 0000000..edc0c9f --- /dev/null +++ b/lib/uuid.c @@ -0,0 +1,50 @@ +/* + * 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; + + 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 1307386157-3660-2-git-send-email-jason.hobbs@calxeda.com you wrote:
Signed-off-by: Jason Hobbs jason.hobbs@calxeda.com
include/uuid.h | 28 ++++++++++++++++++++++++++++ lib/Makefile | 1 + lib/uuid.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
Is this new code, or copied from somewhere?
3 files changed, 79 insertions(+), 0 deletions(-) create mode 100644 include/uuid.h create mode 100644 lib/uuid.c
diff --git a/include/uuid.h b/include/uuid.h new file mode 100644 index 0000000..f5a242b --- /dev/null +++ b/include/uuid.h
...
+void uuid_str_to_bin(const char *uuid, unsigned char *out);
Do we really need a new header file for just this single prototype. Please add to common.h
index afa6914..82b318d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -53,6 +53,7 @@ COBJS-y += strmhz.o COBJS-y += time.o COBJS-y += vsprintf.o COBJS-$(CONFIG_RBTREE) += rbtree.o +COBJS-y += uuid.o
Please sort list, amd make compilation conditional.
+/*
- 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;
- 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);
Should we perform _any_ checking for errors here?
Best regards,
Wolfgang Denk

On Mon, Jun 06, 2011 at 11:30:59PM +0200, Wolfgang Denk wrote:
Dear "Jason Hobbs",
In message 1307386157-3660-2-git-send-email-jason.hobbs@calxeda.com you wrote:
Signed-off-by: Jason Hobbs jason.hobbs@calxeda.com
include/uuid.h | 28 ++++++++++++++++++++++++++++ lib/Makefile | 1 + lib/uuid.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
Is this new code, or copied from somewhere?
New code
3 files changed, 79 insertions(+), 0 deletions(-) create mode 100644 include/uuid.h create mode 100644 lib/uuid.c
diff --git a/include/uuid.h b/include/uuid.h new file mode 100644 index 0000000..f5a242b --- /dev/null +++ b/include/uuid.h
...
+void uuid_str_to_bin(const char *uuid, unsigned char *out);
Do we really need a new header file for just this single prototype. Please add to common.h
Ok
index afa6914..82b318d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -53,6 +53,7 @@ COBJS-y += strmhz.o COBJS-y += time.o COBJS-y += vsprintf.o COBJS-$(CONFIG_RBTREE) += rbtree.o +COBJS-y += uuid.o
Please sort list, amd make compilation conditional.
Ok
+void uuid_str_to_bin(const char *uuid, unsigned char *out) +{
- uint16_t tmp16;
- uint32_t tmp32;
- uint64_t tmp64;
- 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);
Should we perform _any_ checking for errors here?
Did you have something in mind? If someone passes in an invalid UUID they'll get a bad result, but it won't lead to memory corruption or other catastrophic results unless one of the pointers passed in is bad, which there is no way to check for, as far as I know. We could check for acceptable hex digits and dashes in the correct places, but it would add a little overhead and code size.
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 --- net/bootp.c | 37 +++++++++++++++++++++++++++++++++++++ 1 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/net/bootp.c b/net/bootp.c index 4db63cb..7748f58 100644 --- a/net/bootp.c +++ b/net/bootp.c @@ -14,6 +14,7 @@ #include "bootp.h" #include "tftp.h" #include "nfs.h" +#include "uuid.h" #ifdef CONFIG_STATUS_LED #include <status_led.h> #endif @@ -360,6 +361,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 +420,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 --- 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..881dfb3 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.ca9x4_ct_vxp" + /* Miscellaneous configurable options */ #undef CONFIG_SYS_CLKS_IN_HZ #define CONFIG_SYS_LOAD_ADDR 0x60008000 /* load address */
participants (2)
-
Jason Hobbs
-
Wolfgang Denk