summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2008-06-01 18:34:58 +0000
committermav <mav@FreeBSD.org>2008-06-01 18:34:58 +0000
commit9b1d66c627083e94ab3e29ebfaa2d37faa036d91 (patch)
tree79697598b27e010b85229bef1fc3adb099b24bd3 /sys
parent4dbba50d9d8658363b21d7a16cff9ae0b26eb2fd (diff)
downloadFreeBSD-src-9b1d66c627083e94ab3e29ebfaa2d37faa036d91.zip
FreeBSD-src-9b1d66c627083e94ab3e29ebfaa2d37faa036d91.tar.gz
Increase LINK_TABLE_OUT_SIZE from 101 to 4001 like LINK_TABLE_IN_SIZE
to reduce performance degradation under heavy outgoing scan/flood. Scalability is now much more important then several kilobytes of RAM. Remove unneded TCP-specific expiration handeling. Before this connected TCP sessions could never expire. Now connected TCP sessions will expire after 24hours of inactivity. Simplify HouseKeeping() to avoid several mul/div-s per packet. Taking into account increased LINK_TABLE_OUT_SIZE, precision is still much more then required.
Diffstat (limited to 'sys')
-rw-r--r--sys/netinet/libalias/alias_db.c89
-rw-r--r--sys/netinet/libalias/alias_local.h4
2 files changed, 23 insertions, 70 deletions
diff --git a/sys/netinet/libalias/alias_db.c b/sys/netinet/libalias/alias_db.c
index 9a7d3a5..a9e96d1 100644
--- a/sys/netinet/libalias/alias_db.c
+++ b/sys/netinet/libalias/alias_db.c
@@ -180,8 +180,9 @@ static LIST_HEAD(, libalias) instancehead = LIST_HEAD_INITIALIZER(instancehead)
*/
/* Parameters used for cleanup of expired links */
-#define ALIAS_CLEANUP_INTERVAL_SECS 60
-#define ALIAS_CLEANUP_MAX_SPOKES 30
+/* NOTE: ALIAS_CLEANUP_INTERVAL_SECS must be less then LINK_TABLE_OUT_SIZE */
+#define ALIAS_CLEANUP_INTERVAL_SECS 64
+#define ALIAS_CLEANUP_MAX_SPOKES (LINK_TABLE_OUT_SIZE/5)
/* Timeouts (in seconds) for different link types */
#define ICMP_EXPIRE_TIME 60
@@ -814,20 +815,12 @@ static void
CleanupAliasData(struct libalias *la)
{
struct alias_link *lnk;
- int i, icount;
+ int i;
LIBALIAS_LOCK_ASSERT(la);
- icount = 0;
for (i = 0; i < LINK_TABLE_OUT_SIZE; i++) {
- lnk = LIST_FIRST(&la->linkTableOut[i]);
- while (lnk != NULL) {
- struct alias_link *link_next;
-
- link_next = LIST_NEXT(lnk, list_out);
- icount++;
+ while ((lnk = LIST_FIRST(&la->linkTableOut[i])) != NULL)
DeleteLink(lnk);
- lnk = link_next;
- }
}
la->cleanupIndex = 0;
@@ -837,39 +830,13 @@ CleanupAliasData(struct libalias *la)
static void
IncrementalCleanup(struct libalias *la)
{
- int icount;
- struct alias_link *lnk;
+ struct alias_link *lnk, *lnk_tmp;
LIBALIAS_LOCK_ASSERT(la);
- icount = 0;
- lnk = LIST_FIRST(&la->linkTableOut[la->cleanupIndex++]);
- while (lnk != NULL) {
- int idelta;
- struct alias_link *link_next;
-
- link_next = LIST_NEXT(lnk, list_out);
- idelta = la->timeStamp - lnk->timestamp;
- switch (lnk->link_type) {
- case LINK_TCP:
- if (idelta > lnk->expire_time) {
- struct tcp_dat *tcp_aux;
-
- tcp_aux = lnk->data.tcp;
- if (tcp_aux->state.in != ALIAS_TCP_STATE_CONNECTED
- || tcp_aux->state.out != ALIAS_TCP_STATE_CONNECTED) {
- DeleteLink(lnk);
- icount++;
- }
- }
- break;
- default:
- if (idelta > lnk->expire_time) {
- DeleteLink(lnk);
- icount++;
- }
- break;
- }
- lnk = link_next;
+ LIST_FOREACH_SAFE(lnk, &la->linkTableOut[la->cleanupIndex++],
+ list_out, lnk_tmp) {
+ if (la->timeStamp - lnk->timestamp > lnk->expire_time)
+ DeleteLink(lnk);
}
if (la->cleanupIndex == LINK_TABLE_OUT_SIZE)
@@ -1137,12 +1104,12 @@ _FindLinkOut(struct libalias *la, struct in_addr src_addr,
LIBALIAS_LOCK_ASSERT(la);
i = StartPointOut(src_addr, dst_addr, src_port, dst_port, link_type);
LIST_FOREACH(lnk, &la->linkTableOut[i], list_out) {
- if (lnk->src_addr.s_addr == src_addr.s_addr
- && lnk->server == NULL
- && lnk->dst_addr.s_addr == dst_addr.s_addr
- && lnk->dst_port == dst_port
- && lnk->src_port == src_port
- && lnk->link_type == link_type) {
+ if (lnk->dst_addr.s_addr == dst_addr.s_addr &&
+ lnk->src_addr.s_addr == src_addr.s_addr &&
+ lnk->src_port == src_port &&
+ lnk->dst_port == dst_port &&
+ lnk->link_type == link_type &&
+ lnk->server == NULL) {
lnk->timestamp = la->timeStamp;
break;
}
@@ -2189,7 +2156,7 @@ SetDestCallId(struct alias_link *lnk, u_int16_t cid)
void
HouseKeeping(struct libalias *la)
{
- int i, n, n100;
+ int i, n;
#ifndef _KERNEL
struct timeval tv;
struct timezone tz;
@@ -2209,24 +2176,14 @@ HouseKeeping(struct libalias *la)
#endif
/* Compute number of spokes (output table link chains) to cover */
- n100 = LINK_TABLE_OUT_SIZE * 100 + la->houseKeepingResidual;
- n100 *= la->timeStamp - la->lastCleanupTime;
- n100 /= ALIAS_CLEANUP_INTERVAL_SECS;
-
- n = n100 / 100;
+ n = LINK_TABLE_OUT_SIZE * (la->timeStamp - la->lastCleanupTime);
+ n /= ALIAS_CLEANUP_INTERVAL_SECS;
/* Handle different cases */
- if (n > ALIAS_CLEANUP_MAX_SPOKES) {
- n = ALIAS_CLEANUP_MAX_SPOKES;
+ if (n > 0) {
+ if (n > ALIAS_CLEANUP_MAX_SPOKES)
+ n = ALIAS_CLEANUP_MAX_SPOKES;
la->lastCleanupTime = la->timeStamp;
- la->houseKeepingResidual = 0;
-
- for (i = 0; i < n; i++)
- IncrementalCleanup(la);
- } else if (n > 0) {
- la->lastCleanupTime = la->timeStamp;
- la->houseKeepingResidual = n100 - 100 * n;
-
for (i = 0; i < n; i++)
IncrementalCleanup(la);
} else if (n < 0) {
@@ -2235,7 +2192,6 @@ HouseKeeping(struct libalias *la)
fprintf(stderr, "something unexpected in time values\n");
#endif
la->lastCleanupTime = la->timeStamp;
- la->houseKeepingResidual = 0;
}
}
@@ -2529,7 +2485,6 @@ LibAliasInit(struct libalias *la)
la->timeStamp = tv.tv_sec;
la->lastCleanupTime = tv.tv_sec;
#endif
- la->houseKeepingResidual = 0;
for (i = 0; i < LINK_TABLE_OUT_SIZE; i++)
LIST_INIT(&la->linkTableOut[i]);
diff --git a/sys/netinet/libalias/alias_local.h b/sys/netinet/libalias/alias_local.h
index 2a7449a..fc7d649 100644
--- a/sys/netinet/libalias/alias_local.h
+++ b/sys/netinet/libalias/alias_local.h
@@ -60,7 +60,7 @@
#endif
/* Sizes of input and output link tables */
-#define LINK_TABLE_OUT_SIZE 101
+#define LINK_TABLE_OUT_SIZE 4001
#define LINK_TABLE_IN_SIZE 4001
struct proxy_entry;
@@ -110,8 +110,6 @@ struct libalias {
* IncrementalCleanup() */
/* was called */
- int houseKeepingResidual; /* used by HouseKeeping() */
-
int deleteAllLinks; /* If equal to zero, DeleteLink() */
/* will not remove permanent links */
OpenPOWER on IntegriCloud