summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/sctp/sctp_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/inet/sctp/sctp_impl.h')
-rw-r--r--usr/src/uts/common/inet/sctp/sctp_impl.h112
1 files changed, 74 insertions, 38 deletions
diff --git a/usr/src/uts/common/inet/sctp/sctp_impl.h b/usr/src/uts/common/inet/sctp/sctp_impl.h
index 42fff07569..5251bd5d34 100644
--- a/usr/src/uts/common/inet/sctp/sctp_impl.h
+++ b/usr/src/uts/common/inet/sctp/sctp_impl.h
@@ -18,6 +18,7 @@
*
* CDDL HEADER END
*/
+
/*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
@@ -62,36 +63,6 @@ typedef struct sctpt_s {
} sctpt_t;
/*
- * faddr timer mblks are not allocated until first use. This macro
- * will allocate the timer mblk if necessary, set the faddr, and then
- * start the timer.
- */
-#define SCTP_FADDR_TIMER_RESTART(sctp, fp, intvl) \
- if ((fp)->timer_mp == NULL) { \
- (fp)->timer_mp = sctp_timer_alloc((sctp), sctp_rexmit_timer); \
- } \
- if ((fp)->timer_mp != NULL) { \
- ((sctpt_t *)((fp)->timer_mp->b_rptr))->sctpt_faddr = fp; \
- dprint(3, ("faddr_timer_restart: fp=%p %x:%x:%x:%x %d\n", \
- (void *)(fp), SCTP_PRINTADDR((fp)->faddr), \
- (int)(intvl))); \
- sctp_timer((sctp), (fp)->timer_mp, (intvl)); \
- (fp)->timer_running = 1; \
- }
-
-#define SCTP_FADDR_TIMER_STOP(fp) \
- if ((fp)->timer_running && (fp)->timer_mp != NULL) { \
- sctp_timer_stop((fp)->timer_mp); \
- (fp)->timer_running = 0; \
- }
-
-#define SCTP_CALC_RXT(fp, max) \
-{ \
- if (((fp)->rto <<= 1) > (max)) \
- (fp)->rto = (max); \
-}
-
-/*
* Maximum number of duplicate TSNs we can report. This is currently
* static, and governs the size of the mblk used to hold the duplicate
* reports. The use of duplcate TSN reports is currently experimental,
@@ -184,6 +155,31 @@ extern sctpparam_t sctp_param_arr[];
extern sctpparam_t sctp_wroff_xtra_param;
#define sctp_wroff_xtra sctp_wroff_xtra_param.sctp_param_val
+/*
+ * Retransmission timer start and stop macro for a given faddr.
+ */
+#define SCTP_FADDR_TIMER_RESTART(sctp, fp, intvl) \
+{ \
+ dprint(3, ("faddr_timer_restart: fp=%p %x:%x:%x:%x %d\n", \
+ (void *)(fp), SCTP_PRINTADDR((fp)->faddr), (int)(intvl))); \
+ sctp_timer((sctp), (fp)->timer_mp, (intvl)); \
+ (fp)->timer_running = 1; \
+}
+
+#define SCTP_FADDR_TIMER_STOP(fp) \
+ ASSERT((fp)->timer_mp != NULL); \
+ if ((fp)->timer_running) { \
+ sctp_timer_stop((fp)->timer_mp); \
+ (fp)->timer_running = 0; \
+ }
+
+#define SCTP_CALC_RXT(fp, max) \
+{ \
+ if (((fp)->rto <<= 1) > (max)) \
+ (fp)->rto = (max); \
+}
+
+
#define SCTP_MAX_COMBINED_HEADER_LENGTH (60 + 12) /* Maxed out ip + sctp */
#define SCTP_MAX_IP_OPTIONS_LENGTH (60 - IP_SIMPLE_HDR_LENGTH)
#define SCTP_MAX_HDR_LENGTH 60
@@ -385,6 +381,40 @@ extern sin6_t sctp_sin6_null; /* Zero address for quick clears */
extern mib2_sctp_t sctp_mib; /* SNMP fixed size info */
+/* SCTP kstat */
+typedef struct sctp_kstat_s {
+ kstat_named_t sctp_add_faddr;
+ kstat_named_t sctp_add_timer;
+ kstat_named_t sctp_conn_create;
+ kstat_named_t sctp_find_next_tq;
+ kstat_named_t sctp_fr_add_hdr;
+ kstat_named_t sctp_fr_not_found;
+ kstat_named_t sctp_output_failed;
+ kstat_named_t sctp_rexmit_failed;
+ kstat_named_t sctp_send_init_failed;
+ kstat_named_t sctp_send_cookie_failed;
+ kstat_named_t sctp_send_cookie_ack_failed;
+ kstat_named_t sctp_send_err_failed;
+ kstat_named_t sctp_send_sack_failed;
+ kstat_named_t sctp_send_shutdown_failed;
+ kstat_named_t sctp_send_shutdown_ack_failed;
+ kstat_named_t sctp_send_shutdown_comp_failed;
+ kstat_named_t sctp_send_user_abort_failed;
+ kstat_named_t sctp_send_asconf_failed;
+ kstat_named_t sctp_send_asconf_ack_failed;
+ kstat_named_t sctp_send_ftsn_failed;
+ kstat_named_t sctp_send_hb_failed;
+ kstat_named_t sctp_return_hb_failed;
+ kstat_named_t sctp_ss_rexmit_failed;
+ kstat_named_t sctp_cl_connect;
+ kstat_named_t sctp_cl_assoc_change;
+ kstat_named_t sctp_cl_check_addrs;
+} sctp_kstat_t;
+
+extern sctp_kstat_t sctp_statistics;
+
+#define SCTP_KSTAT(x) (sctp_statistics.x.value.ui64++)
+
/*
* Object to represent database of options to search passed to
* {sock,tpi}optcom_req() interface routine to take care of option
@@ -744,7 +774,9 @@ typedef struct sctp_s {
sctp_prsctp_aware : 1, /* is peer PR-SCTP aware? */
sctp_linklocal : 1, /* is linklocal assoc. */
sctp_mac_exempt : 1, /* SO_MAC_EXEMPT */
- sctp_dummy : 5;
+ sctp_rexmitting : 1, /* SCTP is retransmitting */
+
+ sctp_dummy : 4;
} sctp_bits;
struct {
uint32_t
@@ -787,6 +819,7 @@ typedef struct sctp_s {
#define sctp_prsctp_aware sctp_bits.sctp_prsctp_aware
#define sctp_linklocal sctp_bits.sctp_linklocal
#define sctp_mac_exempt sctp_bits.sctp_mac_exempt
+#define sctp_rexmitting sctp_bits.sctp_rexmitting
#define sctp_recvsndrcvinfo sctp_events.sctp_recvsndrcvinfo
#define sctp_recvassocevnt sctp_events.sctp_recvassocevnt
@@ -903,6 +936,8 @@ typedef struct sctp_s {
uint_t sctp_v4label_len; /* length of cached v4 label */
uint_t sctp_v6label_len; /* length of cached v6 label */
+ uint32_t sctp_rxt_nxttsn; /* Next TSN to be rexmitted */
+ uint32_t sctp_rxt_maxtsn; /* Max TSN sent at time out */
} sctp_t;
extern list_t sctp_g_list; /* Head of SCTP instance data chain */
@@ -919,8 +954,7 @@ extern mblk_t *sctp_pad_mp;
extern void sctp_ack_timer(sctp_t *);
extern size_t sctp_adaption_code_param(sctp_t *, uchar_t *);
extern void sctp_adaption_event(sctp_t *);
-extern int sctp_add_faddr(sctp_t *, in6_addr_t *, int);
-extern int sctp_add_faddr_first(sctp_t *, in6_addr_t *, int);
+extern int sctp_add_faddr(sctp_t *, in6_addr_t *, int, boolean_t);
extern boolean_t sctp_add_ftsn_set(sctp_ftsn_set_t **, sctp_faddr_t *, mblk_t *,
uint_t *, uint32_t *);
extern boolean_t sctp_add_recvq(sctp_t *, mblk_t *, boolean_t);
@@ -974,8 +1008,6 @@ extern void sctp_faddr_alive(sctp_t *, sctp_faddr_t *);
extern int sctp_faddr_dead(sctp_t *, sctp_faddr_t *, int);
extern void sctp_faddr_fini(void);
extern void sctp_faddr_init(void);
-extern void sctp_faddr2hdraddr(sctp_faddr_t *, sctp_t *);
-extern void sctp_faddr2ire(sctp_t *, sctp_faddr_t *);
extern void sctp_fast_rexmit(sctp_t *);
extern void sctp_fill_sack(sctp_t *, unsigned char *, int);
extern void sctp_free_faddr_timers(sctp_t *);
@@ -990,6 +1022,7 @@ extern int sctp_get_addrlist(sctp_t *, const void *, uint32_t *,
uchar_t **, int *, size_t *);
extern int sctp_get_addrparams(sctp_t *, sctp_t *, mblk_t *,
sctp_chunk_hdr_t *, uint_t *);
+extern void sctp_get_ire(sctp_t *, sctp_faddr_t *);
extern void sctp_get_faddr_list(sctp_t *, uchar_t *, size_t);
extern mblk_t *sctp_get_first_sent(sctp_t *);
extern mblk_t *sctp_get_msg_to_send(sctp_t *, mblk_t **, mblk_t *, int *,
@@ -1014,7 +1047,6 @@ extern uint32_t sctp_init2vtag(sctp_chunk_hdr_t *);
extern void sctp_intf_event(sctp_t *, in6_addr_t, int, int);
extern void sctp_input_data(sctp_t *, mblk_t *, mblk_t *);
extern void sctp_instream_cleanup(sctp_t *, boolean_t);
-extern void sctp_ire2faddr(sctp_t *, sctp_faddr_t *);
extern int sctp_is_a_faddr_clean(sctp_t *);
extern void sctp_kstat_init(void);
@@ -1075,16 +1107,19 @@ extern void sctp_send_initack(sctp_t *, sctp_chunk_hdr_t *, mblk_t *);
extern void sctp_send_shutdown(sctp_t *, int);
extern void sctp_send_heartbeat(sctp_t *, sctp_faddr_t *);
extern void sctp_sendfail_event(sctp_t *, mblk_t *, int, boolean_t);
-extern int sctp_set_hdraddrs(sctp_t *, cred_t *);
+extern void sctp_set_faddr_current(sctp_t *, sctp_faddr_t *);
+extern int sctp_set_hdraddrs(sctp_t *);
extern void sctp_sets_init(void);
extern void sctp_sets_fini(void);
extern void sctp_shutdown_event(sctp_t *);
extern void sctp_stop_faddr_timers(sctp_t *);
-extern int sctp_shutdown_received(sctp_t *, sctp_chunk_hdr_t *, int, int);
+extern int sctp_shutdown_received(sctp_t *, sctp_chunk_hdr_t *, boolean_t,
+ boolean_t, sctp_faddr_t *);
extern void sctp_shutdown_complete(sctp_t *);
extern void sctp_set_if_mtu(sctp_t *);
extern void sctp_set_iplen(sctp_t *, mblk_t *);
extern void sctp_set_ulp_prop(sctp_t *);
+extern void sctp_ss_rexmit(sctp_t *);
extern size_t sctp_supaddr_param_len(sctp_t *);
extern size_t sctp_supaddr_param(sctp_t *, uchar_t *);
@@ -1095,6 +1130,7 @@ extern void sctp_timer_free(mblk_t *);
extern void sctp_timer_stop(mblk_t *);
extern void sctp_unlink_faddr(sctp_t *, sctp_faddr_t *);
+extern void sctp_update_ire(sctp_t *sctp);
extern in_port_t sctp_update_next_port(in_port_t, zone_t *zone);
extern void sctp_update_rtt(sctp_t *, sctp_faddr_t *, clock_t);
extern void sctp_user_abort(sctp_t *, mblk_t *, boolean_t);