summaryrefslogtreecommitdiffstats
path: root/src/net
diff options
context:
space:
mode:
authorMichael Brown2008-03-21 23:55:59 +0100
committerMichael Brown2008-03-21 23:55:59 +0100
commita462c96ffc1e7d378c783823f768a47d323dd210 (patch)
tree3b4dc63908ea6535b454be3e2af041782c0353ef /src/net
parent[Settings] Migrate DHCP and NVO code to the new settings API (untested) (diff)
downloadipxe-a462c96ffc1e7d378c783823f768a47d323dd210.tar.gz
ipxe-a462c96ffc1e7d378c783823f768a47d323dd210.tar.xz
ipxe-a462c96ffc1e7d378c783823f768a47d323dd210.zip
[Settings] DHCP is now working using the new settings API.
Diffstat (limited to 'src/net')
-rw-r--r--src/net/dhcpopts.c20
-rw-r--r--src/net/tcp/iscsi.c6
-rw-r--r--src/net/udp/dhcp.c7
3 files changed, 23 insertions, 10 deletions
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;