Blame view
net/netfilter/xt_helper.c
2.44 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 |
/* iptables module to match on related connections */ /* * (C) 2001 Martin Josefsson <gandalf@wlug.westbo.se> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. |
1da177e4c Linux-2.6.12-rc2 |
8 |
*/ |
8bee4bad0 netfilter: xt ext... |
9 |
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
1da177e4c Linux-2.6.12-rc2 |
10 11 12 |
#include <linux/module.h> #include <linux/skbuff.h> #include <linux/netfilter.h> |
9fb9cbb10 [NETFILTER]: Add ... |
13 14 15 |
#include <net/netfilter/nf_conntrack.h> #include <net/netfilter/nf_conntrack_core.h> #include <net/netfilter/nf_conntrack_helper.h> |
2e4e6a17a [NETFILTER] x_tab... |
16 17 |
#include <linux/netfilter/x_tables.h> #include <linux/netfilter/xt_helper.h> |
1da177e4c Linux-2.6.12-rc2 |
18 19 20 |
MODULE_LICENSE("GPL"); MODULE_AUTHOR("Martin Josefsson <gandalf@netfilter.org>"); |
2ae15b64e [NETFILTER]: Upda... |
21 |
MODULE_DESCRIPTION("Xtables: Related connection matching"); |
2e4e6a17a [NETFILTER] x_tab... |
22 23 |
MODULE_ALIAS("ipt_helper"); MODULE_ALIAS("ip6t_helper"); |
1da177e4c Linux-2.6.12-rc2 |
24 |
|
1da177e4c Linux-2.6.12-rc2 |
25 |
|
1d93a9cba [NETFILTER]: x_ta... |
26 |
static bool |
62fc80510 netfilter: xtable... |
27 |
helper_mt(const struct sk_buff *skb, struct xt_action_param *par) |
9fb9cbb10 [NETFILTER]: Add ... |
28 |
{ |
f7108a20d netfilter: xtable... |
29 |
const struct xt_helper_info *info = par->matchinfo; |
a47362a22 [NETFILTER]: add ... |
30 31 |
const struct nf_conn *ct; const struct nf_conn_help *master_help; |
342b7e3c8 [NETFILTER]: xt_h... |
32 |
const struct nf_conntrack_helper *helper; |
9fb9cbb10 [NETFILTER]: Add ... |
33 |
enum ip_conntrack_info ctinfo; |
1d93a9cba [NETFILTER]: x_ta... |
34 |
bool ret = info->invert; |
601e68e10 [NETFILTER]: Fix ... |
35 |
|
a47362a22 [NETFILTER]: add ... |
36 |
ct = nf_ct_get(skb, &ctinfo); |
342b7e3c8 [NETFILTER]: xt_h... |
37 |
if (!ct || !ct->master) |
9fb9cbb10 [NETFILTER]: Add ... |
38 |
return ret; |
9fb9cbb10 [NETFILTER]: Add ... |
39 |
|
dc808fe28 [NETFILTER] nf_co... |
40 |
master_help = nfct_help(ct->master); |
342b7e3c8 [NETFILTER]: xt_h... |
41 42 |
if (!master_help) return ret; |
9fb9cbb10 [NETFILTER]: Add ... |
43 |
|
342b7e3c8 [NETFILTER]: xt_h... |
44 45 46 47 |
/* rcu_read_lock()ed by nf_hook_slow */ helper = rcu_dereference(master_help->helper); if (!helper) return ret; |
9fb9cbb10 [NETFILTER]: Add ... |
48 49 |
if (info->name[0] == '\0') |
1d93a9cba [NETFILTER]: x_ta... |
50 |
ret = !ret; |
9fb9cbb10 [NETFILTER]: Add ... |
51 |
else |
0ff4d77bd [NETFILTER]: xt_h... |
52 53 |
ret ^= !strncmp(helper->name, info->name, strlen(helper->name)); |
9fb9cbb10 [NETFILTER]: Add ... |
54 55 |
return ret; } |
9fb9cbb10 [NETFILTER]: Add ... |
56 |
|
b0f38452f netfilter: xtable... |
57 |
static int helper_mt_check(const struct xt_mtchk_param *par) |
1da177e4c Linux-2.6.12-rc2 |
58 |
{ |
9b4fce7a3 netfilter: xtable... |
59 |
struct xt_helper_info *info = par->matchinfo; |
4a5a5c73b netfilter: xtable... |
60 |
int ret; |
1da177e4c Linux-2.6.12-rc2 |
61 |
|
4a5a5c73b netfilter: xtable... |
62 63 |
ret = nf_ct_l3proto_try_module_get(par->family); if (ret < 0) { |
8bee4bad0 netfilter: xt ext... |
64 65 66 |
pr_info("cannot load conntrack support for proto=%u ", par->family); |
4a5a5c73b netfilter: xtable... |
67 |
return ret; |
b9f78f9fc [NETFILTER]: nf_c... |
68 |
} |
1da177e4c Linux-2.6.12-rc2 |
69 |
info->name[29] = '\0'; |
bd414ee60 netfilter: xtable... |
70 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
71 |
} |
6be3d8598 netfilter: xtable... |
72 |
static void helper_mt_destroy(const struct xt_mtdtor_param *par) |
b9f78f9fc [NETFILTER]: nf_c... |
73 |
{ |
92f3b2b1b netfilter: xtable... |
74 |
nf_ct_l3proto_module_put(par->family); |
b9f78f9fc [NETFILTER]: nf_c... |
75 |
} |
92f3b2b1b netfilter: xtable... |
76 77 78 79 80 81 82 83 84 |
static struct xt_match helper_mt_reg __read_mostly = { .name = "helper", .revision = 0, .family = NFPROTO_UNSPEC, .checkentry = helper_mt_check, .match = helper_mt, .destroy = helper_mt_destroy, .matchsize = sizeof(struct xt_helper_info), .me = THIS_MODULE, |
1da177e4c Linux-2.6.12-rc2 |
85 |
}; |
d3c5ee6d5 [NETFILTER]: x_ta... |
86 |
static int __init helper_mt_init(void) |
1da177e4c Linux-2.6.12-rc2 |
87 |
{ |
92f3b2b1b netfilter: xtable... |
88 |
return xt_register_match(&helper_mt_reg); |
1da177e4c Linux-2.6.12-rc2 |
89 |
} |
d3c5ee6d5 [NETFILTER]: x_ta... |
90 |
static void __exit helper_mt_exit(void) |
1da177e4c Linux-2.6.12-rc2 |
91 |
{ |
92f3b2b1b netfilter: xtable... |
92 |
xt_unregister_match(&helper_mt_reg); |
1da177e4c Linux-2.6.12-rc2 |
93 |
} |
d3c5ee6d5 [NETFILTER]: x_ta... |
94 95 |
module_init(helper_mt_init); module_exit(helper_mt_exit); |