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