/*
- * $Id: net_db.cc,v 1.61 1998/02/03 04:21:18 wessels Exp $
+ * $Id: net_db.cc,v 1.62 1998/02/05 20:54:38 wessels Exp $
*
* DEBUG: section 37 Network Measurement Database
* AUTHOR: Duane Wessels
static void netdbRelease(netdbEntry * n);
static void netdbHashInsert(netdbEntry * n, struct in_addr addr);
static void netdbHashDelete(const char *key);
-static void netdbHashLink(netdbEntry * n, const char *hostname);
-static void netdbHashUnlink(const char *key);
+static void netdbHostInsert(netdbEntry * n, const char *hostname);
+static void netdbHostDelete(const net_db_name * x);
static void netdbPurgeLRU(void);
static netdbEntry *netdbLookupHost(const char *key);
static net_db_peer *netdbPeerByName(const netdbEntry * n, const char *);
{
xstrncpy(n->network, inet_ntoa(networkFromInaddr(addr)), 16);
n->key = n->network;
+ assert(hash_lookup(addr_table, n->network) == NULL);
hash_join(addr_table, (hash_link *) n);
- meta_data.netdb_addrs++;
}
static void
return;
}
hash_remove_link(addr_table, hptr);
- meta_data.netdb_addrs--;
}
static void
-netdbHashLink(netdbEntry * n, const char *hostname)
+netdbHostInsert(netdbEntry * n, const char *hostname)
{
- net_db_name *x = xcalloc(1, sizeof(net_db_name));
+ net_db_name *x = memAllocate(MEM_NET_DB_NAME, 0);
x->name = xstrdup(hostname);
x->next = n->hosts;
n->hosts = x;
- hash_insert(host_table, x->name, n);
+ x->net_db_entry = n;
+ assert(hash_lookup(host_table, hostname) == NULL);
+ hash_join(host_table, (hash_link *) x);
n->link_count++;
- meta_data.netdb_hosts++;
}
static void
-netdbHashUnlink(const char *key)
+netdbHostDelete(const net_db_name * x)
{
netdbEntry *n;
- net_db_name *x;
net_db_name **X;
- hash_link *hptr = hash_lookup(host_table, key);
- assert(hptr != NULL);
- n = (netdbEntry *) hptr->item;
- for (X = &n->hosts; (x = *X) != NULL; X = &x->next) {
- if (strcmp(x->name, key) == 0)
- break;
- }
assert(x != NULL);
- *X = x->next;
- safe_free(x->name);
- safe_free(x);
- hash_delete_link(host_table, hptr);
+ assert(x->net_db_entry != NULL);
+ n = x->net_db_entry;
n->link_count--;
- meta_data.netdb_hosts--;
+ for (X = &n->hosts; *X; X = &(*X)->next) {
+ if (*X == x) {
+ *X = x->next;
+ break;
+ }
+ }
+ hash_remove_link(host_table, (hash_link *) x);
+ xfree(x->name);
+ memFree(MEM_NET_DB_NAME, (void *) x);
}
static netdbEntry *
netdbLookupHost(const char *key)
{
- hash_link *hptr = hash_lookup(host_table, key);
- return hptr ? (netdbEntry *) hptr->item : NULL;
+ net_db_name *x = (net_db_name *) hash_lookup(host_table, key);
+ return x ? x->net_db_entry : NULL;
}
static void
netdbRelease(netdbEntry * n)
{
net_db_name *x;
- net_db_name *next = NULL;
+ net_db_name *next;
for (x = n->hosts; x; x = next) {
next = x->next;
- netdbHashUnlink(x->name);
- safe_free(x->name);
- safe_free(x);
+ netdbHostDelete(x);
}
n->hosts = NULL;
safe_free(n->peers);
n->n_peers_alloc = 0;
if (n->link_count == 0) {
netdbHashDelete(n->network);
- xfree(n);
+ memFree(MEM_NETDBENTRY, n);
}
}
int k = 0;
int list_count = 0;
int removed = 0;
- list = xcalloc(meta_data.netdb_addrs, sizeof(netdbEntry *));
+ list = xcalloc(memInUse(MEM_NETDBENTRY), sizeof(netdbEntry *));
n = (netdbEntry *) hash_first(addr_table);
while (n != NULL) {
- assert(list_count < meta_data.netdb_addrs);
+ assert(list_count < memInUse(MEM_NETDBENTRY));
*(list + list_count) = n;
list_count++;
n = (netdbEntry *) hash_next(addr_table);
sizeof(netdbEntry *),
netdbLRU);
for (k = 0; k < list_count; k++) {
- if (meta_data.netdb_addrs < Config.Netdb.low)
+ if (memInUse(MEM_NETDBENTRY) < Config.Netdb.low)
break;
netdbRelease(*(list + k));
removed++;
static netdbEntry *
netdbLookupAddr(struct in_addr addr)
{
+ netdbEntry *n;
char *key = inet_ntoa(networkFromInaddr(addr));
- return (netdbEntry *) hash_lookup(addr_table, key);
+ n = (netdbEntry *) hash_lookup(addr_table, key);
+ return n;
}
static netdbEntry *
-netdbAdd(struct in_addr addr, const char *hostname)
+netdbAdd(struct in_addr addr)
{
netdbEntry *n;
- if (meta_data.netdb_addrs > Config.Netdb.high)
+ if (memInUse(MEM_NETDBENTRY) > Config.Netdb.high)
netdbPurgeLRU();
if ((n = netdbLookupAddr(addr)) == NULL) {
- n = xcalloc(1, sizeof(netdbEntry));
+ n = memAllocate(MEM_NETDBENTRY, 0);
netdbHashInsert(n, addr);
}
- netdbHashLink(n, hostname);
return n;
}
char *hostname = data;
netdbEntry *n;
netdbEntry *na;
+ net_db_name *x;
+ net_db_name **X;
cbdataUnlock(hostname);
if (ia == NULL) {
cbdataFree(hostname);
}
addr = ia->in_addrs[ia->cur];
if ((n = netdbLookupHost(hostname)) == NULL) {
- n = netdbAdd(addr, hostname);
+ n = netdbAdd(addr);
+ netdbHostInsert(n, hostname);
} else if ((na = netdbLookupAddr(addr)) != n) {
/*
*hostname moved from 'network n' to 'network na'!
*/
if (na == NULL)
- na = netdbAdd(addr, hostname);
+ na = netdbAdd(addr);
debug(37, 1) ("netdbSendPing: NOTE: %s moved from %s to %s\n",
hostname, n->network, na->network);
- netdbHashUnlink(hostname);
- netdbHashLink(na, hostname);
+ x = (net_db_name *) hash_lookup(host_table, hostname);
+ if (x == NULL) {
+ debug(37, 1) ("netdbSendPing: net_db_name list bug: %s not found", hostname);
+ cbdataFree(hostname);
+ return;
+ }
+ /* remove net_db_name from 'network n' linked list */
+ for (X = &n->hosts; *X; X = &(*X)->next) {
+ if (*X == x) {
+ *X = x->next;
+ break;
+ }
+ }
+ n->link_count--;
+ /* point to 'network na' from host entry */
+ x->net_db_entry = na;
+ /* link net_db_name to 'network na' */
+ x->next = na->hosts;
+ na->hosts = x;
+ na->link_count++;
n = na;
}
debug(37, 3) ("netdbSendPing: pinging %s\n", hostname);
count++;
}
fclose(fp);
+ getCurrentTime();
debug(37, 0) ("NETDB state saved; %d entries, %d msec\n",
count, tvSubMsec(start, current_time));
eventAdd("netdbSaveState", netdbSaveState, NULL, 3617);
continue;
if (!safe_inet_addr(t, &addr))
continue;
+ if (netdbLookupAddr(addr) != NULL) /* no dups! */
+ continue;
if ((t = strtok(NULL, w_space)) == NULL)
continue;
N.pings_sent = atoi(t);
if ((t = strtok(NULL, w_space)) == NULL)
continue;
N.last_use_time = (time_t) atoi(t);
- n = xcalloc(1, sizeof(netdbEntry));
+ n = memAllocate(MEM_NETDBENTRY, 0);
xmemcpy(n, &N, sizeof(netdbEntry));
netdbHashInsert(n, addr);
- while ((t = strtok(NULL, w_space)) != NULL)
- netdbHashLink(n, t);
+ while ((t = strtok(NULL, w_space)) != NULL) {
+ if (netdbLookupHost(t) != NULL) /* no dups! */
+ continue;
+ netdbHostInsert(n, t);
+ }
count++;
}
memFree(MEM_4K_BUF, buf);
fclose(fp);
+ getCurrentTime();
debug(37, 0) ("NETDB state reloaded; %d entries, %d msec\n",
count, tvSubMsec(start, current_time));
}
#if USE_ICMP
netdbEntry *n;
netdbEntry **L1;
- hash_link *h;
- hash_link **L2;
+ net_db_name **L2;
net_db_name *x;
int i = 0;
int j;
- L1 = xcalloc(meta_data.netdb_addrs, sizeof(netdbEntry *));
+ L1 = xcalloc(memInUse(MEM_NETDBENTRY), sizeof(netdbEntry *));
n = (netdbEntry *) hash_first(addr_table);
- while (n && i < meta_data.netdb_addrs) {
+ while (n && i < memInUse(MEM_NETDBENTRY)) {
*(L1 + i) = n;
i++;
n = (netdbEntry *) hash_next(addr_table);
}
for (j = 0; j < i; j++) {
n = *(L1 + j);
- while ((x = n->hosts) != NULL) {
- n->hosts = x->next;
- safe_free(x);
- }
safe_free(n->peers);
- xfree(n);
+ memFree(MEM_NETDBENTRY, n);
}
xfree(L1);
i = 0;
- L2 = xcalloc(meta_data.netdb_hosts, sizeof(hash_link *));
- h = hash_first(host_table);
- while (h && i < meta_data.netdb_hosts) {
- *(L2 + i) = h;
+ L2 = xcalloc(memInUse(MEM_NET_DB_NAME), sizeof(net_db_name *));
+ x = (net_db_name *) hash_first(host_table);
+ while (x && i < memInUse(MEM_NET_DB_NAME)) {
+ *(L2 + i) = x;
i++;
- h = hash_next(host_table);
+ x = (net_db_name *) hash_next(host_table);
}
for (j = 0; j < i; j++) {
- h = *(L2 + j);
- xfree(h->key);
- xfree(h);
+ x = *(L2 + j);
+ xfree(x->name);
+ memFree(MEM_NET_DB_NAME, x);
}
xfree(L2);
hashFreeMemory(addr_table);
"RTT",
"Hops",
"Hostnames");
- list = xcalloc(meta_data.netdb_addrs, sizeof(netdbEntry *));
+ list = xcalloc(memInUse(MEM_NETDBENTRY), sizeof(netdbEntry *));
i = 0;
n = (netdbEntry *) hash_first(addr_table);
while (n != NULL) {
*(list + i++) = n;
n = (netdbEntry *) hash_next(addr_table);
}
- if (i != meta_data.netdb_addrs)
+ if (i != memInUse(MEM_NETDBENTRY))
debug(37, 0) ("WARNING: netdb_addrs count off, found %d, expected %d\n",
- i, meta_data.netdb_addrs);
+ i, memInUse(MEM_NETDBENTRY));
qsort((char *) list,
i,
sizeof(netdbEntry *),
}
}
#endif
+
+void
+netdbDeleteAddrNetwork(struct in_addr addr)
+{
+#if USE_ICMP
+ netdbEntry *n = netdbLookupAddr(addr);
+ if (n == NULL)
+ return;
+ debug(37, 1) ("netdbDeleteAddrNetwork: %s\n", n->network);
+ netdbRelease(n);
+#endif
+}