summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/inet/ip/ipclassifier.c9
-rw-r--r--usr/src/uts/common/inet/tcp.h28
-rw-r--r--usr/src/uts/common/inet/tcp/tcp.c64
-rw-r--r--usr/src/uts/common/inet/tcp/tcp_fusion.c7
-rw-r--r--usr/src/uts/common/inet/tcp/tcp_input.c61
-rw-r--r--usr/src/uts/common/inet/tcp/tcp_opt_data.c8
-rw-r--r--usr/src/uts/common/inet/tcp/tcp_output.c12
-rw-r--r--usr/src/uts/common/inet/tcp/tcp_sack.c36
-rw-r--r--usr/src/uts/common/inet/tcp/tcp_time_wait.c74
-rw-r--r--usr/src/uts/common/inet/tcp/tcp_timers.c22
-rw-r--r--usr/src/uts/common/inet/tcp_impl.h12
-rw-r--r--usr/src/uts/common/inet/tcp_sack.h35
-rw-r--r--usr/src/uts/intel/ip/ip.global-objs.debug645
-rw-r--r--usr/src/uts/intel/ip/ip.global-objs.obj645
-rw-r--r--usr/src/uts/sparc/ip/ip.global-objs.debug645
-rw-r--r--usr/src/uts/sparc/ip/ip.global-objs.obj645
16 files changed, 170 insertions, 218 deletions
diff --git a/usr/src/uts/common/inet/ip/ipclassifier.c b/usr/src/uts/common/inet/ip/ipclassifier.c
index bd37503d0b..f2ca88e5a1 100644
--- a/usr/src/uts/common/inet/ip/ipclassifier.c
+++ b/usr/src/uts/common/inet/ip/ipclassifier.c
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
@@ -685,12 +684,6 @@ ipcl_conn_destroy(conn_t *connp)
tcp->tcp_tcps = NULL;
- if (tcp->tcp_sack_info != NULL) {
- bzero(tcp->tcp_sack_info, sizeof (tcp_sack_info_t));
- kmem_cache_free(tcp_sack_info_cache,
- tcp->tcp_sack_info);
- }
-
/*
* tcp_rsrv_mp can be NULL if tcp_get_conn() fails to allocate
* the mblk.
diff --git a/usr/src/uts/common/inet/tcp.h b/usr/src/uts/common/inet/tcp.h
index ce15f101ba..befce69047 100644
--- a/usr/src/uts/common/inet/tcp.h
+++ b/usr/src/uts/common/inet/tcp.h
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/* Copyright (c) 1990 Mentat Inc. */
@@ -146,7 +145,7 @@ typedef struct tcp_s {
/* Pointer to next T/W block */
struct tcp_s *tcp_time_wait_prev;
/* Pointer to previous T/W next */
- clock_t tcp_time_wait_expire;
+ int64_t tcp_time_wait_expire;
struct conn_s *tcp_connp; /* back pointer to conn_t */
tcp_stack_t *tcp_tcps; /* back pointer to tcp_stack_t */
@@ -257,17 +256,18 @@ typedef struct tcp_s {
mblk_t *tcp_reass_head; /* Out of order reassembly list head */
mblk_t *tcp_reass_tail; /* Out of order reassembly list tail */
- tcp_sack_info_t *tcp_sack_info;
-
-#define tcp_pipe tcp_sack_info->tcp_pipe
-#define tcp_fack tcp_sack_info->tcp_fack
-#define tcp_sack_snxt tcp_sack_info->tcp_sack_snxt
-#define tcp_max_sack_blk tcp_sack_info->tcp_max_sack_blk
-#define tcp_num_sack_blk tcp_sack_info->tcp_num_sack_blk
-#define tcp_sack_list tcp_sack_info->tcp_sack_list
-#define tcp_num_notsack_blk tcp_sack_info->tcp_num_notsack_blk
-#define tcp_cnt_notsack_list tcp_sack_info->tcp_cnt_notsack_list
-#define tcp_notsack_list tcp_sack_info->tcp_notsack_list
+ /* SACK related info */
+ tcp_sack_info_t tcp_sack_info;
+
+#define tcp_pipe tcp_sack_info.tcp_pipe
+#define tcp_fack tcp_sack_info.tcp_fack
+#define tcp_sack_snxt tcp_sack_info.tcp_sack_snxt
+#define tcp_max_sack_blk tcp_sack_info.tcp_max_sack_blk
+#define tcp_num_sack_blk tcp_sack_info.tcp_num_sack_blk
+#define tcp_sack_list tcp_sack_info.tcp_sack_list
+#define tcp_num_notsack_blk tcp_sack_info.tcp_num_notsack_blk
+#define tcp_cnt_notsack_list tcp_sack_info.tcp_cnt_notsack_list
+#define tcp_notsack_list tcp_sack_info.tcp_notsack_list
mblk_t *tcp_rcv_list; /* Queued until push, urgent data, */
mblk_t *tcp_rcv_last_head; /* optdata, or the count exceeds */
diff --git a/usr/src/uts/common/inet/tcp/tcp.c b/usr/src/uts/common/inet/tcp/tcp.c
index 2cc0377fd4..f0a86e257c 100644
--- a/usr/src/uts/common/inet/tcp/tcp.c
+++ b/usr/src/uts/common/inet/tcp/tcp.c
@@ -20,8 +20,7 @@
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/* Copyright (c) 1990 Mentat Inc. */
@@ -226,8 +225,6 @@
int tcp_squeue_wput = 2; /* /etc/systems */
int tcp_squeue_flag;
-kmem_cache_t *tcp_sack_info_cache;
-
/*
* To prevent memory hog, limit the number of entries in tcp_free_list
* to 1% of available memory / number of cpus
@@ -502,7 +499,6 @@ void
tcp_cleanup(tcp_t *tcp)
{
mblk_t *mp;
- tcp_sack_info_t *tcp_sack_info;
conn_t *connp = tcp->tcp_connp;
tcp_stack_t *tcps = tcp->tcp_tcps;
netstack_t *ns = tcps->tcps_netstack;
@@ -557,7 +553,6 @@ tcp_cleanup(tcp_t *tcp)
/* Save some state */
mp = tcp->tcp_timercache;
- tcp_sack_info = tcp->tcp_sack_info;
tcp_rsrv_mp = tcp->tcp_rsrv_mp;
if (connp->conn_cred != NULL) {
@@ -583,7 +578,6 @@ tcp_cleanup(tcp_t *tcp)
/* restore the state */
tcp->tcp_timercache = mp;
- tcp->tcp_sack_info = tcp_sack_info;
tcp->tcp_rsrv_mp = tcp_rsrv_mp;
tcp->tcp_connp = connp;
@@ -1376,13 +1370,8 @@ tcp_free(tcp_t *tcp)
tcp->tcp_ordrel_mp = NULL;
}
- if (tcp->tcp_sack_info != NULL) {
- if (tcp->tcp_notsack_list != NULL) {
- TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list,
- tcp);
- }
- bzero(tcp->tcp_sack_info, sizeof (tcp_sack_info_t));
- }
+ TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp);
+ bzero(&tcp->tcp_sack_info, sizeof (tcp_sack_info_t));
if (tcp->tcp_hopopts != NULL) {
mi_free(tcp->tcp_hopopts);
@@ -2133,14 +2122,8 @@ tcp_reinit_values(tcp)
tcp->tcp_ecn_echo_on = B_FALSE;
tcp->tcp_is_wnd_shrnk = B_FALSE;
- if (tcp->tcp_sack_info != NULL) {
- if (tcp->tcp_notsack_list != NULL) {
- TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list,
- tcp);
- }
- kmem_cache_free(tcp_sack_info_cache, tcp->tcp_sack_info);
- tcp->tcp_sack_info = NULL;
- }
+ TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp);
+ bzero(&tcp->tcp_sack_info, sizeof (tcp_sack_info_t));
tcp->tcp_rcv_ws = 0;
tcp->tcp_snd_ws = 0;
@@ -3338,7 +3321,7 @@ tcp_accept_finish(void *arg, mblk_t *mp, void *arg2, ip_recv_attr_t *dummy)
if (connp->conn_keepalive) {
tcp->tcp_ka_last_intrvl = 0;
tcp->tcp_ka_tid = TCP_TIMER(tcp, tcp_keepalive_timer,
- MSEC_TO_TICK(tcp->tcp_ka_interval));
+ tcp->tcp_ka_interval);
}
/*
@@ -4008,14 +3991,6 @@ tcp_iss_key_init(uint8_t *phrase, int len, tcp_stack_t *tcps)
mutex_exit(&tcps->tcps_iss_key_lock);
}
-/* ARGSUSED */
-static int
-tcp_sack_info_constructor(void *buf, void *cdrarg, int kmflags)
-{
- bzero(buf, sizeof (tcp_sack_info_t));
- return (0);
-}
-
/*
* Called by IP when IP is loaded into the kernel
*/
@@ -4026,9 +4001,8 @@ tcp_ddi_g_init(void)
sizeof (tcp_timer_t) + sizeof (mblk_t), 0,
NULL, NULL, NULL, NULL, NULL, 0);
- tcp_sack_info_cache = kmem_cache_create("tcp_sack_info_cache",
- sizeof (tcp_sack_info_t), 0,
- tcp_sack_info_constructor, NULL, NULL, NULL, NULL, 0);
+ tcp_notsack_blk_cache = kmem_cache_create("tcp_notsack_blk_cache",
+ sizeof (notsack_blk_t), 0, NULL, NULL, NULL, NULL, NULL, 0);
mutex_init(&tcp_random_lock, NULL, MUTEX_DEFAULT, NULL);
@@ -4184,7 +4158,7 @@ tcp_ddi_g_destroy(void)
mutex_destroy(&tcp_random_lock);
kmem_cache_destroy(tcp_timercache);
- kmem_cache_destroy(tcp_sack_info_cache);
+ kmem_cache_destroy(tcp_notsack_blk_cache);
netstack_unregister(NS_TCP);
}
@@ -4363,11 +4337,6 @@ tcp_squeue_add(squeue_t *sqp)
sizeof (tcp_squeue_priv_t), KM_SLEEP);
*squeue_getprivate(sqp, SQPRIVATE_TCP) = (intptr_t)tcp_time_wait;
- /* Kick start the periodic TIME WAIT collector. */
- tcp_time_wait->tcp_time_wait_tid =
- timeout_generic(CALLOUT_NORMAL, tcp_time_wait_collector, sqp,
- (hrtime_t)10 * NANOSEC, CALLOUT_TCP_RESOLUTION,
- CALLOUT_FLAG_ROUNDUP);
if (tcp_free_list_max_cnt == 0) {
int tcp_ncpus = ((boot_max_ncpus == -1) ?
max_ncpus : boot_max_ncpus);
@@ -4584,16 +4553,13 @@ tcp_do_connect(conn_t *connp, const struct sockaddr *sa, socklen_t len,
}
/*
- * tcp_snd_sack_ok can be set in
- * tcp_set_destination() if the sack metric
- * is set. So check it here also.
+ * Note that tcp_snd_sack_ok can be set in tcp_set_destination() if
+ * the SACK metric is set. So here we just check the per stack SACK
+ * permitted param.
*/
- if (tcps->tcps_sack_permitted == 2 ||
- tcp->tcp_snd_sack_ok) {
- if (tcp->tcp_sack_info == NULL) {
- tcp->tcp_sack_info = kmem_cache_alloc(
- tcp_sack_info_cache, KM_SLEEP);
- }
+ if (tcps->tcps_sack_permitted == 2) {
+ ASSERT(tcp->tcp_num_sack_blk == 0);
+ ASSERT(tcp->tcp_notsack_list == NULL);
tcp->tcp_snd_sack_ok = B_TRUE;
}
diff --git a/usr/src/uts/common/inet/tcp/tcp_fusion.c b/usr/src/uts/common/inet/tcp/tcp_fusion.c
index f5bd5031ea..aad533de2b 100644
--- a/usr/src/uts/common/inet/tcp/tcp_fusion.c
+++ b/usr/src/uts/common/inet/tcp/tcp_fusion.c
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <sys/types.h>
@@ -733,9 +732,7 @@ tcp_fuse_rcv_drain(queue_t *q, tcp_t *tcp, mblk_t **sigurg_mpp)
(mp = allocb_tryhard(1)) == NULL) {
/* Alloc failed; try again next time */
tcp->tcp_push_tid = TCP_TIMER(tcp,
- tcp_push_timer,
- MSEC_TO_TICK(
- tcps->tcps_push_timer_interval));
+ tcp_push_timer, tcps->tcps_push_timer_interval);
return (B_TRUE);
} else if (sigurg_mpp != NULL) {
/*
diff --git a/usr/src/uts/common/inet/tcp/tcp_input.c b/usr/src/uts/common/inet/tcp/tcp_input.c
index 0741a8292f..2346431e3c 100644
--- a/usr/src/uts/common/inet/tcp/tcp_input.c
+++ b/usr/src/uts/common/inet/tcp/tcp_input.c
@@ -20,8 +20,7 @@
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
/* This file contains all TCP input processing functions. */
@@ -300,7 +299,6 @@ tcp_parse_options(tcpha_t *tcpha, tcp_opt_t *tcpopt)
* If the list is empty, allocate one and assume
* nothing is sack'ed.
*/
- ASSERT(tcp->tcp_sack_info != NULL);
if (tcp->tcp_notsack_list == NULL) {
tcp_notsack_update(&(tcp->tcp_notsack_list),
tcp->tcp_suna, tcp->tcp_snxt,
@@ -477,23 +475,16 @@ tcp_process_options(tcp_t *tcp, tcpha_t *tcpha)
if ((options & TCP_OPT_SACK_OK_PRESENT) &&
(tcp->tcp_snd_sack_ok ||
(tcps->tcps_sack_permitted != 0 && TCP_IS_DETACHED(tcp)))) {
- /* This should be true only in the passive case. */
- if (tcp->tcp_sack_info == NULL) {
- ASSERT(TCP_IS_DETACHED(tcp));
- tcp->tcp_sack_info =
- kmem_cache_alloc(tcp_sack_info_cache, KM_NOSLEEP);
- }
- if (tcp->tcp_sack_info == NULL) {
- tcp->tcp_snd_sack_ok = B_FALSE;
+ ASSERT(tcp->tcp_num_sack_blk == 0);
+ ASSERT(tcp->tcp_notsack_list == NULL);
+
+ tcp->tcp_snd_sack_ok = B_TRUE;
+ if (tcp->tcp_snd_ts_ok) {
+ tcp->tcp_max_sack_blk = 3;
} else {
- tcp->tcp_snd_sack_ok = B_TRUE;
- if (tcp->tcp_snd_ts_ok) {
- tcp->tcp_max_sack_blk = 3;
- } else {
- tcp->tcp_max_sack_blk = 4;
- }
+ tcp->tcp_max_sack_blk = 4;
}
- } else {
+ } else if (tcp->tcp_snd_sack_ok) {
/*
* Resetting tcp_snd_sack_ok to B_FALSE so that
* no SACK info will be used for this
@@ -501,12 +492,8 @@ tcp_process_options(tcp_t *tcp, tcpha_t *tcpha)
* permission is negotiated. This may need
* to be changed once this is clarified.
*/
- if (tcp->tcp_sack_info != NULL) {
- ASSERT(tcp->tcp_notsack_list == NULL);
- kmem_cache_free(tcp_sack_info_cache,
- tcp->tcp_sack_info);
- tcp->tcp_sack_info = NULL;
- }
+ ASSERT(tcp->tcp_num_sack_blk == 0);
+ ASSERT(tcp->tcp_notsack_list == NULL);
tcp->tcp_snd_sack_ok = B_FALSE;
}
@@ -761,10 +748,8 @@ tcp_paws_check(tcp_t *tcp, tcpha_t *tcpha, tcp_opt_t *tcpoptp)
* transfer rate built up so far.
*/
tcp_mss_set(tcp, tcp->tcp_mss + TCPOPT_REAL_TS_LEN);
- if (tcp->tcp_snd_sack_ok) {
- ASSERT(tcp->tcp_sack_info != NULL);
+ if (tcp->tcp_snd_sack_ok)
tcp->tcp_max_sack_blk = 4;
- }
}
return (B_TRUE);
}
@@ -2823,7 +2808,6 @@ tcp_input_data(void *arg, mblk_t *mp, void *arg2, ip_recv_attr_t *ira)
goto ack_check;
}
} else if (tcp->tcp_snd_sack_ok) {
- ASSERT(tcp->tcp_sack_info != NULL);
tcpopt.tcp = tcp;
/*
* SACK info in already updated in tcp_parse_options. Ignore
@@ -3151,7 +3135,6 @@ ok:;
if (seg_len > 0) {
/* Fill in the SACK blk list. */
if (tcp->tcp_snd_sack_ok) {
- ASSERT(tcp->tcp_sack_info != NULL);
tcp_sack_insert(tcp->tcp_sack_list,
seg_seq, seg_seq + seg_len,
&(tcp->tcp_num_sack_blk));
@@ -3191,8 +3174,7 @@ ok:;
if (tcp->tcp_reass_head != NULL) {
tcp->tcp_reass_tid = TCP_TIMER(
tcp, tcp_reass_timer,
- MSEC_TO_TICK(
- tcps->tcps_reass_timeout));
+ tcps->tcps_reass_timeout);
} else {
tcp->tcp_reass_tid = 0;
}
@@ -3214,8 +3196,8 @@ ok:;
if (tcps->tcps_reass_timeout != 0 &&
tcp->tcp_reass_tid == 0) {
tcp->tcp_reass_tid = TCP_TIMER(tcp,
- tcp_reass_timer, MSEC_TO_TICK(
- tcps->tcps_reass_timeout));
+ tcp_reass_timer,
+ tcps->tcps_reass_timeout);
}
}
}
@@ -3870,7 +3852,6 @@ process_ack:
* Congestion Control" in SIGCOMM '96.
*/
if (tcp->tcp_snd_sack_ok) {
- ASSERT(tcp->tcp_sack_info != NULL);
if (tcp->tcp_notsack_list != NULL) {
tcp->tcp_pipe = tcp->tcp_snxt -
tcp->tcp_fack;
@@ -4062,8 +4043,7 @@ process_ack:
* Remove all notsack info to avoid confusion with
* the next fast retrasnmit/recovery phase.
*/
- if (tcp->tcp_snd_sack_ok &&
- tcp->tcp_notsack_list != NULL) {
+ if (tcp->tcp_snd_sack_ok) {
TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list,
tcp);
}
@@ -4679,8 +4659,7 @@ update_ack:
if (!TCP_IS_DETACHED(tcp))
tcp->tcp_push_tid = TCP_TIMER(tcp,
tcp_push_timer,
- MSEC_TO_TICK(
- tcps->tcps_push_timer_interval));
+ tcps->tcps_push_timer_interval);
}
}
@@ -4803,9 +4782,9 @@ ack_check:
*/
if (tcp->tcp_ack_tid == 0) {
tcp->tcp_ack_tid = TCP_TIMER(tcp, tcp_ack_timer,
- MSEC_TO_TICK(tcp->tcp_localnet ?
- (clock_t)tcps->tcps_local_dack_interval :
- (clock_t)tcps->tcps_deferred_ack_interval));
+ tcp->tcp_localnet ?
+ tcps->tcps_local_dack_interval :
+ tcps->tcps_deferred_ack_interval);
}
}
if (flags & TH_ORDREL_NEEDED) {
diff --git a/usr/src/uts/common/inet/tcp/tcp_opt_data.c b/usr/src/uts/common/inet/tcp/tcp_opt_data.c
index b85cf30ff4..0f46bf4a08 100644
--- a/usr/src/uts/common/inet/tcp/tcp_opt_data.c
+++ b/usr/src/uts/common/inet/tcp/tcp_opt_data.c
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <sys/types.h>
@@ -548,8 +547,7 @@ tcp_opt_set(conn_t *connp, uint_t optset_context, int level, int name,
/* Crank up the keepalive timer */
tcp->tcp_ka_last_intrvl = 0;
tcp->tcp_ka_tid = TCP_TIMER(tcp,
- tcp_keepalive_timer,
- MSEC_TO_TICK(tcp->tcp_ka_interval));
+ tcp_keepalive_timer, tcp->tcp_ka_interval);
connp->conn_keepalive = 1;
}
break;
@@ -689,7 +687,7 @@ tcp_opt_set(conn_t *connp, uint_t optset_context, int level, int name,
tcp->tcp_ka_last_intrvl = 0;
tcp->tcp_ka_tid = TCP_TIMER(tcp,
tcp_keepalive_timer,
- MSEC_TO_TICK(tcp->tcp_ka_interval));
+ tcp->tcp_ka_interval);
}
}
break;
diff --git a/usr/src/uts/common/inet/tcp/tcp_output.c b/usr/src/uts/common/inet/tcp/tcp_output.c
index 2a02d214f5..aee8d71a90 100644
--- a/usr/src/uts/common/inet/tcp/tcp_output.c
+++ b/usr/src/uts/common/inet/tcp/tcp_output.c
@@ -20,8 +20,7 @@
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
/* This file contains all TCP output processing functions. */
@@ -1546,9 +1545,10 @@ tcp_close_output(void *arg, mblk_t *mp, void *arg2, ip_recv_attr_t *dummy)
ASSERT(tcp->tcp_linger_tid == 0);
+ /* conn_lingertime is in sec. */
tcp->tcp_linger_tid = TCP_TIMER(tcp,
tcp_close_linger_timeout,
- connp->conn_lingertime * hz);
+ connp->conn_lingertime * MILLISEC);
/* tcp_close_linger_timeout will finish close */
if (tcp->tcp_linger_tid == 0)
@@ -3171,7 +3171,6 @@ tcp_sack_rexmit(tcp_t *tcp, uint_t *flags)
mblk_t *xmit_mp;
tcp_stack_t *tcps = tcp->tcp_tcps;
- ASSERT(tcp->tcp_sack_info != NULL);
ASSERT(tcp->tcp_notsack_list != NULL);
ASSERT(tcp->tcp_rexmit == B_FALSE);
@@ -3485,10 +3484,7 @@ tcp_process_shrunk_swnd(tcp_t *tcp, uint32_t shrunk_count)
* If the SACK option is set, delete the entire list of
* notsack'ed blocks.
*/
- if (tcp->tcp_sack_info != NULL) {
- if (tcp->tcp_notsack_list != NULL)
- TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp);
- }
+ TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp);
if (tcp->tcp_suna == tcp->tcp_snxt && tcp->tcp_swnd == 0)
/*
diff --git a/usr/src/uts/common/inet/tcp/tcp_sack.c b/usr/src/uts/common/inet/tcp/tcp_sack.c
index f3e9f81859..c4f7822e85 100644
--- a/usr/src/uts/common/inet/tcp/tcp_sack.c
+++ b/usr/src/uts/common/inet/tcp/tcp_sack.c
@@ -2,9 +2,8 @@
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License"). You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
@@ -20,12 +19,9 @@
* CDDL HEADER END
*/
/*
- * Copyright 1997-2001, 2003 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <sys/types.h>
#include <sys/kmem.h>
#include <sys/debug.h>
@@ -38,6 +34,9 @@
#include <inet/ip.h>
#include <inet/tcp.h>
+/* kmem cache for notsack_blk_t */
+kmem_cache_t *tcp_notsack_blk_cache;
+
/*
* To insert a new blk to the array of SACK blk in receiver.
*
@@ -239,7 +238,7 @@ tcp_notsack_insert(notsack_blk_t **head, tcp_seq begin, tcp_seq end,
}
(*num)--;
*sum -= tmp->end - tmp->begin;
- kmem_free(tmp, sizeof (notsack_blk_t));
+ kmem_cache_free(tcp_notsack_blk_cache, tmp);
return;
}
/* This blk is partially covered. */
@@ -254,8 +253,9 @@ tcp_notsack_insert(notsack_blk_t **head, tcp_seq begin, tcp_seq end,
(tmp->sack_cnt)++;
} else {
/* Split the notsack blk. */
- if ((new = kmem_alloc(sizeof (notsack_blk_t),
- KM_NOSLEEP)) == NULL) {
+ if ((new = kmem_cache_alloc(
+ tcp_notsack_blk_cache, KM_NOSLEEP)) ==
+ NULL) {
return;
}
new->end = tmp->end;
@@ -297,11 +297,13 @@ tcp_notsack_insert(notsack_blk_t **head, tcp_seq begin, tcp_seq end,
tmp_sum -= tmp->end - tmp->begin;
if (prev != NULL) {
prev->next = tmp->next;
- kmem_free(tmp, sizeof (notsack_blk_t));
+ kmem_cache_free(tcp_notsack_blk_cache,
+ tmp);
tmp = prev->next;
} else {
*head = tmp->next;
- kmem_free(tmp, sizeof (notsack_blk_t));
+ kmem_cache_free(tcp_notsack_blk_cache,
+ tmp);
tmp = *head;
}
} else {
@@ -355,11 +357,11 @@ tcp_notsack_remove(notsack_blk_t **head, tcp_seq end, int32_t *num,
tmp_sum -= tmp->end - tmp->begin;
if (prev == NULL) {
*head = tmp->next;
- kmem_free(tmp, sizeof (notsack_blk_t));
+ kmem_cache_free(tcp_notsack_blk_cache, tmp);
tmp = *head;
} else {
prev->next = tmp->next;
- kmem_free(tmp, sizeof (notsack_blk_t));
+ kmem_cache_free(tcp_notsack_blk_cache, tmp);
tmp = prev->next;
}
} else {
@@ -394,8 +396,8 @@ void tcp_notsack_update(notsack_blk_t **head, tcp_seq begin, tcp_seq end,
tmp = *head;
/* If the list is empty, create a new one. */
if (tmp == NULL) {
- if ((tmp = kmem_alloc(sizeof (notsack_blk_t), KM_NOSLEEP)) ==
- NULL) {
+ if ((tmp = kmem_cache_alloc(tcp_notsack_blk_cache,
+ KM_NOSLEEP)) == NULL) {
return;
}
tmp->begin = begin;
@@ -423,7 +425,7 @@ void tcp_notsack_update(notsack_blk_t **head, tcp_seq begin, tcp_seq end,
tmp->end = end;
} else {
/* No. Need to create a new notsack blk. */
- tmp->next = kmem_alloc(sizeof (notsack_blk_t), KM_NOSLEEP);
+ tmp->next = kmem_cache_alloc(tcp_notsack_blk_cache, KM_NOSLEEP);
if (tmp->next != NULL) {
tmp = tmp->next;
tmp->begin = begin;
diff --git a/usr/src/uts/common/inet/tcp/tcp_time_wait.c b/usr/src/uts/common/inet/tcp/tcp_time_wait.c
index be241bd6cf..4cfe13bb30 100644
--- a/usr/src/uts/common/inet/tcp/tcp_time_wait.c
+++ b/usr/src/uts/common/inet/tcp/tcp_time_wait.c
@@ -20,8 +20,7 @@
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
@@ -119,9 +118,9 @@ void
tcp_time_wait_append(tcp_t *tcp)
{
tcp_stack_t *tcps = tcp->tcp_tcps;
+ squeue_t *sqp = tcp->tcp_connp->conn_sqp;
tcp_squeue_priv_t *tcp_time_wait =
- *((tcp_squeue_priv_t **)squeue_getprivate(tcp->tcp_connp->conn_sqp,
- SQPRIVATE_TCP));
+ *((tcp_squeue_priv_t **)squeue_getprivate(sqp, SQPRIVATE_TCP));
tcp_timers_stop(tcp);
@@ -134,23 +133,17 @@ tcp_time_wait_append(tcp_t *tcp)
ASSERT(tcp->tcp_flow_stopped == 0);
ASSERT(tcp->tcp_time_wait_next == NULL);
ASSERT(tcp->tcp_time_wait_prev == NULL);
- ASSERT(tcp->tcp_time_wait_expire == NULL);
+ ASSERT(tcp->tcp_time_wait_expire == 0);
ASSERT(tcp->tcp_listener == NULL);
- tcp->tcp_time_wait_expire = ddi_get_lbolt();
+ tcp->tcp_time_wait_expire = ddi_get_lbolt64();
/*
- * The value computed below in tcp->tcp_time_wait_expire may
- * appear negative or wrap around. That is ok since our
- * interest is only in the difference between the current lbolt
- * value and tcp->tcp_time_wait_expire. But the value should not
- * be zero, since it means the tcp is not in the TIME_WAIT list.
- * The corresponding comparison in tcp_time_wait_collector() uses
- * modular arithmetic.
+ * Since tcp_time_wait_expire is lbolt64, it should not wrap around
+ * in practice. Hence it cannot be 0. Note that zero means that the
+ * tcp_t is not in the TIME_WAIT list.
*/
tcp->tcp_time_wait_expire += MSEC_TO_TICK(
tcps->tcps_time_wait_interval);
- if (tcp->tcp_time_wait_expire == 0)
- tcp->tcp_time_wait_expire = 1;
ASSERT(TCP_IS_DETACHED(tcp));
ASSERT(tcp->tcp_state == TCPS_TIME_WAIT);
@@ -162,12 +155,30 @@ tcp_time_wait_append(tcp_t *tcp)
if (tcp_time_wait->tcp_time_wait_head == NULL) {
ASSERT(tcp_time_wait->tcp_time_wait_tail == NULL);
tcp_time_wait->tcp_time_wait_head = tcp;
+
+ /*
+ * Even if the list was empty before, there may be a timer
+ * running since a tcp_t can be removed from the list
+ * in other places, such as tcp_clean_death(). So check if
+ * a timer is needed.
+ */
+ if (tcp_time_wait->tcp_time_wait_tid == 0) {
+ tcp_time_wait->tcp_time_wait_tid =
+ timeout_generic(CALLOUT_NORMAL,
+ tcp_time_wait_collector, sqp,
+ (hrtime_t)(tcps->tcps_time_wait_interval + 1) *
+ MICROSEC, CALLOUT_TCP_RESOLUTION,
+ CALLOUT_FLAG_ROUNDUP);
+ }
} else {
ASSERT(tcp_time_wait->tcp_time_wait_tail != NULL);
ASSERT(tcp_time_wait->tcp_time_wait_tail->tcp_state ==
TCPS_TIME_WAIT);
tcp_time_wait->tcp_time_wait_tail->tcp_time_wait_next = tcp;
tcp->tcp_time_wait_prev = tcp_time_wait->tcp_time_wait_tail;
+
+ /* The list is not empty, so a timer must be running. */
+ ASSERT(tcp_time_wait->tcp_time_wait_tid != 0);
}
tcp_time_wait->tcp_time_wait_tail = tcp;
mutex_exit(&tcp_time_wait->tcp_time_wait_lock);
@@ -216,7 +227,7 @@ void
tcp_time_wait_collector(void *arg)
{
tcp_t *tcp;
- clock_t now;
+ int64_t now;
mblk_t *mp;
conn_t *connp;
kmutex_t *lock;
@@ -247,17 +258,16 @@ tcp_time_wait_collector(void *arg)
/*
* In order to reap time waits reliably, we should use a
* source of time that is not adjustable by the user -- hence
- * the call to ddi_get_lbolt().
+ * the call to ddi_get_lbolt64().
*/
- now = ddi_get_lbolt();
+ now = ddi_get_lbolt64();
while ((tcp = tcp_time_wait->tcp_time_wait_head) != NULL) {
/*
- * Compare times using modular arithmetic, since
- * lbolt can wrapover.
+ * lbolt64 should not wrap around in practice... So we can
+ * do a direct comparison.
*/
- if ((now - tcp->tcp_time_wait_expire) < 0) {
+ if (now < tcp->tcp_time_wait_expire)
break;
- }
removed = tcp_time_wait_remove(tcp, tcp_time_wait);
ASSERT(removed);
@@ -389,10 +399,22 @@ tcp_time_wait_collector(void *arg)
if (tcp_time_wait->tcp_free_list != NULL)
tcp_time_wait->tcp_free_list->tcp_in_free_list = B_TRUE;
- tcp_time_wait->tcp_time_wait_tid =
- timeout_generic(CALLOUT_NORMAL, tcp_time_wait_collector, sqp,
- TCP_TIME_WAIT_DELAY, CALLOUT_TCP_RESOLUTION,
- CALLOUT_FLAG_ROUNDUP);
+ /*
+ * If the time wait list is not empty and there is no timer running,
+ * restart it.
+ */
+ if ((tcp = tcp_time_wait->tcp_time_wait_head) != NULL &&
+ tcp_time_wait->tcp_time_wait_tid == 0) {
+ hrtime_t firetime;
+
+ firetime = TICK_TO_NSEC(tcp->tcp_time_wait_expire - now);
+ /* This ensures that we won't wake up too often. */
+ firetime = MAX(TCP_TIME_WAIT_DELAY, firetime);
+ tcp_time_wait->tcp_time_wait_tid =
+ timeout_generic(CALLOUT_NORMAL, tcp_time_wait_collector,
+ sqp, firetime, CALLOUT_TCP_RESOLUTION,
+ CALLOUT_FLAG_ROUNDUP);
+ }
mutex_exit(&tcp_time_wait->tcp_time_wait_lock);
}
diff --git a/usr/src/uts/common/inet/tcp/tcp_timers.c b/usr/src/uts/common/inet/tcp/tcp_timers.c
index 5c87620fca..f2eaa3a958 100644
--- a/usr/src/uts/common/inet/tcp/tcp_timers.c
+++ b/usr/src/uts/common/inet/tcp/tcp_timers.c
@@ -20,8 +20,7 @@
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <sys/types.h>
@@ -135,8 +134,11 @@ static void tcp_timer_callback(void *);
static void tcp_timer_free(tcp_t *, mblk_t *);
static void tcp_timer_handler(void *, mblk_t *, void *, ip_recv_attr_t *);
+/*
+ * tim is in millisec.
+ */
timeout_id_t
-tcp_timeout(conn_t *connp, void (*f)(void *), clock_t tim)
+tcp_timeout(conn_t *connp, void (*f)(void *), hrtime_t tim)
{
mblk_t *mp;
tcp_timer_t *tcpt;
@@ -169,7 +171,7 @@ tcp_timeout(conn_t *connp, void (*f)(void *), clock_t tim)
* early before they have a chance to be cancelled.
*/
tcpt->tcpt_tid = timeout_generic(CALLOUT_NORMAL, tcp_timer_callback, mp,
- TICK_TO_NSEC(tim), CALLOUT_TCP_RESOLUTION, CALLOUT_FLAG_ROUNDUP);
+ tim * MICROSEC, CALLOUT_TCP_RESOLUTION, CALLOUT_FLAG_ROUNDUP);
return ((timeout_id_t)mp);
}
@@ -242,7 +244,7 @@ tcp_timeout_cancel(conn_t *connp, timeout_id_t id)
CONN_DEC_REF(connp);
}
- return (delta);
+ return (TICK_TO_MSEC(delta));
}
/*
@@ -418,7 +420,7 @@ tcp_keepalive_timer(void *arg)
/* Timer fired too early, restart it. */
if (tcp->tcp_state < TCPS_ESTABLISHED) {
tcp->tcp_ka_tid = TCP_TIMER(tcp, tcp_keepalive_timer,
- MSEC_TO_TICK(ka_intrvl));
+ ka_intrvl);
return;
}
@@ -469,8 +471,7 @@ tcp_keepalive_timer(void *arg)
firetime = tcp->tcp_rto;
}
tcp->tcp_ka_tid = TCP_TIMER(tcp,
- tcp_keepalive_timer,
- MSEC_TO_TICK(firetime));
+ tcp_keepalive_timer, firetime);
tcp->tcp_ka_last_intrvl = firetime;
return;
}
@@ -483,8 +484,7 @@ tcp_keepalive_timer(void *arg)
if ((firetime = ka_intrvl - idletime) < 0) {
firetime = ka_intrvl;
}
- tcp->tcp_ka_tid = TCP_TIMER(tcp, tcp_keepalive_timer,
- MSEC_TO_TICK(firetime));
+ tcp->tcp_ka_tid = TCP_TIMER(tcp, tcp_keepalive_timer, firetime);
}
void
@@ -1018,7 +1018,7 @@ tcp_timer(void *arg)
/*
* Remove all rexmit SACK blk to start from fresh.
*/
- if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL)
+ if (tcp->tcp_snd_sack_ok)
TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp);
if (mp == NULL) {
return;
diff --git a/usr/src/uts/common/inet/tcp_impl.h b/usr/src/uts/common/inet/tcp_impl.h
index a7d27350b3..f2f70777e7 100644
--- a/usr/src/uts/common/inet/tcp_impl.h
+++ b/usr/src/uts/common/inet/tcp_impl.h
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _INET_TCP_IMPL_H
@@ -103,7 +102,7 @@ extern kmem_cache_t *tcp_timercache;
/*
* Macro for starting various timers. Retransmission timer has its own macro,
- * TCP_TIMER_RESTART().
+ * TCP_TIMER_RESTART(). tim is in millisec.
*/
#define TCP_TIMER(tcp, f, tim) \
tcp_timeout(tcp->tcp_connp, f, tim)
@@ -111,13 +110,12 @@ extern kmem_cache_t *tcp_timercache;
tcp_timeout_cancel(tcp->tcp_connp, id)
/*
- * To restart the TCP retransmission timer.
+ * To restart the TCP retransmission timer. intvl is in millisec.
*/
#define TCP_TIMER_RESTART(tcp, intvl) { \
if ((tcp)->tcp_timer_tid != 0) \
(void) TCP_TIMER_CANCEL((tcp), (tcp)->tcp_timer_tid); \
- (tcp)->tcp_timer_tid = TCP_TIMER((tcp), tcp_timer, \
- MSEC_TO_TICK(intvl)); \
+ (tcp)->tcp_timer_tid = TCP_TIMER((tcp), tcp_timer, (intvl)); \
}
/*
@@ -615,7 +613,7 @@ extern void tcp_push_timer(void *);
extern void tcp_reass_timer(void *);
extern mblk_t *tcp_timermp_alloc(int);
extern void tcp_timermp_free(tcp_t *);
-extern timeout_id_t tcp_timeout(conn_t *, void (*)(void *), clock_t);
+extern timeout_id_t tcp_timeout(conn_t *, void (*)(void *), hrtime_t);
extern clock_t tcp_timeout_cancel(conn_t *, timeout_id_t);
extern void tcp_timer(void *arg);
extern void tcp_timers_stop(tcp_t *);
diff --git a/usr/src/uts/common/inet/tcp_sack.h b/usr/src/uts/common/inet/tcp_sack.h
index 7bd9939f67..5a4e9e4fa0 100644
--- a/usr/src/uts/common/inet/tcp_sack.h
+++ b/usr/src/uts/common/inet/tcp_sack.h
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#ifndef _INET_TCP_SACK_H
@@ -78,6 +77,8 @@ extern void tcp_notsack_remove(notsack_blk_t **, tcp_seq, int32_t *,
extern void tcp_notsack_update(notsack_blk_t **, tcp_seq, tcp_seq,
int32_t *, uint32_t *);
+/* Defined in tcp_sack.c */
+extern kmem_cache_t *tcp_notsack_blk_cache;
/*
* Macro to remove all the notsack'ed blks in sender.
@@ -85,21 +86,25 @@ extern void tcp_notsack_update(notsack_blk_t **, tcp_seq, tcp_seq,
* Param:
* notsack_blk_t *head: pointer to the head of the list of notsack'ed blks.
*/
-#define TCP_NOTSACK_REMOVE_ALL(head, tcp) \
-{ \
- notsack_blk_t *prev, *tmp; \
- tmp = (head); \
- do { \
- prev = tmp; \
- tmp = tmp->next; \
- kmem_free(prev, sizeof (notsack_blk_t)); \
- } while (tmp != NULL); \
- (head) = NULL; \
- (tcp)->tcp_cnt_notsack_list = 0; \
- (tcp)->tcp_num_notsack_blk = 0; \
+#define TCP_NOTSACK_REMOVE_ALL(head, tcp) \
+{ \
+ if ((head) != NULL) { \
+ notsack_blk_t *prev, *tmp; \
+ tmp = (head); \
+ do { \
+ prev = tmp; \
+ tmp = tmp->next; \
+ kmem_cache_free(tcp_notsack_blk_cache, prev); \
+ } while (tmp != NULL); \
+ (head) = NULL; \
+ (tcp)->tcp_cnt_notsack_list = 0; \
+ (tcp)->tcp_num_notsack_blk = 0; \
+ } else { \
+ ASSERT((tcp)->tcp_cnt_notsack_list == 0); \
+ ASSERT((tcp)->tcp_num_notsack_blk == 0); \
+ } \
}
-
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/uts/intel/ip/ip.global-objs.debug64 b/usr/src/uts/intel/ip/ip.global-objs.debug64
index acaa8bfec6..421c8c0a3b 100644
--- a/usr/src/uts/intel/ip/ip.global-objs.debug64
+++ b/usr/src/uts/intel/ip/ip.global-objs.debug64
@@ -19,8 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2010 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
+# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
#
arp_m_tbl
@@ -262,6 +261,7 @@ tcp_init_wnd_shft
tcp_max_init_cwnd
tcp_max_optsize
tcp_min_conn_listener
+tcp_notsack_blk_cache
tcp_opt_arr
tcp_opt_obj
tcp_outbound_squeue_switch
@@ -277,7 +277,6 @@ tcp_randtbl
tcp_rinfo
tcp_rinitv4
tcp_rinitv6
-tcp_sack_info_cache
tcp_sock_winit
tcp_squeue_flag
tcp_squeue_wput
diff --git a/usr/src/uts/intel/ip/ip.global-objs.obj64 b/usr/src/uts/intel/ip/ip.global-objs.obj64
index 8f1eaf800e..85d2777def 100644
--- a/usr/src/uts/intel/ip/ip.global-objs.obj64
+++ b/usr/src/uts/intel/ip/ip.global-objs.obj64
@@ -19,8 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2010 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
+# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
#
arp_m_tbl
@@ -259,6 +258,7 @@ tcp_init_wnd_shft
tcp_max_init_cwnd
tcp_max_optsize
tcp_min_conn_listener
+tcp_notsack_blk_cache
tcp_opt_arr
tcp_opt_obj
tcp_outbound_squeue_switch
@@ -274,7 +274,6 @@ tcp_randtbl
tcp_rinfo
tcp_rinitv4
tcp_rinitv6
-tcp_sack_info_cache
tcp_sock_winit
tcp_squeue_flag
tcp_squeue_wput
diff --git a/usr/src/uts/sparc/ip/ip.global-objs.debug64 b/usr/src/uts/sparc/ip/ip.global-objs.debug64
index acaa8bfec6..421c8c0a3b 100644
--- a/usr/src/uts/sparc/ip/ip.global-objs.debug64
+++ b/usr/src/uts/sparc/ip/ip.global-objs.debug64
@@ -19,8 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2010 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
+# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
#
arp_m_tbl
@@ -262,6 +261,7 @@ tcp_init_wnd_shft
tcp_max_init_cwnd
tcp_max_optsize
tcp_min_conn_listener
+tcp_notsack_blk_cache
tcp_opt_arr
tcp_opt_obj
tcp_outbound_squeue_switch
@@ -277,7 +277,6 @@ tcp_randtbl
tcp_rinfo
tcp_rinitv4
tcp_rinitv6
-tcp_sack_info_cache
tcp_sock_winit
tcp_squeue_flag
tcp_squeue_wput
diff --git a/usr/src/uts/sparc/ip/ip.global-objs.obj64 b/usr/src/uts/sparc/ip/ip.global-objs.obj64
index 8f1eaf800e..85d2777def 100644
--- a/usr/src/uts/sparc/ip/ip.global-objs.obj64
+++ b/usr/src/uts/sparc/ip/ip.global-objs.obj64
@@ -19,8 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2010 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
+# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
#
arp_m_tbl
@@ -259,6 +258,7 @@ tcp_init_wnd_shft
tcp_max_init_cwnd
tcp_max_optsize
tcp_min_conn_listener
+tcp_notsack_blk_cache
tcp_opt_arr
tcp_opt_obj
tcp_outbound_squeue_switch
@@ -274,7 +274,6 @@ tcp_randtbl
tcp_rinfo
tcp_rinitv4
tcp_rinitv6
-tcp_sack_info_cache
tcp_sock_winit
tcp_squeue_flag
tcp_squeue_wput