static inline __u32 hash_id(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t port, ip_set_ip_t *hash_ip) { struct ip_set_ipporthash *map = (struct ip_set_ipporthash *) set->data; __u32 id; u_int16_t i; ip_set_ip_t *elem; *hash_ip = HASH_IP(map, ip, port); DP("set: %s, ipport:%u.%u.%u.%u:%u, %u.%u.%u.%u", set->name, HIPQUAD(ip), port, HIPQUAD(*hash_ip)); for (i = 0; i < map->probes; i++) { id = jhash_ip(map, i, *hash_ip) % map->hashsize; DP("hash key: %u", id); elem = HARRAY_ELEM(map->members, ip_set_ip_t *, id); if (*elem == *hash_ip) return id; /* No shortcut at testing - there can be deleted * entries. */ } return UINT_MAX; }
static inline int __add_haship(struct ip_set_ipporthash *map, ip_set_ip_t hash_ip) { __u32 probe; u_int16_t i; ip_set_ip_t *elem; for (i = 0; i < map->probes; i++) { probe = jhash_ip(map, i, hash_ip) % map->hashsize; elem = HARRAY_ELEM(map->members, ip_set_ip_t *, probe); if (*elem == hash_ip) return -EEXIST; if (!*elem) { *elem = hash_ip; return 0; } } /* Trigger rehashing */ return -EAGAIN; }
static inline __u32 iphash_id(struct ip_set *set, ip_set_ip_t ip) { struct ip_set_iphash *map = set->data; __u32 id; u_int16_t i; ip_set_ip_t *elem; ip &= map->netmask; DP("set: %s, ip: %pI4h", set->name, &ip); for (i = 0; i < map->probes; i++) { id = jhash_ip(map, i, ip) % map->hashsize; DP("hash key: %u", id); elem = HARRAY_ELEM(map->members, ip_set_ip_t *, id); if (*elem == ip) return id; /* No shortcut - there can be deleted entries. */ } return UINT_MAX; }
static inline __u32 hash_id_cidr(struct ip_set_nethash *map, ip_set_ip_t ip, unsigned char cidr, ip_set_ip_t *hash_ip) { __u32 id; u_int16_t i; ip_set_ip_t *elem; *hash_ip = pack(ip, cidr); for (i = 0; i < map->probes; i++) { id = jhash_ip(map, i, *hash_ip) % map->hashsize; DP("hash key: %u", id); elem = HARRAY_ELEM(map->members, ip_set_ip_t *, id); if (*elem == *hash_ip) return id; } return UINT_MAX; }
static inline int __iphash_add(struct ip_set_iphash *map, ip_set_ip_t *ip) { __u32 probe; u_int16_t i; ip_set_ip_t *elem, *slot = NULL; for (i = 0; i < map->probes; i++) { probe = jhash_ip(map, i, *ip) % map->hashsize; elem = HARRAY_ELEM(map->members, ip_set_ip_t *, probe); if (*elem == *ip) return -EEXIST; if (!(slot || *elem)) slot = elem; /* There can be deleted entries, must check all slots */ } if (slot) { *slot = *ip; map->elements++; return 0; } /* Trigger rehashing */ return -EAGAIN; }