Skip to content

Commit

Permalink
[Settings] DHCP is now working using the new settings API.
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Brown committed Mar 21, 2008
1 parent 8afb36c commit a462c96
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 18 deletions.
14 changes: 6 additions & 8 deletions src/core/settings.c
Expand Up @@ -91,13 +91,11 @@ int simple_settings_store ( struct settings *settings, unsigned int tag,
// Dummy routine just for testing
int simple_settings_fetch ( struct settings *settings, unsigned int tag,
void *data, size_t len ) {
unsigned int i;

DBGC ( settings, "Settings %p: fetch %s\n",
settings, setting_tag_name ( tag ) );
for ( i = 0 ; i < len ; i++ )
*( ( ( uint8_t * ) data ) + i ) = i;
return ( len ? len : 8 );
( void ) settings;
( void ) tag;
( void ) data;
( void ) len;
return -ENOENT;
}

/** Simple settings operations */
Expand Down Expand Up @@ -337,7 +335,7 @@ int fetch_setting ( struct settings *settings, unsigned int tag,

/* Recurse into each child block in turn */
list_for_each_entry ( child, &settings->children, siblings ) {
if ( ( ret = fetch_setting ( settings, tag, data, len ) ) >= 0)
if ( ( ret = fetch_setting ( child, tag, data, len ) ) >= 0)
return ret;
}

Expand Down
20 changes: 15 additions & 5 deletions src/net/dhcpopts.c
Expand Up @@ -180,26 +180,36 @@ static int resize_dhcp_option ( struct dhcp_options *options,
void *end;

/* Check for sufficient space, and update length fields */
if ( new_len > DHCP_MAX_LEN )
if ( new_len > DHCP_MAX_LEN ) {
DBGC ( options, "DHCPOPT %p overlength option\n", options );
return -ENOSPC;
}
new_options_len = ( options->len + delta );
if ( new_options_len > options->max_len ) {
/* Reallocate options block if allowed to do so. */
if ( can_realloc ) {
new_data = realloc ( options->data, new_options_len );
if ( ! new_data )
if ( ! new_data ) {
DBGC ( options, "DHCPOPT %p could not "
"reallocate to %zd bytes\n", options,
new_options_len );
return -ENOMEM;
}
options->data = new_data;
options->max_len = new_options_len;
} else {
DBGC ( options, "DHCPOPT %p out of space\n", options );
return -ENOMEM;
}
}
if ( encap_offset >= 0 ) {
encapsulator = dhcp_option ( options, encap_offset );
new_encapsulator_len = ( encapsulator->len + delta );
if ( new_encapsulator_len > DHCP_MAX_LEN )
if ( new_encapsulator_len > DHCP_MAX_LEN ) {
DBGC ( options, "DHCPOPT %p overlength encapsulator\n",
options );
return -ENOSPC;
}
encapsulator->len = new_encapsulator_len;
}
options->len = new_options_len;
Expand Down Expand Up @@ -253,7 +263,7 @@ static int set_dhcp_option ( struct dhcp_options *options, unsigned int tag,
options, dhcp_tag_name ( tag ), old_len, new_len );
} else {
DBGC ( options, "DHCPOPT %p creating %s (length %zd)\n",
options, dhcp_tag_name ( tag ), len );
options, dhcp_tag_name ( tag ), new_len );
}

/* Ensure that encapsulator exists, if required */
Expand Down Expand Up @@ -353,7 +363,7 @@ int dhcpopt_fetch ( struct dhcp_options *options, unsigned int tag,
return offset;

option = dhcp_option ( options, offset );
option_len = dhcp_option_len ( option );
option_len = option->len;
if ( len > option_len )
len = option_len;
memcpy ( data, option->data, len );
Expand Down
6 changes: 4 additions & 2 deletions src/net/tcp/iscsi.c
Expand Up @@ -1649,8 +1649,10 @@ static int apply_iscsi_string_setting ( struct iscsi_string_setting *setting ){
/* Allocate new string */
prefix_len = strlen ( setting->prefix );
setting_len = fetch_setting_len ( NULL, setting->tag );
if ( setting_len < 0 )
return setting_len;
if ( setting_len < 0 ) {
/* Missing settings are not errors; leave strings as NULL */
return 0;
}
len = ( prefix_len + setting_len + 1 );
p = *setting->string = malloc ( len );
if ( ! p )
Expand Down
7 changes: 4 additions & 3 deletions src/net/udp/dhcp.c
Expand Up @@ -175,7 +175,7 @@ static int create_dhcp_packet ( struct dhcp_packet *dhcppkt,
}
dhcphdr->hlen = hlen;
memcpy ( dhcphdr->chaddr, netdev->ll_addr, hlen );
memcpy ( dhcphdr->options, options, options_len );
memcpy ( dhcphdr->options, options->data, options_len );

/* Initialise DHCP packet structure and settings interface */
dhcppkt_init ( dhcppkt, NULL, data, max_len );
Expand Down Expand Up @@ -258,9 +258,10 @@ int create_dhcp_request ( struct dhcp_packet *dhcppkt,
"option: %s\n", strerror ( rc ) );
return rc;
}
if ( ( rc = copy_setting ( &dhcppkt->settings, DHCP_EB_YIADDR,
if ( ( rc = copy_setting ( &dhcppkt->settings,
DHCP_REQUESTED_ADDRESS,
offer_settings,
DHCP_REQUESTED_ADDRESS ) ) != 0 ) {
DHCP_EB_YIADDR ) ) != 0 ) {
DBG ( "DHCP could not set requested address "
"option: %s\n", strerror ( rc ) );
return rc;
Expand Down

0 comments on commit a462c96

Please sign in to comment.