[netflow-tools] Number of active flows raises and raises...

Damien Miller djm at mindrot.org
Tue Jan 24 11:51:10 EST 2006


On Mon, 23 Jan 2006, Andreas Brillisauer -- Hetzner Online AG wrote:

> I did expect that the number of active flows won't raise mentionably
> after the limit of 5 minutes because softflowd has to expire the flows
> (see option "-t maxlife=300"). But the number of active flows raises and
> raises until the limit of 1048576 is reached. I have no answer for that.
> Once the limit of maximum flows is reached softflowd takes 99% of the

That is a bug, which caused the maxlife to only be checked when traffic was
received on a flow. Please try this patch:

Index: softflowd.c
===================================================================
RCS file: /var/cvs/softflowd/softflowd.c,v
retrieving revision 1.86
diff -u -p -r1.86 softflowd.c
--- softflowd.c	18 Nov 2005 05:19:12 -0000	1.86
+++ softflowd.c	24 Jan 2006 00:45:01 -0000
@@ -473,7 +473,7 @@ flow_update_expiry(struct FLOWTRACK *ft,
 	if (ft->icmp_timeout != 0 &&
 	    ((flow->af == AF_INET && flow->protocol == IPPROTO_ICMP) || 
 	    ((flow->af == AF_INET6 && flow->protocol == IPPROTO_ICMPV6)))) {
-		/* UDP flows */
+		/* ICMP flows */
 		flow->expiry->expires_at = flow->flow_last.tv_sec + 
 		    ft->icmp_timeout;
 		flow->expiry->reason = R_ICMP;
@@ -486,6 +486,11 @@ flow_update_expiry(struct FLOWTRACK *ft,
 	flow->expiry->reason = R_GENERAL;
 
  out:
+	if (ft->maximum_lifetime != 0 && flow->expiry->expires_at != 0) {
+		flow->expiry->expires_at = MIN(flow->expiry->expires_at,
+		    flow->flow_start.tv_sec + ft->maximum_lifetime);
+	}
+
 	EXPIRY_INSERT(EXPIRIES, &ft->expiries, flow->expiry);
 }
 
@@ -745,9 +750,18 @@ check_expired(struct FLOWTRACK *ft, stru
 		    (ex != CE_EXPIRE_FORCED &&
 		    (expiry->expires_at < now.tv_sec))) {
 			/* Flow has expired */
+
+			if (ft->maximum_lifetime != 0 && 
+	    		    expiry->flow->flow_last.tv_sec - 
+			    expiry->flow->flow_start.tv_sec >= 
+	    		    ft->maximum_lifetime)
+					expiry->reason = R_MAXLIFE;
+
 			if (verbose_flag)
-				logit(LOG_DEBUG, "Queuing flow seq:%llu (%p) for expiry",
-				   expiry->flow->flow_seq, expiry->flow);
+				logit(LOG_DEBUG,
+				    "Queuing flow seq:%llu (%p) for expiry "
+				    "reason %d", expiry->flow->flow_seq,
+				    expiry->flow, expiry->reason);
 
 			/* Add to array of expired flows */
 			oldexp = expired_flows;




More information about the netflow-tools mailing list