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

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
...@@ -55,14 +55,6 @@ static inline bool ipmr_rule_default(const struct fib_rule *rule) ...@@ -55,14 +55,6 @@ static inline bool ipmr_rule_default(const struct fib_rule *rule)
} }
#endif #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 #define VIFF_STATIC 0x8000
struct mfc_cache_cmp_arg { struct mfc_cache_cmp_arg {
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <net/net_namespace.h> #include <net/net_namespace.h>
#include <net/sock.h> #include <net/sock.h>
#include <net/fib_notifier.h>
/** /**
* struct vif_device - interface representor for multicast routing * struct vif_device - interface representor for multicast routing
...@@ -36,6 +37,58 @@ struct vif_device { ...@@ -36,6 +37,58 @@ struct vif_device {
__be32 local, remote; __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 #ifndef MAXVIFS
/* This one is nasty; value is defined in uapi using different symbols for /* This one is nasty; value is defined in uapi using different symbols for
* mroute and morute6 but both map into same 32. * mroute and morute6 but both map into same 32.
......
...@@ -650,18 +650,8 @@ static int call_ipmr_vif_entry_notifier(struct notifier_block *nb, ...@@ -650,18 +650,8 @@ static int call_ipmr_vif_entry_notifier(struct notifier_block *nb,
struct vif_device *vif, struct vif_device *vif,
vifi_t vif_index, u32 tb_id) vifi_t vif_index, u32 tb_id)
{ {
struct vif_entry_notifier_info info = { return mr_call_vif_notifier(nb, net, RTNL_FAMILY_IPMR, event_type,
.info = { vif, vif_index, tb_id);
.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);
} }
static int call_ipmr_vif_entry_notifiers(struct net *net, static int call_ipmr_vif_entry_notifiers(struct net *net,
...@@ -669,20 +659,9 @@ 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, struct vif_device *vif,
vifi_t vif_index, u32 tb_id) vifi_t vif_index, u32 tb_id)
{ {
struct vif_entry_notifier_info info = { return mr_call_vif_notifiers(net, RTNL_FAMILY_IPMR, event_type,
.info = { vif, vif_index, tb_id,
.family = RTNL_FAMILY_IPMR, &net->ipv4.ipmr_seq);
.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);
} }
static int call_ipmr_mfc_entry_notifier(struct notifier_block *nb, static int call_ipmr_mfc_entry_notifier(struct notifier_block *nb,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment