194 lines
6.4 KiB
Diff
194 lines
6.4 KiB
Diff
Index: sys/netinet/tcp_reass.c
|
|
===================================================================
|
|
--- sys/netinet/tcp_reass.c (revision 285923)
|
|
+++ sys/netinet/tcp_reass.c (working copy)
|
|
@@ -79,25 +79,22 @@ static int tcp_reass_sysctl_qsize(SYSCTL_HANDLER_A
|
|
static SYSCTL_NODE(_net_inet_tcp, OID_AUTO, reass, CTLFLAG_RW, 0,
|
|
"TCP Segment Reassembly Queue");
|
|
|
|
-static VNET_DEFINE(int, tcp_reass_maxseg) = 0;
|
|
-#define V_tcp_reass_maxseg VNET(tcp_reass_maxseg)
|
|
-SYSCTL_VNET_INT(_net_inet_tcp_reass, OID_AUTO, maxsegments, CTLFLAG_RDTUN,
|
|
- &VNET_NAME(tcp_reass_maxseg), 0,
|
|
+static int tcp_reass_maxseg = 0;
|
|
+SYSCTL_INT(_net_inet_tcp_reass, OID_AUTO, maxsegments, CTLFLAG_RDTUN,
|
|
+ &tcp_reass_maxseg, 0,
|
|
"Global maximum number of TCP Segments in Reassembly Queue");
|
|
|
|
-SYSCTL_VNET_PROC(_net_inet_tcp_reass, OID_AUTO, cursegments,
|
|
+SYSCTL_PROC(_net_inet_tcp_reass, OID_AUTO, cursegments,
|
|
(CTLTYPE_INT | CTLFLAG_RD), NULL, 0, &tcp_reass_sysctl_qsize, "I",
|
|
"Global number of TCP Segments currently in Reassembly Queue");
|
|
|
|
-static VNET_DEFINE(int, tcp_reass_overflows) = 0;
|
|
-#define V_tcp_reass_overflows VNET(tcp_reass_overflows)
|
|
-SYSCTL_VNET_INT(_net_inet_tcp_reass, OID_AUTO, overflows,
|
|
+static int tcp_reass_overflows = 0;
|
|
+SYSCTL_INT(_net_inet_tcp_reass, OID_AUTO, overflows,
|
|
CTLFLAG_RD,
|
|
- &VNET_NAME(tcp_reass_overflows), 0,
|
|
+ &tcp_reass_overflows, 0,
|
|
"Global number of TCP Segment Reassembly Queue Overflows");
|
|
|
|
-static VNET_DEFINE(uma_zone_t, tcp_reass_zone);
|
|
-#define V_tcp_reass_zone VNET(tcp_reass_zone)
|
|
+static uma_zone_t tcp_reass_zone;
|
|
|
|
/* Initialize TCP reassembly queue */
|
|
static void
|
|
@@ -105,37 +102,28 @@ tcp_reass_zone_change(void *tag)
|
|
{
|
|
|
|
/* Set the zone limit and read back the effective value. */
|
|
- V_tcp_reass_maxseg = nmbclusters / 16;
|
|
- V_tcp_reass_maxseg = uma_zone_set_max(V_tcp_reass_zone,
|
|
- V_tcp_reass_maxseg);
|
|
+ tcp_reass_maxseg = nmbclusters / 16;
|
|
+ tcp_reass_maxseg = uma_zone_set_max(tcp_reass_zone,
|
|
+ tcp_reass_maxseg);
|
|
}
|
|
|
|
void
|
|
-tcp_reass_init(void)
|
|
+tcp_reass_global_init(void)
|
|
{
|
|
|
|
- V_tcp_reass_maxseg = nmbclusters / 16;
|
|
+ tcp_reass_maxseg = nmbclusters / 16;
|
|
TUNABLE_INT_FETCH("net.inet.tcp.reass.maxsegments",
|
|
- &V_tcp_reass_maxseg);
|
|
- V_tcp_reass_zone = uma_zcreate("tcpreass", sizeof (struct tseg_qent),
|
|
+ &tcp_reass_maxseg);
|
|
+ tcp_reass_zone = uma_zcreate("tcpreass", sizeof (struct tseg_qent),
|
|
NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE);
|
|
/* Set the zone limit and read back the effective value. */
|
|
- V_tcp_reass_maxseg = uma_zone_set_max(V_tcp_reass_zone,
|
|
- V_tcp_reass_maxseg);
|
|
+ tcp_reass_maxseg = uma_zone_set_max(tcp_reass_zone,
|
|
+ tcp_reass_maxseg);
|
|
EVENTHANDLER_REGISTER(nmbclusters_change,
|
|
tcp_reass_zone_change, NULL, EVENTHANDLER_PRI_ANY);
|
|
}
|
|
|
|
-#ifdef VIMAGE
|
|
void
|
|
-tcp_reass_destroy(void)
|
|
-{
|
|
-
|
|
- uma_zdestroy(V_tcp_reass_zone);
|
|
-}
|
|
-#endif
|
|
-
|
|
-void
|
|
tcp_reass_flush(struct tcpcb *tp)
|
|
{
|
|
struct tseg_qent *qe;
|
|
@@ -145,7 +133,7 @@ tcp_reass_flush(struct tcpcb *tp)
|
|
while ((qe = LIST_FIRST(&tp->t_segq)) != NULL) {
|
|
LIST_REMOVE(qe, tqe_q);
|
|
m_freem(qe->tqe_m);
|
|
- uma_zfree(V_tcp_reass_zone, qe);
|
|
+ uma_zfree(tcp_reass_zone, qe);
|
|
tp->t_segqlen--;
|
|
}
|
|
|
|
@@ -159,7 +147,7 @@ tcp_reass_sysctl_qsize(SYSCTL_HANDLER_ARGS)
|
|
{
|
|
int qsize;
|
|
|
|
- qsize = uma_zone_get_cur(V_tcp_reass_zone);
|
|
+ qsize = uma_zone_get_cur(tcp_reass_zone);
|
|
return (sysctl_handle_int(oidp, &qsize, 0, req));
|
|
}
|
|
|
|
@@ -207,7 +195,7 @@ tcp_reass(struct tcpcb *tp, struct tcphdr *th, int
|
|
*/
|
|
if ((th->th_seq != tp->rcv_nxt || !TCPS_HAVEESTABLISHED(tp->t_state)) &&
|
|
tp->t_segqlen >= (so->so_rcv.sb_hiwat / tp->t_maxseg) + 1) {
|
|
- V_tcp_reass_overflows++;
|
|
+ tcp_reass_overflows++;
|
|
TCPSTAT_INC(tcps_rcvmemdrop);
|
|
m_freem(m);
|
|
*tlenp = 0;
|
|
@@ -226,7 +214,7 @@ tcp_reass(struct tcpcb *tp, struct tcphdr *th, int
|
|
* Use a temporary structure on the stack for the missing segment
|
|
* when the zone is exhausted. Otherwise we may get stuck.
|
|
*/
|
|
- te = uma_zalloc(V_tcp_reass_zone, M_NOWAIT);
|
|
+ te = uma_zalloc(tcp_reass_zone, M_NOWAIT);
|
|
if (te == NULL) {
|
|
if (th->th_seq != tp->rcv_nxt || !TCPS_HAVEESTABLISHED(tp->t_state)) {
|
|
TCPSTAT_INC(tcps_rcvmemdrop);
|
|
@@ -277,7 +265,7 @@ tcp_reass(struct tcpcb *tp, struct tcphdr *th, int
|
|
TCPSTAT_ADD(tcps_rcvdupbyte, *tlenp);
|
|
m_freem(m);
|
|
if (te != &tqs)
|
|
- uma_zfree(V_tcp_reass_zone, te);
|
|
+ uma_zfree(tcp_reass_zone, te);
|
|
tp->t_segqlen--;
|
|
/*
|
|
* Try to present any queued data
|
|
@@ -314,7 +302,7 @@ tcp_reass(struct tcpcb *tp, struct tcphdr *th, int
|
|
nq = LIST_NEXT(q, tqe_q);
|
|
LIST_REMOVE(q, tqe_q);
|
|
m_freem(q->tqe_m);
|
|
- uma_zfree(V_tcp_reass_zone, q);
|
|
+ uma_zfree(tcp_reass_zone, q);
|
|
tp->t_segqlen--;
|
|
q = nq;
|
|
}
|
|
@@ -353,7 +341,7 @@ present:
|
|
else
|
|
sbappendstream_locked(&so->so_rcv, q->tqe_m);
|
|
if (q != &tqs)
|
|
- uma_zfree(V_tcp_reass_zone, q);
|
|
+ uma_zfree(tcp_reass_zone, q);
|
|
tp->t_segqlen--;
|
|
q = nq;
|
|
} while (q && q->tqe_th->th_seq == tp->rcv_nxt);
|
|
Index: sys/netinet/tcp_subr.c
|
|
===================================================================
|
|
--- sys/netinet/tcp_subr.c (revision 285923)
|
|
+++ sys/netinet/tcp_subr.c (working copy)
|
|
@@ -376,7 +376,6 @@ tcp_init(void)
|
|
tcp_tw_init();
|
|
syncache_init();
|
|
tcp_hc_init();
|
|
- tcp_reass_init();
|
|
|
|
TUNABLE_INT_FETCH("net.inet.tcp.sack.enable", &V_tcp_do_sack);
|
|
V_sack_hole_zone = uma_zcreate("sackhole", sizeof(struct sackhole),
|
|
@@ -386,6 +385,8 @@ tcp_init(void)
|
|
if (!IS_DEFAULT_VNET(curvnet))
|
|
return;
|
|
|
|
+ tcp_reass_global_init();
|
|
+
|
|
/* XXX virtualize those bellow? */
|
|
tcp_delacktime = TCPTV_DELACK;
|
|
tcp_keepinit = TCPTV_KEEP_INIT;
|
|
@@ -433,7 +434,6 @@ void
|
|
tcp_destroy(void)
|
|
{
|
|
|
|
- tcp_reass_destroy();
|
|
tcp_hc_destroy();
|
|
syncache_destroy();
|
|
tcp_tw_destroy();
|
|
Index: sys/netinet/tcp_var.h
|
|
===================================================================
|
|
--- sys/netinet/tcp_var.h (revision 285923)
|
|
+++ sys/netinet/tcp_var.h (working copy)
|
|
@@ -679,11 +679,8 @@ char *tcp_log_addrs(struct in_conninfo *, struct t
|
|
char *tcp_log_vain(struct in_conninfo *, struct tcphdr *, void *,
|
|
const void *);
|
|
int tcp_reass(struct tcpcb *, struct tcphdr *, int *, struct mbuf *);
|
|
-void tcp_reass_init(void);
|
|
+void tcp_reass_global_init(void);
|
|
void tcp_reass_flush(struct tcpcb *);
|
|
-#ifdef VIMAGE
|
|
-void tcp_reass_destroy(void);
|
|
-#endif
|
|
void tcp_input(struct mbuf *, int);
|
|
u_long tcp_maxmtu(struct in_conninfo *, struct tcp_ifcap *);
|
|
u_long tcp_maxmtu6(struct in_conninfo *, struct tcp_ifcap *);
|