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

View File

@@ -61,6 +61,7 @@ struct dns_client {
/* query list */ /* query list */
pthread_mutex_t dns_request_lock; pthread_mutex_t dns_request_lock;
struct list_head dns_request_list; struct list_head dns_request_list;
atomic_t dns_server_num;
/* query doman hash table, key: sid + domain */ /* query doman hash table, key: sid + domain */
pthread_mutex_t domain_map_lock; 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); pthread_mutex_lock(&client.server_list_lock);
list_add(&server_info->list, &client.dns_server_list); list_add(&server_info->list, &client.dns_server_list);
pthread_mutex_unlock(&client.server_list_lock); pthread_mutex_unlock(&client.server_list_lock);
atomic_inc(&client.dns_server_num);
return 0; return 0;
errout: errout:
if (server_info) { 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"); tlog(TLOG_ERROR, "stop ping failed.\n");
} }
free(server_info); free(server_info);
atomic_dec(&client.dns_server_num);
return 0; return 0;
} }
pthread_mutex_unlock(&client.server_list_lock); 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); 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) void _dns_client_query_get(struct dns_query_struct *query)
{ {
atomic_inc(&query->refcnt); 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 */ /* decode domain from udp packet */
len = dns_decode(packet, DNS_PACKSIZE, inpacket, inpacket_len); len = dns_decode(packet, DNS_PACKSIZE, inpacket, inpacket_len);
if (len != 0) { 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; return -1;
} }
@@ -1125,6 +1136,7 @@ int dns_client_init()
memset(&client, 0, sizeof(client)); memset(&client, 0, sizeof(client));
pthread_attr_init(&attr); pthread_attr_init(&attr);
atomic_set(&client.dns_server_num, 0);
epollfd = epoll_create1(EPOLL_CLOEXEC); epollfd = epoll_create1(EPOLL_CLOEXEC);
if (epollfd < 0) { 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 */ /* remove remote dns server */
int dns_remove_server(char *server_ip, int port, dns_server_type_t server_type); int dns_remove_server(char *server_ip, int port, dns_server_type_t server_type);
int dns_server_num(void);
#endif #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 (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); _dns_server_request_release(request);
break; break;
} }