diff options
Diffstat (limited to 'net/sched/act_skbedit.c')
| -rw-r--r-- | net/sched/act_skbedit.c | 51 | 
1 files changed, 13 insertions, 38 deletions
diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c index cb4221171f9..fcfeeaf838b 100644 --- a/net/sched/act_skbedit.c +++ b/net/sched/act_skbedit.c @@ -11,8 +11,7 @@   * more details.   *   * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307 USA. + * this program; if not, see <http://www.gnu.org/licenses/>.   *   * Author: Alexander Duyck <alexander.h.duyck@intel.com>   */ @@ -29,15 +28,6 @@  #include <net/tc_act/tc_skbedit.h>  #define SKBEDIT_TAB_MASK     15 -static struct tcf_common *tcf_skbedit_ht[SKBEDIT_TAB_MASK + 1]; -static u32 skbedit_idx_gen; -static DEFINE_RWLOCK(skbedit_lock); - -static struct tcf_hashinfo skbedit_hash_info = { -	.htab	=	tcf_skbedit_ht, -	.hmask	=	SKBEDIT_TAB_MASK, -	.lock	=	&skbedit_lock, -};  static int tcf_skbedit(struct sk_buff *skb, const struct tc_action *a,  		       struct tcf_result *res) @@ -74,7 +64,6 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla,  	struct nlattr *tb[TCA_SKBEDIT_MAX + 1];  	struct tc_skbedit *parm;  	struct tcf_skbedit *d; -	struct tcf_common *pc;  	u32 flags = 0, *priority = NULL, *mark = NULL;  	u16 *queue_mapping = NULL;  	int ret = 0, err; @@ -109,21 +98,20 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla,  	parm = nla_data(tb[TCA_SKBEDIT_PARMS]); -	pc = tcf_hash_check(parm->index, a, bind, &skbedit_hash_info); -	if (!pc) { -		pc = tcf_hash_create(parm->index, est, a, sizeof(*d), bind, -				     &skbedit_idx_gen, &skbedit_hash_info); -		if (IS_ERR(pc)) -			return PTR_ERR(pc); +	if (!tcf_hash_check(parm->index, a, bind)) { +		ret = tcf_hash_create(parm->index, est, a, sizeof(*d), bind); +		if (ret) +			return ret; -		d = to_skbedit(pc); +		d = to_skbedit(a);  		ret = ACT_P_CREATED;  	} else { -		d = to_skbedit(pc); -		if (!ovr) { -			tcf_hash_release(pc, bind, &skbedit_hash_info); +		d = to_skbedit(a); +		if (bind) +			return 0; +		tcf_hash_release(a, bind); +		if (!ovr)  			return -EEXIST; -		}  	}  	spin_lock_bh(&d->tcf_lock); @@ -141,19 +129,10 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla,  	spin_unlock_bh(&d->tcf_lock);  	if (ret == ACT_P_CREATED) -		tcf_hash_insert(pc, &skbedit_hash_info); +		tcf_hash_insert(a);  	return ret;  } -static int tcf_skbedit_cleanup(struct tc_action *a, int bind) -{ -	struct tcf_skbedit *d = a->priv; - -	if (d) -		return tcf_hash_release(&d->common, bind, &skbedit_hash_info); -	return 0; -} -  static int tcf_skbedit_dump(struct sk_buff *skb, struct tc_action *a,  			    int bind, int ref)  { @@ -195,15 +174,11 @@ nla_put_failure:  static struct tc_action_ops act_skbedit_ops = {  	.kind		=	"skbedit", -	.hinfo		=	&skbedit_hash_info,  	.type		=	TCA_ACT_SKBEDIT, -	.capab		=	TCA_CAP_NONE,  	.owner		=	THIS_MODULE,  	.act		=	tcf_skbedit,  	.dump		=	tcf_skbedit_dump, -	.cleanup	=	tcf_skbedit_cleanup,  	.init		=	tcf_skbedit_init, -	.walk		=	tcf_generic_walker,  };  MODULE_AUTHOR("Alexander Duyck, <alexander.h.duyck@intel.com>"); @@ -212,7 +187,7 @@ MODULE_LICENSE("GPL");  static int __init skbedit_init_module(void)  { -	return tcf_register_action(&act_skbedit_ops); +	return tcf_register_action(&act_skbedit_ops, SKBEDIT_TAB_MASK);  }  static void __exit skbedit_cleanup_module(void)  | 
