Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
ipv4
netfilter
nf_nat_proto_icmp.c
Go to the documentation of this file.
1
/* (C) 1999-2001 Paul `Rusty' Russell
2
* (C) 2002-2006 Netfilter Core Team <
[email protected]
>
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 2 as
6
* published by the Free Software Foundation.
7
*/
8
9
#include <linux/types.h>
10
#include <
linux/init.h
>
11
#include <linux/export.h>
12
#include <linux/ip.h>
13
#include <linux/icmp.h>
14
15
#include <linux/netfilter.h>
16
#include <
net/netfilter/nf_nat.h
>
17
#include <
net/netfilter/nf_nat_core.h
>
18
#include <
net/netfilter/nf_nat_l4proto.h
>
19
20
static
bool
21
icmp_in_range(
const
struct
nf_conntrack_tuple
*tuple,
22
enum
nf_nat_manip_type
maniptype,
23
const
union
nf_conntrack_man_proto
*
min
,
24
const
union
nf_conntrack_man_proto
*
max
)
25
{
26
return
ntohs
(tuple->
src
.u.icmp.id) >=
ntohs
(min->
icmp
.id) &&
27
ntohs
(tuple->
src
.u.icmp.id) <=
ntohs
(max->
icmp
.id);
28
}
29
30
static
void
31
icmp_unique_tuple(
const
struct
nf_nat_l3proto
*l3proto,
32
struct
nf_conntrack_tuple
*tuple,
33
const
struct
nf_nat_range
*
range
,
34
enum
nf_nat_manip_type
maniptype,
35
const
struct
nf_conn
*
ct
)
36
{
37
static
u_int16_t
id
;
38
unsigned
int
range_size
;
39
unsigned
int
i
;
40
41
range_size =
ntohs
(range->
max_proto
.
icmp
.id) -
42
ntohs
(range->
min_proto
.
icmp
.id) + 1;
43
/* If no range specified... */
44
if
(!(range->
flags
&
NF_NAT_RANGE_PROTO_SPECIFIED
))
45
range_size = 0xFFFF;
46
47
for
(i = 0; ; ++
id
) {
48
tuple->
src
.u.icmp.id =
htons
(
ntohs
(range->
min_proto
.
icmp
.id) +
49
(
id
% range_size));
50
if
(++i == range_size || !
nf_nat_used_tuple
(tuple, ct))
51
return
;
52
}
53
return
;
54
}
55
56
static
bool
57
icmp_manip_pkt(
struct
sk_buff
*
skb
,
58
const
struct
nf_nat_l3proto
*l3proto,
59
unsigned
int
iphdroff,
unsigned
int
hdroff,
60
const
struct
nf_conntrack_tuple
*tuple,
61
enum
nf_nat_manip_type
maniptype)
62
{
63
struct
icmphdr
*
hdr
;
64
65
if
(!
skb_make_writable
(skb, hdroff +
sizeof
(*hdr)))
66
return
false
;
67
68
hdr = (
struct
icmphdr
*)(skb->
data
+ hdroff);
69
inet_proto_csum_replace2(&hdr->
checksum
, skb,
70
hdr->
un
.
echo
.id, tuple->
src
.u.icmp.id, 0);
71
hdr->
un
.
echo
.id = tuple->
src
.u.icmp.id;
72
return
true
;
73
}
74
75
const
struct
nf_nat_l4proto
nf_nat_l4proto_icmp
= {
76
.l4proto =
IPPROTO_ICMP
,
77
.manip_pkt = icmp_manip_pkt,
78
.in_range = icmp_in_range,
79
.unique_tuple = icmp_unique_tuple,
80
#if defined(CONFIG_NF_CT_NETLINK) || defined(CONFIG_NF_CT_NETLINK_MODULE)
81
.nlattr_to_range =
nf_nat_l4proto_nlattr_to_range
,
82
#endif
83
};
Generated on Thu Jan 10 2013 14:58:42 for Linux Kernel by
1.8.2