diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-06-25 23:33:11 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-07-01 00:49:03 +0900 |
commit | d7ab6ef098f9d0eb01bfba5ed3bd2a1e3a960156 (patch) | |
tree | 3473083efe9dbc7a3ab6889807b5f4296b2fb1c8 /src/network/networkd-ipv4acd.c | |
parent | 76a86ffdbee2dd9ef0f2b5338e14eb6ba7671456 (diff) | |
download | systemd-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.c | 19 |
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) |