|
@@ -299,12 +299,15 @@ static void _dns_server_audit_log(struct dns_request *request)
|
|
|
}
|
|
|
|
|
|
if (request->qtype == DNS_T_AAAA && request->has_ipv6) {
|
|
|
- snprintf(req_result, sizeof(req_result), "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", request->ipv6_addr[0],
|
|
|
- request->ipv6_addr[1], request->ipv6_addr[2], request->ipv6_addr[3], request->ipv6_addr[4], request->ipv6_addr[5], request->ipv6_addr[6],
|
|
|
- request->ipv6_addr[7], request->ipv6_addr[8], request->ipv6_addr[9], request->ipv6_addr[10], request->ipv6_addr[11], request->ipv6_addr[12],
|
|
|
+ snprintf(req_result, sizeof(req_result),
|
|
|
+ "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", request->ipv6_addr[0],
|
|
|
+ request->ipv6_addr[1], request->ipv6_addr[2], request->ipv6_addr[3], request->ipv6_addr[4],
|
|
|
+ request->ipv6_addr[5], request->ipv6_addr[6], request->ipv6_addr[7], request->ipv6_addr[8],
|
|
|
+ request->ipv6_addr[9], request->ipv6_addr[10], request->ipv6_addr[11], request->ipv6_addr[12],
|
|
|
request->ipv6_addr[13], request->ipv6_addr[14], request->ipv6_addr[15]);
|
|
|
} else if (request->qtype == DNS_T_A && request->has_ipv4) {
|
|
|
- snprintf(req_result, sizeof(req_result), "%d.%d.%d.%d", request->ipv4_addr[0], request->ipv4_addr[1], request->ipv4_addr[2], request->ipv4_addr[3]);
|
|
|
+ snprintf(req_result, sizeof(req_result), "%d.%d.%d.%d", request->ipv4_addr[0], request->ipv4_addr[1],
|
|
|
+ request->ipv4_addr[2], request->ipv4_addr[3]);
|
|
|
} else if (request->has_soa) {
|
|
|
if (!dns_conf_audit_log_SOA) {
|
|
|
return;
|
|
@@ -317,9 +320,11 @@ static void _dns_server_audit_log(struct dns_request *request)
|
|
|
gethost_by_addr(req_host, sizeof(req_host), &request->addr);
|
|
|
tlog_localtime(&tm);
|
|
|
|
|
|
- snprintf(req_time, sizeof(req_time), "[%.4d-%.2d-%.2d %.2d:%.2d:%.2d,%.3d]", tm.year, tm.mon, tm.mday, tm.hour, tm.min, tm.sec, tm.usec / 1000);
|
|
|
+ snprintf(req_time, sizeof(req_time), "[%.4d-%.2d-%.2d %.2d:%.2d:%.2d,%.3d]", tm.year, tm.mon, tm.mday, tm.hour,
|
|
|
+ tm.min, tm.sec, tm.usec / 1000);
|
|
|
|
|
|
- tlog_printf(dns_audit, "%s %s query %s, type %d, result %s\n", req_time, req_host, request->domain, request->qtype, req_result);
|
|
|
+ tlog_printf(dns_audit, "%s %s query %s, type %d, result %s\n", req_time, req_host, request->domain, request->qtype,
|
|
|
+ req_result);
|
|
|
}
|
|
|
|
|
|
static int _dns_add_rrs(struct dns_packet *packet, struct dns_request *request)
|
|
@@ -437,7 +442,8 @@ static int _dns_server_reply_tcp_to_buffer(struct dns_server_conn_tcp_client *tc
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_reply_tcp(struct dns_request *request, struct dns_server_conn_tcp_client *tcpclient, void *packet, unsigned short len)
|
|
|
+static int _dns_server_reply_tcp(struct dns_request *request, struct dns_server_conn_tcp_client *tcpclient,
|
|
|
+ void *packet, unsigned short len)
|
|
|
{
|
|
|
int send_len = 0;
|
|
|
unsigned char inpacket_data[DNS_IN_PACKSIZE];
|
|
@@ -465,10 +471,12 @@ static int _dns_server_reply_tcp(struct dns_request *request, struct dns_server_
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_reply_udp(struct dns_request *request, struct dns_server_conn_udp *udpserver, unsigned char *inpacket, int inpacket_len)
|
|
|
+static int _dns_server_reply_udp(struct dns_request *request, struct dns_server_conn_udp *udpserver,
|
|
|
+ unsigned char *inpacket, int inpacket_len)
|
|
|
{
|
|
|
int send_len = 0;
|
|
|
- send_len = sendto(udpserver->head.fd, inpacket, inpacket_len, 0, (struct sockaddr *)&request->addr, request->addr_len);
|
|
|
+ send_len =
|
|
|
+ sendto(udpserver->head.fd, inpacket, inpacket_len, 0, (struct sockaddr *)&request->addr, request->addr_len);
|
|
|
if (send_len != inpacket_len) {
|
|
|
tlog(TLOG_ERROR, "send failed.");
|
|
|
return -1;
|
|
@@ -558,7 +566,6 @@ static int _dns_result_callback_nxdomain(struct dns_request *request)
|
|
|
char ip[DNS_MAX_CNAME_LEN];
|
|
|
unsigned int ping_time = -1;
|
|
|
|
|
|
-
|
|
|
ip[0] = 0;
|
|
|
if (request->result_callback == NULL) {
|
|
|
return 0;
|
|
@@ -586,20 +593,24 @@ static int _dns_result_callback(struct dns_request *request)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- sprintf(ip, "%d.%d.%d.%d", request->ipv4_addr[0], request->ipv4_addr[1], request->ipv4_addr[2], request->ipv4_addr[3]);
|
|
|
+ sprintf(ip, "%d.%d.%d.%d", request->ipv4_addr[0], request->ipv4_addr[1], request->ipv4_addr[2],
|
|
|
+ request->ipv4_addr[3]);
|
|
|
ping_time = request->ping_ttl_v4;
|
|
|
- return request->result_callback(request->domain, request->rcode, request->qtype, ip, ping_time, request->user_ptr);
|
|
|
+ return request->result_callback(request->domain, request->rcode, request->qtype, ip, ping_time,
|
|
|
+ request->user_ptr);
|
|
|
} else if (request->qtype == DNS_T_AAAA) {
|
|
|
if (request->has_ipv6 == 0) {
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- sprintf(ip, "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", request->ipv6_addr[0], request->ipv6_addr[1],
|
|
|
- request->ipv6_addr[2], request->ipv6_addr[3], request->ipv6_addr[4], request->ipv6_addr[5], request->ipv6_addr[6], request->ipv6_addr[7],
|
|
|
- request->ipv6_addr[8], request->ipv6_addr[9], request->ipv6_addr[10], request->ipv6_addr[11], request->ipv6_addr[12], request->ipv6_addr[13],
|
|
|
- request->ipv6_addr[14], request->ipv6_addr[15]);
|
|
|
+ sprintf(ip, "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", request->ipv6_addr[0],
|
|
|
+ request->ipv6_addr[1], request->ipv6_addr[2], request->ipv6_addr[3], request->ipv6_addr[4],
|
|
|
+ request->ipv6_addr[5], request->ipv6_addr[6], request->ipv6_addr[7], request->ipv6_addr[8],
|
|
|
+ request->ipv6_addr[9], request->ipv6_addr[10], request->ipv6_addr[11], request->ipv6_addr[12],
|
|
|
+ request->ipv6_addr[13], request->ipv6_addr[14], request->ipv6_addr[15]);
|
|
|
ping_time = request->ping_ttl_v6;
|
|
|
- return request->result_callback(request->domain, request->rcode, request->qtype, ip, ping_time, request->user_ptr);
|
|
|
+ return request->result_callback(request->domain, request->rcode, request->qtype, ip, ping_time,
|
|
|
+ request->user_ptr);
|
|
|
}
|
|
|
|
|
|
_dns_result_callback_nxdomain(request);
|
|
@@ -695,8 +706,8 @@ static int _dns_server_request_complete_A(struct dns_request *request)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- tlog(TLOG_INFO, "result: %s, rcode: %d, %d.%d.%d.%d\n", request->domain, request->rcode, request->ipv4_addr[0], request->ipv4_addr[1],
|
|
|
- request->ipv4_addr[2], request->ipv4_addr[3]);
|
|
|
+ tlog(TLOG_INFO, "result: %s, rcode: %d, %d.%d.%d.%d\n", request->domain, request->rcode, request->ipv4_addr[0],
|
|
|
+ request->ipv4_addr[1], request->ipv4_addr[2], request->ipv4_addr[3]);
|
|
|
|
|
|
request->has_soa = 0;
|
|
|
if (request->has_ping_result == 0 && request->ttl_v4 > DNS_SERVER_TMOUT_TTL) {
|
|
@@ -709,10 +720,12 @@ static int _dns_server_request_complete_A(struct dns_request *request)
|
|
|
|
|
|
/* if doing prefetch, update cache only */
|
|
|
if (request->prefetch) {
|
|
|
- dns_cache_replace(request->domain, cname, cname_ttl, request->ttl_v4, DNS_T_A, request->ipv4_addr, DNS_RR_A_LEN, request->ping_ttl_v4);
|
|
|
+ dns_cache_replace(request->domain, cname, cname_ttl, request->ttl_v4, DNS_T_A, request->ipv4_addr, DNS_RR_A_LEN,
|
|
|
+ request->ping_ttl_v4);
|
|
|
} else {
|
|
|
/* insert result to cache */
|
|
|
- dns_cache_insert(request->domain, cname, cname_ttl, request->ttl_v4, DNS_T_A, request->ipv4_addr, DNS_RR_A_LEN, request->ping_ttl_v4);
|
|
|
+ dns_cache_insert(request->domain, cname, cname_ttl, request->ttl_v4, DNS_T_A, request->ipv4_addr, DNS_RR_A_LEN,
|
|
|
+ request->ping_ttl_v4);
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -729,10 +742,13 @@ static int _dns_server_request_complete_AAAA(struct dns_request *request)
|
|
|
}
|
|
|
|
|
|
if (request->has_ipv6) {
|
|
|
- tlog(TLOG_INFO, "result: %s, rcode: %d, %.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", request->domain, request->rcode,
|
|
|
- request->ipv6_addr[0], request->ipv6_addr[1], request->ipv6_addr[2], request->ipv6_addr[3], request->ipv6_addr[4], request->ipv6_addr[5],
|
|
|
- request->ipv6_addr[6], request->ipv6_addr[7], request->ipv6_addr[8], request->ipv6_addr[9], request->ipv6_addr[10], request->ipv6_addr[11],
|
|
|
- request->ipv6_addr[12], request->ipv6_addr[13], request->ipv6_addr[14], request->ipv6_addr[15]);
|
|
|
+ tlog(TLOG_INFO,
|
|
|
+ "result: %s, rcode: %d, %.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
|
|
|
+ request->domain, request->rcode, request->ipv6_addr[0], request->ipv6_addr[1], request->ipv6_addr[2],
|
|
|
+ request->ipv6_addr[3], request->ipv6_addr[4], request->ipv6_addr[5], request->ipv6_addr[6],
|
|
|
+ request->ipv6_addr[7], request->ipv6_addr[8], request->ipv6_addr[9], request->ipv6_addr[10],
|
|
|
+ request->ipv6_addr[11], request->ipv6_addr[12], request->ipv6_addr[13], request->ipv6_addr[14],
|
|
|
+ request->ipv6_addr[15]);
|
|
|
|
|
|
if (request->has_ping_result == 0 && request->ttl_v6 > DNS_SERVER_TMOUT_TTL) {
|
|
|
request->ttl_v6 = DNS_SERVER_TMOUT_TTL;
|
|
@@ -741,10 +757,12 @@ static int _dns_server_request_complete_AAAA(struct dns_request *request)
|
|
|
/* if doing prefetch, update cache only */
|
|
|
if (_dns_server_has_bind_flag(request, BIND_FLAG_NO_CACHE) != 0) {
|
|
|
if (request->prefetch) {
|
|
|
- dns_cache_replace(request->domain, cname, cname_ttl, request->ttl_v6, DNS_T_AAAA, request->ipv6_addr, DNS_RR_AAAA_LEN, request->ping_ttl_v6);
|
|
|
+ dns_cache_replace(request->domain, cname, cname_ttl, request->ttl_v6, DNS_T_AAAA, request->ipv6_addr,
|
|
|
+ DNS_RR_AAAA_LEN, request->ping_ttl_v6);
|
|
|
} else {
|
|
|
/* insert result to cache */
|
|
|
- dns_cache_insert(request->domain, cname, cname_ttl, request->ttl_v6, DNS_T_AAAA, request->ipv6_addr, DNS_RR_AAAA_LEN, request->ping_ttl_v6);
|
|
|
+ dns_cache_insert(request->domain, cname, cname_ttl, request->ttl_v6, DNS_T_AAAA, request->ipv6_addr,
|
|
|
+ DNS_RR_AAAA_LEN, request->ping_ttl_v6);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -752,17 +770,20 @@ static int _dns_server_request_complete_AAAA(struct dns_request *request)
|
|
|
}
|
|
|
|
|
|
if (request->has_ipv4 && (request->ping_ttl_v4 > 0)) {
|
|
|
- tlog(TLOG_INFO, "result: %s, rcode: %d, %d.%d.%d.%d\n", request->domain, request->rcode, request->ipv4_addr[0], request->ipv4_addr[1],
|
|
|
- request->ipv4_addr[2], request->ipv4_addr[3]);
|
|
|
+ tlog(TLOG_INFO, "result: %s, rcode: %d, %d.%d.%d.%d\n", request->domain, request->rcode, request->ipv4_addr[0],
|
|
|
+ request->ipv4_addr[1], request->ipv4_addr[2], request->ipv4_addr[3]);
|
|
|
|
|
|
/* if ipv4 is fasting than ipv6, add ipv4 to cache, and return SOA for AAAA request */
|
|
|
- if ((request->ping_ttl_v4 + (dns_conf_dualstack_ip_selection_threshold * 10)) < request->ping_ttl_v6 || request->ping_ttl_v6 < 0) {
|
|
|
+ if ((request->ping_ttl_v4 + (dns_conf_dualstack_ip_selection_threshold * 10)) < request->ping_ttl_v6 ||
|
|
|
+ request->ping_ttl_v6 < 0) {
|
|
|
tlog(TLOG_DEBUG, "Force IPV4 perfered.");
|
|
|
if (_dns_server_has_bind_flag(request, BIND_FLAG_NO_CACHE) != 0) {
|
|
|
if (request->prefetch) {
|
|
|
- dns_cache_replace(request->domain, cname, cname_ttl, request->ttl_v4, DNS_T_A, request->ipv4_addr, DNS_RR_A_LEN, request->ping_ttl_v4);
|
|
|
+ dns_cache_replace(request->domain, cname, cname_ttl, request->ttl_v4, DNS_T_A, request->ipv4_addr,
|
|
|
+ DNS_RR_A_LEN, request->ping_ttl_v4);
|
|
|
} else {
|
|
|
- dns_cache_insert(request->domain, cname, cname_ttl, request->ttl_v4, DNS_T_A, request->ipv4_addr, DNS_RR_A_LEN, request->ping_ttl_v4);
|
|
|
+ dns_cache_insert(request->domain, cname, cname_ttl, request->ttl_v4, DNS_T_A, request->ipv4_addr,
|
|
|
+ DNS_RR_A_LEN, request->ping_ttl_v4);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -891,16 +912,19 @@ static void _dns_server_select_possible_ipaddress(struct dns_request *request)
|
|
|
case DNS_T_A: {
|
|
|
memcpy(request->ipv4_addr, selected_addr_map->ipv4_addr, DNS_RR_A_LEN);
|
|
|
request->ttl_v4 = DNS_SERVER_TMOUT_TTL;
|
|
|
- tlog(TLOG_DEBUG, "possible result: %s, rcode: %d, %d.%d.%d.%d\n", request->domain, request->rcode, request->ipv4_addr[0], request->ipv4_addr[1],
|
|
|
- request->ipv4_addr[2], request->ipv4_addr[3]);
|
|
|
+ tlog(TLOG_DEBUG, "possible result: %s, rcode: %d, %d.%d.%d.%d\n", request->domain, request->rcode,
|
|
|
+ request->ipv4_addr[0], request->ipv4_addr[1], request->ipv4_addr[2], request->ipv4_addr[3]);
|
|
|
} break;
|
|
|
case DNS_T_AAAA: {
|
|
|
memcpy(request->ipv6_addr, selected_addr_map->ipv6_addr, DNS_RR_AAAA_LEN);
|
|
|
request->ttl_v6 = DNS_SERVER_TMOUT_TTL;
|
|
|
- tlog(TLOG_DEBUG, "possible result: %s, rcode: %d, %.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", request->domain,
|
|
|
- request->rcode, request->ipv6_addr[0], request->ipv6_addr[1], request->ipv6_addr[2], request->ipv6_addr[3], request->ipv6_addr[4],
|
|
|
- request->ipv6_addr[5], request->ipv6_addr[6], request->ipv6_addr[7], request->ipv6_addr[8], request->ipv6_addr[9], request->ipv6_addr[10],
|
|
|
- request->ipv6_addr[11], request->ipv6_addr[12], request->ipv6_addr[13], request->ipv6_addr[14], request->ipv6_addr[15]);
|
|
|
+ tlog(TLOG_DEBUG,
|
|
|
+ "possible result: %s, rcode: %d, %.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
|
|
|
+ request->domain, request->rcode, request->ipv6_addr[0], request->ipv6_addr[1], request->ipv6_addr[2],
|
|
|
+ request->ipv6_addr[3], request->ipv6_addr[4], request->ipv6_addr[5], request->ipv6_addr[6],
|
|
|
+ request->ipv6_addr[7], request->ipv6_addr[8], request->ipv6_addr[9], request->ipv6_addr[10],
|
|
|
+ request->ipv6_addr[11], request->ipv6_addr[12], request->ipv6_addr[13], request->ipv6_addr[14],
|
|
|
+ request->ipv6_addr[15]);
|
|
|
} break;
|
|
|
default:
|
|
|
break;
|
|
@@ -998,8 +1022,9 @@ errout:
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-static void _dns_server_ping_result(struct ping_host_struct *ping_host, const char *host, FAST_PING_RESULT result, struct sockaddr *addr, socklen_t addr_len,
|
|
|
- int seqno, int ttl, struct timeval *tv, void *userptr)
|
|
|
+static void _dns_server_ping_result(struct ping_host_struct *ping_host, const char *host, FAST_PING_RESULT result,
|
|
|
+ struct sockaddr *addr, socklen_t addr_len, int seqno, int ttl, struct timeval *tv,
|
|
|
+ void *userptr)
|
|
|
{
|
|
|
struct dns_request *request = userptr;
|
|
|
int may_complete = 0;
|
|
@@ -1181,7 +1206,8 @@ static int _dns_server_get_conf_ttl(int ttl)
|
|
|
return ttl;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_ip_rule_check(struct dns_request *request, unsigned char *addr, int addr_len, dns_type_t addr_type, int result_flag)
|
|
|
+static int _dns_server_ip_rule_check(struct dns_request *request, unsigned char *addr, int addr_len,
|
|
|
+ dns_type_t addr_type, int result_flag)
|
|
|
{
|
|
|
prefix_t prefix;
|
|
|
radix_node_t *node = NULL;
|
|
@@ -1266,7 +1292,8 @@ static int _dns_server_is_adblock_ipv6(unsigned char addr[16])
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_process_answer_A(struct dns_rrs *rrs, struct dns_request *request, char *domain, unsigned int result_flag, int ping_timeout)
|
|
|
+static int _dns_server_process_answer_A(struct dns_rrs *rrs, struct dns_request *request, char *domain,
|
|
|
+ unsigned int result_flag, int ping_timeout)
|
|
|
{
|
|
|
int ttl;
|
|
|
int ip_check_result = 0;
|
|
@@ -1339,7 +1366,8 @@ static int _dns_server_process_answer_A(struct dns_rrs *rrs, struct dns_request
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_process_answer_AAAA(struct dns_rrs *rrs, struct dns_request *request, char *domain, unsigned int result_flag, int ping_timeout)
|
|
|
+static int _dns_server_process_answer_AAAA(struct dns_rrs *rrs, struct dns_request *request, char *domain,
|
|
|
+ unsigned int result_flag, int ping_timeout)
|
|
|
{
|
|
|
unsigned char addr[16];
|
|
|
char name[DNS_MAX_CNAME_LEN] = {0};
|
|
@@ -1354,8 +1382,9 @@ static int _dns_server_process_answer_AAAA(struct dns_rrs *rrs, struct dns_reque
|
|
|
_dns_server_request_get(request);
|
|
|
dns_get_AAAA(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
|
|
|
|
|
|
- tlog(TLOG_DEBUG, "domain: %s TTL: %d IP: %.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", name, ttl, 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]);
|
|
|
+ tlog(TLOG_DEBUG, "domain: %s TTL: %d IP: %.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
|
|
|
+ name, ttl, 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]);
|
|
|
|
|
|
ip_check_result = _dns_server_ip_rule_check(request, addr, 16, DNS_T_AAAA, result_flag);
|
|
|
if (ip_check_result == 0) {
|
|
@@ -1399,8 +1428,9 @@ static int _dns_server_process_answer_AAAA(struct dns_rrs *rrs, struct dns_reque
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- 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]);
|
|
|
+ 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]);
|
|
|
|
|
|
/* start ping */
|
|
|
if (_dns_server_check_speed(request, ip, 0, ping_timeout) != 0) {
|
|
@@ -1410,7 +1440,8 @@ static int _dns_server_process_answer_AAAA(struct dns_rrs *rrs, struct dns_reque
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_process_answer(struct dns_request *request, char *domain, struct dns_packet *packet, unsigned int result_flag)
|
|
|
+static int _dns_server_process_answer(struct dns_request *request, char *domain, struct dns_packet *packet,
|
|
|
+ unsigned int result_flag)
|
|
|
{
|
|
|
int ttl;
|
|
|
char name[DNS_MAX_CNAME_LEN] = {0};
|
|
@@ -1477,9 +1508,11 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain,
|
|
|
request->has_soa = 1;
|
|
|
request->rcode = packet->head.rcode;
|
|
|
dns_get_SOA(rrs, name, 128, &ttl, &request->soa);
|
|
|
- tlog(TLOG_DEBUG, "domain: %s, qtype: %d, SOA: mname: %s, rname: %s, serial: %d, refresh: %d, retry: %d, expire: %d, minimum: %d", domain,
|
|
|
- request->qtype, request->soa.mname, request->soa.rname, request->soa.serial, request->soa.refresh, request->soa.retry, request->soa.expire,
|
|
|
- request->soa.minimum);
|
|
|
+ tlog(TLOG_DEBUG,
|
|
|
+ "domain: %s, qtype: %d, SOA: mname: %s, rname: %s, serial: %d, refresh: %d, retry: %d, expire: "
|
|
|
+ "%d, minimum: %d",
|
|
|
+ domain, request->qtype, request->soa.mname, request->soa.rname, request->soa.serial,
|
|
|
+ request->soa.refresh, request->soa.retry, request->soa.expire, request->soa.minimum);
|
|
|
if (atomic_inc_return(&request->soa_num) >= (dns_server_num() / 2)) {
|
|
|
_dns_server_request_complete(request);
|
|
|
}
|
|
@@ -1508,7 +1541,8 @@ static int dns_server_update_reply_packet_id(struct dns_request *request, unsign
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_passthrough_rule_check(struct dns_request *request, char *domain, struct dns_packet *packet, unsigned int result_flag)
|
|
|
+static int _dns_server_passthrough_rule_check(struct dns_request *request, char *domain, struct dns_packet *packet,
|
|
|
+ unsigned int result_flag)
|
|
|
{
|
|
|
int ttl;
|
|
|
char name[DNS_MAX_CNAME_LEN] = {0};
|
|
@@ -1567,8 +1601,10 @@ static int _dns_server_passthrough_rule_check(struct dns_request *request, char
|
|
|
_dns_server_request_get(request);
|
|
|
dns_get_AAAA(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
|
|
|
|
|
|
- tlog(TLOG_DEBUG, "domain: %s TTL: %d IP: %.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", name, ttl, 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]);
|
|
|
+ tlog(TLOG_DEBUG,
|
|
|
+ "domain: %s TTL: %d IP: %.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x",
|
|
|
+ name, ttl, 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]);
|
|
|
|
|
|
ip_check_result = _dns_server_ip_rule_check(request, addr, 16, DNS_T_AAAA, result_flag);
|
|
|
if (ip_check_result == 0) {
|
|
@@ -1591,7 +1627,8 @@ static int _dns_server_passthrough_rule_check(struct dns_request *request, char
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_reply_passthrouth(struct dns_request *request, struct dns_packet *packet, unsigned char *inpacket, int inpacket_len)
|
|
|
+static int _dns_server_reply_passthrouth(struct dns_request *request, struct dns_packet *packet,
|
|
|
+ unsigned char *inpacket, int inpacket_len)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
|
|
@@ -1606,8 +1643,9 @@ static int _dns_server_reply_passthrouth(struct dns_request *request, struct dns
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int dns_server_resolve_callback(char *domain, dns_result_type rtype, unsigned int result_flag, struct dns_packet *packet, unsigned char *inpacket,
|
|
|
- int inpacket_len, void *user_ptr)
|
|
|
+static int dns_server_resolve_callback(char *domain, dns_result_type rtype, unsigned int result_flag,
|
|
|
+ struct dns_packet *packet, unsigned char *inpacket, int inpacket_len,
|
|
|
+ void *user_ptr)
|
|
|
{
|
|
|
struct dns_request *request = user_ptr;
|
|
|
int ip_num = 0;
|
|
@@ -1679,23 +1717,28 @@ static int _dns_server_process_ptr(struct dns_request *request)
|
|
|
struct sockaddr_in *addr_in;
|
|
|
addr_in = (struct sockaddr_in *)ifa->ifa_addr;
|
|
|
addr = (unsigned char *)&(addr_in->sin_addr.s_addr);
|
|
|
- snprintf(reverse_addr, sizeof(reverse_addr), "%d.%d.%d.%d.in-addr.arpa", addr[3], addr[2], addr[1], addr[0]);
|
|
|
+ snprintf(reverse_addr, sizeof(reverse_addr), "%d.%d.%d.%d.in-addr.arpa", addr[3], addr[2], addr[1],
|
|
|
+ addr[0]);
|
|
|
} break;
|
|
|
case AF_INET6: {
|
|
|
struct sockaddr_in6 *addr_in6;
|
|
|
addr_in6 = (struct sockaddr_in6 *)ifa->ifa_addr;
|
|
|
if (IN6_IS_ADDR_V4MAPPED(&addr_in6->sin6_addr)) {
|
|
|
addr = addr_in6->sin6_addr.s6_addr + 12;
|
|
|
- snprintf(reverse_addr, sizeof(reverse_addr), "%d.%d.%d.%d.in-addr.arpa", addr[3], addr[2], addr[1], addr[0]);
|
|
|
+ snprintf(reverse_addr, sizeof(reverse_addr), "%d.%d.%d.%d.in-addr.arpa", addr[3], addr[2], addr[1],
|
|
|
+ addr[0]);
|
|
|
} else {
|
|
|
addr = addr_in6->sin6_addr.s6_addr;
|
|
|
snprintf(reverse_addr, sizeof(reverse_addr),
|
|
|
- "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa", addr[15] & 0xF,
|
|
|
- (addr[15] >> 4) & 0xF, addr[14] & 0xF, (addr[14] >> 4) & 0xF, addr[13] & 0xF, (addr[13] >> 4) & 0xF, addr[12] & 0xF,
|
|
|
- (addr[12] >> 4) & 0xF, addr[11] & 0xF, (addr[11] >> 4) & 0xF, addr[10] & 0xF, (addr[10] >> 4) & 0xF, addr[9] & 0xF,
|
|
|
- (addr[9] >> 4) & 0xF, addr[8] & 0xF, (addr[8] >> 4) & 0xF, addr[7] & 0xF, (addr[7] >> 4) & 0xF, addr[6] & 0xF, (addr[6] >> 4) & 0xF,
|
|
|
- addr[5] & 0xF, (addr[5] >> 4) & 0xF, addr[4] & 0xF, (addr[4] >> 4) & 0xF, addr[3] & 0xF, (addr[3] >> 4) & 0xF, addr[2] & 0xF,
|
|
|
- (addr[2] >> 4) & 0xF, addr[1] & 0xF, (addr[1] >> 4) & 0xF, addr[0] & 0xF, (addr[0] >> 4) & 0xF);
|
|
|
+ "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x."
|
|
|
+ "%x.ip6.arpa",
|
|
|
+ addr[15] & 0xF, (addr[15] >> 4) & 0xF, addr[14] & 0xF, (addr[14] >> 4) & 0xF, addr[13] & 0xF,
|
|
|
+ (addr[13] >> 4) & 0xF, addr[12] & 0xF, (addr[12] >> 4) & 0xF, addr[11] & 0xF,
|
|
|
+ (addr[11] >> 4) & 0xF, addr[10] & 0xF, (addr[10] >> 4) & 0xF, addr[9] & 0xF,
|
|
|
+ (addr[9] >> 4) & 0xF, addr[8] & 0xF, (addr[8] >> 4) & 0xF, addr[7] & 0xF, (addr[7] >> 4) & 0xF,
|
|
|
+ addr[6] & 0xF, (addr[6] >> 4) & 0xF, addr[5] & 0xF, (addr[5] >> 4) & 0xF, addr[4] & 0xF,
|
|
|
+ (addr[4] >> 4) & 0xF, addr[3] & 0xF, (addr[3] >> 4) & 0xF, addr[2] & 0xF, (addr[2] >> 4) & 0xF,
|
|
|
+ addr[1] & 0xF, (addr[1] >> 4) & 0xF, addr[0] & 0xF, (addr[0] >> 4) & 0xF);
|
|
|
}
|
|
|
} break;
|
|
|
default:
|
|
@@ -1736,7 +1779,8 @@ errout:
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-static void _dns_server_log_rule(const char *domain, enum domain_rule rule_type, unsigned char *rule_key, int rule_key_len)
|
|
|
+static void _dns_server_log_rule(const char *domain, enum domain_rule rule_type, unsigned char *rule_key,
|
|
|
+ int rule_key_len)
|
|
|
{
|
|
|
char rule_name[DNS_MAX_CNAME_LEN];
|
|
|
|
|
@@ -1751,8 +1795,7 @@ static void _dns_server_log_rule(const char *domain, enum domain_rule rule_type,
|
|
|
|
|
|
static void _dns_server_update_rule_by_flags(struct dns_request *request)
|
|
|
{
|
|
|
- struct dns_rule_flags *rule_flag =
|
|
|
- (struct dns_rule_flags *)request->domain_rule.rules[0];
|
|
|
+ struct dns_rule_flags *rule_flag = (struct dns_rule_flags *)request->domain_rule.rules[0];
|
|
|
unsigned int flags = 0;
|
|
|
|
|
|
if (rule_flag == NULL) {
|
|
@@ -1828,7 +1871,8 @@ void _dns_server_get_domain_rule(struct dns_request *request)
|
|
|
domain_key[domain_len] = 0;
|
|
|
|
|
|
/* find domain rule */
|
|
|
- art_substring_walk(&dns_conf_domain_rule, (unsigned char *)domain_key, domain_len, _dns_server_get_rules, &walk_args);
|
|
|
+ art_substring_walk(&dns_conf_domain_rule, (unsigned char *)domain_key, domain_len, _dns_server_get_rules,
|
|
|
+ &walk_args);
|
|
|
if (likely(dns_conf_log_level > TLOG_DEBUG)) {
|
|
|
return;
|
|
|
}
|
|
@@ -2004,7 +2048,8 @@ static int _dns_server_process_cache(struct dns_request *request)
|
|
|
if (request->dualstack_selection && request->qtype == DNS_T_AAAA) {
|
|
|
dns_cache_A = dns_cache_lookup(request->domain, DNS_T_A);
|
|
|
if (dns_cache_A && (dns_cache_A->speed > 0)) {
|
|
|
- if ((dns_cache_A->speed + (dns_conf_dualstack_ip_selection_threshold * 10)) < dns_cache->speed || dns_cache->speed < 0) {
|
|
|
+ if ((dns_cache_A->speed + (dns_conf_dualstack_ip_selection_threshold * 10)) < dns_cache->speed ||
|
|
|
+ dns_cache->speed < 0) {
|
|
|
tlog(TLOG_DEBUG, "Force IPV4 perfered.");
|
|
|
dns_cache_release(dns_cache_A);
|
|
|
dns_cache_release(dns_cache);
|
|
@@ -2084,7 +2129,8 @@ static void _dns_server_request_set_enable_prefetch(struct dns_request *request)
|
|
|
request->prefetch = 1;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_request_set_client_addr(struct dns_request *request, struct sockaddr_storage *from, socklen_t from_len)
|
|
|
+static int _dns_server_request_set_client_addr(struct dns_request *request, struct sockaddr_storage *from,
|
|
|
+ socklen_t from_len)
|
|
|
{
|
|
|
switch (from->ss_family) {
|
|
|
case AF_INET:
|
|
@@ -2255,8 +2301,9 @@ errout:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_recv(struct dns_server_conn_head *conn, unsigned char *inpacket, int inpacket_len, struct sockaddr_storage *local, socklen_t local_len,
|
|
|
- struct sockaddr_storage *from, socklen_t from_len)
|
|
|
+static int _dns_server_recv(struct dns_server_conn_head *conn, unsigned char *inpacket, int inpacket_len,
|
|
|
+ struct sockaddr_storage *local, socklen_t local_len, struct sockaddr_storage *from,
|
|
|
+ socklen_t from_len)
|
|
|
{
|
|
|
int decode_len;
|
|
|
int ret = -1;
|
|
@@ -2272,16 +2319,19 @@ static int _dns_server_recv(struct dns_server_conn_head *conn, unsigned char *in
|
|
|
int qtype = DNS_T_ALL;
|
|
|
|
|
|
/* decode packet */
|
|
|
- tlog(TLOG_DEBUG, "recv query packet from %s, len = %d", gethost_by_addr(name, sizeof(name), (struct sockaddr *)from), inpacket_len);
|
|
|
+ tlog(TLOG_DEBUG, "recv query packet from %s, len = %d",
|
|
|
+ gethost_by_addr(name, sizeof(name), (struct sockaddr *)from), inpacket_len);
|
|
|
decode_len = dns_decode(packet, DNS_PACKSIZE, inpacket, inpacket_len);
|
|
|
if (decode_len < 0) {
|
|
|
tlog(TLOG_DEBUG, "decode failed.\n");
|
|
|
goto errout;
|
|
|
}
|
|
|
|
|
|
- tlog(TLOG_DEBUG, "request qdcount = %d, ancount = %d, nscount = %d, nrcount = %d, len = %d, id = %d, tc = %d, rd = %d, ra = %d, rcode = %d\n",
|
|
|
- packet->head.qdcount, packet->head.ancount, packet->head.nscount, packet->head.nrcount, inpacket_len, packet->head.id, packet->head.tc,
|
|
|
- packet->head.rd, packet->head.ra, packet->head.rcode);
|
|
|
+ tlog(TLOG_DEBUG,
|
|
|
+ "request qdcount = %d, ancount = %d, nscount = %d, nrcount = %d, len = %d, id = %d, tc = %d, rd = %d, ra = "
|
|
|
+ "%d, rcode = %d\n",
|
|
|
+ packet->head.qdcount, packet->head.ancount, packet->head.nscount, packet->head.nrcount, inpacket_len,
|
|
|
+ packet->head.id, packet->head.tc, packet->head.rd, packet->head.ra, packet->head.rcode);
|
|
|
|
|
|
if (packet->head.qr != DNS_QR_QUERY) {
|
|
|
goto errout;
|
|
@@ -2452,7 +2502,8 @@ static int _dns_server_client_close(struct dns_server_conn_head *conn)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_tcp_accept(struct dns_server_conn_tcp_server *tcpserver, struct epoll_event *event, unsigned long now)
|
|
|
+static int _dns_server_tcp_accept(struct dns_server_conn_tcp_server *tcpserver, struct epoll_event *event,
|
|
|
+ unsigned long now)
|
|
|
{
|
|
|
struct sockaddr_storage addr;
|
|
|
struct dns_server_conn_tcp_client *tcpclient = NULL;
|
|
@@ -2516,7 +2567,8 @@ static int _dns_server_tcp_recv(struct dns_server_conn_tcp_client *tcpclient)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- len = recv(tcpclient->head.fd, tcpclient->recvbuff.buf + tcpclient->recvbuff.size, sizeof(tcpclient->recvbuff.buf) - tcpclient->recvbuff.size, 0);
|
|
|
+ len = recv(tcpclient->head.fd, tcpclient->recvbuff.buf + tcpclient->recvbuff.size,
|
|
|
+ sizeof(tcpclient->recvbuff.buf) - tcpclient->recvbuff.size, 0);
|
|
|
if (len < 0) {
|
|
|
if (errno == EAGAIN) {
|
|
|
return RECV_ERROR_AGAIN;
|
|
@@ -2566,8 +2618,8 @@ static int _dns_server_tcp_process_one_request(struct dns_server_conn_tcp_client
|
|
|
request_data = (unsigned char *)(tcpclient->recvbuff.buf + proceed_len + sizeof(unsigned short));
|
|
|
|
|
|
/* process one record */
|
|
|
- if (_dns_server_recv(&tcpclient->head, request_data, request_len, &tcpclient->localaddr, tcpclient->localaddr_len, &tcpclient->addr,
|
|
|
- tcpclient->addr_len) != 0) {
|
|
|
+ if (_dns_server_recv(&tcpclient->head, request_data, request_len, &tcpclient->localaddr,
|
|
|
+ tcpclient->localaddr_len, &tcpclient->addr, tcpclient->addr_len) != 0) {
|
|
|
tlog(TLOG_ERROR, "process tcp request failed.");
|
|
|
return RECV_ERROR_FAIL;
|
|
|
}
|
|
@@ -2650,7 +2702,8 @@ static int _dns_server_tcp_send(struct dns_server_conn_tcp_client *tcpclient)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int _dns_server_process_tcp(struct dns_server_conn_tcp_client *dnsserver, struct epoll_event *event, unsigned long now)
|
|
|
+static int _dns_server_process_tcp(struct dns_server_conn_tcp_client *dnsserver, struct epoll_event *event,
|
|
|
+ unsigned long now)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
|
|
@@ -2724,16 +2777,18 @@ static void _dns_server_second_ping_check(struct dns_request *request)
|
|
|
switch (addr_map->addr_type) {
|
|
|
case DNS_T_A: {
|
|
|
_dns_server_request_get(request);
|
|
|
- sprintf(ip, "%d.%d.%d.%d", addr_map->ipv4_addr[0], addr_map->ipv4_addr[1], addr_map->ipv4_addr[2], addr_map->ipv4_addr[3]);
|
|
|
+ sprintf(ip, "%d.%d.%d.%d", addr_map->ipv4_addr[0], addr_map->ipv4_addr[1], addr_map->ipv4_addr[2],
|
|
|
+ addr_map->ipv4_addr[3]);
|
|
|
if (_dns_server_check_speed(request, ip, 1, DNS_PING_SECOND_TIMEOUT) != 0) {
|
|
|
_dns_server_request_release(request);
|
|
|
}
|
|
|
} break;
|
|
|
case DNS_T_AAAA: {
|
|
|
_dns_server_request_get(request);
|
|
|
- sprintf(ip, "[%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x]", addr_map->ipv6_addr[0], addr_map->ipv6_addr[1],
|
|
|
- addr_map->ipv6_addr[2], addr_map->ipv6_addr[3], addr_map->ipv6_addr[4], addr_map->ipv6_addr[5], addr_map->ipv6_addr[6],
|
|
|
- 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],
|
|
|
+ sprintf(ip, "[%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x]",
|
|
|
+ addr_map->ipv6_addr[0], addr_map->ipv6_addr[1], addr_map->ipv6_addr[2], addr_map->ipv6_addr[3],
|
|
|
+ addr_map->ipv6_addr[4], addr_map->ipv6_addr[5], addr_map->ipv6_addr[6], 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_check_speed(request, ip, 1, DNS_PING_SECOND_TIMEOUT) != 0) {
|
|
@@ -2758,7 +2813,8 @@ static void _dns_server_prefetch_domain(struct dns_cache *dns_cache)
|
|
|
}
|
|
|
|
|
|
/* start prefetch domain */
|
|
|
- tlog(TLOG_DEBUG, "prefetch by cache %s, qtype %d, ttl %d, hitnum %d", dns_cache->domain, dns_cache->qtype, dns_cache->ttl, hitnum);
|
|
|
+ tlog(TLOG_DEBUG, "prefetch by cache %s, qtype %d, ttl %d, hitnum %d", dns_cache->domain, dns_cache->qtype,
|
|
|
+ dns_cache->ttl, hitnum);
|
|
|
if (_dns_server_prefetch_request(dns_cache->domain, dns_cache->qtype) != 0) {
|
|
|
tlog(TLOG_ERROR, "prefetch domain %s, qtype %d, failed.", dns_cache->domain, dns_cache->qtype);
|
|
|
}
|
|
@@ -2990,7 +3046,8 @@ static int _dns_create_socket(const char *host_ip, int type)
|
|
|
|
|
|
fd = socket(gai->ai_family, gai->ai_socktype, gai->ai_protocol);
|
|
|
if (fd < 0) {
|
|
|
- tlog(TLOG_ERROR, "create socket failed, family = %d, type = %d, proto = %d, %s\n", gai->ai_family, gai->ai_socktype, gai->ai_protocol, strerror(errno));
|
|
|
+ tlog(TLOG_ERROR, "create socket failed, family = %d, type = %d, proto = %d, %s\n", gai->ai_family,
|
|
|
+ gai->ai_socktype, gai->ai_protocol, strerror(errno));
|
|
|
goto errout;
|
|
|
}
|
|
|
|
|
@@ -3255,4 +3312,3 @@ void dns_server_exit(void)
|
|
|
|
|
|
dns_cache_destroy();
|
|
|
}
|
|
|
-
|