]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce callback fucntions to check the sender MAC address for IPv4ACD...
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 25 Jun 2021 14:33:11 +0000 (23:33 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 30 Jun 2021 15:49:03 +0000 (00:49 +0900)
Fixes #12145.

src/network/networkd-ipv4acd.c
src/network/networkd-ipv4ll.c

index 06dfa2d5400d08b44c0b768e8aaac79f3ae2088b..ea902d9766ed08aef8a29953052eae8d1937d8f8 100644 (file)
@@ -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)
index be6fedf90fd7ca8fdbc7a299e6234068d7e53136..83ed3726f7d2cf79476e97d13a7b37091ebd4bbf 100644 (file)
@@ -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) {