From a462c96ffc1e7d378c783823f768a47d323dd210 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 21 Mar 2008 22:55:59 +0000 Subject: [PATCH] [Settings] DHCP is now working using the new settings API. --- src/core/settings.c | 14 ++++++-------- src/net/dhcpopts.c | 20 +++++++++++++++----- src/net/tcp/iscsi.c | 6 ++++-- src/net/udp/dhcp.c | 7 ++++--- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/core/settings.c b/src/core/settings.c index cf0b898b..7dd697ed 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -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 */ @@ -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; } diff --git a/src/net/dhcpopts.c b/src/net/dhcpopts.c index 6d961f41..64b310d4 100644 --- a/src/net/dhcpopts.c +++ b/src/net/dhcpopts.c @@ -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; @@ -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 */ @@ -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 ); diff --git a/src/net/tcp/iscsi.c b/src/net/tcp/iscsi.c index 0e7b2582..f071b04a 100644 --- a/src/net/tcp/iscsi.c +++ b/src/net/tcp/iscsi.c @@ -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 ) diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c index 624532d2..28f7e1d7 100644 --- a/src/net/udp/dhcp.c +++ b/src/net/udp/dhcp.c @@ -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 ); @@ -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;