summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2007-11-21 04:29:53 +0100
committerMichael Brown2007-11-21 04:29:53 +0100
commit26f3a09ccf99244fffc4aad23b7bda78c3d9dd21 (patch)
tree5c41bfc37056a01a8ee0baf68ab9627dd263fb62
parentAdded definition of a UUID and uuid_ntoa() (for debugging), and (diff)
downloadipxe-26f3a09ccf99244fffc4aad23b7bda78c3d9dd21.tar.gz
ipxe-26f3a09ccf99244fffc4aad23b7bda78c3d9dd21.tar.xz
ipxe-26f3a09ccf99244fffc4aad23b7bda78c3d9dd21.zip
Add UUID to DHCP request as option 97 (if available).
-rw-r--r--src/arch/i386/include/bits/uuid.h10
-rw-r--r--src/arch/i386/include/smbios.h1
-rw-r--r--src/include/gpxe/dhcp.h3
-rw-r--r--src/include/gpxe/uuid.h3
-rw-r--r--src/net/udp/dhcp.c13
5 files changed, 30 insertions, 0 deletions
diff --git a/src/arch/i386/include/bits/uuid.h b/src/arch/i386/include/bits/uuid.h
new file mode 100644
index 00000000..0cbd320a
--- /dev/null
+++ b/src/arch/i386/include/bits/uuid.h
@@ -0,0 +1,10 @@
+#ifndef _I386_UUID_H
+#define _I386_UUID_H
+
+#include <smbios.h>
+
+static inline int get_uuid ( union uuid *uuid ) {
+ return smbios_get_uuid ( uuid );
+}
+
+#endif /* _I386_UUID_H */
diff --git a/src/arch/i386/include/smbios.h b/src/arch/i386/include/smbios.h
index f5f0b5c2..821eda17 100644
--- a/src/arch/i386/include/smbios.h
+++ b/src/arch/i386/include/smbios.h
@@ -46,5 +46,6 @@ extern int find_smbios_structure ( unsigned int type,
extern int find_smbios_string ( struct smbios_strings *strings,
unsigned int index,
char *buffer, size_t length );
+extern int smbios_get_uuid ( union uuid *uuid );
#endif /* _SMBIOS_H */
diff --git a/src/include/gpxe/dhcp.h b/src/include/gpxe/dhcp.h
index 18baa86a..e126e5ff 100644
--- a/src/include/gpxe/dhcp.h
+++ b/src/include/gpxe/dhcp.h
@@ -135,6 +135,9 @@ struct job_interface;
*/
#define DHCP_BOOTFILE_NAME 67
+/** UUID client identifier */
+#define DHCP_CLIENT_UUID 97
+
/** Etherboot-specific encapsulated options
*
* This encapsulated options field is used to contain all options
diff --git a/src/include/gpxe/uuid.h b/src/include/gpxe/uuid.h
index 4f89be50..a62735c9 100644
--- a/src/include/gpxe/uuid.h
+++ b/src/include/gpxe/uuid.h
@@ -8,6 +8,9 @@
#include <stdint.h>
+union uuid;
+#include <bits/uuid.h>
+
/** A universally unique ID */
union uuid {
/** Canonical form (00000000-0000-0000-0000-000000000000) */
diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c
index 8e34ccb6..8504d898 100644
--- a/src/net/udp/dhcp.c
+++ b/src/net/udp/dhcp.c
@@ -31,6 +31,7 @@
#include <gpxe/retry.h>
#include <gpxe/tcpip.h>
#include <gpxe/ip.h>
+#include <gpxe/uuid.h>
#include <gpxe/dhcp.h>
/** @file
@@ -529,6 +530,7 @@ int create_dhcp_request ( struct net_device *netdev, int msgtype,
struct device_description *desc = &netdev->dev->desc;
struct dhcp_netdev_desc dhcp_desc;
struct dhcp_client_id client_id;
+ union uuid uuid;
size_t dhcp_features_len;
size_t ll_addr_len;
int rc;
@@ -604,6 +606,17 @@ int create_dhcp_request ( struct net_device *netdev, int msgtype,
return rc;
}
+ /* Add client UUID, if we have one. Required for PXE. */
+ if ( ( rc = get_uuid ( &uuid ) ) == 0 ) {
+ if ( ( rc = set_dhcp_packet_option ( dhcppkt,
+ DHCP_CLIENT_UUID, &uuid,
+ sizeof ( uuid ) ) ) !=0){
+ DBG ( "DHCP could not set client UUID: %s\n",
+ strerror ( rc ) );
+ return rc;
+ }
+ }
+
return 0;
}