net: introduce nla_put_bitfield32() helper and use it
authorJiri Pirko <jiri@mellanox.com>
Sat, 28 Mar 2020 15:37:42 +0000 (16:37 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Mar 2020 18:06:49 +0000 (11:06 -0700)
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>
include/net/netlink.h
net/sched/act_api.c
net/sched/sch_red.c

index 56c365dc6dc791c4edb19e85cd451fa6030f16f3..67c57d6942e34c391673f24a5bbf37e44adf50f0 100644 (file)
@@ -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
index 861a831b0ef72530eb9ddf83828a43871084d1c2..33cc77e6e56cdced90ca312473f186c9b7028173 100644 (file)
@@ -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))
-                       goto nla_put_failure;
-       }
-
-       if (a->tcfa_flags) {
-               struct nla_bitfield32 flags = { a->tcfa_flags,
-                                               a->tcfa_flags, };
+       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 (nla_put(skb, TCA_ACT_FLAGS, sizeof(flags), &flags))
-                       goto nla_put_failure;
-       }
+       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)
index 3ef0a4f7399b3572aaf8da29c339c508eab800b5..c7de47c942e3b9f8d980377b53120b3088a93ab6 100644 (file)
@@ -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);