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 20e7096c13SJason A. Donenfeld static int __init mod_init(void) 21e7096c13SJason A. Donenfeld { 22e7096c13SJason A. Donenfeld int ret; 23e7096c13SJason A. Donenfeld 24e7096c13SJason A. Donenfeld #ifdef DEBUG 25e7096c13SJason A. Donenfeld if (!wg_allowedips_selftest() || !wg_packet_counter_selftest() || 26e7096c13SJason A. Donenfeld !wg_ratelimiter_selftest()) 27e7096c13SJason A. Donenfeld return -ENOTRECOVERABLE; 28e7096c13SJason A. Donenfeld #endif 29e7096c13SJason A. Donenfeld wg_noise_init(); 30e7096c13SJason A. Donenfeld 31*a4e9f8e3SJason A. Donenfeld ret = wg_peer_init(); 32*a4e9f8e3SJason A. Donenfeld if (ret < 0) 33*a4e9f8e3SJason A. Donenfeld goto err_peer; 34*a4e9f8e3SJason A. Donenfeld 35e7096c13SJason A. Donenfeld ret = wg_device_init(); 36e7096c13SJason A. Donenfeld if (ret < 0) 37e7096c13SJason A. Donenfeld goto err_device; 38e7096c13SJason A. Donenfeld 39e7096c13SJason A. Donenfeld ret = wg_genetlink_init(); 40e7096c13SJason A. Donenfeld if (ret < 0) 41e7096c13SJason A. Donenfeld goto err_netlink; 42e7096c13SJason A. Donenfeld 43e7096c13SJason A. Donenfeld pr_info("WireGuard " WIREGUARD_VERSION " loaded. See www.wireguard.com for information.\n"); 44e7096c13SJason A. Donenfeld pr_info("Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.\n"); 45e7096c13SJason A. Donenfeld 46e7096c13SJason A. Donenfeld return 0; 47e7096c13SJason A. Donenfeld 48e7096c13SJason A. Donenfeld err_netlink: 49e7096c13SJason A. Donenfeld wg_device_uninit(); 50e7096c13SJason A. Donenfeld err_device: 51*a4e9f8e3SJason A. Donenfeld wg_peer_uninit(); 52*a4e9f8e3SJason A. Donenfeld err_peer: 53e7096c13SJason A. Donenfeld return ret; 54e7096c13SJason A. Donenfeld } 55e7096c13SJason A. Donenfeld 56e7096c13SJason A. Donenfeld static void __exit mod_exit(void) 57e7096c13SJason A. Donenfeld { 58e7096c13SJason A. Donenfeld wg_genetlink_uninit(); 59e7096c13SJason A. Donenfeld wg_device_uninit(); 60*a4e9f8e3SJason A. Donenfeld wg_peer_uninit(); 61e7096c13SJason A. Donenfeld } 62e7096c13SJason A. Donenfeld 63e7096c13SJason A. Donenfeld module_init(mod_init); 64e7096c13SJason A. Donenfeld module_exit(mod_exit); 65e7096c13SJason A. Donenfeld MODULE_LICENSE("GPL v2"); 66e7096c13SJason A. Donenfeld MODULE_DESCRIPTION("WireGuard secure network tunnel"); 67e7096c13SJason A. Donenfeld MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>"); 68e7096c13SJason A. Donenfeld MODULE_VERSION(WIREGUARD_VERSION); 69e7096c13SJason A. Donenfeld MODULE_ALIAS_RTNL_LINK(KBUILD_MODNAME); 70e7096c13SJason A. Donenfeld MODULE_ALIAS_GENL_FAMILY(WG_GENL_NAME); 71