提交 d2b5d5c4 编写于 作者: J Jason Hobbs 提交者: Wolfgang Denk

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: NJason Hobbs <jason.hobbs@calxeda.com>
上级 06283a64
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册