diff options
Diffstat (limited to 'net/sched/act_nat.c')
| -rw-r--r-- | net/sched/act_nat.c | 46 | 
1 files changed, 11 insertions, 35 deletions
diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c index 876f0ef2969..270a030d5fd 100644 --- a/net/sched/act_nat.c +++ b/net/sched/act_nat.c @@ -30,15 +30,6 @@  #define NAT_TAB_MASK	15 -static struct tcf_common *tcf_nat_ht[NAT_TAB_MASK + 1]; -static u32 nat_idx_gen; -static DEFINE_RWLOCK(nat_lock); - -static struct tcf_hashinfo nat_hash_info = { -	.htab	=	tcf_nat_ht, -	.hmask	=	NAT_TAB_MASK, -	.lock	=	&nat_lock, -};  static const struct nla_policy nat_policy[TCA_NAT_MAX + 1] = {  	[TCA_NAT_PARMS]	= { .len = sizeof(struct tc_nat) }, @@ -51,7 +42,6 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est,  	struct tc_nat *parm;  	int ret = 0, err;  	struct tcf_nat *p; -	struct tcf_common *pc;  	if (nla == NULL)  		return -EINVAL; @@ -64,21 +54,19 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est,  		return -EINVAL;  	parm = nla_data(tb[TCA_NAT_PARMS]); -	pc = tcf_hash_check(parm->index, a, bind, &nat_hash_info); -	if (!pc) { -		pc = tcf_hash_create(parm->index, est, a, sizeof(*p), bind, -				     &nat_idx_gen, &nat_hash_info); -		if (IS_ERR(pc)) -			return PTR_ERR(pc); -		p = to_tcf_nat(pc); +	if (!tcf_hash_check(parm->index, a, bind)) { +		ret = tcf_hash_create(parm->index, est, a, sizeof(*p), bind); +		if (ret) +			return ret;  		ret = ACT_P_CREATED;  	} else { -		p = to_tcf_nat(pc); -		if (!ovr) { -			tcf_hash_release(pc, bind, &nat_hash_info); +		if (bind) +			return 0; +		tcf_hash_release(a, bind); +		if (!ovr)  			return -EEXIST; -		}  	} +	p = to_tcf_nat(a);  	spin_lock_bh(&p->tcf_lock);  	p->old_addr = parm->old_addr; @@ -90,18 +78,11 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est,  	spin_unlock_bh(&p->tcf_lock);  	if (ret == ACT_P_CREATED) -		tcf_hash_insert(pc, &nat_hash_info); +		tcf_hash_insert(a);  	return ret;  } -static int tcf_nat_cleanup(struct tc_action *a, int bind) -{ -	struct tcf_nat *p = a->priv; - -	return tcf_hash_release(&p->common, bind, &nat_hash_info); -} -  static int tcf_nat(struct sk_buff *skb, const struct tc_action *a,  		   struct tcf_result *res)  { @@ -301,16 +282,11 @@ nla_put_failure:  static struct tc_action_ops act_nat_ops = {  	.kind		=	"nat", -	.hinfo		=	&nat_hash_info,  	.type		=	TCA_ACT_NAT, -	.capab		=	TCA_CAP_NONE,  	.owner		=	THIS_MODULE,  	.act		=	tcf_nat,  	.dump		=	tcf_nat_dump, -	.cleanup	=	tcf_nat_cleanup, -	.lookup		=	tcf_hash_search,  	.init		=	tcf_nat_init, -	.walk		=	tcf_generic_walker  };  MODULE_DESCRIPTION("Stateless NAT actions"); @@ -318,7 +294,7 @@ MODULE_LICENSE("GPL");  static int __init nat_init_module(void)  { -	return tcf_register_action(&act_nat_ops); +	return tcf_register_action(&act_nat_ops, NAT_TAB_MASK);  }  static void __exit nat_cleanup_module(void)  | 
