2 * Copyright (c) 2011-2016 Cisco 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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * @brief BFD global declarations
19 #ifndef __included_bfd_main_h__
20 #define __included_bfd_main_h__
22 #include <vppinfra/timing_wheel.h>
23 #include <vnet/vnet.h>
24 #include <vnet/bfd/bfd_protocol.h>
25 #include <vnet/bfd/bfd_udp.h>
27 #define foreach_bfd_transport(F) \
28 F (UDP4, "ip4-rewrite") \
29 F (UDP6, "ip6-rewrite")
33 #define F(t, n) BFD_TRANSPORT_##t,
34 foreach_bfd_transport (F)
38 #define foreach_bfd_mode(F) \
44 #define F(x) BFD_MODE_##x,
51 /* global configuration key ID */
54 /* keeps track of how many sessions reference this key */
58 * key data directly usable for bfd purposes - already padded with zeroes
59 * (so we don't need the actual length)
63 /* authentication type for this key */
64 bfd_auth_type_e auth_type;
69 /* index in bfd_main.sessions pool */
73 bfd_state_e local_state;
75 /* local diagnostics */
76 bfd_diag_code_e local_diag;
78 /* remote session state */
79 bfd_state_e remote_state;
81 /* local discriminator */
84 /* remote discriminator */
87 /* configured desired min tx interval (microseconds) */
88 u32 config_desired_min_tx_us;
90 /* desired min tx interval (microseconds) */
91 u32 desired_min_tx_us;
93 /* desired min tx interval (clocks) */
94 u64 desired_min_tx_clocks;
96 /* required min rx interval (microseconds) */
97 u32 required_min_rx_us;
99 /* required min echo rx interval (microseconds) */
100 u32 required_min_echo_rx_us;
102 /* remote min rx interval (microseconds) */
103 u32 remote_min_rx_us;
105 /* remote min rx interval (clocks) */
106 u64 remote_min_rx_clocks;
108 /* remote desired min tx interval (microseconds) */
109 u32 remote_desired_min_tx_us;
111 /* 1 if in demand mode, 0 otherwise */
114 /* 1 if remote system sets demand mode, 0 otherwise */
117 /* local detect multiplier */
118 u8 local_detect_mult;
120 /* remote detect multiplier */
121 u8 remote_detect_mult;
123 /* set to value of timer in timing wheel, 0 if never set */
124 u64 wheel_time_clocks;
126 /* transmit interval */
127 u64 transmit_interval_clocks;
129 /* next time at which to transmit a packet */
130 u64 tx_timeout_clocks;
132 /* timestamp of last packet transmitted */
135 /* timestamp of last packet received */
139 u64 detection_time_clocks;
141 /* authentication information */
144 /* current key in use */
145 bfd_auth_key_t *curr_key;
148 * set to next key to use if delayed switch is enabled - in that case
149 * the key is switched when first incoming packet is signed with next_key
151 bfd_auth_key_t *next_key;
153 /* sequence number incremented occasionally or always (if meticulous) */
154 u32 local_seq_number;
156 /* remote sequence number */
157 u32 remote_seq_number;
159 /* set to 1 if remote sequence number is known */
160 u8 remote_seq_number_known;
162 /* current key ID sent out in bfd packet */
165 /* key ID to use when switched to next_key */
169 * set to 1 if delayed action is pending, which might be activation
170 * of authentication, change of key or deactivation
175 /* transport type for this session */
176 bfd_transport_t transport;
180 bfd_udp_session_t udp;
186 /* pool of bfd sessions context data */
187 bfd_session_t *sessions;
189 /* timing wheel for scheduling timeouts */
190 timing_wheel_t wheel;
192 /* timing wheel inaccuracy, in clocks */
193 u64 wheel_inaccuracy;
195 /* hashmap - bfd session by discriminator */
196 u32 *session_by_disc;
198 /* background process node index */
199 u32 bfd_process_node_index;
201 /* convenience variables */
202 vlib_main_t *vlib_main;
203 vnet_main_t *vnet_main;
205 /* cpu clocks per second */
208 /* for generating random numbers */
211 /* pool of authentication keys */
212 bfd_auth_key_t *auth_keys;
214 /* hashmap - index in pool auth_keys by conf_key_id */
215 u32 *auth_key_by_conf_key_id;
219 extern bfd_main_t bfd_main;
221 /* Packet counters */
222 #define foreach_bfd_error(F) \
223 F (NONE, "good bfd packets (processed)") \
224 F (BAD, "invalid bfd packets") \
225 F (DISABLED, "bfd packets received on disabled interfaces")
229 #define F(sym, str) BFD_ERROR_##sym,
230 foreach_bfd_error (F)
235 /* bfd packet trace capture */
244 BFD_EVENT_RESCHEDULE = 1,
245 BFD_EVENT_NEW_SESSION,
246 } bfd_process_event_e;
248 u8 *bfd_input_format_trace (u8 * s, va_list * args);
250 bfd_session_t *bfd_get_session (bfd_main_t * bm, bfd_transport_t t);
251 void bfd_put_session (bfd_main_t * bm, bfd_session_t * bs);
252 bfd_session_t *bfd_find_session_by_idx (bfd_main_t * bm, uword bs_idx);
253 bfd_session_t *bfd_find_session_by_disc (bfd_main_t * bm, u32 disc);
254 void bfd_session_start (bfd_main_t * bm, bfd_session_t * bs);
255 void bfd_consume_pkt (bfd_main_t * bm, const bfd_pkt_t * bfd, u32 bs_idx);
256 int bfd_verify_pkt_common (const bfd_pkt_t * pkt);
257 int bfd_verify_pkt_auth (const bfd_pkt_t * pkt, u16 pkt_size,
259 void bfd_event (bfd_main_t * bm, bfd_session_t * bs);
260 void bfd_init_final_control_frame (vlib_main_t * vm, vlib_buffer_t * b,
262 u8 *format_bfd_session (u8 * s, va_list * args);
263 void bfd_session_set_flags (bfd_session_t * bs, u8 admin_up_down);
264 unsigned bfd_auth_type_supported (bfd_auth_type_e auth_type);
265 vnet_api_error_t bfd_auth_activate (bfd_session_t * bs, u32 conf_key_id,
266 u8 bfd_key_id, u8 is_delayed);
267 vnet_api_error_t bfd_auth_deactivate (bfd_session_t * bs, u8 is_delayed);
269 #define USEC_PER_MS 1000LL
270 #define USEC_PER_SECOND (1000 * USEC_PER_MS)
272 /* default, slow transmission interval for BFD packets, per spec at least 1s */
273 #define BFD_DEFAULT_DESIRED_MIN_TX_US USEC_PER_SECOND
275 #endif /* __included_bfd_main_h__ */
278 * fd.io coding-style-patch-verification: ON
281 * eval: (c-set-style "gnu")