diff options
Diffstat (limited to 'src/plugins/wireguard/wireguard.c')
-rw-r--r--[-rwxr-xr-x] | src/plugins/wireguard/wireguard.c | 65 |
1 files changed, 56 insertions, 9 deletions
diff --git a/src/plugins/wireguard/wireguard.c b/src/plugins/wireguard/wireguard.c index 58422299069..b1c8bc79870 100755..100644 --- a/src/plugins/wireguard/wireguard.c +++ b/src/plugins/wireguard/wireguard.c @@ -15,8 +15,8 @@ #include <vnet/vnet.h> #include <vnet/plugin/plugin.h> -#include <vnet/ipip/ipip.h> #include <vpp/app/version.h> +#include <vnet/crypto/crypto.h> #include <wireguard/wireguard_send.h> #include <wireguard/wireguard_key.h> @@ -24,6 +24,45 @@ #include <wireguard/wireguard.h> wg_main_t wg_main; +wg_async_post_next_t wg_encrypt_async_next; +wg_async_post_next_t wg_decrypt_async_next; + +void +wg_set_async_mode (u32 is_enabled) +{ + if (is_enabled) + wg_op_mode_set_ASYNC (); + else + wg_op_mode_unset_ASYNC (); +} + +static void +wireguard_register_post_node (vlib_main_t *vm) + +{ + wg_async_post_next_t *eit; + wg_async_post_next_t *dit; + + eit = &wg_encrypt_async_next; + dit = &wg_decrypt_async_next; + + eit->wg4_post_next = + vnet_crypto_register_post_node (vm, "wg4-output-tun-post-node"); + eit->wg6_post_next = + vnet_crypto_register_post_node (vm, "wg6-output-tun-post-node"); + + dit->wg4_post_next = + vnet_crypto_register_post_node (vm, "wg4-input-post-node"); + dit->wg6_post_next = + vnet_crypto_register_post_node (vm, "wg6-input-post-node"); +} + +void +wg_secure_zero_memory (void *v, size_t n) +{ + static void *(*const volatile memset_v) (void *, int, size_t) = &memset; + memset_v (v, 0, n); +} static clib_error_t * wg_init (vlib_main_t * vm) @@ -32,9 +71,12 @@ wg_init (vlib_main_t * vm) wmp->vlib_main = vm; - wmp->in_fq_index = vlib_frame_queue_main_init (wg_input_node.index, 0); - wmp->out_fq_index = - vlib_frame_queue_main_init (wg_output_tun_node.index, 0); + wmp->in4_fq_index = vlib_frame_queue_main_init (wg4_input_node.index, 0); + wmp->in6_fq_index = vlib_frame_queue_main_init (wg6_input_node.index, 0); + wmp->out4_fq_index = + vlib_frame_queue_main_init (wg4_output_tun_node.index, 0); + wmp->out6_fq_index = + vlib_frame_queue_main_init (wg6_output_tun_node.index, 0); vlib_thread_main_t *tm = vlib_get_thread_main (); @@ -42,27 +84,32 @@ wg_init (vlib_main_t * vm) CLIB_CACHE_LINE_BYTES); wg_timer_wheel_init (); + wireguard_register_post_node (vm); + wmp->op_mode_flags = 0; return (NULL); } VLIB_INIT_FUNCTION (wg_init); -/* *INDENT-OFF* */ -VNET_FEATURE_INIT (wg_output_tun, static) = -{ +VNET_FEATURE_INIT (wg4_output_tun, static) = { .arc_name = "ip4-output", - .node_name = "wg-output-tun", + .node_name = "wg4-output-tun", .runs_after = VNET_FEATURES ("gso-ip4"), }; +VNET_FEATURE_INIT (wg6_output_tun, static) = { + .arc_name = "ip6-output", + .node_name = "wg6-output-tun", + .runs_after = VNET_FEATURES ("gso-ip6"), +}; + VLIB_PLUGIN_REGISTER () = { .version = VPP_BUILD_VER, .description = "Wireguard Protocol", }; -/* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON |