Skip to content

Commit

Permalink
netfilter: nat: remove module reference counting from NAT protocols
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Patrick McHardy authored and Pablo Neira Ayuso committed Dec 23, 2011
1 parent 329fb58 commit d70308f
Show file tree
Hide file tree
Showing 10 changed files with 3 additions and 32 deletions.
2 changes: 0 additions & 2 deletions include/net/netfilter/nf_nat_protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ struct nf_nat_protocol {
/* Protocol number. */
unsigned int protonum;

struct module *me;

/* Translate a packet to the target according to manip type.
Return true if succeeded. */
bool (*manip_pkt)(struct sk_buff *skb,
Expand Down
25 changes: 3 additions & 22 deletions net/ipv4/netfilter/nf_nat_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -575,26 +575,6 @@ static struct nf_ct_ext_type nat_extend __read_mostly = {
#include <linux/netfilter/nfnetlink.h>
#include <linux/netfilter/nfnetlink_conntrack.h>

static const struct nf_nat_protocol *
nf_nat_proto_find_get(u_int8_t protonum)
{
const struct nf_nat_protocol *p;

rcu_read_lock();
p = __nf_nat_proto_find(protonum);
if (!try_module_get(p->me))
p = &nf_nat_unknown_protocol;
rcu_read_unlock();

return p;
}

static void
nf_nat_proto_put(const struct nf_nat_protocol *p)
{
module_put(p->me);
}

static const struct nla_policy protonat_nla_policy[CTA_PROTONAT_MAX+1] = {
[CTA_PROTONAT_PORT_MIN] = { .type = NLA_U16 },
[CTA_PROTONAT_PORT_MAX] = { .type = NLA_U16 },
Expand All @@ -612,10 +592,11 @@ static int nfnetlink_parse_nat_proto(struct nlattr *attr,
if (err < 0)
return err;

npt = nf_nat_proto_find_get(nf_ct_protonum(ct));
rcu_read_lock();
npt = __nf_nat_proto_find(nf_ct_protonum(ct));
if (npt->nlattr_to_range)
err = npt->nlattr_to_range(tb, range);
nf_nat_proto_put(npt);
rcu_read_unlock();
return err;
}

Expand Down
1 change: 0 additions & 1 deletion net/ipv4/netfilter/nf_nat_proto_dccp.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ dccp_manip_pkt(struct sk_buff *skb,

static const struct nf_nat_protocol nf_nat_protocol_dccp = {
.protonum = IPPROTO_DCCP,
.me = THIS_MODULE,
.manip_pkt = dccp_manip_pkt,
.in_range = nf_nat_proto_in_range,
.unique_tuple = dccp_unique_tuple,
Expand Down
1 change: 0 additions & 1 deletion net/ipv4/netfilter/nf_nat_proto_gre.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ gre_manip_pkt(struct sk_buff *skb, unsigned int iphdroff,

static const struct nf_nat_protocol gre = {
.protonum = IPPROTO_GRE,
.me = THIS_MODULE,
.manip_pkt = gre_manip_pkt,
.in_range = nf_nat_proto_in_range,
.unique_tuple = gre_unique_tuple,
Expand Down
1 change: 0 additions & 1 deletion net/ipv4/netfilter/nf_nat_proto_icmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ icmp_manip_pkt(struct sk_buff *skb,

const struct nf_nat_protocol nf_nat_protocol_icmp = {
.protonum = IPPROTO_ICMP,
.me = THIS_MODULE,
.manip_pkt = icmp_manip_pkt,
.in_range = icmp_in_range,
.unique_tuple = icmp_unique_tuple,
Expand Down
1 change: 0 additions & 1 deletion net/ipv4/netfilter/nf_nat_proto_sctp.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ sctp_manip_pkt(struct sk_buff *skb,

static const struct nf_nat_protocol nf_nat_protocol_sctp = {
.protonum = IPPROTO_SCTP,
.me = THIS_MODULE,
.manip_pkt = sctp_manip_pkt,
.in_range = nf_nat_proto_in_range,
.unique_tuple = sctp_unique_tuple,
Expand Down
1 change: 0 additions & 1 deletion net/ipv4/netfilter/nf_nat_proto_tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ tcp_manip_pkt(struct sk_buff *skb,

const struct nf_nat_protocol nf_nat_protocol_tcp = {
.protonum = IPPROTO_TCP,
.me = THIS_MODULE,
.manip_pkt = tcp_manip_pkt,
.in_range = nf_nat_proto_in_range,
.unique_tuple = tcp_unique_tuple,
Expand Down
1 change: 0 additions & 1 deletion net/ipv4/netfilter/nf_nat_proto_udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ udp_manip_pkt(struct sk_buff *skb,

const struct nf_nat_protocol nf_nat_protocol_udp = {
.protonum = IPPROTO_UDP,
.me = THIS_MODULE,
.manip_pkt = udp_manip_pkt,
.in_range = nf_nat_proto_in_range,
.unique_tuple = udp_unique_tuple,
Expand Down
1 change: 0 additions & 1 deletion net/ipv4/netfilter/nf_nat_proto_udplite.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ udplite_manip_pkt(struct sk_buff *skb,

static const struct nf_nat_protocol nf_nat_protocol_udplite = {
.protonum = IPPROTO_UDPLITE,
.me = THIS_MODULE,
.manip_pkt = udplite_manip_pkt,
.in_range = nf_nat_proto_in_range,
.unique_tuple = udplite_unique_tuple,
Expand Down
1 change: 0 additions & 1 deletion net/ipv4/netfilter/nf_nat_proto_unknown.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ unknown_manip_pkt(struct sk_buff *skb,
}

const struct nf_nat_protocol nf_nat_unknown_protocol = {
/* .me isn't set: getting a ref to this cannot fail. */
.manip_pkt = unknown_manip_pkt,
.in_range = unknown_in_range,
.unique_tuple = unknown_unique_tuple,
Expand Down

0 comments on commit d70308f

Please sign in to comment.