summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Krotkiy2024-04-03 13:52:56 +0200
committerMichael Brown2024-04-03 13:53:46 +0200
commit59f27d69358efc919b50760f3d6dac0b637b5488 (patch)
treea0281105d400ac6bbee62003ac6dc4b19b61965e
parent[efi] Restructure handling of autoexec.ipxe script (diff)
downloadipxe-59f27d69358efc919b50760f3d6dac0b637b5488.tar.gz
ipxe-59f27d69358efc919b50760f3d6dac0b637b5488.tar.xz
ipxe-59f27d69358efc919b50760f3d6dac0b637b5488.zip
[netdevice] Add "linktype" setting
Add a new setting to provide access to the link layer protocol type from scripts. This can be useful in order to skip configuring interfaces based on their link layer protocol or, conversely, configure only selected interface types (Ethernet, IPoIB, etc.) Example script: set idx:int32 0 :loop isset ${net${idx}/mac} || exit 0 iseq ${net${idx}/linktype} IPoIB && goto try_next || autoboot net${idx} || :try_next inc idx && goto loop Signed-off-by: Pavel Krotkiy <porsh@nebius.com> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/include/ipxe/settings.h2
-rw-r--r--src/net/netdev_settings.c22
2 files changed, 24 insertions, 0 deletions
diff --git a/src/include/ipxe/settings.h b/src/include/ipxe/settings.h
index 424188de..0301da12 100644
--- a/src/include/ipxe/settings.h
+++ b/src/include/ipxe/settings.h
@@ -471,6 +471,8 @@ mac_setting __setting ( SETTING_NETDEV, mac );
extern const struct setting
busid_setting __setting ( SETTING_NETDEV, busid );
extern const struct setting
+linktype_setting __setting ( SETTING_NETDEV, linktype );
+extern const struct setting
user_class_setting __setting ( SETTING_HOST_EXTRA, user-class );
extern const struct setting
vendor_class_setting __setting ( SETTING_HOST_EXTRA, vendor-class );
diff --git a/src/net/netdev_settings.c b/src/net/netdev_settings.c
index fb98663c..080b6d2a 100644
--- a/src/net/netdev_settings.c
+++ b/src/net/netdev_settings.c
@@ -65,6 +65,11 @@ const struct setting busid_setting __setting ( SETTING_NETDEV, busid ) = {
.description = "Bus ID",
.type = &setting_type_hex,
};
+const struct setting linktype_setting __setting ( SETTING_NETDEV, linktype ) = {
+ .name = "linktype",
+ .description = "Link-layer type",
+ .type = &setting_type_string,
+};
const struct setting chip_setting __setting ( SETTING_NETDEV, chip ) = {
.name = "chip",
.description = "Chip",
@@ -220,6 +225,22 @@ static int netdev_fetch_busid ( struct net_device *netdev, void *data,
}
/**
+ * Fetch link layer type setting
+ *
+ * @v netdev Network device
+ * @v data Buffer to fill with setting data
+ * @v len Length of buffer
+ * @ret len Length of setting data, or negative error
+ */
+static int netdev_fetch_linktype ( struct net_device *netdev, void *data,
+ size_t len ) {
+ const char *linktype = netdev->ll_protocol->name;
+
+ strncpy ( data, linktype, len );
+ return strlen ( linktype );
+}
+
+/**
* Fetch chip setting
*
* @v netdev Network device
@@ -281,6 +302,7 @@ static struct netdev_setting_operation netdev_setting_operations[] = {
{ &bustype_setting, NULL, netdev_fetch_bustype },
{ &busloc_setting, NULL, netdev_fetch_busloc },
{ &busid_setting, NULL, netdev_fetch_busid },
+ { &linktype_setting, NULL, netdev_fetch_linktype },
{ &chip_setting, NULL, netdev_fetch_chip },
{ &ifname_setting, NULL, netdev_fetch_ifname },
};