Date: Wed, 12 Jul 2000 15:19:25 -0700 From: jayanth <jayanth@yahoo-inc.com> To: net@FreeBSD.ORG Subject: diffs for deleting routing clones Message-ID: <20000712151925.A22978@yahoo-inc.com>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
This is a hack for freeing up some memory from the routing table.
It happens only when a connection is dropped due to listen q overflow
and the associated route has no data cached in it.
Any feedback would be helpful.
jayanth
[-- Attachment #2 --]
Index: route.h
===================================================================
RCS file: /home/ncvs/src/sys/net/route.h,v
retrieving revision 1.36
diff -u -p -u -r1.36 route.h
--- route.h 2000/02/13 03:31:56 1.36
+++ route.h 2000/07/11 21:19:40
@@ -139,7 +139,7 @@ struct ortentry {
#define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */
#define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */
#define RTF_DONE 0x40 /* message confirmed */
-/* 0x80 unused */
+#define RTF_DELCLONE 0x80 /* delete cloned route */
#define RTF_CLONING 0x100 /* generate new routes on use */
#define RTF_XRESOLVE 0x200 /* external daemon resolves name */
#define RTF_LLINFO 0x400 /* generated by link layer (e.g. ARP) */
Index: in_pcb.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/in_pcb.c,v
retrieving revision 1.66
diff -u -p -r1.66 in_pcb.c
--- in_pcb.c 2000/07/04 16:35:05 1.66
+++ in_pcb.c 2000/07/12 22:07:41
@@ -531,6 +531,7 @@ in_pcbdetach(inp)
{
struct socket *so = inp->inp_socket;
struct inpcbinfo *ipi = inp->inp_pcbinfo;
+ struct rt_entry *rt = = inp->inp_route.ro_rt;
#ifdef IPSEC
ipsec4_delete_pcbpolicy(inp);
@@ -541,8 +542,25 @@ in_pcbdetach(inp)
sofree(so);
if (inp->inp_options)
(void)m_free(inp->inp_options);
- if (inp->inp_route.ro_rt)
- rtfree(inp->inp_route.ro_rt);
+ if (rt){
+ /* route delete requires reference count to be <= zero */
+ if((rt->rt_flags & RTF_DELCLONE) &&
+ (rt->rt_flags & RTF_WASCLONED)){
+ if(--rt->rt_refcnt <= 0){
+ rt->rt_flags &= ~RTF_UP;
+ rtrequest(RTM_DELETE, rt_key(rt),
+ rt->rt_gateway, rt_mask(rt),
+ rt->rt_flags, (struct rtentry **)0);
+ }
+ else
+ /* more than one reference, bump it up
+ * again.
+ */
+ rt->rt_refcnt++;
+ }
+ else
+ rtfree(rt);
+ }
ip_freemoptions(inp->inp_moptions);
inp->inp_vflag = 0;
zfreei(ipi->ipi_zone, inp);
Index: tcp_input.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/tcp_input.c,v
retrieving revision 1.117
diff -u -p -r1.117 tcp_input.c
--- tcp_input.c 2000/07/09 13:01:59 1.117
+++ tcp_input.c 2000/07/12 22:07:41
@@ -121,6 +121,10 @@ SYSCTL_INT(_net_inet_tcp, OID_AUTO, dela
&tcp_delack_enabled, 0,
"Delay ACK to try and piggyback it onto a data packet");
+int tcp_lq_overflow = 0;
+SYSCTL_INT(_net_inet_tcp, OID_AUTO, tcp_lq_overflow, CTLFLAG_RW,
+ &tcp_lq_overflow, 0,
+ "Listen Queue Overflow");
#ifdef TCP_DROP_SYNFIN
static int drop_synfin = 0;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, drop_synfin, CTLFLAG_RW,
@@ -710,6 +714,9 @@ findpcb:
tcpstat.tcps_listendrop++;
so2 = sodropablereq(so);
if (so2) {
+ if(tcp_lq_overflow)
+ sototcpcb(so2)->t_flags |=
+ TF_LQ_OVERFLOW;
tcp_drop(sototcpcb(so2), ETIMEDOUT);
so2 = sonewconn(so, 0);
}
Index: tcp_subr.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/tcp_subr.c,v
retrieving revision 1.78
diff -u -p -r1.78 tcp_subr.c
--- tcp_subr.c 2000/07/04 16:35:05 1.78
+++ tcp_subr.c 2000/07/12 22:07:41
@@ -680,6 +680,17 @@ tcp_close(tp)
tcpstat.tcps_cachedssthresh++;
}
}
+ rt = inp->inp_route.ro_rt;
+ if(rt){
+ /* mark route for delete if no information is
+ * cached
+ */
+ if ((tp->t_flags & TF_LQ_OVERFLOW) &&
+ ((rt->rt_rmx.rmx_locks & RTV_RTT) == 0)){
+ if(rt->rt_rmx.rmx_rtt == 0)
+ rt->rt_flags |= RTF_DELCLONE;
+ }
+ }
no_valid_rt:
/* free the reassembly queue, if any */
while((q = LIST_FIRST(&tp->t_segq)) != NULL) {
Index: tcp_var.h
===================================================================
RCS file: /home/ncvs/src/sys/netinet/tcp_var.h,v
retrieving revision 1.59
diff -u -p -r1.59 tcp_var.h
--- tcp_var.h 2000/05/26 02:05:47 1.59
+++ tcp_var.h 2000/07/12 22:07:41
@@ -94,6 +94,7 @@ struct tcpcb {
#define TF_RCVD_CC 0x04000 /* a CC was received in SYN */
#define TF_SENDCCNEW 0x08000 /* send CCnew instead of CC in SYN */
#define TF_MORETOCOME 0x10000 /* More data to be appended to sock */
+#define TF_LQ_OVERFLOW 0x20000 /* listen queue overflow */
int t_force; /* 1 if forcing out a byte */
tcp_seq snd_una; /* send unacknowledged */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000712151925.A22978>
