[dhcp] Send user class in DHCP requests
authorMichael Brown <mcb30@etherboot.org>
Sun, 1 Feb 2009 20:06:09 +0000 (20:06 +0000)
committerMichael Brown <mcb30@etherboot.org>
Sun, 1 Feb 2009 20:06:09 +0000 (20:06 +0000)
src/include/gpxe/dhcp.h
src/include/gpxe/settings.h
src/net/udp/dhcp.c

index 2fddb40..d84d55d 100644 (file)
@@ -203,6 +203,9 @@ struct dhcp_client_id {
  */
 #define DHCP_BOOTFILE_NAME 67
 
+/** User class identifier */
+#define DHCP_USER_CLASS_ID 77
+
 /** Client system architecture */
 #define DHCP_CLIENT_ARCHITECTURE 93
 
index bf80b1e..9e62cde 100644 (file)
@@ -225,10 +225,10 @@ extern struct setting root_path_setting __setting;
 extern struct setting username_setting __setting;
 extern struct setting password_setting __setting;
 extern struct setting priority_setting __setting;
-extern struct setting bios_drive_setting __setting;
 extern struct setting uuid_setting __setting;
 extern struct setting next_server_setting __setting;
 extern struct setting mac_setting __setting;
+extern struct setting user_class_setting __setting;
 
 /**
  * Initialise a settings block
index 3554b40..26c5017 100644 (file)
@@ -101,6 +101,14 @@ struct setting dhcp_server_setting __setting = {
        .type = &setting_type_ipv4,
 };
 
+/** DHCP user class setting */
+struct setting user_class_setting __setting = {
+       .name = "user-class",
+       .description = "User class identifier",
+       .tag = DHCP_USER_CLASS_ID,
+       .type = &setting_type_string,
+};
+
 /**
  * Name a DHCP packet type
  *
@@ -834,6 +842,7 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
        struct dhcp_client_uuid client_uuid;
        size_t dhcp_features_len;
        size_t ll_addr_len;
+       ssize_t len;
        int rc;
 
        /* Create DHCP packet */
@@ -885,8 +894,8 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
 
        /* Add client UUID, if we have one.  Required for PXE. */
        client_uuid.type = DHCP_CLIENT_UUID_TYPE;
-       if ( ( rc = fetch_uuid_setting ( NULL, &uuid_setting,
-                                        &client_uuid.uuid ) ) >= 0 ) {
+       if ( ( len = fetch_uuid_setting ( NULL, &uuid_setting,
+                                         &client_uuid.uuid ) ) >= 0 ) {
                if ( ( rc = dhcppkt_store ( dhcppkt, DHCP_CLIENT_UUID,
                                            &client_uuid,
                                            sizeof ( client_uuid ) ) ) != 0 ) {
@@ -896,6 +905,20 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
                }
        }
 
+       /* Add user class, if we have one. */
+       if ( ( len = fetch_setting_len ( NULL, &user_class_setting ) ) >= 0 ) {
+               char user_class[len];
+               fetch_setting ( NULL, &user_class_setting, user_class,
+                               sizeof ( user_class ) );
+               if ( ( rc = dhcppkt_store ( dhcppkt, DHCP_USER_CLASS_ID,
+                                           &user_class,
+                                           sizeof ( user_class ) ) ) != 0 ) {
+                       DBG ( "DHCP could not set user class: %s\n",
+                             strerror ( rc ) );
+                       return rc;
+               }
+       }
+
        return 0;
 }