/** * Create a generic IP address object from the current expanded * assignment. */ static void create_ip_address(struct ipset_iterator *iterator) { struct cork_ip *addr = &iterator->addr; struct ipset_expanded_assignment *exp = iterator->assignment_iterator; /* Initialize the address to all 0 bits. */ memset(addr, 0, sizeof(struct cork_ip)); /* Check variable 0 to see if this is an IPv4 or IPv6 address. */ addr->version = IPSET_BIT_GET(exp->values.buf, 0)? 4: 6; /* Copy bits from the expanded assignment. The number of bits to * copy is given as the current netmask. We'll have calculated that * already based on the non-expanded assignment. */ unsigned int i; for (i = 0; i < iterator->cidr_prefix; i++) { IPSET_BIT_SET(&addr->ip, i, IPSET_BIT_GET(exp->values.buf, i+1)); } #if IPSET_DEBUG char buf[CORK_IP_STRING_LENGTH]; cork_ip_to_raw_string(addr, buf); DEBUG("Current IP address is %s/%u", buf, iterator->cidr_prefix); #endif }
static void create_ip_address(ipset_iterator_t *iterator) { ipset_ip_t *addr = &iterator->addr; ipset_expanded_assignment_t *exp = iterator->assignment_iterator; /* * Check variable 0 to see if this is an IPv4 or IPv6 address. */ addr->is_ipv4 = IPSET_BIT_GET(exp->values->data, 0); /* * Initialize the address to all 0 bits. */ memset(addr->addr, 0, sizeof(guint32) * 4); /* * Copy bits from the expanded assignment. The number of bits to * copy is given as the current netmask. We'll have calculated * that already based on the non-expanded assignment. */ guint i; for (i = 0; i < iterator->netmask; i++) { IPSET_BIT_SET(addr->addr, i, IPSET_BIT_GET(exp->values->data, i+1)); } g_d_debug("Current IP address is %s/%u", ipset_ip_to_string(addr), iterator->netmask); }
END_TEST /*----------------------------------------------------------------------- * Expanded assignments */ START_TEST(test_bdd_assignment_expand_1) { ipset_assignment_t *a; a = ipset_assignment_new(); ipset_assignment_set(a, 0, TRUE); ipset_assignment_set(a, 1, FALSE); ipset_expanded_assignment_t *it; it = ipset_assignment_expand(a, 2); GByteArray *ea = g_byte_array_sized_new(1); memset(ea->data, 0, 1); fail_if(it->finished, "Expanded assignment shouldn't be empty"); IPSET_BIT_SET(ea->data, 0, TRUE); IPSET_BIT_SET(ea->data, 1, FALSE); fail_unless(memcmp(ea->data, it->values->data, 1) == 0, "Expanded assignment doesn't match"); ipset_expanded_assignment_advance(it); fail_unless(it->finished, "Expanded assignment should have 1 element"); g_byte_array_free(ea, TRUE); ipset_expanded_assignment_free(it); ipset_assignment_free(a); }