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