summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/tcp_stack.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/inet/tcp_stack.h')
-rw-r--r--usr/src/uts/common/inet/tcp_stack.h254
1 files changed, 254 insertions, 0 deletions
diff --git a/usr/src/uts/common/inet/tcp_stack.h b/usr/src/uts/common/inet/tcp_stack.h
new file mode 100644
index 0000000000..c2b89bebb4
--- /dev/null
+++ b/usr/src/uts/common/inet/tcp_stack.h
@@ -0,0 +1,254 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * 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.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _INET_TCP_STACK_H
+#define _INET_TCP_STACK_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/netstack.h>
+#include <inet/ip.h>
+#include <inet/ipdrop.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Kstats */
+typedef struct tcp_stat {
+ kstat_named_t tcp_time_wait;
+ kstat_named_t tcp_time_wait_syn;
+ kstat_named_t tcp_time_wait_syn_success;
+ kstat_named_t tcp_time_wait_syn_fail;
+ kstat_named_t tcp_reinput_syn;
+ kstat_named_t tcp_ip_output;
+ kstat_named_t tcp_detach_non_time_wait;
+ kstat_named_t tcp_detach_time_wait;
+ kstat_named_t tcp_time_wait_reap;
+ kstat_named_t tcp_clean_death_nondetached;
+ kstat_named_t tcp_reinit_calls;
+ kstat_named_t tcp_eager_err1;
+ kstat_named_t tcp_eager_err2;
+ kstat_named_t tcp_eager_blowoff_calls;
+ kstat_named_t tcp_eager_blowoff_q;
+ kstat_named_t tcp_eager_blowoff_q0;
+ kstat_named_t tcp_not_hard_bound;
+ kstat_named_t tcp_no_listener;
+ kstat_named_t tcp_found_eager;
+ kstat_named_t tcp_wrong_queue;
+ kstat_named_t tcp_found_eager_binding1;
+ kstat_named_t tcp_found_eager_bound1;
+ kstat_named_t tcp_eager_has_listener1;
+ kstat_named_t tcp_open_alloc;
+ kstat_named_t tcp_open_detached_alloc;
+ kstat_named_t tcp_rput_time_wait;
+ kstat_named_t tcp_listendrop;
+ kstat_named_t tcp_listendropq0;
+ kstat_named_t tcp_wrong_rq;
+ kstat_named_t tcp_rsrv_calls;
+ kstat_named_t tcp_eagerfree2;
+ kstat_named_t tcp_eagerfree3;
+ kstat_named_t tcp_eagerfree4;
+ kstat_named_t tcp_eagerfree5;
+ kstat_named_t tcp_timewait_syn_fail;
+ kstat_named_t tcp_listen_badflags;
+ kstat_named_t tcp_timeout_calls;
+ kstat_named_t tcp_timeout_cached_alloc;
+ kstat_named_t tcp_timeout_cancel_reqs;
+ kstat_named_t tcp_timeout_canceled;
+ kstat_named_t tcp_timermp_freed;
+ kstat_named_t tcp_push_timer_cnt;
+ kstat_named_t tcp_ack_timer_cnt;
+ kstat_named_t tcp_ire_null1;
+ kstat_named_t tcp_ire_null;
+ kstat_named_t tcp_ip_send;
+ kstat_named_t tcp_ip_ire_send;
+ kstat_named_t tcp_wsrv_called;
+ kstat_named_t tcp_flwctl_on;
+ kstat_named_t tcp_timer_fire_early;
+ kstat_named_t tcp_timer_fire_miss;
+ kstat_named_t tcp_rput_v6_error;
+ kstat_named_t tcp_out_sw_cksum;
+ kstat_named_t tcp_out_sw_cksum_bytes;
+ kstat_named_t tcp_zcopy_on;
+ kstat_named_t tcp_zcopy_off;
+ kstat_named_t tcp_zcopy_backoff;
+ kstat_named_t tcp_zcopy_disable;
+ kstat_named_t tcp_mdt_pkt_out;
+ kstat_named_t tcp_mdt_pkt_out_v4;
+ kstat_named_t tcp_mdt_pkt_out_v6;
+ kstat_named_t tcp_mdt_discarded;
+ kstat_named_t tcp_mdt_conn_halted1;
+ kstat_named_t tcp_mdt_conn_halted2;
+ kstat_named_t tcp_mdt_conn_halted3;
+ kstat_named_t tcp_mdt_conn_resumed1;
+ kstat_named_t tcp_mdt_conn_resumed2;
+ kstat_named_t tcp_mdt_legacy_small;
+ kstat_named_t tcp_mdt_legacy_all;
+ kstat_named_t tcp_mdt_legacy_ret;
+ kstat_named_t tcp_mdt_allocfail;
+ kstat_named_t tcp_mdt_addpdescfail;
+ kstat_named_t tcp_mdt_allocd;
+ kstat_named_t tcp_mdt_linked;
+ kstat_named_t tcp_fusion_flowctl;
+ kstat_named_t tcp_fusion_backenabled;
+ kstat_named_t tcp_fusion_urg;
+ kstat_named_t tcp_fusion_putnext;
+ kstat_named_t tcp_fusion_unfusable;
+ kstat_named_t tcp_fusion_aborted;
+ kstat_named_t tcp_fusion_unqualified;
+ kstat_named_t tcp_fusion_rrw_busy;
+ kstat_named_t tcp_fusion_rrw_msgcnt;
+ kstat_named_t tcp_fusion_rrw_plugged;
+ kstat_named_t tcp_in_ack_unsent_drop;
+ kstat_named_t tcp_sock_fallback;
+ kstat_named_t tcp_lso_enabled;
+ kstat_named_t tcp_lso_disabled;
+ kstat_named_t tcp_lso_times;
+ kstat_named_t tcp_lso_pkt_out;
+} tcp_stat_t;
+
+#define TCP_STAT(tcps, x) ((tcps)->tcps_statistics.x.value.ui64++)
+#define TCP_STAT_UPDATE(tcps, x, n) \
+ ((tcps)->tcps_statistics.x.value.ui64 += (n))
+#define TCP_STAT_SET(tcps, x, n) \
+ ((tcps)->tcps_statistics.x.value.ui64 = (n))
+
+typedef struct tcp_g_stat {
+ kstat_named_t tcp_timermp_alloced;
+ kstat_named_t tcp_timermp_allocfail;
+ kstat_named_t tcp_timermp_allocdblfail;
+ kstat_named_t tcp_freelist_cleanup;
+} tcp_g_stat_t;
+
+#ifdef _KERNEL
+
+/*
+ * TCP stack instances
+ */
+struct tcp_stack {
+ netstack_t *tcps_netstack; /* Common netstack */
+
+ mib2_tcp_t tcps_mib;
+
+ /* Protected by tcps_g_q_lock */
+ queue_t *tcps_g_q; /* Default queue */
+ uint_t tcps_refcnt; /* Total number of tcp_t's */
+ kmutex_t tcps_g_q_lock;
+ kcondvar_t tcps_g_q_cv;
+ kthread_t *tcps_g_q_creator;
+ struct __ldi_handle *tcps_g_q_lh;
+ cred_t *tcps_g_q_cr; /* For _inactive close call */
+
+ /* Protected by tcp_hsp_lock */
+ struct tcp_hsp **tcps_hsp_hash; /* Hash table for HSPs */
+ krwlock_t tcps_hsp_lock;
+
+ /*
+ * Extra privileged ports. In host byte order.
+ * Protected by tcp_epriv_port_lock.
+ */
+#define TCP_NUM_EPRIV_PORTS 64
+ int tcps_g_num_epriv_ports;
+ uint16_t tcps_g_epriv_ports[TCP_NUM_EPRIV_PORTS];
+ kmutex_t tcps_epriv_port_lock;
+
+ /*
+ * The smallest anonymous port in the priviledged port range which TCP
+ * looks for free port. Use in the option TCP_ANONPRIVBIND.
+ */
+ in_port_t tcps_min_anonpriv_port;
+
+ /* Only modified during _init and _fini thus no locking is needed. */
+ caddr_t tcps_g_nd;
+ struct tcpparam_s *tcps_params; /* ndd parameters */
+ struct tcpparam_s *tcps_wroff_xtra_param;
+ struct tcpparam_s *tcps_mdt_head_param;
+ struct tcpparam_s *tcps_mdt_tail_param;
+ struct tcpparam_s *tcps_mdt_max_pbufs_param;
+
+ /* Hint not protected by any lock */
+ uint_t tcps_next_port_to_try;
+
+ /* TCP bind hash list - all tcp_t with state >= BOUND. */
+ struct tf_s *tcps_bind_fanout;
+
+ /* TCP queue hash list - all tcp_t in case they will be an acceptor. */
+ struct tf_s *tcps_acceptor_fanout;
+
+ /* The reserved port array. */
+ struct tcp_rport_s *tcps_reserved_port;
+
+ /* Locks to protect the tcp_reserved_ports array. */
+ krwlock_t tcps_reserved_port_lock;
+
+ /* The number of ranges in the array. */
+ uint32_t tcps_reserved_port_array_size;
+
+ /*
+ * MIB-2 stuff for SNMP
+ * Note: tcpInErrs {tcp 15} is accumulated in ip.c
+ */
+ kstat_t *tcps_mibkp; /* kstat exporting tcp_mib data */
+ kstat_t *tcps_kstat;
+ tcp_stat_t tcps_statistics;
+
+ uint32_t tcps_iss_incr_extra;
+ /* Incremented for each connection */
+ kmutex_t tcps_iss_key_lock;
+ MD5_CTX tcps_iss_key;
+
+ /* Packet dropper for TCP IPsec policy drops. */
+ ipdropper_t tcps_dropper;
+
+ /*
+ * This controls the rate some ndd info report functions can be used
+ * by non-priviledged users. It stores the last time such info is
+ * requested. When those report functions are called again, this
+ * is checked with the current time and compare with the ndd param
+ * tcp_ndd_get_info_interval.
+ */
+ clock_t tcps_last_ndd_get_info_time;
+
+ /*
+ * These two variables control the rate for TCP to generate RSTs in
+ * response to segments not belonging to any connections. We limit
+ * TCP to sent out tcp_rst_sent_rate (ndd param) number of RSTs in
+ * each 1 second interval. This is to protect TCP against DoS attack.
+ */
+ clock_t tcps_last_rst_intrvl;
+ uint32_t tcps_rst_cnt;
+ /* The number of RST not sent because of the rate limit. */
+ uint32_t tcps_rst_unsent;
+};
+typedef struct tcp_stack tcp_stack_t;
+
+#endif /* _KERNEL */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _INET_TCP_STACK_H */