From 51f7bc924cbcdeb09cbb83249b70c121d1ffa31e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= Date: Thu, 18 Mar 2021 01:05:43 +0100 Subject: [PATCH] Create common function for forward dump, log and send One part in dnssec retry path did not dump sent retry into dump file. Make sure it is dumped all times it is sent by common function shared on multiple places. Reduce a bit also server sending. --- src/forward.c | 80 ++++++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 42 deletions(-) diff --git a/src/forward.c b/src/forward.c index 7bb9628..8b1698b 100644 --- a/src/forward.c +++ b/src/forward.c @@ -263,6 +263,27 @@ static void log_query_mysockaddr(unsigned int flags, char *name, union mysockadd log_query(flags | F_IPV6, name, (union all_addr *)&addr->in6.sin6_addr, arg); } +static void server_send(struct server *server, int fd, + const void *header, size_t plen, int flags) +{ + while (retry_send(sendto(fd, header, plen, flags, + &server->addr.sa, + sa_len(&server->addr)))); +} + +#ifdef HAVE_DNSSEC +static void server_send_log(struct server *server, int fd, + const void *header, size_t plen, int dumpflags, + unsigned int logflags, char *name, char *arg) +{ +#ifdef HAVE_DUMPFILE + dump_packet(dumpflags, (void *)header, (size_t)plen, NULL, &server->addr); +#endif + log_query_mysockaddr(logflags, name, &server->addr, arg); + server_send(server, fd, header, plen, 0); +} +#endif + static int forward_query(int udpfd, union mysockaddr *udpaddr, union all_addr *dst_addr, unsigned int dst_iface, struct dns_header *header, size_t plen, time_t now, @@ -363,15 +384,10 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr, PUTSHORT(SAFE_PKTSZ, pheader); if ((fd = allocate_rfd(&forward->rfds, forward->sentto)) != -1) - { - log_query_mysockaddr(F_NOEXTRA | F_DNSSEC, "retry", - &forward->sentto->addr, "dnssec"); - - while (retry_send(sendto(fd, (char *)header, plen, 0, - &forward->sentto->addr.sa, - sa_len(&forward->sentto->addr)))); - } - + server_send_log(forward->sentto, fd, header, plen, + DUMP_SEC_QUERY, + F_NOEXTRA | F_DNSSEC, "retry", "dnssec"); + return 1; } #endif @@ -886,19 +902,10 @@ void reply_query(int fd, time_t now) } - if ((fd = allocate_rfd(&forward->rfds, start)) == -1) - return; - -#ifdef HAVE_DUMPFILE - dump_packet(DUMP_SEC_QUERY, (void *)header, (size_t)plen, NULL, &start->addr); -#endif - - while (retry_send(sendto(fd, (char *)header, plen, 0, - &start->addr.sa, - sa_len(&start->addr)))); - - log_query_mysockaddr(F_NOEXTRA | F_DNSSEC, "retry", &start->addr, "dnssec"); - + if ((fd = allocate_rfd(&forward->rfds, start)) != -1) + server_send_log(start, fd, header, plen, + DUMP_SEC_QUERY, + F_NOEXTRA | F_DNSSEC, "retry", "dnssec"); return; } #endif @@ -1114,9 +1121,6 @@ void reply_query(int fd, time_t now) nn = dnssec_generate_query(header,((unsigned char *) header) + server->edns_pktsz, daemon->keyname, forward->class, querytype, server->edns_pktsz); - log_query_mysockaddr(F_NOEXTRA | F_DNSSEC, daemon->keyname, &server->addr, - querystr("dnssec-query", querytype)); - memcpy(new->hash, hash_questions(header, nn, daemon->namebuff), HASH_SIZE); new->new_id = get_id(); header->id = htons(new->new_id); @@ -1133,14 +1137,9 @@ void reply_query(int fd, time_t now) if (option_bool(OPT_CONNTRACK)) set_outgoing_mark(orig, fd); #endif - -#ifdef HAVE_DUMPFILE - dump_packet(DUMP_SEC_QUERY, (void *)header, (size_t)nn, NULL, &server->addr); -#endif - - while (retry_send(sendto(fd, (char *)header, nn, 0, - &server->addr.sa, - sa_len(&server->addr)))); + server_send_log(server, fd, header, nn, DUMP_SEC_QUERY, + F_NOEXTRA | F_DNSSEC, daemon->keyname, + querystr("dnssec-query", querytype)); server->queries++; } } @@ -1689,9 +1688,8 @@ static int tcp_key_recurse(time_t now, int status, struct dns_header *header, si } #ifdef MSG_FASTOPEN - while(retry_send(sendto(server->tcpfd, packet, m + sizeof(u16), - MSG_FASTOPEN, &server->addr.sa, sa_len(&server->addr)))); - + server_send(server, server->tcpfd, packet, m + sizeof(u16), MSG_FASTOPEN); + if (errno == 0) data_sent = 1; #endif @@ -2005,9 +2003,8 @@ unsigned char *tcp_request(int confd, time_t now, } #ifdef MSG_FASTOPEN - while(retry_send(sendto(last_server->tcpfd, packet, size + sizeof(u16), - MSG_FASTOPEN, &last_server->addr.sa, sa_len(&last_server->addr)))); - + server_send(last_server, last_server->tcpfd, packet, m + sizeof(u16), MSG_FASTOPEN); + if (errno == 0) data_sent = 1; #endif @@ -2525,9 +2522,8 @@ static struct frec *lookup_frec_by_query(void *hash, unsigned int flags) void resend_query() { if (daemon->srv_save) - while(retry_send(sendto(daemon->fd_save, daemon->packet, daemon->packet_len, 0, - &daemon->srv_save->addr.sa, - sa_len(&daemon->srv_save->addr)))); + server_send(daemon->srv_save, daemon->fd_save, + daemon->packet, daemon->packet_len, 0); } /* A server record is going away, remove references to it */