Add UUID to DHCP request as option 97 (if available).
authorMichael Brown <mcb30@etherboot.org>
Wed, 21 Nov 2007 03:29:53 +0000 (03:29 +0000)
committerMichael Brown <mcb30@etherboot.org>
Wed, 21 Nov 2007 03:29:53 +0000 (03:29 +0000)
src/arch/i386/include/bits/uuid.h [new file with mode: 0644]
src/arch/i386/include/smbios.h
src/include/gpxe/dhcp.h
src/include/gpxe/uuid.h
src/net/udp/dhcp.c

diff --git a/src/arch/i386/include/bits/uuid.h b/src/arch/i386/include/bits/uuid.h
new file mode 100644 (file)
index 0000000..0cbd320
--- /dev/null
@@ -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 */
index f5f0b5c..821eda1 100644 (file)
@@ -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 */
index 18baa86..e126e5f 100644 (file)
@@ -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
index 4f89be5..a62735c 100644 (file)
@@ -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) */
index 8e34ccb..8504d89 100644 (file)
@@ -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;
 }