1e7096c13SJason A. Donenfeld // SPDX-License-Identifier: GPL-2.0 2e7096c13SJason A. Donenfeld /* 3e7096c13SJason A. Donenfeld * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 4e7096c13SJason A. Donenfeld */ 5e7096c13SJason A. Donenfeld 6e7096c13SJason A. Donenfeld #include "version.h" 7e7096c13SJason A. Donenfeld #include "device.h" 8e7096c13SJason A. Donenfeld #include "noise.h" 9e7096c13SJason A. Donenfeld #include "queueing.h" 10e7096c13SJason A. Donenfeld #include "ratelimiter.h" 11e7096c13SJason A. Donenfeld #include "netlink.h" 12e7096c13SJason A. Donenfeld 13e7096c13SJason A. Donenfeld #include <uapi/linux/wireguard.h> 14e7096c13SJason A. Donenfeld 15e7096c13SJason A. Donenfeld #include <linux/init.h> 16e7096c13SJason A. Donenfeld #include <linux/module.h> 17e7096c13SJason A. Donenfeld #include <linux/genetlink.h> 18e7096c13SJason A. Donenfeld #include <net/rtnetlink.h> 19e7096c13SJason A. Donenfeld wg_mod_init(void)20*b251b711SRandy Dunlapstatic int __init wg_mod_init(void) 21e7096c13SJason A. Donenfeld { 22e7096c13SJason A. Donenfeld int ret; 23e7096c13SJason A. Donenfeld 24dc680de2SJason A. Donenfeld ret = wg_allowedips_slab_init(); 25dc680de2SJason A. Donenfeld if (ret < 0) 26dc680de2SJason A. Donenfeld goto err_allowedips; 27dc680de2SJason A. Donenfeld 28e7096c13SJason A. Donenfeld #ifdef DEBUG 29dc680de2SJason A. Donenfeld ret = -ENOTRECOVERABLE; 30e7096c13SJason A. Donenfeld if (!wg_allowedips_selftest() || !wg_packet_counter_selftest() || 31e7096c13SJason A. Donenfeld !wg_ratelimiter_selftest()) 32dc680de2SJason A. Donenfeld goto err_peer; 33e7096c13SJason A. Donenfeld #endif 34e7096c13SJason A. Donenfeld wg_noise_init(); 35e7096c13SJason A. Donenfeld 36a4e9f8e3SJason A. Donenfeld ret = wg_peer_init(); 37a4e9f8e3SJason A. Donenfeld if (ret < 0) 38a4e9f8e3SJason A. Donenfeld goto err_peer; 39a4e9f8e3SJason A. Donenfeld 40e7096c13SJason A. Donenfeld ret = wg_device_init(); 41e7096c13SJason A. Donenfeld if (ret < 0) 42e7096c13SJason A. Donenfeld goto err_device; 43e7096c13SJason A. Donenfeld 44e7096c13SJason A. Donenfeld ret = wg_genetlink_init(); 45e7096c13SJason A. Donenfeld if (ret < 0) 46e7096c13SJason A. Donenfeld goto err_netlink; 47e7096c13SJason A. Donenfeld 48e7096c13SJason A. Donenfeld pr_info("WireGuard " WIREGUARD_VERSION " loaded. See www.wireguard.com for information.\n"); 49e7096c13SJason A. Donenfeld pr_info("Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.\n"); 50e7096c13SJason A. Donenfeld 51e7096c13SJason A. Donenfeld return 0; 52e7096c13SJason A. Donenfeld 53e7096c13SJason A. Donenfeld err_netlink: 54e7096c13SJason A. Donenfeld wg_device_uninit(); 55e7096c13SJason A. Donenfeld err_device: 56a4e9f8e3SJason A. Donenfeld wg_peer_uninit(); 57a4e9f8e3SJason A. Donenfeld err_peer: 58dc680de2SJason A. Donenfeld wg_allowedips_slab_uninit(); 59dc680de2SJason A. Donenfeld err_allowedips: 60e7096c13SJason A. Donenfeld return ret; 61e7096c13SJason A. Donenfeld } 62e7096c13SJason A. Donenfeld wg_mod_exit(void)63*b251b711SRandy Dunlapstatic void __exit wg_mod_exit(void) 64e7096c13SJason A. Donenfeld { 65e7096c13SJason A. Donenfeld wg_genetlink_uninit(); 66e7096c13SJason A. Donenfeld wg_device_uninit(); 67a4e9f8e3SJason A. Donenfeld wg_peer_uninit(); 68dc680de2SJason A. Donenfeld wg_allowedips_slab_uninit(); 69e7096c13SJason A. Donenfeld } 70e7096c13SJason A. Donenfeld 71*b251b711SRandy Dunlap module_init(wg_mod_init); 72*b251b711SRandy Dunlap module_exit(wg_mod_exit); 73e7096c13SJason A. Donenfeld MODULE_LICENSE("GPL v2"); 74e7096c13SJason A. Donenfeld MODULE_DESCRIPTION("WireGuard secure network tunnel"); 75e7096c13SJason A. Donenfeld MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>"); 76e7096c13SJason A. Donenfeld MODULE_VERSION(WIREGUARD_VERSION); 77e7096c13SJason A. Donenfeld MODULE_ALIAS_RTNL_LINK(KBUILD_MODNAME); 78e7096c13SJason A. Donenfeld MODULE_ALIAS_GENL_FAMILY(WG_GENL_NAME); 79