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 : #ifndef __included_wg_h__ 16 : #define __included_wg_h__ 17 : 18 : #include <wireguard/wireguard_index_table.h> 19 : #include <wireguard/wireguard_messages.h> 20 : #include <wireguard/wireguard_timer.h> 21 : #include <vnet/buffer.h> 22 : 23 : #define WG_DEFAULT_DATA_SIZE 2048 24 : 25 : extern vlib_node_registration_t wg4_input_node; 26 : extern vlib_node_registration_t wg6_input_node; 27 : extern vlib_node_registration_t wg4_output_tun_node; 28 : extern vlib_node_registration_t wg6_output_tun_node; 29 : 30 : typedef struct wg_per_thread_data_t_ 31 : { 32 : CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); 33 : vnet_crypto_op_t *crypto_ops; 34 : vnet_crypto_op_t *chained_crypto_ops; 35 : vnet_crypto_op_chunk_t *chunks; 36 : vnet_crypto_async_frame_t **async_frames; 37 : u8 data[WG_DEFAULT_DATA_SIZE]; 38 : } wg_per_thread_data_t; 39 : 40 : typedef struct 41 : { 42 : /* convenience */ 43 : vlib_main_t *vlib_main; 44 : 45 : u16 msg_id_base; 46 : 47 : wg_index_table_t index_table; 48 : 49 : u32 in4_fq_index; 50 : u32 in6_fq_index; 51 : u32 out4_fq_index; 52 : u32 out6_fq_index; 53 : 54 : wg_per_thread_data_t *per_thread_data; 55 : u8 feature_init; 56 : 57 : tw_timer_wheel_16t_2w_512sl_t timer_wheel; 58 : 59 : /* operation mode flags (e.g. async) */ 60 : u8 op_mode_flags; 61 : } wg_main_t; 62 : 63 : typedef struct 64 : { 65 : /* wg post node index for async crypto */ 66 : u32 wg4_post_next; 67 : u32 wg6_post_next; 68 : } wg_async_post_next_t; 69 : 70 : extern wg_async_post_next_t wg_encrypt_async_next; 71 : extern wg_async_post_next_t wg_decrypt_async_next; 72 : extern wg_main_t wg_main; 73 : 74 : /** 75 : * Wireguard operation mode 76 : **/ 77 : #define foreach_wg_op_mode_flags _ (0, ASYNC, "async") 78 : 79 : /** 80 : * Helper function to set/unset and check op modes 81 : **/ 82 : typedef enum wg_op_mode_flags_t_ 83 : { 84 : #define _(v, f, s) WG_OP_MODE_FLAG_##f = 1 << v, 85 : foreach_wg_op_mode_flags 86 : #undef _ 87 : } __clib_packed wg_op_mode_flags_t; 88 : 89 : #define _(a, v, s) \ 90 : always_inline int wg_op_mode_set_##v (void) \ 91 : { \ 92 : return (wg_main.op_mode_flags |= WG_OP_MODE_FLAG_##v); \ 93 : } \ 94 : always_inline int wg_op_mode_unset_##v (void) \ 95 : { \ 96 : return (wg_main.op_mode_flags &= ~WG_OP_MODE_FLAG_##v); \ 97 : } \ 98 : always_inline int wg_op_mode_is_set_##v (void) \ 99 : { \ 100 : return (wg_main.op_mode_flags & WG_OP_MODE_FLAG_##v); \ 101 : } 102 340 : foreach_wg_op_mode_flags 103 : #undef _ 104 : 105 : typedef struct 106 : { 107 : u8 __pad[22]; 108 : u16 next_index; 109 : } wg_post_data_t; 110 : 111 : STATIC_ASSERT (sizeof (wg_post_data_t) <= 112 : STRUCT_SIZE_OF (vnet_buffer_opaque_t, unused), 113 : "Custom meta-data too large for vnet_buffer_opaque_t"); 114 : 115 : #define wg_post_data(b) \ 116 : ((wg_post_data_t *) ((u8 *) ((b)->opaque) + \ 117 : STRUCT_OFFSET_OF (vnet_buffer_opaque_t, unused))) 118 : 119 : #define WG_START_EVENT 1 120 : void wg_feature_init (wg_main_t * wmp); 121 : void wg_set_async_mode (u32 is_enabled); 122 : 123 : void wg_secure_zero_memory (void *v, size_t n); 124 : 125 : #endif /* __included_wg_h__ */ 126 : 127 : /* 128 : * fd.io coding-style-patch-verification: ON 129 : * 130 : * Local Variables: 131 : * eval: (c-set-style "gnu") 132 : * End: 133 : */