Index: npl/internetserver/iproute2/iproute2-2.6.29.1-flush.patch
===================================================================
--- npl/internetserver/iproute2/iproute2-2.6.29.1-flush.patch	(revision c5c522c7ca74a4c1725ca5e3fe0bdcadff80e49a)
+++ npl/internetserver/iproute2/iproute2-2.6.29.1-flush.patch	(revision c5c522c7ca74a4c1725ca5e3fe0bdcadff80e49a)
@@ -0,0 +1,220 @@
+diff -Nru iproute2-2.6.29-1.orig/ip/ipaddress.c iproute2-2.6.29-1/ip/ipaddress.c
+--- iproute2-2.6.29-1.orig/ip/ipaddress.c	2009-03-24 23:40:54.000000000 +0100
++++ iproute2-2.6.29-1/ip/ipaddress.c	2009-07-11 09:00:32.000000000 +0200
+@@ -37,6 +37,8 @@
+ 
+ #define MAX_ROUNDS 10
+ 
++static struct rtnl_handle rth_flush = { .fd = -1 };
++
+ static struct
+ {
+ 	int ifindex;
+@@ -339,7 +341,7 @@
+ 
+ static int flush_update(void)
+ {
+-	if (rtnl_send_check(&rth, filter.flushb, filter.flushp) < 0) {
++	if (rtnl_send_check(&rth_flush, filter.flushb, filter.flushp) < 0) {
+ 		perror("Failed to send flush request");
+ 		return -1;
+ 	}
+@@ -697,6 +699,9 @@
+ 		filter.flushp = 0;
+ 		filter.flushe = sizeof(flushb);
+ 
++		if (rtnl_open(&rth_flush, 0) < 0)
++			return 1;
++
+ 		while (round < MAX_ROUNDS) {
+ 			if (rtnl_wilddump_request(&rth, filter.family, RTM_GETADDR) < 0) {
+ 				perror("Cannot send dump request");
+@@ -715,18 +720,20 @@
+ 						printf("*** Flush is complete after %d round%s ***\n", round, round>1?"s":"");
+ 				}
+ 				fflush(stdout);
++				rtnl_close(&rth_flush);
+ 				return 0;
+ 			}
+ 			round++;
+ 			if (flush_update() < 0)
+-				return 1;
++				break;
+ 
+ 			if (show_stats) {
+ 				printf("\n*** Round %d, deleting %d addresses ***\n", round, filter.flushed);
+ 				fflush(stdout);
+ 			}
+ 		}
+-		fprintf(stderr, "*** Flush remains incomplete after %d rounds. ***\n", MAX_ROUNDS); fflush(stderr);
++		fprintf(stderr, "*** Flush remains incomplete after %d rounds. ***\n", round); fflush(stderr);
++		rtnl_close(&rth_flush);
+ 		return 1;
+ 	}
+ 
+diff -Nru iproute2-2.6.29-1.orig/ip/ipneigh.c iproute2-2.6.29-1/ip/ipneigh.c
+--- iproute2-2.6.29-1.orig/ip/ipneigh.c	2009-03-24 23:40:54.000000000 +0100
++++ iproute2-2.6.29-1/ip/ipneigh.c	2009-07-11 09:04:32.000000000 +0200
+@@ -32,6 +32,8 @@
+ #define NUD_VALID	(NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY)
+ #define MAX_ROUNDS	10
+ 
++static struct rtnl_handle rth_flush = { .fd = -1 };
++
+ static struct
+ {
+ 	int family;
+@@ -87,7 +89,7 @@
+ 
+ static int flush_update(void)
+ {
+-	if (rtnl_send_check(&rth, filter.flushb, filter.flushp) < 0) {
++	if (rtnl_send_check(&rth_flush, filter.flushb, filter.flushp) < 0) {
+ 		perror("Failed to send flush request");
+ 		return -1;
+ 	}
+@@ -391,6 +393,9 @@
+ 		filter.flushe = sizeof(flushb);
+ 		filter.state &= ~NUD_FAILED;
+ 
++		if (rtnl_open(&rth_flush, 0) < 0)
++			return 1;
++
+ 		while (round < MAX_ROUNDS) {
+ 			if (rtnl_wilddump_request(&rth, filter.family, RTM_GETNEIGH) < 0) {
+ 				perror("Cannot send dump request");
+@@ -409,18 +414,20 @@
+ 						printf("*** Flush is complete after %d round%s ***\n", round, round>1?"s":"");
+ 				}
+ 				fflush(stdout);
++				rtnl_close(&rth_flush);
+ 				return 0;
+ 			}
+ 			round++;
+ 			if (flush_update() < 0)
+-				exit(1);
++				break;
++
+ 			if (show_stats) {
+ 				printf("\n*** Round %d, deleting %d entries ***\n", round, filter.flushed);
+ 				fflush(stdout);
+ 			}
+ 		}
+-		printf("*** Flush not complete bailing out after %d rounds\n",
+-			MAX_ROUNDS);
++		fprintf(stderr, "*** Flush remains incomplete after %d rounds. ***\n", round); fflush(stderr);
++		rtnl_close(&rth_flush);
+ 		return 1;
+ 	}
+ 
+diff -Nru iproute2-2.6.29-1.orig/ip/iproute.c iproute2-2.6.29-1/ip/iproute.c
+--- iproute2-2.6.29-1.orig/ip/iproute.c	2009-03-24 23:40:54.000000000 +0100
++++ iproute2-2.6.29-1/ip/iproute.c	2009-07-11 09:04:45.000000000 +0200
+@@ -37,6 +37,7 @@
+ #define RTAX_RTTVAR RTAX_HOPS
+ #endif
+ 
++static struct rtnl_handle rth_flush = { .fd = -1 };
+ 
+ static const char *mx_names[RTAX_MAX+1] = {
+ 	[RTAX_MTU]	= "mtu",
+@@ -112,7 +113,7 @@
+ 
+ static int flush_update(void)
+ {
+-	if (rtnl_send_check(&rth, filter.flushb, filter.flushp) < 0) {
++	if (rtnl_send_check(&rth_flush, filter.flushb, filter.flushp) < 0) {
+ 		perror("Failed to send flush request");
+ 		return -1;
+ 	}
+@@ -1210,6 +1211,9 @@
+ 		filter.flushp = 0;
+ 		filter.flushe = sizeof(flushb);
+ 
++		if (rtnl_open(&rth_flush, 0) < 0)
++			return 1;
++
+ 		for (;;) {
+ 			if (rtnl_wilddump_request(&rth, do_ipv6, RTM_GETROUTE) < 0) {
+ 				perror("Cannot send dump request");
+@@ -1228,6 +1232,7 @@
+ 						printf("*** Flush is complete after %d round%s ***\n", round, round>1?"s":"");
+ 				}
+ 				fflush(stdout);
++				rtnl_close(&rth_flush);
+ 				return 0;
+ 			}
+ 			round++;
+diff -Nru iproute2-2.6.29-1.orig/ip/xfrm_policy.c iproute2-2.6.29-1/ip/xfrm_policy.c
+--- iproute2-2.6.29-1.orig/ip/xfrm_policy.c	2009-03-24 23:40:54.000000000 +0100
++++ iproute2-2.6.29-1/ip/xfrm_policy.c	2009-07-11 08:59:34.000000000 +0200
+@@ -756,11 +756,15 @@
+ 		struct xfrm_buffer xb;
+ 		char buf[NLMSG_DELETEALL_BUF_SIZE];
+ 		int i;
++		struct rtnl_handle rth2;
+ 
+ 		xb.buf = buf;
+ 		xb.size = sizeof(buf);
+ 		xb.rth = &rth;
+ 
++		if (rtnl_open(&rth2, 0) < 0)
++			exit(1);
++
+ 		for (i = 0; ; i++) {
+ 			xb.offset = 0;
+ 			xb.nlmsg_count = 0;
+@@ -783,7 +787,7 @@
+ 				break;
+ 			}
+ 
+-			if (rtnl_send_check(&rth, xb.buf, xb.offset) < 0) {
++			if (rtnl_send_check(&rth2, xb.buf, xb.offset) < 0) {
+ 				perror("Failed to send delete-all request");
+ 				exit(1);
+ 			}
+@@ -793,6 +797,8 @@
+ 			xb.offset = 0;
+ 			xb.nlmsg_count = 0;
+ 		}
++
++		rtnl_close(&rth2);
+ 	} else {
+ 		if (rtnl_wilddump_request(&rth, preferred_family, XFRM_MSG_GETPOLICY) < 0) {
+ 			perror("Cannot send dump request");
+diff -Nru iproute2-2.6.29-1.orig/ip/xfrm_state.c iproute2-2.6.29-1/ip/xfrm_state.c
+--- iproute2-2.6.29-1.orig/ip/xfrm_state.c	2009-03-24 23:40:54.000000000 +0100
++++ iproute2-2.6.29-1/ip/xfrm_state.c	2009-07-11 09:03:37.000000000 +0200
+@@ -924,11 +924,15 @@
+ 		struct xfrm_buffer xb;
+ 		char buf[NLMSG_DELETEALL_BUF_SIZE];
+ 		int i;
++		struct rtnl_handle rth2;
+ 
+ 		xb.buf = buf;
+ 		xb.size = sizeof(buf);
+ 		xb.rth = &rth;
+ 
++		if (rtnl_open(&rth2, 0) < 0)
++			exit(1);
++
+ 		for (i = 0; ; i++) {
+ 			xb.offset = 0;
+ 			xb.nlmsg_count = 0;
+@@ -951,7 +955,7 @@
+ 				break;
+ 			}
+ 
+-			if (rtnl_send_check(&rth, xb.buf, xb.offset) < 0) {
++			if (rtnl_send_check(&rth2, xb.buf, xb.offset) < 0) {
+ 				perror("Failed to send delete-all request\n");
+ 				exit(1);
+ 			}
+@@ -962,6 +966,7 @@
+ 			xb.nlmsg_count = 0;
+ 		}
+ 
++		rtnl_close(&rth2);
+ 	} else {
+ 		if (rtnl_wilddump_request(&rth, preferred_family, XFRM_MSG_GETSA) < 0) {
+ 			perror("Cannot send dump request");
