summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2012-06-29 01:23:24 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2012-07-04 13:37:22 -0400
commit08911475d1d0921401e37d83292b217e1411d10b (patch)
tree78e2ad7b4898fb76dc3c4b4bbe46fbaaf3cb1f18
parent8fc02781688eda937657193ee28caf4914563d27 (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.h3
-rw-r--r--net/ipv4/netfilter/nf_conntrack_proto_icmp.c6
-rw-r--r--net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c6
-rw-r--r--net/netfilter/nf_conntrack_proto.c22
-rw-r--r--net/netfilter/nf_conntrack_proto_generic.c6
-rw-r--r--net/netfilter/nf_conntrack_proto_tcp.c7
-rw-r--r--net/netfilter/nf_conntrack_proto_udp.c7
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
391static struct nf_proto_net *icmp_get_net_proto(struct net *net)
392{
393 return &net->ct.nf_ct_proto.icmp.pn;
394}
395
391struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp __read_mostly = 396struct 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
361static struct nf_proto_net *icmpv6_get_net_proto(struct net *net)
362{
363 return &net->ct.nf_ct_proto.icmpv6.pn;
364}
365
361struct nf_conntrack_l4proto nf_conntrack_l4proto_icmpv6 __read_mostly = 366struct 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);
303static struct nf_proto_net *nf_ct_l4proto_net(struct net *net, 303static 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
189static struct nf_proto_net *generic_get_net_proto(struct net *net)
190{
191 return &net->ct.nf_ct_proto.generic.pn;
192}
193
189struct nf_conntrack_l4proto nf_conntrack_l4proto_generic __read_mostly = 194struct 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
1626static struct nf_proto_net *tcp_get_net_proto(struct net *net)
1627{
1628 return &net->ct.nf_ct_proto.tcp.pn;
1629}
1630
1626struct nf_conntrack_l4proto nf_conntrack_l4proto_tcp4 __read_mostly = 1631struct 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};
1660EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_tcp4); 1666EXPORT_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};
1696EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_tcp6); 1703EXPORT_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
300static struct nf_proto_net *udp_get_net_proto(struct net *net)
301{
302 return &net->ct.nf_ct_proto.udp.pn;
303}
304
300struct nf_conntrack_l4proto nf_conntrack_l4proto_udp4 __read_mostly = 305struct 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};
329EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_udp4); 335EXPORT_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};
360EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_udp6); 367EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_udp6);