diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-11-09 15:51:58 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-12-04 15:05:32 +0900 |
commit | a8ee2b8e1f037ac7c6c570c1b126dab0914d257f (patch) | |
tree | 4a8465939c6950b37323bb5725755d740f8fd441 /src/network/netdev | |
parent | ab9e3bfef614b5a92e1e271376bfda74c82ec707 (diff) | |
download | systemd-a8ee2b8e1f037ac7c6c570c1b126dab0914d257f.tar.gz |
network/netdev: generate persistent MAC address when creating netdev interface
Preparation for later commits.
Diffstat (limited to 'src/network/netdev')
-rw-r--r-- | src/network/netdev/netdev.c | 40 | ||||
-rw-r--r-- | src/network/netdev/netdev.h | 3 | ||||
-rw-r--r-- | src/network/netdev/veth.c | 15 |
3 files changed, 36 insertions, 22 deletions
diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index 5d88cbdf5f..6c6b4c3068 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -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(); diff --git a/src/network/netdev/netdev.h b/src/network/netdev/netdev.h index ed8a2e33c5..b226cf20a7 100644 --- a/src/network/netdev/netdev.h +++ b/src/network/netdev/netdev.h @@ -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); diff --git a/src/network/netdev/veth.c b/src/network/netdev/veth.c index d7870d7628..5dd8586a3a 100644 --- a/src/network/netdev/veth.c +++ b/src/network/netdev/veth.c @@ -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; } |