diff options
author | Michael Brown <mcb30@etherboot.org> | 2007-11-21 03:29:53 +0000 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2007-11-21 03:29:53 +0000 |
commit | 26f3a09ccf99244fffc4aad23b7bda78c3d9dd21 (patch) | |
tree | 5c41bfc37056a01a8ee0baf68ab9627dd263fb62 | |
parent | 899f5b8ab233987646e6f5012f462a19a833d8d4 (diff) | |
download | ipxe-26f3a09ccf99244fffc4aad23b7bda78c3d9dd21.tar.gz |
Add UUID to DHCP request as option 97 (if available).
-rw-r--r-- | src/arch/i386/include/bits/uuid.h | 10 | ||||
-rw-r--r-- | src/arch/i386/include/smbios.h | 1 | ||||
-rw-r--r-- | src/include/gpxe/dhcp.h | 3 | ||||
-rw-r--r-- | src/include/gpxe/uuid.h | 3 | ||||
-rw-r--r-- | src/net/udp/dhcp.c | 13 |
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; } |