|  | @@ -79,23 +79,36 @@ static inline char * setting_tag_name ( unsigned int tag ) {
 | 
		
	
		
			
			| 79 | 79 |   ******************************************************************************
 | 
		
	
		
			
			| 80 | 80 |   */
 | 
		
	
		
			
			| 81 | 81 |  
 | 
		
	
		
			
			| 82 |  | -// Dummy routine just for testing
 | 
		
	
		
			
			|  | 82 | +/**
 | 
		
	
		
			
			|  | 83 | + * Store value of simple setting
 | 
		
	
		
			
			|  | 84 | + *
 | 
		
	
		
			
			|  | 85 | + * @v options		DHCP option block
 | 
		
	
		
			
			|  | 86 | + * @v tag		Setting tag number
 | 
		
	
		
			
			|  | 87 | + * @v data		Setting data, or NULL to clear setting
 | 
		
	
		
			
			|  | 88 | + * @v len		Length of setting data
 | 
		
	
		
			
			|  | 89 | + * @ret rc		Return status code
 | 
		
	
		
			
			|  | 90 | + */
 | 
		
	
		
			
			| 83 | 91 |  int simple_settings_store ( struct settings *settings, unsigned int tag,
 | 
		
	
		
			
			| 84 | 92 |  			    const void *data, size_t len ) {
 | 
		
	
		
			
			| 85 |  | -	DBGC ( settings, "Settings %p: store %s to:\n",
 | 
		
	
		
			
			| 86 |  | -	       settings, setting_tag_name ( tag ) );
 | 
		
	
		
			
			| 87 |  | -	DBGC_HD ( settings, data, len );
 | 
		
	
		
			
			| 88 |  | -	return 0;
 | 
		
	
		
			
			|  | 93 | +	struct simple_settings *simple =
 | 
		
	
		
			
			|  | 94 | +		container_of ( settings, struct simple_settings, settings );
 | 
		
	
		
			
			|  | 95 | +	return dhcpopt_extensible_store ( &simple->dhcpopts, tag, data, len );
 | 
		
	
		
			
			| 89 | 96 |  }
 | 
		
	
		
			
			| 90 | 97 |  
 | 
		
	
		
			
			| 91 |  | -// Dummy routine just for testing
 | 
		
	
		
			
			|  | 98 | +/**
 | 
		
	
		
			
			|  | 99 | + * Fetch value of simple setting
 | 
		
	
		
			
			|  | 100 | + *
 | 
		
	
		
			
			|  | 101 | + * @v options		DHCP option block
 | 
		
	
		
			
			|  | 102 | + * @v tag		Setting tag number
 | 
		
	
		
			
			|  | 103 | + * @v data		Buffer to fill with setting data
 | 
		
	
		
			
			|  | 104 | + * @v len		Length of buffer
 | 
		
	
		
			
			|  | 105 | + * @ret len		Length of setting data, or negative error
 | 
		
	
		
			
			|  | 106 | + */
 | 
		
	
		
			
			| 92 | 107 |  int simple_settings_fetch ( struct settings *settings, unsigned int tag,
 | 
		
	
		
			
			| 93 | 108 |  			    void *data, size_t len ) {
 | 
		
	
		
			
			| 94 |  | -	( void ) settings;
 | 
		
	
		
			
			| 95 |  | -	( void ) tag;
 | 
		
	
		
			
			| 96 |  | -	( void ) data;
 | 
		
	
		
			
			| 97 |  | -	( void ) len;
 | 
		
	
		
			
			| 98 |  | -	return -ENOENT;
 | 
		
	
		
			
			|  | 109 | +	struct simple_settings *simple =
 | 
		
	
		
			
			|  | 110 | +		container_of ( settings, struct simple_settings, settings );
 | 
		
	
		
			
			|  | 111 | +	return dhcpopt_fetch ( &simple->dhcpopts, tag, data, len );
 | 
		
	
		
			
			| 99 | 112 |  }
 | 
		
	
		
			
			| 100 | 113 |  
 | 
		
	
		
			
			| 101 | 114 |  /** Simple settings operations */
 | 
		
	
	
		
			
			|  | @@ -104,15 +117,22 @@ struct settings_operations simple_settings_operations = {
 | 
		
	
		
			
			| 104 | 117 |  	.fetch = simple_settings_fetch,
 | 
		
	
		
			
			| 105 | 118 |  };
 | 
		
	
		
			
			| 106 | 119 |  
 | 
		
	
		
			
			| 107 |  | -/** Root settings block */
 | 
		
	
		
			
			| 108 |  | -struct settings settings_root = {
 | 
		
	
		
			
			| 109 |  | -	.refcnt = NULL,
 | 
		
	
		
			
			| 110 |  | -	.name = "",
 | 
		
	
		
			
			| 111 |  | -	.siblings = LIST_HEAD_INIT ( settings_root.siblings ),
 | 
		
	
		
			
			| 112 |  | -	.children = LIST_HEAD_INIT ( settings_root.children ),
 | 
		
	
		
			
			| 113 |  | -	.op = &simple_settings_operations,
 | 
		
	
		
			
			|  | 120 | +/** Root simple settings block */
 | 
		
	
		
			
			|  | 121 | +struct simple_settings simple_settings_root = {
 | 
		
	
		
			
			|  | 122 | +	.settings = {
 | 
		
	
		
			
			|  | 123 | +		.refcnt = NULL,
 | 
		
	
		
			
			|  | 124 | +		.name = "",
 | 
		
	
		
			
			|  | 125 | +		.siblings =
 | 
		
	
		
			
			|  | 126 | +		     LIST_HEAD_INIT ( simple_settings_root.settings.siblings ),
 | 
		
	
		
			
			|  | 127 | +		.children =
 | 
		
	
		
			
			|  | 128 | +		     LIST_HEAD_INIT ( simple_settings_root.settings.children ),
 | 
		
	
		
			
			|  | 129 | +		.op = &simple_settings_operations,
 | 
		
	
		
			
			|  | 130 | +	},
 | 
		
	
		
			
			| 114 | 131 |  };
 | 
		
	
		
			
			| 115 | 132 |  
 | 
		
	
		
			
			|  | 133 | +/** Root settings block */
 | 
		
	
		
			
			|  | 134 | +#define settings_root simple_settings_root.settings
 | 
		
	
		
			
			|  | 135 | +
 | 
		
	
		
			
			| 116 | 136 |  /**
 | 
		
	
		
			
			| 117 | 137 |   * Apply all settings
 | 
		
	
		
			
			| 118 | 138 |   *
 |