diff options
Diffstat (limited to 'net/sched/act_skbedit.c')
| -rw-r--r-- | net/sched/act_skbedit.c | 23 | 
1 files changed, 18 insertions, 5 deletions
diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c index 215a06705cef..37dced00b63d 100644 --- a/net/sched/act_skbedit.c +++ b/net/sched/act_skbedit.c @@ -99,6 +99,7 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla,  	u16 *queue_mapping = NULL, *ptype = NULL;  	bool exists = false;  	int ret = 0, err; +	u32 index;  	if (nla == NULL)  		return -EINVAL; @@ -146,8 +147,8 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla,  	}  	parm = nla_data(tb[TCA_SKBEDIT_PARMS]); - -	err = tcf_idr_check_alloc(tn, &parm->index, a, bind); +	index = parm->index; +	err = tcf_idr_check_alloc(tn, &index, a, bind);  	if (err < 0)  		return err;  	exists = err; @@ -158,15 +159,15 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla,  		if (exists)  			tcf_idr_release(*a, bind);  		else -			tcf_idr_cleanup(tn, parm->index); +			tcf_idr_cleanup(tn, index);  		return -EINVAL;  	}  	if (!exists) { -		ret = tcf_idr_create(tn, parm->index, est, a, +		ret = tcf_idr_create(tn, index, est, a,  				     &act_skbedit_ops, bind, true);  		if (ret) { -			tcf_idr_cleanup(tn, parm->index); +			tcf_idr_cleanup(tn, index);  			return ret;  		} @@ -306,6 +307,17 @@ static int tcf_skbedit_search(struct net *net, struct tc_action **a, u32 index)  	return tcf_idr_search(tn, a, index);  } +static size_t tcf_skbedit_get_fill_size(const struct tc_action *act) +{ +	return nla_total_size(sizeof(struct tc_skbedit)) +		+ nla_total_size(sizeof(u32)) /* TCA_SKBEDIT_PRIORITY */ +		+ nla_total_size(sizeof(u16)) /* TCA_SKBEDIT_QUEUE_MAPPING */ +		+ nla_total_size(sizeof(u32)) /* TCA_SKBEDIT_MARK */ +		+ nla_total_size(sizeof(u16)) /* TCA_SKBEDIT_PTYPE */ +		+ nla_total_size(sizeof(u32)) /* TCA_SKBEDIT_MASK */ +		+ nla_total_size_64bit(sizeof(u64)); /* TCA_SKBEDIT_FLAGS */ +} +  static struct tc_action_ops act_skbedit_ops = {  	.kind		=	"skbedit",  	.id		=	TCA_ID_SKBEDIT, @@ -315,6 +327,7 @@ static struct tc_action_ops act_skbedit_ops = {  	.init		=	tcf_skbedit_init,  	.cleanup	=	tcf_skbedit_cleanup,  	.walk		=	tcf_skbedit_walker, +	.get_fill_size	=	tcf_skbedit_get_fill_size,  	.lookup		=	tcf_skbedit_search,  	.size		=	sizeof(struct tcf_skbedit),  };  | 
