]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[ecm] Treat ACPI MAC address as being a non-permanent MAC address
authorMichael Brown <mcb30@ipxe.org>
Mon, 23 May 2022 11:23:53 +0000 (12:23 +0100)
committerMichael Brown <mcb30@ipxe.org>
Mon, 23 May 2022 11:23:53 +0000 (12:23 +0100)
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>
src/drivers/net/ecm.c
src/drivers/net/ecm.h
src/drivers/net/ncm.c

index 826b3b16d28ac199b8c229b648f2cce9039e5e85..68ac962ab22da1090f833db3285e21932340494c 100644 (file)
@@ -84,24 +84,18 @@ ecm_ethernet_descriptor ( struct usb_configuration_descriptor *config,
  *
  * @v func             USB function
  * @v desc             Ethernet functional descriptor
- * @v hw_addr          Hardware address to fill in
+ * @v netdev           Network device
  * @ret rc             Return status code
  */
 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;
        char buf[ base16_encoded_len ( ETH_ALEN ) + 1 /* NUL */ ];
+       uint8_t amac[ETH_ALEN];
        int len;
        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 ( &ethernet_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 */
        len = usb_get_string_descriptor ( usb, desc->mac, 0, buf,
                                          sizeof ( buf ) );
@@ -118,7 +112,7 @@ int ecm_fetch_mac ( struct usb_function *func,
        }
 
        /* Decode MAC address */
-       len = base16_decode ( buf, hw_addr, ETH_ALEN );
+       len = base16_decode ( buf, netdev->hw_addr, ETH_ALEN );
        if ( len < 0 ) {
                rc = len;
                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;
        }
 
+       /* 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 ( &ethernet_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;
 }
 
@@ -474,7 +478,7 @@ static int ecm_probe ( struct usb_function *func,
        }
 
        /* 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",
                       ecm, strerror ( rc ) );
                goto err_fetch_mac;
index 0ad3ddb953143504c82276bf3cd9d640c106e5bb..a7d03cf94aa02549ecdf2c307b3c7d275cd778f2 100644 (file)
@@ -88,6 +88,6 @@ ecm_ethernet_descriptor ( struct usb_configuration_descriptor *config,
                          struct usb_interface_descriptor *interface );
 extern int ecm_fetch_mac ( struct usb_function *func,
                           struct ecm_ethernet_descriptor *desc,
-                          uint8_t *hw_addr );
+                          struct net_device *netdev );
 
 #endif /* _ECM_H */
index 1e8088d76bfa1ab6ef35aff69ea5fe98d975e246..2c0f91e21f83d269b66c20aa754dc6012656815c 100644 (file)
@@ -598,7 +598,7 @@ static int ncm_probe ( struct usb_function *func,
        }
 
        /* 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",
                       ncm, strerror ( rc ) );
                goto err_fetch_mac;