summaryrefslogtreecommitdiffstats
path: root/src/net/netdev_settings.c
diff options
context:
space:
mode:
authorMichael Brown2008-03-25 21:46:16 +0100
committerMichael Brown2008-03-25 21:46:16 +0100
commit92d15eff30410dcb0ec406e06b131fb7d9179ffd (patch)
tree191d29013372b541d353bbfa55114b8060dd557c /src/net/netdev_settings.c
parent[PXEXT] Avoid returning a false EOF when we have an empty buffer queued (diff)
downloadipxe-92d15eff30410dcb0ec406e06b131fb7d9179ffd.tar.gz
ipxe-92d15eff30410dcb0ec406e06b131fb7d9179ffd.tar.xz
ipxe-92d15eff30410dcb0ec406e06b131fb7d9179ffd.zip
[Settings] Remove assumption that all settings have DHCP tag values
Allow for settings to be described by something other than a DHCP option tag if desirable. Currently used only for the MAC address setting. Separate out fake DHCP packet creation code from dhcp.c to fakedhcp.c. Remove notion of settings from dhcppkt.c. Rationalise dhcp.c to use settings API only for final registration of the DHCP options, rather than using {store,fetch}_setting throughout.
Diffstat (limited to 'src/net/netdev_settings.c')
-rw-r--r--src/net/netdev_settings.c39
1 files changed, 17 insertions, 22 deletions
diff --git a/src/net/netdev_settings.c b/src/net/netdev_settings.c
index c8e630a9..44aca7d8 100644
--- a/src/net/netdev_settings.c
+++ b/src/net/netdev_settings.c
@@ -28,28 +28,34 @@
*
*/
+/** Network device named settings */
+struct setting mac_setting __setting = {
+ .name = "mac",
+ .description = "MAC address",
+ .type = &setting_type_hex,
+};
+
/**
* Store value of network device setting
*
* @v settings Settings block
- * @v tag Setting tag number
+ * @v setting Setting to store
* @v data Setting data, or NULL to clear setting
* @v len Length of setting data
* @ret rc Return status code
*/
-static int netdev_store ( struct settings *settings, unsigned int tag,
+static int netdev_store ( struct settings *settings, struct setting *setting,
const void *data, size_t len ) {
struct net_device *netdev = container_of ( settings, struct net_device,
settings.settings );
- switch ( tag ) {
- case DHCP_EB_MAC:
+ if ( setting_cmp ( setting, &mac_setting ) == 0 ) {
if ( len != netdev->ll_protocol->ll_addr_len )
return -EINVAL;
memcpy ( netdev->ll_addr, data, len );
return 0;
- default :
- return simple_settings_store ( settings, tag, data, len );
+ } else {
+ return simple_settings_store ( settings, setting, data, len );
}
}
@@ -57,24 +63,23 @@ static int netdev_store ( struct settings *settings, unsigned int tag,
* Fetch value of network device setting
*
* @v settings Settings block
- * @v tag Setting tag number
+ * @v setting Setting to fetch
* @v data Setting data, or NULL to clear setting
* @v len Length of setting data
* @ret rc Return status code
*/
-static int netdev_fetch ( struct settings *settings, unsigned int tag,
+static int netdev_fetch ( struct settings *settings, struct setting *setting,
void *data, size_t len ) {
struct net_device *netdev = container_of ( settings, struct net_device,
settings.settings );
- switch ( tag ) {
- case DHCP_EB_MAC:
+ if ( setting_cmp ( setting, &mac_setting ) == 0 ) {
if ( len > netdev->ll_protocol->ll_addr_len )
len = netdev->ll_protocol->ll_addr_len;
memcpy ( data, netdev->ll_addr, len );
return netdev->ll_protocol->ll_addr_len;
- default :
- return simple_settings_fetch ( settings, tag, data, len );
+ } else {
+ return simple_settings_fetch ( settings, setting, data, len );
}
}
@@ -83,13 +88,3 @@ struct settings_operations netdev_settings_operations = {
.store = netdev_store,
.fetch = netdev_fetch,
};
-
-/** Network device named settings */
-struct named_setting netdev_named_settings[] __named_setting = {
- {
- .name = "mac",
- .description = "MAC address",
- .tag = DHCP_EB_MAC,
- .type = &setting_type_hex,
- },
-};