Skip to content

Commit

Permalink
[dhcp] Allow vendor class to be changed in DHCP requests
Browse files Browse the repository at this point in the history
Allow the DHCPv4 vendor class to be specified via the "vendor-class"
setting.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 20, 2017
1 parent 7692a8f commit de2c6fa
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 11 deletions.
9 changes: 9 additions & 0 deletions src/core/settings.c
Expand Up @@ -2429,6 +2429,15 @@ const struct setting user_class_setting __setting ( SETTING_HOST_EXTRA,
.type = &setting_type_string,
};

/** DHCP vendor class setting */
const struct setting vendor_class_setting __setting ( SETTING_HOST_EXTRA,
vendor-class ) = {
.name = "vendor-class",
.description = "DHCP vendor class",
.tag = DHCP_VENDOR_CLASS_ID,
.type = &setting_type_string,
};

/******************************************************************************
*
* Built-in settings block
Expand Down
2 changes: 2 additions & 0 deletions src/include/ipxe/settings.h
Expand Up @@ -468,6 +468,8 @@ busid_setting __setting ( SETTING_NETDEV, busid );
extern const struct setting
user_class_setting __setting ( SETTING_HOST_EXTRA, user-class );
extern const struct setting
vendor_class_setting __setting ( SETTING_HOST_EXTRA, vendor-class );
extern const struct setting
manufacturer_setting __setting ( SETTING_HOST_EXTRA, manufacturer );
extern const struct setting
product_setting __setting ( SETTING_HOST_EXTRA, product );
Expand Down
34 changes: 23 additions & 11 deletions src/net/udp/dhcp.c
Expand Up @@ -99,6 +99,12 @@ static uint8_t dhcp_request_options_data[] = {
DHCP_END
};

/** Settings copied in to all DHCP requests */
static const struct setting * dhcp_request_settings[] = {
&user_class_setting,
&vendor_class_setting,
};

/** DHCP server address setting */
const struct setting dhcp_server_setting __setting ( SETTING_MISC,
dhcp-server ) = {
Expand Down Expand Up @@ -975,11 +981,13 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
struct dhcp_netdev_desc dhcp_desc;
struct dhcp_client_id client_id;
struct dhcp_client_uuid client_uuid;
const struct setting *setting;
uint8_t *dhcp_features;
size_t dhcp_features_len;
size_t ll_addr_len;
void *user_class;
void *raw;
ssize_t len;
unsigned int i;
int rc;

/* Create DHCP packet */
Expand Down Expand Up @@ -1047,19 +1055,23 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt,
}
}

/* Add user class, if we have one. */
if ( ( len = fetch_raw_setting_copy ( NULL, &user_class_setting,
&user_class ) ) >= 0 ) {
if ( ( rc = dhcppkt_store ( dhcppkt, DHCP_USER_CLASS_ID,
user_class, len ) ) != 0 ) {
DBG ( "DHCP could not set user class: %s\n",
strerror ( rc ) );
goto err_store_user_class;
/* Add request settings, if applicable */
for ( i = 0 ; i < ( sizeof ( dhcp_request_settings ) /
sizeof ( dhcp_request_settings[0] ) ) ; i++ ) {
setting = dhcp_request_settings[i];
if ( ( len = fetch_raw_setting_copy ( NULL, setting,
&raw ) ) >= 0 ) {
rc = dhcppkt_store ( dhcppkt, setting->tag, raw, len );
free ( raw );
if ( rc != 0 ) {
DBG ( "DHCP could not set %s: %s\n",
setting->name, strerror ( rc ) );
goto err_store_raw;
}
}
}

err_store_user_class:
free ( user_class );
err_store_raw:
err_store_client_uuid:
err_store_client_id:
err_store_busid:
Expand Down

0 comments on commit de2c6fa

Please sign in to comment.