net: sched: cls_flower: implement terse dump support
authorVlad Buslov <vladbu@mellanox.com>
Fri, 15 May 2020 11:40:13 +0000 (14:40 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 15 May 2020 17:23:11 +0000 (10:23 -0700)
Implement tcf_proto_ops->terse_dump() callback for flower classifier. Only
dump handle, flags and action data in terse mode.

Signed-off-by: Vlad Buslov <vladbu@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/cls_flower.c

index 74a0feb..0c57470 100644 (file)
@@ -2768,6 +2768,48 @@ nla_put_failure:
        return -1;
 }
 
+static int fl_terse_dump(struct net *net, struct tcf_proto *tp, void *fh,
+                        struct sk_buff *skb, struct tcmsg *t, bool rtnl_held)
+{
+       struct cls_fl_filter *f = fh;
+       struct nlattr *nest;
+       bool skip_hw;
+
+       if (!f)
+               return skb->len;
+
+       t->tcm_handle = f->handle;
+
+       nest = nla_nest_start_noflag(skb, TCA_OPTIONS);
+       if (!nest)
+               goto nla_put_failure;
+
+       spin_lock(&tp->lock);
+
+       skip_hw = tc_skip_hw(f->flags);
+
+       if (f->flags && nla_put_u32(skb, TCA_FLOWER_FLAGS, f->flags))
+               goto nla_put_failure_locked;
+
+       spin_unlock(&tp->lock);
+
+       if (!skip_hw)
+               fl_hw_update_stats(tp, f, rtnl_held);
+
+       if (tcf_exts_terse_dump(skb, &f->exts))
+               goto nla_put_failure;
+
+       nla_nest_end(skb, nest);
+
+       return skb->len;
+
+nla_put_failure_locked:
+       spin_unlock(&tp->lock);
+nla_put_failure:
+       nla_nest_cancel(skb, nest);
+       return -1;
+}
+
 static int fl_tmplt_dump(struct sk_buff *skb, struct net *net, void *tmplt_priv)
 {
        struct fl_flow_tmplt *tmplt = tmplt_priv;
@@ -2832,6 +2874,7 @@ static struct tcf_proto_ops cls_fl_ops __read_mostly = {
        .hw_add         = fl_hw_add,
        .hw_del         = fl_hw_del,
        .dump           = fl_dump,
+       .terse_dump     = fl_terse_dump,
        .bind_class     = fl_bind_class,
        .tmplt_create   = fl_tmplt_create,
        .tmplt_destroy  = fl_tmplt_destroy,