diff --git a/src/dns.c b/src/dns.c index 527ccae..327bf5f 100644 --- a/src/dns.c +++ b/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; } diff --git a/src/dns_client.c b/src/dns_client.c index 2fe9e51..a8a9d4b 100644 --- a/src/dns_client.c +++ b/src/dns_client.c @@ -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) { diff --git a/src/dns_client.h b/src/dns_client.h index 24238ac..0ffa5af 100644 --- a/src/dns_client.h +++ b/src/dns_client.h @@ -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 diff --git a/src/dns_server.c b/src/dns_server.c index a1b0ac6..54f45fd 100644 --- a/src/dns_server.c +++ b/src/dns_server.c @@ -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; }