#include <haproxy/time.h>
#include <haproxy/tools.h>
#include <haproxy/vars.h>
+#include <haproxy/xxhash.h>
struct list sec_resolvers = LIST_HEAD_INIT(sec_resolvers);
struct resolv_answer_item *answer_record, *tmp_record;
struct resolv_response *r_res;
struct eb32_node *eb32;
+ uint32_t key = 0;
int i, found = 0;
int cause = RSLV_RESP_ERROR;
answer_record->data.in4.sin_family = AF_INET;
memcpy(&answer_record->data.in4.sin_addr, reader, answer_record->data_len);
+ key = XXH32(reader, answer_record->data_len, answer_record->type);
break;
case DNS_RTYPE_CNAME:
memcpy(answer_record->data.target, tmpname, len);
answer_record->data.target[len] = 0;
+ key = XXH32(tmpname, len, answer_record->type);
previous_dname = answer_record->data.target;
break;
answer_record->data_len = len;
memcpy(answer_record->data.target, tmpname, len);
answer_record->data.target[len] = 0;
+ key = XXH32(tmpname, len, answer_record->type);
if (answer_record->ar_item != NULL) {
pool_free(resolv_answer_item_pool, answer_record->ar_item);
answer_record->ar_item = NULL;
answer_record->data.in6.sin6_family = AF_INET6;
memcpy(&answer_record->data.in6.sin6_addr, reader, answer_record->data_len);
+ key = XXH32(reader, answer_record->data_len, answer_record->type);
break;
} /* switch (record type) */
/* Lookup to see if we already had this entry */
found = 0;
- for (eb32 = eb32_first(&r_res->answer_tree); eb32 != NULL; eb32 = eb32_next(eb32)) {
+ for (eb32 = eb32_lookup(&r_res->answer_tree, key); eb32 != NULL; eb32 = eb32_next(eb32)) {
tmp_record = eb32_entry(eb32, typeof(*tmp_record), link);
if (tmp_record->type != answer_record->type)
continue;
else {
answer_record->last_seen = now_ms;
answer_record->ar_item = NULL;
- answer_record->link.key = 0; // will be set later
+ answer_record->link.key = key;
eb32_insert(&r_res->answer_tree, &answer_record->link);
answer_record = NULL;
}