MINI SHELL

Server : Apache/2.2.2 (Fedora)
System : Linux App1.pathumtani.go.th 2.6.20-1.2320.fc5smp #1 SMP Tue Jun 12 19:40:16 EDT 2007 i686
User : apache ( 48)
PHP Version : 5.2.9
Disable Function : NONE
Directory :  /usr/share/systemtap/tapset/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //usr/share/systemtap/tapset/tcp.stp
// TCP tapset
// Copyright (C) 2006 IBM Corp.
// Copyright (C) 2006 Intel Corporation.
//
// This file is part of systemtap, and is free software.  You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.

%{
#include <linux/version.h>
#include <net/sock.h>
#include <net/tcp.h>
#include <net/ip.h>
%}

// Get retransmission timeout in usecs. RTO is initialized from default
// retransmission time, but can be adjusted (increased) each time we 
// retransmit. It should always be less than the max value of TCP retransmission 
// timeout (TCP_RTO_MAX)
function tcp_get_info_rto:long(sock:long)
%{
	unsigned long ptr = (unsigned long) THIS->sock;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
	struct tcp_opt *tp = tcp_sk((struct sock *)ptr);
	THIS->__retvalue = (int64_t) jiffies_to_usecs(tp->rto);
#else
	const struct inet_connection_sock *icsk = inet_csk((struct sock *)ptr);
	THIS->__retvalue = (int64_t) jiffies_to_usecs(icsk->icsk_rto);
#endif
%}

//Get congestion window segment size. Initial value of congestion window size 
//typically set to one segment (i.e., slow start algorithm, each segment can be 512 bytes).
//This congestion window size can be dynamically increased based on whether TCP
//is performing slow start or congestion avoidance. 
function tcp_get_info_snd_cwnd:long(sock:long)
%{
	unsigned long ptr = (unsigned long) THIS->sock;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
	struct tcp_opt *tp = tcp_sk((struct sock *)ptr);
#else
	struct tcp_sock *tp = tcp_sk((struct sock *)ptr);
#endif
	THIS->__retvalue = (int64_t) tp->snd_cwnd;
%}

//
//Definitions of the TCP protocol sk_state field listed below.
//
//     TCP_ESTABLISED = 1,   Normal data transfer
//     TCP_SYN_SENT   = 2,   App. has started to open a connection
//     TCP_SYN_RECV   = 3,   A connection request has arrived; wait for ACK
//     TCP_FIN_WAIT1  = 4,   App. has said it is finished
//     TCP_FIN_WAIT2  = 5,   The other side has agreed to close
//     TCP_TIME_WAIT  = 6,   Wait for all packets to die off
//     TCP_CLOSE      = 7,   No connection is active or pending 
//     TCP_CLOSE_WAIT = 8,   The other side has initiated a release
//     TCP_LAST_ACK   = 9,   Last ACK, wait for all packets to die off
//     TCP_LISTEN     = 10,  Waiting for incoming call
//     TCP_CLOSING    = 11,  Both sides have tried to close simultaneously
//     TCP_MAX_STATES = 12   Max states number
// 
function tcp_ts_get_info_state:long(sock:long)
%{
        unsigned long ptr = (unsigned long) THIS->sock;
	struct sock * sk =  (struct sock *) ptr; 
	
	THIS->__retvalue = (int64_t) sk->sk_state;
%}


// Get slow start threshold size.  If cwnd size is less than or equal to
// threshold size, then TCP is in slow start; otherwise TCP is in congestion
// avoidance.
function tcp_ts_get_info_snd_ssthresh:long(sock:long)
%{
	unsigned long ptr = (unsigned long) THIS->sock;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
	struct tcp_opt *tp = tcp_sk((struct sock *)ptr);
#else
	struct tcp_sock *tp = tcp_sk((struct sock *)ptr);
#endif

	THIS->__retvalue = (int64_t) tp->snd_ssthresh;
%}

// Get receiver's advertised segment size.  TCP typically never sends more
// than what receiver can accept.
function tcp_ts_get_info_rcv_mss:long(sock:long)
%{
	unsigned long ptr = (unsigned long) THIS->sock;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
	struct tcp_opt *tp = tcp_sk((struct sock *)ptr);
	THIS->__retvalue = (int64_t) tp->ack.rcv_mss;
#else
	const struct inet_connection_sock *icsk = inet_csk((struct sock *)ptr);
	THIS->__retvalue = (int64_t) icsk->icsk_ack.rcv_mss;
#endif
%}

// probe tcp.sendmsg
//
//  Fires whenever sending a tcp message  
//
// Context:
//  The process which sends a tcp message 
//
// Arguments:
//  sock         - network socket 
//  size         - number of bytes to send  
//
probe tcp.sendmsg = kernel.function("tcp_sendmsg") {
	sock    = $sk
	size    = $size
}

// probe tcp.sendmsg.return
//
//  Fires whenever sending message is done 
//
// Context:
//  The process which sends a tcp message
//
// Arguments:
//  size         - number of bytes sent 
//
probe tcp.sendmsg.return = kernel.function("tcp_sendmsg").return {
	size = $return 
}

// probe tcp.recvmsg
//
//  Fires whenever a message is received 
//
// Context:
//  The process which receives a tcp message
//
// Arguments:
//  sock         - network socket
//  size         - number of bytes to be received  
//
probe tcp.recvmsg = kernel.function("tcp_recvmsg") {
	sock    = $sk
	size    = $len
}

// probe tcp.recvmsg.return
//
//  Fires whenever message receiving is done 
//
// Context:
//  The process which receives a tcp message
//
// Arguments:
//  size         - number of bytes received
//
probe tcp.recvmsg.return = kernel.function("tcp_recvmsg").return {
	size = $return
}

// probe tcp.disconnect
//
//  Fires whenever tcp is disconnected 
//
// Context:
//  The process which disconnects tcp 
//
// Arguments:
// sock       - network socket 
// flags      - TCP flags (e.g. FIN, etc)  
//
probe tcp.disconnect = kernel.function("tcp_disconnect") {
	sock  = $sk
	flags = $flags
}

// probe tcp.disconnect.return
//
// Fires when returning from tcp.disconnect 
//
// Context:
//  The process which disconnects tcp
// 
// Arguments:
//  ret         - error code (0: no error) 
//
probe tcp.disconnect.return = kernel.function("tcp_disconnect").return {
	ret = $return 
}

Anon7 - 2021