Commit da230501 authored by Petr Machata's avatar Petr Machata Committed by Jakub Kicinski
Browse files

nexthop: Dispatch notifier init()/fini() by group type



After there are several next-hop group types, initialization and
finalization of notifier type needs to reflect the actual type. Transform
nh_notifier_grp_info_init() and _fini() to make extending them easier.

Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 09ad6bec
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -86,10 +86,9 @@ static void nh_notifier_single_info_fini(struct nh_notifier_info *info)
	kfree(info->nh);
}

static int nh_notifier_grp_info_init(struct nh_notifier_info *info,
				     const struct nexthop *nh)
static int nh_notifier_mp_info_init(struct nh_notifier_info *info,
				    struct nh_group *nhg)
{
	struct nh_group *nhg = rtnl_dereference(nh->nh_grp);
	u16 num_nh = nhg->num_nh;
	int i;

@@ -114,8 +113,22 @@ static int nh_notifier_grp_info_init(struct nh_notifier_info *info,
	return 0;
}

static void nh_notifier_grp_info_fini(struct nh_notifier_info *info)
static int nh_notifier_grp_info_init(struct nh_notifier_info *info,
				     const struct nexthop *nh)
{
	struct nh_group *nhg = rtnl_dereference(nh->nh_grp);

	if (nhg->mpath)
		return nh_notifier_mp_info_init(info, nhg);
	return -EINVAL;
}

static void nh_notifier_grp_info_fini(struct nh_notifier_info *info,
				      const struct nexthop *nh)
{
	struct nh_group *nhg = rtnl_dereference(nh->nh_grp);

	if (nhg->mpath)
		kfree(info->nh_grp);
}

@@ -134,7 +147,7 @@ static void nh_notifier_info_fini(struct nh_notifier_info *info,
				  const struct nexthop *nh)
{
	if (nh->is_group)
		nh_notifier_grp_info_fini(info);
		nh_notifier_grp_info_fini(info, nh);
	else
		nh_notifier_single_info_fini(info);
}