xref: /openbmc/linux/drivers/net/wireguard/main.c (revision e7096c13)
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