Skip to content

Commit 5846f14

Browse files
Merge pull request #41 from yeze/master
fix udp forward query may receive a response that is not reply the query
2 parents 4c81faf + d844d46 commit 5846f14

File tree

1 file changed

+26
-21
lines changed

1 file changed

+26
-21
lines changed

kdns/src/forward.c

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ struct rte_ring *fwd_pkt_to_process_ring;
7777

7878

7979
static domain_fwd_addrs * resolve_dns_servers(char * domain_suffix,char * dns_addrs);
80-
static void *thread_fwd_pkt_process(void *socket);
80+
static void *thread_fwd_pkt_process();
8181
static void *thread_fwd_cache_expired_cleanup(void *arg);
8282

8383

@@ -303,18 +303,8 @@ int remote_sock_init(char * fwd_addrs, char * fwd_def_addr,int fwd_threads){
303303
/* create a separate thread to send task status as quick as possible */
304304
int i =0;
305305
for( ;i< fwd_threads;i++){
306-
int * remote_sock = (int *) xalloc(sizeof(int));
307306
pthread_t *thread_id = (pthread_t *) xalloc(sizeof(pthread_t));
308-
*remote_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
309-
struct timeval tv = {2, 0};
310-
311-
if (setsockopt(*remote_sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) {
312-
313-
log_msg(LOG_ERR,"socket option SO_RCVTIMEO not support\n");
314-
exit(-1);
315-
}
316-
317-
pthread_create(thread_id, NULL, thread_fwd_pkt_process, (void*)remote_sock);
307+
pthread_create(thread_id, NULL, thread_fwd_pkt_process, NULL);
318308

319309
char tname[16];
320310
snprintf(tname, sizeof(tname), "kdns_udp_fwd_%d", i);
@@ -378,19 +368,36 @@ static domain_fwd_addrs * resolve_dns_servers(char * domain_suffix,char * dns_ad
378368
return fwd_addrs;
379369
}
380370

381-
static int dns_do_remote_query(int remote_sock, char *buf, ssize_t len, dns_addr_t *id_addr) {
371+
static int dns_do_remote_query(char *buf, ssize_t len, dns_addr_t *id_addr) {
372+
int remote_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
373+
if (remote_sock == -1) {
374+
log_msg(LOG_ERR,"dns_do_remote_query socket errno=%d, errinfo=%s\n", errno, strerror(errno));
375+
return -1;
376+
}
377+
378+
struct timeval tv = {2, 0};
379+
if (setsockopt(remote_sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) {
380+
log_msg(LOG_ERR,"dns_do_remote_query setsockopt SO_RCVTIMEO errno=%d, errinfo=%s\n", errno, strerror(errno));
381+
close(remote_sock);
382+
return -1;
383+
}
384+
382385
if (-1 == sendto(remote_sock, buf, len, 0, id_addr->addr, id_addr->addrlen)) {
383386
log_msg(LOG_ERR,"dns_do_remote_query sendto errno=%d, errinfo=%s\n", errno, strerror(errno));
387+
close(remote_sock);
384388
return -1;
385389
}
390+
386391
struct sockaddr src_addr;
387392
socklen_t src_len = sizeof(struct sockaddr);
388-
389393
len = recvfrom(remote_sock, buf, BUF_SIZE, 0, &src_addr, &src_len);
390-
if (len <0) {
394+
if (len < 0) {
391395
log_msg(LOG_ERR,"dns_do_remote_query recvfrom errno=%d, errinfo=%s\n", errno, strerror(errno));
396+
close(remote_sock);
397+
return -1;
392398
}
393399

400+
close(remote_sock);
394401
return len;
395402
}
396403

@@ -406,7 +413,7 @@ domain_fwd_addrs * find_zone_fwd_addrs(char * domain_name){
406413
return default_fwd_addrs;
407414
}
408415

409-
static int do_dns_handle_remote(int socket, struct rte_mbuf *pkt, uint16_t old_id, uint16_t qtype, char *domain) {
416+
static int do_dns_handle_remote(struct rte_mbuf *pkt, uint16_t old_id, uint16_t qtype, char *domain) {
410417
struct ether_hdr *eth_hdr = NULL;
411418
struct ipv4_hdr *ip4_hdr = NULL;
412419
struct udp_hdr *udp_hdr = NULL;
@@ -439,7 +446,7 @@ static int do_dns_handle_remote(int socket, struct rte_mbuf *pkt, uint16_t old_
439446
int i =0;
440447
int retfwd =0;
441448
for (;i < fwd_addrs->servers_len; i++) {
442-
retfwd = dns_do_remote_query(socket,buf_data,len,&fwd_addrs->server_addrs[i]);
449+
retfwd = dns_do_remote_query(buf_data,len,&fwd_addrs->server_addrs[i]);
443450
if (retfwd > 0) {
444451
break;
445452
} else {
@@ -527,13 +534,11 @@ uint16_t fwd_pkts_dequeue(struct rte_mbuf **mbufs,uint16_t pkts_len)
527534
}
528535

529536

530-
static void *thread_fwd_pkt_process(void *socket){
537+
static void *thread_fwd_pkt_process(){
531538

532539
log_msg(LOG_INFO,"Starting thread_fwd_pkt_process \n");
533540
struct fwd_pkt_input *etm ;
534541

535-
int * remote_sock = (int *)socket;
536-
537542
while (1){
538543

539544
int ret = rte_ring_mc_dequeue(fwd_pkt_to_process_ring, (void **)&etm);
@@ -544,7 +549,7 @@ static void *thread_fwd_pkt_process(void *socket){
544549
}
545550

546551
rte_atomic64_inc(&fwd_stats.dns_fwd_rcv);
547-
int fwd_len = do_dns_handle_remote(*remote_sock,etm->pkt,etm->old_id,etm->qtype,etm->domain_name);
552+
int fwd_len = do_dns_handle_remote(etm->pkt,etm->old_id,etm->qtype,etm->domain_name);
548553

549554
if (unlikely(fwd_len <= 0)){
550555
log_msg(LOG_ERR,"can not get rte_mbuf from do_dns_handle_remote\n");

0 commit comments

Comments
 (0)