summaryrefslogtreecommitdiffstats
path: root/tapset/ip.stp
blob: ec17b7c0f6eeceb633b852ef509c244bf90a8ca6 (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
// 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>

%{
#include <linux/skbuff.h>
%}

/**
 * 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)
{
%(kernel_v < "2.6.33" %?
	return @cast(sock, "inet_sock")->saddr
%:
	return @cast(sock, "inet_sock")->inet_saddr
%)
}

/* return the destination IP address for a given sock */
function __ip_sock_daddr:long (sock:long)
{
%(kernel_v < "2.6.33" %?
	return @cast(sock, "inet_sock")->daddr
%:
	return @cast(sock, "inet_sock")->inet_daddr
%)
}

/* Get the IP header for recent (> 2.6.21) kernels */
function __get_skb_iphdr_new:long(skb:long)
%{ /* pure */
	struct sk_buff *skb;
	skb = (struct sk_buff *)(long)THIS->skb;
	/* as done by skb_network_header() */
	#ifdef NET_SKBUFF_DATA_USES_OFFSET
		THIS->__retvalue = (long)(kread(&(skb->head)) + kread(&(skb->network_header)));
	#else
		THIS->__retvalue = (long)kread(&(skb->network_header));
	#endif
	CATCH_DEREF_FAULT();
%}

/* Get the IP header from a sk_buff struct */
function __get_skb_iphdr:long(skb:long){
%( kernel_v < "2.6.21" %?
	iphdr = @cast(skb, "sk_buff")->nh->raw
	return iphdr
%:
	return __get_skb_iphdr_new(skb)
%)
}

/* return the source next layer protocol for a given sk_buff structure */
function __ip_skb_proto:long (iphdr)
{
	return @cast(iphdr, "iphdr")->protocol
}

/* return the source IP address for a given sk_buff structure */
function __ip_skb_saddr:long (iphdr)
{
	return @cast(iphdr, "iphdr")->saddr
}

/* return the destination IP address for a given skb */
function __ip_skb_daddr:long (iphdr)
{
	return @cast(iphdr, "iphdr")->daddr
}