aboutsummaryrefslogtreecommitdiff
path: root/dnscache.c
diff options
context:
space:
mode:
Diffstat (limited to 'dnscache.c')
-rw-r--r--dnscache.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/dnscache.c b/dnscache.c
index abcba69..2366ecc 100644
--- a/dnscache.c
+++ b/dnscache.c
@@ -72,11 +72,15 @@ static struct udpclient {
} u[MAXUDP];
int uactive = 0;
+#define MAXSOA 20
+int soaactive = 0;
+
void u_drop(int j)
{
if (!u[j].active) return;
log_querydrop(&u[j].active);
u[j].active = 0; --uactive;
+ if (byte_equal(u[j].q.type,2,DNS_T_SOA)) --soaactive;
}
void u_respond(int j)
@@ -87,6 +91,7 @@ void u_respond(int j)
socket_send6(udp53,response,response_len,u[j].ip,u[j].port,u[j].scope_id);
log_querydone(&u[j].active,response_len);
u[j].active = 0; --uactive;
+ if (byte_equal(u[j].q.type,2,DNS_T_SOA)) --soaactive;
}
void u_new(void)
@@ -125,6 +130,16 @@ void u_new(void)
x->active = ++numqueries; ++uactive;
log_query(&x->active,x->ip,x->port,x->id,q,qtype);
+
+ if (byte_equal(qtype,2,DNS_T_SOA)) {
+ if (soaactive >= MAXSOA) {
+ log_querydropmaxsoa(&x->active);
+ x->active = 0; --uactive;
+ return;
+ }
+ ++soaactive;
+ }
+
switch(query_start(&x->q,q,qtype,qclass,myipoutgoing,interface)) {
case -1:
u_drop(j);