1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
4 */
5
6#include "version.h"
7#include "device.h"
8#include "noise.h"
9#include "queueing.h"
10#include "ratelimiter.h"
11#include "netlink.h"
12
13#include <uapi/linux/wireguard.h>
14
15#include <linux/init.h>
16#include <linux/module.h>
17#include <linux/genetlink.h>
18#include <net/rtnetlink.h>
19
20static int __init wg_mod_init(void)
21{
22	int ret;
23
24	ret = wg_allowedips_slab_init();
25	if (ret < 0)
26		goto err_allowedips;
27
28#ifdef DEBUG
29	ret = -ENOTRECOVERABLE;
30	if (!wg_allowedips_selftest() || !wg_packet_counter_selftest() ||
31	    !wg_ratelimiter_selftest())
32		goto err_peer;
33#endif
34	wg_noise_init();
35
36	ret = wg_peer_init();
37	if (ret < 0)
38		goto err_peer;
39
40	ret = wg_device_init();
41	if (ret < 0)
42		goto err_device;
43
44	ret = wg_genetlink_init();
45	if (ret < 0)
46		goto err_netlink;
47
48	pr_info("WireGuard " WIREGUARD_VERSION " loaded. See www.wireguard.com for information.\n");
49	pr_info("Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.\n");
50
51	return 0;
52
53err_netlink:
54	wg_device_uninit();
55err_device:
56	wg_peer_uninit();
57err_peer:
58	wg_allowedips_slab_uninit();
59err_allowedips:
60	return ret;
61}
62
63static void __exit wg_mod_exit(void)
64{
65	wg_genetlink_uninit();
66	wg_device_uninit();
67	wg_peer_uninit();
68	wg_allowedips_slab_uninit();
69}
70
71module_init(wg_mod_init);
72module_exit(wg_mod_exit);
73MODULE_LICENSE("GPL v2");
74MODULE_DESCRIPTION("WireGuard secure network tunnel");
75MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
76MODULE_VERSION(WIREGUARD_VERSION);
77MODULE_ALIAS_RTNL_LINK(KBUILD_MODNAME);
78MODULE_ALIAS_GENL_FAMILY(WG_GENL_NAME);
79