diff --git a/sys/compat/linuxkpi/common/include/linux/netdevice.h b/sys/compat/linuxkpi/common/include/linux/netdevice.h --- a/sys/compat/linuxkpi/common/include/linux/netdevice.h +++ b/sys/compat/linuxkpi/common/include/linux/netdevice.h @@ -88,17 +88,6 @@ return (dev->if_softc); } -static inline struct net_device * -netdev_notifier_info_to_dev(void *ifp) -{ - return (ifp); -} - -int register_netdevice_notifier(struct notifier_block *); -int register_inetaddr_notifier(struct notifier_block *); -int unregister_netdevice_notifier(struct notifier_block *); -int unregister_inetaddr_notifier(struct notifier_block *); - #define rtnl_lock() #define rtnl_unlock() @@ -140,4 +129,20 @@ return -if_addmulti(dev, (struct sockaddr *)&sdl, NULL); } +/* According to linux::ipoib_main.c. */ +struct netdev_notifier_info { + struct net_device *dev; +}; + +static inline struct net_device * +netdev_notifier_info_to_dev(struct netdev_notifier_info *ni) +{ + return (ni->dev); +} + +int register_netdevice_notifier(struct notifier_block *); +int register_inetaddr_notifier(struct notifier_block *); +int unregister_netdevice_notifier(struct notifier_block *); +int unregister_inetaddr_notifier(struct notifier_block *); + #endif /* _LINUX_NETDEVICE_H_ */ diff --git a/sys/compat/linuxkpi/common/src/linux_compat.c b/sys/compat/linuxkpi/common/src/linux_compat.c --- a/sys/compat/linuxkpi/common/src/linux_compat.c +++ b/sys/compat/linuxkpi/common/src/linux_compat.c @@ -2256,48 +2256,58 @@ linux_handle_ifnet_link_event(void *arg, struct ifnet *ifp, int linkstate) { struct notifier_block *nb; + struct netdev_notifier_info ni; nb = arg; + ni.dev = (struct net_device *)ifp; if (linkstate == LINK_STATE_UP) - nb->notifier_call(nb, NETDEV_UP, ifp); + nb->notifier_call(nb, NETDEV_UP, &ni); else - nb->notifier_call(nb, NETDEV_DOWN, ifp); + nb->notifier_call(nb, NETDEV_DOWN, &ni); } static void linux_handle_ifnet_arrival_event(void *arg, struct ifnet *ifp) { struct notifier_block *nb; + struct netdev_notifier_info ni; nb = arg; - nb->notifier_call(nb, NETDEV_REGISTER, ifp); + ni.dev = (struct net_device *)ifp; + nb->notifier_call(nb, NETDEV_REGISTER, &ni); } static void linux_handle_ifnet_departure_event(void *arg, struct ifnet *ifp) { struct notifier_block *nb; + struct netdev_notifier_info ni; nb = arg; - nb->notifier_call(nb, NETDEV_UNREGISTER, ifp); + ni.dev = (struct net_device *)ifp; + nb->notifier_call(nb, NETDEV_UNREGISTER, &ni); } static void linux_handle_iflladdr_event(void *arg, struct ifnet *ifp) { struct notifier_block *nb; + struct netdev_notifier_info ni; nb = arg; - nb->notifier_call(nb, NETDEV_CHANGEADDR, ifp); + ni.dev = (struct net_device *)ifp; + nb->notifier_call(nb, NETDEV_CHANGEADDR, &ni); } static void linux_handle_ifaddr_event(void *arg, struct ifnet *ifp) { struct notifier_block *nb; + struct netdev_notifier_info ni; nb = arg; - nb->notifier_call(nb, NETDEV_CHANGEIFADDR, ifp); + ni.dev = (struct net_device *)ifp; + nb->notifier_call(nb, NETDEV_CHANGEIFADDR, &ni); } int