summaryrefslogtreecommitdiffstats
path: root/sys/netinet/tcp_subr.c
diff options
context:
space:
mode:
authorlstewart <lstewart@FreeBSD.org>2010-09-25 04:58:46 +0000
committerlstewart <lstewart@FreeBSD.org>2010-09-25 04:58:46 +0000
commit6f2607a695bd1cec08544ece0ef78894b503df3d (patch)
tree70e3af62d726b24b24b2f0b21ecdd3b95125d189 /sys/netinet/tcp_subr.c
parent425d541f16527cddf9ca6973cd34b414cdf174a3 (diff)
downloadFreeBSD-src-6f2607a695bd1cec08544ece0ef78894b503df3d.zip
FreeBSD-src-6f2607a695bd1cec08544ece0ef78894b503df3d.tar.gz
Internalise reassembly queue related functionality and variables which should
not be used outside of the reassembly queue implementation. Provide a new function to flush all segments from a reassembly queue and call it from the appropriate places instead of manipulating the queue directly. Sponsored by: FreeBSD Foundation Reviewed by: andre, gnn, rpaulo MFC after: 2 weeks
Diffstat (limited to 'sys/netinet/tcp_subr.c')
-rw-r--r--sys/netinet/tcp_subr.c19
1 files changed, 2 insertions, 17 deletions
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index d19a91a..dc4395d 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -714,7 +714,6 @@ tcp_drop(struct tcpcb *tp, int errno)
void
tcp_discardcb(struct tcpcb *tp)
{
- struct tseg_qent *q;
struct inpcb *inp = tp->t_inpcb;
struct socket *so = inp->inp_socket;
#ifdef INET6
@@ -801,13 +800,7 @@ tcp_discardcb(struct tcpcb *tp)
}
/* free the reassembly queue, if any */
- while ((q = LIST_FIRST(&tp->t_segq)) != NULL) {
- LIST_REMOVE(q, tqe_q);
- m_freem(q->tqe_m);
- uma_zfree(V_tcp_reass_zone, q);
- tp->t_segqlen--;
- V_tcp_reass_qsize--;
- }
+ tcp_reass_flush(tp);
/* Disconnect offload device, if any. */
tcp_offload_detach(tp);
@@ -865,7 +858,6 @@ tcp_drain(void)
CURVNET_SET(vnet_iter);
struct inpcb *inpb;
struct tcpcb *tcpb;
- struct tseg_qent *te;
/*
* Walk the tcpbs, if existing, and flush the reassembly queue,
@@ -881,14 +873,7 @@ tcp_drain(void)
continue;
INP_WLOCK(inpb);
if ((tcpb = intotcpcb(inpb)) != NULL) {
- while ((te = LIST_FIRST(&tcpb->t_segq))
- != NULL) {
- LIST_REMOVE(te, tqe_q);
- m_freem(te->tqe_m);
- uma_zfree(V_tcp_reass_zone, te);
- tcpb->t_segqlen--;
- V_tcp_reass_qsize--;
- }
+ tcp_reass_flush(tcpb);
tcp_clean_sackreport(tcpb);
}
INP_WUNLOCK(inpb);
OpenPOWER on IntegriCloud