mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 05:04:09 +08:00
net: introduce nla_put_bitfield32() helper and use it
Introduce a helper to pass value and selector to. The helper packs them into struct and puts them into netlink message. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
acc086bfb9
commit
8953b0770f
@ -1465,6 +1465,21 @@ static inline int nla_put_in6_addr(struct sk_buff *skb, int attrtype,
|
||||
return nla_put(skb, attrtype, sizeof(*addr), addr);
|
||||
}
|
||||
|
||||
/**
|
||||
* nla_put_bitfield32 - Add a bitfield32 netlink attribute to a socket buffer
|
||||
* @skb: socket buffer to add attribute to
|
||||
* @attrtype: attribute type
|
||||
* @value: value carrying bits
|
||||
* @selector: selector of valid bits
|
||||
*/
|
||||
static inline int nla_put_bitfield32(struct sk_buff *skb, int attrtype,
|
||||
__u32 value, __u32 selector)
|
||||
{
|
||||
struct nla_bitfield32 tmp = { value, selector, };
|
||||
|
||||
return nla_put(skb, attrtype, sizeof(tmp), &tmp);
|
||||
}
|
||||
|
||||
/**
|
||||
* nla_get_u32 - return payload of u32 attribute
|
||||
* @nla: u32 netlink attribute
|
||||
|
@ -789,23 +789,15 @@ tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (a->hw_stats != TCA_ACT_HW_STATS_ANY) {
|
||||
struct nla_bitfield32 hw_stats = {
|
||||
a->hw_stats,
|
||||
TCA_ACT_HW_STATS_ANY,
|
||||
};
|
||||
|
||||
if (nla_put(skb, TCA_ACT_HW_STATS, sizeof(hw_stats), &hw_stats))
|
||||
if (a->hw_stats != TCA_ACT_HW_STATS_ANY &&
|
||||
nla_put_bitfield32(skb, TCA_ACT_HW_STATS,
|
||||
a->hw_stats, TCA_ACT_HW_STATS_ANY))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
if (a->tcfa_flags) {
|
||||
struct nla_bitfield32 flags = { a->tcfa_flags,
|
||||
a->tcfa_flags, };
|
||||
|
||||
if (nla_put(skb, TCA_ACT_FLAGS, sizeof(flags), &flags))
|
||||
if (a->tcfa_flags &&
|
||||
nla_put_bitfield32(skb, TCA_ACT_FLAGS,
|
||||
a->tcfa_flags, a->tcfa_flags))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
nest = nla_nest_start_noflag(skb, TCA_OPTIONS);
|
||||
if (nest == NULL)
|
||||
|
@ -349,10 +349,6 @@ static int red_dump_offload_stats(struct Qdisc *sch)
|
||||
static int red_dump(struct Qdisc *sch, struct sk_buff *skb)
|
||||
{
|
||||
struct red_sched_data *q = qdisc_priv(sch);
|
||||
struct nla_bitfield32 flags_bf = {
|
||||
.selector = red_supported_flags,
|
||||
.value = q->flags,
|
||||
};
|
||||
struct nlattr *opts = NULL;
|
||||
struct tc_red_qopt opt = {
|
||||
.limit = q->limit,
|
||||
@ -375,7 +371,8 @@ static int red_dump(struct Qdisc *sch, struct sk_buff *skb)
|
||||
goto nla_put_failure;
|
||||
if (nla_put(skb, TCA_RED_PARMS, sizeof(opt), &opt) ||
|
||||
nla_put_u32(skb, TCA_RED_MAX_P, q->parms.max_P) ||
|
||||
nla_put(skb, TCA_RED_FLAGS, sizeof(flags_bf), &flags_bf))
|
||||
nla_put_bitfield32(skb, TCA_RED_FLAGS,
|
||||
q->flags, red_supported_flags))
|
||||
goto nla_put_failure;
|
||||
return nla_nest_end(skb, opts);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user