Print this page
*** NO COMMENTS ***
*** 3475,3484 ****
--- 3475,3486 ----
* and other stuffs. Note that we don't check if the
* existing eager list meets the new tcp_conn_req_max
* requirement.
*/
if (tcp->tcp_state != TCPS_LISTEN) {
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, TCPS_LISTEN);
tcp->tcp_state = TCPS_LISTEN;
/* Initialize the chain. Don't need the eager_lock */
tcp->tcp_eager_next_q0 = tcp->tcp_eager_prev_q0 = tcp;
tcp->tcp_eager_next_drop_q0 = tcp;
tcp->tcp_eager_prev_drop_q0 = tcp;
*** 3771,3780 ****
--- 3773,3784 ----
/*
* This port is ours. Insert in fanout and mark as
* bound to prevent others from getting the port
* number.
*/
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, TCPS_BOUND);
tcp->tcp_state = TCPS_BOUND;
tcp->tcp_lport = htons(port);
*(uint16_t *)tcp->tcp_tcph->th_lport = tcp->tcp_lport;
ASSERT(&tcps->tcps_bind_fanout[TCP_BIND_HASH(
*** 3902,3911 ****
--- 3906,3918 ----
*/
tcp_closei_local(tcp);
if (!tcp->tcp_tconnind_started) {
CONN_DEC_REF(tcp->tcp_connp);
} else {
+ DTRACE_TCP4(state__change, void, NULL,
+ conn_t *, NULL, tcp_t *, tcp, int32_t,
+ TCPS_BOUND);
tcp->tcp_state = TCPS_BOUND;
}
} else {
tcp_close_detached(tcp);
}
*** 4635,4644 ****
--- 4642,4655 ----
/* Need to cleanup any pending ioctls */
ASSERT(tcp->tcp_time_wait_next == NULL);
ASSERT(tcp->tcp_time_wait_prev == NULL);
ASSERT(tcp->tcp_time_wait_expire == 0);
+ if (connp->conn_fully_bound) {
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, TCPS_CLOSED);
+ }
tcp->tcp_state = TCPS_CLOSED;
/* Release any SSL context */
if (tcp->tcp_kssl_ent != NULL) {
kssl_release_ent(tcp->tcp_kssl_ent, NULL, KSSL_NO_PROXY);
*** 5876,5885 ****
--- 5887,5899 ----
/*
* No need to check for multicast destination since ip will only pass
* up multicasts to those that have expressed interest
* TODO: what about rejecting broadcasts?
* Also check that source is not a multicast or broadcast address.
+ *
+ * DTrace tcp:::state-change is probed a little further down,
+ * where it is set for the second time.
*/
eager->tcp_state = TCPS_SYN_RCVD;
/*
*** 5896,5905 ****
--- 5910,5926 ----
/* Undo the bind_hash_insert */
tcp_bind_hash_remove(eager);
goto error3;
}
+ /*
+ * DTrace the first SYN as a tcp:::receive. This is placed after
+ * tcp_adapt_ire() so that tcp->tcp_loopback has been set.
+ */
+ DTRACE_TCP5(receive, mblk_t *, NULL, conn_t *, NULL, void_ip_t *,
+ mp->b_rptr, tcp_t *, tcp, tcph_t *, tcph);
+
/* Process all TCP options. */
tcp_process_options(eager, tcph);
/* Is the other end ECN capable? */
if (tcps->tcps_ecn_permitted >= 1 &&
*** 6012,6021 ****
--- 6033,6044 ----
eager->tcp_irs = seg_seq;
eager->tcp_rack = seg_seq;
eager->tcp_rnxt = seg_seq + 1;
U32_TO_ABE32(eager->tcp_rnxt, eager->tcp_tcph->th_ack);
BUMP_MIB(&tcps->tcps_mib, tcpPassiveOpens);
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL, tcp_t *, eager,
+ int32_t, TCPS_SYN_RCVD);
eager->tcp_state = TCPS_SYN_RCVD;
mp1 = tcp_xmit_mp(eager, eager->tcp_xmit_head, eager->tcp_mss,
NULL, NULL, eager->tcp_iss, B_FALSE, NULL, B_FALSE);
if (mp1 == NULL) {
/*
*** 6121,6130 ****
--- 6144,6170 ----
}
return;
error3:
CONN_DEC_REF(econnp);
error2:
+ /*
+ * DTrace this tcp:::receive event, as we skipped the previous receive
+ * probe. For DTrace only, we find the IP header length so that the
+ * TCP header can be found.
+ */
+ ipvers = IPH_HDR_VERSION(mp->b_rptr);
+ if (OK_32PTR(mp->b_rptr) &&
+ (ipvers == IPV4_VERSION || ipvers == IPV6_VERSION)) {
+ if (ipvers == IPV4_VERSION)
+ ip_hdr_len = IPH_HDR_LENGTH((ipha_t *)mp->b_rptr);
+ else
+ ip_hdr_len = ip_hdr_length_v6(mp, (ip6_t *)mp->b_rptr);
+ DTRACE_TCP5(receive, mblk_t *, NULL, conn_t *, NULL,
+ void_ip_t *, mp->b_rptr, tcp_t *, NULL, tcph_t *,
+ &mp->b_rptr[ip_hdr_len]);
+ }
+
freemsg(mp);
}
/*
* In an ideal case of vertical partition in NUMA architecture, its
*** 6619,6628 ****
--- 6659,6670 ----
if (lport == 0) {
mp = mi_tpi_err_ack_alloc(mp, TNOADDR, 0);
goto failed;
}
}
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL, tcp_t *, tcp,
+ int32_t, TCPS_SYN_SENT);
tcp->tcp_state = TCPS_SYN_SENT;
/*
* TODO: allow data with connect requests
* by unlinking M_DATA trailers here and
*** 6631,6640 ****
--- 6673,6684 ----
* feed them to tcp_wput_data() rather than call
* tcp_timer().
*/
mp = mi_tpi_ok_ack_alloc(mp);
if (!mp) {
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, oldstate);
tcp->tcp_state = oldstate;
goto failed;
}
if (tcp->tcp_family == AF_INET) {
mp1 = tcp_ip_bind_mp(tcp, O_T_BIND_REQ,
*** 6671,6680 ****
--- 6715,6726 ----
if (mp1 != NULL)
tcp_rput_other(tcp, mp1);
return;
}
/* Error case */
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL, tcp_t *, tcp,
+ int32_t, oldstate);
tcp->tcp_state = oldstate;
mp = mi_tpi_err_ack_alloc(mp, TSYSERR, ENOMEM);
failed:
/* return error ack and blow away saved option results if any */
*** 6827,6836 ****
--- 6873,6884 ----
if (lport == 0) {
mp = mi_tpi_err_ack_alloc(mp, TNOADDR, 0);
goto failed;
}
}
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL, tcp_t *, tcp,
+ int32_t, TCPS_SYN_SENT);
tcp->tcp_state = TCPS_SYN_SENT;
/*
* TODO: allow data with connect requests
* by unlinking M_DATA trailers here and
* linking them in behind the T_OK_ACK mblk.
*** 6838,6847 ****
--- 6886,6897 ----
* feed them to tcp_wput_data() rather than call
* tcp_timer().
*/
mp = mi_tpi_ok_ack_alloc(mp);
if (!mp) {
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, oldstate);
tcp->tcp_state = oldstate;
goto failed;
}
mp1 = tcp_ip_bind_mp(tcp, O_T_BIND_REQ, sizeof (ipa6_conn_t));
if (mp1) {
*** 6864,6873 ****
--- 6914,6925 ----
if (mp1 != NULL)
tcp_rput_other(tcp, mp1);
return;
}
/* Error case */
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL, tcp_t *, tcp,
+ int32_t, oldstate);
tcp->tcp_state = oldstate;
mp = mi_tpi_err_ack_alloc(mp, TSYSERR, ENOMEM);
failed:
/* return error ack and blow away saved option results if any */
*** 7012,7024 ****
--- 7064,7080 ----
tcp->tcp_connp->conn_zoneid, ipst);
if (connp != NULL)
ltcp = connp->conn_tcp;
}
if (tcp->tcp_conn_req_max && ltcp == NULL) {
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, TCPS_LISTEN);
tcp->tcp_state = TCPS_LISTEN;
} else if (old_state > TCPS_BOUND) {
tcp->tcp_conn_req_max = 0;
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, TCPS_BOUND);
tcp->tcp_state = TCPS_BOUND;
}
if (ltcp != NULL)
CONN_DEC_REF(ltcp->tcp_connp);
if (old_state == TCPS_SYN_SENT || old_state == TCPS_SYN_RCVD) {
*** 7915,7924 ****
--- 7971,7982 ----
* the global queue, TCP will do a tcp_lookup_listener()
* to find this stream. This works because this stream
* is only removed from connected hash.
*
*/
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, TCPS_LISTEN);
tcp->tcp_state = TCPS_LISTEN;
tcp->tcp_eager_next_q0 = tcp->tcp_eager_prev_q0 = tcp;
tcp->tcp_eager_next_drop_q0 = tcp;
tcp->tcp_eager_prev_drop_q0 = tcp;
tcp->tcp_connp->conn_recv = tcp_conn_request;
*** 7930,7939 ****
--- 7988,7999 ----
ASSERT(!tcp->tcp_connp->conn_af_isv6);
(void) ipcl_bind_insert(tcp->tcp_connp, IPPROTO_TCP,
tcp->tcp_ipha->ipha_src, tcp->tcp_lport);
}
} else {
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, TCPS_BOUND);
tcp->tcp_state = TCPS_BOUND;
}
/*
* Initialize to default values
*** 8291,8300 ****
--- 8351,8361 ----
{
int err;
tcp->tcp_rq = q;
tcp->tcp_wq = WR(q);
+ /* DTrace ignores this - it isn't a tcp:::state-change */
tcp->tcp_state = TCPS_IDLE;
if ((err = tcp_init_values(tcp)) != 0)
tcp_timers_stop(tcp);
return (err);
}
*** 13292,13301 ****
--- 13353,13369 ----
mp->b_wptr = (uchar_t *)tcph + TCP_HDR_LENGTH(tcph);
seg_len = 0;
}
}
+ DTRACE_TCP5(receive, mblk_t *, NULL, conn_t *, NULL, void_ip_t *,
+ iphdr, tcp_t *, tcp, tcph_t *, tcph);
+ if (tcp->tcp_state == TCPS_SYN_RCVD && (flags & TH_ACK)) {
+ DTRACE_TCP5(accept__established, mblk_t *, NULL, conn_t *,
+ NULL, void_ip_t *, iphdr, tcp_t *, tcp, tcph_t *, tcph);
+ }
+
switch (tcp->tcp_state) {
case TCPS_SYN_SENT:
if (flags & TH_ACK) {
/*
* Note that our stack cannot send data before a
*** 13313,13322 ****
--- 13381,13394 ----
return;
}
ASSERT(tcp->tcp_suna + 1 == seg_ack);
}
if (flags & TH_RST) {
+ DTRACE_TCP5(connect__refused, mblk_t *, NULL,
+ conn_t *, NULL, void_ip_t *, iphdr, tcp_t *, NULL,
+ tcph_t *, tcph);
+
freemsg(mp);
if (flags & TH_ACK)
(void) tcp_clean_death(tcp,
ECONNREFUSED, 13);
return;
*** 13387,13399 ****
--- 13459,13480 ----
tcp->tcp_ip_forward_progress = B_TRUE;
/* One for the SYN */
tcp->tcp_suna = tcp->tcp_iss + 1;
tcp->tcp_valid_bits &= ~TCP_ISS_VALID;
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, TCPS_ESTABLISHED);
tcp->tcp_state = TCPS_ESTABLISHED;
/*
+ * For DTrace observability, remember that we just
+ * established a connection and are about to send
+ * the final ACK.
+ */
+ tcp->tcp_dtrace_connect_established = B_TRUE;
+
+ /*
* If SYN was retransmitted, need to reset all
* retransmission info. This is because this
* segment will be treated as a dup ACK.
*/
if (tcp->tcp_rexmit) {
*** 13496,13505 ****
--- 13577,13588 ----
flags &= ~TH_SYN;
seg_seq++;
break;
}
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, TCPS_SYN_RCVD);
tcp->tcp_state = TCPS_SYN_RCVD;
mp1 = tcp_xmit_mp(tcp, tcp->tcp_xmit_head, tcp->tcp_mss,
NULL, NULL, tcp->tcp_iss, B_FALSE, NULL, B_FALSE);
if (mp1) {
DB_CPID(mp1) = tcp->tcp_cpid;
*** 14415,14424 ****
--- 14498,14509 ----
if (new_swnd > tcp->tcp_max_swnd)
tcp->tcp_max_swnd = new_swnd;
tcp->tcp_swl1 = seg_seq;
tcp->tcp_swl2 = seg_ack;
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL,
+ tcp_t *, tcp, int32_t, TCPS_ESTABLISHED);
tcp->tcp_state = TCPS_ESTABLISHED;
tcp->tcp_valid_bits &= ~TCP_ISS_VALID;
/* Fuse when both sides are in ESTABLISHED state */
if (tcp->tcp_loopback && do_tcp_fusion)
*** 15051,15060 ****
--- 15136,15148 ----
if (tcp->tcp_state > TCPS_ESTABLISHED) {
switch (tcp->tcp_state) {
case TCPS_FIN_WAIT_1:
if (tcp->tcp_fin_acked) {
+ DTRACE_TCP4(state__change, void, NULL,
+ conn_t *, NULL, tcp_t *, tcp, int32_t,
+ TCPS_FIN_WAIT_2);
tcp->tcp_state = TCPS_FIN_WAIT_2;
/*
* We implement the non-standard BSD/SunOS
* FIN_WAIT_2 flushing algorithm.
* If there is no user attached to this
*** 15083,15092 ****
--- 15171,15183 ----
return;
}
goto xmit_check;
case TCPS_CLOSING:
if (tcp->tcp_fin_acked) {
+ DTRACE_TCP4(state__change, void, NULL,
+ conn_t *, NULL, tcp_t *, tcp, int32_t,
+ TCPS_TIME_WAIT);
tcp->tcp_state = TCPS_TIME_WAIT;
/*
* Unconditionally clear the exclusive binding
* bit so this TIME-WAIT connection won't
* interfere with new ones.
*** 15128,15147 ****
--- 15219,15247 ----
!TCP_IS_DETACHED(tcp) && (!tcp->tcp_hard_binding))
flags |= TH_ORDREL_NEEDED;
switch (tcp->tcp_state) {
case TCPS_SYN_RCVD:
case TCPS_ESTABLISHED:
+ DTRACE_TCP4(state__change, void, NULL,
+ conn_t *, NULL, tcp_t *, tcp, int32_t,
+ TCPS_CLOSE_WAIT);
tcp->tcp_state = TCPS_CLOSE_WAIT;
/* Keepalive? */
break;
case TCPS_FIN_WAIT_1:
if (!tcp->tcp_fin_acked) {
+ DTRACE_TCP4(state__change, void, NULL,
+ conn_t *, NULL, tcp_t *, tcp,
+ int32_t, TCPS_CLOSING);
tcp->tcp_state = TCPS_CLOSING;
break;
}
/* FALLTHRU */
case TCPS_FIN_WAIT_2:
+ DTRACE_TCP4(state__change, void, NULL,
+ conn_t *, NULL, tcp_t *, tcp, int32_t,
+ TCPS_TIME_WAIT);
tcp->tcp_state = TCPS_TIME_WAIT;
/*
* Unconditionally clear the exclusive binding
* bit so this TIME-WAIT connection won't
* interfere with new ones.
*** 15998,16007 ****
--- 16098,16109 ----
default:
panic("tcp_bind_failed: unexpected TPI type");
/*NOTREACHED*/
}
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL, tcp_t *, tcp,
+ int32_t, TCPS_IDLE);
tcp->tcp_state = TCPS_IDLE;
if (tcp->tcp_ipversion == IPV4_VERSION)
tcp->tcp_ipha->ipha_src = 0;
else
V6_SET_ZERO(tcp->tcp_ip6h->ip6_src);
*** 16040,16049 ****
--- 16142,16152 ----
mblk_t *mdti;
mblk_t *lsoi;
int retval;
mblk_t *ire_mp;
tcp_stack_t *tcps = tcp->tcp_tcps;
+ uint_t ip_hdr_len;
switch (mp->b_datap->db_type) {
case M_PROTO:
case M_PCPROTO:
ASSERT((uintptr_t)(mp->b_wptr - rptr) <= (uintptr_t)INT_MAX);
*** 16224,16233 ****
--- 16327,16354 ----
TCP_RECORD_TRACE(tcp, syn_mp,
TCP_TRACE_SEND_PKT);
mblk_setcred(syn_mp, cr);
DB_CPID(syn_mp) = pid;
+
+ /*
+ * DTrace sending the first SYN as a
+ * tcp:::connect-request event. For DTrace
+ * only, the IP header length is found
+ * so that the TCP header can be retrieved.
+ */
+ if (tcp->tcp_ipversion == IPV4_VERSION)
+ ip_hdr_len = IPH_HDR_LENGTH(
+ (ipha_t *)syn_mp->b_rptr);
+ else
+ ip_hdr_len = ip_hdr_length_v6(mp,
+ (ip6_t *)syn_mp->b_rptr);
+ DTRACE_TCP5(connect__request, mblk_t *, NULL,
+ conn_t *, NULL, void_ip_t *,
+ syn_mp->b_rptr, tcp_t *, tcp, tcph_t *,
+ &syn_mp->b_rptr[ip_hdr_len]);
+
tcp_send_data(tcp, tcp->tcp_wq, syn_mp);
}
after_syn_sent:
/*
* A trailer mblk indicates a waiting client upstream.
*** 17843,17852 ****
--- 17964,17975 ----
V6_SET_ZERO(tcp->tcp_ip6h->ip6_src);
}
V6_SET_ZERO(tcp->tcp_ip_src_v6);
bzero(tcp->tcp_tcph->th_lport, sizeof (tcp->tcp_tcph->th_lport));
tcp_bind_hash_remove(tcp);
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL, tcp_t *, tcp,
+ int32_t, TCPS_IDLE);
tcp->tcp_state = TCPS_IDLE;
tcp->tcp_mdt = B_FALSE;
/* Send M_FLUSH according to TPI */
(void) putnextctl1(tcp->tcp_rq, M_FLUSH, FLUSHRW);
connp = tcp->tcp_connp;
*** 19521,19530 ****
--- 19644,19654 ----
uint32_t hcksum_txflags = 0;
mblk_t *ire_fp_mp;
uint_t ire_fp_mp_len;
tcp_stack_t *tcps = tcp->tcp_tcps;
ip_stack_t *ipst = tcps->tcps_netstack->netstack_ip;
+ uint_t ip_hdr_len;
ASSERT(DB_TYPE(mp) == M_DATA);
if (DB_CRED(mp) == NULL)
mblk_setcred(mp, CONN_CRED(connp));
*** 19531,19540 ****
--- 19655,19676 ----
ipha = (ipha_t *)mp->b_rptr;
src = ipha->ipha_src;
dst = ipha->ipha_dst;
+ if (tcp->tcp_ipversion == IPV4_VERSION) {
+ DTRACE_TCP5(send, mblk_t *, NULL, conn_t *, NULL,
+ void_ip_t *, ipha, tcp_t *, tcp, tcph_t *,
+ &mp->b_rptr[IPH_HDR_LENGTH(mp->b_rptr)]);
+ if (tcp->tcp_dtrace_connect_established) {
+ DTRACE_TCP5(connect__established, mblk_t *, NULL,
+ conn_t *, NULL, void_ip_t *, ipha, tcp_t *, tcp,
+ tcph_t *, &mp->b_rptr[IPH_HDR_LENGTH(mp->b_rptr)]);
+ tcp->tcp_dtrace_connect_established = B_FALSE;
+ }
+ }
+
/*
* Drop off fast path for IPv6 and also if options are present or
* we need to resolve a TS label.
*/
if (tcp->tcp_ipversion != IPV4_VERSION ||
*** 19546,19555 ****
--- 19682,19706 ----
ipha->ipha_version_and_hdr_length != IP_SIMPLE_HDR_VERSION ||
IPP_ENABLED(IPP_LOCAL_OUT, ipst)) {
if (tcp->tcp_snd_zcopy_aware)
mp = tcp_zcopy_disable(tcp, mp);
TCP_STAT(tcps, tcp_ip_send);
+
+ if (tcp->tcp_ipversion == IPV6_VERSION) {
+ ip_hdr_len = ip_hdr_length_v6(mp, (ip6_t *)mp->b_rptr);
+ DTRACE_TCP5(send, mblk_t *, NULL, conn_t *, NULL,
+ void_ip_t *, mp->b_rptr, tcp_t *, tcp, tcph_t *,
+ &mp->b_rptr[ip_hdr_len]);
+ if (tcp->tcp_dtrace_connect_established) {
+ DTRACE_TCP5(connect__established, mblk_t *,
+ NULL, conn_t *, NULL, void_ip_t *,
+ mp->b_rptr, tcp_t *, tcp, tcph_t *,
+ &mp->b_rptr[ip_hdr_len]);
+ tcp->tcp_dtrace_connect_established = B_FALSE;
+ }
+ }
+
CALL_IP_WPUT(connp, q, mp);
return;
}
if (!tcp_send_find_ire_ill(tcp, mp, &ire, &ill)) {
*** 20954,20963 ****
--- 21105,21117 ----
/*
* tcp state must be ESTABLISHED
* in order for us to get here in
* the first place.
*/
+ DTRACE_TCP4(state__change, void, NULL,
+ conn_t *, NULL, tcp_t *, tcp,
+ int32_t, TCPS_FIN_WAIT_1);
tcp->tcp_state = TCPS_FIN_WAIT_1;
/*
* Upon returning from this routine,
* tcp_wput_data() will set tcp_snxt
*** 21589,21598 ****
--- 21743,21755 ----
*up = 0;
IP_CKSUM_XMIT_FAST(ire->ire_ipversion, hcksum_txflags, mp, ipha, up,
IPPROTO_TCP, IP_SIMPLE_HDR_LENGTH, ntohs(ipha->ipha_length), cksum);
+ DTRACE_TCP5(send, mblk_t *, NULL, conn_t *, NULL, void_ip_t *, ipha,
+ tcp_t *, tcp, tcph_t *, &mp->b_rptr[IPH_HDR_LENGTH(mp->b_rptr)]);
+
/*
* Append LSO flag to DB_LSOFLAGS(mp) and set the mss to DB_LSOMSS(mp).
*/
DB_LSOFLAGS(mp) |= HW_LSO;
DB_LSOMSS(mp) = mss;
*** 23234,23243 ****
--- 23391,23407 ----
freemsg(ipsec_mp);
return;
}
ipsec_mp = nmp;
+ DTRACE_TCP5(send, mblk_t *, NULL, conn_t *, NULL, void_ip_t *,
+ mp->b_rptr, tcp_t *, NULL, tcph_t *, tcph);
+ if (tcph->th_flags[0] == (TH_RST|TH_ACK)) {
+ DTRACE_TCP5(accept__refused, mblk_t *, NULL, conn_t *, NULL,
+ void_ip_t *, mp->b_rptr, tcp_t *, NULL, tcph_t *, tcph);
+ }
+
/*
* NOTE: one might consider tracing a TCP packet here, but
* this function has no active TCP state and no tcp structure
* that has a trace buffer. If we traced here, we would have
* to keep a local trace buffer in tcp_record_trace().
*** 23454,23463 ****
--- 23618,23634 ----
tcph = (tcph_t *)&rptr[ip_hdr_len];
seg_seq = BE32_TO_U32(tcph->th_seq);
seg_ack = BE32_TO_U32(tcph->th_ack);
flags = tcph->th_flags[0];
+ /*
+ * DTrace this "unknown" segment as a tcp:::receive, as we did
+ * just receive something that was TCP.
+ */
+ DTRACE_TCP5(receive, mblk_t *, NULL, conn_t *, NULL, void_ip_t *, rptr,
+ tcp_t *, NULL, tcph_t *, tcph);
+
seg_len = msgdsize(mp) - (TCP_HDR_LENGTH(tcph) + ip_hdr_len);
if (flags & TH_RST) {
freemsg(ipsec_mp);
} else if (flags & TH_ACK) {
tcp_xmit_early_reset("no tcp, reset",
*** 23791,23803 ****
--- 23962,23980 ----
if (!tcp->tcp_fin_sent) {
tcp->tcp_fin_sent = B_TRUE;
switch (tcp->tcp_state) {
case TCPS_SYN_RCVD:
case TCPS_ESTABLISHED:
+ DTRACE_TCP4(state__change, void, NULL,
+ conn_t *, NULL, tcp_t *, tcp,
+ int32_t, TCPS_FIN_WAIT_1);
tcp->tcp_state = TCPS_FIN_WAIT_1;
break;
case TCPS_CLOSE_WAIT:
+ DTRACE_TCP4(state__change, void, NULL,
+ conn_t *, NULL, tcp_t *, tcp,
+ int32_t, TCPS_LAST_ACK);
tcp->tcp_state = TCPS_LAST_ACK;
break;
}
if (tcp->tcp_suna == tcp->tcp_snxt)
TCP_TIMER_RESTART(tcp, tcp->tcp_rto);
*** 24143,24152 ****
--- 24320,24331 ----
/*
* Only initialize the necessary info in those structures. Note
* that since INADDR_ANY is all 0, we do not need to set
* tcp_bound_source to INADDR_ANY here.
*/
+ DTRACE_TCP4(state__change, void, NULL, conn_t *, NULL, tcp_t *, tcp,
+ int32_t, TCPS_BOUND);
tcp->tcp_state = TCPS_BOUND;
tcp->tcp_lport = port;
tcp->tcp_exclbind = 1;
tcp->tcp_reserved_port = 1;