bgp_fsm.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:32k
源码类别:

网络

开发平台:

Unix_Linux

  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. This file is part of GNU Zebra.
  5. GNU Zebra is free software; you can redistribute it and/or modify it
  6. under the terms of the GNU General Public License as published by the
  7. Free Software Foundation; either version 2, or (at your option) any
  8. later version.
  9. GNU Zebra is distributed in the hope that it will be useful, but
  10. WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with GNU Zebra; see the file COPYING.  If not, write to the Free
  15. Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  16. 02111-1307, USA.  */
  17. #include <zebra.h>
  18. #include "linklist.h"
  19. #include "prefix.h"
  20. #include "vty.h"
  21. #include "sockunion.h"
  22. #include "thread.h"
  23. #include "log.h"
  24. #include "stream.h"
  25. #include "memory.h"
  26. #include "plist.h"
  27. #include "bgpd/bgpd.h"
  28. #include "bgpd/bgp_attr.h"
  29. #include "bgpd/bgp_debug.h"
  30. #include "bgpd/bgp_fsm.h"
  31. #include "bgpd/bgp_packet.h"
  32. #include "bgpd/bgp_network.h"
  33. #include "bgpd/bgp_route.h"
  34. #include "bgpd/bgp_dump.h"
  35. #include "bgpd/bgp_open.h"
  36. #ifdef HAVE_SNMP
  37. #include "bgpd/bgp_snmp.h"
  38. #endif /* HAVE_SNMP */
  39. /* BGP FSM (finite state machine) has three types of functions.  Type
  40.    one is thread functions.  Type two is event functions.  Type three
  41.    is FSM functions.  Timer functions are set by bgp_timer_set
  42.    function. */
  43. /* BGP event function. */
  44. int bgp_event (struct thread *);
  45. /* BGP thread functions. */
  46. static int bgp_start_timer (struct thread *);
  47. static int bgp_connect_timer (struct thread *);
  48. static int bgp_holdtime_timer (struct thread *);
  49. static int bgp_keepalive_timer (struct thread *);
  50. /* BGP FSM functions. */
  51. static int bgp_start (struct peer *);
  52. /* BGP active delay jitter. */
  53. int
  54. bgp_active_delay_jitter (int time)
  55. {
  56.   return ((rand () % (time + 1)) - (time / 2));
  57. }
  58. /* Hook function called after bgp event is occered.  And vty's
  59.    neighbor command invoke this function after making neighbor
  60.    structure. */
  61. void
  62. bgp_timer_set (struct peer *peer)
  63. {
  64.   afi_t afi;
  65.   safi_t safi;
  66.   int active_delay = 0;
  67.   switch (peer->status)
  68.     {
  69.     case Idle:
  70.       /* First entry point of peer's finite state machine.  In Idle
  71.  status start timer is on unless peer is shutdown or peer is
  72.  inactive.  All other timer must be turned off */
  73.       if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN)
  74.   || CHECK_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW)
  75.   || ! peer_active (peer))
  76. {
  77.   BGP_TIMER_OFF (peer->t_start);
  78. }
  79.       else
  80. {
  81.   if (CHECK_FLAG (peer->sflags, PEER_STATUS_CREATE_INIT))
  82.     {
  83.       BGP_TIMER_ON (peer->t_start, bgp_start_timer, BGP_PEER_FIRST_CREATE_TIMER);
  84.     }
  85.   else
  86.     {
  87.       BGP_TIMER_ON (peer->t_start, bgp_start_timer, peer->v_start);
  88.     }
  89. }
  90.       BGP_TIMER_OFF (peer->t_connect);
  91.       BGP_TIMER_OFF (peer->t_holdtime);
  92.       BGP_TIMER_OFF (peer->t_keepalive);
  93.       BGP_TIMER_OFF (peer->t_asorig);
  94.       for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  95. for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  96.   BGP_TIMER_OFF (peer->t_routeadv[afi][safi]);
  97.       break;
  98.     case Connect:
  99.       /* After start timer is expired, the peer moves to Connnect
  100.          status.  Make sure start timer is off and connect timer is
  101.          on. */
  102.       BGP_TIMER_OFF (peer->t_start);
  103.       BGP_TIMER_ON (peer->t_connect, bgp_connect_timer, peer->v_connect);
  104.       BGP_TIMER_OFF (peer->t_holdtime);
  105.       BGP_TIMER_OFF (peer->t_keepalive);
  106.       BGP_TIMER_OFF (peer->t_asorig);
  107.       for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  108. for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  109.   BGP_TIMER_OFF (peer->t_routeadv[afi][safi]);
  110.       break;
  111.     case Active:
  112.       /* Active is waiting connection from remote peer.  And if
  113.          connect timer is expired, change status to Connect. */
  114.       BGP_TIMER_OFF (peer->t_start);
  115.       /* If peer is passive mode, do not set connect timer. */
  116.       if (CHECK_FLAG (peer->flags, PEER_FLAG_CONNECT_MODE_PASSIVE))
  117. {
  118.   if (BGP_DEBUG (normal, NORMAL))
  119.     zlog_info ("%s active open failed - TCP session must be opened passively", peer->host);
  120.   BGP_TIMER_OFF (peer->t_connect);
  121. }
  122.       else
  123. {
  124.   if (peer->ostatus == Idle
  125.       && ! CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
  126.     {
  127.       active_delay = peer->v_active_delay;
  128.       active_delay += bgp_active_delay_jitter (BGP_ACTIVE_DELAY_TIMER);
  129.       if (BGP_DEBUG (normal, NORMAL))
  130. zlog_info ("%s open active, delay %d sec", peer->host, active_delay);
  131.       BGP_TIMER_ON (peer->t_connect, bgp_connect_timer, active_delay);
  132.     }
  133.   else
  134.     {
  135.       BGP_TIMER_ON (peer->t_connect, bgp_connect_timer,
  136.     peer->v_connect);
  137.     }
  138. }
  139.       BGP_TIMER_OFF (peer->t_holdtime);
  140.       BGP_TIMER_OFF (peer->t_keepalive);
  141.       BGP_TIMER_OFF (peer->t_asorig);
  142.       for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  143. for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  144.   BGP_TIMER_OFF (peer->t_routeadv[afi][safi]);
  145.       break;
  146.     case OpenSent:
  147.       /* OpenSent status. */
  148.       BGP_TIMER_OFF (peer->t_start);
  149.       BGP_TIMER_OFF (peer->t_connect);
  150.       if (peer->v_holdtime != 0)
  151. {
  152.   BGP_TIMER_ON (peer->t_holdtime, bgp_holdtime_timer, 
  153. peer->v_holdtime);
  154. }
  155.       else
  156. {
  157.   BGP_TIMER_OFF (peer->t_holdtime);
  158. }
  159.       BGP_TIMER_OFF (peer->t_keepalive);
  160.       BGP_TIMER_OFF (peer->t_asorig);
  161.       for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  162. for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  163.   BGP_TIMER_OFF (peer->t_routeadv[afi][safi]);
  164.       break;
  165.     case OpenConfirm:
  166.       /* OpenConfirm status. */
  167.       BGP_TIMER_OFF (peer->t_start);
  168.       BGP_TIMER_OFF (peer->t_connect);
  169.       /* If the negotiated Hold Time value is zero, then the Hold Time
  170.          timer and KeepAlive timers are not started. */
  171.       if (peer->v_holdtime == 0)
  172. {
  173.   BGP_TIMER_OFF (peer->t_holdtime);
  174.   BGP_TIMER_OFF (peer->t_keepalive);
  175. }
  176.       else
  177. {
  178.   BGP_TIMER_ON (peer->t_holdtime, bgp_holdtime_timer,
  179. peer->v_holdtime);
  180.   BGP_TIMER_ON (peer->t_keepalive, bgp_keepalive_timer, 
  181. peer->v_keepalive);
  182. }
  183.       BGP_TIMER_OFF (peer->t_asorig);
  184.       for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  185. for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  186.   BGP_TIMER_OFF (peer->t_routeadv[afi][safi]);
  187.       break;
  188.     case Established:
  189.       /* In Established status start and connect timer is turned
  190.          off. */
  191.       BGP_TIMER_OFF (peer->t_start);
  192.       BGP_TIMER_OFF (peer->t_connect);
  193.       /* Same as OpenConfirm, if holdtime is zero then both holdtime
  194.          and keepalive must be turned off. */
  195.       if (peer->v_holdtime == 0)
  196. {
  197.   BGP_TIMER_OFF (peer->t_holdtime);
  198.   BGP_TIMER_OFF (peer->t_keepalive);
  199. }
  200.       else
  201. {
  202.   BGP_TIMER_ON (peer->t_holdtime, bgp_holdtime_timer,
  203. peer->v_holdtime);
  204.   BGP_TIMER_ON (peer->t_keepalive, bgp_keepalive_timer,
  205. peer->v_keepalive);
  206. }
  207.       BGP_TIMER_OFF (peer->t_asorig);
  208.       break;
  209.     }
  210. }
  211. /* BGP start timer.  This function set BGP_Start event to thread value
  212.    and process event. */
  213. static int
  214. bgp_start_timer (struct thread *thread)
  215. {
  216.   struct peer *peer;
  217.   peer = THREAD_ARG (thread);
  218.   peer->t_start = NULL;
  219.   UNSET_FLAG (peer->sflags, PEER_STATUS_CREATE_INIT);
  220.   if (BGP_DEBUG (fsm, FSM))
  221.     zlog (peer->log, LOG_DEBUG,
  222.   "%s [FSM] Timer (start timer expire).", peer->host);
  223.   THREAD_VAL (thread) = BGP_Start;
  224.   bgp_event (thread);
  225.   return 0;
  226. }
  227. /* BGP connect retry timer. */
  228. static int
  229. bgp_connect_timer (struct thread *thread)
  230. {
  231.   struct peer *peer;
  232.   peer = THREAD_ARG (thread);
  233.   peer->t_connect = NULL;
  234.   if (BGP_DEBUG (fsm, FSM))
  235.     zlog (peer->log, LOG_DEBUG, "%s [FSM] Timer (connect timer expire)",
  236.   peer->host);
  237.   THREAD_VAL (thread) = ConnectRetry_timer_expired;
  238.   bgp_event (thread);
  239.   return 0;
  240. }
  241. /* BGP holdtime timer. */
  242. static int
  243. bgp_holdtime_timer (struct thread *thread)
  244. {
  245.   struct peer *peer;
  246.   peer = THREAD_ARG (thread);
  247.   peer->t_holdtime = NULL;
  248.   if (BGP_DEBUG (fsm, FSM))
  249.     zlog (peer->log, LOG_DEBUG,
  250.   "%s [FSM] Timer (holdtime timer expire)",
  251.   peer->host);
  252.   THREAD_VAL (thread) = Hold_Timer_expired;
  253.   bgp_event (thread);
  254.   return 0;
  255. }
  256. /* BGP keepalive fire ! */
  257. static int
  258. bgp_keepalive_timer (struct thread *thread)
  259. {
  260.   struct peer *peer;
  261.   peer = THREAD_ARG (thread);
  262.   peer->t_keepalive = NULL;
  263.   if (BGP_DEBUG (fsm, FSM))
  264.     zlog (peer->log, LOG_DEBUG,
  265.   "%s [FSM] Timer (keepalive timer expire)",
  266.   peer->host);
  267.   THREAD_VAL (thread) = KeepAlive_timer_expired;
  268.   bgp_event (thread);
  269.   return 0;
  270. }
  271. int
  272. bgp_routeadv_timer_ipv4_unicast (struct thread *thread)
  273. {
  274.   struct peer *peer;
  275.   peer = THREAD_ARG (thread);
  276.   peer->t_routeadv[AFI_IP][SAFI_UNICAST] = NULL;
  277.   if (BGP_DEBUG (events, EVENTS))
  278.     zlog_info ("%s routeadv timer expired for IPv4 Unicast", peer->host);
  279.   peer->synctime[AFI_IP][SAFI_UNICAST] = time (NULL);
  280.   BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
  281.   BGP_TIMER_ON (peer->t_routeadv[AFI_IP][SAFI_UNICAST], bgp_routeadv_timer_ipv4_unicast,
  282. peer->v_routeadv);
  283.   return 0;
  284. }
  285. int
  286. bgp_routeadv_timer_ipv4_multicast (struct thread *thread)
  287. {
  288.   struct peer *peer;
  289.   peer = THREAD_ARG (thread);
  290.   peer->t_routeadv[AFI_IP][SAFI_MULTICAST] = NULL;
  291.   if (BGP_DEBUG (events, EVENTS))
  292.     zlog_info ("%s routeadv timer expired for IPv4 Multicast", peer->host);
  293.   peer->synctime[AFI_IP][SAFI_MULTICAST] = time (NULL);
  294.   BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
  295.   BGP_TIMER_ON (peer->t_routeadv[AFI_IP][SAFI_MULTICAST], bgp_routeadv_timer_ipv4_multicast,
  296. peer->v_routeadv);
  297.   return 0;
  298. }
  299. int
  300. bgp_routeadv_timer_ipv6_unicast (struct thread *thread)
  301. {
  302.   struct peer *peer;
  303.   peer = THREAD_ARG (thread);
  304.   peer->t_routeadv[AFI_IP6][SAFI_UNICAST] = NULL;
  305.   if (BGP_DEBUG (events, EVENTS))
  306.     zlog_info ("%s routeadv timer expired for IPv6 Unicast", peer->host);
  307.   peer->synctime[AFI_IP6][SAFI_UNICAST] = time (NULL);
  308.   BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
  309.   BGP_TIMER_ON (peer->t_routeadv[AFI_IP6][SAFI_UNICAST], bgp_routeadv_timer_ipv6_unicast,
  310. peer->v_routeadv);
  311.   return 0;
  312. }
  313. int
  314. bgp_routeadv_timer_vpnv4_unicast (struct thread *thread)
  315. {
  316.   struct peer *peer;
  317.   peer = THREAD_ARG (thread);
  318.   peer->t_routeadv[AFI_IP][SAFI_MPLS_VPN] = NULL;
  319.   if (BGP_DEBUG (events, EVENTS))
  320.     zlog_info ("%s routeadv timer expired for VPNv4 unicast", peer->host);
  321.   peer->synctime[AFI_IP][SAFI_MPLS_VPN] = time (NULL);
  322.   BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
  323.   BGP_TIMER_ON (peer->t_routeadv[AFI_IP][SAFI_MPLS_VPN], bgp_routeadv_timer_vpnv4_unicast,
  324. peer->v_routeadv);
  325.   return 0;
  326. }
  327. void
  328. bgp_routeadv_timer (struct peer *peer, afi_t afi, safi_t safi)
  329. {
  330.   if (afi == AFI_IP && safi == SAFI_UNICAST)
  331.     BGP_TIMER_ON (peer->t_routeadv[afi][safi], bgp_routeadv_timer_ipv4_unicast, 1);
  332.   else if (afi == AFI_IP && safi == SAFI_MULTICAST)
  333.     BGP_TIMER_ON (peer->t_routeadv[afi][safi], bgp_routeadv_timer_ipv4_multicast, 1);
  334.   else if (afi == AFI_IP6 && safi == SAFI_UNICAST)
  335.     BGP_TIMER_ON (peer->t_routeadv[afi][safi], bgp_routeadv_timer_ipv6_unicast, 1);
  336.   else if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
  337.     BGP_TIMER_ON (peer->t_routeadv[afi][safi], bgp_routeadv_timer_vpnv4_unicast, 1);
  338. }
  339. /* Reset bgp update timer */
  340. static void
  341. bgp_uptime_reset (struct peer *peer)
  342. {
  343.   peer->uptime = time (NULL);
  344. }
  345. /* BGP Peer Down Cause */
  346. char *peer_down_str[] =
  347. {
  348.   "",
  349.   "Router ID changed",
  350.   "Remote AS changed",
  351.   "Local AS change",
  352.   "Cluster ID changed",
  353.   "Confederation identifier changed",
  354.   "Confederation peer changed",
  355.   "RR client config change",
  356.   "RS client config change",
  357.   "Update source change",
  358.   "Address family activated",
  359.   "Admin. shutdown",
  360.   "User reset",
  361.   "BGP Notification received",
  362.   "BGP Notification send",
  363.   "Peer closed the session",
  364.   "Neighbor deleted",
  365.   "Peer-group add member",
  366.   "Peer-group delete member",
  367.   "Capability changed",
  368.   "Multihop config change",
  369.   "Password change",
  370.   "NSF peer closed the session"
  371. };
  372. int
  373. bgp_graceful_restart_timer_expire (struct thread *thread)
  374. {
  375.   struct peer *peer;
  376.   afi_t afi;
  377.   safi_t safi;
  378.   peer = THREAD_ARG (thread);
  379.   peer->t_gr_restart = NULL;
  380.   /* NSF delete stale route */
  381.   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  382.     for (safi = SAFI_UNICAST ; safi < SAFI_UNICAST_MULTICAST ; safi++)
  383.       if (peer->nsf[afi][safi])
  384. bgp_clear_stale_route (peer, afi, safi);
  385.   UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
  386.   BGP_TIMER_OFF (peer->t_gr_stale);
  387.   if (BGP_DEBUG (events, EVENTS))
  388.     {
  389.       zlog_info ("%s graceful restart timer expired", peer->host);
  390.       zlog_info ("%s graceful restart stalepath timer stopped", peer->host);
  391.     }
  392.   return 0;
  393. }
  394. int
  395. bgp_graceful_stale_timer_expire (struct thread *thread)
  396. {
  397.   struct peer *peer;
  398.   afi_t afi;
  399.   safi_t safi;
  400.   peer = THREAD_ARG (thread);
  401.   peer->t_gr_stale = NULL;
  402.   if (BGP_DEBUG (events, EVENTS))
  403.     zlog_info ("%s graceful restart stalepath timer expired", peer->host);
  404.   /* NSF delete stale route */
  405.   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  406.     for (safi = SAFI_UNICAST ; safi < SAFI_UNICAST_MULTICAST ; safi++)
  407.       if (peer->nsf[afi][safi])
  408. bgp_clear_stale_route (peer, afi, safi);
  409.   return 0;
  410. }
  411. /* Administrative BGP peer stop event. */
  412. int
  413. bgp_stop (struct peer *peer)
  414. {
  415.   afi_t afi;
  416.   safi_t safi;
  417.   char orf_name[BUFSIZ];
  418.   if (CHECK_FLAG (peer->sflags, PEER_STATUS_CREATE_INIT))
  419.     return 0;
  420.   /* Increment Dropped count. */
  421.   if (peer->status == Established)
  422.     {
  423.       bgp_fsm_change_status (peer, Idle);
  424.       peer->dropped++;
  425.       /* bgp log-neighbor-changes of neighbor Down */
  426.       if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
  427. zlog_info ("%%ADJCHANGE: neighbor %s Down %s", peer->host,
  428.    peer_down_str [(int) peer->last_reset]);
  429.       /* graceful restart */
  430.       if (peer->t_gr_stale)
  431. {
  432.   BGP_TIMER_OFF (peer->t_gr_stale);
  433.   if (BGP_DEBUG (events, EVENTS))
  434.     zlog_info ("%s graceful restart stalepath timer stopped", peer->host);
  435. }
  436.       if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
  437. {
  438.   if (BGP_DEBUG (events, EVENTS))
  439.     {
  440.       zlog_info ("%s graceful restart timer started for %d sec",
  441.  peer->host, peer->v_gr_restart);
  442.       zlog_info ("%s graceful restart stalepath timer started for %d sec",
  443.  peer->host, peer->bgp->stalepath_time);
  444.     }
  445.   BGP_TIMER_ON (peer->t_gr_restart, bgp_graceful_restart_timer_expire,
  446. peer->v_gr_restart);
  447.   BGP_TIMER_ON (peer->t_gr_stale, bgp_graceful_stale_timer_expire,
  448. peer->bgp->stalepath_time);
  449. }
  450.       else
  451. {
  452.   UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
  453.   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  454.     for (safi = SAFI_UNICAST ; safi < SAFI_UNICAST_MULTICAST ; safi++)
  455.       peer->nsf[afi][safi] = 0;
  456. }
  457.       /* set last reset time */
  458.       peer->resettime = time (NULL);
  459. #ifdef HAVE_SNMP
  460.       bgpTrapBackwardTransition (peer);
  461. #endif /* HAVE_SNMP */
  462.       /* Reset uptime. */
  463.       bgp_uptime_reset (peer);
  464.       /* Need of clear of peer. */
  465.       bgp_clear_route_all (peer);
  466.       /* Reset peer synctime */
  467.       for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  468. for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  469.   peer->synctime[afi][safi] = 0;
  470.     }
  471.   /* Stop read and write threads when exists. */
  472.   BGP_READ_OFF (peer->t_read);
  473.   BGP_WRITE_OFF (peer->t_write);
  474.   /* Stop all timers. */
  475.   BGP_TIMER_OFF (peer->t_start);
  476.   BGP_TIMER_OFF (peer->t_connect);
  477.   BGP_TIMER_OFF (peer->t_holdtime);
  478.   BGP_TIMER_OFF (peer->t_keepalive);
  479.   BGP_TIMER_OFF (peer->t_asorig);
  480.   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  481.     for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  482.       BGP_TIMER_OFF (peer->t_routeadv[afi][safi]);
  483.   /* Delete all existing events of the peer. */
  484.   BGP_EVENT_DELETE (peer);
  485.   /* Stream reset. */
  486.   peer->packet_size = 0;
  487.   /* Clear input and output buffer.  */
  488.   if (peer->ibuf)
  489.     stream_reset (peer->ibuf);
  490.   if (peer->work)
  491.     stream_reset (peer->work);
  492.   stream_fifo_clean (peer->obuf);
  493.   /* Close of file descriptor. */
  494.   if (peer->fd >= 0)
  495.     {
  496.       close (peer->fd);
  497.       peer->fd = -1;
  498.     }
  499.   /* Connection information. */
  500.   if (peer->su_local)
  501.     {
  502.       XFREE (MTYPE_SOCKUNION, peer->su_local);
  503.       peer->su_local = NULL;
  504.     }
  505.   if (peer->su_remote)
  506.     {
  507.       XFREE (MTYPE_SOCKUNION, peer->su_remote);
  508.       peer->su_remote = NULL;
  509.     }
  510.   /* Clear remote router-id. */
  511.   peer->remote_id.s_addr = 0;
  512.   /* Clear peer capability flag. */
  513.   peer->cap = 0;
  514.   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  515.     for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  516.       {
  517. /* Reset all negotiated variables */
  518. peer->afc_nego[afi][safi] = 0;
  519. peer->afc_adv[afi][safi] = 0;
  520. peer->afc_recv[afi][safi] = 0;
  521. /* peer address family capability flags*/
  522. peer->af_cap[afi][safi] = 0;
  523. /* peer address family status flags*/
  524. peer->af_sflags[afi][safi] = 0;
  525. /* Received ORF prefix-filter */
  526. peer->orf_plist[afi][safi] = NULL;
  527.         /* ORF received prefix-filter pnt */
  528.         sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi);
  529.         prefix_bgp_orf_remove_all (orf_name);
  530.       }
  531.   /* Reset keepalive and holdtime */
  532.   if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
  533.     {
  534.       peer->v_keepalive = peer->keepalive;
  535.       peer->v_holdtime = peer->holdtime;
  536.     }
  537.   else
  538.     {
  539.       peer->v_keepalive = peer->bgp->default_keepalive;
  540.       peer->v_holdtime = peer->bgp->default_holdtime;
  541.     }
  542.   peer->update_time = 0;
  543.   /* Until we are sure that there is no problem about prefix count
  544.      this should be commented out.*/
  545. #if 0
  546.   /* Reset prefix count */
  547.   peer->pcount[AFI_IP][SAFI_UNICAST] = 0;
  548.   peer->pcount[AFI_IP][SAFI_MULTICAST] = 0;
  549.   peer->pcount[AFI_IP][SAFI_MPLS_VPN] = 0;
  550.   peer->pcount[AFI_IP6][SAFI_UNICAST] = 0;
  551.   peer->pcount[AFI_IP6][SAFI_MULTICAST] = 0;
  552. #endif /* 0 */
  553.   return 0;
  554. }
  555. /* BGP peer is stoped by the error. */
  556. int
  557. bgp_stop_with_error (struct peer *peer)
  558. {
  559.   /* Double start timer. */
  560.   peer->v_active_delay *= 2;
  561.   /* Overflow check. */
  562.   if (peer->v_active_delay > BGP_DEFAULT_CONNECT_RETRY)
  563.     peer->v_active_delay = BGP_DEFAULT_CONNECT_RETRY;
  564.   bgp_stop (peer);
  565.   return 0;
  566. }
  567. /* TCP connection open.  Next we send open message to remote peer. And
  568.    add read thread for reading open message. */
  569. int
  570. bgp_connect_success (struct peer *peer)
  571. {
  572.   char buf1[BUFSIZ];
  573.   if (peer->fd < 0)
  574.     {
  575.       zlog_err ("bgp_connect_success peer's fd is negative value %d",
  576. peer->fd);
  577.       return -1;
  578.     }
  579.   BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
  580.   if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
  581.     bgp_getsockname (peer);
  582.   if (BGP_DEBUG (normal, NORMAL))
  583.     {
  584.       if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
  585. zlog_info ("%s open active, local address %s", peer->host,
  586.    sockunion2str (peer->su_local, buf1, SU_ADDRSTRLEN));
  587.       else
  588. zlog_info ("%s passive open", peer->host);
  589.     }
  590.   if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
  591.     bgp_open_send (peer);
  592.   return 0;
  593. }
  594. /* TCP connect fail */
  595. int
  596. bgp_connect_fail (struct peer *peer)
  597. {
  598.   bgp_stop (peer);
  599.   return 0;
  600. }
  601. /* This function is the first starting point of all BGP connection. It
  602.    try to connect to remote peer with non-blocking IO. */
  603. int
  604. bgp_start (struct peer *peer)
  605. {
  606.   int status;
  607.   status = bgp_connect (peer);
  608.   switch (status)
  609.     {
  610.     case connect_error:
  611.       if (BGP_DEBUG (fsm, FSM))
  612. plog_info (peer->log, "%s [FSM] Connect error", peer->host);
  613.       BGP_EVENT_ADD (peer, TCP_connection_open_failed);
  614.       break;
  615.     case connect_success:
  616.       if (BGP_DEBUG (fsm, FSM))
  617. plog_info (peer->log, "%s [FSM] Connect immediately success",
  618.    peer->host);
  619.       BGP_EVENT_ADD (peer, TCP_connection_open);
  620.       break;
  621.     case connect_in_progress:
  622.       /* To check nonblocking connect, we wait until socket is
  623.          readable or writable. */
  624.       if (BGP_DEBUG (fsm, FSM))
  625. plog_info (peer->log, "%s [FSM] Non blocking connect waiting result",
  626.    peer->host);
  627.       if (peer->fd < 0)
  628. {
  629.   zlog_err ("bgp_start peer's fd is negative value %d",
  630.     peer->fd);
  631.   return -1;
  632. }
  633.       BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
  634.       BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
  635.       break;
  636.     }
  637.   return 0;
  638. }
  639. /* Connect retry timer is expired when the peer status is Connect. */
  640. int
  641. bgp_reconnect (struct peer *peer)
  642. {
  643.   bgp_stop (peer);
  644.   bgp_start (peer);
  645.   return 0;
  646. }
  647. int
  648. bgp_fsm_open (struct peer *peer)
  649. {
  650.   /* Send keepalive and make keepalive timer */
  651.   bgp_keepalive_send (peer);
  652.   /* Reset holdtimer value. */
  653.   BGP_TIMER_OFF (peer->t_holdtime);
  654.   return 0;
  655. }
  656. /* Called after event occured, this function change status and reset
  657.    read/write and timer thread. */
  658. void
  659. bgp_fsm_change_status (struct peer *peer, int status)
  660. {
  661.   bgp_dump_state (peer, peer->status, status);
  662.   /* Preserve old status and change into new status. */
  663.   peer->ostatus = peer->status;
  664.   peer->status = status;
  665.   if (BGP_DEBUG (normal, NORMAL))
  666.     if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
  667.       zlog_info ("%s went from %s to %s", peer->host,
  668.  LOOKUP (bgp_status_msg, peer->ostatus),
  669.  LOOKUP (bgp_status_msg, peer->status));
  670. }
  671. /* Keepalive send to peer. */
  672. int
  673. bgp_fsm_keepalive_expire (struct peer *peer)
  674. {
  675.   bgp_keepalive_send (peer);
  676.   return 0;
  677. }
  678. /* Hold timer expire.  This is error of BGP connection. So cut the
  679.    peer and change to Idle status. */
  680. int
  681. bgp_fsm_holdtime_expire (struct peer *peer)
  682. {
  683.   if (BGP_DEBUG (fsm, FSM))
  684.     zlog (peer->log, LOG_DEBUG, "%s [FSM] Hold timer expire", peer->host);
  685.   /* Send notify to remote peer. */
  686.   bgp_notify_send (peer, BGP_NOTIFY_HOLD_ERR, 0);
  687.   /* Sweep if it is temporary peer. */
  688.   if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
  689.     {
  690.       zlog_info ("%s [Event] Accepting BGP peer is deleted", peer->host);
  691.       peer_delete (peer);
  692.       return -1;
  693.     }
  694.   return 0;
  695. }
  696. /* Status goes to Established.  Send keepalive packet then make first
  697.    update information. */
  698. int
  699. bgp_establish (struct peer *peer)
  700. {
  701.   struct bgp_notify *notify;
  702.   afi_t afi;
  703.   safi_t safi;
  704.   int nsf_af_count = 0;
  705.   /* Reset capability open status flag. */
  706.   if (! CHECK_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN))
  707.     SET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
  708.   /* Clear last notification data. */
  709.   notify = &peer->notify;
  710.   if (notify->data)
  711.     XFREE (MTYPE_TMP, notify->data);
  712.   memset (notify, 0, sizeof (struct bgp_notify));
  713.   /* Clear active delay timer value to default. */
  714.   peer->v_active_delay = BGP_ACTIVE_DELAY_TIMER;
  715.   /* Increment established count. */
  716.   peer->established++;
  717.   bgp_fsm_change_status (peer, Established);
  718.   /* bgp log-neighbor-changes of neighbor Up */
  719.   if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
  720.     zlog_info ("%%ADJCHANGE: neighbor %s Up", peer->host);
  721.   /* graceful restart */
  722.   UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
  723.   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  724.     for (safi = SAFI_UNICAST ; safi < SAFI_UNICAST_MULTICAST ; safi++)
  725.       {
  726. if (peer->afc_nego[afi][safi]
  727.     && CHECK_FLAG (peer->cap, PEER_CAP_RESTART_ADV)
  728.     && CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV))
  729.   {
  730.     if (peer->nsf[afi][safi]
  731. && ! CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV))
  732.       bgp_clear_stale_route (peer, afi, safi);
  733.     peer->nsf[afi][safi] = 1;
  734.     nsf_af_count++;
  735.   }
  736. else
  737.   {
  738.     if (peer->nsf[afi][safi])
  739.       bgp_clear_stale_route (peer, afi, safi);
  740.     peer->nsf[afi][safi] = 0;
  741.   }
  742.       }
  743.   if (nsf_af_count)
  744.     SET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
  745.   else
  746.     {
  747.       UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
  748.       if (peer->t_gr_stale)
  749. {
  750.   BGP_TIMER_OFF (peer->t_gr_stale);
  751.   if (BGP_DEBUG (events, EVENTS))
  752.     zlog_info ("%s graceful restart stalepath timer stopped", peer->host);
  753. }
  754.     }
  755.   if (peer->t_gr_restart)
  756.     {
  757.       BGP_TIMER_OFF (peer->t_gr_restart);
  758.       if (BGP_DEBUG (events, EVENTS))
  759. zlog_info ("%s graceful restart timer stopped", peer->host);
  760.     }
  761. #ifdef HAVE_SNMP
  762.   bgpTrapEstablished (peer);
  763. #endif /* HAVE_SNMP */
  764.   /* Reset uptime, send keepalive, send current table. */
  765.   bgp_uptime_reset (peer);
  766.   /* Send route-refresh when ORF is enabled */
  767.   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  768.     for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  769.       if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV))
  770. {
  771.   if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
  772.     bgp_route_refresh_send (peer, afi, safi, ORF_TYPE_PREFIX,
  773.     REFRESH_IMMEDIATE, 0);
  774.   else if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
  775.     bgp_route_refresh_send (peer, afi, safi, ORF_TYPE_PREFIX_OLD,
  776.     REFRESH_IMMEDIATE, 0);
  777. }
  778.   if (peer->v_keepalive)
  779.     bgp_keepalive_send (peer);
  780.   /* First update is deferred until ORF or ROUTE-REFRESH is received */
  781.   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  782.     for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  783.       if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV))
  784. if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
  785.     || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV))
  786.   SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH);
  787.   bgp_announce_route_all (peer);
  788.   return 0;
  789. }
  790. /* Keepalive packet is received. */
  791. int
  792. bgp_fsm_keepalive (struct peer *peer)
  793. {
  794.   /* peer count update */
  795.   peer->keepalive_in++;
  796.   BGP_TIMER_OFF (peer->t_holdtime);
  797.   return 0;
  798. }
  799. /* Update packet is received. */
  800. int
  801. bgp_fsm_update (struct peer *peer)
  802. {
  803.   BGP_TIMER_OFF (peer->t_holdtime);
  804.   return 0;
  805. }
  806. /* This is empty event. */
  807. int
  808. bgp_ignore (struct peer *peer)
  809. {
  810.   if (BGP_DEBUG (fsm, FSM))
  811.     zlog (peer->log, LOG_DEBUG, "%s [FSM] bgp_ignore called", peer->host);
  812.   return 0;
  813. }
  814. /* Finite State Machine structure */
  815. struct {
  816.   int (*func) ();
  817.   int next_state;
  818. } FSM [BGP_STATUS_MAX - 1][BGP_EVENTS_MAX - 1] = 
  819. {
  820.   {
  821.     /* Idle state: In Idle state, all events other than BGP_Start is
  822.        ignored.  With BGP_Start event, finite state machine calls
  823.        bgp_start(). */
  824.     {bgp_ignore,  Active}, /* BGP_Start                    */
  825.     {bgp_stop,   Idle}, /* BGP_Stop                     */
  826.     {bgp_stop,   Idle}, /* TCP_connection_open          */
  827.     {bgp_stop,   Idle}, /* TCP_connection_closed        */
  828.     {bgp_ignore, Idle}, /* TCP_connection_open_failed   */
  829.     {bgp_stop,   Idle}, /* TCP_fatal_error              */
  830.     {bgp_ignore, Idle}, /* ConnectRetry_timer_expired   */
  831.     {bgp_ignore, Idle}, /* Hold_Timer_expired           */
  832.     {bgp_ignore, Idle}, /* KeepAlive_timer_expired      */
  833.     {bgp_ignore, Idle}, /* Receive_OPEN_message         */
  834.     {bgp_ignore, Idle}, /* Receive_KEEPALIVE_message    */
  835.     {bgp_ignore, Idle}, /* Receive_UPDATE_message       */
  836.     {bgp_ignore, Idle}, /* Receive_NOTIFICATION_message */
  837.   },
  838.   {
  839.     /* Connect */
  840.     {bgp_ignore,  Connect}, /* BGP_Start                    */
  841.     {bgp_stop,    Idle}, /* BGP_Stop                     */
  842.     {bgp_connect_success, OpenSent}, /* TCP_connection_open          */
  843.     {bgp_stop, Idle}, /* TCP_connection_closed        */
  844.     {bgp_connect_fail, Active}, /* TCP_connection_open_failed   */
  845.     {bgp_connect_fail, Idle}, /* TCP_fatal_error              */
  846.     {bgp_reconnect, Connect}, /* ConnectRetry_timer_expired   */
  847.     {bgp_ignore,  Idle}, /* Hold_Timer_expired           */
  848.     {bgp_ignore,  Idle}, /* KeepAlive_timer_expired      */
  849.     {bgp_ignore,  Idle}, /* Receive_OPEN_message         */
  850.     {bgp_ignore,  Idle}, /* Receive_KEEPALIVE_message    */
  851.     {bgp_ignore,  Idle}, /* Receive_UPDATE_message       */
  852.     {bgp_stop,    Idle}, /* Receive_NOTIFICATION_message */
  853.   },
  854.   {
  855.     /* Active, */
  856.     {bgp_ignore,  Active}, /* BGP_Start                    */
  857.     {bgp_stop,    Idle}, /* BGP_Stop                     */
  858.     {bgp_connect_success, OpenSent}, /* TCP_connection_open          */
  859.     {bgp_stop,    Idle}, /* TCP_connection_closed        */
  860.     {bgp_ignore,  Active}, /* TCP_connection_open_failed   */
  861.     {bgp_ignore,  Idle}, /* TCP_fatal_error              */
  862.     {bgp_start,   Connect}, /* ConnectRetry_timer_expired   */
  863.     {bgp_ignore,  Idle}, /* Hold_Timer_expired           */
  864.     {bgp_ignore,  Idle}, /* KeepAlive_timer_expired      */
  865.     {bgp_ignore,  Idle}, /* Receive_OPEN_message         */
  866.     {bgp_ignore,  Idle}, /* Receive_KEEPALIVE_message    */
  867.     {bgp_ignore,  Idle}, /* Receive_UPDATE_message       */
  868.     {bgp_stop_with_error, Idle}, /* Receive_NOTIFICATION_message */
  869.   },
  870.   {
  871.     /* OpenSent, */
  872.     {bgp_ignore,  OpenSent}, /* BGP_Start                    */
  873.     {bgp_stop,    Idle}, /* BGP_Stop                     */
  874.     {bgp_stop,    Idle}, /* TCP_connection_open          */
  875.     {bgp_stop,    Active}, /* TCP_connection_closed        */
  876.     {bgp_ignore,  Idle}, /* TCP_connection_open_failed   */
  877.     {bgp_stop,    Idle}, /* TCP_fatal_error              */
  878.     {bgp_ignore,  Idle}, /* ConnectRetry_timer_expired   */
  879.     {bgp_fsm_holdtime_expire, Idle}, /* Hold_Timer_expired           */
  880.     {bgp_ignore,  Idle}, /* KeepAlive_timer_expired      */
  881.     {bgp_fsm_open,    OpenConfirm}, /* Receive_OPEN_message         */
  882.     {bgp_ignore,  Idle}, /* Receive_KEEPALIVE_message    */
  883.     {bgp_ignore,  Idle}, /* Receive_UPDATE_message       */
  884.     {bgp_stop_with_error, Idle}, /* Receive_NOTIFICATION_message */
  885.   },
  886.   {
  887.     /* OpenConfirm, */
  888.     {bgp_ignore,  OpenConfirm}, /* BGP_Start                    */
  889.     {bgp_stop,    Idle}, /* BGP_Stop                     */
  890.     {bgp_stop,    Idle}, /* TCP_connection_open          */
  891.     {bgp_stop,    Idle}, /* TCP_connection_closed        */
  892.     {bgp_stop,    Idle}, /* TCP_connection_open_failed   */
  893.     {bgp_stop,    Idle}, /* TCP_fatal_error              */
  894.     {bgp_ignore,  Idle}, /* ConnectRetry_timer_expired   */
  895.     {bgp_fsm_holdtime_expire, Idle}, /* Hold_Timer_expired           */
  896.     {bgp_ignore,  OpenConfirm}, /* KeepAlive_timer_expired      */
  897.     {bgp_ignore,  Idle}, /* Receive_OPEN_message         */
  898.     {bgp_establish, Established}, /* Receive_KEEPALIVE_message    */
  899.     {bgp_ignore,  Idle}, /* Receive_UPDATE_message       */
  900.     {bgp_stop_with_error, Idle}, /* Receive_NOTIFICATION_message */
  901.   },
  902.   {
  903.     /* Established, */
  904.     {bgp_ignore,  Established}, /* BGP_Start                    */
  905.     {bgp_stop,    Idle}, /* BGP_Stop                     */
  906.     {bgp_stop,    Idle}, /* TCP_connection_open          */
  907.     {bgp_stop,    Idle}, /* TCP_connection_closed        */
  908.     {bgp_ignore,  Idle}, /* TCP_connection_open_failed   */
  909.     {bgp_stop,    Idle}, /* TCP_fatal_error              */
  910.     {bgp_ignore,  Idle}, /* ConnectRetry_timer_expired   */
  911.     {bgp_fsm_holdtime_expire, Idle}, /* Hold_Timer_expired           */
  912.     {bgp_fsm_keepalive_expire, Established}, /* KeepAlive_timer_expired      */
  913.     {bgp_stop, Idle}, /* Receive_OPEN_message         */
  914.     {bgp_fsm_keepalive, Established}, /* Receive_KEEPALIVE_message    */
  915.     {bgp_fsm_update,   Established}, /* Receive_UPDATE_message       */
  916.     {bgp_stop_with_error, Idle}, /* Receive_NOTIFICATION_message */
  917.   },
  918. };
  919. static char *bgp_event_str[] =
  920. {
  921.   NULL,
  922.   "BGP_Start",
  923.   "BGP_Stop",
  924.   "TCP_connection_open",
  925.   "TCP_connection_closed",
  926.   "TCP_connection_open_failed",
  927.   "TCP_fatal_error",
  928.   "ConnectRetry_timer_expired",
  929.   "Hold_Timer_expired",
  930.   "KeepAlive_timer_expired",
  931.   "Receive_OPEN_message",
  932.   "Receive_KEEPALIVE_message",
  933.   "Receive_UPDATE_message",
  934.   "Receive_NOTIFICATION_message"
  935. };
  936. /* Execute event process. */
  937. int
  938. bgp_event (struct thread *thread)
  939. {
  940.   int ret;
  941.   int event;
  942.   int next;
  943.   struct peer *peer;
  944.   peer = THREAD_ARG (thread);
  945.   event = THREAD_VAL (thread);
  946.   /* Logging this event. */
  947.   next = FSM [peer->status -1][event - 1].next_state;
  948.   if (BGP_DEBUG (fsm, FSM))
  949.     plog_info (peer->log, "%s [FSM] %s (%s->%s)", peer->host, 
  950.        bgp_event_str[event],
  951.        LOOKUP (bgp_status_msg, peer->status),
  952.        LOOKUP (bgp_status_msg, next));
  953.   /* Call function. */
  954.   ret = (*(FSM [peer->status - 1][event - 1].func))(peer);
  955.   /* When function do not want proceed next job return -1. */
  956.   if (ret < 0)
  957.     return ret;
  958.     
  959.   /* If status is changed. */
  960.   if (next != peer->status)
  961.     bgp_fsm_change_status (peer, next);
  962.   /* Make sure timer is set. */
  963.   bgp_timer_set (peer);
  964.   return 0;
  965. }