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;
67 #define foreach_bfd_poll_state(F)\
74 #define F(x) POLL_##x,
75 foreach_bfd_poll_state (F)
81 /* index in bfd_main.sessions pool */
85 bfd_state_e local_state;
87 /* local diagnostics */
88 bfd_diag_code_e local_diag;
90 /* remote session state */
91 bfd_state_e remote_state;
93 /* local discriminator */
96 /* remote discriminator */
99 /* configured desired min tx interval (microseconds) */
100 u32 config_desired_min_tx_usec;
102 /* configured desired min tx interval (clocks) */
103 u64 config_desired_min_tx_clocks;
105 /* effective desired min tx interval (clocks) */
106 u64 effective_desired_min_tx_clocks;
108 /* configured required min rx interval (microseconds) */
109 u32 config_required_min_rx_usec;
111 /* configured required min rx interval (clocks) */
112 u64 config_required_min_rx_clocks;
114 /* effective required min rx interval (clocks) */
115 u64 effective_required_min_rx_clocks;
117 /* remote min rx interval (microseconds) */
118 u64 remote_min_rx_usec;
120 /* remote min rx interval (clocks) */
121 u64 remote_min_rx_clocks;
123 /* remote desired min tx interval (clocks) */
124 u64 remote_desired_min_tx_clocks;
126 /* configured detect multiplier */
127 u8 local_detect_mult;
129 /* 1 if in demand mode, 0 otherwise */
132 /* 1 if remote system sets demand mode, 0 otherwise */
135 /* remote detect multiplier */
136 u8 remote_detect_mult;
138 /* set to value of timer in timing wheel, 0 if never set */
139 u64 wheel_time_clocks;
141 /* transmit interval */
142 u64 transmit_interval_clocks;
144 /* next time at which to transmit a packet */
145 u64 tx_timeout_clocks;
147 /* timestamp of last packet transmitted */
150 /* timestamp of last packet received */
154 u64 detection_time_clocks;
156 /* state info regarding poll sequence */
157 bfd_poll_state_e poll_state;
159 /* authentication information */
162 /* current key in use */
163 bfd_auth_key_t *curr_key;
166 * set to next key to use if delayed switch is enabled - in that case
167 * the key is switched when first incoming packet is signed with next_key
169 bfd_auth_key_t *next_key;
171 /* sequence number incremented occasionally or always (if meticulous) */
172 u32 local_seq_number;
174 /* remote sequence number */
175 u32 remote_seq_number;
177 /* set to 1 if remote sequence number is known */
178 u8 remote_seq_number_known;
180 /* current key ID sent out in bfd packet */
183 /* key ID to use when switched to next_key */
187 * set to 1 if delayed action is pending, which might be activation
188 * of authentication, change of key or deactivation
193 /* transport type for this session */
194 bfd_transport_t transport;
196 /* union of transport-specific data */
199 bfd_udp_session_t udp;
205 /* pool of bfd sessions context data */
206 bfd_session_t *sessions;
208 /* timing wheel for scheduling timeouts */
209 timing_wheel_t wheel;
211 /* timing wheel inaccuracy, in clocks */
212 u64 wheel_inaccuracy;
214 /* hashmap - bfd session by discriminator */
215 u32 *session_by_disc;
217 /* background process node index */
218 u32 bfd_process_node_index;
220 /* convenience variables */
221 vlib_main_t *vlib_main;
222 vnet_main_t *vnet_main;
224 /* cpu clocks per second */
227 /* default desired min tx in clocks */
228 u64 default_desired_min_tx_clocks;
230 /* for generating random numbers */
233 /* pool of authentication keys */
234 bfd_auth_key_t *auth_keys;
236 /* hashmap - index in pool auth_keys by conf_key_id */
237 u32 *auth_key_by_conf_key_id;
241 extern bfd_main_t bfd_main;
243 /* Packet counters */
244 #define foreach_bfd_error(F) \
245 F (NONE, "good bfd packets (processed)") \
246 F (BAD, "invalid bfd packets") \
247 F (DISABLED, "bfd packets received on disabled interfaces")
251 #define F(sym, str) BFD_ERROR_##sym,
252 foreach_bfd_error (F)
257 /* bfd packet trace capture */
266 BFD_EVENT_RESCHEDULE = 1,
267 BFD_EVENT_NEW_SESSION,
268 BFD_EVENT_CONFIG_CHANGED,
269 } bfd_process_event_e;
271 u8 *bfd_input_format_trace (u8 * s, va_list * args);
273 bfd_session_t *bfd_get_session (bfd_main_t * bm, bfd_transport_t t);
274 void bfd_put_session (bfd_main_t * bm, bfd_session_t * bs);
275 bfd_session_t *bfd_find_session_by_idx (bfd_main_t * bm, uword bs_idx);
276 bfd_session_t *bfd_find_session_by_disc (bfd_main_t * bm, u32 disc);
277 void bfd_session_start (bfd_main_t * bm, bfd_session_t * bs);
278 void bfd_consume_pkt (bfd_main_t * bm, const bfd_pkt_t * bfd, u32 bs_idx);
279 int bfd_verify_pkt_common (const bfd_pkt_t * pkt);
280 int bfd_verify_pkt_auth (const bfd_pkt_t * pkt, u16 pkt_size,
282 void bfd_event (bfd_main_t * bm, bfd_session_t * bs);
283 void bfd_init_final_control_frame (vlib_main_t * vm, vlib_buffer_t * b,
285 u8 *format_bfd_session (u8 * s, va_list * args);
286 void bfd_session_set_flags (bfd_session_t * bs, u8 admin_up_down);
287 unsigned bfd_auth_type_supported (bfd_auth_type_e auth_type);
288 vnet_api_error_t bfd_auth_activate (bfd_session_t * bs, u32 conf_key_id,
289 u8 bfd_key_id, u8 is_delayed);
290 vnet_api_error_t bfd_auth_deactivate (bfd_session_t * bs, u8 is_delayed);
292 bfd_session_set_params (bfd_main_t * bm, bfd_session_t * bs,
293 u32 desired_min_tx_usec,
294 u32 required_min_rx_usec, u8 detect_mult);
296 #define USEC_PER_MS 1000LL
297 #define USEC_PER_SECOND (1000 * USEC_PER_MS)
299 /* default, slow transmission interval for BFD packets, per spec at least 1s */
300 #define BFD_DEFAULT_DESIRED_MIN_TX_US USEC_PER_SECOND
302 #endif /* __included_bfd_main_h__ */
305 * fd.io coding-style-patch-verification: ON
308 * eval: (c-set-style "gnu")