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;
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)
}
}
+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;
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) {