Minor optimization
This commit is contained in:
14
src/dns.c
14
src/dns.c
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user