]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[netdevice] Add "hwaddr" setting
authorMichael Brown <mcb30@ipxe.org>
Wed, 6 Sep 2017 09:49:22 +0000 (10:49 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 6 Sep 2017 09:52:30 +0000 (10:52 +0100)
Expose the underlying hardware address as a setting.  For IPoIB
devices, this provides scripts with access to the Infiniband GUID.

Requested-by: Allen, Benjamin S. <bsallen@alcf.anl.gov>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/net/netdev_settings.c

index c54288d4f86ef2c0469fe47db80fc942aa371cfa..cc2e1035416b7e99244139eb23493342625b4f1c 100644 (file)
@@ -45,6 +45,11 @@ const struct setting mac_setting __setting ( SETTING_NETDEV, mac ) = {
        .description = "MAC address",
        .type = &setting_type_hex,
 };
+const struct setting hwaddr_setting __setting ( SETTING_NETDEV, hwaddr ) = {
+       .name = "hwaddr",
+       .description = "Hardware address",
+       .type = &setting_type_hex,
+};
 const struct setting bustype_setting __setting ( SETTING_NETDEV, bustype ) = {
        .name = "bustype",
        .description = "Bus type",
@@ -78,7 +83,7 @@ const struct setting mtu_setting __setting ( SETTING_NETDEV, mtu ) = {
 };
 
 /**
- * Store MAC address setting
+ * Store link-layer address setting
  *
  * @v netdev           Network device
  * @v data             Setting data, or NULL to clear setting
@@ -103,7 +108,7 @@ static int netdev_store_mac ( struct net_device *netdev,
 }
 
 /**
- * Fetch MAC address setting
+ * Fetch link-layer address setting
  *
  * @v netdev           Network device
  * @v data             Buffer to fill with setting data
@@ -112,11 +117,30 @@ static int netdev_store_mac ( struct net_device *netdev,
  */
 static int netdev_fetch_mac ( struct net_device *netdev, void *data,
                              size_t len ) {
+       size_t max_len = netdev->ll_protocol->ll_addr_len;
 
-       if ( len > netdev->ll_protocol->ll_addr_len )
-               len = netdev->ll_protocol->ll_addr_len;
+       if ( len > max_len )
+               len = max_len;
        memcpy ( data, netdev->ll_addr, len );
-       return netdev->ll_protocol->ll_addr_len;
+       return max_len;
+}
+
+/**
+ * Fetch hardware address 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_hwaddr ( struct net_device *netdev, void *data,
+                                size_t len ) {
+       size_t max_len = netdev->ll_protocol->hw_addr_len;
+
+       if ( len > max_len )
+               len = max_len;
+       memcpy ( data, netdev->hw_addr, len );
+       return max_len;
 }
 
 /**
@@ -253,6 +277,7 @@ struct netdev_setting_operation {
 /** Network device settings */
 static struct netdev_setting_operation netdev_setting_operations[] = {
        { &mac_setting, netdev_store_mac, netdev_fetch_mac },
+       { &hwaddr_setting, NULL, netdev_fetch_hwaddr },
        { &bustype_setting, NULL, netdev_fetch_bustype },
        { &busloc_setting, NULL, netdev_fetch_busloc },
        { &busid_setting, NULL, netdev_fetch_busid },