diff options
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 b9220f5ea..d814193b8 100644 --- a/src/net/netdev_settings.c +++ b/src/net/netdev_settings.c @@ -20,8 +20,10 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <string.h> #include <errno.h> +#include <byteswap.h> #include <gpxe/dhcp.h> #include <gpxe/settings.h> +#include <gpxe/device.h> #include <gpxe/netdevice.h> /** @file @@ -36,6 +38,11 @@ struct setting mac_setting __setting = { .description = "MAC address", .type = &setting_type_hex, }; +struct setting busid_setting __setting = { + .name = "busid", + .description = "Bus ID", + .type = &setting_type_hex, +}; /** * Store value of network device setting @@ -74,6 +81,8 @@ 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 ); + struct device_description *desc = &netdev->dev->desc; + struct dhcp_netdev_desc dhcp_desc; if ( setting_cmp ( setting, &mac_setting ) == 0 ) { if ( len > netdev->ll_protocol->ll_addr_len ) @@ -81,6 +90,15 @@ static int netdev_fetch ( struct settings *settings, struct setting *setting, memcpy ( data, netdev->ll_addr, len ); return netdev->ll_protocol->ll_addr_len; } + if ( setting_cmp ( setting, &busid_setting ) == 0 ) { + dhcp_desc.type = desc->bus_type; + dhcp_desc.vendor = htons ( desc->vendor ); + dhcp_desc.device = htons ( desc->device ); + if ( len > sizeof ( dhcp_desc ) ) + len = sizeof ( dhcp_desc ); + memcpy ( data, &dhcp_desc, len ); + return sizeof ( dhcp_desc ); + } return generic_settings_fetch ( settings, setting, data, len ); } |
