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

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

ipmr: Make vif fib notifiers common



The fib-notifiers are tightly coupled with the vif_device which is
already common. Move the notifier struct definition and helpers to the
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 02a21de9
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -55,14 +55,6 @@ static inline bool ipmr_rule_default(const struct fib_rule *rule)
}
#endif

struct vif_entry_notifier_info {
	struct fib_notifier_info info;
	struct net_device *dev;
	vifi_t vif_index;
	unsigned short vif_flags;
	u32 tb_id;
};

#define VIFF_STATIC 0x8000

struct mfc_cache_cmp_arg {
+53 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#include <linux/spinlock.h>
#include <net/net_namespace.h>
#include <net/sock.h>
#include <net/fib_notifier.h>

/**
 * struct vif_device - interface representor for multicast routing
@@ -36,6 +37,58 @@ struct vif_device {
	__be32 local, remote;
};

struct vif_entry_notifier_info {
	struct fib_notifier_info info;
	struct net_device *dev;
	unsigned short vif_index;
	unsigned short vif_flags;
	u32 tb_id;
};

static inline int mr_call_vif_notifier(struct notifier_block *nb,
				       struct net *net,
				       unsigned short family,
				       enum fib_event_type event_type,
				       struct vif_device *vif,
				       unsigned short vif_index, u32 tb_id)
{
	struct vif_entry_notifier_info info = {
		.info = {
			.family = family,
			.net = net,
		},
		.dev = vif->dev,
		.vif_index = vif_index,
		.vif_flags = vif->flags,
		.tb_id = tb_id,
	};

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

static inline int mr_call_vif_notifiers(struct net *net,
					unsigned short family,
					enum fib_event_type event_type,
					struct vif_device *vif,
					unsigned short vif_index, u32 tb_id,
					unsigned int *ipmr_seq)
{
	struct vif_entry_notifier_info info = {
		.info = {
			.family = family,
			.net = net,
		},
		.dev = vif->dev,
		.vif_index = vif_index,
		.vif_flags = vif->flags,
		.tb_id = tb_id,
	};

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

#ifndef MAXVIFS
/* This one is nasty; value is defined in uapi using different symbols for
 * mroute and morute6 but both map into same 32.
+5 −26
Original line number Diff line number Diff line
@@ -650,18 +650,8 @@ static int call_ipmr_vif_entry_notifier(struct notifier_block *nb,
					struct vif_device *vif,
					vifi_t vif_index, u32 tb_id)
{
	struct vif_entry_notifier_info info = {
		.info = {
			.family = RTNL_FAMILY_IPMR,
			.net = net,
		},
		.dev = vif->dev,
		.vif_index = vif_index,
		.vif_flags = vif->flags,
		.tb_id = tb_id,
	};

	return call_fib_notifier(nb, net, event_type, &info.info);
	return mr_call_vif_notifier(nb, net, RTNL_FAMILY_IPMR, event_type,
				    vif, vif_index, tb_id);
}

static int call_ipmr_vif_entry_notifiers(struct net *net,
@@ -669,20 +659,9 @@ static int call_ipmr_vif_entry_notifiers(struct net *net,
					 struct vif_device *vif,
					 vifi_t vif_index, u32 tb_id)
{
	struct vif_entry_notifier_info info = {
		.info = {
			.family = RTNL_FAMILY_IPMR,
			.net = net,
		},
		.dev = vif->dev,
		.vif_index = vif_index,
		.vif_flags = vif->flags,
		.tb_id = tb_id,
	};

	ASSERT_RTNL();
	net->ipv4.ipmr_seq++;
	return call_fib_notifiers(net, event_type, &info.info);
	return mr_call_vif_notifiers(net, RTNL_FAMILY_IPMR, event_type,
				     vif, vif_index, tb_id,
				     &net->ipv4.ipmr_seq);
}

static int call_ipmr_mfc_entry_notifier(struct notifier_block *nb,