]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_fsm.c
eigrpd: Fix add and delete of routes into the rib
[mirror_frr.git] / bgpd / bgp_fsm.c
1 /* BGP-4 Finite State Machine
2 From RFC1771 [A Border Gateway Protocol 4 (BGP-4)]
3 Copyright (C) 1996, 97, 98 Kunihiro Ishiguro
4
5 This file is part of GNU Zebra.
6
7 GNU Zebra is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
10 later version.
11
12 GNU Zebra is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Zebra; see the file COPYING. If not, write to the Free
19 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22 #include <zebra.h>
23
24 #include "linklist.h"
25 #include "prefix.h"
26 #include "sockunion.h"
27 #include "thread.h"
28 #include "log.h"
29 #include "stream.h"
30 #include "memory.h"
31 #include "plist.h"
32 #include "workqueue.h"
33 #include "queue.h"
34 #include "filter.h"
35 #include "command.h"
36
37 #include "lib/json.h"
38 #include "bgpd/bgpd.h"
39 #include "bgpd/bgp_attr.h"
40 #include "bgpd/bgp_debug.h"
41 #include "bgpd/bgp_fsm.h"
42 #include "bgpd/bgp_packet.h"
43 #include "bgpd/bgp_network.h"
44 #include "bgpd/bgp_route.h"
45 #include "bgpd/bgp_dump.h"
46 #include "bgpd/bgp_open.h"
47 #include "bgpd/bgp_advertise.h"
48 #ifdef HAVE_SNMP
49 #include "bgpd/bgp_snmp.h"
50 #endif /* HAVE_SNMP */
51 #include "bgpd/bgp_updgrp.h"
52 #include "bgpd/bgp_nht.h"
53 #include "bgpd/bgp_bfd.h"
54 #include "bgpd/bgp_memory.h"
55
56 /* Definition of display strings corresponding to FSM events. This should be
57 * kept consistent with the events defined in bgpd.h
58 */
59 static const char *bgp_event_str[] =
60 {
61 NULL,
62 "BGP_Start",
63 "BGP_Stop",
64 "TCP_connection_open",
65 "TCP_connection_closed",
66 "TCP_connection_open_failed",
67 "TCP_fatal_error",
68 "ConnectRetry_timer_expired",
69 "Hold_Timer_expired",
70 "KeepAlive_timer_expired",
71 "Receive_OPEN_message",
72 "Receive_KEEPALIVE_message",
73 "Receive_UPDATE_message",
74 "Receive_NOTIFICATION_message",
75 "Clearing_Completed",
76 };
77
78 /* BGP FSM (finite state machine) has three types of functions. Type
79 one is thread functions. Type two is event functions. Type three
80 is FSM functions. Timer functions are set by bgp_timer_set
81 function. */
82
83 /* BGP event function. */
84 int bgp_event (struct thread *);
85
86 /* BGP thread functions. */
87 static int bgp_start_timer (struct thread *);
88 static int bgp_connect_timer (struct thread *);
89 static int bgp_holdtime_timer (struct thread *);
90 static int bgp_keepalive_timer (struct thread *);
91
92 /* BGP FSM functions. */
93 static int bgp_start (struct peer *);
94
95 static void
96 peer_xfer_stats (struct peer *peer_dst, struct peer *peer_src)
97 {
98 /* Copy stats over. These are only the pre-established state stats */
99 peer_dst->open_in += peer_src->open_in;
100 peer_dst->open_out += peer_src->open_out;
101 peer_dst->keepalive_in += peer_src->keepalive_in;
102 peer_dst->keepalive_out += peer_src->keepalive_out;
103 peer_dst->notify_in += peer_src->notify_in;
104 peer_dst->notify_out += peer_src->notify_out;
105 peer_dst->dynamic_cap_in += peer_src->dynamic_cap_in;
106 peer_dst->dynamic_cap_out += peer_src->dynamic_cap_out;
107 }
108
109 static struct peer *
110 peer_xfer_conn(struct peer *from_peer)
111 {
112 struct peer *peer;
113 afi_t afi;
114 safi_t safi;
115 int fd;
116 int status, pstatus;
117 unsigned char last_evt, last_maj_evt;
118
119 assert(from_peer != NULL);
120
121 peer = from_peer->doppelganger;
122
123 if (!peer || !CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
124 return from_peer;
125
126 if (bgp_debug_neighbor_events(peer))
127 zlog_debug ("%s: peer transfer %p fd %d -> %p fd %d)", from_peer->host,
128 from_peer, from_peer->fd, peer, peer->fd);
129
130 BGP_WRITE_OFF(peer->t_write);
131 BGP_READ_OFF(peer->t_read);
132 BGP_WRITE_OFF(from_peer->t_write);
133 BGP_READ_OFF(from_peer->t_read);
134
135 BGP_TIMER_OFF(peer->t_routeadv);
136 BGP_TIMER_OFF(from_peer->t_routeadv);
137
138 fd = peer->fd;
139 peer->fd = from_peer->fd;
140 from_peer->fd = fd;
141 stream_reset(peer->ibuf);
142 stream_fifo_clean(peer->obuf);
143 stream_fifo_clean(from_peer->obuf);
144
145 peer->as = from_peer->as;
146 peer->v_holdtime = from_peer->v_holdtime;
147 peer->v_keepalive = from_peer->v_keepalive;
148 peer->routeadv = from_peer->routeadv;
149 peer->v_routeadv = from_peer->v_routeadv;
150 peer->v_gr_restart = from_peer->v_gr_restart;
151 peer->cap = from_peer->cap;
152 status = peer->status;
153 pstatus = peer->ostatus;
154 last_evt = peer->last_event;
155 last_maj_evt = peer->last_major_event;
156 peer->status = from_peer->status;
157 peer->ostatus = from_peer->ostatus;
158 peer->last_event = from_peer->last_event;
159 peer->last_major_event = from_peer->last_major_event;
160 from_peer->status = status;
161 from_peer->ostatus = pstatus;
162 from_peer->last_event = last_evt;
163 from_peer->last_major_event = last_maj_evt;
164 peer->remote_id = from_peer->remote_id;
165
166 if (from_peer->hostname != NULL)
167 {
168 if (peer->hostname)
169 {
170 XFREE(MTYPE_BGP_PEER_HOST, peer->hostname);
171 peer->hostname = NULL;
172 }
173
174 peer->hostname = from_peer->hostname;
175 from_peer->hostname = NULL;
176 }
177
178 if (from_peer->domainname != NULL)
179 {
180 if (peer->domainname)
181 {
182 XFREE(MTYPE_BGP_PEER_HOST, peer->domainname);
183 peer->domainname= NULL;
184 }
185
186 peer->domainname = from_peer->domainname;
187 from_peer->domainname = NULL;
188 }
189
190 for (afi = AFI_IP; afi < AFI_MAX; afi++)
191 for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
192 {
193 peer->af_flags[afi][safi] = from_peer->af_flags[afi][safi];
194 peer->af_sflags[afi][safi] = from_peer->af_sflags[afi][safi];
195 peer->af_cap[afi][safi] = from_peer->af_cap[afi][safi];
196 peer->afc_nego[afi][safi] = from_peer->afc_nego[afi][safi];
197 peer->afc_adv[afi][safi] = from_peer->afc_adv[afi][safi];
198 peer->afc_recv[afi][safi] = from_peer->afc_recv[afi][safi];
199 peer->orf_plist[afi][safi] = from_peer->orf_plist[afi][safi];
200 }
201
202 if (bgp_getsockname(peer) < 0)
203 {
204 zlog_err ("%%bgp_getsockname() failed for %s peer %s fd %d (from_peer fd %d)",
205 (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER) ? "accept" : ""),
206 peer->host, peer->fd, from_peer->fd);
207 bgp_stop(peer);
208 bgp_stop(from_peer);
209 return NULL;
210 }
211 if (from_peer->status > Active)
212 {
213 if (bgp_getsockname(from_peer) < 0)
214 {
215 zlog_err ("%%bgp_getsockname() failed for %s from_peer %s fd %d (peer fd %d)",
216 (CHECK_FLAG (from_peer->sflags, PEER_STATUS_ACCEPT_PEER) ? "accept" : ""),
217 from_peer->host, from_peer->fd, peer->fd);
218 bgp_stop(from_peer);
219 from_peer = NULL;
220 }
221 }
222
223 BGP_READ_ON(peer->t_read, bgp_read, peer->fd);
224 BGP_WRITE_ON(peer->t_write, bgp_write, peer->fd);
225
226 if (from_peer)
227 peer_xfer_stats(peer, from_peer);
228
229 return(peer);
230 }
231
232 /* Hook function called after bgp event is occered. And vty's
233 neighbor command invoke this function after making neighbor
234 structure. */
235 void
236 bgp_timer_set (struct peer *peer)
237 {
238 switch (peer->status)
239 {
240 case Idle:
241 /* First entry point of peer's finite state machine. In Idle
242 status start timer is on unless peer is shutdown or peer is
243 inactive. All other timer must be turned off */
244 if (BGP_PEER_START_SUPPRESSED (peer) || ! peer_active (peer))
245 {
246 BGP_TIMER_OFF (peer->t_start);
247 }
248 else
249 {
250 BGP_TIMER_ON (peer->t_start, bgp_start_timer,
251 peer->v_start);
252 }
253 BGP_TIMER_OFF (peer->t_connect);
254 BGP_TIMER_OFF (peer->t_holdtime);
255 BGP_TIMER_OFF (peer->t_keepalive);
256 BGP_TIMER_OFF (peer->t_routeadv);
257 break;
258
259 case Connect:
260 /* After start timer is expired, the peer moves to Connect
261 status. Make sure start timer is off and connect timer is
262 on. */
263 BGP_TIMER_OFF (peer->t_start);
264 BGP_TIMER_ON (peer->t_connect, bgp_connect_timer, peer->v_connect);
265 BGP_TIMER_OFF (peer->t_holdtime);
266 BGP_TIMER_OFF (peer->t_keepalive);
267 BGP_TIMER_OFF (peer->t_routeadv);
268 break;
269
270 case Active:
271 /* Active is waiting connection from remote peer. And if
272 connect timer is expired, change status to Connect. */
273 BGP_TIMER_OFF (peer->t_start);
274 /* If peer is passive mode, do not set connect timer. */
275 if (CHECK_FLAG (peer->flags, PEER_FLAG_PASSIVE)
276 || CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
277 {
278 BGP_TIMER_OFF (peer->t_connect);
279 }
280 else
281 {
282 BGP_TIMER_ON (peer->t_connect, bgp_connect_timer, peer->v_connect);
283 }
284 BGP_TIMER_OFF (peer->t_holdtime);
285 BGP_TIMER_OFF (peer->t_keepalive);
286 BGP_TIMER_OFF (peer->t_routeadv);
287 break;
288
289 case OpenSent:
290 /* OpenSent status. */
291 BGP_TIMER_OFF (peer->t_start);
292 BGP_TIMER_OFF (peer->t_connect);
293 if (peer->v_holdtime != 0)
294 {
295 BGP_TIMER_ON (peer->t_holdtime, bgp_holdtime_timer,
296 peer->v_holdtime);
297 }
298 else
299 {
300 BGP_TIMER_OFF (peer->t_holdtime);
301 }
302 BGP_TIMER_OFF (peer->t_keepalive);
303 BGP_TIMER_OFF (peer->t_routeadv);
304 break;
305
306 case OpenConfirm:
307 /* OpenConfirm status. */
308 BGP_TIMER_OFF (peer->t_start);
309 BGP_TIMER_OFF (peer->t_connect);
310
311 /* If the negotiated Hold Time value is zero, then the Hold Time
312 timer and KeepAlive timers are not started. */
313 if (peer->v_holdtime == 0)
314 {
315 BGP_TIMER_OFF (peer->t_holdtime);
316 BGP_TIMER_OFF (peer->t_keepalive);
317 }
318 else
319 {
320 BGP_TIMER_ON (peer->t_holdtime, bgp_holdtime_timer,
321 peer->v_holdtime);
322 BGP_TIMER_ON (peer->t_keepalive, bgp_keepalive_timer,
323 peer->v_keepalive);
324 }
325 BGP_TIMER_OFF (peer->t_routeadv);
326 break;
327
328 case Established:
329 /* In Established status start and connect timer is turned
330 off. */
331 BGP_TIMER_OFF (peer->t_start);
332 BGP_TIMER_OFF (peer->t_connect);
333
334 /* Same as OpenConfirm, if holdtime is zero then both holdtime
335 and keepalive must be turned off. */
336 if (peer->v_holdtime == 0)
337 {
338 BGP_TIMER_OFF (peer->t_holdtime);
339 BGP_TIMER_OFF (peer->t_keepalive);
340 }
341 else
342 {
343 BGP_TIMER_ON (peer->t_holdtime, bgp_holdtime_timer,
344 peer->v_holdtime);
345 BGP_TIMER_ON (peer->t_keepalive, bgp_keepalive_timer,
346 peer->v_keepalive);
347 }
348 break;
349 case Deleted:
350 BGP_TIMER_OFF (peer->t_gr_restart);
351 BGP_TIMER_OFF (peer->t_gr_stale);
352 BGP_TIMER_OFF (peer->t_pmax_restart);
353 case Clearing:
354 BGP_TIMER_OFF (peer->t_start);
355 BGP_TIMER_OFF (peer->t_connect);
356 BGP_TIMER_OFF (peer->t_holdtime);
357 BGP_TIMER_OFF (peer->t_keepalive);
358 BGP_TIMER_OFF (peer->t_routeadv);
359 break;
360 }
361 }
362
363 /* BGP start timer. This function set BGP_Start event to thread value
364 and process event. */
365 static int
366 bgp_start_timer (struct thread *thread)
367 {
368 struct peer *peer;
369
370 peer = THREAD_ARG (thread);
371 peer->t_start = NULL;
372
373 if (bgp_debug_neighbor_events(peer))
374 zlog_debug("%s [FSM] Timer (start timer expire).", peer->host);
375
376 THREAD_VAL (thread) = BGP_Start;
377 bgp_event (thread); /* bgp_event unlocks peer */
378
379 return 0;
380 }
381
382 /* BGP connect retry timer. */
383 static int
384 bgp_connect_timer (struct thread *thread)
385 {
386 struct peer *peer;
387 int ret;
388
389 peer = THREAD_ARG (thread);
390 peer->t_connect = NULL;
391
392 if (bgp_debug_neighbor_events(peer))
393 zlog_debug("%s [FSM] Timer (connect timer expire)", peer->host);
394
395 if (CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER))
396 {
397 bgp_stop(peer);
398 ret = -1;
399 }
400 else
401 {
402 THREAD_VAL (thread) = ConnectRetry_timer_expired;
403 bgp_event (thread); /* bgp_event unlocks peer */
404 ret = 0;
405 }
406
407 return ret;
408 }
409
410 /* BGP holdtime timer. */
411 static int
412 bgp_holdtime_timer (struct thread *thread)
413 {
414 struct peer *peer;
415
416 peer = THREAD_ARG (thread);
417 peer->t_holdtime = NULL;
418
419 if (bgp_debug_neighbor_events(peer))
420 zlog_debug ("%s [FSM] Timer (holdtime timer expire)", peer->host);
421
422 THREAD_VAL (thread) = Hold_Timer_expired;
423 bgp_event (thread); /* bgp_event unlocks peer */
424
425 return 0;
426 }
427
428 /* BGP keepalive fire ! */
429 static int
430 bgp_keepalive_timer (struct thread *thread)
431 {
432 struct peer *peer;
433
434 peer = THREAD_ARG (thread);
435 peer->t_keepalive = NULL;
436
437 if (bgp_debug_neighbor_events(peer))
438 zlog_debug ("%s [FSM] Timer (keepalive timer expire)", peer->host);
439
440 THREAD_VAL (thread) = KeepAlive_timer_expired;
441 bgp_event (thread); /* bgp_event unlocks peer */
442
443 return 0;
444 }
445
446 int
447 bgp_routeadv_timer (struct thread *thread)
448 {
449 struct peer *peer;
450
451 peer = THREAD_ARG (thread);
452 peer->t_routeadv = NULL;
453
454 if (bgp_debug_neighbor_events(peer))
455 zlog_debug ("%s [FSM] Timer (routeadv timer expire)", peer->host);
456
457 peer->synctime = bgp_clock ();
458
459 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
460
461 /* MRAI timer will be started again when FIFO is built, no need to
462 * do it here.
463 */
464 return 0;
465 }
466
467 /* BGP Peer Down Cause */
468 const char *peer_down_str[] =
469 {
470 "",
471 "Router ID changed",
472 "Remote AS changed",
473 "Local AS change",
474 "Cluster ID changed",
475 "Confederation identifier changed",
476 "Confederation peer changed",
477 "RR client config change",
478 "RS client config change",
479 "Update source change",
480 "Address family activated",
481 "Admin. shutdown",
482 "User reset",
483 "BGP Notification received",
484 "BGP Notification send",
485 "Peer closed the session",
486 "Neighbor deleted",
487 "Peer-group add member",
488 "Peer-group delete member",
489 "Capability changed",
490 "Passive config change",
491 "Multihop config change",
492 "NSF peer closed the session",
493 "Intf peering v6only config change",
494 "BFD down received",
495 "Interface down",
496 "Neighbor address lost"
497 };
498
499 static int
500 bgp_graceful_restart_timer_expire (struct thread *thread)
501 {
502 struct peer *peer;
503 afi_t afi;
504 safi_t safi;
505
506 peer = THREAD_ARG (thread);
507 peer->t_gr_restart = NULL;
508
509 /* NSF delete stale route */
510 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
511 for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++)
512 if (peer->nsf[afi][safi])
513 bgp_clear_stale_route (peer, afi, safi);
514
515 UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
516 BGP_TIMER_OFF (peer->t_gr_stale);
517
518 if (bgp_debug_neighbor_events(peer))
519 {
520 zlog_debug ("%s graceful restart timer expired", peer->host);
521 zlog_debug ("%s graceful restart stalepath timer stopped", peer->host);
522 }
523
524 bgp_timer_set (peer);
525
526 return 0;
527 }
528
529 static int
530 bgp_graceful_stale_timer_expire (struct thread *thread)
531 {
532 struct peer *peer;
533 afi_t afi;
534 safi_t safi;
535
536 peer = THREAD_ARG (thread);
537 peer->t_gr_stale = NULL;
538
539 if (bgp_debug_neighbor_events(peer))
540 zlog_debug ("%s graceful restart stalepath timer expired", peer->host);
541
542 /* NSF delete stale route */
543 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
544 for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++)
545 if (peer->nsf[afi][safi])
546 bgp_clear_stale_route (peer, afi, safi);
547
548 return 0;
549 }
550
551 static int
552 bgp_update_delay_applicable (struct bgp *bgp)
553 {
554 /* update_delay_over flag should be reset (set to 0) for any new
555 applicability of the update-delay during BGP process lifetime.
556 And it should be set after an occurence of the update-delay is over)*/
557 if (!bgp->update_delay_over)
558 return 1;
559
560 return 0;
561 }
562
563 int
564 bgp_update_delay_active (struct bgp *bgp)
565 {
566 if (bgp->t_update_delay)
567 return 1;
568
569 return 0;
570 }
571
572 int
573 bgp_update_delay_configured (struct bgp *bgp)
574 {
575 if (bgp->v_update_delay)
576 return 1;
577
578 return 0;
579 }
580
581 /* Do the post-processing needed when bgp comes out of the read-only mode
582 on ending the update delay. */
583 void
584 bgp_update_delay_end (struct bgp *bgp)
585 {
586 THREAD_TIMER_OFF (bgp->t_update_delay);
587 THREAD_TIMER_OFF (bgp->t_establish_wait);
588
589 /* Reset update-delay related state */
590 bgp->update_delay_over = 1;
591 bgp->established = 0;
592 bgp->restarted_peers = 0;
593 bgp->implicit_eors = 0;
594 bgp->explicit_eors = 0;
595
596 quagga_timestamp(3, bgp->update_delay_end_time,
597 sizeof(bgp->update_delay_end_time));
598
599 /*
600 * Add an end-of-initial-update marker to the main process queues so that
601 * the route advertisement timer for the peers can be started. Also set
602 * the zebra and peer update hold flags. These flags are used to achieve
603 * three stages in the update-delay post processing:
604 * 1. Finish best-path selection for all the prefixes held on the queues.
605 * (routes in BGP are updated, and peers sync queues are populated too)
606 * 2. As the eoiu mark is reached in the bgp process routine, ship all the
607 * routes to zebra. With that zebra should see updates from BGP close
608 * to each other.
609 * 3. Unblock the peer update writes. With that peer update packing with
610 * the prefixes should be at its maximum.
611 */
612 bgp_add_eoiu_mark(bgp);
613 bgp->main_zebra_update_hold = 1;
614 bgp->main_peers_update_hold = 1;
615
616 /* Resume the queue processing. This should trigger the event that would take
617 care of processing any work that was queued during the read-only mode. */
618 work_queue_unplug(bm->process_main_queue);
619 }
620
621 /**
622 * see bgp_fsm.h
623 */
624 void
625 bgp_start_routeadv (struct bgp *bgp)
626 {
627 struct listnode *node, *nnode;
628 struct peer *peer;
629
630 zlog_info("bgp_start_routeadv(), update hold status %d",
631 bgp->main_peers_update_hold);
632
633 if (bgp->main_peers_update_hold)
634 return;
635
636 quagga_timestamp(3, bgp->update_delay_peers_resume_time,
637 sizeof(bgp->update_delay_peers_resume_time));
638
639 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
640 {
641 if (peer->status != Established)
642 continue;
643 BGP_TIMER_OFF(peer->t_routeadv);
644 BGP_TIMER_ON(peer->t_routeadv, bgp_routeadv_timer, 0);
645 }
646 }
647
648 /**
649 * see bgp_fsm.h
650 */
651 void
652 bgp_adjust_routeadv (struct peer *peer)
653 {
654 time_t nowtime = bgp_clock();
655 double diff;
656 unsigned long remain;
657
658 /* Bypass checks for special case of MRAI being 0 */
659 if (peer->v_routeadv == 0)
660 {
661 /* Stop existing timer, just in case it is running for a different
662 * duration and schedule write thread immediately.
663 */
664 if (peer->t_routeadv)
665 BGP_TIMER_OFF(peer->t_routeadv);
666
667 peer->synctime = bgp_clock ();
668 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
669 return;
670 }
671
672
673 /*
674 * CASE I:
675 * If the last update was written more than MRAI back, expire the timer
676 * instantly so that we can send the update out sooner.
677 *
678 * <------- MRAI --------->
679 * |-----------------|-----------------------|
680 * <------------- m ------------>
681 * ^ ^ ^
682 * | | |
683 * | | current time
684 * | timer start
685 * last write
686 *
687 * m > MRAI
688 */
689 diff = difftime(nowtime, peer->last_update);
690 if (diff > (double) peer->v_routeadv)
691 {
692 BGP_TIMER_OFF(peer->t_routeadv);
693 BGP_TIMER_ON(peer->t_routeadv, bgp_routeadv_timer, 0);
694 return;
695 }
696
697 /*
698 * CASE II:
699 * - Find when to expire the MRAI timer.
700 * If MRAI timer is not active, assume we can start it now.
701 *
702 * <------- MRAI --------->
703 * |------------|-----------------------|
704 * <-------- m ----------><----- r ----->
705 * ^ ^ ^
706 * | | |
707 * | | current time
708 * | timer start
709 * last write
710 *
711 * (MRAI - m) < r
712 */
713 if (peer->t_routeadv)
714 remain = thread_timer_remain_second(peer->t_routeadv);
715 else
716 remain = peer->v_routeadv;
717 diff = peer->v_routeadv - diff;
718 if (diff <= (double) remain)
719 {
720 BGP_TIMER_OFF(peer->t_routeadv);
721 BGP_TIMER_ON(peer->t_routeadv, bgp_routeadv_timer, diff);
722 }
723 }
724
725 static int
726 bgp_maxmed_onstartup_applicable (struct bgp *bgp)
727 {
728 if (!bgp->maxmed_onstartup_over)
729 return 1;
730
731 return 0;
732 }
733
734 int
735 bgp_maxmed_onstartup_configured (struct bgp *bgp)
736 {
737 if (bgp->v_maxmed_onstartup != BGP_MAXMED_ONSTARTUP_UNCONFIGURED)
738 return 1;
739
740 return 0;
741 }
742
743 int
744 bgp_maxmed_onstartup_active (struct bgp *bgp)
745 {
746 if (bgp->t_maxmed_onstartup)
747 return 1;
748
749 return 0;
750 }
751
752 void
753 bgp_maxmed_update (struct bgp *bgp)
754 {
755 u_char maxmed_active;
756 u_int32_t maxmed_value;
757
758 if (bgp->v_maxmed_admin)
759 {
760 maxmed_active = 1;
761 maxmed_value = bgp->maxmed_admin_value;
762 }
763 else if (bgp->t_maxmed_onstartup)
764 {
765 maxmed_active = 1;
766 maxmed_value = bgp->maxmed_onstartup_value;
767 }
768 else
769 {
770 maxmed_active = 0;
771 maxmed_value = BGP_MAXMED_VALUE_DEFAULT;
772 }
773
774 if (bgp->maxmed_active != maxmed_active ||
775 bgp->maxmed_value != maxmed_value)
776 {
777 bgp->maxmed_active = maxmed_active;
778 bgp->maxmed_value = maxmed_value;
779
780 update_group_announce(bgp);
781 }
782 }
783
784 /* The maxmed onstartup timer expiry callback. */
785 static int
786 bgp_maxmed_onstartup_timer (struct thread *thread)
787 {
788 struct bgp *bgp;
789
790 zlog_info ("Max med on startup ended - timer expired.");
791
792 bgp = THREAD_ARG (thread);
793 THREAD_TIMER_OFF (bgp->t_maxmed_onstartup);
794 bgp->maxmed_onstartup_over = 1;
795
796 bgp_maxmed_update(bgp);
797
798 return 0;
799 }
800
801 static void
802 bgp_maxmed_onstartup_begin (struct bgp *bgp)
803 {
804 /* Applicable only once in the process lifetime on the startup */
805 if (bgp->maxmed_onstartup_over)
806 return;
807
808 zlog_info ("Begin maxmed onstartup mode - timer %d seconds",
809 bgp->v_maxmed_onstartup);
810
811 THREAD_TIMER_ON (bm->master, bgp->t_maxmed_onstartup,
812 bgp_maxmed_onstartup_timer,
813 bgp, bgp->v_maxmed_onstartup);
814
815 if (!bgp->v_maxmed_admin)
816 {
817 bgp->maxmed_active = 1;
818 bgp->maxmed_value = bgp->maxmed_onstartup_value;
819 }
820
821 /* Route announce to all peers should happen after this in bgp_establish() */
822 }
823
824 static void
825 bgp_maxmed_onstartup_process_status_change(struct peer *peer)
826 {
827 if (peer->status == Established && !peer->bgp->established)
828 {
829 bgp_maxmed_onstartup_begin(peer->bgp);
830 }
831 }
832
833 /* The update delay timer expiry callback. */
834 static int
835 bgp_update_delay_timer (struct thread *thread)
836 {
837 struct bgp *bgp;
838
839 zlog_info ("Update delay ended - timer expired.");
840
841 bgp = THREAD_ARG (thread);
842 THREAD_TIMER_OFF (bgp->t_update_delay);
843 bgp_update_delay_end(bgp);
844
845 return 0;
846 }
847
848 /* The establish wait timer expiry callback. */
849 static int
850 bgp_establish_wait_timer (struct thread *thread)
851 {
852 struct bgp *bgp;
853
854 zlog_info ("Establish wait - timer expired.");
855
856 bgp = THREAD_ARG (thread);
857 THREAD_TIMER_OFF (bgp->t_establish_wait);
858 bgp_check_update_delay(bgp);
859
860 return 0;
861 }
862
863 /* Steps to begin the update delay:
864 - initialize queues if needed
865 - stop the queue processing
866 - start the timer */
867 static void
868 bgp_update_delay_begin (struct bgp *bgp)
869 {
870 struct listnode *node, *nnode;
871 struct peer *peer;
872
873 /* Stop the processing of queued work. Enqueue shall continue */
874 work_queue_plug(bm->process_main_queue);
875
876 for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
877 peer->update_delay_over = 0;
878
879 /* Start the update-delay timer */
880 THREAD_TIMER_ON (bm->master, bgp->t_update_delay, bgp_update_delay_timer,
881 bgp, bgp->v_update_delay);
882
883 if (bgp->v_establish_wait != bgp->v_update_delay)
884 THREAD_TIMER_ON (bm->master, bgp->t_establish_wait, bgp_establish_wait_timer,
885 bgp, bgp->v_establish_wait);
886
887 quagga_timestamp(3, bgp->update_delay_begin_time,
888 sizeof(bgp->update_delay_begin_time));
889 }
890
891 static void
892 bgp_update_delay_process_status_change(struct peer *peer)
893 {
894 if (peer->status == Established)
895 {
896 if (!peer->bgp->established++)
897 {
898 bgp_update_delay_begin(peer->bgp);
899 zlog_info ("Begin read-only mode - update-delay timer %d seconds",
900 peer->bgp->v_update_delay);
901 }
902 if (CHECK_FLAG (peer->cap, PEER_CAP_RESTART_BIT_RCV))
903 bgp_update_restarted_peers(peer);
904 }
905 if (peer->ostatus == Established && bgp_update_delay_active(peer->bgp))
906 {
907 /* Adjust the update-delay state to account for this flap.
908 NOTE: Intentionally skipping adjusting implicit_eors or explicit_eors
909 counters. Extra sanity check in bgp_check_update_delay() should
910 be enough to take care of any additive discrepancy in bgp eor
911 counters */
912 peer->bgp->established--;
913 peer->update_delay_over = 0;
914 }
915 }
916
917 /* Called after event occured, this function change status and reset
918 read/write and timer thread. */
919 void
920 bgp_fsm_change_status (struct peer *peer, int status)
921 {
922
923 bgp_dump_state (peer, peer->status, status);
924
925 /* Transition into Clearing or Deleted must /always/ clear all routes..
926 * (and must do so before actually changing into Deleted..
927 */
928 if (status >= Clearing)
929 {
930 bgp_clear_route_all (peer);
931
932 /* If no route was queued for the clear-node processing, generate the
933 * completion event here. This is needed because if there are no routes
934 * to trigger the background clear-node thread, the event won't get
935 * generated and the peer would be stuck in Clearing. Note that this
936 * event is for the peer and helps the peer transition out of Clearing
937 * state; it should not be generated per (AFI,SAFI). The event is
938 * directly posted here without calling clear_node_complete() as we
939 * shouldn't do an extra unlock. This event will get processed after
940 * the state change that happens below, so peer will be in Clearing
941 * (or Deleted).
942 */
943 if (!work_queue_is_scheduled (peer->clear_node_queue))
944 BGP_EVENT_ADD (peer, Clearing_Completed);
945 }
946
947 /* Preserve old status and change into new status. */
948 peer->ostatus = peer->status;
949 peer->status = status;
950
951 /* Save event that caused status change. */
952 peer->last_major_event = peer->cur_event;
953
954 if (status == Established)
955 UNSET_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER);
956
957 /* If max-med processing is applicable, do the necessary. */
958 if (status == Established)
959 {
960 if (bgp_maxmed_onstartup_configured(peer->bgp) &&
961 bgp_maxmed_onstartup_applicable(peer->bgp))
962 bgp_maxmed_onstartup_process_status_change(peer);
963 else
964 peer->bgp->maxmed_onstartup_over = 1;
965 }
966
967 /* If update-delay processing is applicable, do the necessary. */
968 if (bgp_update_delay_configured(peer->bgp) &&
969 bgp_update_delay_applicable(peer->bgp))
970 bgp_update_delay_process_status_change(peer);
971
972 if (bgp_debug_neighbor_events(peer))
973 zlog_debug ("%s went from %s to %s",
974 peer->host,
975 LOOKUP (bgp_status_msg, peer->ostatus),
976 LOOKUP (bgp_status_msg, peer->status));
977 }
978
979 /* Flush the event queue and ensure the peer is shut down */
980 static int
981 bgp_clearing_completed (struct peer *peer)
982 {
983 int rc = bgp_stop(peer);
984
985 if (rc >= 0)
986 BGP_EVENT_FLUSH (peer);
987
988 return rc;
989 }
990
991 /* Administrative BGP peer stop event. */
992 /* May be called multiple times for the same peer */
993 int
994 bgp_stop (struct peer *peer)
995 {
996 afi_t afi;
997 safi_t safi;
998 char orf_name[BUFSIZ];
999 int ret = 0;
1000
1001 if (peer_dynamic_neighbor(peer) &&
1002 !(CHECK_FLAG(peer->flags, PEER_FLAG_DELETE)))
1003 {
1004 if (bgp_debug_neighbor_events(peer))
1005 zlog_debug ("%s (dynamic neighbor) deleted", peer->host);
1006 peer_delete (peer);
1007 return -1;
1008 }
1009
1010 /* Can't do this in Clearing; events are used for state transitions */
1011 if (peer->status != Clearing)
1012 {
1013 /* Delete all existing events of the peer */
1014 BGP_EVENT_FLUSH (peer);
1015 }
1016
1017 /* Increment Dropped count. */
1018 if (peer->status == Established)
1019 {
1020 peer->dropped++;
1021
1022 /* bgp log-neighbor-changes of neighbor Down */
1023 if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
1024 zlog_info ("%%ADJCHANGE: neighbor %s Down %s", peer->host,
1025 peer_down_str [(int) peer->last_reset]);
1026
1027 /* graceful restart */
1028 if (peer->t_gr_stale)
1029 {
1030 BGP_TIMER_OFF (peer->t_gr_stale);
1031 if (bgp_debug_neighbor_events(peer))
1032 zlog_debug ("%s graceful restart stalepath timer stopped", peer->host);
1033 }
1034 if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
1035 {
1036 if (bgp_debug_neighbor_events(peer))
1037 {
1038 zlog_debug ("%s graceful restart timer started for %d sec",
1039 peer->host, peer->v_gr_restart);
1040 zlog_debug ("%s graceful restart stalepath timer started for %d sec",
1041 peer->host, peer->bgp->stalepath_time);
1042 }
1043 BGP_TIMER_ON (peer->t_gr_restart, bgp_graceful_restart_timer_expire,
1044 peer->v_gr_restart);
1045 BGP_TIMER_ON (peer->t_gr_stale, bgp_graceful_stale_timer_expire,
1046 peer->bgp->stalepath_time);
1047 }
1048 else
1049 {
1050 UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
1051
1052 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1053 for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++)
1054 peer->nsf[afi][safi] = 0;
1055 }
1056
1057 /* set last reset time */
1058 peer->resettime = peer->uptime = bgp_clock ();
1059
1060 if (BGP_DEBUG (update_groups, UPDATE_GROUPS))
1061 zlog_debug ("%s remove from all update group", peer->host);
1062 update_group_remove_peer_afs(peer);
1063
1064 #ifdef HAVE_SNMP
1065 bgpTrapBackwardTransition (peer);
1066 #endif /* HAVE_SNMP */
1067
1068 /* Reset peer synctime */
1069 peer->synctime = 0;
1070
1071 bgp_bfd_deregister_peer(peer);
1072 }
1073
1074 /* Stop read and write threads when exists. */
1075 BGP_READ_OFF (peer->t_read);
1076 BGP_WRITE_OFF (peer->t_write);
1077
1078 /* Stop all timers. */
1079 BGP_TIMER_OFF (peer->t_start);
1080 BGP_TIMER_OFF (peer->t_connect);
1081 BGP_TIMER_OFF (peer->t_holdtime);
1082 BGP_TIMER_OFF (peer->t_keepalive);
1083 BGP_TIMER_OFF (peer->t_routeadv);
1084
1085 /* Stream reset. */
1086 peer->packet_size = 0;
1087
1088 /* Clear input and output buffer. */
1089 if (peer->ibuf)
1090 stream_reset (peer->ibuf);
1091 if (peer->work)
1092 stream_reset (peer->work);
1093 if (peer->obuf)
1094 stream_fifo_clean (peer->obuf);
1095
1096 /* Close of file descriptor. */
1097 if (peer->fd >= 0)
1098 {
1099 close (peer->fd);
1100 peer->fd = -1;
1101 }
1102
1103 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1104 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1105 {
1106 /* Reset all negotiated variables */
1107 peer->afc_nego[afi][safi] = 0;
1108 peer->afc_adv[afi][safi] = 0;
1109 peer->afc_recv[afi][safi] = 0;
1110
1111 /* peer address family capability flags*/
1112 peer->af_cap[afi][safi] = 0;
1113
1114 /* peer address family status flags*/
1115 peer->af_sflags[afi][safi] = 0;
1116
1117 /* Received ORF prefix-filter */
1118 peer->orf_plist[afi][safi] = NULL;
1119
1120 if ((peer->status == OpenConfirm) || (peer->status == Established)) {
1121 /* ORF received prefix-filter pnt */
1122 sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi);
1123 prefix_bgp_orf_remove_all (afi, orf_name);
1124 }
1125 }
1126
1127 /* Reset keepalive and holdtime */
1128 if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
1129 {
1130 peer->v_keepalive = peer->keepalive;
1131 peer->v_holdtime = peer->holdtime;
1132 }
1133 else
1134 {
1135 peer->v_keepalive = peer->bgp->default_keepalive;
1136 peer->v_holdtime = peer->bgp->default_holdtime;
1137 }
1138
1139 peer->update_time = 0;
1140
1141 /* Until we are sure that there is no problem about prefix count
1142 this should be commented out.*/
1143 #if 0
1144 /* Reset prefix count */
1145 peer->pcount[AFI_IP][SAFI_UNICAST] = 0;
1146 peer->pcount[AFI_IP][SAFI_MULTICAST] = 0;
1147 peer->pcount[AFI_IP][SAFI_MPLS_VPN] = 0;
1148 peer->pcount[AFI_IP6][SAFI_UNICAST] = 0;
1149 peer->pcount[AFI_IP6][SAFI_MULTICAST] = 0;
1150 #endif /* 0 */
1151
1152 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE) &&
1153 !(CHECK_FLAG(peer->flags, PEER_FLAG_DELETE)))
1154 {
1155 peer_delete(peer);
1156 ret = -1;
1157 }
1158 else
1159 {
1160 bgp_peer_conf_if_to_su_update(peer);
1161 }
1162
1163 return ret;
1164 }
1165
1166 /* BGP peer is stoped by the error. */
1167 static int
1168 bgp_stop_with_error (struct peer *peer)
1169 {
1170 /* Double start timer. */
1171 peer->v_start *= 2;
1172
1173 /* Overflow check. */
1174 if (peer->v_start >= (60 * 2))
1175 peer->v_start = (60 * 2);
1176
1177 if (peer_dynamic_neighbor(peer))
1178 {
1179 if (bgp_debug_neighbor_events(peer))
1180 zlog_debug ("%s (dynamic neighbor) deleted", peer->host);
1181 peer_delete (peer);
1182 return -1;
1183 }
1184
1185 return(bgp_stop (peer));
1186 }
1187
1188
1189 /* something went wrong, send notify and tear down */
1190 static int
1191 bgp_stop_with_notify (struct peer *peer, u_char code, u_char sub_code)
1192 {
1193 /* Send notify to remote peer */
1194 bgp_notify_send (peer, code, sub_code);
1195
1196 if (peer_dynamic_neighbor(peer))
1197 {
1198 if (bgp_debug_neighbor_events(peer))
1199 zlog_debug ("%s (dynamic neighbor) deleted", peer->host);
1200 peer_delete (peer);
1201 return -1;
1202 }
1203
1204 /* Clear start timer value to default. */
1205 peer->v_start = BGP_INIT_START_TIMER;
1206
1207 return(bgp_stop(peer));
1208 }
1209
1210
1211 /* TCP connection open. Next we send open message to remote peer. And
1212 add read thread for reading open message. */
1213 static int
1214 bgp_connect_success (struct peer *peer)
1215 {
1216 if (peer->fd < 0)
1217 {
1218 zlog_err ("bgp_connect_success peer's fd is negative value %d",
1219 peer->fd);
1220 bgp_stop(peer);
1221 return -1;
1222 }
1223
1224 if (bgp_getsockname (peer) < 0)
1225 {
1226 zlog_err ("%s: bgp_getsockname(): failed for peer %s, fd %d", __FUNCTION__,
1227 peer->host, peer->fd);
1228 bgp_notify_send(peer, BGP_NOTIFY_FSM_ERR, 0); /* internal error */
1229 return -1;
1230 }
1231
1232 BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
1233
1234 if (bgp_debug_neighbor_events(peer))
1235 {
1236 char buf1[SU_ADDRSTRLEN];
1237
1238 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
1239 zlog_debug ("%s open active, local address %s", peer->host,
1240 sockunion2str (peer->su_local, buf1, SU_ADDRSTRLEN));
1241 else
1242 zlog_debug ("%s passive open", peer->host);
1243 }
1244
1245 bgp_open_send (peer);
1246
1247 return 0;
1248 }
1249
1250 /* TCP connect fail */
1251 static int
1252 bgp_connect_fail (struct peer *peer)
1253 {
1254 if (peer_dynamic_neighbor(peer))
1255 {
1256 if (bgp_debug_neighbor_events(peer))
1257 zlog_debug ("%s (dynamic neighbor) deleted", peer->host);
1258 peer_delete (peer);
1259 return -1;
1260 }
1261
1262 return (bgp_stop (peer));
1263 }
1264
1265 /* This function is the first starting point of all BGP connection. It
1266 try to connect to remote peer with non-blocking IO. */
1267 int
1268 bgp_start (struct peer *peer)
1269 {
1270 int status;
1271 int connected = 0;
1272
1273 bgp_peer_conf_if_to_su_update(peer);
1274
1275 if (peer->su.sa.sa_family == AF_UNSPEC)
1276 {
1277 if (bgp_debug_neighbor_events(peer))
1278 zlog_debug ("%s [FSM] Unable to get neighbor's IP address, waiting...",
1279 peer->host);
1280 return -1;
1281 }
1282
1283 if (BGP_PEER_START_SUPPRESSED (peer))
1284 {
1285 if (bgp_debug_neighbor_events(peer))
1286 zlog_err ("%s [FSM] Trying to start suppressed peer"
1287 " - this is never supposed to happen!", peer->host);
1288 return -1;
1289 }
1290
1291 /* Scrub some information that might be left over from a previous,
1292 * session
1293 */
1294 /* Connection information. */
1295 if (peer->su_local)
1296 {
1297 sockunion_free (peer->su_local);
1298 peer->su_local = NULL;
1299 }
1300
1301 if (peer->su_remote)
1302 {
1303 sockunion_free (peer->su_remote);
1304 peer->su_remote = NULL;
1305 }
1306
1307 /* Clear remote router-id. */
1308 peer->remote_id.s_addr = 0;
1309
1310 /* Clear peer capability flag. */
1311 peer->cap = 0;
1312
1313 /* If the peer is passive mode, force to move to Active mode. */
1314 if (CHECK_FLAG (peer->flags, PEER_FLAG_PASSIVE))
1315 {
1316 BGP_EVENT_ADD (peer, TCP_connection_open_failed);
1317 return 0;
1318 }
1319
1320 /* Register to be notified on peer up */
1321 if (peer->sort == BGP_PEER_EBGP && peer->ttl == 1 &&
1322 ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)
1323 && ! bgp_flag_check(peer->bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK))
1324 connected = 1;
1325 else
1326 connected = 0;
1327
1328 if (!bgp_find_or_add_nexthop(peer->bgp, family2afi(peer->su.sa.sa_family),
1329 NULL, peer, connected))
1330 {
1331 #if defined (HAVE_CUMULUS)
1332 if (bgp_debug_neighbor_events(peer))
1333 zlog_debug ("%s [FSM] Waiting for NHT", peer->host);
1334
1335 BGP_EVENT_ADD(peer, TCP_connection_open_failed);
1336 return 0;
1337 #endif
1338 }
1339
1340 status = bgp_connect (peer);
1341
1342 switch (status)
1343 {
1344 case connect_error:
1345 if (bgp_debug_neighbor_events(peer))
1346 zlog_debug ("%s [FSM] Connect error", peer->host);
1347 BGP_EVENT_ADD (peer, TCP_connection_open_failed);
1348 break;
1349 case connect_success:
1350 if (bgp_debug_neighbor_events(peer))
1351 zlog_debug ("%s [FSM] Connect immediately success, fd %d",
1352 peer->host, peer->fd);
1353 BGP_EVENT_ADD (peer, TCP_connection_open);
1354 break;
1355 case connect_in_progress:
1356 /* To check nonblocking connect, we wait until socket is
1357 readable or writable. */
1358 if (bgp_debug_neighbor_events(peer))
1359 zlog_debug ("%s [FSM] Non blocking connect waiting result, fd %d",
1360 peer->host, peer->fd);
1361 if (peer->fd < 0)
1362 {
1363 zlog_err ("bgp_start peer's fd is negative value %d",
1364 peer->fd);
1365 return -1;
1366 }
1367 BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
1368 BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
1369 break;
1370 }
1371 return 0;
1372 }
1373
1374 /* Connect retry timer is expired when the peer status is Connect. */
1375 static int
1376 bgp_reconnect (struct peer *peer)
1377 {
1378 if (bgp_stop (peer) < 0)
1379 return -1;
1380
1381 bgp_start (peer);
1382 return 0;
1383 }
1384
1385 static int
1386 bgp_fsm_open (struct peer *peer)
1387 {
1388 /* Send keepalive and make keepalive timer */
1389 bgp_keepalive_send (peer);
1390
1391 /* Reset holdtimer value. */
1392 BGP_TIMER_OFF (peer->t_holdtime);
1393
1394 return 0;
1395 }
1396
1397 /* Keepalive send to peer. */
1398 static int
1399 bgp_fsm_keepalive_expire (struct peer *peer)
1400 {
1401 bgp_keepalive_send (peer);
1402 return 0;
1403 }
1404
1405 /* FSM error, unexpected event. This is error of BGP connection. So cut the
1406 peer and change to Idle status. */
1407 static int
1408 bgp_fsm_event_error (struct peer *peer)
1409 {
1410 zlog_err ("%s [FSM] unexpected packet received in state %s",
1411 peer->host, LOOKUP (bgp_status_msg, peer->status));
1412
1413 return bgp_stop_with_notify (peer, BGP_NOTIFY_FSM_ERR, 0);
1414 }
1415
1416 /* Hold timer expire. This is error of BGP connection. So cut the
1417 peer and change to Idle status. */
1418 static int
1419 bgp_fsm_holdtime_expire (struct peer *peer)
1420 {
1421 if (bgp_debug_neighbor_events(peer))
1422 zlog_debug ("%s [FSM] Hold timer expire", peer->host);
1423
1424 return bgp_stop_with_notify (peer, BGP_NOTIFY_HOLD_ERR, 0);
1425 }
1426
1427 /* Status goes to Established. Send keepalive packet then make first
1428 update information. */
1429 static int
1430 bgp_establish (struct peer *peer)
1431 {
1432 afi_t afi;
1433 safi_t safi;
1434 int nsf_af_count = 0;
1435 int ret = 0;
1436 struct peer *other;
1437
1438 other = peer->doppelganger;
1439 peer = peer_xfer_conn(peer);
1440 if (!peer)
1441 {
1442 zlog_err ("%%Neighbor failed in xfer_conn");
1443 return -1;
1444 }
1445
1446 if (other == peer)
1447 ret = 1; /* bgp_establish specific code when xfer_conn happens. */
1448
1449 /* Reset capability open status flag. */
1450 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN))
1451 SET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
1452
1453 /* Clear start timer value to default. */
1454 peer->v_start = BGP_INIT_START_TIMER;
1455
1456 /* Increment established count. */
1457 peer->established++;
1458 bgp_fsm_change_status (peer, Established);
1459
1460 /* bgp log-neighbor-changes of neighbor Up */
1461 if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
1462 zlog_info ("%%ADJCHANGE: neighbor %s Up", peer->host);
1463
1464 /* assign update-group/subgroup */
1465 update_group_adjust_peer_afs(peer);
1466
1467 /* graceful restart */
1468 UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
1469 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1470 for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_4 ; safi++)
1471 {
1472 if (peer->afc_nego[afi][safi]
1473 && CHECK_FLAG (peer->cap, PEER_CAP_RESTART_ADV)
1474 && CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV))
1475 {
1476 if (peer->nsf[afi][safi]
1477 && ! CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV))
1478 bgp_clear_stale_route (peer, afi, safi);
1479
1480 peer->nsf[afi][safi] = 1;
1481 nsf_af_count++;
1482 }
1483 else
1484 {
1485 if (peer->nsf[afi][safi])
1486 bgp_clear_stale_route (peer, afi, safi);
1487 peer->nsf[afi][safi] = 0;
1488 }
1489 }
1490
1491 if (nsf_af_count)
1492 SET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
1493 else
1494 {
1495 UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
1496 if (peer->t_gr_stale)
1497 {
1498 BGP_TIMER_OFF (peer->t_gr_stale);
1499 if (bgp_debug_neighbor_events(peer))
1500 zlog_debug ("%s graceful restart stalepath timer stopped", peer->host);
1501 }
1502 }
1503
1504 if (peer->t_gr_restart)
1505 {
1506 BGP_TIMER_OFF (peer->t_gr_restart);
1507 if (bgp_debug_neighbor_events(peer))
1508 zlog_debug ("%s graceful restart timer stopped", peer->host);
1509 }
1510
1511 #ifdef HAVE_SNMP
1512 bgpTrapEstablished (peer);
1513 #endif /* HAVE_SNMP */
1514
1515 /* Reset uptime, send keepalive, send current table. */
1516 peer->uptime = bgp_clock ();
1517
1518 /* Send route-refresh when ORF is enabled */
1519 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1520 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1521 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV))
1522 {
1523 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
1524 bgp_route_refresh_send (peer, afi, safi, ORF_TYPE_PREFIX,
1525 REFRESH_IMMEDIATE, 0);
1526 else if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
1527 bgp_route_refresh_send (peer, afi, safi, ORF_TYPE_PREFIX_OLD,
1528 REFRESH_IMMEDIATE, 0);
1529 }
1530
1531 /* First update is deferred until ORF or ROUTE-REFRESH is received */
1532 for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
1533 for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
1534 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV))
1535 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
1536 || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV))
1537 SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH);
1538
1539 bgp_announce_peer (peer);
1540
1541 /* Start the route advertisement timer to send updates to the peer - if BGP
1542 * is not in read-only mode. If it is, the timer will be started at the end
1543 * of read-only mode.
1544 */
1545 if (!bgp_update_delay_active(peer->bgp))
1546 {
1547 BGP_TIMER_OFF(peer->t_routeadv);
1548 BGP_TIMER_ON (peer->t_routeadv, bgp_routeadv_timer, 0);
1549 }
1550
1551 if (peer->doppelganger && (peer->doppelganger->status != Deleted))
1552 {
1553 if (bgp_debug_neighbor_events(peer))
1554 zlog_debug("[Event] Deleting stub connection for peer %s", peer->host);
1555
1556 if (peer->doppelganger->status > Active)
1557 bgp_notify_send (peer->doppelganger, BGP_NOTIFY_CEASE,
1558 BGP_NOTIFY_CEASE_COLLISION_RESOLUTION);
1559 else
1560 peer_delete(peer->doppelganger);
1561 }
1562
1563 bgp_bfd_register_peer(peer);
1564 return ret;
1565 }
1566
1567 /* Keepalive packet is received. */
1568 static int
1569 bgp_fsm_keepalive (struct peer *peer)
1570 {
1571 bgp_update_implicit_eors(peer);
1572
1573 /* peer count update */
1574 peer->keepalive_in++;
1575
1576 BGP_TIMER_OFF (peer->t_holdtime);
1577 return 0;
1578 }
1579
1580 /* Update packet is received. */
1581 static int
1582 bgp_fsm_update (struct peer *peer)
1583 {
1584 BGP_TIMER_OFF (peer->t_holdtime);
1585 return 0;
1586 }
1587
1588 /* This is empty event. */
1589 static int
1590 bgp_ignore (struct peer *peer)
1591 {
1592 zlog_err ("%s [FSM] Ignoring event %s in state %s, prior events %s, %s, fd %d",
1593 peer->host, bgp_event_str[peer->cur_event],
1594 LOOKUP (bgp_status_msg, peer->status),
1595 bgp_event_str[peer->last_event],
1596 bgp_event_str[peer->last_major_event], peer->fd);
1597 return 0;
1598 }
1599
1600 /* This is to handle unexpected events.. */
1601 static int
1602 bgp_fsm_exeption (struct peer *peer)
1603 {
1604 zlog_err ("%s [FSM] Unexpected event %s in state %s, prior events %s, %s, fd %d",
1605 peer->host, bgp_event_str[peer->cur_event],
1606 LOOKUP (bgp_status_msg, peer->status),
1607 bgp_event_str[peer->last_event],
1608 bgp_event_str[peer->last_major_event], peer->fd);
1609 return(bgp_stop (peer));
1610 }
1611
1612 void
1613 bgp_fsm_nht_update(struct peer *peer, int valid)
1614 {
1615 if (!peer)
1616 return;
1617
1618 switch (peer->status)
1619 {
1620 case Idle:
1621 if (valid)
1622 BGP_EVENT_ADD(peer, BGP_Start);
1623 break;
1624 case Connect:
1625 if (!valid)
1626 {
1627 BGP_TIMER_OFF(peer->t_connect);
1628 BGP_EVENT_ADD(peer, TCP_fatal_error);
1629 }
1630 break;
1631 case Active:
1632 if (valid)
1633 {
1634 BGP_TIMER_OFF(peer->t_connect);
1635 BGP_EVENT_ADD(peer, ConnectRetry_timer_expired);
1636 }
1637 break;
1638 case OpenSent:
1639 case OpenConfirm:
1640 case Established:
1641 if (!valid && (peer->gtsm_hops == 1))
1642 BGP_EVENT_ADD(peer, TCP_fatal_error);
1643 case Clearing:
1644 case Deleted:
1645 default:
1646 break;
1647 }
1648 }
1649
1650
1651 /* Finite State Machine structure */
1652 static const struct {
1653 int (*func) (struct peer *);
1654 int next_state;
1655 } FSM [BGP_STATUS_MAX - 1][BGP_EVENTS_MAX - 1] =
1656 {
1657 {
1658 /* Idle state: In Idle state, all events other than BGP_Start is
1659 ignored. With BGP_Start event, finite state machine calls
1660 bgp_start(). */
1661 {bgp_start, Connect}, /* BGP_Start */
1662 {bgp_stop, Idle}, /* BGP_Stop */
1663 {bgp_stop, Idle}, /* TCP_connection_open */
1664 {bgp_stop, Idle}, /* TCP_connection_closed */
1665 {bgp_ignore, Idle}, /* TCP_connection_open_failed */
1666 {bgp_stop, Idle}, /* TCP_fatal_error */
1667 {bgp_ignore, Idle}, /* ConnectRetry_timer_expired */
1668 {bgp_ignore, Idle}, /* Hold_Timer_expired */
1669 {bgp_ignore, Idle}, /* KeepAlive_timer_expired */
1670 {bgp_ignore, Idle}, /* Receive_OPEN_message */
1671 {bgp_ignore, Idle}, /* Receive_KEEPALIVE_message */
1672 {bgp_ignore, Idle}, /* Receive_UPDATE_message */
1673 {bgp_ignore, Idle}, /* Receive_NOTIFICATION_message */
1674 {bgp_ignore, Idle}, /* Clearing_Completed */
1675 },
1676 {
1677 /* Connect */
1678 {bgp_ignore, Connect}, /* BGP_Start */
1679 {bgp_stop, Idle}, /* BGP_Stop */
1680 {bgp_connect_success, OpenSent}, /* TCP_connection_open */
1681 {bgp_stop, Idle}, /* TCP_connection_closed */
1682 {bgp_connect_fail, Active}, /* TCP_connection_open_failed */
1683 {bgp_connect_fail, Idle}, /* TCP_fatal_error */
1684 {bgp_reconnect, Connect}, /* ConnectRetry_timer_expired */
1685 {bgp_fsm_exeption, Idle}, /* Hold_Timer_expired */
1686 {bgp_fsm_exeption, Idle}, /* KeepAlive_timer_expired */
1687 {bgp_fsm_exeption, Idle}, /* Receive_OPEN_message */
1688 {bgp_fsm_exeption, Idle}, /* Receive_KEEPALIVE_message */
1689 {bgp_fsm_exeption, Idle}, /* Receive_UPDATE_message */
1690 {bgp_stop, Idle}, /* Receive_NOTIFICATION_message */
1691 {bgp_fsm_exeption, Idle}, /* Clearing_Completed */
1692 },
1693 {
1694 /* Active, */
1695 {bgp_ignore, Active}, /* BGP_Start */
1696 {bgp_stop, Idle}, /* BGP_Stop */
1697 {bgp_connect_success, OpenSent}, /* TCP_connection_open */
1698 {bgp_stop, Idle}, /* TCP_connection_closed */
1699 {bgp_ignore, Active}, /* TCP_connection_open_failed */
1700 {bgp_fsm_exeption, Idle}, /* TCP_fatal_error */
1701 {bgp_start, Connect}, /* ConnectRetry_timer_expired */
1702 {bgp_fsm_exeption, Idle}, /* Hold_Timer_expired */
1703 {bgp_fsm_exeption, Idle}, /* KeepAlive_timer_expired */
1704 {bgp_fsm_exeption, Idle}, /* Receive_OPEN_message */
1705 {bgp_fsm_exeption, Idle}, /* Receive_KEEPALIVE_message */
1706 {bgp_fsm_exeption, Idle}, /* Receive_UPDATE_message */
1707 {bgp_fsm_exeption, Idle}, /* Receive_NOTIFICATION_message */
1708 {bgp_fsm_exeption, Idle}, /* Clearing_Completed */
1709 },
1710 {
1711 /* OpenSent, */
1712 {bgp_ignore, OpenSent}, /* BGP_Start */
1713 {bgp_stop, Idle}, /* BGP_Stop */
1714 {bgp_stop, Active}, /* TCP_connection_open */
1715 {bgp_stop, Active}, /* TCP_connection_closed */
1716 {bgp_stop, Active}, /* TCP_connection_open_failed */
1717 {bgp_stop, Active}, /* TCP_fatal_error */
1718 {bgp_fsm_exeption, Idle}, /* ConnectRetry_timer_expired */
1719 {bgp_fsm_holdtime_expire, Idle}, /* Hold_Timer_expired */
1720 {bgp_fsm_exeption, Idle}, /* KeepAlive_timer_expired */
1721 {bgp_fsm_open, OpenConfirm}, /* Receive_OPEN_message */
1722 {bgp_fsm_event_error, Idle}, /* Receive_KEEPALIVE_message */
1723 {bgp_fsm_event_error, Idle}, /* Receive_UPDATE_message */
1724 {bgp_stop_with_error, Idle}, /* Receive_NOTIFICATION_message */
1725 {bgp_fsm_exeption, Idle}, /* Clearing_Completed */
1726 },
1727 {
1728 /* OpenConfirm, */
1729 {bgp_ignore, OpenConfirm}, /* BGP_Start */
1730 {bgp_stop, Idle}, /* BGP_Stop */
1731 {bgp_stop, Idle}, /* TCP_connection_open */
1732 {bgp_stop, Idle}, /* TCP_connection_closed */
1733 {bgp_stop, Idle}, /* TCP_connection_open_failed */
1734 {bgp_stop, Idle}, /* TCP_fatal_error */
1735 {bgp_fsm_exeption, Idle}, /* ConnectRetry_timer_expired */
1736 {bgp_fsm_holdtime_expire, Idle}, /* Hold_Timer_expired */
1737 {bgp_ignore, OpenConfirm}, /* KeepAlive_timer_expired */
1738 {bgp_fsm_exeption, Idle}, /* Receive_OPEN_message */
1739 {bgp_establish, Established}, /* Receive_KEEPALIVE_message */
1740 {bgp_fsm_exeption, Idle}, /* Receive_UPDATE_message */
1741 {bgp_stop_with_error, Idle}, /* Receive_NOTIFICATION_message */
1742 {bgp_fsm_exeption, Idle}, /* Clearing_Completed */
1743 },
1744 {
1745 /* Established, */
1746 {bgp_ignore, Established}, /* BGP_Start */
1747 {bgp_stop, Clearing}, /* BGP_Stop */
1748 {bgp_stop, Clearing}, /* TCP_connection_open */
1749 {bgp_stop, Clearing}, /* TCP_connection_closed */
1750 {bgp_stop, Clearing}, /* TCP_connection_open_failed */
1751 {bgp_stop, Clearing}, /* TCP_fatal_error */
1752 {bgp_stop, Clearing}, /* ConnectRetry_timer_expired */
1753 {bgp_fsm_holdtime_expire, Clearing}, /* Hold_Timer_expired */
1754 {bgp_fsm_keepalive_expire, Established}, /* KeepAlive_timer_expired */
1755 {bgp_stop, Clearing}, /* Receive_OPEN_message */
1756 {bgp_fsm_keepalive, Established}, /* Receive_KEEPALIVE_message */
1757 {bgp_fsm_update, Established}, /* Receive_UPDATE_message */
1758 {bgp_stop_with_error, Clearing}, /* Receive_NOTIFICATION_message */
1759 {bgp_fsm_exeption, Idle}, /* Clearing_Completed */
1760 },
1761 {
1762 /* Clearing, */
1763 {bgp_ignore, Clearing}, /* BGP_Start */
1764 {bgp_stop, Clearing}, /* BGP_Stop */
1765 {bgp_stop, Clearing}, /* TCP_connection_open */
1766 {bgp_stop, Clearing}, /* TCP_connection_closed */
1767 {bgp_stop, Clearing}, /* TCP_connection_open_failed */
1768 {bgp_stop, Clearing}, /* TCP_fatal_error */
1769 {bgp_stop, Clearing}, /* ConnectRetry_timer_expired */
1770 {bgp_stop, Clearing}, /* Hold_Timer_expired */
1771 {bgp_stop, Clearing}, /* KeepAlive_timer_expired */
1772 {bgp_stop, Clearing}, /* Receive_OPEN_message */
1773 {bgp_stop, Clearing}, /* Receive_KEEPALIVE_message */
1774 {bgp_stop, Clearing}, /* Receive_UPDATE_message */
1775 {bgp_stop, Clearing}, /* Receive_NOTIFICATION_message */
1776 {bgp_clearing_completed, Idle}, /* Clearing_Completed */
1777 },
1778 {
1779 /* Deleted, */
1780 {bgp_ignore, Deleted}, /* BGP_Start */
1781 {bgp_ignore, Deleted}, /* BGP_Stop */
1782 {bgp_ignore, Deleted}, /* TCP_connection_open */
1783 {bgp_ignore, Deleted}, /* TCP_connection_closed */
1784 {bgp_ignore, Deleted}, /* TCP_connection_open_failed */
1785 {bgp_ignore, Deleted}, /* TCP_fatal_error */
1786 {bgp_ignore, Deleted}, /* ConnectRetry_timer_expired */
1787 {bgp_ignore, Deleted}, /* Hold_Timer_expired */
1788 {bgp_ignore, Deleted}, /* KeepAlive_timer_expired */
1789 {bgp_ignore, Deleted}, /* Receive_OPEN_message */
1790 {bgp_ignore, Deleted}, /* Receive_KEEPALIVE_message */
1791 {bgp_ignore, Deleted}, /* Receive_UPDATE_message */
1792 {bgp_ignore, Deleted}, /* Receive_NOTIFICATION_message */
1793 {bgp_ignore, Deleted}, /* Clearing_Completed */
1794 },
1795 };
1796
1797 /* Execute event process. */
1798 int
1799 bgp_event (struct thread *thread)
1800 {
1801 int event;
1802 struct peer *peer;
1803 int ret;
1804
1805 peer = THREAD_ARG (thread);
1806 event = THREAD_VAL (thread);
1807
1808 ret = bgp_event_update(peer, event);
1809
1810 return (ret);
1811 }
1812
1813 int
1814 bgp_event_update (struct peer *peer, int event)
1815 {
1816 int next;
1817 int ret = 0;
1818 struct peer *other;
1819 int passive_conn = 0;
1820 int dyn_nbr;
1821
1822 other = peer->doppelganger;
1823 passive_conn = (CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER)) ? 1 : 0;
1824 dyn_nbr = peer_dynamic_neighbor(peer);
1825
1826 /* Logging this event. */
1827 next = FSM [peer->status -1][event - 1].next_state;
1828
1829 if (bgp_debug_neighbor_events(peer) && peer->status != next)
1830 zlog_debug ("%s [FSM] %s (%s->%s), fd %d", peer->host,
1831 bgp_event_str[event],
1832 LOOKUP (bgp_status_msg, peer->status),
1833 LOOKUP (bgp_status_msg, next), peer->fd);
1834
1835 peer->last_event = peer->cur_event;
1836 peer->cur_event = event;
1837
1838 /* Call function. */
1839 if (FSM [peer->status -1][event - 1].func)
1840 ret = (*(FSM [peer->status - 1][event - 1].func))(peer);
1841
1842 /* When function do not want proceed next job return -1. */
1843 if (ret >= 0)
1844 {
1845 if (ret == 1 && next == Established)
1846 {
1847 /* The case when doppelganger swap accurred in bgp_establish.
1848 Update the peer pointer accordingly */
1849 peer = other;
1850 }
1851
1852 /* If status is changed. */
1853 if (next != peer->status)
1854 bgp_fsm_change_status (peer, next);
1855
1856 /* Make sure timer is set. */
1857 bgp_timer_set (peer);
1858
1859 }
1860 else if (!dyn_nbr && !passive_conn && peer->bgp)
1861 {
1862 /* If we got a return value of -1, that means there was an error, restart
1863 * the FSM. If the peer structure was deleted
1864 */
1865 zlog_err ("%s [FSM] Failure handling event %s in state %s, "
1866 "prior events %s, %s, fd %d",
1867 peer->host, bgp_event_str[peer->cur_event],
1868 LOOKUP (bgp_status_msg, peer->status),
1869 bgp_event_str[peer->last_event],
1870 bgp_event_str[peer->last_major_event], peer->fd);
1871 bgp_stop (peer);
1872 bgp_fsm_change_status(peer, Idle);
1873 bgp_timer_set(peer);
1874 }
1875 return ret;
1876 }