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