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