/* * (C) 1999-2001 Paul `Rusty' Russell * (C) 2002-2006 Netfilter Core Team <coreteam@netfilter.org> * (C) 2011 Patrick McHardy <kaber@trash.net> * * 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. */#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt#include<linux/module.h>#include<linux/types.h>#include<linux/timer.h>#include<linux/skbuff.h>#include<linux/gfp.h>#include<net/xfrm.h>#include<linux/jhash.h>#include<linux/rtnetlink.h>#include<net/netfilter/nf_conntrack.h>#include<net/netfilter/nf_conntrack_core.h>#include<net/netfilter/nf_nat.h>#include<net/netfilter/nf_nat_l3proto.h>#include<net/netfilter/nf_nat_core.h>#include<net/netfilter/nf_nat_helper.h>#include<net/netfilter/nf_conntrack_helper.h>#include<net/netfilter/nf_conntrack_seqadj.h>#include<net/netfilter/nf_conntrack_zones.h>#include<linux/netfilter/nf_nat.h>#include"nf_internals.h"staticspinlock_tnf_nat_locks[CONNTRACK_LOCKS];staticDEFINE_MUTEX(nf_nat_proto_mutex);staticconststructnf_nat_l3proto__rcu*nf_nat_l3protos[NFPROTO_NUMPROTO]__read_mostly;staticunsignedintnat_net_id__read_mostly;staticstructhlist_head*nf_nat_bysource__read_mostly;staticunsignedintnf_nat_htable_size__read_mostly;staticunsignedintnf_nat_hash_rnd__read_mostly;structnf_nat_lookup_hook_priv{structnf_hook_entries__rcu*entries;structrcu_headrcu_head;};structnf_nat_hooks_net{structnf_hook_ops*nat_hook_ops;unsignedintusers;};structnat_net{structnf_nat_hooks_netnat_proto_net[NFPROTO_NUMPROTO];};inlineconststructnf_nat_l3proto*__nf_nat_l3proto_find(u8family){returnrcu_dereference(nf_nat_l3protos[family]);}#ifdef CONFIG_XFRMstaticvoidnf_nat_ipv4_decode_session(structsk_buff*skb,conststructnf_conn*ct,enumip_conntrack_dirdir,unsignedlongstatusbit,structflowi*fl){conststructnf_conntrack_tuple*t=&ct->tuplehash[dir].tuple;structflowi4*fl4=&fl->u.ip4;if(ct->status&statusbit){fl4->daddr=t->dst.u3.ip;if(t->dst.protonum==IPPROTO_TCP||t->dst.protonum==IPPROTO_UDP||t->dst.protonum==IPPROTO_UDPLITE||t->dst.protonum==IPPROTO_DCCP||t->dst.protonum==IPPROTO_SCTP)fl4->fl4_dport=t->dst.u.all;}statusbit^=IPS_NAT_MASK;if(ct->status