worker.c (266114) | worker.c (276605) |
---|---|
1/* 2 * daemon/worker.c - worker that handles a pending list of requests. 3 * 4 * Copyright (c) 2007, NLnet Labs. All rights reserved. 5 * 6 * This software is open source. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 763 unchanged lines hidden (view full) --- 772{ 773 struct worker* worker = (struct worker*)arg; 774 int ret; 775 hashvalue_t h; 776 struct lruhash_entry* e; 777 struct query_info qinfo; 778 struct edns_data edns; 779 enum acl_access acl; | 1/* 2 * daemon/worker.c - worker that handles a pending list of requests. 3 * 4 * Copyright (c) 2007, NLnet Labs. All rights reserved. 5 * 6 * This software is open source. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 763 unchanged lines hidden (view full) --- 772{ 773 struct worker* worker = (struct worker*)arg; 774 int ret; 775 hashvalue_t h; 776 struct lruhash_entry* e; 777 struct query_info qinfo; 778 struct edns_data edns; 779 enum acl_access acl; |
780 int rc = 0; |
|
780 781 if(error != NETEVENT_NOERROR) { 782 /* some bad tcp query DNS formats give these error calls */ 783 verbose(VERB_ALGO, "handle request called with err=%d", error); 784 return 0; 785 } | 781 782 if(error != NETEVENT_NOERROR) { 783 /* some bad tcp query DNS formats give these error calls */ 784 verbose(VERB_ALGO, "handle request called with err=%d", error); 785 return 0; 786 } |
787#ifdef USE_DNSTAP 788 if(worker->dtenv.log_client_query_messages) 789 dt_msg_send_client_query(&worker->dtenv, &repinfo->addr, c->type, 790 c->buffer); 791#endif |
|
786 acl = acl_list_lookup(worker->daemon->acl, &repinfo->addr, 787 repinfo->addrlen); 788 if((ret=deny_refuse_all(c, acl, worker, repinfo)) != -1) 789 { | 792 acl = acl_list_lookup(worker->daemon->acl, &repinfo->addr, 793 repinfo->addrlen); 794 if((ret=deny_refuse_all(c, acl, worker, repinfo)) != -1) 795 { |
796 if(ret == 1) 797 goto send_reply; |
|
790 return ret; 791 } 792 if((ret=worker_check_request(c->buffer, worker)) != 0) { 793 verbose(VERB_ALGO, "worker check request: bad query."); 794 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 795 if(ret != -1) { 796 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 797 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), ret); --- 7 unchanged lines hidden (view full) --- 805 if(!query_info_parse(&qinfo, c->buffer)) { 806 verbose(VERB_ALGO, "worker parse request: formerror."); 807 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 808 sldns_buffer_rewind(c->buffer); 809 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 810 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), 811 LDNS_RCODE_FORMERR); 812 server_stats_insrcode(&worker->stats, c->buffer); | 798 return ret; 799 } 800 if((ret=worker_check_request(c->buffer, worker)) != 0) { 801 verbose(VERB_ALGO, "worker check request: bad query."); 802 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 803 if(ret != -1) { 804 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 805 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), ret); --- 7 unchanged lines hidden (view full) --- 813 if(!query_info_parse(&qinfo, c->buffer)) { 814 verbose(VERB_ALGO, "worker parse request: formerror."); 815 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 816 sldns_buffer_rewind(c->buffer); 817 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 818 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), 819 LDNS_RCODE_FORMERR); 820 server_stats_insrcode(&worker->stats, c->buffer); |
813 return 1; | 821 goto send_reply; |
814 } 815 if(worker->env.cfg->log_queries) { 816 char ip[128]; 817 addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip)); 818 log_nametypeclass(0, ip, qinfo.qname, qinfo.qtype, qinfo.qclass); 819 } 820 if(qinfo.qtype == LDNS_RR_TYPE_AXFR || 821 qinfo.qtype == LDNS_RR_TYPE_IXFR) { 822 verbose(VERB_ALGO, "worker request: refused zone transfer."); 823 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 824 sldns_buffer_rewind(c->buffer); 825 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 826 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), 827 LDNS_RCODE_REFUSED); 828 if(worker->stats.extended) { 829 worker->stats.qtype[qinfo.qtype]++; 830 server_stats_insrcode(&worker->stats, c->buffer); 831 } | 822 } 823 if(worker->env.cfg->log_queries) { 824 char ip[128]; 825 addr_to_str(&repinfo->addr, repinfo->addrlen, ip, sizeof(ip)); 826 log_nametypeclass(0, ip, qinfo.qname, qinfo.qtype, qinfo.qclass); 827 } 828 if(qinfo.qtype == LDNS_RR_TYPE_AXFR || 829 qinfo.qtype == LDNS_RR_TYPE_IXFR) { 830 verbose(VERB_ALGO, "worker request: refused zone transfer."); 831 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 832 sldns_buffer_rewind(c->buffer); 833 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 834 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), 835 LDNS_RCODE_REFUSED); 836 if(worker->stats.extended) { 837 worker->stats.qtype[qinfo.qtype]++; 838 server_stats_insrcode(&worker->stats, c->buffer); 839 } |
832 return 1; | 840 goto send_reply; |
833 } 834 if((ret=parse_edns_from_pkt(c->buffer, &edns)) != 0) { 835 verbose(VERB_ALGO, "worker parse edns: formerror."); 836 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 837 sldns_buffer_rewind(c->buffer); 838 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 839 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), ret); 840 server_stats_insrcode(&worker->stats, c->buffer); | 841 } 842 if((ret=parse_edns_from_pkt(c->buffer, &edns)) != 0) { 843 verbose(VERB_ALGO, "worker parse edns: formerror."); 844 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 845 sldns_buffer_rewind(c->buffer); 846 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 847 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), ret); 848 server_stats_insrcode(&worker->stats, c->buffer); |
841 return 1; | 849 goto send_reply; |
842 } 843 if(edns.edns_present && edns.edns_version != 0) { 844 edns.ext_rcode = (uint8_t)(EDNS_RCODE_BADVERS>>4); 845 edns.edns_version = EDNS_ADVERTISED_VERSION; 846 edns.udp_size = EDNS_ADVERTISED_SIZE; 847 edns.bits &= EDNS_DO; 848 verbose(VERB_ALGO, "query with bad edns version."); 849 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 850 error_encode(c->buffer, EDNS_RCODE_BADVERS&0xf, &qinfo, | 850 } 851 if(edns.edns_present && edns.edns_version != 0) { 852 edns.ext_rcode = (uint8_t)(EDNS_RCODE_BADVERS>>4); 853 edns.edns_version = EDNS_ADVERTISED_VERSION; 854 edns.udp_size = EDNS_ADVERTISED_SIZE; 855 edns.bits &= EDNS_DO; 856 verbose(VERB_ALGO, "query with bad edns version."); 857 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 858 error_encode(c->buffer, EDNS_RCODE_BADVERS&0xf, &qinfo, |
851 *(uint16_t*)(void *)sldns_buffer_begin(c->buffer), | 859 *(uint16_t*)(void *)sldns_buffer_begin(c->buffer), |
852 sldns_buffer_read_u16_at(c->buffer, 2), NULL); 853 attach_edns_record(c->buffer, &edns); | 860 sldns_buffer_read_u16_at(c->buffer, 2), NULL); 861 attach_edns_record(c->buffer, &edns); |
854 return 1; | 862 goto send_reply; |
855 } 856 if(edns.edns_present && edns.udp_size < NORMAL_UDP_SIZE && 857 worker->daemon->cfg->harden_short_bufsize) { 858 verbose(VERB_QUERY, "worker request: EDNS bufsize %d ignored", 859 (int)edns.udp_size); 860 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 861 edns.udp_size = NORMAL_UDP_SIZE; 862 } --- 11 unchanged lines hidden (view full) --- 874 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 875 LDNS_TC_SET(sldns_buffer_begin(c->buffer)); 876 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), 877 LDNS_RCODE_SERVFAIL); 878 sldns_buffer_set_position(c->buffer, LDNS_HEADER_SIZE); 879 sldns_buffer_write_at(c->buffer, 4, 880 (uint8_t*)"\0\0\0\0\0\0\0\0", 8); 881 sldns_buffer_flip(c->buffer); | 863 } 864 if(edns.edns_present && edns.udp_size < NORMAL_UDP_SIZE && 865 worker->daemon->cfg->harden_short_bufsize) { 866 verbose(VERB_QUERY, "worker request: EDNS bufsize %d ignored", 867 (int)edns.udp_size); 868 log_addr(VERB_CLIENT,"from",&repinfo->addr, repinfo->addrlen); 869 edns.udp_size = NORMAL_UDP_SIZE; 870 } --- 11 unchanged lines hidden (view full) --- 882 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 883 LDNS_TC_SET(sldns_buffer_begin(c->buffer)); 884 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), 885 LDNS_RCODE_SERVFAIL); 886 sldns_buffer_set_position(c->buffer, LDNS_HEADER_SIZE); 887 sldns_buffer_write_at(c->buffer, 4, 888 (uint8_t*)"\0\0\0\0\0\0\0\0", 8); 889 sldns_buffer_flip(c->buffer); |
882 return 1; | 890 goto send_reply; |
883 } 884 if(worker->stats.extended) 885 server_stats_insquery(&worker->stats, c, qinfo.qtype, 886 qinfo.qclass, &edns, repinfo); 887 if(c->type != comm_udp) 888 edns.udp_size = 65535; /* max size for TCP replies */ 889 if(qinfo.qclass == LDNS_RR_CLASS_CH && answer_chaos(worker, &qinfo, 890 &edns, c->buffer)) { 891 server_stats_insrcode(&worker->stats, c->buffer); | 891 } 892 if(worker->stats.extended) 893 server_stats_insquery(&worker->stats, c, qinfo.qtype, 894 qinfo.qclass, &edns, repinfo); 895 if(c->type != comm_udp) 896 edns.udp_size = 65535; /* max size for TCP replies */ 897 if(qinfo.qclass == LDNS_RR_CLASS_CH && answer_chaos(worker, &qinfo, 898 &edns, c->buffer)) { 899 server_stats_insrcode(&worker->stats, c->buffer); |
892 return 1; | 900 goto send_reply; |
893 } 894 if(local_zones_answer(worker->daemon->local_zones, &qinfo, &edns, 895 c->buffer, worker->scratchpad)) { 896 regional_free_all(worker->scratchpad); 897 if(sldns_buffer_limit(c->buffer) == 0) { 898 comm_point_drop_reply(repinfo); 899 return 0; 900 } 901 server_stats_insrcode(&worker->stats, c->buffer); | 901 } 902 if(local_zones_answer(worker->daemon->local_zones, &qinfo, &edns, 903 c->buffer, worker->scratchpad)) { 904 regional_free_all(worker->scratchpad); 905 if(sldns_buffer_limit(c->buffer) == 0) { 906 comm_point_drop_reply(repinfo); 907 return 0; 908 } 909 server_stats_insrcode(&worker->stats, c->buffer); |
902 return 1; | 910 goto send_reply; |
903 } 904 905 /* We've looked in our local zones. If the answer isn't there, we 906 * might need to bail out based on ACLs now. */ 907 if((ret=deny_refuse_non_local(c, acl, worker, repinfo)) != -1) 908 { | 911 } 912 913 /* We've looked in our local zones. If the answer isn't there, we 914 * might need to bail out based on ACLs now. */ 915 if((ret=deny_refuse_non_local(c, acl, worker, repinfo)) != -1) 916 { |
917 if(ret == 1) 918 goto send_reply; |
|
909 return ret; 910 } 911 912 /* If this request does not have the recursion bit set, verify 913 * ACLs allow the snooping. */ 914 if(!(LDNS_RD_WIRE(sldns_buffer_begin(c->buffer))) && 915 acl != acl_allow_snoop ) { 916 sldns_buffer_set_limit(c->buffer, LDNS_HEADER_SIZE); 917 sldns_buffer_write_at(c->buffer, 4, 918 (uint8_t*)"\0\0\0\0\0\0\0\0", 8); 919 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 920 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), 921 LDNS_RCODE_REFUSED); 922 sldns_buffer_flip(c->buffer); 923 server_stats_insrcode(&worker->stats, c->buffer); 924 log_addr(VERB_ALGO, "refused nonrec (cache snoop) query from", 925 &repinfo->addr, repinfo->addrlen); | 919 return ret; 920 } 921 922 /* If this request does not have the recursion bit set, verify 923 * ACLs allow the snooping. */ 924 if(!(LDNS_RD_WIRE(sldns_buffer_begin(c->buffer))) && 925 acl != acl_allow_snoop ) { 926 sldns_buffer_set_limit(c->buffer, LDNS_HEADER_SIZE); 927 sldns_buffer_write_at(c->buffer, 4, 928 (uint8_t*)"\0\0\0\0\0\0\0\0", 8); 929 LDNS_QR_SET(sldns_buffer_begin(c->buffer)); 930 LDNS_RCODE_SET(sldns_buffer_begin(c->buffer), 931 LDNS_RCODE_REFUSED); 932 sldns_buffer_flip(c->buffer); 933 server_stats_insrcode(&worker->stats, c->buffer); 934 log_addr(VERB_ALGO, "refused nonrec (cache snoop) query from", 935 &repinfo->addr, repinfo->addrlen); |
926 return 1; | 936 goto send_reply; |
927 } | 937 } |
928 h = query_info_hash(&qinfo); | 938 h = query_info_hash(&qinfo, sldns_buffer_read_u16_at(c->buffer, 2)); |
929 if((e=slabhash_lookup(worker->env.msg_cache, h, &qinfo, 0))) { 930 /* answer from cache - we have acquired a readlock on it */ 931 if(answer_from_cache(worker, &qinfo, 932 (struct reply_info*)e->data, 933 *(uint16_t*)(void *)sldns_buffer_begin(c->buffer), 934 sldns_buffer_read_u16_at(c->buffer, 2), repinfo, 935 &edns)) { 936 /* prefetch it if the prefetch TTL expired */ 937 if(worker->env.cfg->prefetch && *worker->env.now >= 938 ((struct reply_info*)e->data)->prefetch_ttl) { 939 time_t leeway = ((struct reply_info*)e-> 940 data)->ttl - *worker->env.now; 941 lock_rw_unlock(&e->lock); 942 reply_and_prefetch(worker, &qinfo, 943 sldns_buffer_read_u16_at(c->buffer, 2), 944 repinfo, leeway); | 939 if((e=slabhash_lookup(worker->env.msg_cache, h, &qinfo, 0))) { 940 /* answer from cache - we have acquired a readlock on it */ 941 if(answer_from_cache(worker, &qinfo, 942 (struct reply_info*)e->data, 943 *(uint16_t*)(void *)sldns_buffer_begin(c->buffer), 944 sldns_buffer_read_u16_at(c->buffer, 2), repinfo, 945 &edns)) { 946 /* prefetch it if the prefetch TTL expired */ 947 if(worker->env.cfg->prefetch && *worker->env.now >= 948 ((struct reply_info*)e->data)->prefetch_ttl) { 949 time_t leeway = ((struct reply_info*)e-> 950 data)->ttl - *worker->env.now; 951 lock_rw_unlock(&e->lock); 952 reply_and_prefetch(worker, &qinfo, 953 sldns_buffer_read_u16_at(c->buffer, 2), 954 repinfo, leeway); |
945 return 0; | 955 rc = 0; 956 goto send_reply_rc; |
946 } 947 lock_rw_unlock(&e->lock); | 957 } 958 lock_rw_unlock(&e->lock); |
948 return 1; | 959 goto send_reply; |
949 } 950 verbose(VERB_ALGO, "answer from the cache failed"); 951 lock_rw_unlock(&e->lock); 952 } 953 if(!LDNS_RD_WIRE(sldns_buffer_begin(c->buffer))) { 954 if(answer_norec_from_cache(worker, &qinfo, 955 *(uint16_t*)(void *)sldns_buffer_begin(c->buffer), 956 sldns_buffer_read_u16_at(c->buffer, 2), repinfo, 957 &edns)) { | 960 } 961 verbose(VERB_ALGO, "answer from the cache failed"); 962 lock_rw_unlock(&e->lock); 963 } 964 if(!LDNS_RD_WIRE(sldns_buffer_begin(c->buffer))) { 965 if(answer_norec_from_cache(worker, &qinfo, 966 *(uint16_t*)(void *)sldns_buffer_begin(c->buffer), 967 sldns_buffer_read_u16_at(c->buffer, 2), repinfo, 968 &edns)) { |
958 return 1; | 969 goto send_reply; |
959 } 960 verbose(VERB_ALGO, "answer norec from cache -- " 961 "need to validate or not primed"); 962 } 963 sldns_buffer_rewind(c->buffer); 964 server_stats_querymiss(&worker->stats, worker); 965 966 if(verbosity >= VERB_CLIENT) { 967 if(c->type == comm_udp) 968 log_addr(VERB_CLIENT, "udp request from", 969 &repinfo->addr, repinfo->addrlen); 970 else log_addr(VERB_CLIENT, "tcp request from", 971 &repinfo->addr, repinfo->addrlen); 972 } 973 974 /* grab a work request structure for this new request */ 975 mesh_new_client(worker->env.mesh, &qinfo, 976 sldns_buffer_read_u16_at(c->buffer, 2), | 970 } 971 verbose(VERB_ALGO, "answer norec from cache -- " 972 "need to validate or not primed"); 973 } 974 sldns_buffer_rewind(c->buffer); 975 server_stats_querymiss(&worker->stats, worker); 976 977 if(verbosity >= VERB_CLIENT) { 978 if(c->type == comm_udp) 979 log_addr(VERB_CLIENT, "udp request from", 980 &repinfo->addr, repinfo->addrlen); 981 else log_addr(VERB_CLIENT, "tcp request from", 982 &repinfo->addr, repinfo->addrlen); 983 } 984 985 /* grab a work request structure for this new request */ 986 mesh_new_client(worker->env.mesh, &qinfo, 987 sldns_buffer_read_u16_at(c->buffer, 2), |
977 &edns, repinfo, *(uint16_t*)(void *)sldns_buffer_begin(c->buffer)); | 988 &edns, repinfo, *(uint16_t*)(void *)sldns_buffer_begin(c->buffer)); |
978 worker_mem_report(worker, NULL); 979 return 0; | 989 worker_mem_report(worker, NULL); 990 return 0; |
991 992send_reply: 993 rc = 1; 994send_reply_rc: 995#ifdef USE_DNSTAP 996 if(worker->dtenv.log_client_response_messages) 997 dt_msg_send_client_response(&worker->dtenv, &repinfo->addr, 998 c->type, c->buffer); 999#endif 1000 return rc; |
|
980} 981 982void 983worker_sighandler(int sig, void* arg) 984{ | 1001} 1002 1003void 1004worker_sighandler(int sig, void* arg) 1005{ |
985 /* note that log, print, syscalls here give race conditions. */ 986 /* we still print DETAIL logs, because this is extensive per message 987 * logging anyway, and the operator may then have an interest 988 * in the cause for unbound to exit */ | 1006 /* note that log, print, syscalls here give race conditions. 1007 * And cause hangups if the log-lock is held by the application. */ |
989 struct worker* worker = (struct worker*)arg; 990 switch(sig) { 991#ifdef SIGHUP 992 case SIGHUP: | 1008 struct worker* worker = (struct worker*)arg; 1009 switch(sig) { 1010#ifdef SIGHUP 1011 case SIGHUP: |
993 verbose(VERB_QUERY, "caught signal SIGHUP"); | |
994 comm_base_exit(worker->base); 995 break; 996#endif 997 case SIGINT: | 1012 comm_base_exit(worker->base); 1013 break; 1014#endif 1015 case SIGINT: |
998 verbose(VERB_QUERY, "caught signal SIGINT"); | |
999 worker->need_to_exit = 1; 1000 comm_base_exit(worker->base); 1001 break; 1002#ifdef SIGQUIT 1003 case SIGQUIT: | 1016 worker->need_to_exit = 1; 1017 comm_base_exit(worker->base); 1018 break; 1019#ifdef SIGQUIT 1020 case SIGQUIT: |
1004 verbose(VERB_QUERY, "caught signal SIGQUIT"); | |
1005 worker->need_to_exit = 1; 1006 comm_base_exit(worker->base); 1007 break; 1008#endif 1009 case SIGTERM: | 1021 worker->need_to_exit = 1; 1022 comm_base_exit(worker->base); 1023 break; 1024#endif 1025 case SIGTERM: |
1010 verbose(VERB_QUERY, "caught signal SIGTERM"); | |
1011 worker->need_to_exit = 1; 1012 comm_base_exit(worker->base); 1013 break; 1014 default: | 1026 worker->need_to_exit = 1; 1027 comm_base_exit(worker->base); 1028 break; 1029 default: |
1015 log_err("unknown signal: %d, ignored", sig); | 1030 /* unknown signal, ignored */ |
1016 break; 1017 } 1018} 1019 1020/** restart statistics timer for worker, if enabled */ 1021static void 1022worker_restart_timer(struct worker* worker) 1023{ --- 61 unchanged lines hidden (view full) --- 1085 seed = 0; 1086 log_err("could not init random numbers."); 1087 tube_delete(worker->cmd); 1088 free(worker->ports); 1089 free(worker); 1090 return NULL; 1091 } 1092 seed = 0; | 1031 break; 1032 } 1033} 1034 1035/** restart statistics timer for worker, if enabled */ 1036static void 1037worker_restart_timer(struct worker* worker) 1038{ --- 61 unchanged lines hidden (view full) --- 1100 seed = 0; 1101 log_err("could not init random numbers."); 1102 tube_delete(worker->cmd); 1103 free(worker->ports); 1104 free(worker); 1105 return NULL; 1106 } 1107 seed = 0; |
1108#ifdef USE_DNSTAP 1109 if(daemon->cfg->dnstap) { 1110 log_assert(daemon->dtenv != NULL); 1111 memcpy(&worker->dtenv, daemon->dtenv, sizeof(struct dt_env)); 1112 if(!dt_init(&worker->dtenv)) 1113 fatal_exit("dt_init failed"); 1114 } 1115#endif |
|
1093 return worker; 1094} 1095 1096int 1097worker_init(struct worker* worker, struct config_file *cfg, 1098 struct listen_port* ports, int do_sigs) 1099{ | 1116 return worker; 1117} 1118 1119int 1120worker_init(struct worker* worker, struct config_file *cfg, 1121 struct listen_port* ports, int do_sigs) 1122{ |
1123#ifdef USE_DNSTAP 1124 struct dt_env* dtenv = &worker->dtenv; 1125#else 1126 void* dtenv = NULL; 1127#endif |
|
1100 worker->need_to_exit = 0; 1101 worker->base = comm_base_create(do_sigs); 1102 if(!worker->base) { 1103 log_err("could not create event handling base"); 1104 worker_delete(worker); 1105 return 0; 1106 } 1107 comm_base_set_slow_accept_handlers(worker->base, &worker_stop_accept, --- 32 unchanged lines hidden (view full) --- 1140#ifdef UB_ON_WINDOWS 1141 wsvc_setup_worker(worker); 1142#endif /* UB_ON_WINDOWS */ 1143 } else { /* !do_sigs */ 1144 worker->comsig = NULL; 1145 } 1146 worker->front = listen_create(worker->base, ports, 1147 cfg->msg_buffer_size, (int)cfg->incoming_num_tcp, | 1128 worker->need_to_exit = 0; 1129 worker->base = comm_base_create(do_sigs); 1130 if(!worker->base) { 1131 log_err("could not create event handling base"); 1132 worker_delete(worker); 1133 return 0; 1134 } 1135 comm_base_set_slow_accept_handlers(worker->base, &worker_stop_accept, --- 32 unchanged lines hidden (view full) --- 1168#ifdef UB_ON_WINDOWS 1169 wsvc_setup_worker(worker); 1170#endif /* UB_ON_WINDOWS */ 1171 } else { /* !do_sigs */ 1172 worker->comsig = NULL; 1173 } 1174 worker->front = listen_create(worker->base, ports, 1175 cfg->msg_buffer_size, (int)cfg->incoming_num_tcp, |
1148 worker->daemon->listen_sslctx, worker_handle_request, worker); | 1176 worker->daemon->listen_sslctx, dtenv, worker_handle_request, 1177 worker); |
1149 if(!worker->front) { 1150 log_err("could not create listening sockets"); 1151 worker_delete(worker); 1152 return 0; 1153 } 1154 worker->back = outside_network_create(worker->base, 1155 cfg->msg_buffer_size, (size_t)cfg->outgoing_num_ports, 1156 cfg->out_ifs, cfg->num_out_ifs, cfg->do_ip4, cfg->do_ip6, 1157 cfg->do_tcp?cfg->outgoing_num_tcp:0, 1158 worker->daemon->env->infra_cache, worker->rndstate, 1159 cfg->use_caps_bits_for_id, worker->ports, worker->numports, 1160 cfg->unwanted_threshold, &worker_alloc_cleanup, worker, | 1178 if(!worker->front) { 1179 log_err("could not create listening sockets"); 1180 worker_delete(worker); 1181 return 0; 1182 } 1183 worker->back = outside_network_create(worker->base, 1184 cfg->msg_buffer_size, (size_t)cfg->outgoing_num_ports, 1185 cfg->out_ifs, cfg->num_out_ifs, cfg->do_ip4, cfg->do_ip6, 1186 cfg->do_tcp?cfg->outgoing_num_tcp:0, 1187 worker->daemon->env->infra_cache, worker->rndstate, 1188 cfg->use_caps_bits_for_id, worker->ports, worker->numports, 1189 cfg->unwanted_threshold, &worker_alloc_cleanup, worker, |
1161 cfg->do_udp, worker->daemon->connect_sslctx, cfg->delay_close); | 1190 cfg->do_udp, worker->daemon->connect_sslctx, cfg->delay_close, 1191 dtenv); |
1162 if(!worker->back) { 1163 log_err("could not create outgoing sockets"); 1164 worker_delete(worker); 1165 return 0; 1166 } 1167 /* start listening to commands */ 1168 if(!tube_setup_bg_listen(worker->cmd, worker->base, 1169 &worker_handle_control_cmd, worker)) { --- 118 unchanged lines hidden (view full) --- 1288 alloc_clear(&worker->alloc); 1289 regional_destroy(worker->scratchpad); 1290 free(worker); 1291} 1292 1293struct outbound_entry* 1294worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype, 1295 uint16_t qclass, uint16_t flags, int dnssec, int want_dnssec, | 1192 if(!worker->back) { 1193 log_err("could not create outgoing sockets"); 1194 worker_delete(worker); 1195 return 0; 1196 } 1197 /* start listening to commands */ 1198 if(!tube_setup_bg_listen(worker->cmd, worker->base, 1199 &worker_handle_control_cmd, worker)) { --- 118 unchanged lines hidden (view full) --- 1318 alloc_clear(&worker->alloc); 1319 regional_destroy(worker->scratchpad); 1320 free(worker); 1321} 1322 1323struct outbound_entry* 1324worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype, 1325 uint16_t qclass, uint16_t flags, int dnssec, int want_dnssec, |
1296 struct sockaddr_storage* addr, socklen_t addrlen, uint8_t* zone, 1297 size_t zonelen, struct module_qstate* q) | 1326 int nocaps, struct sockaddr_storage* addr, socklen_t addrlen, 1327 uint8_t* zone, size_t zonelen, struct module_qstate* q) |
1298{ 1299 struct worker* worker = q->env->worker; 1300 struct outbound_entry* e = (struct outbound_entry*)regional_alloc( 1301 q->region, sizeof(*e)); 1302 if(!e) 1303 return NULL; 1304 e->qstate = q; 1305 e->qsent = outnet_serviced_query(worker->back, qname, | 1328{ 1329 struct worker* worker = q->env->worker; 1330 struct outbound_entry* e = (struct outbound_entry*)regional_alloc( 1331 q->region, sizeof(*e)); 1332 if(!e) 1333 return NULL; 1334 e->qstate = q; 1335 e->qsent = outnet_serviced_query(worker->back, qname, |
1306 qnamelen, qtype, qclass, flags, dnssec, want_dnssec, | 1336 qnamelen, qtype, qclass, flags, dnssec, want_dnssec, nocaps, |
1307 q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, addr, 1308 addrlen, zone, zonelen, worker_handle_service_reply, e, 1309 worker->back->udp_buff); 1310 if(!e->qsent) { 1311 return NULL; 1312 } 1313 return e; 1314} --- 6 unchanged lines hidden (view full) --- 1321 slabhash_clear(worker->env.msg_cache); 1322} 1323 1324void worker_stats_clear(struct worker* worker) 1325{ 1326 server_stats_init(&worker->stats, worker->env.cfg); 1327 mesh_stats_clear(worker->env.mesh); 1328 worker->back->unwanted_replies = 0; | 1337 q->env->cfg->tcp_upstream, q->env->cfg->ssl_upstream, addr, 1338 addrlen, zone, zonelen, worker_handle_service_reply, e, 1339 worker->back->udp_buff); 1340 if(!e->qsent) { 1341 return NULL; 1342 } 1343 return e; 1344} --- 6 unchanged lines hidden (view full) --- 1351 slabhash_clear(worker->env.msg_cache); 1352} 1353 1354void worker_stats_clear(struct worker* worker) 1355{ 1356 server_stats_init(&worker->stats, worker->env.cfg); 1357 mesh_stats_clear(worker->env.mesh); 1358 worker->back->unwanted_replies = 0; |
1359 worker->back->num_tcp_outgoing = 0; |
|
1329} 1330 1331void worker_start_accept(void* arg) 1332{ 1333 struct worker* worker = (struct worker*)arg; 1334 listen_start_accept(worker->front); 1335 if(worker->thread_num == 0) 1336 daemon_remote_start_accept(worker->daemon->rc); --- 7 unchanged lines hidden (view full) --- 1344 daemon_remote_stop_accept(worker->daemon->rc); 1345} 1346 1347/* --- fake callbacks for fptr_wlist to work --- */ 1348struct outbound_entry* libworker_send_query(uint8_t* ATTR_UNUSED(qname), 1349 size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype), 1350 uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags), 1351 int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec), | 1360} 1361 1362void worker_start_accept(void* arg) 1363{ 1364 struct worker* worker = (struct worker*)arg; 1365 listen_start_accept(worker->front); 1366 if(worker->thread_num == 0) 1367 daemon_remote_start_accept(worker->daemon->rc); --- 7 unchanged lines hidden (view full) --- 1375 daemon_remote_stop_accept(worker->daemon->rc); 1376} 1377 1378/* --- fake callbacks for fptr_wlist to work --- */ 1379struct outbound_entry* libworker_send_query(uint8_t* ATTR_UNUSED(qname), 1380 size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype), 1381 uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags), 1382 int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec), |
1352 struct sockaddr_storage* ATTR_UNUSED(addr), | 1383 int ATTR_UNUSED(nocaps), struct sockaddr_storage* ATTR_UNUSED(addr), |
1353 socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone), 1354 size_t ATTR_UNUSED(zonelen), struct module_qstate* ATTR_UNUSED(q)) 1355{ 1356 log_assert(0); 1357 return 0; 1358} 1359 1360int libworker_handle_reply(struct comm_point* ATTR_UNUSED(c), --- 61 unchanged lines hidden --- | 1384 socklen_t ATTR_UNUSED(addrlen), uint8_t* ATTR_UNUSED(zone), 1385 size_t ATTR_UNUSED(zonelen), struct module_qstate* ATTR_UNUSED(q)) 1386{ 1387 log_assert(0); 1388 return 0; 1389} 1390 1391int libworker_handle_reply(struct comm_point* ATTR_UNUSED(c), --- 61 unchanged lines hidden --- |