summaryrefslogtreecommitdiff
path: root/src/network/networkd-ipv4acd.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-06-25 23:33:11 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-07-01 00:49:03 +0900
commitd7ab6ef098f9d0eb01bfba5ed3bd2a1e3a960156 (patch)
tree3473083efe9dbc7a3ab6889807b5f4296b2fb1c8 /src/network/networkd-ipv4acd.c
parent76a86ffdbee2dd9ef0f2b5338e14eb6ba7671456 (diff)
downloadsystemd-d7ab6ef098f9d0eb01bfba5ed3bd2a1e3a960156.tar.gz
network: introduce callback fucntions to check the sender MAC address for IPv4ACD and IPv4LL
Fixes #12145.
Diffstat (limited to 'src/network/networkd-ipv4acd.c')
-rw-r--r--src/network/networkd-ipv4acd.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/network/networkd-ipv4acd.c b/src/network/networkd-ipv4acd.c
index 06dfa2d540..ea902d9766 100644
--- a/src/network/networkd-ipv4acd.c
+++ b/src/network/networkd-ipv4acd.c
@@ -129,6 +129,21 @@ static void dhcp4_address_on_acd(sd_ipv4acd *acd, int event, void *userdata) {
on_acd(acd, event, userdata, false);
}
+static int ipv4acd_check_mac(sd_ipv4acd *acd, const struct ether_addr *mac, void *userdata) {
+ Manager *m = userdata;
+ struct hw_addr_data hw_addr;
+
+ assert(m);
+ assert(mac);
+
+ hw_addr = (struct hw_addr_data) {
+ .length = ETH_ALEN,
+ .ether = *mac,
+ };
+
+ return link_get_by_hw_addr(m, &hw_addr, NULL) >= 0;
+}
+
static int ipv4acd_configure(Link *link, const Address *a) {
_cleanup_(address_freep) Address *address = NULL;
int r;
@@ -177,6 +192,10 @@ static int ipv4acd_configure(Link *link, const Address *a) {
if (r < 0)
return r;
+ r = sd_ipv4acd_set_check_mac_callback(address->acd, ipv4acd_check_mac, link->manager);
+ if (r < 0)
+ return r;
+
if (link_has_carrier(link)) {
r = sd_ipv4acd_start(address->acd, true);
if (r < 0)