Commit 746c19a5 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller
Browse files

net: nexthop: Add ability to enable / disable hardware statistics



Add netlink support for enabling collection of HW statistics on nexthop
groups.

Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5877786f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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;

+3 −0
Original line number Diff line number Diff line
@@ -68,6 +68,9 @@ enum {
	/* nested; nexthop group stats */
	NHA_GROUP_STATS,

	/* u32; nexthop hardware stats enable */
	NHA_HW_STATS_ENABLE,

	__NHA_MAX,
};

+14 −1
Original line number Diff line number Diff line
@@ -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: