Commit 8953b077 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

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: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent acc086bf
...@@ -1465,6 +1465,21 @@ static inline int nla_put_in6_addr(struct sk_buff *skb, int attrtype, ...@@ -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); 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_get_u32 - return payload of u32 attribute
* @nla: u32 netlink 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) ...@@ -789,23 +789,15 @@ tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int bind, int ref)
} }
rcu_read_unlock(); rcu_read_unlock();
if (a->hw_stats != TCA_ACT_HW_STATS_ANY) { if (a->hw_stats != TCA_ACT_HW_STATS_ANY &&
struct nla_bitfield32 hw_stats = { nla_put_bitfield32(skb, TCA_ACT_HW_STATS,
a->hw_stats, a->hw_stats, TCA_ACT_HW_STATS_ANY))
TCA_ACT_HW_STATS_ANY, goto nla_put_failure;
};
if (nla_put(skb, TCA_ACT_HW_STATS, sizeof(hw_stats), &hw_stats))
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 &&
goto nla_put_failure; 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); nest = nla_nest_start_noflag(skb, TCA_OPTIONS);
if (nest == NULL) if (nest == NULL)
......
...@@ -349,10 +349,6 @@ static int red_dump_offload_stats(struct Qdisc *sch) ...@@ -349,10 +349,6 @@ static int red_dump_offload_stats(struct Qdisc *sch)
static int red_dump(struct Qdisc *sch, struct sk_buff *skb) static int red_dump(struct Qdisc *sch, struct sk_buff *skb)
{ {
struct red_sched_data *q = qdisc_priv(sch); 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 nlattr *opts = NULL;
struct tc_red_qopt opt = { struct tc_red_qopt opt = {
.limit = q->limit, .limit = q->limit,
...@@ -375,7 +371,8 @@ static int red_dump(struct Qdisc *sch, struct sk_buff *skb) ...@@ -375,7 +371,8 @@ static int red_dump(struct Qdisc *sch, struct sk_buff *skb)
goto nla_put_failure; goto nla_put_failure;
if (nla_put(skb, TCA_RED_PARMS, sizeof(opt), &opt) || if (nla_put(skb, TCA_RED_PARMS, sizeof(opt), &opt) ||
nla_put_u32(skb, TCA_RED_MAX_P, q->parms.max_P) || 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; goto nla_put_failure;
return nla_nest_end(skb, opts); return nla_nest_end(skb, opts);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment