LCOV - code coverage report
Current view: top level - plugins/wireguard - wireguard.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 38 38 100.0 %
Date: 2023-10-26 01:39:38 Functions: 10 10 100.0 %

          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             :  */

Generated by: LCOV version 1.14