static void test_public_api_setters(sd_event *e) { struct in_addr address = {}; unsigned seed = 0; sd_ipv4ll *ll; struct ether_addr mac_addr = { .ether_addr_octet = {'A', 'B', 'C', '1', '2', '3'}}; if (verbose) printf("* %s\n", __FUNCTION__); assert_se(sd_ipv4ll_new(&ll) == 0); assert_se(ll); assert_se(sd_ipv4ll_attach_event(NULL, NULL, 0) == -EINVAL); assert_se(sd_ipv4ll_attach_event(ll, e, 0) == 0); assert_se(sd_ipv4ll_attach_event(ll, e, 0) == -EBUSY); assert_se(sd_ipv4ll_set_callback(NULL, NULL, NULL) == -EINVAL); assert_se(sd_ipv4ll_set_callback(ll, NULL, NULL) == 0); assert_se(sd_ipv4ll_set_address(ll, &address) == -EINVAL); address.s_addr |= htobe32(169U << 24 | 254U << 16); assert_se(sd_ipv4ll_set_address(ll, &address) == -EINVAL); address.s_addr |= htobe32(0x00FF); assert_se(sd_ipv4ll_set_address(ll, &address) == -EINVAL); address.s_addr |= htobe32(0xF000); assert_se(sd_ipv4ll_set_address(ll, &address) == 0); address.s_addr |= htobe32(0x0F00); assert_se(sd_ipv4ll_set_address(ll, &address) == -EINVAL); assert_se(sd_ipv4ll_set_address_seed(NULL, seed) == -EINVAL); assert_se(sd_ipv4ll_set_address_seed(ll, seed) == 0); assert_se(sd_ipv4ll_set_mac(NULL, NULL) == -EINVAL); assert_se(sd_ipv4ll_set_mac(ll, NULL) == -EINVAL); assert_se(sd_ipv4ll_set_mac(ll, &mac_addr) == 0); assert_se(sd_ipv4ll_set_index(NULL, -1) == -EINVAL); assert_se(sd_ipv4ll_set_index(ll, -1) == -EINVAL); assert_se(sd_ipv4ll_set_index(ll, -99) == -EINVAL); assert_se(sd_ipv4ll_set_index(ll, 1) == 0); assert_se(sd_ipv4ll_set_index(ll, 99) == 0); assert_se(sd_ipv4ll_ref(ll) == ll); assert_se(sd_ipv4ll_unref(ll) == NULL); /* Cleanup */ assert_se(sd_ipv4ll_unref(ll) == NULL); }
static int ipv4ll_pick_address(sd_ipv4ll *ll) { struct in_addr in_addr; be32_t addr; int r; int32_t random; assert(ll); assert(ll->random_data); do { r = random_r(ll->random_data, &random); if (r < 0) return r; addr = htonl((random & 0x0000FFFF) | IPV4LL_NETWORK); } while (addr == ll->address || (ntohl(addr) & 0x0000FF00) == 0x0000 || (ntohl(addr) & 0x0000FF00) == 0xFF00); in_addr.s_addr = addr; r = sd_ipv4ll_set_address(ll, &in_addr); if (r < 0) return r; return 0; }