summaryrefslogtreecommitdiffstats
path: root/tapset/sock.stp
blob: 101a3472e186c81ac9ab88cb167bf623f57ce932 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
%{
#include <linux/socket.h>
#include <net/sock.h>
#include <net/inet_sock.h>
%}

function struct_socket:string(_sock:long)
%{
	struct socket *sock = (struct socket *) (long) kread(&(THIS->_sock));
	struct sock *sk = (struct sock *) (long) kread(&(sock->sk));
	struct proto *skprot = (struct proto *)(long)kread(&(sk->__sk_common.skc_prot));
	struct inet_sock *inet = inet_sk(sk); 
	struct sockaddr *addr;
	struct in6_addr *saddr6;
	char buf[MAXSTRINGLEN];
	int cc=0;

	snprintf(buf+cc, MAXSTRINGLEN,
		"sock %p sk %p state %d flags 0x%lx type %d file %p", sock, sock->sk, sock->state, 
		sock->flags, sock->type, sock->file);
			
	cc = strlen(buf);
	snprintf(THIS->__retvalue, MAXSTRINGLEN, "%s", buf); 

	CATCH_DEREF_FAULT();
%}
function struct_sock:string(_sk:long)
%{
	struct sock *sk = (struct sock *) (long) kread(&(THIS->_sk));
	struct proto *skprot = (struct proto *)(long)kread(&(sk->__sk_common.skc_prot));
	struct inet_sock *inet = inet_sk(sk); 
	char buf[MAXSTRINGLEN];
	int cc=0;

	snprintf(buf+cc, MAXSTRINGLEN,
		"sk %p inet %p skprot %p sk_reuse %d sk_state %d", 
			sk, inet, skprot, sk->sk_reuse, sk->sk_state);

	snprintf(THIS->__retvalue, MAXSTRINGLEN, "%s", buf); 

	CATCH_DEREF_FAULT();
%}

function struct_sockaddr:string(_uaddr:long, _addrlen:long)
%{
	struct sockaddr *addr;
	struct in6_addr *saddr6;
	char buf[MAXSTRINGLEN], *family;

	addr = (struct sockaddr *) (long) kread(&(THIS->_uaddr));
	switch(addr->sa_family) {
		case AF_INET:
			family = "AF_INET";
			break;
		case AF_INET6:
			family = "AF_INET6";
			break;
		default:
			goto myout;
	}
	sprintf(buf, "addr %p family %s", addr, family);
	snprintf(THIS->__retvalue, MAXSTRINGLEN, "%s", buf); 

myout:
	CATCH_DEREF_FAULT();
%}
function ipv6_addr_diff:string(_sk:long, _sk2:long)
%{
	struct sock *sk = (struct sock *) (long) kread(&(THIS->_sk));
	struct sock *sk2 = (struct sock *) (long) kread(&(THIS->_sk));
	struct inet_sock *inet = inet_sk(sk); 
	struct inet_sock *inet2 = inet_sk(sk); 
	struct ipv6_pinfo *pinfo = (struct ipv6_pinfo *)(long)inet->pinet6;
	struct ipv6_pinfo *pinfo2 = (struct ipv6_pinfo *)(long)inet2->pinet6;
	struct in6_addr *rcv_addr = &pinfo->rcv_saddr;
	struct in6_addr *rcv_addr2 = NULL;
	__be32 sk_rcv_saddr = inet_->rcv_saddr;
	__be32 sk2_rcv_saddr = inet_rcv_saddr(sk2);
	char buf[MAXSTRINGLEN], *family;

	if (sk2->sk_family == AF_INET6) 
		rcv_addr2 = &pinfo2->rcv_saddr;

	snprintf(THIS->__retvalue, MAXSTRINGLEN, "%s", buf); 

	CATCH_DEREF_FAULT();
%}