Network Event Notifier Mechanism
Subsystems (4)
cover Network Event Notifier Mechanism
Dave/Roland, is this patchset about ready to go?
Round 5 Changes:
- removed user-mode support
- removed route add/del events.
------
This patch implements a mechanism that allows interested clients to register for notification of certain network events. The intended use is to allow RDMA devices (linux/drivers/infiniband) to be notified of neighbour updates, ICMP redirects, and path MTU changes.
RDMA devices need these network events because they typically cache this information in hardware and need to be notified when it changes. To learn about RDMA internet protocols, see:
http://www.ietf.org/html.charters/rddp-charter.html.
The key events of interest are:
- neighbour mac address change
- routing redirect (the next hop neighbour changes for a dst_entry)
- path mtu change (the path mtu for a dst_entry changes).
This patchset consists of 3 patches:
1) New files implementing the Network Event Notifier
2) Core network changes to generate netevents
3) Cleanup ib_addr modules to use the netevent patch
PATCH 1/3 Network Event Notifier Mechanism.
This patch uses notifier blocks to implement a network event notifier mechanism.
Clients register their callback function by calling register_netevent_notifier() like this:
static struct notifier_block nb = {
.notifier_call = my_callback_func
};
...
register_netevent_notifier(&nb);
---
include/net/netevent.h | 33 +++++++++++++++++++++++ net/core/netevent.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 0 deletions(-)
include/net/netevent.h new file +33 -0
@@ -0,0 +1,33 @@ +#ifndef _NET_EVENT_H +#define _NET_EVENT_H + +/* +* Generic netevent notifiers +* +* Authors: +* Tom Tucker <[email protected]> +* Steve Wise <[email protected]> +* +* Changes: +*/ +#ifdef __KERNEL__ + +#include <net/dst.h> + +struct netevent_redirect { +struct dst_entry *old; +struct dst_entry *new; +}; + +enum netevent_notif_type { +NETEVENT_NEIGH_UPDATE =1 ,/* arg is struct neighbour ptr */ +NETEVENT_PMTU_UPDATE ,/* arg is struct dst_entry ptr */ +NETEVENT_REDIRECT ,/* arg is struct netevent_redirect ptr */ +}; + +extern int register_netevent_notifier (struct notifier_block *nb); +extern int unregister_netevent_notifier (struct notifier_block *nb); +extern int call_netevent_notifiers (unsigned long val,void *v); + +#endif +#endif
net/core/netevent.c new file +69 -0
69 lines not on this page · raw message
PATCH 2/3 Core net changes to generate netevents
In reply to Steve WiseGenerate netevents for:
- neighbour changes
- routing redirects
- pmtu changes
---
net/core/Makefile | 2 +- net/core/neighbour.c | 14 ++++++++------ net/ipv4/route.c | 8 ++++++++ net/ipv6/route.c | 7 +++++++ 4 files changed, 24 insertions(+), 7 deletions(-)
net/core/Makefile +1 -1
@@ -7,7 +7,7 @@ obj-y := sock.o request_sock.o skbuff.o obj-$(CONFIG_SYSCTL) += sysctl_net_core.o -obj-y += dev.o ethtool.o dev_mcast.o dst.o \ +obj-y += dev.o ethtool.o dev_mcast.o dst.o netevent.o \ neighbour.o rtnetlink.o utils.o link_watch.o filter.o obj-$(CONFIG_XFRM) += flow.o
net/core/neighbour.c +8 -6
@@ -29,6 +29,7 @@ #include <linux/times.h>#include <net/neighbour.h> #include <net/dst.h> #include <net/sock.h> +#include <net/netevent.h> #include <linux/rtnetlink.h> #include <linux/random.h> #include <linux/string.h>
@@ -754,6 +755,7 @@ #endif neigh->nud_state =NUD_STALE ; neigh->updated = jiffies;neigh_suspect (neigh); + notify =1 ; } }else if (state &NUD_DELAY ) { if (time_before_eq(now,
@@ -762,6 +764,7 @@ #endif neigh->nud_state =NUD_REACHABLE ; neigh->updated = jiffies;neigh_connect (neigh); + notify =1 ; next = neigh->confirmed + neigh->parms->reachable_time; }else {NEIGH_PRINTK2 ("neigh %p is probed.\n" , neigh);
@@ -819,6 +822,8 @@ #endif out:write_unlock (&neigh->lock); } +if (notify) +call_netevent_notifiers (NETEVENT_NEIGH_UPDATE , neigh);#ifdef CONFIG_ARPD if (notify && neigh->parms->app_probes)
@@ -926,9 +931,7 @@ int neigh_update(struct neighbour *neigh {u8 old;int err; -#ifdef CONFIG_ARPD int notify =0 ; -#endif struct net_device *dev;int update_isrouter =0 ;
@@ -948,9 +951,7 @@ #endifneigh_suspect (neigh); neigh->nud_state = new; err =0 ; -#ifdef CONFIG_ARPD notify = old &NUD_VALID ; -#endif goto out; }
@@ -1022,9 +1023,7 @@ #endifif (!(new &NUD_CONNECTED )) neigh->confirmed = jiffies - (neigh->parms->base_reachable_time <<1 ); -#ifdef CONFIG_ARPD notify =1 ; -#endif }if (new == old) goto out;
@@ -1056,6 +1055,9 @@ out: (neigh->flags & ~NTF_ROUTER ); }write_unlock_bh (&neigh->lock); + +if (notify) +call_netevent_notifiers (NETEVENT_NEIGH_UPDATE , neigh);#ifdef CONFIG_ARPD if (notify && neigh->parms->app_probes)neigh_app_notify (neigh);
net/ipv4/route.c +8 -0
@@ -104,6 +104,7 @@ #include <net/tcp.h>#include <net/icmp.h> #include <net/xfrm.h> #include <net/ip_mp_alg.h> +#include <net/netevent.h> #ifdef CONFIG_SYSCTL #include <linux/sysctl.h> #endif
@@ -1125,6 +1126,7 @@ void ip_rt_redirect(u32 old_gw, u32 daddstruct rtable *rth, **rthp;u32 skeys[2 ] = { saddr,0 };int ikeys[2 ] = { dev->ifindex,0 }; +struct netevent_redirect netevent;if (!in_dev)return ;
@@ -1216,6 +1218,11 @@ void ip_rt_redirect(u32 old_gw, u32 daddrt_drop (rt); goto do_next; } + + netevent.old = &rth->u.dst; + netevent.new = &rt->u.dst; +call_netevent_notifiers (NETEVENT_REDIRECT , + &netevent);rt_del (hash, rth);if (!rt_intern_hash (hash, rt, &rt))
@@ -1452,6 +1459,7 @@ static void ip_rt_update_pmtu(struct dst } dst->metrics[RTAX_MTU -1 ] = mtu;dst_set_expires (dst, ip_rt_mtu_expires); +call_netevent_notifiers (NETEVENT_PMTU_UPDATE , dst); } }
net/ipv6/route.c +7 -0
@@ -53,6 +53,7 @@ #include <net/tcp.h>#include <linux/rtnetlink.h> #include <net/dst.h> #include <net/xfrm.h> +#include <net/netevent.h> #include <asm/uaccess.h>
@@ -742,6 +743,7 @@ static void ip6_rt_update_pmtu(struct ds dst->metrics[RTAX_FEATURES -1 ] |=RTAX_FEATURE_ALLFRAG ; } dst->metrics[RTAX_MTU -1 ] = mtu; +call_netevent_notifiers (NETEVENT_PMTU_UPDATE , dst); } }
@@ -1155,6 +1157,7 @@ void rt6_redirect(struct in6_addr *dest,struct rt6_info *rt, *nrt =NULL ;int strict;struct fib6_node *fn; +struct netevent_redirect netevent;/* * Get the "current" route for this destination and
@@ -1252,6 +1255,10 @@ restart:if (ip6_ins_rt (nrt,NULL ,NULL ,NULL )) goto out; + netevent.old = &rt->u.dst; + netevent.new = &nrt->u.dst; +call_netevent_notifiers (NETEVENT_REDIRECT , &netevent); +if (rt->rt6i_flags&RTF_CACHE ) {ip6_del_rt (rt,NULL ,NULL ,NULL );return ;
PATCH 3/3 Cleanup ib_addr module to use the netevents
In reply to Steve Wise---
drivers/infiniband/core/addr.c | 30 ++++++++++++++---------------- 1 files changed, 14 insertions(+), 16 deletions(-)
drivers/infiniband/core/addr.c +14 -16
@@ -35,6 +35,7 @@ #include <linux/if_arp.h>#include <net/arp.h> #include <net/neighbour.h> #include <net/route.h> +#include <net/netevent.h> #include <rdma/ib_addr.h> MODULE_AUTHOR ("Sean Hefty" );
@@ -326,25 +327,22 @@ void rdma_addr_cancel(struct rdma_dev_ad }EXPORT_SYMBOL (rdma_addr_cancel); -static int addr_arp_recv (struct sk_buff *skb,struct net_device *dev, -struct packet_type *pkt,struct net_device *orig_dev) +static int netevent_callback (struct notifier_block *self,unsigned long event, +void *ctx) { -struct arphdr *arp_hdr; +if (event ==NETEVENT_NEIGH_UPDATE ) { +struct neighbour *neigh = ctx; - arp_hdr = (struct arphdr *) skb->nh.raw; - -if (arp_hdr->ar_op ==htons (ARPOP_REQUEST ) || - arp_hdr->ar_op ==htons (ARPOP_REPLY )) -set_timeout (jiffies); - -kfree_skb (skb); +if (neigh->dev->type ==ARPHRD_INFINIBAND && + (neigh->nud_state &NUD_VALID )) { +set_timeout (jiffies); + } + }return 0 ; } -static struct packet_type addr_arp = { - .type =__constant_htons (ETH_P_ARP ), - .func = addr_arp_recv, - .af_packet_priv = (void *)1 , +static struct notifier_block nb = { + .notifier_call = netevent_callback };static int addr_init (void )
@@ -353,13 +351,13 @@ static int addr_init(void)if (!addr_wq)return -ENOMEM ; -dev_add_pack (&addr_arp); +register_netevent_notifier (&nb);return 0 ; }static void addr_cleanup (void ) { -dev_remove_pack (&addr_arp); +unregister_netevent_notifier (&nb);destroy_workqueue (addr_wq); }
David Miller
maintainerFrom: Steve Wise <[email protected]>
Date: Fri, 28 Jul 2006 13:28:49 -0500
Quoted 1 line
Dave/Roland, is this patchset about ready to go?
All 3 patches applied, thanks Steve.