mirror of
https://github.com/ipxe/ipxe
synced 2025-12-20 03:55:46 +03:00
[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>
This commit is contained in:
@@ -206,6 +206,7 @@ struct setting net80211_ssid_setting __setting = {
|
||||
.name = "ssid",
|
||||
.description = "802.11 SSID (network name)",
|
||||
.type = &setting_type_string,
|
||||
.tag = NET80211_SETTING_TAG_SSID,
|
||||
};
|
||||
|
||||
/** Whether to use active scanning
|
||||
@@ -218,6 +219,7 @@ struct setting net80211_active_setting __setting = {
|
||||
.name = "active-scan",
|
||||
.description = "Use an active scan during 802.11 association",
|
||||
.type = &setting_type_int8,
|
||||
.tag = NET80211_SETTING_TAG_ACTIVE_SCAN,
|
||||
};
|
||||
|
||||
/** The cryptographic key to use
|
||||
@@ -230,6 +232,7 @@ struct setting net80211_key_setting __setting = {
|
||||
.name = "key",
|
||||
.description = "Encryption key for protected 802.11 networks",
|
||||
.type = &setting_type_string,
|
||||
.tag = NET80211_SETTING_TAG_KEY,
|
||||
};
|
||||
|
||||
/** @} */
|
||||
|
||||
@@ -347,6 +347,18 @@ static int set_dhcp_option ( struct dhcp_options *options, unsigned int tag,
|
||||
return offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check applicability of DHCP option setting
|
||||
*
|
||||
* @v tag Setting tag number
|
||||
* @ret applies Setting applies to this option block
|
||||
*/
|
||||
int dhcpopt_applies ( unsigned int tag ) {
|
||||
|
||||
return ( tag && ( tag <= DHCP_ENCAP_OPT ( DHCP_MAX_OPTION,
|
||||
DHCP_MAX_OPTION ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Store value of DHCP option setting
|
||||
*
|
||||
|
||||
@@ -134,6 +134,19 @@ find_dhcp_packet_field ( unsigned int tag ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check applicability of DHCP setting
|
||||
*
|
||||
* @v dhcppkt DHCP packet
|
||||
* @v tag Setting tag number
|
||||
* @ret applies Setting applies within this settings block
|
||||
*/
|
||||
static int dhcppkt_applies ( struct dhcp_packet *dhcppkt __unused,
|
||||
unsigned int tag ) {
|
||||
|
||||
return dhcpopt_applies ( tag );
|
||||
}
|
||||
|
||||
/**
|
||||
* Store value of DHCP packet setting
|
||||
*
|
||||
@@ -204,6 +217,21 @@ int dhcppkt_fetch ( struct dhcp_packet *dhcppkt, unsigned int tag,
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Check applicability of DHCP setting
|
||||
*
|
||||
* @v settings Settings block
|
||||
* @v setting Setting
|
||||
* @ret applies Setting applies within this settings block
|
||||
*/
|
||||
static int dhcppkt_settings_applies ( struct settings *settings,
|
||||
struct setting *setting ) {
|
||||
struct dhcp_packet *dhcppkt =
|
||||
container_of ( settings, struct dhcp_packet, settings );
|
||||
|
||||
return dhcppkt_applies ( dhcppkt, setting->tag );
|
||||
}
|
||||
|
||||
/**
|
||||
* Store value of DHCP setting
|
||||
*
|
||||
@@ -242,6 +270,7 @@ static int dhcppkt_settings_fetch ( struct settings *settings,
|
||||
|
||||
/** DHCP settings operations */
|
||||
static struct settings_operations dhcppkt_settings_operations = {
|
||||
.applies = dhcppkt_settings_applies,
|
||||
.store = dhcppkt_settings_store,
|
||||
.fetch = dhcppkt_settings_fetch,
|
||||
};
|
||||
|
||||
@@ -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,13 +38,29 @@ 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
|
||||
*
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user