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: Yuval Mintz <yuvalm@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
02a21de90c
commit
bc67a0daf8
@@ -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 @@
|
|||||||
#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 {
|
|||||||
__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,
|
|||||||
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,
|
|||||||
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,
|
||||||
|
Reference in New Issue
Block a user