]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/netdev: generate persistent MAC address when creating netdev interface
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 9 Nov 2021 06:51:58 +0000 (15:51 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 4 Dec 2021 06:05:32 +0000 (15:05 +0900)
Preparation for later commits.

src/network/netdev/netdev.c
src/network/netdev/netdev.h
src/network/netdev/veth.c

index 5d88cbdf5f12bda3333b35143cf224e2dfec62b6..6c6b4c306857770ba0973ff8b058d835d54fe827 100644 (file)
@@ -391,17 +391,25 @@ int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *message) {
 
 #define HASH_KEY SD_ID128_MAKE(52,e1,45,bd,00,6f,29,96,21,c6,30,6d,83,71,04,48)
 
-int netdev_generate_hw_addr(NetDev *netdev, const char *name, struct hw_addr_data *hw_addr) {
+int netdev_generate_hw_addr(
+                NetDev *netdev,
+                const char *name,
+                const struct hw_addr_data *hw_addr,
+                struct hw_addr_data *ret) {
+
+        struct hw_addr_data a = HW_ADDR_NULL;
         bool warn_invalid = false;
-        struct hw_addr_data a;
         int r;
 
         assert(netdev);
         assert(name);
         assert(hw_addr);
+        assert(ret);
 
-        if (hw_addr_equal(hw_addr, &HW_ADDR_NONE))
+        if (hw_addr_equal(hw_addr, &HW_ADDR_NONE)) {
+                *ret = HW_ADDR_NULL;
                 return 0;
+        }
 
         if (hw_addr->length == 0) {
                 uint64_t result;
@@ -409,16 +417,16 @@ int netdev_generate_hw_addr(NetDev *netdev, const char *name, struct hw_addr_dat
                 /* HardwareAddress= is not specified. */
 
                 if (!NETDEV_VTABLE(netdev)->generate_mac)
-                        return 0;
+                        goto finalize;
 
                 if (NETDEV_VTABLE(netdev)->iftype != ARPHRD_ETHER)
-                        return 0;
+                        goto finalize;
 
                 r = net_get_unique_predictable_data_from_name(name, &HASH_KEY, &result);
                 if (r < 0) {
                         log_netdev_warning_errno(netdev, r,
                                                  "Failed to generate persistent MAC address, ignoring: %m");
-                        return 0;
+                        goto finalize;
                 }
 
                 a.length = arphrd_to_hw_addr_len(NETDEV_VTABLE(netdev)->iftype);
@@ -428,7 +436,8 @@ int netdev_generate_hw_addr(NetDev *netdev, const char *name, struct hw_addr_dat
                 if (ether_addr_is_null(&a.ether) || ether_addr_is_broadcast(&a.ether)) {
                         log_netdev_warning_errno(netdev, SYNTHETIC_ERRNO(EINVAL),
                                                  "Failed to generate persistent MAC address, ignoring: %m");
-                        return 0;
+                        a = HW_ADDR_NULL;
+                        goto finalize;
                 }
         } else {
                 a = *hw_addr;
@@ -439,12 +448,14 @@ int netdev_generate_hw_addr(NetDev *netdev, const char *name, struct hw_addr_dat
         if (r < 0)
                 return r;
 
-        *hw_addr = a;
+finalize:
+        *ret = a;
         return 0;
 }
 
 static int netdev_create(NetDev *netdev, Link *link, link_netlink_message_handler_t callback) {
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
+        struct hw_addr_data hw_addr;
         int r;
 
         assert(netdev);
@@ -470,8 +481,13 @@ static int netdev_create(NetDev *netdev, Link *link, link_netlink_message_handle
         if (r < 0)
                 return log_netdev_error_errno(netdev, r, "Could not append IFLA_IFNAME, attribute: %m");
 
-        if (netdev->hw_addr.length > 0 && !hw_addr_equal(&netdev->hw_addr, &HW_ADDR_NULL)) {
-                r = netlink_message_append_hw_addr(m, IFLA_ADDRESS, &netdev->hw_addr);
+        r = netdev_generate_hw_addr(netdev, netdev->ifname, &netdev->hw_addr, &hw_addr);
+        if (r < 0)
+                return r;
+
+        if (hw_addr.length > 0) {
+                log_netdev_debug(netdev, "Using MAC address: %s", HW_ADDR_TO_STR(&hw_addr));
+                r = netlink_message_append_hw_addr(m, IFLA_ADDRESS, &hw_addr);
                 if (r < 0)
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_ADDRESS attribute: %m");
         }
@@ -789,10 +805,6 @@ int netdev_load_one(Manager *manager, const char *filename) {
         if (!netdev->filename)
                 return log_oom();
 
-        r = netdev_generate_hw_addr(netdev, netdev->ifname, &netdev->hw_addr);
-        if (r < 0)
-                return r;
-
         r = hashmap_ensure_put(&netdev->manager->netdevs, &string_hash_ops, netdev->ifname, netdev);
         if (r == -ENOMEM)
                 return log_oom();
index ed8a2e33c51addc8c101b41790f26d92dd0b70ce..b226cf20a7a5e18d6d2f6d5acd24b7cb9a17d702 100644 (file)
@@ -201,7 +201,8 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(NetDev*, netdev_unref);
 bool netdev_is_managed(NetDev *netdev);
 int netdev_get(Manager *manager, const char *name, NetDev **ret);
 int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *newlink);
-int netdev_generate_hw_addr(NetDev *netdev, const char *name, struct hw_addr_data *hw_addr);
+int netdev_generate_hw_addr(NetDev *netdev, const char *name,
+                            const struct hw_addr_data *hw_addr, struct hw_addr_data *ret);
 int netdev_join(NetDev *netdev, Link *link, link_netlink_message_handler_t cb);
 
 int request_process_stacked_netdev(Request *req);
index d7870d7628a476c38c2ebed88f513a599bcc1d41..5dd8586a3a7eccceacd45043bb9b3b568d5b7f99 100644 (file)
@@ -10,6 +10,7 @@
 #include "veth.h"
 
 static int netdev_veth_fill_message_create(NetDev *netdev, Link *link, sd_netlink_message *m) {
+        struct hw_addr_data hw_addr;
         Veth *v;
         int r;
 
@@ -31,8 +32,13 @@ static int netdev_veth_fill_message_create(NetDev *netdev, Link *link, sd_netlin
                         return log_netdev_error_errno(netdev, r, "Failed to add netlink interface name: %m");
         }
 
-        if (v->hw_addr_peer.length > 0 && !hw_addr_equal(&v->hw_addr_peer, &HW_ADDR_NULL)) {
-                r = netlink_message_append_hw_addr(m, IFLA_ADDRESS, &v->hw_addr_peer);
+        r = netdev_generate_hw_addr(netdev, v->ifname_peer, &v->hw_addr_peer, &hw_addr);
+        if (r < 0)
+                return r;
+
+        if (hw_addr.length > 0) {
+                log_netdev_debug(netdev, "Using MAC address for peer: %s", HW_ADDR_TO_STR(&hw_addr));
+                r = netlink_message_append_hw_addr(m, IFLA_ADDRESS, &hw_addr);
                 if (r < 0)
                         return log_netdev_error_errno(netdev, r, "Could not append IFLA_ADDRESS attribute: %m");
         }
@@ -52,7 +58,6 @@ static int netdev_veth_fill_message_create(NetDev *netdev, Link *link, sd_netlin
 
 static int netdev_veth_verify(NetDev *netdev, const char *filename) {
         Veth *v;
-        int r;
 
         assert(netdev);
         assert(filename);
@@ -66,10 +71,6 @@ static int netdev_veth_verify(NetDev *netdev, const char *filename) {
                                                 "Veth NetDev without peer name configured in %s. Ignoring",
                                                 filename);
 
-        r = netdev_generate_hw_addr(netdev, v->ifname_peer, &v->hw_addr_peer);
-        if (r < 0)
-                return r;
-
         return 0;
 }