mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-03-11 05:48:41 +00:00
MINOR: resolvers: merge address and target into a union "data"
These two fields are exclusive as they depend on the data type. Let's move them into a union to save some precious bytes. This reduces the struct resolv_answer_item size from 600 to 576 bytes.
This commit is contained in:
parent
b4ca0195a9
commit
cc8fd4c040
@ -110,12 +110,12 @@ struct resolv_answer_item {
|
||||
int16_t priority; /* SRV type priority */
|
||||
uint16_t weight; /* SRV type weight */
|
||||
uint16_t port; /* SRV type port */
|
||||
uint16_t data_len; /* number of bytes in target below */
|
||||
uint16_t data_len; /* number of bytes in the <data> field below */
|
||||
union {
|
||||
struct sockaddr_in in4; /* IPv4 address for RTYPE_A */
|
||||
struct sockaddr_in6 in6; /* IPv6 address for RTYPE_AAAA */
|
||||
} address;
|
||||
char target[DNS_MAX_NAME_SIZE+1]; /* Response data: SRV or CNAME type target */
|
||||
char target[DNS_MAX_NAME_SIZE+1]; /* Response data: SRV or CNAME type target */
|
||||
} data;
|
||||
unsigned int last_seen; /* When was the answer was last seen */
|
||||
struct resolv_answer_item *ar_item; /* pointer to a RRset from the additional section, if exists */
|
||||
struct list attached_servers; /* attached server head */
|
||||
|
@ -251,7 +251,7 @@ struct resolv_answer_item *find_srvrq_answer_record(const struct resolv_requeste
|
||||
/* search an ANSWER record whose target points to the server's hostname and whose port is
|
||||
* the same as server's svc_port */
|
||||
list_for_each_entry(item, &res->response.answer_list, list) {
|
||||
if (resolv_hostname_cmp(srv->hostname_dn, item->target, srv->hostname_dn_len) == 0 &&
|
||||
if (resolv_hostname_cmp(srv->hostname_dn, item->data.target, srv->hostname_dn_len) == 0 &&
|
||||
(srv->svc_port == item->port))
|
||||
return item;
|
||||
}
|
||||
@ -692,8 +692,8 @@ static void resolv_check_response(struct resolv_resolution *res)
|
||||
srv = NULL;
|
||||
|
||||
/* convert the key to lookup in lower case */
|
||||
for (i = 0 ; item->target[i] ; i++)
|
||||
target[i] = tolower(item->target[i]);
|
||||
for (i = 0 ; item->data.target[i] ; i++)
|
||||
target[i] = tolower(item->data.target[i]);
|
||||
target[i] = 0;
|
||||
|
||||
node = ebis_lookup(&srvrq->named_servers, target);
|
||||
@ -724,7 +724,7 @@ static void resolv_check_response(struct resolv_resolution *res)
|
||||
HA_SPIN_LOCK(SERVER_LOCK, &srv->lock);
|
||||
|
||||
if ((item->data_len != srv->hostname_dn_len)
|
||||
|| resolv_hostname_cmp(srv->hostname_dn, item->target, item->data_len)) {
|
||||
|| resolv_hostname_cmp(srv->hostname_dn, item->data.target, item->data_len)) {
|
||||
HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
|
||||
break;
|
||||
}
|
||||
@ -761,10 +761,10 @@ srv_found:
|
||||
|
||||
switch (item->ar_item->type) {
|
||||
case DNS_RTYPE_A:
|
||||
srv_update_addr(srv, &item->ar_item->address.in4.sin_addr, AF_INET, "DNS additional record");
|
||||
srv_update_addr(srv, &item->ar_item->data.in4.sin_addr, AF_INET, "DNS additional record");
|
||||
break;
|
||||
case DNS_RTYPE_AAAA:
|
||||
srv_update_addr(srv, &item->ar_item->address.in6.sin6_addr, AF_INET6, "DNS additional record");
|
||||
srv_update_addr(srv, &item->ar_item->data.in6.sin6_addr, AF_INET6, "DNS additional record");
|
||||
break;
|
||||
}
|
||||
|
||||
@ -780,7 +780,7 @@ srv_found:
|
||||
const char *msg = NULL;
|
||||
char hostname[DNS_MAX_NAME_SIZE+1];
|
||||
|
||||
if (resolv_dn_label_to_str(item->target, item->data_len,
|
||||
if (resolv_dn_label_to_str(item->data.target, item->data_len,
|
||||
hostname, sizeof(hostname)) == -1) {
|
||||
HA_SPIN_UNLOCK(SERVER_LOCK, &srv->lock);
|
||||
continue;
|
||||
@ -1069,8 +1069,8 @@ static int resolv_validate_dns_response(unsigned char *resp, unsigned char *bufe
|
||||
if (answer_record->data_len != 4)
|
||||
goto invalid_resp;
|
||||
|
||||
answer_record->address.in4.sin_family = AF_INET;
|
||||
memcpy(&answer_record->address.in4.sin_addr, reader, answer_record->data_len);
|
||||
answer_record->data.in4.sin_family = AF_INET;
|
||||
memcpy(&answer_record->data.in4.sin_addr, reader, answer_record->data_len);
|
||||
break;
|
||||
|
||||
case DNS_RTYPE_CNAME:
|
||||
@ -1092,9 +1092,9 @@ static int resolv_validate_dns_response(unsigned char *resp, unsigned char *bufe
|
||||
if (len == 0)
|
||||
goto invalid_resp;
|
||||
|
||||
memcpy(answer_record->target, tmpname, len);
|
||||
answer_record->target[len] = 0;
|
||||
previous_dname = answer_record->target;
|
||||
memcpy(answer_record->data.target, tmpname, len);
|
||||
answer_record->data.target[len] = 0;
|
||||
previous_dname = answer_record->data.target;
|
||||
break;
|
||||
|
||||
|
||||
@ -1120,8 +1120,8 @@ static int resolv_validate_dns_response(unsigned char *resp, unsigned char *bufe
|
||||
goto invalid_resp;
|
||||
|
||||
answer_record->data_len = len;
|
||||
memcpy(answer_record->target, tmpname, len);
|
||||
answer_record->target[len] = 0;
|
||||
memcpy(answer_record->data.target, tmpname, len);
|
||||
answer_record->data.target[len] = 0;
|
||||
if (answer_record->ar_item != NULL) {
|
||||
pool_free(resolv_answer_item_pool, answer_record->ar_item);
|
||||
answer_record->ar_item = NULL;
|
||||
@ -1133,8 +1133,8 @@ static int resolv_validate_dns_response(unsigned char *resp, unsigned char *bufe
|
||||
if (answer_record->data_len != 16)
|
||||
goto invalid_resp;
|
||||
|
||||
answer_record->address.in6.sin6_family = AF_INET6;
|
||||
memcpy(&answer_record->address.in6.sin6_addr, reader, answer_record->data_len);
|
||||
answer_record->data.in6.sin6_family = AF_INET6;
|
||||
memcpy(&answer_record->data.in6.sin6_addr, reader, answer_record->data_len);
|
||||
break;
|
||||
|
||||
} /* switch (record type) */
|
||||
@ -1157,22 +1157,22 @@ static int resolv_validate_dns_response(unsigned char *resp, unsigned char *bufe
|
||||
|
||||
switch(tmp_record->type) {
|
||||
case DNS_RTYPE_A:
|
||||
if (!memcmp(&answer_record->address.in4.sin_addr,
|
||||
&tmp_record->address.in4.sin_addr,
|
||||
sizeof(answer_record->address.in4.sin_addr)))
|
||||
if (!memcmp(&answer_record->data.in4.sin_addr,
|
||||
&tmp_record->data.in4.sin_addr,
|
||||
sizeof(answer_record->data.in4.sin_addr)))
|
||||
found = 1;
|
||||
break;
|
||||
|
||||
case DNS_RTYPE_AAAA:
|
||||
if (!memcmp(&answer_record->address.in6.sin6_addr,
|
||||
&tmp_record->address.in6.sin6_addr,
|
||||
sizeof(answer_record->address.in6.sin6_addr)))
|
||||
if (!memcmp(&answer_record->data.in6.sin6_addr,
|
||||
&tmp_record->data.in6.sin6_addr,
|
||||
sizeof(answer_record->data.in6.sin6_addr)))
|
||||
found = 1;
|
||||
break;
|
||||
|
||||
case DNS_RTYPE_SRV:
|
||||
if (answer_record->data_len == tmp_record->data_len &&
|
||||
!resolv_hostname_cmp(answer_record->target, tmp_record->target, answer_record->data_len) &&
|
||||
!resolv_hostname_cmp(answer_record->data.target, tmp_record->data.target, answer_record->data_len) &&
|
||||
answer_record->port == tmp_record->port) {
|
||||
tmp_record->weight = answer_record->weight;
|
||||
found = 1;
|
||||
@ -1303,8 +1303,8 @@ static int resolv_validate_dns_response(unsigned char *resp, unsigned char *bufe
|
||||
if (answer_record->data_len != 4)
|
||||
goto invalid_resp;
|
||||
|
||||
answer_record->address.in4.sin_family = AF_INET;
|
||||
memcpy(&answer_record->address.in4.sin_addr, reader, answer_record->data_len);
|
||||
answer_record->data.in4.sin_family = AF_INET;
|
||||
memcpy(&answer_record->data.in4.sin_addr, reader, answer_record->data_len);
|
||||
break;
|
||||
|
||||
case DNS_RTYPE_AAAA:
|
||||
@ -1312,8 +1312,8 @@ static int resolv_validate_dns_response(unsigned char *resp, unsigned char *bufe
|
||||
if (answer_record->data_len != 16)
|
||||
goto invalid_resp;
|
||||
|
||||
answer_record->address.in6.sin6_family = AF_INET6;
|
||||
memcpy(&answer_record->address.in6.sin6_addr, reader, answer_record->data_len);
|
||||
answer_record->data.in6.sin6_family = AF_INET6;
|
||||
memcpy(&answer_record->data.in6.sin6_addr, reader, answer_record->data_len);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1342,21 +1342,21 @@ static int resolv_validate_dns_response(unsigned char *resp, unsigned char *bufe
|
||||
ar_item = tmp_record->ar_item;
|
||||
if (ar_item->type != answer_record->type || ar_item->last_seen == now_ms ||
|
||||
len != tmp_record->data_len ||
|
||||
resolv_hostname_cmp(answer_record->name, tmp_record->target, tmp_record->data_len))
|
||||
resolv_hostname_cmp(answer_record->name, tmp_record->data.target, tmp_record->data_len))
|
||||
continue;
|
||||
|
||||
switch(ar_item->type) {
|
||||
case DNS_RTYPE_A:
|
||||
if (!memcmp(&answer_record->address.in4.sin_addr,
|
||||
&ar_item->address.in4.sin_addr,
|
||||
sizeof(answer_record->address.in4.sin_addr)))
|
||||
if (!memcmp(&answer_record->data.in4.sin_addr,
|
||||
&ar_item->data.in4.sin_addr,
|
||||
sizeof(answer_record->data.in4.sin_addr)))
|
||||
found = 1;
|
||||
break;
|
||||
|
||||
case DNS_RTYPE_AAAA:
|
||||
if (!memcmp(&answer_record->address.in6.sin6_addr,
|
||||
&ar_item->address.in6.sin6_addr,
|
||||
sizeof(answer_record->address.in6.sin6_addr)))
|
||||
if (!memcmp(&answer_record->data.in6.sin6_addr,
|
||||
&ar_item->data.in6.sin6_addr,
|
||||
sizeof(answer_record->data.in6.sin6_addr)))
|
||||
found = 1;
|
||||
break;
|
||||
|
||||
@ -1381,7 +1381,7 @@ static int resolv_validate_dns_response(unsigned char *resp, unsigned char *bufe
|
||||
list_for_each_entry(tmp_record, &r_res->answer_list, list) {
|
||||
if (tmp_record->type == DNS_RTYPE_SRV &&
|
||||
tmp_record->ar_item == NULL &&
|
||||
!resolv_hostname_cmp(tmp_record->target, answer_record->name, tmp_record->data_len)) {
|
||||
!resolv_hostname_cmp(tmp_record->data.target, answer_record->name, tmp_record->data_len)) {
|
||||
/* Always use the received additional record to refresh info */
|
||||
if (tmp_record->ar_item)
|
||||
pool_free(resolv_answer_item_pool, tmp_record->ar_item);
|
||||
@ -1466,11 +1466,11 @@ int resolv_get_ip_from_response(struct resolv_response *r_res,
|
||||
|
||||
if (record->type == DNS_RTYPE_A) {
|
||||
ip_type = AF_INET;
|
||||
ip = &record->address.in4.sin_addr;
|
||||
ip = &record->data.in4.sin_addr;
|
||||
}
|
||||
else if (record->type == DNS_RTYPE_AAAA) {
|
||||
ip_type = AF_INET6;
|
||||
ip = &record->address.in6.sin6_addr;
|
||||
ip = &record->data.in6.sin6_addr;
|
||||
}
|
||||
else
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user