int sd_ipv4ll_set_mac(sd_ipv4ll *ll, const struct ether_addr *addr) { int r; assert_return(ll, -EINVAL); if (!ll->random_data) { uint64_t seed; /* If no random data is set, generate some from the MAC */ seed = siphash24(&addr->ether_addr_octet, ETH_ALEN, HASH_KEY.bytes); assert_cc(sizeof(unsigned) <= 8); r = sd_ipv4ll_set_address_seed(ll, (unsigned) htole64(seed)); if (r < 0) return r; } return sd_ipv4acd_set_mac(ll->acd, addr); }
static int client_run(int ifindex, const struct in_addr *pa, const struct ether_addr *ha, sd_event *e) { sd_ipv4acd *acd; assert_se(sd_ipv4acd_new(&acd) >= 0); assert_se(sd_ipv4acd_attach_event(acd, e, 0) >= 0); assert_se(sd_ipv4acd_set_index(acd, ifindex) >= 0); assert_se(sd_ipv4acd_set_mac(acd, ha) >= 0); assert_se(sd_ipv4acd_set_address(acd, pa) >= 0); assert_se(sd_ipv4acd_set_callback(acd, acd_handler, NULL) >= 0); log_info("starting IPv4ACD client"); assert_se(sd_ipv4acd_start(acd) >= 0); assert_se(sd_event_loop(e) >= 0); assert_se(!sd_ipv4acd_unref(acd)); return EXIT_SUCCESS; }