mirror of
https://github.com/ipxe/ipxe
synced 2025-12-12 23:15:10 +03:00
[ecm] Treat ACPI MAC address as being a non-permanent MAC address
When applying an ACPI-provided system-specific MAC address, apply it
to netdev->ll_addr rather than netdev->hw_addr. This allows iPXE
scripts to access the permanent MAC address via the ${netX/hwaddr}
setting (and thereby provides scripts with a mechanism to ascertain
that the NIC is using a MAC address other than its own permanent
hardware address).
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -84,24 +84,18 @@ ecm_ethernet_descriptor ( struct usb_configuration_descriptor *config,
|
|||||||
*
|
*
|
||||||
* @v func USB function
|
* @v func USB function
|
||||||
* @v desc Ethernet functional descriptor
|
* @v desc Ethernet functional descriptor
|
||||||
* @v hw_addr Hardware address to fill in
|
* @v netdev Network device
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
int ecm_fetch_mac ( struct usb_function *func,
|
int ecm_fetch_mac ( struct usb_function *func,
|
||||||
struct ecm_ethernet_descriptor *desc, uint8_t *hw_addr ) {
|
struct ecm_ethernet_descriptor *desc,
|
||||||
|
struct net_device *netdev ) {
|
||||||
struct usb_device *usb = func->usb;
|
struct usb_device *usb = func->usb;
|
||||||
char buf[ base16_encoded_len ( ETH_ALEN ) + 1 /* NUL */ ];
|
char buf[ base16_encoded_len ( ETH_ALEN ) + 1 /* NUL */ ];
|
||||||
|
uint8_t amac[ETH_ALEN];
|
||||||
int len;
|
int len;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Use system-specific MAC address, if present and not already used */
|
|
||||||
if ( ( ( rc = acpi_mac ( hw_addr ) ) == 0 ) &&
|
|
||||||
! find_netdev_by_ll_addr ( ðernet_protocol, hw_addr ) ) {
|
|
||||||
DBGC ( usb, "USB %s using system-specific MAC %s\n",
|
|
||||||
func->name, eth_ntoa ( hw_addr ) );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fetch MAC address string */
|
/* Fetch MAC address string */
|
||||||
len = usb_get_string_descriptor ( usb, desc->mac, 0, buf,
|
len = usb_get_string_descriptor ( usb, desc->mac, 0, buf,
|
||||||
sizeof ( buf ) );
|
sizeof ( buf ) );
|
||||||
@@ -118,7 +112,7 @@ int ecm_fetch_mac ( struct usb_function *func,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Decode MAC address */
|
/* Decode MAC address */
|
||||||
len = base16_decode ( buf, hw_addr, ETH_ALEN );
|
len = base16_decode ( buf, netdev->hw_addr, ETH_ALEN );
|
||||||
if ( len < 0 ) {
|
if ( len < 0 ) {
|
||||||
rc = len;
|
rc = len;
|
||||||
DBGC ( usb, "USB %s could not decode ECM MAC \"%s\": %s\n",
|
DBGC ( usb, "USB %s could not decode ECM MAC \"%s\": %s\n",
|
||||||
@@ -126,6 +120,16 @@ int ecm_fetch_mac ( struct usb_function *func,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Apply system-specific MAC address as current link-layer
|
||||||
|
* address, if present and not already used.
|
||||||
|
*/
|
||||||
|
if ( ( ( rc = acpi_mac ( amac ) ) == 0 ) &&
|
||||||
|
! find_netdev_by_ll_addr ( ðernet_protocol, amac ) ) {
|
||||||
|
memcpy ( netdev->ll_addr, amac, ETH_ALEN );
|
||||||
|
DBGC ( usb, "USB %s using system-specific MAC %s\n",
|
||||||
|
func->name, eth_ntoa ( netdev->ll_addr ) );
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -474,7 +478,7 @@ static int ecm_probe ( struct usb_function *func,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Fetch MAC address */
|
/* Fetch MAC address */
|
||||||
if ( ( rc = ecm_fetch_mac ( func, ethernet, netdev->hw_addr ) ) != 0 ) {
|
if ( ( rc = ecm_fetch_mac ( func, ethernet, netdev ) ) != 0 ) {
|
||||||
DBGC ( ecm, "ECM %p could not fetch MAC address: %s\n",
|
DBGC ( ecm, "ECM %p could not fetch MAC address: %s\n",
|
||||||
ecm, strerror ( rc ) );
|
ecm, strerror ( rc ) );
|
||||||
goto err_fetch_mac;
|
goto err_fetch_mac;
|
||||||
|
|||||||
@@ -88,6 +88,6 @@ ecm_ethernet_descriptor ( struct usb_configuration_descriptor *config,
|
|||||||
struct usb_interface_descriptor *interface );
|
struct usb_interface_descriptor *interface );
|
||||||
extern int ecm_fetch_mac ( struct usb_function *func,
|
extern int ecm_fetch_mac ( struct usb_function *func,
|
||||||
struct ecm_ethernet_descriptor *desc,
|
struct ecm_ethernet_descriptor *desc,
|
||||||
uint8_t *hw_addr );
|
struct net_device *netdev );
|
||||||
|
|
||||||
#endif /* _ECM_H */
|
#endif /* _ECM_H */
|
||||||
|
|||||||
@@ -598,7 +598,7 @@ static int ncm_probe ( struct usb_function *func,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Fetch MAC address */
|
/* Fetch MAC address */
|
||||||
if ( ( rc = ecm_fetch_mac ( func, ethernet, netdev->hw_addr ) ) != 0 ) {
|
if ( ( rc = ecm_fetch_mac ( func, ethernet, netdev ) ) != 0 ) {
|
||||||
DBGC ( ncm, "NCM %p could not fetch MAC address: %s\n",
|
DBGC ( ncm, "NCM %p could not fetch MAC address: %s\n",
|
||||||
ncm, strerror ( rc ) );
|
ncm, strerror ( rc ) );
|
||||||
goto err_fetch_mac;
|
goto err_fetch_mac;
|
||||||
|
|||||||
Reference in New Issue
Block a user