From: Yu Watanabe Date: Fri, 25 Jun 2021 14:33:11 +0000 (+0900) Subject: network: introduce callback fucntions to check the sender MAC address for IPv4ACD... X-Git-Tag: v249-rc3~17^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d7ab6ef098f9d0eb01bfba5ed3bd2a1e3a960156;p=thirdparty%2Fsystemd.git network: introduce callback fucntions to check the sender MAC address for IPv4ACD and IPv4LL Fixes #12145. --- diff --git a/src/network/networkd-ipv4acd.c b/src/network/networkd-ipv4acd.c index 06dfa2d5400..ea902d9766e 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) diff --git a/src/network/networkd-ipv4ll.c b/src/network/networkd-ipv4ll.c index be6fedf90fd..83ed3726f7d 100644 --- a/src/network/networkd-ipv4ll.c +++ b/src/network/networkd-ipv4ll.c @@ -141,6 +141,21 @@ static void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata) { } } +static int ipv4ll_check_mac(sd_ipv4ll *ll, 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; +} + int ipv4ll_configure(Link *link) { uint64_t seed; int r; @@ -180,7 +195,7 @@ int ipv4ll_configure(Link *link) { if (r < 0) return r; - return 0; + return sd_ipv4ll_set_check_mac_callback(link->ipv4ll, ipv4ll_check_mac, link->manager); } int ipv4ll_update_mac(Link *link) {