diff options
Diffstat (limited to 'bgpd')
| -rw-r--r-- | bgpd/bgp_fsm.c | 13 | ||||
| -rw-r--r-- | bgpd/bgp_vty.c | 35 | ||||
| -rw-r--r-- | bgpd/bgpd.c | 23 | ||||
| -rw-r--r-- | bgpd/bgpd.h | 2 | 
4 files changed, 73 insertions, 0 deletions
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index 64a4c1bd..3d8e9576 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -322,6 +322,14 @@ bgp_stop (struct peer *peer)        established = 1;        peer->dropped++;        bgp_fsm_change_status (peer, Idle); + +      /* bgp log-neighbor-changes of neighbor Down */ +      if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES)) +	zlog_info ("%%ADJCHANGE: neighbor %s Down", peer->host); + +      /* set last reset time */ +      peer->resettime = time (NULL); +  #ifdef HAVE_SNMP        bgpTrapBackwardTransition (peer);  #endif /* HAVE_SNMP */ @@ -629,6 +637,11 @@ bgp_establish (struct peer *peer)    /* Increment established count. */    peer->established++;    bgp_fsm_change_status (peer, Established); + +  /* bgp log-neighbor-changes of neighbor Up */ +  if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES)) +    zlog_info ("%%ADJCHANGE: neighbor %s Up", peer->host); +  #ifdef HAVE_SNMP    bgpTrapEstablished (peer);  #endif /* HAVE_SNMP */ diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index 6514ac22..39a43c04 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -878,6 +878,34 @@ DEFUN (no_bgp_bestpath_aspath_ignore,    return CMD_SUCCESS;  } +/* "bgp log-neighbor-changes" configuration.  */ +DEFUN (bgp_log_neighbor_changes, +       bgp_log_neighbor_changes_cmd, +       "bgp log-neighbor-changes", +       "BGP specific commands\n" +       "Log neighbor up/down and reset reason\n") +{ +  struct bgp *bgp; + +  bgp = vty->index; +  bgp_flag_set (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES); +  return CMD_SUCCESS; +} + +DEFUN (no_bgp_log_neighbor_changes, +       no_bgp_log_neighbor_changes_cmd, +       "no bgp log-neighbor-changes", +       NO_STR +       "BGP specific commands\n" +       "Log neighbor up/down and reset reason\n") +{ +  struct bgp *bgp; + +  bgp = vty->index; +  bgp_flag_unset (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES); +  return CMD_SUCCESS; +} +  /* "bgp bestpath med" configuration. */  DEFUN (bgp_bestpath_med,         bgp_bestpath_med_cmd, @@ -6660,6 +6688,9 @@ bgp_show_peer (struct vty *vty, struct peer *p)  	   p->established, p->dropped,  	   VTY_NEWLINE); +  vty_out (vty, "  Last reset %s%s", p->dropped ? peer_uptime (p->resettime, timebuf, BGP_UPTIME_LEN) : "never", +	   VTY_NEWLINE); +    if (CHECK_FLAG (p->sflags, PEER_STATUS_PREFIX_OVERFLOW))      {        vty_out (vty, "  Peer had exceeded the max. no. of prefixes configured.%s", VTY_NEWLINE); @@ -7743,6 +7774,10 @@ bgp_vty_init ()    install_element (BGP_NODE, &bgp_bestpath_aspath_ignore_cmd);    install_element (BGP_NODE, &no_bgp_bestpath_aspath_ignore_cmd); +  /* "bgp log-neighbor-changes" commands */ +  install_element (BGP_NODE, &bgp_log_neighbor_changes_cmd); +  install_element (BGP_NODE, &no_bgp_log_neighbor_changes_cmd); +    /* "bgp bestpath med" commands */    install_element (BGP_NODE, &bgp_bestpath_med_cmd);    install_element (BGP_NODE, &bgp_bestpath_med2_cmd); diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index f116a0cf..3a12a27c 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -752,6 +752,9 @@ peer_create (union sockunion *su, struct bgp *bgp, as_t local_as,    /* Last read time set */    peer->readtime = time (NULL); +  /* Last reset time set */ +  peer->resettime = time (NULL); +    /* Default TTL set. */    peer->ttl = (peer_sort (peer) == BGP_PEER_IBGP ? 255 : 1); @@ -797,6 +800,13 @@ peer_as_change (struct peer *peer, as_t as)    type = peer_sort (peer);    peer->as = as; +  if (bgp_config_check (peer->bgp, BGP_CONFIG_CONFEDERATION) +      && ! bgp_confederation_peers_check (peer->bgp, as) +      && peer->bgp->as != as) +    peer->local_as = peer->bgp->confed_id; +  else +    peer->local_as = peer->bgp->as; +    /* Advertisement-interval reset */    if (peer_sort (peer) == BGP_PEER_IBGP)      peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV; @@ -1634,6 +1644,15 @@ bgp_create (as_t *as, char *name)    return bgp;  } +/* Return master of BGP. */ +struct bgp_master * +bgp_get_master () +{ +  if (bm) +    return bm; +  return NULL; +} +  /* Return first entry of BGP. */  struct bgp *  bgp_get_default () @@ -4415,6 +4434,10 @@ bgp_config_write (struct vty *vty)  	vty_out (vty, " bgp router-id %s%s", inet_ntoa (bgp->router_id),   		 VTY_NEWLINE); +      /* BGP log-neighbor-changes. */ +      if (bgp_flag_check (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES)) +	vty_out (vty, " bgp log-neighbor-changes%s", VTY_NEWLINE); +        /* BGP configuration. */        if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED))  	vty_out (vty, " bgp always-compare-med%s", VTY_NEWLINE); diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 11c6bdec..498bd072 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -96,6 +96,7 @@ struct bgp  #define BGP_FLAG_ASPATH_IGNORE            (1 << 8)  #define BGP_FLAG_IMPORT_CHECK             (1 << 9)  #define BGP_FLAG_NO_FAST_EXT_FAILOVER     (1 << 10) +#define BGP_FLAG_LOG_NEIGHBOR_CHANGES     (1 << 11)    /* BGP Per AF flags */    u_int16_t af_flags[AFI_MAX][SAFI_MAX]; @@ -263,6 +264,7 @@ struct peer    union sockunion su;		/* Sockunion address of the peer. */    time_t uptime;		/* Last Up/Down time */    time_t readtime;		/* Last read time */ +  time_t resettime;		/* Last reset time */    unsigned int ifindex;		/* ifindex of the BGP connection. */    char *ifname;			/* bind interface name. */  | 
