Line data Source code
1 : /* 2 : * Copyright (c) 2020 Doc.ai and/or its affiliates. 3 : * Licensed under the Apache License, Version 2.0 (the "License"); 4 : * you may not use this file except in compliance with the License. 5 : * You may obtain a copy of the License at: 6 : * 7 : * http://www.apache.org/licenses/LICENSE-2.0 8 : * 9 : * Unless required by applicable law or agreed to in writing, software 10 : * distributed under the License is distributed on an "AS IS" BASIS, 11 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 : * See the License for the specific language governing permissions and 13 : * limitations under the License. 14 : */ 15 : 16 : #include <vnet/vnet.h> 17 : #include <vnet/plugin/plugin.h> 18 : #include <vpp/app/version.h> 19 : #include <vnet/crypto/crypto.h> 20 : 21 : #include <wireguard/wireguard_send.h> 22 : #include <wireguard/wireguard_key.h> 23 : #include <wireguard/wireguard_if.h> 24 : #include <wireguard/wireguard.h> 25 : 26 : wg_main_t wg_main; 27 : wg_async_post_next_t wg_encrypt_async_next; 28 : wg_async_post_next_t wg_decrypt_async_next; 29 : 30 : void 31 16 : wg_set_async_mode (u32 is_enabled) 32 : { 33 16 : if (is_enabled) 34 8 : wg_op_mode_set_ASYNC (); 35 : else 36 8 : wg_op_mode_unset_ASYNC (); 37 16 : } 38 : 39 : static void 40 575 : wireguard_register_post_node (vlib_main_t *vm) 41 : 42 : { 43 : wg_async_post_next_t *eit; 44 : wg_async_post_next_t *dit; 45 : 46 575 : eit = &wg_encrypt_async_next; 47 575 : dit = &wg_decrypt_async_next; 48 : 49 575 : eit->wg4_post_next = 50 575 : vnet_crypto_register_post_node (vm, "wg4-output-tun-post-node"); 51 575 : eit->wg6_post_next = 52 575 : vnet_crypto_register_post_node (vm, "wg6-output-tun-post-node"); 53 : 54 575 : dit->wg4_post_next = 55 575 : vnet_crypto_register_post_node (vm, "wg4-input-post-node"); 56 575 : dit->wg6_post_next = 57 575 : vnet_crypto_register_post_node (vm, "wg6-input-post-node"); 58 575 : } 59 : 60 : void 61 9173 : wg_secure_zero_memory (void *v, size_t n) 62 : { 63 : static void *(*const volatile memset_v) (void *, int, size_t) = &memset; 64 9173 : memset_v (v, 0, n); 65 9173 : } 66 : 67 : static clib_error_t * 68 575 : wg_init (vlib_main_t * vm) 69 : { 70 575 : wg_main_t *wmp = &wg_main; 71 : 72 575 : wmp->vlib_main = vm; 73 : 74 575 : wmp->in4_fq_index = vlib_frame_queue_main_init (wg4_input_node.index, 0); 75 575 : wmp->in6_fq_index = vlib_frame_queue_main_init (wg6_input_node.index, 0); 76 575 : wmp->out4_fq_index = 77 575 : vlib_frame_queue_main_init (wg4_output_tun_node.index, 0); 78 575 : wmp->out6_fq_index = 79 575 : vlib_frame_queue_main_init (wg6_output_tun_node.index, 0); 80 : 81 575 : vlib_thread_main_t *tm = vlib_get_thread_main (); 82 : 83 575 : vec_validate_aligned (wmp->per_thread_data, tm->n_vlib_mains, 84 : CLIB_CACHE_LINE_BYTES); 85 : 86 575 : wg_timer_wheel_init (); 87 575 : wireguard_register_post_node (vm); 88 575 : wmp->op_mode_flags = 0; 89 : 90 575 : return (NULL); 91 : } 92 : 93 1151 : VLIB_INIT_FUNCTION (wg_init); 94 : 95 : /* *INDENT-OFF* */ 96 : 97 1151 : VNET_FEATURE_INIT (wg4_output_tun, static) = { 98 : .arc_name = "ip4-output", 99 : .node_name = "wg4-output-tun", 100 : .runs_after = VNET_FEATURES ("gso-ip4"), 101 : }; 102 : 103 1151 : VNET_FEATURE_INIT (wg6_output_tun, static) = { 104 : .arc_name = "ip6-output", 105 : .node_name = "wg6-output-tun", 106 : .runs_after = VNET_FEATURES ("gso-ip6"), 107 : }; 108 : 109 : VLIB_PLUGIN_REGISTER () = 110 : { 111 : .version = VPP_BUILD_VER, 112 : .description = "Wireguard Protocol", 113 : }; 114 : /* *INDENT-ON* */ 115 : 116 : /* 117 : * fd.io coding-style-patch-verification: ON 118 : * 119 : * Local Variables: 120 : * eval: (c-set-style "gnu") 121 : * End: 122 : */