diff options
author | Patrick McHardy <kaber@trash.net> | 2011-12-23 08:00:49 -0500 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2011-12-23 08:36:45 -0500 |
commit | d70308f78bb8192a76a7dc38f5f9de6c2695532b (patch) | |
tree | 0fbecee36fdc252cf0be5630395e684b6521d302 /net/ipv4 | |
parent | 329fb58a93b25f0f5ee9d80c0e0e6a6c1a0192b4 (diff) |
netfilter: nat: remove module reference counting from NAT protocols
The only remaining user of NAT protocol module reference counting is NAT
ctnetlink support. Since this is a fairly short sequence of code, convert
over to use RCU and remove module reference counting.
Module unregistration is already protected by RCU using synchronize_rcu(),
so no further changes are necessary.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/netfilter/nf_nat_core.c | 25 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_proto_dccp.c | 1 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_proto_gre.c | 1 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_proto_icmp.c | 1 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_proto_sctp.c | 1 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_proto_tcp.c | 1 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_proto_udp.c | 1 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_proto_udplite.c | 1 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_proto_unknown.c | 1 |
9 files changed, 3 insertions, 30 deletions
diff --git a/net/ipv4/netfilter/nf_nat_core.c b/net/ipv4/netfilter/nf_nat_core.c index 610eb4499a1a..5e1bd85182e7 100644 --- a/net/ipv4/netfilter/nf_nat_core.c +++ b/net/ipv4/netfilter/nf_nat_core.c | |||
@@ -575,26 +575,6 @@ static struct nf_ct_ext_type nat_extend __read_mostly = { | |||
575 | #include <linux/netfilter/nfnetlink.h> | 575 | #include <linux/netfilter/nfnetlink.h> |
576 | #include <linux/netfilter/nfnetlink_conntrack.h> | 576 | #include <linux/netfilter/nfnetlink_conntrack.h> |
577 | 577 | ||
578 | static const struct nf_nat_protocol * | ||
579 | nf_nat_proto_find_get(u_int8_t protonum) | ||
580 | { | ||
581 | const struct nf_nat_protocol *p; | ||
582 | |||
583 | rcu_read_lock(); | ||
584 | p = __nf_nat_proto_find(protonum); | ||
585 | if (!try_module_get(p->me)) | ||
586 | p = &nf_nat_unknown_protocol; | ||
587 | rcu_read_unlock(); | ||
588 | |||
589 | return p; | ||
590 | } | ||
591 | |||
592 | static void | ||
593 | nf_nat_proto_put(const struct nf_nat_protocol *p) | ||
594 | { | ||
595 | module_put(p->me); | ||
596 | } | ||
597 | |||
598 | static const struct nla_policy protonat_nla_policy[CTA_PROTONAT_MAX+1] = { | 578 | static const struct nla_policy protonat_nla_policy[CTA_PROTONAT_MAX+1] = { |
599 | [CTA_PROTONAT_PORT_MIN] = { .type = NLA_U16 }, | 579 | [CTA_PROTONAT_PORT_MIN] = { .type = NLA_U16 }, |
600 | [CTA_PROTONAT_PORT_MAX] = { .type = NLA_U16 }, | 580 | [CTA_PROTONAT_PORT_MAX] = { .type = NLA_U16 }, |
@@ -612,10 +592,11 @@ static int nfnetlink_parse_nat_proto(struct nlattr *attr, | |||
612 | if (err < 0) | 592 | if (err < 0) |
613 | return err; | 593 | return err; |
614 | 594 | ||
615 | npt = nf_nat_proto_find_get(nf_ct_protonum(ct)); | 595 | rcu_read_lock(); |
596 | npt = __nf_nat_proto_find(nf_ct_protonum(ct)); | ||
616 | if (npt->nlattr_to_range) | 597 | if (npt->nlattr_to_range) |
617 | err = npt->nlattr_to_range(tb, range); | 598 | err = npt->nlattr_to_range(tb, range); |
618 | nf_nat_proto_put(npt); | 599 | rcu_read_unlock(); |
619 | return err; | 600 | return err; |
620 | } | 601 | } |
621 | 602 | ||
diff --git a/net/ipv4/netfilter/nf_nat_proto_dccp.c b/net/ipv4/netfilter/nf_nat_proto_dccp.c index c43d5b366d0d..466d63de2f77 100644 --- a/net/ipv4/netfilter/nf_nat_proto_dccp.c +++ b/net/ipv4/netfilter/nf_nat_proto_dccp.c | |||
@@ -80,7 +80,6 @@ dccp_manip_pkt(struct sk_buff *skb, | |||
80 | 80 | ||
81 | static const struct nf_nat_protocol nf_nat_protocol_dccp = { | 81 | static const struct nf_nat_protocol nf_nat_protocol_dccp = { |
82 | .protonum = IPPROTO_DCCP, | 82 | .protonum = IPPROTO_DCCP, |
83 | .me = THIS_MODULE, | ||
84 | .manip_pkt = dccp_manip_pkt, | 83 | .manip_pkt = dccp_manip_pkt, |
85 | .in_range = nf_nat_proto_in_range, | 84 | .in_range = nf_nat_proto_in_range, |
86 | .unique_tuple = dccp_unique_tuple, | 85 | .unique_tuple = dccp_unique_tuple, |
diff --git a/net/ipv4/netfilter/nf_nat_proto_gre.c b/net/ipv4/netfilter/nf_nat_proto_gre.c index 9b1c629d7a00..35cd158d4675 100644 --- a/net/ipv4/netfilter/nf_nat_proto_gre.c +++ b/net/ipv4/netfilter/nf_nat_proto_gre.c | |||
@@ -119,7 +119,6 @@ gre_manip_pkt(struct sk_buff *skb, unsigned int iphdroff, | |||
119 | 119 | ||
120 | static const struct nf_nat_protocol gre = { | 120 | static const struct nf_nat_protocol gre = { |
121 | .protonum = IPPROTO_GRE, | 121 | .protonum = IPPROTO_GRE, |
122 | .me = THIS_MODULE, | ||
123 | .manip_pkt = gre_manip_pkt, | 122 | .manip_pkt = gre_manip_pkt, |
124 | .in_range = nf_nat_proto_in_range, | 123 | .in_range = nf_nat_proto_in_range, |
125 | .unique_tuple = gre_unique_tuple, | 124 | .unique_tuple = gre_unique_tuple, |
diff --git a/net/ipv4/netfilter/nf_nat_proto_icmp.c b/net/ipv4/netfilter/nf_nat_proto_icmp.c index 8f87b4bebf2b..036c00952c11 100644 --- a/net/ipv4/netfilter/nf_nat_proto_icmp.c +++ b/net/ipv4/netfilter/nf_nat_proto_icmp.c | |||
@@ -74,7 +74,6 @@ icmp_manip_pkt(struct sk_buff *skb, | |||
74 | 74 | ||
75 | const struct nf_nat_protocol nf_nat_protocol_icmp = { | 75 | const struct nf_nat_protocol nf_nat_protocol_icmp = { |
76 | .protonum = IPPROTO_ICMP, | 76 | .protonum = IPPROTO_ICMP, |
77 | .me = THIS_MODULE, | ||
78 | .manip_pkt = icmp_manip_pkt, | 77 | .manip_pkt = icmp_manip_pkt, |
79 | .in_range = icmp_in_range, | 78 | .in_range = icmp_in_range, |
80 | .unique_tuple = icmp_unique_tuple, | 79 | .unique_tuple = icmp_unique_tuple, |
diff --git a/net/ipv4/netfilter/nf_nat_proto_sctp.c b/net/ipv4/netfilter/nf_nat_proto_sctp.c index 4e70dc6fad21..50283abc594b 100644 --- a/net/ipv4/netfilter/nf_nat_proto_sctp.c +++ b/net/ipv4/netfilter/nf_nat_proto_sctp.c | |||
@@ -70,7 +70,6 @@ sctp_manip_pkt(struct sk_buff *skb, | |||
70 | 70 | ||
71 | static const struct nf_nat_protocol nf_nat_protocol_sctp = { | 71 | static const struct nf_nat_protocol nf_nat_protocol_sctp = { |
72 | .protonum = IPPROTO_SCTP, | 72 | .protonum = IPPROTO_SCTP, |
73 | .me = THIS_MODULE, | ||
74 | .manip_pkt = sctp_manip_pkt, | 73 | .manip_pkt = sctp_manip_pkt, |
75 | .in_range = nf_nat_proto_in_range, | 74 | .in_range = nf_nat_proto_in_range, |
76 | .unique_tuple = sctp_unique_tuple, | 75 | .unique_tuple = sctp_unique_tuple, |
diff --git a/net/ipv4/netfilter/nf_nat_proto_tcp.c b/net/ipv4/netfilter/nf_nat_proto_tcp.c index 6fcc865dc2ee..e0e2ba8b5254 100644 --- a/net/ipv4/netfilter/nf_nat_proto_tcp.c +++ b/net/ipv4/netfilter/nf_nat_proto_tcp.c | |||
@@ -82,7 +82,6 @@ tcp_manip_pkt(struct sk_buff *skb, | |||
82 | 82 | ||
83 | const struct nf_nat_protocol nf_nat_protocol_tcp = { | 83 | const struct nf_nat_protocol nf_nat_protocol_tcp = { |
84 | .protonum = IPPROTO_TCP, | 84 | .protonum = IPPROTO_TCP, |
85 | .me = THIS_MODULE, | ||
86 | .manip_pkt = tcp_manip_pkt, | 85 | .manip_pkt = tcp_manip_pkt, |
87 | .in_range = nf_nat_proto_in_range, | 86 | .in_range = nf_nat_proto_in_range, |
88 | .unique_tuple = tcp_unique_tuple, | 87 | .unique_tuple = tcp_unique_tuple, |
diff --git a/net/ipv4/netfilter/nf_nat_proto_udp.c b/net/ipv4/netfilter/nf_nat_proto_udp.c index 18ea44ebfff7..bde94cde6b15 100644 --- a/net/ipv4/netfilter/nf_nat_proto_udp.c +++ b/net/ipv4/netfilter/nf_nat_proto_udp.c | |||
@@ -73,7 +73,6 @@ udp_manip_pkt(struct sk_buff *skb, | |||
73 | 73 | ||
74 | const struct nf_nat_protocol nf_nat_protocol_udp = { | 74 | const struct nf_nat_protocol nf_nat_protocol_udp = { |
75 | .protonum = IPPROTO_UDP, | 75 | .protonum = IPPROTO_UDP, |
76 | .me = THIS_MODULE, | ||
77 | .manip_pkt = udp_manip_pkt, | 76 | .manip_pkt = udp_manip_pkt, |
78 | .in_range = nf_nat_proto_in_range, | 77 | .in_range = nf_nat_proto_in_range, |
79 | .unique_tuple = udp_unique_tuple, | 78 | .unique_tuple = udp_unique_tuple, |
diff --git a/net/ipv4/netfilter/nf_nat_proto_udplite.c b/net/ipv4/netfilter/nf_nat_proto_udplite.c index a17b75b9e2a7..58e9a3a1c8db 100644 --- a/net/ipv4/netfilter/nf_nat_proto_udplite.c +++ b/net/ipv4/netfilter/nf_nat_proto_udplite.c | |||
@@ -72,7 +72,6 @@ udplite_manip_pkt(struct sk_buff *skb, | |||
72 | 72 | ||
73 | static const struct nf_nat_protocol nf_nat_protocol_udplite = { | 73 | static const struct nf_nat_protocol nf_nat_protocol_udplite = { |
74 | .protonum = IPPROTO_UDPLITE, | 74 | .protonum = IPPROTO_UDPLITE, |
75 | .me = THIS_MODULE, | ||
76 | .manip_pkt = udplite_manip_pkt, | 75 | .manip_pkt = udplite_manip_pkt, |
77 | .in_range = nf_nat_proto_in_range, | 76 | .in_range = nf_nat_proto_in_range, |
78 | .unique_tuple = udplite_unique_tuple, | 77 | .unique_tuple = udplite_unique_tuple, |
diff --git a/net/ipv4/netfilter/nf_nat_proto_unknown.c b/net/ipv4/netfilter/nf_nat_proto_unknown.c index ab8e8c132168..e0afe8112b1c 100644 --- a/net/ipv4/netfilter/nf_nat_proto_unknown.c +++ b/net/ipv4/netfilter/nf_nat_proto_unknown.c | |||
@@ -46,7 +46,6 @@ unknown_manip_pkt(struct sk_buff *skb, | |||
46 | } | 46 | } |
47 | 47 | ||
48 | const struct nf_nat_protocol nf_nat_unknown_protocol = { | 48 | const struct nf_nat_protocol nf_nat_unknown_protocol = { |
49 | /* .me isn't set: getting a ref to this cannot fail. */ | ||
50 | .manip_pkt = unknown_manip_pkt, | 49 | .manip_pkt = unknown_manip_pkt, |
51 | .in_range = unknown_in_range, | 50 | .in_range = unknown_in_range, |
52 | .unique_tuple = unknown_unique_tuple, | 51 | .unique_tuple = unknown_unique_tuple, |