summaryrefslogtreecommitdiffstats
path: root/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/ip/tcprst.d
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-11 08:17:27 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-11 08:17:27 +0000
commitf215e02bf85f68d3a6106c2a1f4f7f063f819064 (patch)
tree6bb5b92c046312c4e95ac2620b10ddf482d3fa8b /src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/ip/tcprst.d
parentInitial commit. (diff)
downloadvirtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.tar.xz
virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.zip
Adding upstream version 7.0.14-dfsg.upstream/7.0.14-dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/ip/tcprst.d')
-rwxr-xr-xsrc/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/ip/tcprst.d284
1 files changed, 284 insertions, 0 deletions
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/ip/tcprst.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/ip/tcprst.d
new file mode 100755
index 00000000..a2d88e1c
--- /dev/null
+++ b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/ip/tcprst.d
@@ -0,0 +1,284 @@
+#!/usr/sbin/dtrace -Cqs
+/*
+ * 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 2008 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma D option dynvarsize=64m
+
+#define TH_RST 0x04
+#define MAX_RECORDS 10
+#define M_CTL 0x0d
+
+#define PRINT_MAIN_HEADER() \
+ (printf("\n%-25s %-6s %-25s %-6s %-10s %-10s %8s %8s\n", \
+ "LADDR", "LPORT", "RADDR", "RPORT", "ISS", "IRS", \
+ "SND_CNT", "RCV_CNT"))
+
+#define PRINT_RECORD_HEADER() \
+ (printf("%-20s %-20s %-3s %15s %15s %8s %8s %5s\n", \
+ "PROBENAME", "TIME", "S/R", "SEQ", "ACK", "DATALEN", \
+ "WND", "FLAGS"))
+
+#define PRINT_MAIN_HEADER_VALUES() \
+ (printf("%-25s %-6d %-25s %-6d %-10d %-10d %8d %8d\n", \
+ laddr[self->conn_id], lport[self->conn_id], \
+ faddr[self->conn_id], fport[self->conn_id], \
+ iss[self->conn_id], irs[self->conn_id], \
+ send_count[self->conn_id], recv_count[self->conn_id]))
+
+#define PRINT_HEADER() \
+ PRINT_MAIN_HEADER(); PRINT_MAIN_HEADER_VALUES(); \
+ PRINT_RECORD_HEADER()
+
+#define PRINT_RECORD(i) \
+ (printf("%-20s %-20Y %-3s %15d %15d %8d %8d %2x\n", \
+ probe_name[self->conn_id, i], \
+ conn_time[self->conn_id, i], \
+ send_recv[self->conn_id, i], \
+ seqno[self->conn_id, i], \
+ ack[self->conn_id, i], \
+ datalen[self->conn_id, i], \
+ wnd[self->conn_id, i], \
+ flags[self->conn_id, i]))
+
+tcp-trace-*
+{
+ /* extract connection details */
+
+ this->mp = (mblk_t *)arg0;
+ this->mp = (this->mp->b_datap->db_type == M_CTL?
+ this->mp->b_cont : this->mp);
+ self->tcpp = (tcp_t *)arg1;
+ this->connp = (conn_t *)self->tcpp->tcp_connp;
+
+ self->iph = (ipha_t *)this->mp->b_rptr;
+ this->iph_length =
+ (int)(((ipha_t *)self->iph)->ipha_version_and_hdr_length
+ & 0xF) << 2;
+ self->tcph = (tcpha_t *)((char *)self->iph + this->iph_length);
+ this->tcph_length =
+ (((tcph_t *)self->tcph)->th_offset_and_rsrvd[0] >>2) &(0xF << 2);
+
+ /* ports */
+ self->i_lport = ntohs(this->connp->u_port.tcpu_ports.tcpu_lport);
+ self->i_fport = ntohs(this->connp->u_port.tcpu_ports.tcpu_fport);
+
+ /* IP addresses */
+ this->i_fad = (in6_addr_t *)&this->connp->connua_v6addr.connua_faddr;
+ this->i_lad = (in6_addr_t *)&this->connp->connua_v6addr.connua_laddr;
+
+ /* the address would either be IPv6 or IPv4-mapped-IPv6 */
+ self->i_faddr = inet_ntop(AF_INET6, (void *)this->i_fad);
+ self->i_laddr = inet_ntop(AF_INET6, (void *)this->i_lad);
+
+ /* create connection identifier, so we can track packets by conn */
+ self->conn_id = (uint64_t)self->tcpp->tcp_connp;
+}
+
+tcp-trace-*
+/first[self->conn_id] == 0/
+{
+ /* initialize counters - this is the first packet for this connection */
+ pcount[self->conn_id] = -1;
+ rollover[self->conn_id] = 0;
+ end_ptr[self->conn_id] = 0;
+ num[self->conn_id] = 0;
+
+ first[self->conn_id] = 1;
+
+ /* connection info */
+ laddr[self->conn_id] = self->i_laddr;
+ faddr[self->conn_id] = self->i_faddr;
+ lport[self->conn_id] = self->i_lport;
+ fport[self->conn_id] = self->i_fport;
+ iss[self->conn_id] = self->tcpp->tcp_iss;
+ irs[self->conn_id] = self->tcpp->tcp_irs;
+
+}
+
+tcp-trace-*
+{
+ /* counters, to keep track of how much info to dump */
+ pcount[self->conn_id]++;
+ rollover[self->conn_id] |= pcount[self->conn_id]/MAX_RECORDS;
+ pcount[self->conn_id] = pcount[self->conn_id]%MAX_RECORDS;
+ self->pcount = pcount[self->conn_id];
+ end_ptr[self->conn_id] = self->pcount;
+ num[self->conn_id] = (rollover[self->conn_id]?
+ MAX_RECORDS : pcount[self->conn_id] + 1);
+ conn_time[self->conn_id, self->pcount] = walltimestamp;
+
+ /* tcp state info */
+ seqno[self->conn_id, self->pcount] = ntohl(self->tcph->tha_seq);
+ ack[self->conn_id, self->pcount] = ntohl(self->tcph->tha_ack);
+ datalen[self->conn_id, self->pcount] = ntohs(self->iph->ipha_length);
+ wnd[self->conn_id, self->pcount] = ntohs(self->tcph->tha_win);
+ probe_name[self->conn_id, self->pcount] = probename;
+
+ /* flag 0x04 indicates a RST packet */
+ flags[self->conn_id, self->pcount] = self->tcph->tha_flags;
+ self->flags = self->tcph->tha_flags;
+}
+
+tcp-trace-send
+{
+ send_count[self->conn_id]++;
+ send_recv[self->conn_id, self->pcount] = "S";
+}
+
+tcp-trace-recv
+{
+ recv_count[self->conn_id]++;
+ send_recv[self->conn_id, self->pcount] = "R";
+}
+
+tcp-trace-*
+/(self->flags & TH_RST)/
+{
+ PRINT_HEADER();
+
+ self->i = (end_ptr[self->conn_id] + MAX_RECORDS - num[self->conn_id]
+ + 1)%MAX_RECORDS;
+}
+
+tcp-trace-*
+/(self->flags & TH_RST) && (num[self->conn_id] >= 10)/
+{
+ PRINT_RECORD(self->i);
+ self->i = (self->i + 1)%MAX_RECORDS;
+
+ num[self->conn_id]--;
+}
+
+tcp-trace-*
+/(self->flags & TH_RST) && (num[self->conn_id] >= 9)/
+{
+ PRINT_RECORD(self->i);
+ self->i = (self->i + 1)%MAX_RECORDS;
+
+ num[self->conn_id]--;
+}
+
+tcp-trace-*
+/(self->flags & TH_RST) && (num[self->conn_id] >= 8)/
+{
+ PRINT_RECORD(self->i);
+ self->i = (self->i + 1)%MAX_RECORDS;
+
+ num[self->conn_id]--;
+}
+
+tcp-trace-*
+/(self->flags & TH_RST) && (num[self->conn_id] >= 7)/
+{
+ PRINT_RECORD(self->i);
+ self->i = (self->i + 1)%MAX_RECORDS;
+
+ num[self->conn_id]--;
+}
+
+tcp-trace-*
+/(self->flags & TH_RST) && (num[self->conn_id] >= 6)/
+{
+ PRINT_RECORD(self->i);
+ self->i = (self->i + 1)%MAX_RECORDS;
+
+ num[self->conn_id]--;
+}
+
+tcp-trace-*
+/(self->flags & TH_RST) && (num[self->conn_id] >= 5)/
+{
+ PRINT_RECORD(self->i);
+ self->i = (self->i + 1)%MAX_RECORDS;
+
+ num[self->conn_id]--;
+}
+
+tcp-trace-*
+/(self->flags & TH_RST) && (num[self->conn_id] >= 4)/
+{
+ PRINT_RECORD(self->i);
+ self->i = (self->i + 1)%MAX_RECORDS;
+
+ num[self->conn_id]--;
+}
+
+tcp-trace-*
+/(self->flags & TH_RST) && (num[self->conn_id] >= 3)/
+{
+ PRINT_RECORD(self->i);
+ self->i = (self->i + 1)%MAX_RECORDS;
+
+ num[self->conn_id]--;
+}
+
+tcp-trace-*
+/(self->flags & TH_RST) && (num[self->conn_id] >= 2)/
+{
+ PRINT_RECORD(self->i);
+ self->i = (self->i + 1)%MAX_RECORDS;
+
+ num[self->conn_id]--;
+}
+
+tcp-trace-*
+/(self->flags & TH_RST) && (num[self->conn_id] >= 1)/
+{
+ PRINT_RECORD(self->i);
+ self->i = (self->i + 1)%MAX_RECORDS;
+
+ num[self->conn_id]--;
+ self->reset = self->conn_id;
+}
+
+tcp-trace-*
+/self->reset/
+{
+ pcount[self->reset] = -1;
+ rollover[self->reset] = 0;
+ end_ptr[self->reset] = 0;
+ num[self->reset] = 0;
+
+ self->reset = 0;
+}
+
+conn-destroy
+{
+ /* clear old connection state */
+ this->conn_id = (uint64_t)arg0;
+
+ pcount[this->conn_id] = -1;
+ rollover[this->conn_id] = 0;
+ end_ptr[this->conn_id] = 0;
+ num[this->conn_id] = 0;
+ first[this->conn_id] = 0;
+
+ laddr[this->conn_id] = 0;
+ faddr[this->conn_id] = 0;
+ lport[this->conn_id] = 0;
+ fport[this->conn_id] = 0;
+ iss[this->conn_id] = 0;
+ irs[this->conn_id] = 0;
+}