xref: /openbmc/linux/net/xfrm/xfrm_device.c (revision 21f42cc9)
121f42cc9SSteffen Klassert /*
221f42cc9SSteffen Klassert  * xfrm_device.c - IPsec device offloading code.
321f42cc9SSteffen Klassert  *
421f42cc9SSteffen Klassert  * Copyright (c) 2015 secunet Security Networks AG
521f42cc9SSteffen Klassert  *
621f42cc9SSteffen Klassert  * Author:
721f42cc9SSteffen Klassert  * Steffen Klassert <steffen.klassert@secunet.com>
821f42cc9SSteffen Klassert  *
921f42cc9SSteffen Klassert  * This program is free software; you can redistribute it and/or
1021f42cc9SSteffen Klassert  * modify it under the terms of the GNU General Public License
1121f42cc9SSteffen Klassert  * as published by the Free Software Foundation; either version
1221f42cc9SSteffen Klassert  * 2 of the License, or (at your option) any later version.
1321f42cc9SSteffen Klassert  */
1421f42cc9SSteffen Klassert 
1521f42cc9SSteffen Klassert #include <linux/errno.h>
1621f42cc9SSteffen Klassert #include <linux/module.h>
1721f42cc9SSteffen Klassert #include <linux/netdevice.h>
1821f42cc9SSteffen Klassert #include <linux/skbuff.h>
1921f42cc9SSteffen Klassert #include <linux/slab.h>
2021f42cc9SSteffen Klassert #include <linux/spinlock.h>
2121f42cc9SSteffen Klassert #include <net/dst.h>
2221f42cc9SSteffen Klassert #include <net/xfrm.h>
2321f42cc9SSteffen Klassert #include <linux/notifier.h>
2421f42cc9SSteffen Klassert 
2521f42cc9SSteffen Klassert static int xfrm_dev_event(struct notifier_block *this, unsigned long event, void *ptr)
2621f42cc9SSteffen Klassert {
2721f42cc9SSteffen Klassert 	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
2821f42cc9SSteffen Klassert 
2921f42cc9SSteffen Klassert 	switch (event) {
3021f42cc9SSteffen Klassert 	case NETDEV_DOWN:
3121f42cc9SSteffen Klassert 		xfrm_garbage_collect(dev_net(dev));
3221f42cc9SSteffen Klassert 	}
3321f42cc9SSteffen Klassert 	return NOTIFY_DONE;
3421f42cc9SSteffen Klassert }
3521f42cc9SSteffen Klassert 
3621f42cc9SSteffen Klassert static struct notifier_block xfrm_dev_notifier = {
3721f42cc9SSteffen Klassert 	.notifier_call	= xfrm_dev_event,
3821f42cc9SSteffen Klassert };
3921f42cc9SSteffen Klassert 
4021f42cc9SSteffen Klassert void __net_init xfrm_dev_init(void)
4121f42cc9SSteffen Klassert {
4221f42cc9SSteffen Klassert 	register_netdevice_notifier(&xfrm_dev_notifier);
4321f42cc9SSteffen Klassert }
44