Re: [patch net-next v2 03/12] ipmr: Add FIB notification access functions
On 25/09/17 12:47, Jiri Pirko wrote: > Mon, Sep 25, 2017 at 11:40:16AM CEST, niko...@cumulusnetworks.com wrote: >> On 25/09/17 12:35, Nikolay Aleksandrov wrote: >>> On 24/09/17 20:22, Jiri Pirko wrote: From: Yotam GigiMake the ipmr module register as a FIB notifier. To do that, implement both the ipmr_seq_read and ipmr_dump ops. The ipmr_seq_read op returns a sequence counter that is incremented on every notification related operation done by the ipmr. To implement that, add a sequence counter in the netns_ipv4 struct and increment it whenever a new MFC route or VIF are added or deleted. The sequence operations are protected by the RTNL lock. The ipmr_dump iterates the list of MFC routes and the list of VIF entries and sends notifications about them. The entries dump is done under RCU where the VIF dump uses the mrt_lock too, as the vif->dev field can change under RCU. Signed-off-by: Yotam Gigi Reviewed-by: Ido Schimmel Signed-off-by: Jiri Pirko --- v1->v2: - Take the mrt_lock when dumping VIF entries. --- include/linux/mroute.h | 15 ++ include/net/netns/ipv4.h | 3 ++ net/ipv4/ipmr.c | 137 ++- 3 files changed, 153 insertions(+), 2 deletions(-) >>> >>> LGTM, >>> >>> Reviewed-by: Nikolay Aleksandrov >>> >>> >> >> One note here if you're going to spin another version of the set, you can >> consider renaming the call_* functions to either mroute_* or ipmr_* (e.g. >> ipmr_call_...). I personally prefer the ipmr prefix. > > The naming scheme in this patch is aligned with the rest of the code. Definitely not aligned with the rest of the ipmr code because it does not have such calls. Its notifications have a prefix which is not call_. > Please see "call_netdevice_notifiers" for example. Sure, I don't care that much which style you choose, that's why I wrote _consider_, since this code is contained within ipmr and is not exported anywhere. > Please feel free to send a patch to chanche them all. > Jumping the gun a little bit here. :-)
Re: [patch net-next v2 03/12] ipmr: Add FIB notification access functions
Mon, Sep 25, 2017 at 11:40:16AM CEST, niko...@cumulusnetworks.com wrote: >On 25/09/17 12:35, Nikolay Aleksandrov wrote: >> On 24/09/17 20:22, Jiri Pirko wrote: >>> From: Yotam Gigi>>> >>> Make the ipmr module register as a FIB notifier. To do that, implement both >>> the ipmr_seq_read and ipmr_dump ops. >>> >>> The ipmr_seq_read op returns a sequence counter that is incremented on >>> every notification related operation done by the ipmr. To implement that, >>> add a sequence counter in the netns_ipv4 struct and increment it whenever a >>> new MFC route or VIF are added or deleted. The sequence operations are >>> protected by the RTNL lock. >>> >>> The ipmr_dump iterates the list of MFC routes and the list of VIF entries >>> and sends notifications about them. The entries dump is done under RCU >>> where the VIF dump uses the mrt_lock too, as the vif->dev field can change >>> under RCU. >>> >>> Signed-off-by: Yotam Gigi >>> Reviewed-by: Ido Schimmel >>> Signed-off-by: Jiri Pirko >>> --- >>> v1->v2: >>> - Take the mrt_lock when dumping VIF entries. >>> --- >>> include/linux/mroute.h | 15 ++ >>> include/net/netns/ipv4.h | 3 ++ >>> net/ipv4/ipmr.c | 137 >>> ++- >>> 3 files changed, 153 insertions(+), 2 deletions(-) >>> >> >> LGTM, >> >> Reviewed-by: Nikolay Aleksandrov >> >> > >One note here if you're going to spin another version of the set, you can >consider renaming the call_* functions to either mroute_* or ipmr_* (e.g. >ipmr_call_...). I personally prefer the ipmr prefix. The naming scheme in this patch is aligned with the rest of the code. Please see "call_netdevice_notifiers" for example. Please feel free to send a patch to chanche them all.
Re: [patch net-next v2 03/12] ipmr: Add FIB notification access functions
On 25/09/17 12:35, Nikolay Aleksandrov wrote: > On 24/09/17 20:22, Jiri Pirko wrote: >> From: Yotam Gigi>> >> Make the ipmr module register as a FIB notifier. To do that, implement both >> the ipmr_seq_read and ipmr_dump ops. >> >> The ipmr_seq_read op returns a sequence counter that is incremented on >> every notification related operation done by the ipmr. To implement that, >> add a sequence counter in the netns_ipv4 struct and increment it whenever a >> new MFC route or VIF are added or deleted. The sequence operations are >> protected by the RTNL lock. >> >> The ipmr_dump iterates the list of MFC routes and the list of VIF entries >> and sends notifications about them. The entries dump is done under RCU >> where the VIF dump uses the mrt_lock too, as the vif->dev field can change >> under RCU. >> >> Signed-off-by: Yotam Gigi >> Reviewed-by: Ido Schimmel >> Signed-off-by: Jiri Pirko >> --- >> v1->v2: >> - Take the mrt_lock when dumping VIF entries. >> --- >> include/linux/mroute.h | 15 ++ >> include/net/netns/ipv4.h | 3 ++ >> net/ipv4/ipmr.c | 137 >> ++- >> 3 files changed, 153 insertions(+), 2 deletions(-) >> > > LGTM, > > Reviewed-by: Nikolay Aleksandrov > > One note here if you're going to spin another version of the set, you can consider renaming the call_* functions to either mroute_* or ipmr_* (e.g. ipmr_call_...). I personally prefer the ipmr prefix.
Re: [patch net-next v2 03/12] ipmr: Add FIB notification access functions
On 24/09/17 20:22, Jiri Pirko wrote: > From: Yotam Gigi> > Make the ipmr module register as a FIB notifier. To do that, implement both > the ipmr_seq_read and ipmr_dump ops. > > The ipmr_seq_read op returns a sequence counter that is incremented on > every notification related operation done by the ipmr. To implement that, > add a sequence counter in the netns_ipv4 struct and increment it whenever a > new MFC route or VIF are added or deleted. The sequence operations are > protected by the RTNL lock. > > The ipmr_dump iterates the list of MFC routes and the list of VIF entries > and sends notifications about them. The entries dump is done under RCU > where the VIF dump uses the mrt_lock too, as the vif->dev field can change > under RCU. > > Signed-off-by: Yotam Gigi > Reviewed-by: Ido Schimmel > Signed-off-by: Jiri Pirko > --- > v1->v2: > - Take the mrt_lock when dumping VIF entries. > --- > include/linux/mroute.h | 15 ++ > include/net/netns/ipv4.h | 3 ++ > net/ipv4/ipmr.c | 137 > ++- > 3 files changed, 153 insertions(+), 2 deletions(-) > LGTM, Reviewed-by: Nikolay Aleksandrov
Re: [patch net-next v2 03/12] ipmr: Add FIB notification access functions
Hi, Yotam On 2017/9/25 13:38, Yotam Gigi wrote: > On 09/25/2017 04:19 AM, Yunsheng Lin wrote: >> Hi, Jiri >> >> On 2017/9/25 1:22, Jiri Pirko wrote: >>> From: Yotam Gigi>>> >>> Make the ipmr module register as a FIB notifier. To do that, implement both >>> the ipmr_seq_read and ipmr_dump ops. >>> >>> The ipmr_seq_read op returns a sequence counter that is incremented on >>> every notification related operation done by the ipmr. To implement that, >>> add a sequence counter in the netns_ipv4 struct and increment it whenever a >>> new MFC route or VIF are added or deleted. The sequence operations are >>> protected by the RTNL lock. >>> >>> The ipmr_dump iterates the list of MFC routes and the list of VIF entries >>> and sends notifications about them. The entries dump is done under RCU >>> where the VIF dump uses the mrt_lock too, as the vif->dev field can change >>> under RCU. >>> >>> Signed-off-by: Yotam Gigi >>> Reviewed-by: Ido Schimmel >>> Signed-off-by: Jiri Pirko >>> --- >>> v1->v2: >>> - Take the mrt_lock when dumping VIF entries. >>> --- >>> include/linux/mroute.h | 15 ++ >>> include/net/netns/ipv4.h | 3 ++ >>> net/ipv4/ipmr.c | 137 >>> ++- >>> 3 files changed, 153 insertions(+), 2 deletions(-) >>> >>> diff --git a/include/linux/mroute.h b/include/linux/mroute.h >>> index 10028f2..54c5cb8 100644 >>> --- a/include/linux/mroute.h >>> +++ b/include/linux/mroute.h >>> @@ -5,6 +5,7 @@ >>> #include >>> #include >>> #include >>> +#include >>> #include >>> >>> #ifdef CONFIG_IP_MROUTE >>> @@ -58,6 +59,14 @@ struct vif_device { >>> int link; /* Physical interface index >>> */ >>> }; >>> >>> +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 VIF_EXISTS(_mrt, _idx) ((_mrt)->vif_table[_idx].dev != NULL) >>> @@ -146,6 +155,12 @@ struct mfc_cache { >>> struct rcu_head rcu; >>> }; >>> >>> +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, >>> diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h >>> index 8387f09..abc84d9 100644 >>> --- a/include/net/netns/ipv4.h >>> +++ b/include/net/netns/ipv4.h >>> @@ -163,6 +163,9 @@ struct netns_ipv4 { >>> struct fib_notifier_ops *notifier_ops; >>> unsigned intfib_seq;/* protected by rtnl_mutex */ >>> >>> + struct fib_notifier_ops *ipmr_notifier_ops; >> Can we add a const here? > > It cannot be const as it get initialized it in ipmr_notifier_init. > >> >>> + unsigned intipmr_seq; /* protected by rtnl_mutex */ >>> + >>> atomic_trt_genid; >>> }; >>> #endif >>> diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c >>> index 86dc5f9..49879c3 100644 >>> --- a/net/ipv4/ipmr.c >>> +++ b/net/ipv4/ipmr.c >>> @@ -264,6 +264,16 @@ static void __net_exit ipmr_rules_exit(struct net *net) >>> fib_rules_unregister(net->ipv4.mr_rules_ops); >>> rtnl_unlock(); >>> } >>> + >>> +static int ipmr_rules_dump(struct net *net, struct notifier_block *nb) >>> +{ >>> + return fib_rules_dump(net, nb, RTNL_FAMILY_IPMR); >>> +} >>> + >>> +static unsigned int ipmr_rules_seq_read(struct net *net) >>> +{ >>> + return fib_rules_seq_read(net, RTNL_FAMILY_IPMR); >>> +} >>> #else >>> #define ipmr_for_each_table(mrt, net) \ >>> for (mrt = net->ipv4.mrt; mrt; mrt = NULL) >>> @@ -298,6 +308,16 @@ static void __net_exit ipmr_rules_exit(struct net *net) >>> net->ipv4.mrt = NULL; >>> rtnl_unlock(); >>> } >>> + >>> +static int ipmr_rules_dump(struct net *net, struct notifier_block *nb) >>> +{ >>> + return 0; >>> +} >>> + >>> +static unsigned int ipmr_rules_seq_read(struct net *net) >>> +{ >>> + return 0; >>> +} >>> #endif >>> >>> static inline int ipmr_hash_cmp(struct rhashtable_compare_arg *arg, >>> @@ -587,6 +607,43 @@ static struct net_device *ipmr_reg_vif(struct net >>> *net, struct mr_table *mrt) >>> } >>> #endif >>> >>> +static int call_ipmr_vif_entry_notifier(struct notifier_block *nb, >>> + struct net *net, >>> + enum fib_event_type event_type, >>> + 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,
Re: [patch net-next v2 03/12] ipmr: Add FIB notification access functions
On 09/25/2017 04:19 AM, Yunsheng Lin wrote: > Hi, Jiri > > On 2017/9/25 1:22, Jiri Pirko wrote: >> From: Yotam Gigi>> >> Make the ipmr module register as a FIB notifier. To do that, implement both >> the ipmr_seq_read and ipmr_dump ops. >> >> The ipmr_seq_read op returns a sequence counter that is incremented on >> every notification related operation done by the ipmr. To implement that, >> add a sequence counter in the netns_ipv4 struct and increment it whenever a >> new MFC route or VIF are added or deleted. The sequence operations are >> protected by the RTNL lock. >> >> The ipmr_dump iterates the list of MFC routes and the list of VIF entries >> and sends notifications about them. The entries dump is done under RCU >> where the VIF dump uses the mrt_lock too, as the vif->dev field can change >> under RCU. >> >> Signed-off-by: Yotam Gigi >> Reviewed-by: Ido Schimmel >> Signed-off-by: Jiri Pirko >> --- >> v1->v2: >> - Take the mrt_lock when dumping VIF entries. >> --- >> include/linux/mroute.h | 15 ++ >> include/net/netns/ipv4.h | 3 ++ >> net/ipv4/ipmr.c | 137 >> ++- >> 3 files changed, 153 insertions(+), 2 deletions(-) >> >> diff --git a/include/linux/mroute.h b/include/linux/mroute.h >> index 10028f2..54c5cb8 100644 >> --- a/include/linux/mroute.h >> +++ b/include/linux/mroute.h >> @@ -5,6 +5,7 @@ >> #include >> #include >> #include >> +#include >> #include >> >> #ifdef CONFIG_IP_MROUTE >> @@ -58,6 +59,14 @@ struct vif_device { >> int link; /* Physical interface index >> */ >> }; >> >> +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 VIF_EXISTS(_mrt, _idx) ((_mrt)->vif_table[_idx].dev != NULL) >> @@ -146,6 +155,12 @@ struct mfc_cache { >> struct rcu_head rcu; >> }; >> >> +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, >> diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h >> index 8387f09..abc84d9 100644 >> --- a/include/net/netns/ipv4.h >> +++ b/include/net/netns/ipv4.h >> @@ -163,6 +163,9 @@ struct netns_ipv4 { >> struct fib_notifier_ops *notifier_ops; >> unsigned intfib_seq;/* protected by rtnl_mutex */ >> >> +struct fib_notifier_ops *ipmr_notifier_ops; > Can we add a const here? It cannot be const as it get initialized it in ipmr_notifier_init. > >> +unsigned intipmr_seq; /* protected by rtnl_mutex */ >> + >> atomic_trt_genid; >> }; >> #endif >> diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c >> index 86dc5f9..49879c3 100644 >> --- a/net/ipv4/ipmr.c >> +++ b/net/ipv4/ipmr.c >> @@ -264,6 +264,16 @@ static void __net_exit ipmr_rules_exit(struct net *net) >> fib_rules_unregister(net->ipv4.mr_rules_ops); >> rtnl_unlock(); >> } >> + >> +static int ipmr_rules_dump(struct net *net, struct notifier_block *nb) >> +{ >> +return fib_rules_dump(net, nb, RTNL_FAMILY_IPMR); >> +} >> + >> +static unsigned int ipmr_rules_seq_read(struct net *net) >> +{ >> +return fib_rules_seq_read(net, RTNL_FAMILY_IPMR); >> +} >> #else >> #define ipmr_for_each_table(mrt, net) \ >> for (mrt = net->ipv4.mrt; mrt; mrt = NULL) >> @@ -298,6 +308,16 @@ static void __net_exit ipmr_rules_exit(struct net *net) >> net->ipv4.mrt = NULL; >> rtnl_unlock(); >> } >> + >> +static int ipmr_rules_dump(struct net *net, struct notifier_block *nb) >> +{ >> +return 0; >> +} >> + >> +static unsigned int ipmr_rules_seq_read(struct net *net) >> +{ >> +return 0; >> +} >> #endif >> >> static inline int ipmr_hash_cmp(struct rhashtable_compare_arg *arg, >> @@ -587,6 +607,43 @@ static struct net_device *ipmr_reg_vif(struct net *net, >> struct mr_table *mrt) >> } >> #endif >> >> +static int call_ipmr_vif_entry_notifier(struct notifier_block *nb, >> +struct net *net, >> +enum fib_event_type event_type, >> +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, >> +}; > We only use info.info which is fib_notifier_info, the > vif_entry_notifier_info
Re: [patch net-next v2 03/12] ipmr: Add FIB notification access functions
Hi, Jiri On 2017/9/25 1:22, Jiri Pirko wrote: > From: Yotam Gigi> > Make the ipmr module register as a FIB notifier. To do that, implement both > the ipmr_seq_read and ipmr_dump ops. > > The ipmr_seq_read op returns a sequence counter that is incremented on > every notification related operation done by the ipmr. To implement that, > add a sequence counter in the netns_ipv4 struct and increment it whenever a > new MFC route or VIF are added or deleted. The sequence operations are > protected by the RTNL lock. > > The ipmr_dump iterates the list of MFC routes and the list of VIF entries > and sends notifications about them. The entries dump is done under RCU > where the VIF dump uses the mrt_lock too, as the vif->dev field can change > under RCU. > > Signed-off-by: Yotam Gigi > Reviewed-by: Ido Schimmel > Signed-off-by: Jiri Pirko > --- > v1->v2: > - Take the mrt_lock when dumping VIF entries. > --- > include/linux/mroute.h | 15 ++ > include/net/netns/ipv4.h | 3 ++ > net/ipv4/ipmr.c | 137 > ++- > 3 files changed, 153 insertions(+), 2 deletions(-) > > diff --git a/include/linux/mroute.h b/include/linux/mroute.h > index 10028f2..54c5cb8 100644 > --- a/include/linux/mroute.h > +++ b/include/linux/mroute.h > @@ -5,6 +5,7 @@ > #include > #include > #include > +#include > #include > > #ifdef CONFIG_IP_MROUTE > @@ -58,6 +59,14 @@ struct vif_device { > int link; /* Physical interface index > */ > }; > > +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 VIF_EXISTS(_mrt, _idx) ((_mrt)->vif_table[_idx].dev != NULL) > @@ -146,6 +155,12 @@ struct mfc_cache { > struct rcu_head rcu; > }; > > +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, > diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h > index 8387f09..abc84d9 100644 > --- a/include/net/netns/ipv4.h > +++ b/include/net/netns/ipv4.h > @@ -163,6 +163,9 @@ struct netns_ipv4 { > struct fib_notifier_ops *notifier_ops; > unsigned intfib_seq;/* protected by rtnl_mutex */ > > + struct fib_notifier_ops *ipmr_notifier_ops; Can we add a const here? > + unsigned intipmr_seq; /* protected by rtnl_mutex */ > + > atomic_trt_genid; > }; > #endif > diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c > index 86dc5f9..49879c3 100644 > --- a/net/ipv4/ipmr.c > +++ b/net/ipv4/ipmr.c > @@ -264,6 +264,16 @@ static void __net_exit ipmr_rules_exit(struct net *net) > fib_rules_unregister(net->ipv4.mr_rules_ops); > rtnl_unlock(); > } > + > +static int ipmr_rules_dump(struct net *net, struct notifier_block *nb) > +{ > + return fib_rules_dump(net, nb, RTNL_FAMILY_IPMR); > +} > + > +static unsigned int ipmr_rules_seq_read(struct net *net) > +{ > + return fib_rules_seq_read(net, RTNL_FAMILY_IPMR); > +} > #else > #define ipmr_for_each_table(mrt, net) \ > for (mrt = net->ipv4.mrt; mrt; mrt = NULL) > @@ -298,6 +308,16 @@ static void __net_exit ipmr_rules_exit(struct net *net) > net->ipv4.mrt = NULL; > rtnl_unlock(); > } > + > +static int ipmr_rules_dump(struct net *net, struct notifier_block *nb) > +{ > + return 0; > +} > + > +static unsigned int ipmr_rules_seq_read(struct net *net) > +{ > + return 0; > +} > #endif > > static inline int ipmr_hash_cmp(struct rhashtable_compare_arg *arg, > @@ -587,6 +607,43 @@ static struct net_device *ipmr_reg_vif(struct net *net, > struct mr_table *mrt) > } > #endif > > +static int call_ipmr_vif_entry_notifier(struct notifier_block *nb, > + struct net *net, > + enum fib_event_type event_type, > + 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, > + }; We only use info.info which is fib_notifier_info, the vif_entry_notifier_info seems to be not needed, why not just use fib_notifier_info? > + > + return call_fib_notifier(nb, net, event_type, ); > +} > + > +static int call_ipmr_mfc_entry_notifier(struct notifier_block *nb, > +
[patch net-next v2 03/12] ipmr: Add FIB notification access functions
From: Yotam GigiMake the ipmr module register as a FIB notifier. To do that, implement both the ipmr_seq_read and ipmr_dump ops. The ipmr_seq_read op returns a sequence counter that is incremented on every notification related operation done by the ipmr. To implement that, add a sequence counter in the netns_ipv4 struct and increment it whenever a new MFC route or VIF are added or deleted. The sequence operations are protected by the RTNL lock. The ipmr_dump iterates the list of MFC routes and the list of VIF entries and sends notifications about them. The entries dump is done under RCU where the VIF dump uses the mrt_lock too, as the vif->dev field can change under RCU. Signed-off-by: Yotam Gigi Reviewed-by: Ido Schimmel Signed-off-by: Jiri Pirko --- v1->v2: - Take the mrt_lock when dumping VIF entries. --- include/linux/mroute.h | 15 ++ include/net/netns/ipv4.h | 3 ++ net/ipv4/ipmr.c | 137 ++- 3 files changed, 153 insertions(+), 2 deletions(-) diff --git a/include/linux/mroute.h b/include/linux/mroute.h index 10028f2..54c5cb8 100644 --- a/include/linux/mroute.h +++ b/include/linux/mroute.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #ifdef CONFIG_IP_MROUTE @@ -58,6 +59,14 @@ struct vif_device { int link; /* Physical interface index */ }; +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 VIF_EXISTS(_mrt, _idx) ((_mrt)->vif_table[_idx].dev != NULL) @@ -146,6 +155,12 @@ struct mfc_cache { struct rcu_head rcu; }; +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, diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 8387f09..abc84d9 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h @@ -163,6 +163,9 @@ struct netns_ipv4 { struct fib_notifier_ops *notifier_ops; unsigned intfib_seq;/* protected by rtnl_mutex */ + struct fib_notifier_ops *ipmr_notifier_ops; + unsigned intipmr_seq; /* protected by rtnl_mutex */ + atomic_trt_genid; }; #endif diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 86dc5f9..49879c3 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c @@ -264,6 +264,16 @@ static void __net_exit ipmr_rules_exit(struct net *net) fib_rules_unregister(net->ipv4.mr_rules_ops); rtnl_unlock(); } + +static int ipmr_rules_dump(struct net *net, struct notifier_block *nb) +{ + return fib_rules_dump(net, nb, RTNL_FAMILY_IPMR); +} + +static unsigned int ipmr_rules_seq_read(struct net *net) +{ + return fib_rules_seq_read(net, RTNL_FAMILY_IPMR); +} #else #define ipmr_for_each_table(mrt, net) \ for (mrt = net->ipv4.mrt; mrt; mrt = NULL) @@ -298,6 +308,16 @@ static void __net_exit ipmr_rules_exit(struct net *net) net->ipv4.mrt = NULL; rtnl_unlock(); } + +static int ipmr_rules_dump(struct net *net, struct notifier_block *nb) +{ + return 0; +} + +static unsigned int ipmr_rules_seq_read(struct net *net) +{ + return 0; +} #endif static inline int ipmr_hash_cmp(struct rhashtable_compare_arg *arg, @@ -587,6 +607,43 @@ static struct net_device *ipmr_reg_vif(struct net *net, struct mr_table *mrt) } #endif +static int call_ipmr_vif_entry_notifier(struct notifier_block *nb, + struct net *net, + enum fib_event_type event_type, + 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, ); +} + +static int call_ipmr_mfc_entry_notifier(struct notifier_block *nb, + 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 +