Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54c4cad9 authored by Yuval Mintz's avatar Yuval Mintz Committed by David S. Miller
Browse files

ipmr: Make MFC fib notifiers common



Like vif notifications, move the notifier struct for MFC as well as its
helpers into a common file; Currently they're only used by ipmr.

Signed-off-by: default avatarYuval Mintz <yuvalm@mellanox.com>
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bc67a0da
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -5391,7 +5391,9 @@ static int mlxsw_sp_router_fibmr_add(struct mlxsw_sp *mlxsw_sp,
	if (IS_ERR(vr))
		return PTR_ERR(vr);

	return mlxsw_sp_mr_route4_add(vr->mr4_table, men_info->mfc, replace);
	return mlxsw_sp_mr_route4_add(vr->mr4_table,
				      (struct mfc_cache *) men_info->mfc,
				      replace);
}

static void mlxsw_sp_router_fibmr_del(struct mlxsw_sp *mlxsw_sp,
@@ -5406,7 +5408,8 @@ static void mlxsw_sp_router_fibmr_del(struct mlxsw_sp *mlxsw_sp,
	if (WARN_ON(!vr))
		return;

	mlxsw_sp_mr_route4_del(vr->mr4_table, men_info->mfc);
	mlxsw_sp_mr_route4_del(vr->mr4_table,
			       (struct mfc_cache *) men_info->mfc);
	mlxsw_sp_vr_put(mlxsw_sp, vr);
}

@@ -5682,11 +5685,11 @@ static void mlxsw_sp_router_fibmr_event_work(struct work_struct *work)
						replace);
		if (err)
			mlxsw_sp_router_fib_abort(mlxsw_sp);
		ipmr_cache_put(fib_work->men_info.mfc);
		ipmr_cache_put((struct mfc_cache *) fib_work->men_info.mfc);
		break;
	case FIB_EVENT_ENTRY_DEL:
		mlxsw_sp_router_fibmr_del(mlxsw_sp, &fib_work->men_info);
		ipmr_cache_put(fib_work->men_info.mfc);
		ipmr_cache_put((struct mfc_cache *) fib_work->men_info.mfc);
		break;
	case FIB_EVENT_VIF_ADD:
		err = mlxsw_sp_router_fibmr_vif_add(mlxsw_sp,
@@ -5766,7 +5769,7 @@ mlxsw_sp_router_fibmr_event(struct mlxsw_sp_fib_event_work *fib_work,
	case FIB_EVENT_ENTRY_ADD: /* fall through */
	case FIB_EVENT_ENTRY_DEL:
		memcpy(&fib_work->men_info, info, sizeof(fib_work->men_info));
		ipmr_cache_hold(fib_work->men_info.mfc);
		ipmr_cache_hold((struct mfc_cache *) fib_work->men_info.mfc);
		break;
	case FIB_EVENT_VIF_ADD: /* fall through */
	case FIB_EVENT_VIF_DEL:
+0 −6
Original line number Diff line number Diff line
@@ -80,12 +80,6 @@ struct mfc_cache {
	};
};

struct mfc_entry_notifier_info {
	struct fib_notifier_info info;
	struct mfc_cache *mfc;
	u32 tb_id;
};

struct rtmsg;
int ipmr_get_route(struct net *net, struct sk_buff *skb,
		   __be32 saddr, __be32 daddr,
+44 −0
Original line number Diff line number Diff line
@@ -152,6 +152,50 @@ struct mr_mfc {
	struct rcu_head	rcu;
};

struct mfc_entry_notifier_info {
	struct fib_notifier_info info;
	struct mr_mfc *mfc;
	u32 tb_id;
};

static inline int mr_call_mfc_notifier(struct notifier_block *nb,
				       struct net *net,
				       unsigned short family,
				       enum fib_event_type event_type,
				       struct mr_mfc *mfc, u32 tb_id)
{
	struct mfc_entry_notifier_info info = {
		.info = {
			.family = family,
			.net = net,
		},
		.mfc = mfc,
		.tb_id = tb_id
	};

	return call_fib_notifier(nb, net, event_type, &info.info);
}

static inline int mr_call_mfc_notifiers(struct net *net,
					unsigned short family,
					enum fib_event_type event_type,
					struct mr_mfc *mfc, u32 tb_id,
					unsigned int *ipmr_seq)
{
	struct mfc_entry_notifier_info info = {
		.info = {
			.family = family,
			.net = net,
		},
		.mfc = mfc,
		.tb_id = tb_id
	};

	ASSERT_RTNL();
	(*ipmr_seq)++;
	return call_fib_notifiers(net, event_type, &info.info);
}

struct mr_table;

/**
+4 −22
Original line number Diff line number Diff line
@@ -669,34 +669,16 @@ static int call_ipmr_mfc_entry_notifier(struct notifier_block *nb,
					enum fib_event_type event_type,
					struct mfc_cache *mfc, u32 tb_id)
{
	struct mfc_entry_notifier_info info = {
		.info = {
			.family = RTNL_FAMILY_IPMR,
			.net = net,
		},
		.mfc = mfc,
		.tb_id = tb_id
	};

	return call_fib_notifier(nb, net, event_type, &info.info);
	return mr_call_mfc_notifier(nb, net, RTNL_FAMILY_IPMR,
				    event_type, &mfc->_c, tb_id);
}

static int call_ipmr_mfc_entry_notifiers(struct net *net,
					 enum fib_event_type event_type,
					 struct mfc_cache *mfc, u32 tb_id)
{
	struct mfc_entry_notifier_info info = {
		.info = {
			.family = RTNL_FAMILY_IPMR,
			.net = net,
		},
		.mfc = mfc,
		.tb_id = tb_id
	};

	ASSERT_RTNL();
	net->ipv4.ipmr_seq++;
	return call_fib_notifiers(net, event_type, &info.info);
	return mr_call_mfc_notifiers(net, RTNL_FAMILY_IPMR, event_type,
				     &mfc->_c, tb_id, &net->ipv4.ipmr_seq);
}

/**