diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-06-29 01:23:24 -0400 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-07-04 13:37:22 -0400 |
commit | 08911475d1d0921401e37d83292b217e1411d10b (patch) | |
tree | 78e2ad7b4898fb76dc3c4b4bbe46fbaaf3cb1f18 | |
parent | 8fc02781688eda937657193ee28caf4914563d27 (diff) |
netfilter: nf_conntrack: generalize nf_ct_l4proto_net
This patch generalizes nf_ct_l4proto_net by splitting it into chunks and
moving the corresponding protocol part to where it really belongs to.
To clarify, note that we follow two different approaches to support per-net
depending if it's built-in or run-time loadable protocol tracker.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Acked-by: Gao feng <gaofeng@cn.fujitsu.com>
-rw-r--r-- | include/net/netfilter/nf_conntrack_l4proto.h | 3 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_conntrack_proto_icmp.c | 6 | ||||
-rw-r--r-- | net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | 6 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_proto.c | 22 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_proto_generic.c | 6 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_proto_tcp.c | 7 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_proto_udp.c | 7 |
7 files changed, 41 insertions, 16 deletions
diff --git a/include/net/netfilter/nf_conntrack_l4proto.h b/include/net/netfilter/nf_conntrack_l4proto.h index 08bb571b7abd..c3be4aef6bf7 100644 --- a/include/net/netfilter/nf_conntrack_l4proto.h +++ b/include/net/netfilter/nf_conntrack_l4proto.h | |||
@@ -99,6 +99,9 @@ struct nf_conntrack_l4proto { | |||
99 | /* Init l4proto pernet data */ | 99 | /* Init l4proto pernet data */ |
100 | int (*init_net)(struct net *net, u_int16_t proto); | 100 | int (*init_net)(struct net *net, u_int16_t proto); |
101 | 101 | ||
102 | /* Return the per-net protocol part. */ | ||
103 | struct nf_proto_net *(*get_net_proto)(struct net *net); | ||
104 | |||
102 | /* Protocol name */ | 105 | /* Protocol name */ |
103 | const char *name; | 106 | const char *name; |
104 | 107 | ||
diff --git a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c index 9c2095c5571f..5241d997ab75 100644 --- a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c +++ b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c | |||
@@ -388,6 +388,11 @@ static int icmp_init_net(struct net *net, u_int16_t proto) | |||
388 | return ret; | 388 | return ret; |
389 | } | 389 | } |
390 | 390 | ||
391 | static struct nf_proto_net *icmp_get_net_proto(struct net *net) | ||
392 | { | ||
393 | return &net->ct.nf_ct_proto.icmp.pn; | ||
394 | } | ||
395 | |||
391 | struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp __read_mostly = | 396 | struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp __read_mostly = |
392 | { | 397 | { |
393 | .l3proto = PF_INET, | 398 | .l3proto = PF_INET, |
@@ -418,4 +423,5 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp __read_mostly = | |||
418 | }, | 423 | }, |
419 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 424 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
420 | .init_net = icmp_init_net, | 425 | .init_net = icmp_init_net, |
426 | .get_net_proto = icmp_get_net_proto, | ||
421 | }; | 427 | }; |
diff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c index 9fc5cf5f3e8b..2d54b2061d68 100644 --- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c +++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | |||
@@ -358,6 +358,11 @@ static int icmpv6_init_net(struct net *net, u_int16_t proto) | |||
358 | return icmpv6_kmemdup_sysctl_table(pn, in); | 358 | return icmpv6_kmemdup_sysctl_table(pn, in); |
359 | } | 359 | } |
360 | 360 | ||
361 | static struct nf_proto_net *icmpv6_get_net_proto(struct net *net) | ||
362 | { | ||
363 | return &net->ct.nf_ct_proto.icmpv6.pn; | ||
364 | } | ||
365 | |||
361 | struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 __read_mostly = | 366 | struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 __read_mostly = |
362 | { | 367 | { |
363 | .l3proto = PF_INET6, | 368 | .l3proto = PF_INET6, |
@@ -386,4 +391,5 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 __read_mostly = | |||
386 | }, | 391 | }, |
387 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 392 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
388 | .init_net = icmpv6_init_net, | 393 | .init_net = icmpv6_init_net, |
394 | .get_net_proto = icmpv6_get_net_proto, | ||
389 | }; | 395 | }; |
diff --git a/net/netfilter/nf_conntrack_proto.c b/net/netfilter/nf_conntrack_proto.c index 21b850c4b3ab..0dc63854390f 100644 --- a/net/netfilter/nf_conntrack_proto.c +++ b/net/netfilter/nf_conntrack_proto.c | |||
@@ -303,22 +303,12 @@ EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_unregister); | |||
303 | static struct nf_proto_net *nf_ct_l4proto_net(struct net *net, | 303 | static struct nf_proto_net *nf_ct_l4proto_net(struct net *net, |
304 | struct nf_conntrack_l4proto *l4proto) | 304 | struct nf_conntrack_l4proto *l4proto) |
305 | { | 305 | { |
306 | switch (l4proto->l4proto) { | 306 | if (l4proto->get_net_proto) { |
307 | case IPPROTO_TCP: | 307 | /* statically built-in protocols use static per-net */ |
308 | return (struct nf_proto_net *)&net->ct.nf_ct_proto.tcp; | 308 | return l4proto->get_net_proto(net); |
309 | case IPPROTO_UDP: | 309 | } else if (l4proto->net_id) { |
310 | return (struct nf_proto_net *)&net->ct.nf_ct_proto.udp; | 310 | /* ... and loadable protocols use dynamic per-net */ |
311 | case IPPROTO_ICMP: | 311 | return net_generic(net, *l4proto->net_id); |
312 | return (struct nf_proto_net *)&net->ct.nf_ct_proto.icmp; | ||
313 | case IPPROTO_ICMPV6: | ||
314 | return (struct nf_proto_net *)&net->ct.nf_ct_proto.icmpv6; | ||
315 | case 255: /* l4proto_generic */ | ||
316 | return (struct nf_proto_net *)&net->ct.nf_ct_proto.generic; | ||
317 | default: | ||
318 | if (l4proto->net_id) | ||
319 | return net_generic(net, *l4proto->net_id); | ||
320 | else | ||
321 | return NULL; | ||
322 | } | 312 | } |
323 | return NULL; | 313 | return NULL; |
324 | } | 314 | } |
diff --git a/net/netfilter/nf_conntrack_proto_generic.c b/net/netfilter/nf_conntrack_proto_generic.c index 7c11c5444194..d25f29377648 100644 --- a/net/netfilter/nf_conntrack_proto_generic.c +++ b/net/netfilter/nf_conntrack_proto_generic.c | |||
@@ -186,6 +186,11 @@ static int generic_init_net(struct net *net, u_int16_t proto) | |||
186 | return ret; | 186 | return ret; |
187 | } | 187 | } |
188 | 188 | ||
189 | static struct nf_proto_net *generic_get_net_proto(struct net *net) | ||
190 | { | ||
191 | return &net->ct.nf_ct_proto.generic.pn; | ||
192 | } | ||
193 | |||
189 | struct nf_conntrack_l4proto nf_conntrack_l4proto_generic __read_mostly = | 194 | struct nf_conntrack_l4proto nf_conntrack_l4proto_generic __read_mostly = |
190 | { | 195 | { |
191 | .l3proto = PF_UNSPEC, | 196 | .l3proto = PF_UNSPEC, |
@@ -207,4 +212,5 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_generic __read_mostly = | |||
207 | }, | 212 | }, |
208 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 213 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
209 | .init_net = generic_init_net, | 214 | .init_net = generic_init_net, |
215 | .get_net_proto = generic_get_net_proto, | ||
210 | }; | 216 | }; |
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index 44f0da830156..07e56ea2e9bf 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c | |||
@@ -1623,6 +1623,11 @@ static int tcp_init_net(struct net *net, u_int16_t proto) | |||
1623 | return ret; | 1623 | return ret; |
1624 | } | 1624 | } |
1625 | 1625 | ||
1626 | static struct nf_proto_net *tcp_get_net_proto(struct net *net) | ||
1627 | { | ||
1628 | return &net->ct.nf_ct_proto.tcp.pn; | ||
1629 | } | ||
1630 | |||
1626 | struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp4 __read_mostly = | 1631 | struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp4 __read_mostly = |
1627 | { | 1632 | { |
1628 | .l3proto = PF_INET, | 1633 | .l3proto = PF_INET, |
@@ -1656,6 +1661,7 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp4 __read_mostly = | |||
1656 | }, | 1661 | }, |
1657 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 1662 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
1658 | .init_net = tcp_init_net, | 1663 | .init_net = tcp_init_net, |
1664 | .get_net_proto = tcp_get_net_proto, | ||
1659 | }; | 1665 | }; |
1660 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_tcp4); | 1666 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_tcp4); |
1661 | 1667 | ||
@@ -1692,5 +1698,6 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp6 __read_mostly = | |||
1692 | }, | 1698 | }, |
1693 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 1699 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
1694 | .init_net = tcp_init_net, | 1700 | .init_net = tcp_init_net, |
1701 | .get_net_proto = tcp_get_net_proto, | ||
1695 | }; | 1702 | }; |
1696 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_tcp6); | 1703 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_tcp6); |
diff --git a/net/netfilter/nf_conntrack_proto_udp.c b/net/netfilter/nf_conntrack_proto_udp.c index e7e0434c3056..59623cc56e8d 100644 --- a/net/netfilter/nf_conntrack_proto_udp.c +++ b/net/netfilter/nf_conntrack_proto_udp.c | |||
@@ -297,6 +297,11 @@ static int udp_init_net(struct net *net, u_int16_t proto) | |||
297 | return ret; | 297 | return ret; |
298 | } | 298 | } |
299 | 299 | ||
300 | static struct nf_proto_net *udp_get_net_proto(struct net *net) | ||
301 | { | ||
302 | return &net->ct.nf_ct_proto.udp.pn; | ||
303 | } | ||
304 | |||
300 | struct nf_conntrack_l4proto nf_conntrack_l4proto_udp4 __read_mostly = | 305 | struct nf_conntrack_l4proto nf_conntrack_l4proto_udp4 __read_mostly = |
301 | { | 306 | { |
302 | .l3proto = PF_INET, | 307 | .l3proto = PF_INET, |
@@ -325,6 +330,7 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_udp4 __read_mostly = | |||
325 | }, | 330 | }, |
326 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 331 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
327 | .init_net = udp_init_net, | 332 | .init_net = udp_init_net, |
333 | .get_net_proto = udp_get_net_proto, | ||
328 | }; | 334 | }; |
329 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_udp4); | 335 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_udp4); |
330 | 336 | ||
@@ -356,5 +362,6 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_udp6 __read_mostly = | |||
356 | }, | 362 | }, |
357 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ | 363 | #endif /* CONFIG_NF_CT_NETLINK_TIMEOUT */ |
358 | .init_net = udp_init_net, | 364 | .init_net = udp_init_net, |
365 | .get_net_proto = udp_get_net_proto, | ||
359 | }; | 366 | }; |
360 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_udp6); | 367 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_udp6); |