summaryrefslogtreecommitdiff
path: root/net/bootp.c
diff options
context:
space:
mode:
authorJason Hobbs <jason.hobbs@calxeda.com>2011-08-31 05:37:31 +0000
committerWolfgang Denk <wd@denx.de>2011-10-17 22:25:35 +0200
commitd2b5d5c4c1505e7a3f3e1b8120566ae9b7042e9f (patch)
tree5d86a8dc0ae467f6924efdaf7b4a3851156f7893 /net/bootp.c
parent06283a6401f652e709b7b27d02238d0c6f92cb0c (diff)
downloadu-boot-imx-d2b5d5c4c1505e7a3f3e1b8120566ae9b7042e9f.zip
u-boot-imx-d2b5d5c4c1505e7a3f3e1b8120566ae9b7042e9f.tar.gz
u-boot-imx-d2b5d5c4c1505e7a3f3e1b8120566ae9b7042e9f.tar.bz2
net: bootp: add PXE/RFC 4578 DHCP options support
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>
Diffstat (limited to 'net/bootp.c')
-rw-r--r--net/bootp.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/net/bootp.c b/net/bootp.c
index a003c42..73470f2 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -381,6 +381,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;
@@ -435,6 +440,41 @@ 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) {
+ if (uuid_str_valid(uuid)) {
+ *e++ = 97; /* Client Machine Identifier */
+ *e++ = 17;
+ *e++ = 0; /* type 0 - UUID */
+
+ uuid_str_to_bin(uuid, e);
+ e += 16;
+ } else {
+ printf("Invalid pxeuuid: %s\n", uuid);
+ }
+ }
+
+ *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;