This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Adding tcp features and a new IP tapset


Following some feedbacks received, i rebuild the patch with three main changes

1 - Created a patch against the SystemTap source (instead of acme's tree)
2 - Added few private functions, as they are being accepted, new functions
    will be send
3 - Converted almost everything to @cast() instead of embedded C

Thanks

--

Added functions to grab IP source and destination from a socket, and
functions to grab TCP source and destination port from a socket.

Also, used this function inside sobre TCP probe functions, as recvmsg,
to provide a richer set of field.

Signed-off-by: Breno Leitao <leitao@linux.vnet.ibm.com>
---
 tapset/ip.stp                                |   32 ++++++++++++++++++++++++
 tapset/tcp.stp                               |   34 ++++++++++++++++++++++++++
 testsuite/systemtap.examples/network/tcp.stp |   11 ++++++++
 3 files changed, 77 insertions(+), 0 deletions(-)
 create mode 100644 tapset/ip.stp
 create mode 100644 testsuite/systemtap.examples/network/tcp.stp

diff --git a/tapset/ip.stp b/tapset/ip.stp
new file mode 100644
index 0000000..1e2e263
--- /dev/null
+++ b/tapset/ip.stp
@@ -0,0 +1,32 @@
+// IP tapset
+// Copyright (C) 2009, IBM Inc.
+// Author : Breno Leitao <leitao@linux.vnet.ibm.com>
+//
+// This file is free software.  You can redistribute it and/or modify it under
+// the terms of the GNU General Public License (GPL), version 2.
+//
+// Based on previous work done by Arnaldo Carvalho de Melo <acme@redhat.com>
+
+/**
+ * sfunction ip_ntop - returns a string representation from an integer IP number
+ * @addr: the ip represented as an integer
+ */
+function ip_ntop:string (addr:long)
+%{
+        __be32 ip;
+
+        ip = THIS->addr;
+        snprintf(THIS->__retvalue, MAXSTRINGLEN, NIPQUAD_FMT, NIPQUAD(ip));
+%}
+
+/* return the source IP address for a given sock */
+function __ip_sock_saddr:long (sock:long)
+{
+	return @cast(sock, "inet_sock")->saddr
+}
+
+/* return the destination IP address for a given sock */
+function __ip_sock_daddr:long (sock:long)
+{
+	return @cast(sock, "inet_sock")->daddr
+}
diff --git a/tapset/tcp.stp b/tapset/tcp.stp
index 1375f11..bb96b0c 100644
--- a/tapset/tcp.stp
+++ b/tapset/tcp.stp
@@ -73,6 +73,16 @@ function tcp_ts_get_info_state:long(sock:long)
 	CATCH_DEREF_FAULT();
 %}
 
+/* return the TCP destination port for a given sock */
+function __tcp_sock_dport:long (sock:long){
+	return @cast(sock, "inet_sock")->dport
+}
+
+/* return the TCP source port for a given sock */
+function __tcp_sock_sport:long (sock:long){
+	return @cast(sock, "inet_sock")->sport
+}
+
 global sockstate[13], sockstate_init_p
 function tcp_sockstate_str:string (state:long) {
 	if (! sockstate_init_p) {
@@ -182,6 +192,10 @@ probe tcp.sendmsg.return = kernel.function("tcp_sendmsg").return {
  * @name: Name of this probe
  * @sock: Network socket
  * @size: Number of bytes to be received  
+ * @saddr: A string representing the source IP address
+ * @daddr: A string representing the destination IP address
+ * @sport: TCP source port 
+ * @dport: TCP destination port
  * Context:
  *  The process which receives a tcp message
  */
@@ -189,12 +203,20 @@ probe tcp.recvmsg = kernel.function("tcp_recvmsg") {
 	name = "tcp.recvmsg"
 	sock    = $sk
 	size    = $len
+	saddr   = ip_ntop(__ip_sock_saddr($sk))
+	daddr   = ip_ntop(__ip_sock_daddr($sk))
+	sport   = __tcp_sock_sport($sk)
+	dport   = __tcp_sock_dport($sk)
 }
 
 /**
  * probe tcp.recvmsg.return - Receiving TCP message complete
  * @name: Name of this probe
  * @size: Number of bytes received or error code if an error occurred.
+ * @saddr: A string representing the source IP address
+ * @daddr: A string representing the destination IP address
+ * @sport: TCP source port 
+ * @dport: TCP destination port
  *
  * Context:
  *  The process which receives a tcp message
@@ -202,6 +224,10 @@ probe tcp.recvmsg = kernel.function("tcp_recvmsg") {
 probe tcp.recvmsg.return = kernel.function("tcp_recvmsg").return {
 	name = "tcp.recvmsg"
 	size = $return
+	saddr = ip_ntop(__ip_sock_saddr($sk))
+	daddr = ip_ntop(__ip_sock_daddr($sk))
+	sport = __tcp_sock_sport($sk)
+	dport = __tcp_sock_dport($sk)
 }
 
 /**
@@ -209,6 +235,10 @@ probe tcp.recvmsg.return = kernel.function("tcp_recvmsg").return {
  * @name: Name of this probe
  * @sock: Network socket 
  * @flags: TCP flags (e.g. FIN, etc)  
+ * @saddr: A string representing the source IP address
+ * @daddr: A string representing the destination IP address
+ * @sport: TCP source port 
+ * @dport: TCP destination port
  *
  * Context:
  *  The process which disconnects tcp 
@@ -217,6 +247,10 @@ probe tcp.disconnect = kernel.function("tcp_disconnect") {
 	name = "tcp.disconnect"
 	sock  = $sk
 	flags = $flags
+	saddr = ip_ntop(__ip_sock_saddr($sk))
+	daddr = ip_ntop(__ip_sock_daddr($sk))
+	sport = __tcp_sock_sport($sk)
+	dport = __tcp_sock_dport($sk)
 }
 
 /**
diff --git a/testsuite/systemtap.examples/network/tcp.stp b/testsuite/systemtap.examples/network/tcp.stp
new file mode 100644
index 0000000..ebe72a1
--- /dev/null
+++ b/testsuite/systemtap.examples/network/tcp.stp
@@ -0,0 +1,11 @@
+//A simple TCP tapset example
+
+probe begin {
+	printf("Expected IP 7.91.205.21 .... %s\n", ip_ntop(123456789))
+	printf("Expected IP 58.222.104.177 .... %s\n", ip_ntop(987654321))
+	printf("Expected IP 9.3.191.111 ... %s\n", ip_ntop(151240559))
+}
+
+probe tcp.recvmsg {
+	printf("received a message from %s on port %d from port %d\n", saddr, dport, sport)
+}
-- 
1.6.0.2


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]