aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Hobbs <jason.hobbs@calxeda.com>2011-06-29 11:58:29 -0500
committerJohn Rigby <john.rigby@linaro.org>2011-08-15 15:10:48 -0600
commit8d4317798683a285e533c7e09ae08a7311399c36 (patch)
treedd02fc312945c1b8dbcd44783449d0efac266fd9
parent30f05e80f03cf45d0c62f439d987ae096d5ee30b (diff)
downloadu-boot-linaro-stable-8d4317798683a285e533c7e09ae08a7311399c36.tar.gz
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>
-rw-r--r--net/bootp.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/net/bootp.c b/net/bootp.c
index 45eaab1e0..eedfa061a 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -370,6 +370,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;
@@ -424,6 +429,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;