diff options
author | Michael Brown <mcb30@ipxe.org> | 2011-03-22 16:56:35 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2011-03-22 19:54:58 +0000 |
commit | f5fd4dec3bab362a2ff7844859914e1f191fb905 (patch) | |
tree | 607eacef2f79c016a0c3c3031de2bb7d8aa7e331 /src/net/netdev_settings.c | |
parent | 9215b7f4c0e24cceeac42d8ced5b4af824c4b011 (diff) | |
download | ipxe-f5fd4dec3bab362a2ff7844859914e1f191fb905.tar.gz |
[settings] Formalise notion of setting applicability
Expose a function setting_applies() to allow a caller to determine
whether or not a particular setting is applicable to a particular
settings block.
Restrict DHCP-backed settings blocks to accepting only DHCP-based
settings.
Restrict network device settings blocks to accepting only DHCP-based
settings and network device-specific settings such as "mac".
Inspired-by: Glenn Brown <glenn@myri.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/netdev_settings.c')
-rw-r--r-- | src/net/netdev_settings.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/net/netdev_settings.c b/src/net/netdev_settings.c index f641d3b21..2ff4ad3e3 100644 --- a/src/net/netdev_settings.c +++ b/src/net/netdev_settings.c @@ -22,6 +22,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <errno.h> #include <byteswap.h> #include <ipxe/dhcp.h> +#include <ipxe/dhcpopts.h> #include <ipxe/settings.h> #include <ipxe/device.h> #include <ipxe/netdevice.h> @@ -37,14 +38,30 @@ struct setting mac_setting __setting = { .name = "mac", .description = "MAC address", .type = &setting_type_hex, + .tag = NETDEV_SETTING_TAG_MAC, }; struct setting busid_setting __setting = { .name = "busid", .description = "Bus ID", .type = &setting_type_hex, + .tag = NETDEV_SETTING_TAG_BUS_ID, }; /** + * Check applicability of network device setting + * + * @v settings Settings block + * @v setting Setting + * @ret applies Setting applies within this settings block + */ +static int netdev_applies ( struct settings *settings __unused, + struct setting *setting ) { + + return ( IS_NETDEV_SETTING_TAG ( setting->tag ) || + dhcpopt_applies ( setting->tag ) ); +} + +/** * Store value of network device setting * * @v settings Settings block @@ -114,6 +131,7 @@ static void netdev_clear ( struct settings *settings ) { /** Network device configuration settings operations */ struct settings_operations netdev_settings_operations = { + .applies = netdev_applies, .store = netdev_store, .fetch = netdev_fetch, .clear = netdev_clear, |