mirror of
https://github.com/xcat2/xNBA.git
synced 2025-04-13 16:57:25 +00:00
[Settings] DHCP is now working using the new settings API.
This commit is contained in:
parent
8afb36c3bc
commit
a462c96ffc
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 );
|
||||
|
@ -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 )
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user