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 : #ifndef __included_wg_timer_h__ 17 : #define __included_wg_timer_h__ 18 : 19 : #include <vlib/vlib.h> 20 : #include <vppinfra/clib.h> 21 : #include <vppinfra/tw_timer_16t_2w_512sl.h> 22 : 23 : /** WG timers */ 24 : #define foreach_wg_timer \ 25 : _(RETRANSMIT_HANDSHAKE, "RETRANSMIT HANDSHAKE") \ 26 : _(PERSISTENT_KEEPALIVE, "PERSISTENT KEEPALIVE") \ 27 : _(SEND_KEEPALIVE, "SEND KEEPALIVE") \ 28 : _(NEW_HANDSHAKE, "NEW HANDSHAKE") \ 29 : _(KEY_ZEROING, "KEY ZEROING") \ 30 : 31 : typedef enum _wg_timers 32 : { 33 : #define _(sym, str) WG_TIMER_##sym, 34 : foreach_wg_timer 35 : #undef _ 36 : WG_N_TIMERS 37 : } wg_timers_e; 38 : 39 : typedef struct wg_peer wg_peer_t; 40 : 41 : void wg_timer_wheel_init (); 42 : void wg_timers_stop (wg_peer_t * peer); 43 : void wg_timers_data_sent (wg_peer_t * peer); 44 : void wg_timers_data_sent_opt (wg_peer_t *peer, f64 time); 45 : void wg_timers_data_received (wg_peer_t * peer); 46 : void wg_timers_any_authenticated_packet_sent (wg_peer_t * peer); 47 : void wg_timers_any_authenticated_packet_sent_opt (wg_peer_t *peer, f64 time); 48 : void wg_timers_any_authenticated_packet_received (wg_peer_t * peer); 49 : void wg_timers_any_authenticated_packet_received_opt (wg_peer_t *peer, 50 : f64 time); 51 : void wg_timers_handshake_initiated (wg_peer_t * peer); 52 : void wg_timers_handshake_complete (wg_peer_t * peer); 53 : void wg_timers_send_first_handshake (wg_peer_t *peer); 54 : void wg_timers_session_derived (wg_peer_t * peer); 55 : void wg_timers_any_authenticated_packet_traversal (wg_peer_t * peer); 56 : 57 : 58 : static inline bool 59 664 : wg_birthdate_has_expired (f64 birthday_seconds, f64 expiration_seconds) 60 : { 61 664 : if (birthday_seconds == 0.0) 62 264 : return true; 63 400 : f64 now_seconds = vlib_time_now (vlib_get_main ()); 64 400 : return (birthday_seconds + expiration_seconds) < now_seconds; 65 : } 66 : 67 : static_always_inline bool 68 8636 : wg_birthdate_has_expired_opt (f64 birthday_seconds, f64 expiration_seconds, 69 : f64 time) 70 : { 71 8636 : return (birthday_seconds + expiration_seconds) < time; 72 : } 73 : 74 : #endif /* __included_wg_timer_h__ */ 75 : 76 : /* 77 : * fd.io coding-style-patch-verification: ON 78 : * 79 : * Local Variables: 80 : * eval: (c-set-style "gnu") 81 : * End: 82 : */