Revision: 14846
Author: adrian.chadd
Date: Thu Jan 13 02:31:57 2011
Log: Begin to ipv6-ify the ipcache code.
It still only pays attention to IPv4 responses, but it at least is now
IPv6 internal.
http://code.google.com/p/lusca-cache/source/detail?r=14846
Modified:
/playpen/LUSCA_HEAD_ipv6/libsqname/ipcache.c
/playpen/LUSCA_HEAD_ipv6/libsqname/ipcache.h
=======================================
--- /playpen/LUSCA_HEAD_ipv6/libsqname/ipcache.c Tue Jan 11 23:15:40 2011
+++ /playpen/LUSCA_HEAD_ipv6/libsqname/ipcache.c Thu Jan 13 02:31:57 2011
@@ -92,6 +92,8 @@
#include "../libsqdns/dns.h"
#include "../libsqdns/dns_internal.h"
+#include "../libsqinet/sqinet.h"
+
#include "namecfg.h"
#include "ipcache.h"
@@ -260,10 +262,17 @@
int j;
int na = 0;
int ttl = 0;
+ int n;
const char *name = (const char *) i->hash.key;
i->expires = squid_curtime + namecache_dns_negative_ttl;
i->flags.negcached = 1;
- safe_free(i->addrs.in_addrs);
+
+ /* Clean up correctly first */
+ for (k = 0; k < i->addrs.count; k++) {
+ sqinet_done(&i->addrs.in_addrs6[k]);
+ }
+ safe_free(i->addrs.in_addrs6);
+
safe_free(i->addrs.bad_mask);
safe_free(i->error_message);
i->addrs.count = 0;
@@ -296,7 +305,10 @@
return i;
}
i->flags.negcached = 0;
- i->addrs.in_addrs = xcalloc(na, sizeof(struct in_addr));
+ i->addrs.in_addrs6 = xcalloc(na, sizeof(sqaddr_t));
+ for (n = 0; n < na; n++) {
+ sqinet_init(&i->addrs.in_addrs6[n]);
+ }
i->addrs.bad_mask = xcalloc(na, sizeof(unsigned char));
for (j = 0, k = 0; k < nr; k++) {
if (answers[k].class != RFC1035_CLASS_IN)
@@ -304,10 +316,14 @@
if (answers[k].type == RFC1035_TYPE_A) {
if (answers[k].rdlength != 4)
continue;
- 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]));
+ sqinet_set_family(&i->addrs.in_addrs6[j], AF_INET);
+ sqinet_set_v4_inaddr(&i->addrs.in_addrs6[j], (struct in_addr *)
answers[k].rdata);
+ if (do_debug(14, 3)) {
+ char buf[MAX_IPSTRLEN];
+ (void) sqinet_ntoa(&i->addrs.in_addrs6[j], buf, MAX_IPSTRLEN,
SQADDR_NONE);
+ debug(14, 3) ("ipcacheParse: #%d %s\n", j, buf);
+ }
+ j++;
} else if (answers[k].type != RFC1035_TYPE_CNAME)
continue;
if (ttl == 0 || ttl > answers[k].ttl)
@@ -416,12 +432,14 @@
debug(14, 1) ("Successful DNS name lookup tests...\n");
}
memset(&static_addrs, '\0', sizeof(ipcache_addrs));
- static_addrs.in_addrs = xcalloc(1, sizeof(struct in_addr));
+ static_addrs.in_addrs6 = xcalloc(1, sizeof(sqaddr_t));
+ sqinet_init(&static_addrs.in_addrs6[0]);
static_addrs.bad_mask = xcalloc(1, sizeof(unsigned char));
ipcache_high = (long) (((float) namecache_ipcache_size *
(float) namecache_ipcache_high) / (float) 100);
ipcache_low = (long) (((float) namecache_ipcache_size *
(float) namecache_ipcache_low) / (float) 100);
+ /* XXX reusing n here */
n = hashPrime(ipcache_high / 4);
ip_table = hash_create((HASHCMP *) strcmp, n, hash4);
pool_ipcache = memPoolCreate("ipcache_entry", sizeof(ipcache_entry));
@@ -495,6 +513,9 @@
*/
}
+/*
+ * XXX this routine is not re-entrant!
+ */
ipcache_addrs *
ipcacheCheckNumeric(const char *name)
{
@@ -504,7 +525,8 @@
return NULL;
static_addrs.count = 1;
static_addrs.cur = 0;
- static_addrs.in_addrs[0].s_addr = ip.s_addr;
+ sqinet_init(&static_addrs.in_addrs6[0]);
+ sqinet_set_v4_inaddr(&static_addrs.in_addrs6[0], &ip);
static_addrs.bad_mask[0] = FALSE;
static_addrs.badcount = 0;
return &static_addrs;
@@ -556,8 +578,11 @@
ia->badcount = 0;
ia->cur = 0;
}
- debug(14, 3) ("ipcacheCycleAddr: %s now at %s\n", name,
- inet_ntoa(ia->in_addrs[ia->cur]));
+ if (do_debug(14, 3)) {
+ char buf[MAX_IPSTRLEN];
+ (void) sqinet_ntoa(&ia->in_addrs6[ia->cur], buf, MAX_IPSTRLEN,
SQADDR_NONE);
+ debug(14, 3) ("ipcacheCycleAddr: %s now at %s\n", name, buf);
+ }
}
/*
@@ -565,23 +590,17 @@
* advance the current pointer to the next OK address.
*/
void
-ipcacheMarkBadAddr(const char *name, sqaddr_t *a)
+ipcacheMarkBadAddr(const char *name, sqaddr_t *addr)
{
ipcache_entry *i;
ipcache_addrs *ia;
- struct in_addr addr;
-
- if (sqinet_get_family(a) != AF_INET)
- return;
-#warning ipcacheMarkBadAddr needs to be ipv6ed!
- addr = sqinet_get_v4_inaddr(a, SQADDR_ASSERT_IS_V4);
int k;
if ((i = ipcache_get(name)) == NULL)
return;
ia = &i->addrs;
for (k = 0; k < (int) ia->count; k++) {
- if (ia->in_addrs[k].s_addr == addr.s_addr)
+ if (sqinet_compare_addr(&ia->in_addrs6[k], addr))
break;
}
if (k == (int) ia->count) /* not found */
@@ -590,29 +609,27 @@
ia->bad_mask[k] = TRUE;
ia->badcount++;
i->expires = XMIN(squid_curtime + XMAX(60, namecache_dns_negative_ttl),
i->expires);
- debug(14, 2) ("ipcacheMarkBadAddr: %s [%s]\n", name, inet_ntoa(addr));
+ if (do_debug(14, 2)) {
+ char buf[MAX_IPSTRLEN];
+ (void) sqinet_ntoa(addr, buf, MAX_IPSTRLEN, SQADDR_NONE);
+ debug(14, 2) ("ipcacheMarkBadAddr: %s [%s]\n", name, buf);
+ }
}
ipcacheCycleAddr(name, ia);
}
void
-ipcacheMarkGoodAddr(const char *name, sqaddr_t *a)
+ipcacheMarkGoodAddr(const char *name, sqaddr_t *addr)
{
ipcache_entry *i;
ipcache_addrs *ia;
- struct in_addr addr;
-
- if (sqinet_get_family(a) != AF_INET)
- return;
-#warning ipcacheMarkGoodAddr needs to be ipv6ed!
- addr = sqinet_get_v4_inaddr(a, SQADDR_ASSERT_IS_V4);
int k;
if ((i = ipcache_get(name)) == NULL)
return;
ia = &i->addrs;
for (k = 0; k < (int) ia->count; k++) {
- if (ia->in_addrs[k].s_addr == addr.s_addr)
+ if (sqinet_compare_addr(&ia->in_addrs6[k], addr))
break;
}
if (k == (int) ia->count) /* not found */
@@ -621,14 +638,24 @@
return;
ia->bad_mask[k] = FALSE;
ia->badcount--;
- debug(14, 2) ("ipcacheMarkGoodAddr: %s [%s]\n", name, inet_ntoa(addr));
+ if (do_debug(14, 2)) {
+ char buf[MAX_IPSTRLEN];
+ (void) sqinet_ntoa(addr, buf, MAX_IPSTRLEN, SQADDR_NONE);
+ debug(14, 2) ("ipcacheMarkGoodAddr: %s [%s]\n", name, buf);
+ }
}
static void
ipcacheFreeEntry(void *data)
{
ipcache_entry *i = data;
- safe_free(i->addrs.in_addrs);
+ int k;
+
+ /* Clean up correctly first */
+ for (k = 0; k < i->addrs.count; k++) {
+ sqinet_done(&i->addrs.in_addrs6[k]);
+ }
+ safe_free(i->addrs.in_addrs6);
safe_free(i->addrs.bad_mask);
safe_free(i->hash.key);
safe_free(i->error_message);
@@ -687,9 +714,10 @@
i->addrs.count = 1;
i->addrs.cur = 0;
i->addrs.badcount = 0;
- i->addrs.in_addrs = xcalloc(1, sizeof(struct in_addr));
+ i->addrs.in_addrs6 = xcalloc(1, sizeof(sqaddr_t));
i->addrs.bad_mask = xcalloc(1, sizeof(unsigned char));
- i->addrs.in_addrs[0].s_addr = ip.s_addr;
+ sqinet_init(&i->addrs.in_addrs6[0]);
+ sqinet_set_v4_inaddr(&i->addrs.in_addrs6[0], &ip);
i->addrs.bad_mask[0] = FALSE;
i->flags.fromhosts = 1;
ipcacheAddEntry(i);
@@ -722,7 +750,7 @@
struct in_addr
ipcacheGetAddrV4(const ipcache_addrs *ia, int i)
{
- return ia->in_addrs[i];
+ return sqinet_get_v4_inaddr(&ia->in_addrs6[i], SQADDR_ASSERT_IS_V4);
}
int
@@ -731,7 +759,7 @@
if (i >= ia->count)
return 0;
- sqinet_set_v4_inaddr(a, &ia->in_addrs[i]);
+ sqinet_copy(a, &ia->in_addrs6[i]);
return 1;
}
@@ -739,5 +767,7 @@
int
ipcacheGetAddrFamily(const ipcache_addrs *ia, int i)
{
- return AF_INET;
-}
+ if (i >= ia->count)
+ return -1;
+ return sqinet_get_family(&ia->in_addrs6[i]);
+}
=======================================
--- /playpen/LUSCA_HEAD_ipv6/libsqname/ipcache.h Tue Jan 11 23:15:40 2011
+++ /playpen/LUSCA_HEAD_ipv6/libsqname/ipcache.h Thu Jan 13 02:31:57 2011
@@ -4,7 +4,7 @@
#define IP_LOOKUP_IF_MISS 0x01
struct _ipcache_addrs {
- struct in_addr *in_addrs;
+ sqaddr_t *in_addrs6;
unsigned char *bad_mask;
unsigned char count;
unsigned char cur;
--
You received this message because you are subscribed to the Google Groups
"lusca-commit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/lusca-commit?hl=en.