Minor optimization

This commit is contained in:
Nick Peng
2018-08-14 08:18:59 +08:00
parent 8bdb6362b4
commit ee0e6a5357
4 changed files with 23 additions and 9 deletions

View File

@@ -927,12 +927,12 @@ static int _dns_decode_qr_head(struct dns_context *context, char *domain, int do
*/
ret = _dns_decode_domain(context, domain, domain_size);
if (ret < 0) {
tlog(TLOG_ERROR, "decode domain failed.");
tlog(TLOG_WARN, "decode domain failed.");
return -1;
}
if (_dns_left_len(context) < 4) {
tlog(TLOG_ERROR, "left length is not enough, %s.", domain);
tlog(TLOG_WARN, "left length is not enough, %s.", domain);
return -1;
}
@@ -1542,7 +1542,7 @@ static int _dns_decode_body(struct dns_context *context)
for (i = 0; i < head->qdcount; i++) {
ret = _dns_decode_qd(context);
if (ret < 0) {
tlog(TLOG_ERROR, "decode qd failed.");
tlog(TLOG_WARN, "decode qd failed.");
return -1;
}
head->qdcount--;
@@ -1551,7 +1551,7 @@ static int _dns_decode_body(struct dns_context *context)
for (i = 0; i < head->ancount; i++) {
ret = _dns_decode_an(context, DNS_RRS_AN);
if (ret < 0) {
tlog(TLOG_ERROR, "decode an failed.");
tlog(TLOG_WARN, "decode an failed.");
return -1;
}
head->ancount--;
@@ -1560,7 +1560,7 @@ static int _dns_decode_body(struct dns_context *context)
for (i = 0; i < head->nscount; i++) {
ret = _dns_decode_an(context, DNS_RRS_NS);
if (ret < 0) {
tlog(TLOG_ERROR, "decode ns failed.");
tlog(TLOG_WARN, "decode ns failed.");
return -1;
}
head->nscount--;
@@ -1569,7 +1569,7 @@ static int _dns_decode_body(struct dns_context *context)
for (i = 0; i < head->nrcount; i++) {
ret = _dns_decode_an(context, DNS_RRS_NR);
if (ret < 0) {
tlog(TLOG_ERROR, "decode nr failed.");
tlog(TLOG_WARN, "decode nr failed.");
return -1;
}
head->nrcount--;
@@ -1669,7 +1669,7 @@ int dns_decode(struct dns_packet *packet, int maxsize, unsigned char *data, int
ret = _dns_decode_body(&context);
if (ret < 0) {
tlog(TLOG_ERROR, "decode body failed.\n");
tlog(TLOG_WARN, "decode body failed.\n");
return -1;
}

View File

@@ -61,6 +61,7 @@ struct dns_client {
/* query list */
pthread_mutex_t dns_request_lock;
struct list_head dns_request_list;
atomic_t dns_server_num;
/* query doman hash table, key: sid + domain */
pthread_mutex_t domain_map_lock;
@@ -234,6 +235,8 @@ int _dns_client_server_add(char *server_ip, struct addrinfo *gai, dns_server_typ
pthread_mutex_lock(&client.server_list_lock);
list_add(&server_info->list, &client.dns_server_list);
pthread_mutex_unlock(&client.server_list_lock);
atomic_inc(&client.dns_server_num);
return 0;
errout:
if (server_info) {
@@ -299,6 +302,7 @@ int _dns_client_server_remove(char *server_ip, struct addrinfo *gai, dns_server_
tlog(TLOG_ERROR, "stop ping failed.\n");
}
free(server_info);
atomic_dec(&client.dns_server_num);
return 0;
}
pthread_mutex_unlock(&client.server_list_lock);
@@ -361,6 +365,11 @@ int dns_remove_server(char *server_ip, int port, dns_server_type_t server_type)
return _dns_client_server_operate(server_ip, port, server_type, 1);
}
int dns_server_num(void)
{
return atomic_read(&client.dns_server_num);
}
void _dns_client_query_get(struct dns_query_struct *query)
{
atomic_inc(&query->refcnt);
@@ -560,7 +569,9 @@ static int _dns_client_recv(unsigned char *inpacket, int inpacket_len, struct so
/* decode domain from udp packet */
len = dns_decode(packet, DNS_PACKSIZE, inpacket, inpacket_len);
if (len != 0) {
tlog(TLOG_ERROR, "decode failed, packet len = %d, tc=%d, %d\n", inpacket_len, packet->head.tc, packet->head.id);
char host_name[DNS_MAX_CNAME_LEN];
tlog(TLOG_ERROR, "decode failed, packet len = %d, tc = %d, id = %d, from = %s\n", inpacket_len, packet->head.tc, packet->head.id,
gethost_by_addr(host_name, from, from_len));
return -1;
}
@@ -1125,6 +1136,7 @@ int dns_client_init()
memset(&client, 0, sizeof(client));
pthread_attr_init(&attr);
atomic_set(&client.dns_server_num, 0);
epollfd = epoll_create1(EPOLL_CLOEXEC);
if (epollfd < 0) {

View File

@@ -32,4 +32,6 @@ int dns_add_server(char *server_ip, int port, dns_server_type_t server_type);
/* remove remote dns server */
int dns_remove_server(char *server_ip, int port, dns_server_type_t server_type);
int dns_server_num(void);
#endif

View File

@@ -550,7 +550,7 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain,
}
if (addr[0] == 0 || addr[0] == 127) {
if (atomic_inc_return(&request->adblock) <= 1) {
if (atomic_inc_return(&request->adblock) <= dns_server_num() / 2) {
_dns_server_request_release(request);
break;
}