diff --git a/src/dns.c b/src/dns.c index 61dac71..88ed1ad 100644 --- a/src/dns.c +++ b/src/dns.c @@ -1346,7 +1346,7 @@ int _dns_encode_opts(struct dns_packet *packet, struct dns_context *context, str payloadsize = DNS_DEFAULT_PACKET_SIZE; } - ret = _dns_encode_rr_head(context, "0", DNS_T_OPT, payloadsize, rcode, rr_len); + ret = _dns_encode_rr_head(context, "", DNS_T_OPT, payloadsize, rcode, rr_len); if (ret < 0) { return -1; } diff --git a/src/dns.h b/src/dns.h index f06d739..436cfff 100644 --- a/src/dns.h +++ b/src/dns.h @@ -10,8 +10,8 @@ #define DNS_RR_AAAA_LEN 16 #define DNS_MAX_CNAME_LEN 256 #define DNS_MAX_OPT_LEN 256 -#define DNS_IN_PACKSIZE (512 * 2) -#define DNS_PACKSIZE (512 * 8) +#define DNS_IN_PACKSIZE (512 * 4) +#define DNS_PACKSIZE (512 * 10) #define DNS_DEFAULT_PACKET_SIZE 512 #define DNS_ADDR_FAMILY_IP 1 diff --git a/src/dns_conf.c b/src/dns_conf.c index 622d10e..207ded0 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -88,8 +88,8 @@ int config_server(int argc, char *argv[], dns_server_type_t type, int default_po } if (index >= DNS_MAX_SERVERS) { - tlog(TLOG_ERROR, "exceeds max server number"); - return -1; + tlog(TLOG_WARN, "exceeds max server number, %s", ip); + return 0; } server = &dns_conf_servers[index]; diff --git a/src/dns_conf.h b/src/dns_conf.h index 0b404ef..740d9d2 100644 --- a/src/dns_conf.h +++ b/src/dns_conf.h @@ -10,7 +10,7 @@ #include "list.h" #include "radix.h" -#define DNS_MAX_SERVERS 32 +#define DNS_MAX_SERVERS 64 #define DNS_MAX_IPSET_NAMELEN 32 #define DNS_MAX_IPLEN 64 #define DNS_MAX_PATH 1024 diff --git a/src/dns_server.c b/src/dns_server.c index 14cdf03..84afb0c 100644 --- a/src/dns_server.c +++ b/src/dns_server.c @@ -51,6 +51,10 @@ #define DNS_MAX_EVENTS 256 #define DNS_SERVER_TMOUT_TTL (3 * 60) #define DNS_CONN_BUFF_SIZE 4096 +#define DNS_REQUEST_MAX_TIMEOUT 1000 +#define DNS_PING_TIMEOUT (DNS_REQUEST_MAX_TIMEOUT - 50) +#define DNS_TCPPING_START (300) +#define DNS_PING_TCP_TIMEOUT (DNS_REQUEST_MAX_TIMEOUT - DNS_TCPPING_START - 50) struct dns_conn_buf { char buf[DNS_CONN_BUFF_SIZE]; @@ -662,15 +666,15 @@ void _dns_server_ping_result(struct ping_host_struct *ping_host, const char *hos may_complete = 1; } - if (may_complete) { + if (may_complete && request->has_ping_result == 1) { _dns_server_request_complete(request); _dns_server_request_remove(request); } } -int _dns_server_ping(struct dns_request *request, char *ip) +int _dns_server_ping(struct dns_request *request, char *ip, int timeout) { - if (fast_ping_start(ip, 1, 0, 1000, _dns_server_ping_result, request) == NULL) { + if (fast_ping_start(ip, 1, 0, timeout, _dns_server_ping_result, request) == NULL) { return -1; } @@ -849,7 +853,7 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain, request->rcode = packet->head.rcode; sprintf(ip, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); - if (_dns_server_ping(request, ip) != 0) { + if (_dns_server_ping(request, ip, DNS_PING_TIMEOUT) != 0) { _dns_server_request_release(request); } } break; @@ -895,7 +899,7 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain, sprintf(ip, "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]); - if (_dns_server_ping(request, ip) != 0) { + if (_dns_server_ping(request, ip, DNS_PING_TIMEOUT) != 0) { _dns_server_request_release(request); } } break; @@ -1642,7 +1646,7 @@ void _dns_server_tcp_ping_check(struct dns_request *request) case DNS_T_A: { _dns_server_request_get(request); sprintf(ip, "%d.%d.%d.%d:80", addr_map->ipv4_addr[0], addr_map->ipv4_addr[1], addr_map->ipv4_addr[2], addr_map->ipv4_addr[3]); - if (_dns_server_ping(request, ip) != 0) { + if (_dns_server_ping(request, ip, DNS_PING_TCP_TIMEOUT) != 0) { _dns_server_request_release(request); } } break; @@ -1653,7 +1657,7 @@ void _dns_server_tcp_ping_check(struct dns_request *request) addr_map->ipv6_addr[7], addr_map->ipv6_addr[8], addr_map->ipv6_addr[9], addr_map->ipv6_addr[10], addr_map->ipv6_addr[11], addr_map->ipv6_addr[12], addr_map->ipv6_addr[13], addr_map->ipv6_addr[14], addr_map->ipv6_addr[15]); - if (_dns_server_ping(request, ip) != 0) { + if (_dns_server_ping(request, ip, DNS_PING_TCP_TIMEOUT) != 0) { _dns_server_request_release(request); } } break; @@ -1726,7 +1730,7 @@ void _dns_server_period_run(void) pthread_mutex_lock(&server.request_list_lock); list_for_each_entry_safe(request, tmp, &server.request_list, list) { - if (request->send_tick < now - 500 && request->has_ping_tcp == 0) { + if (request->send_tick < now - DNS_TCPPING_START && request->has_ping_tcp == 0) { _dns_server_request_get(request); list_add_tail(&request->check_list, &check_list); }