summaryrefslogtreecommitdiff
path: root/src/network/netdev
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-11-09 15:51:58 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-12-04 15:05:32 +0900
commita8ee2b8e1f037ac7c6c570c1b126dab0914d257f (patch)
tree4a8465939c6950b37323bb5725755d740f8fd441 /src/network/netdev
parentab9e3bfef614b5a92e1e271376bfda74c82ec707 (diff)
downloadsystemd-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.c40
-rw-r--r--src/network/netdev/netdev.h3
-rw-r--r--src/network/netdev/veth.c15
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;
}