net: nexthop: Add ability to enable / disable hardware statistics
authorIdo Schimmel <idosch@nvidia.com>
Wed, 6 Mar 2024 12:49:20 +0000 (13:49 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 8 Mar 2024 10:35:47 +0000 (10:35 +0000)
Add netlink support for enabling collection of HW statistics on nexthop
groups.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/nexthop.h
include/uapi/linux/nexthop.h
net/ipv4/nexthop.c

index 584c37120c204ba47090f965f81922eec929ba61..1ba6d3668518730eb7f9c90fc47874322a8c4087 100644 (file)
@@ -47,6 +47,8 @@ struct nh_config {
        bool            nh_grp_res_has_idle_timer;
        bool            nh_grp_res_has_unbalanced_timer;
 
+       bool            nh_hw_stats;
+
        struct nlattr   *nh_encap;
        u16             nh_encap_type;
 
index f4db63c170853188b9c4c0dc3b89e1b6407b75f4..b86af80d4e0941d6e45e592e5606baca65352ce4 100644 (file)
@@ -68,6 +68,9 @@ enum {
        /* nested; nexthop group stats */
        NHA_GROUP_STATS,
 
+       /* u32; nexthop hardware stats enable */
+       NHA_HW_STATS_ENABLE,
+
        __NHA_MAX,
 };
 
index c0d14e16e9c8f82b9594736d6277b89700431926..e75b1aae5a813b3537f8cfa19ad1eaf4645d08e2 100644 (file)
@@ -39,6 +39,7 @@ static const struct nla_policy rtm_nh_policy_new[] = {
        [NHA_ENCAP]             = { .type = NLA_NESTED },
        [NHA_FDB]               = { .type = NLA_FLAG },
        [NHA_RES_GROUP]         = { .type = NLA_NESTED },
+       [NHA_HW_STATS_ENABLE]   = NLA_POLICY_MAX(NLA_U32, true),
 };
 
 static const struct nla_policy rtm_nh_policy_get[] = {
@@ -778,7 +779,8 @@ static int nla_put_nh_group(struct sk_buff *skb, struct nexthop *nh,
                goto nla_put_failure;
 
        if (op_flags & NHA_OP_FLAG_DUMP_STATS &&
-           nla_put_nh_group_stats(skb, nh))
+           (nla_put_u32(skb, NHA_HW_STATS_ENABLE, nhg->hw_stats) ||
+            nla_put_nh_group_stats(skb, nh)))
                goto nla_put_failure;
 
        return 0;
@@ -1202,6 +1204,7 @@ static int nh_check_attr_group(struct net *net,
                if (!tb[i])
                        continue;
                switch (i) {
+               case NHA_HW_STATS_ENABLE:
                case NHA_FDB:
                        continue;
                case NHA_RES_GROUP:
@@ -2622,6 +2625,9 @@ static struct nexthop *nexthop_create_group(struct net *net,
        if (cfg->nh_fdb)
                nhg->fdb_nh = 1;
 
+       if (cfg->nh_hw_stats)
+               nhg->hw_stats = true;
+
        rcu_assign_pointer(nh->nh_grp, nhg);
 
        return nh;
@@ -2964,6 +2970,9 @@ static int rtm_to_nh_config(struct net *net, struct sk_buff *skb,
                        err = rtm_to_nh_config_grp_res(tb[NHA_RES_GROUP],
                                                       cfg, extack);
 
+               if (tb[NHA_HW_STATS_ENABLE])
+                       cfg->nh_hw_stats = nla_get_u32(tb[NHA_HW_STATS_ENABLE]);
+
                /* no other attributes should be set */
                goto out;
        }
@@ -3055,6 +3064,10 @@ static int rtm_to_nh_config(struct net *net, struct sk_buff *skb,
                goto out;
        }
 
+       if (tb[NHA_HW_STATS_ENABLE]) {
+               NL_SET_ERR_MSG(extack, "Cannot enable nexthop hardware statistics for non-group nexthops");
+               goto out;
+       }
 
        err = 0;
 out: