From: wessels <> Date: Thu, 15 Apr 1999 12:03:48 +0000 (+0000) Subject: various bugs for internal DNS X-Git-Tag: SQUID_3_0_PRE1~2282 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7cfc1c9ac835daa437691a6cfe7ca82fe7c3bcdd;p=thirdparty%2Fsquid.git various bugs for internal DNS also first stab at retransmission of delayed queries --- diff --git a/src/dns_internal.cc b/src/dns_internal.cc index 43065b4e6c..eba865b034 100644 --- a/src/dns_internal.cc +++ b/src/dns_internal.cc @@ -1,6 +1,6 @@ /* - * $Id: dns_internal.cc,v 1.2 1999/04/14 06:35:34 wessels Exp $ + * $Id: dns_internal.cc,v 1.3 1999/04/15 06:03:48 wessels Exp $ * * DEBUG: section 78 DNS lookups; interacts with lib/rfc1035.c * AUTHOR: Duane Wessels @@ -53,6 +53,7 @@ static int nns = 0; static int nns_alloc = 0; static int domain_socket = -1; static dlink_list lru_list; +static int event_queued = 0; static OBJH idnsStats; static void idnsAddNameserver(const char *buf); @@ -63,6 +64,7 @@ static int idnsFromKnownNameserver(struct sockaddr_in *from); static idns_query *idnsFindQuery(unsigned short id); static void idnsGrokReply(const char *buf, size_t sz); static PF idnsRead; +static EVH idnsCheckQueue; static void idnsAddNameserver(const char *buf) @@ -126,15 +128,25 @@ idnsStats(StoreEntry * sentry) { dlink_node *n; idns_query *q; + int i; storeAppendPrintf(sentry, "Internal DNS Statistics:\n"); storeAppendPrintf(sentry, "\nThe Queue:\n"); - storeAppendPrintf(sentry, " ID SIZE SENDS DELAY\n"); - storeAppendPrintf(sentry, "---- ---- ----- --------\n"); + storeAppendPrintf(sentry, " ID SIZE SENDS DELAY\n"); + storeAppendPrintf(sentry, "------ ---- ----- --------\n"); for (n = lru_list.head; n; n = n->next) { q = n->data; - storeAppendPrintf(sentry, "%#04hx %4d %5d %8.3f\n", - q->id, q->sz, q->nsends, - tvSubDsec(q->start, current_time)); + storeAppendPrintf(sentry, "%#06hx %4d %5d %8.3f\n", + q->id, q->sz, q->nsends, + tvSubDsec(q->start_t, current_time)); + } + storeAppendPrintf(sentry, "\nNameservers:\n"); + storeAppendPrintf(sentry, "IP ADDRESS # QUERIES # REPLIES\n"); + storeAppendPrintf(sentry, "--------------- --------- ---------\n"); + for (i = 0; i < nns; i++) { + storeAppendPrintf(sentry, "%-15s %9d %9d\n", + inet_ntoa(nameservers[i].S.sin_addr), + nameservers[i].nqueries, + nameservers[i].nreplies); } } @@ -153,7 +165,13 @@ idnsSendQuery(idns_query * q) q->buf, q->sz); q->nsends++; + q->sent_t = current_time; + nameservers[ns].nqueries++; dlinkAdd(q, &q->lru, &lru_list); + if (!event_queued) { + eventAdd("idnsCheckQueue", idnsCheckQueue, NULL, 1.0, 1); + event_queued = 1; + } } static int @@ -165,9 +183,9 @@ idnsFromKnownNameserver(struct sockaddr_in *from) continue; if (nameservers[i].S.sin_port != from->sin_port) continue; - return 1; + return i; } - return 0; + return -1; } static idns_query * @@ -226,6 +244,7 @@ idnsRead(int fd, void *data) socklen_t from_len; int max = 10; static char rbuf[512]; + int ns; commSetSelect(fd, COMM_SELECT_READ, idnsRead, NULL, 0); while (max--) { from_len = sizeof(from); @@ -252,15 +271,34 @@ idnsRead(int fd, void *data) fd, len, inet_ntoa(from.sin_addr)); - if (!idnsFromKnownNameserver(&from)) { + ns = idnsFromKnownNameserver(&from); + if (ns < 0) { debug(78, 1) ("idnsRead: Reply from unknown nameserver [%s]\n", inet_ntoa(from.sin_addr)); continue; } + nameservers[ns].nreplies++; idnsGrokReply(rbuf, len); } } +static void +idnsCheckQueue(void *unused) +{ + dlink_node *n; + idns_query *q; + event_queued = 0; + for (n = lru_list.tail; n; n = n->prev) { + q = n->data; + if (tvSubDsec(q->sent_t, current_time) < 5.0) + break; + debug(78, 1) ("idnsCheckQueue: ID %#04x timeout\n", + q->id); + dlinkDelete(&q->lru, &lru_list); + idnsSendQuery(q); + } +} + /* ====================================================================== */ void @@ -309,6 +347,6 @@ idnsALookup(const char *name, IDNSCB * callback, void *data) q->callback = callback; q->callback_data = data; cbdataLock(q->callback_data); - q->start = current_time; + q->start_t = current_time; idnsSendQuery(q); } diff --git a/src/ipcache.cc b/src/ipcache.cc index 5b860f6301..865c73a3e0 100644 --- a/src/ipcache.cc +++ b/src/ipcache.cc @@ -1,6 +1,6 @@ /* - * $Id: ipcache.cc,v 1.212 1999/04/14 06:35:46 wessels Exp $ + * $Id: ipcache.cc,v 1.213 1999/04/15 06:03:49 wessels Exp $ * * DEBUG: section 14 IP Cache * AUTHOR: Harvest Derived @@ -334,41 +334,58 @@ ipcacheParse(const char *inbuf) } #else static ipcache_entry * -ipcacheParse(rfc1035_rr * answers, int na) +ipcacheParse(rfc1035_rr * answers, int nr) { static ipcache_entry i; + int k; + int j; + int na = 0; memset(&i, '\0', sizeof(i)); i.expires = squid_curtime; i.status = IP_NEGATIVE_CACHED; - if (na < 0) { - debug(14, 1) ("ipcacheParse: Lookup failed\n"); - debug(14, 1) ("\trfc1035_errno = %d\n", rfc1035_errno); + if (nr < 0) { + debug(14, 1) ("ipcacheParse: Lookup failed (error %d)\n", + rfc1035_errno); assert(rfc1035_error_message); i.error_message = xstrdup(rfc1035_error_message); - } else if (na == 0) { + return &i; + } + if (nr == 0) { + debug(14, 1) ("ipcacheParse: No DNS records\n"); + i.error_message = xstrdup("No DNS records"); + return &i; + } + assert(answers); + for (j = 0, k = 0; k < nr; k++) { + if (answers[k].type != RFC1035_TYPE_A) + continue; + if (answers[k].class != RFC1035_CLASS_IN) + continue; + na++; + } + if (na == 0) { debug(14, 1) ("ipcacheParse: No Address records\n"); i.error_message = xstrdup("No Address records"); - } else { - int k; - int j; - assert(answers); - i.status = IP_CACHED; - i.expires = squid_curtime + answers->ttl; - i.addrs.in_addrs = xcalloc(na, sizeof(struct in_addr)); - i.addrs.bad_mask = xcalloc(na, sizeof(unsigned char)); - for (j = 0, k = 0; k < na; k++) { - if (answers[k].type != RFC1035_TYPE_A) - continue; - if (answers[k].class != RFC1035_CLASS_IN) - continue; - assert(answers[k].rdlength == 4); - xmemcpy(&i.addrs.in_addrs[j++], answers[k].rdata, 4); - debug(14, 3) ("ipcacheParse: #%d %s\n", - j - 1, - inet_ntoa(i.addrs.in_addrs[j - 1])); - } - i.addrs.count = (unsigned char) j; + return &i; } + i.status = IP_CACHED; + i.addrs.in_addrs = xcalloc(na, sizeof(struct in_addr)); + i.addrs.bad_mask = xcalloc(na, sizeof(unsigned char)); + i.addrs.count = (unsigned char) na; + for (j = 0, k = 0; k < nr; k++) { + if (answers[k].type != RFC1035_TYPE_A) + continue; + if (answers[k].class != RFC1035_CLASS_IN) + continue; + if (j == 0) + i.expires = squid_curtime + answers[k].ttl; + assert(answers[k].rdlength == 4); + xmemcpy(&i.addrs.in_addrs[j++], answers[k].rdata, 4); + debug(14, 3) ("ipcacheParse: #%d %s\n", + j - 1, + inet_ntoa(i.addrs.in_addrs[j - 1])); + } + assert(j == na); return &i; } #endif diff --git a/src/structs.h b/src/structs.h index 26d03bb2ca..807ab55e95 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1,6 +1,6 @@ /* - * $Id: structs.h,v 1.278 1999/04/14 05:16:20 wessels Exp $ + * $Id: structs.h,v 1.279 1999/04/15 06:03:50 wessels Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -1678,7 +1678,8 @@ struct _idns_query { size_t sz; unsigned short id; int nsends; - struct timeval start; + struct timeval start_t; + struct timeval sent_t; dlink_node lru; IDNSCB *callback; void *callback_data;