summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_fsm.c13
-rw-r--r--bgpd/bgp_vty.c35
-rw-r--r--bgpd/bgpd.c23
-rw-r--r--bgpd/bgpd.h2
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. */