[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>
pull/1180/head
Pavel Krotkiy 2024-04-03 12:52:56 +01:00 committed by Michael Brown
parent 165995b7e9
commit 59f27d6935
2 changed files with 24 additions and 0 deletions

View File

@ -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 );

View File

@ -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",
@ -219,6 +224,22 @@ static int netdev_fetch_busid ( struct net_device *netdev, void *data,
return sizeof ( dhcp_desc );
}
/**
* 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
*
@ -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 },
};