summaryrefslogtreecommitdiffstats
path: root/tapset
diff options
context:
space:
mode:
Diffstat (limited to 'tapset')
-rw-r--r--tapset/ipmib.stp514
-rw-r--r--tapset/linuxmib.stp102
-rw-r--r--tapset/tcpmib.stp352
3 files changed, 968 insertions, 0 deletions
diff --git a/tapset/ipmib.stp b/tapset/ipmib.stp
new file mode 100644
index 00000000..3430a8a1
--- /dev/null
+++ b/tapset/ipmib.stp
@@ -0,0 +1,514 @@
+/*
+ * Copyright (C) 2009 IBM Corp.
+ * 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.
+ *
+ * Version 1.0 wilder@us.ibm.com 2009-07-06
+ */
+
+%{ /* pure */
+#include <net/route.h>
+#include <linux/skbuff.h>
+#include <linux/icmp.h>
+#include <linux/rtnetlink.h>
+#include <linux/tcp.h>
+%}
+
+
+/* Commented globals represent statistics that are not supported in this
+ * version.
+ */
+global InReceives
+// global InHdrErrors
+// global InTooBigErrors
+global InNoRoutes
+global InAddrErrors
+global InUnknownProtos
+// global InTruncatedPkts
+global InDiscards // included counts of InHdrErrors InTruncatedPkts
+// global InDelivers
+global ForwDatagrams
+global OutRequests
+// global OutDiscards
+// global OutNoRoutes
+global ReasmTimeout
+global ReasmReqds
+//global ReasmOKs
+// global ReasmFails
+global FragOKs
+global FragFails
+// global FragCreates
+global InMcastPkts
+global OutMcastPkts
+global InBcastPkts
+global OutBcastPkts
+
+/**
+ * sfunction ipmib_remote_addr - Get the remote ip address.
+ *
+ * Returns the remote ip address from an sk_buff.
+ * @skb: Pointer to a struct sk_buff.
+ *
+ */
+function ipmib_remote_addr:long (skb:long, SourceIsLocal:long)
+{
+ iphdr = __get_skb_iphdr(skb);
+ if ( SourceIsLocal )
+ return ntohl(__ip_skb_daddr(iphdr));
+ return ntohl(__ip_skb_saddr(iphdr));
+}
+
+/**
+ * sfunction ipmib_local_addr - Get the local ip address.
+ *
+ * Returns the local ip address from an sk_buff.
+ * @skb: Pointer to a struct sk_buff.
+ *
+ */
+function ipmib_local_addr:long (skb:long, SourceIsLocal:long)
+{
+ iphdr = __get_skb_iphdr(skb);
+ if ( SourceIsLocal )
+ return ntohl(__ip_skb_saddr(iphdr));
+ return ntohl(__ip_skb_daddr(iphdr));
+}
+
+/**
+ * sfunction ipmib_tcp_remote_port - Get the remote tcp port.
+ *
+ * Returns the remote tcp port from an sk_buff.
+ * @skb: Pointer to a struct sk_buff.
+ *
+ */
+function ipmib_tcp_remote_port:long (skb:long, SourceIsLocal:long)
+{
+ th = _plunge_into_tcphdr(skb);
+ if ( SourceIsLocal )
+ return _tcphdr_get_dport(th);
+ return _tcphdr_get_sport(th);
+}
+
+/**
+ * sfunction ipmib_tcp_local_port - Get the local tcp port.
+ *
+ * Returns the local tcp port from an sk_buff.
+ * @skb: Pointer to a struct sk_buff.
+ *
+ */
+function ipmib_tcp_local_port:long (skb:long, SourceIsLocal:long)
+{
+ th = _plunge_into_tcphdr(skb);
+ if ( SourceIsLocal )
+ return _tcphdr_get_sport(th);
+ return _tcphdr_get_dport(th);
+}
+
+/**
+ * sfunction ipmib_get_proto - Get the protocol value
+ *
+ * Returns the protocol value from ip header.
+ * @skb: Pointer to a struct sk_buff.
+ *
+ */
+function ipmib_get_proto:long (skb:long)
+{
+ iphdr = __get_skb_iphdr(skb);
+ return __ip_skb_proto(iphdr);
+}
+
+/* Internal functions */
+
+/*
+ * We can't assume the pointer to the sk_buff->transport_header
+ * has been updated, so we must calculate the value from the network_header.
+ * The caller must verify the skb is for a tcpip packet.
+ */
+function _plunge_into_tcphdr:long (skb:long)
+%{
+ struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb;
+ /* as done by skb_network_header() */
+ #ifdef NET_SKBUFF_DATA_USES_OFFSET
+ THIS->__retvalue=(long)kread(&(skb->network_header)) +
+ (long)(kread(&(skb->head))) +
+ (long)sizeof(struct tcphdr);
+ #else
+ THIS->__retvalue=(long)kread(&(skb->network_header)) +
+ (long)sizeof(struct tcphdr);
+ #endif
+ CATCH_DEREF_FAULT();
+%}
+
+function _tcphdr_get_sport:long (th:long)
+%{ /* pure */
+ struct tcphdr *th = (struct tcphdr *) (long) THIS->th;
+ THIS->__retvalue = ntohs(kread(&(th->source)));
+ CATCH_DEREF_FAULT();
+%}
+
+function _tcphdr_get_dport:long (th:long)
+%{ /* pure */
+ struct tcphdr *th = (struct tcphdr *) (long) THIS->th;
+ THIS->__retvalue = ntohs(kread(&(th->dest)));
+ CATCH_DEREF_FAULT();
+%}
+
+function _ehostunreach:long ()
+%{
+ THIS->__retvalue = EHOSTUNREACH;
+%}
+
+function _enetunreach:long ()
+%{
+ THIS->__retvalue = ENETUNREACH;
+%}
+
+function _icmp_dest_unreach:long ()
+%{
+ THIS->__retvalue = ICMP_DEST_UNREACH;
+%}
+
+function _icmp_prot_unreach:long ()
+%{
+ THIS->__retvalue = ICMP_PROT_UNREACH;
+%}
+
+function _net_rx_drop:long ()
+%{
+ THIS->__retvalue = NET_RX_DROP;
+%}
+
+function _icmp_time_exceeded:long ()
+%{
+ THIS->__retvalue = ICMP_TIME_EXCEEDED;
+%}
+
+function _icmp_exc_fragtime:long ()
+%{
+ THIS->__retvalue = ICMP_EXC_FRAGTIME;
+%}
+
+function _rtn_multicast:long ()
+%{
+ THIS->__retvalue = RTN_MULTICAST;
+%}
+
+function _rtn_broadcast:long ()
+%{
+ THIS->__retvalue = RTN_BROADCAST;
+%}
+
+/**
+ * probe tcpmib.InReceives - Count an arriving packet.
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: InReceives
+ * MIB: IPSTATS_MIB_INRECEIVES
+ *
+ */
+probe ipmib.InReceives=kernel.function("ip_rcv")
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 0;
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) InReceives[key] += op;
+}
+
+/**
+ * probe tcpmib.InNoRoutes - Count an arriving packet with no matching socket.
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: InNoRoutes
+ * MIB: IPSTATS_MIB_INNOROUTES
+ *
+ */
+probe ipmib.InNoRoutes=kernel.function("ip_route_input").return
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 0;
+ if ( $return != -_enetunreach()) next;
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) InNoRoutes[key] += op;
+}
+
+/**
+ * probe tcpmib.InAddrErrors - Count arriving packets with an incorrect address.
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: InAddrErrors
+ * MIB: IPSTATS_MIB_INADDRERRORS
+ *
+ */
+probe ipmib.InAddrErrors=kernel.function("ip_route_input").return
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 0;
+ if ( $return != -_ehostunreach()) next;
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) InAddrErrors[key] += op;
+}
+
+/**
+ * probe tcpmib.InUnknownProtos - Count arriving packets with an unbound proto.
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: InUnknownProtos
+ * MIB: IPSTATS_MIB_INUNKNOWNPROTOS
+ *
+ */
+
+/* icmp_send() is called by ip_local_deliver_finish() */
+probe ipmib.InUnknownProtos=kernel.function("icmp_send")
+{
+ skb = $skb_in;
+ op = 1;
+ SourceIsLocal = 0;
+ if (($type==_icmp_dest_unreach())&&($code==_icmp_prot_unreach())){
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) InUnknownProtos[key] += op;
+ }
+}
+
+/**
+ * probe tcpmib.InDiscards - Count discarded inbound packets.
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: InDiscards
+ * MIB: STATS_MIB_INDISCARDS
+ *
+ */
+
+/*
+ This stat combines all instances of IPSTATS_MIB_INHDRERRORS,
+ IPSTATS_MIB_INTRUNCATEDPKTS, and STATS_MIB_INDISCARDS.
+*/
+probe ipmib.InDiscards=kernel.function("ip_rcv").return
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 0;
+ if ( $return != _net_rx_drop() ) next;
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) InDiscards[key] += op;
+}
+
+/**
+ * probe tcpmib.ForwDatagrams
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: ForwDatagrams
+ * MIB: IPSTATS_MIB_OUTFORWDATAGRAMS
+ *
+ */
+probe ipmib.ForwDatagrams=kernel.function("ip_forward_finish"),
+ kernel.function("ipmr_forward_finish")
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 0;
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) ForwDatagrams[key] += op;
+}
+
+/**
+ * probe tcpmib.OutRequests - Count a request to send a packet.
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: OutRequests
+ * MIB: IPSTATS_MIB_OUTREQUESTS
+ *
+ */
+probe ipmib.OutRequests=kernel.function("ip_output"),
+ kernel.function("ip_mc_output")
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 1;
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) OutRequests[key] += op;
+}
+
+/**
+ * probe tcpmib.ReasmTimeout
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: ReasmTimeout
+ * MIB: IPSTATS_MIB_REASMTIMEOUT
+ *
+ */
+probe ipmib.ReasmTimeout=kernel.function("icmp_send")
+{
+ skb = $skb_in;
+ op = 0;
+ SourceIsLocal = 1;
+ if(($type==_icmp_time_exceeded())&&($code==_icmp_exc_fragtime())){
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) ReasmTimeout[key] += op;
+ }
+}
+
+/**
+ * probe tcpmib.ReasmReqds
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: ReasmReqds
+ * MIB: IPSTATS_MIB_REASMREQDS
+ *
+ */
+probe ipmib.ReasmReqds=kernel.function("ip_defrag")
+{
+ skb = $skb;
+ op = 0;
+ SourceIsLocal = 1;
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) ReasmReqds[key] += op;
+}
+
+/**
+ * probe tcpmib.FragOKs
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: FragOKs
+ * MIB: IPSTATS_MIB_FRAGOKS
+ *
+ */
+probe ipmib.FragOKs=kernel.function("ip_fragment").return
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 1;
+ if ( $return ) next
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) FragOKs [key] += op;
+}
+
+/**
+ * probe tcpmib.FragFails
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: FragFails
+ * MIB: IPSTATS_MIB_FRAGFAILS
+ *
+ */
+probe ipmib.FragFails=kernel.function("ip_fragment").return
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 1;
+ if (!$return ) next
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) FragFails [key] += op;
+}
+
+function _input_route_type:long (skb:long)
+%{ /* pure */
+ struct rtable *rt;
+ struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb;
+ rt = (struct rtable *)kread(&(skb->rtable));
+ THIS->__retvalue = kread(&(rt->rt_type));
+ CATCH_DEREF_FAULT();
+%}
+
+function _output_route_type:long (skb:long)
+%{ /* pure */
+ struct rtable *rt;
+ struct dst_entry *dst;
+ struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb;
+ dst = (struct dst_entry *)kread(&(skb->dst));
+ rt = (struct rtable *)dst;
+ THIS->__retvalue = kread(&(rt->rt_type));
+ CATCH_DEREF_FAULT();
+%}
+
+/**
+ * probe tcpmib.InMcastPkts
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: InMcastPkts
+ * MIB: IPSTATS_MIB_INMCASTPKTS
+ *
+ */
+probe ipmib.InMcastPkts=kernel.function("ip_rcv_finish").return
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 0;
+ if ($return == _net_rx_drop()) next;
+ if (_input_route_type(skb) != _rtn_multicast()) next;
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) InMcastPkts[key] += op;
+}
+
+/**
+ * probe tcpmib.OutMcastPkts
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: OutMcastPkts
+ * MIB: IPSTATS_MIB_OUTMCASTPKTS
+ *
+ */
+probe ipmib.OutMcastPkts=kernel.function("ip_finish_output2")
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 1;
+ if (_output_route_type(skb) != _rtn_multicast()) next
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) OutMcastPkts[key] += op;
+}
+
+/**
+ * probe tcpmib.InBcastPkts
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: InBcastPkts
+ * MIB: IPSTATS_MIB_INBCASTPKTS
+ *
+ */
+probe ipmib.InBcastPkts=kernel.function("ip_rcv_finish").return
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 0;
+ if ($return == _net_rx_drop()) next;
+ if (_input_route_type(skb) != _rtn_broadcast()) next;
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) InBcastPkts[key] += op;
+}
+
+/**
+ * probe tcpmib.OutBcastPkts
+ * @skb: Pointer to the struct sk_buff being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: OutBcastPkts
+ * MIB: IPSTATS_MIB_OUTBCASTPKTS
+ *
+ */
+probe ipmib.OutBcastPkts=kernel.function("ip_finish_output2")
+{
+ skb = $skb;
+ op = 1;
+ SourceIsLocal = 1;
+ if (_output_route_type(skb) != _rtn_broadcast()) next
+ key = ipmib_filter_key(skb,op,SourceIsLocal);
+ if ( key ) OutBcastPkts[key] += op;
+}
diff --git a/tapset/linuxmib.stp b/tapset/linuxmib.stp
new file mode 100644
index 00000000..e19755a9
--- /dev/null
+++ b/tapset/linuxmib.stp
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2009 IBM Corp.
+ * 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.
+ *
+ * Version 1.0 wilder@us.ibm.com 2009-07-06
+ */
+
+global DelayedACKs /* LINUX_MIB_DELAYEDACKS */
+global ListenOverflows /* LINUX_MIB_LISTENOVERFLOWS */
+global ListenDrops /* LINUX_MIB_LISTENDROPS */
+global TCPMemoryPressures /* LINUX_MIB_TCPMEMORYPRESSURES */
+
+/**
+ * probe tcpmib.DelayedACKs - Count of delayed acks.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: DelayedACKs
+ * MIB: LINUX_MIB_DELAYEDACKS
+ *
+ */
+global indelack_timer
+probe linuxmib.DelayedACKs = _linuxmib.DelayedACKs.* {}
+
+probe _linuxmib.DelayedACKs.A = kernel.function("tcp_send_ack")
+{
+ sk=$sk
+ if ( !indelack_timer[sk] ) next
+ op=1
+ key = linuxmib_filter_key(sk,op);
+ if ( key ) DelayedACKs[key] += op;
+}
+
+probe _linuxmib.DelayedACKs.B = kernel.function("tcp_delack_timer")
+{
+ sk=$data
+ indelack_timer[sk]=1
+}
+
+probe _linuxmib.DelayedACKs.C = kernel.function("tcp_delack_timer").return
+{
+ sk=$data
+ indelack_timer[sk]=0;
+}
+
+/**
+ * probe tcpmib.ListenOverflows - Count of times a listen queue overflowed
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: ListenOverflows
+ * MIB: LINUX_MIB_LISTENOVERFLOWS
+ *
+ */
+probe linuxmib.ListenOverflows=kernel.function("tcp_v4_syn_recv_sock").return
+{
+ sk = $sk
+ if ( $return ) next
+ if ( $sk->sk_ack_backlog <= $sk->sk_max_ack_backlog ) next
+ op = 1;
+ key = linuxmib_filter_key(sk,op);
+ if ( key ) ListenOverflows[key] += op;
+}
+
+/**
+ * probe tcpmib.ListenDrops - Count of times conn request that were dropped.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: ListenDrops
+ * MIB: LINUX_MIB_LISTENDROPS
+ *
+ */
+probe linuxmib.ListenDrops=kernel.function("tcp_v4_syn_recv_sock").return
+{
+ sk = $sk
+ if ( $return ) next
+ op = 1;
+ key = linuxmib_filter_key(sk,op);
+ if ( key ) ListenDrops[key] += op;
+}
+
+/**
+ * probe tcpmib.TCPMemoryPressures - Count of times memory pressure was used.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: TCPMemoryPressures
+ * MIB: LINUX_MIB_TCPMEMORYPRESSURES
+ *
+ */
+probe linuxmib.TCPMemoryPressures=kernel.function("tcp_enter_memory_pressure")
+{
+ sk = $sk
+ op = 1;
+ if ( $tcp_memory_pressure ) next
+ key = linuxmib_filter_key(sk,op);
+ if ( key ) TCPMemoryPressures[key] += op;
+}
diff --git a/tapset/tcpmib.stp b/tapset/tcpmib.stp
new file mode 100644
index 00000000..e3e76900
--- /dev/null
+++ b/tapset/tcpmib.stp
@@ -0,0 +1,352 @@
+/*
+ * Copyright (C) 2009 IBM Corp.
+ * 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.
+ *
+ * Version 1.0 wilder@us.ibm.com 2009-07-06
+ */
+
+/* Global counter definitions for mib TCP_MIB. */
+
+%{
+#include <net/sock.h>
+#include <linux/tcp.h>
+#include <net/tcp_states.h>
+#include <linux/skbuff.h>
+#include <net/route.h>
+%}
+
+global ActiveOpens
+global AttemptFails
+global CurrEstab
+global EstabResets
+// global InErrs, this mib is not yet supported
+global InSegs
+global OutRsts
+global OutSegs
+global PassiveOpens
+global RetransSegs
+
+/**
+ * sfunction tcpmib_get_state - Get a socket's state.
+ *
+ * Returns the sk_state from a struct sock.
+ * @sk: Pointer to a struct sock.
+ *
+ */
+function tcpmib_get_state:long (sk:long)
+%{ /* pure */
+ struct sock *sk = (struct sock *)(long)THIS->sk;
+ THIS->__retvalue = kread(&(sk->sk_state));
+ CATCH_DEREF_FAULT();
+%}
+
+/**
+ * sfunction tcpmib_local_addr - Get the source address.
+ *
+ * Returns the saddr from a struct inet_sock.
+ * @sk: Pointer to a struct inet_sock.
+ *
+ */
+function tcpmib_local_addr:long(sk:long)
+%{ /* pure */
+ struct inet_sock *inet = (struct inet_sock *) (long) THIS->sk;
+ THIS->__retvalue = ntohl(kread(&(inet->saddr)));
+ CATCH_DEREF_FAULT();
+%}
+
+/**
+ * sfunction tcpmib_remote_addr - Get the remote address.
+ *
+ * Returns the daddr from a struct inet_sock.
+ * @sk: Pointer to a struct inet_sock.
+ *
+ */
+function tcpmib_remote_addr:long(sk:long)
+%{ /* pure */
+ struct inet_sock *inet = (struct inet_sock *) (long) THIS->sk;
+ THIS->__retvalue = ntohl(kread(&(inet->daddr)));
+ CATCH_DEREF_FAULT();
+%}
+
+/**
+ * sfunction tcpmib_local_port - Get the local port.
+ *
+ * Returns the sport from a struct inet_sock.
+ * @sk: Pointer to a struct inet_sock.
+ *
+ */
+function tcpmib_local_port:long(sk:long)
+%{ /* pure */
+ struct inet_sock *inet = (struct inet_sock *) (long) THIS->sk;
+ THIS->__retvalue = ntohs(kread(&(inet->sport)));
+ CATCH_DEREF_FAULT();
+%}
+
+/**
+ * sfunction tcpmib_remote_port - Get the remote port.
+ *
+ * Returns the dport from a struct inet_sock.
+ * @sk: Pointer to a struct inet_sock.
+ *
+ */
+function tcpmib_remote_port:long(sk:long)
+%{ /* pure */
+ struct inet_sock *inet = (struct inet_sock *) (long) THIS->sk;
+ THIS->__retvalue = ntohs(kread(&(inet->dport)));
+ CATCH_DEREF_FAULT();
+%}
+
+/**
+ * probe tcpmib.ActiveOpens - Count an active opening of a socket.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: ActiveOpens
+ * MIB: TCP_MIB_ACTIVEOPENS
+ *
+ */
+probe
+tcpmib.ActiveOpens=kernel.function("tcp_connect").return
+{
+ sk = $sk;
+ op = 1;
+ if ( $return ) next;
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) ActiveOpens[key] += op;
+}
+
+/**
+ * probe tcpmib.AttemptFails - Count a failed attempt to open a socket.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: AttemptFails
+ * MIB: TCP_MIB_ATTEMPTFAILS
+ *
+ */
+probe
+tcpmib.AttemptFails=kernel.function("tcp_done")
+{
+ sk = $sk;
+ state = tcpmib_get_state(sk);
+ op = 1;
+
+ TCP_SYN_SENT = 2;
+ TCP_SYN_RECV = 3;
+ if( state == TCP_SYN_SENT || state == TCP_SYN_RECV){
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) AttemptFails[key] += op;
+ }
+}
+
+/**
+ * probe tcpmib.CurrEstab - Update the count of open sockets.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: CurrEstab
+ * MIB: TCP_MIB_CURRESTAB
+ *
+ */
+probe
+tcpmib.CurrEstab=kernel.function("tcp_set_state")
+{
+ sk = $sk;
+ state = $state;
+ oldstate = tcpmib_get_state(sk);
+
+ TCP_ESTABLISHED = 1;
+ if ( oldstate == TCP_ESTABLISHED ) {
+ op = -1;
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) CurrEstab[key] += op;
+ } else {
+ if ( state == TCP_ESTABLISHED ) {
+ op = 1;
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) CurrEstab[key] += op;
+ }
+ }
+}
+
+/**
+ * probe tcpmib.EstabResets - Count the reset of a socket.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: EstabResets
+ * MIB: TCP_MIB_ESTABRESETS
+ *
+ */
+probe
+tcpmib.EstabResets=kernel.function("tcp_set_state")
+{
+ sk = $sk;
+ state = $state;
+ oldstate = tcpmib_get_state(sk);
+ op = 1;
+
+ TCP_CLOSE = 7;
+ TCP_CLOSE_WAIT = 8;
+ TCP_ESTABLISHED = 1;
+ if ( ( state == TCP_CLOSE ) &&
+ (oldstate == TCP_CLOSE_WAIT || oldstate == TCP_ESTABLISHED) ){
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) EstabResets[key] += op;
+ }
+}
+
+/**
+ * probe tcpmib.InSegs - Count an incomming tcp segment.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: InSegs
+ * MIB: TCP_MIB_INSEGS
+ *
+ */
+probe
+tcpmib.InSegs=kernel.function("__inet_lookup_established").return
+{
+ sk=$return
+ op=1
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) InSegs[key] += op;
+}
+
+/**
+ * probe tcpmib.OutRsts - Count the sending of a reset packet.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: OutRsts
+ * MIB: TCP_MIB_OUTRSTS
+ *
+ */
+probe
+tcpmib.OutRsts = tcpmib.OutRsts.A,
+ tcpmib.OutRsts.B { }
+
+function _rtn_local:long ()
+%{
+ THIS->__retvalue = RTN_LOCAL;
+%}
+
+function _is_reset:long (skb:long)
+%{ /* pure */
+ struct tcphdr *th;
+ struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb;
+
+ #ifdef NET_SKBUFF_DATA_USES_OFFSET
+ th = (struct tcphdr *)(kread(&(skb->network_header)) + kread(&(skb->head)));
+ #else
+ th = (struct tcphdr *)kread(&(skb->network_header));
+ #endif
+ THIS->__retvalue = th->rst;
+ CATCH_DEREF_FAULT();
+%}
+
+function _tcpmib_input_route_type:long (skb:long)
+%{ /* pure */
+ struct rtable *rt;
+ struct sk_buff *skb = (struct sk_buff *)(long)THIS->skb;
+ rt = (struct rtable *)kread(&(skb->rtable));
+ THIS->__retvalue = kread(&(rt->rt_type));
+ CATCH_DEREF_FAULT();
+%}
+
+/*
+ * note:
+ * tcp_v4_send_reset may be called with a NULL sk.
+ * This happens when sending a reset in response to a syn
+ * when no socket exists (for example the service is not running).
+ * Without a socket we can't count the reset.
+ */
+probe
+tcpmib.OutRsts.A=kernel.function("tcp_v4_send_reset")
+{
+ sk = $sk;
+ skb = $skb
+ op = 1;
+ if ( _is_reset(skb) ) next
+ if (_tcpmib_input_route_type($skb) != _rtn_local() )
+ next;
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) OutRsts[key] += op;
+}
+
+probe
+tcpmib.OutRsts.B= kernel.function("tcp_send_active_reset")
+{
+ /* Almost correct,
+ * If alloc_skb() fails it incorrectly bumps TCP_MIB_OUTRSTS,
+ */
+ sk = $sk;
+ op = 1;
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) OutRsts[key] += op;
+}
+
+/**
+ * probe tcpmib.OutSegs - Count the sending of a TCP segment.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: OutSegs
+ * MIB: TCP_MIB_OUTSEGS
+ *
+ */
+probe
+tcpmib.OutSegs=kernel.function("ip_queue_xmit").return
+{
+ if ( $return < 0 ) next;
+ sk = $skb->sk;
+ op = 1;
+
+ // Only count the events with protocol IPPROTO_TCP,6.
+ iphdr = __get_skb_iphdr($skb);
+ if( !(__ip_skb_proto(iphdr) == 6) ) next ;
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) OutSegs[key] += op;
+}
+
+/**
+ * probe tcpmib.PassiveOpens - Count the passive creation of a socket.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: PassiveOpens
+ * MIB: TCP_MIB_PASSIVEOPENS
+ *
+ */
+probe
+tcpmib.PassiveOpens=kernel.function("tcp_v4_syn_recv_sock").return
+{
+ sk = $return;
+ op = 1;
+ if ( !sk ) next;
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) PassiveOpens[key] += op;
+}
+
+/**
+ * probe tcpmib.RetransSegs - Count the retransmission of a TCP segment.
+ * @sk: Pointer to the struct sock being acted on.
+ * @op: Value to be added to the counter (Operation).
+ *
+ * Counter Name: RetransSegs
+ * MIB: TCP_MIB_RETRANSSEGS
+ *
+ */
+probe
+tcpmib.RetransSegs=kernel.function("tcp_retransmit_skb").return
+{
+ sk = $sk;
+ op = 1;
+ if ( $return ) next;
+ key = tcpmib_filter_key(sk,op);
+ if ( key ) RetransSegs[key] += op;
+}