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
netfilter
nf_nat_amanda.c
Go to the documentation of this file.
1
/* Amanda extension for TCP NAT alteration.
2
* (C) 2002 by Brian J. Murrell <
[email protected]
>
3
* based on a copy of HW's ip_nat_irc.c as well as other modules
4
*
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation; either version
8
* 2 of the License, or (at your option) any later version.
9
*/
10
11
#include <linux/kernel.h>
12
#include <linux/module.h>
13
#include <
linux/skbuff.h
>
14
#include <linux/udp.h>
15
16
#include <
net/netfilter/nf_conntrack_helper.h
>
17
#include <
net/netfilter/nf_conntrack_expect.h
>
18
#include <
net/netfilter/nf_nat_helper.h
>
19
#include <
linux/netfilter/nf_conntrack_amanda.h
>
20
21
MODULE_AUTHOR
(
"Brian J. Murrell <
[email protected]
>"
);
22
MODULE_DESCRIPTION
(
"Amanda NAT helper"
);
23
MODULE_LICENSE
(
"GPL"
);
24
MODULE_ALIAS
(
"ip_nat_amanda"
);
25
26
static
unsigned
int
help(
struct
sk_buff
*
skb
,
27
enum
ip_conntrack_info
ctinfo,
28
unsigned
int
protoff,
29
unsigned
int
matchoff,
30
unsigned
int
matchlen,
31
struct
nf_conntrack_expect
*
exp
)
32
{
33
char
buffer
[
sizeof
(
"65535"
)];
34
u_int16_t
port
;
35
unsigned
int
ret
;
36
37
/* Connection comes from client. */
38
exp->saved_proto.tcp.port = exp->
tuple
.dst.u.tcp.port;
39
exp->dir =
IP_CT_DIR_ORIGINAL
;
40
41
/* When you see the packet, we need to NAT it the same as the
42
* this one (ie. same IP: it will be TCP and master is UDP). */
43
exp->
expectfn
=
nf_nat_follow_master
;
44
45
/* Try to get same port: if not, try to change it. */
46
for
(port =
ntohs
(exp->saved_proto.tcp.port); port != 0; port++) {
47
int
res
;
48
49
exp->
tuple
.dst.u.tcp.port =
htons
(port);
50
res = nf_ct_expect_related(exp);
51
if
(res == 0)
52
break
;
53
else
if
(res != -
EBUSY
) {
54
port = 0;
55
break
;
56
}
57
}
58
59
if
(port == 0)
60
return
NF_DROP
;
61
62
sprintf
(
buffer
,
"%u"
, port);
63
ret =
nf_nat_mangle_udp_packet
(skb, exp->
master
, ctinfo,
64
protoff, matchoff, matchlen,
65
buffer
,
strlen
(
buffer
));
66
if
(ret !=
NF_ACCEPT
)
67
nf_ct_unexpect_related
(exp);
68
return
ret
;
69
}
70
71
static
void
__exit
nf_nat_amanda_fini(
void
)
72
{
73
RCU_INIT_POINTER
(
nf_nat_amanda_hook
,
NULL
);
74
synchronize_rcu();
75
}
76
77
static
int
__init
nf_nat_amanda_init(
void
)
78
{
79
BUG_ON
(
nf_nat_amanda_hook
!=
NULL
);
80
RCU_INIT_POINTER
(
nf_nat_amanda_hook
, help);
81
return
0;
82
}
83
84
module_init
(nf_nat_amanda_init);
85
module_exit
(nf_nat_amanda_fini);
Generated on Thu Jan 10 2013 15:00:38 for Linux Kernel by
1.8.2