summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarton Kun-Szabo <martonk@amazon.com>2019-08-09 10:53:01 -0700
committerMarton Kun-Szabo <martonk@amazon.com>2019-08-13 11:59:27 -0700
commit7d8d0eabb4772ac773d60180fb88272a7825ca4a (patch)
treee94c3b1256a223b63aaac18f90464e05285ad5fe
parentce935bc2843cb35c5450e1ea9beb1c58474d6e2c (diff)
bgpd: hook for bgp peer status change events
Generally available hook for plugging application-specific code in for bgp peer change events. This hook (peer_status_changed) replaces the previous, more specific 'peer_established' hook with a more general-purpose one. Also, 'bgp_dump_state' is now registered under this hook. Signed-off-by: Marton Kun-Szabo <martonk@amazon.com>
-rw-r--r--bgpd/bgp_dump.c11
-rw-r--r--bgpd/bgp_dump.h2
-rw-r--r--bgpd/bgp_fsm.c9
-rw-r--r--bgpd/bgp_fsm.h1
-rw-r--r--bgpd/bgp_snmp.c6
-rw-r--r--bgpd/bgpd.h3
6 files changed, 20 insertions, 12 deletions
diff --git a/bgpd/bgp_dump.c b/bgpd/bgp_dump.c
index 535f36ab5e..640224e759 100644
--- a/bgpd/bgp_dump.c
+++ b/bgpd/bgp_dump.c
@@ -494,13 +494,13 @@ static void bgp_dump_common(struct stream *obuf, struct peer *peer,
}
/* Dump BGP status change. */
-void bgp_dump_state(struct peer *peer, int status_old, int status_new)
+int bgp_dump_state(struct peer *peer)
{
struct stream *obuf;
/* If dump file pointer is disabled return immediately. */
if (bgp_dump_all.fp == NULL)
- return;
+ return 0;
/* Make dump stream. */
obuf = bgp_dump_obuf;
@@ -510,8 +510,8 @@ void bgp_dump_state(struct peer *peer, int status_old, int status_new)
bgp_dump_all.type);
bgp_dump_common(obuf, peer, 1); /* force this in as4speak*/
- stream_putw(obuf, status_old);
- stream_putw(obuf, status_new);
+ stream_putw(obuf, peer->ostatus);
+ stream_putw(obuf, peer->status);
/* Set length. */
bgp_dump_set_size(obuf, MSG_PROTOCOL_BGP4MP);
@@ -519,6 +519,7 @@ void bgp_dump_state(struct peer *peer, int status_old, int status_new)
/* Write to the stream. */
fwrite(STREAM_DATA(obuf), stream_get_endp(obuf), 1, bgp_dump_all.fp);
fflush(bgp_dump_all.fp);
+ return 0;
}
static void bgp_dump_packet_func(struct bgp_dump *bgp_dump, struct peer *peer,
@@ -867,6 +868,7 @@ void bgp_dump_init(void)
install_element(CONFIG_NODE, &no_dump_bgp_all_cmd);
hook_register(bgp_packet_dump, bgp_dump_packet);
+ hook_register(peer_status_changed, bgp_dump_state);
}
void bgp_dump_finish(void)
@@ -878,4 +880,5 @@ void bgp_dump_finish(void)
stream_free(bgp_dump_obuf);
bgp_dump_obuf = NULL;
hook_unregister(bgp_packet_dump, bgp_dump_packet);
+ hook_unregister(peer_status_changed, bgp_dump_state);
}
diff --git a/bgpd/bgp_dump.h b/bgpd/bgp_dump.h
index 5ec0561b05..86c80d481c 100644
--- a/bgpd/bgp_dump.h
+++ b/bgpd/bgp_dump.h
@@ -51,6 +51,6 @@
extern void bgp_dump_init(void);
extern void bgp_dump_finish(void);
-extern void bgp_dump_state(struct peer *, int, int);
+extern int bgp_dump_state(struct peer *);
#endif /* _QUAGGA_BGP_DUMP_H */
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index 4348e6b240..d955ac280e 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -57,7 +57,7 @@
#include "bgpd/bgp_zebra.h"
DEFINE_HOOK(peer_backward_transition, (struct peer * peer), (peer))
-DEFINE_HOOK(peer_established, (struct peer * peer), (peer))
+DEFINE_HOOK(peer_status_changed, (struct peer * peer), (peer))
/* Definition of display strings corresponding to FSM events. This should be
* kept consistent with the events defined in bgpd.h
@@ -941,8 +941,6 @@ void bgp_fsm_change_status(struct peer *peer, int status)
struct bgp *bgp;
uint32_t peer_count;
- bgp_dump_state(peer, peer->status, status);
-
bgp = peer->bgp;
peer_count = bgp->established_peers;
@@ -1004,6 +1002,9 @@ void bgp_fsm_change_status(struct peer *peer, int status)
/* Save event that caused status change. */
peer->last_major_event = peer->cur_event;
+ /* Operations after status change */
+ hook_call(peer_status_changed, peer);
+
if (status == Established)
UNSET_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER);
@@ -1644,8 +1645,6 @@ static int bgp_establish(struct peer *peer)
peer->host);
}
- hook_call(peer_established, peer);
-
/* Reset uptime, turn on keepalives, send current table. */
if (!peer->v_holdtime)
bgp_keepalives_on(peer);
diff --git a/bgpd/bgp_fsm.h b/bgpd/bgp_fsm.h
index 3476a3c3a9..9d0500ae2c 100644
--- a/bgpd/bgp_fsm.h
+++ b/bgpd/bgp_fsm.h
@@ -88,6 +88,5 @@ extern void bgp_adjust_routeadv(struct peer *);
#include "hook.h"
DECLARE_HOOK(peer_backward_transition, (struct peer * peer), (peer))
-DECLARE_HOOK(peer_established, (struct peer * peer), (peer))
#endif /* _QUAGGA_BGP_FSM_H */
diff --git a/bgpd/bgp_snmp.c b/bgpd/bgp_snmp.c
index 44cbeabd69..c266440899 100644
--- a/bgpd/bgp_snmp.c
+++ b/bgpd/bgp_snmp.c
@@ -894,6 +894,10 @@ static int bgpTrapEstablished(struct peer *peer)
struct in_addr addr;
oid index[sizeof(oid) * IN_ADDR_SIZE];
+ /* Check if this peer just went to Established */
+ if ((peer->last_major_event != OpenConfirm) || !(peer_established(peer)))
+ return 0;
+
ret = inet_aton(peer->host, &addr);
if (ret == 0)
return 0;
@@ -935,7 +939,7 @@ static int bgp_snmp_init(struct thread_master *tm)
static int bgp_snmp_module_init(void)
{
- hook_register(peer_established, bgpTrapEstablished);
+ hook_register(peer_status_changed, bgpTrapEstablished);
hook_register(peer_backward_transition, bgpTrapBackwardTransition);
hook_register(frr_late_init, bgp_snmp_init);
return 0;
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
index 9e05fd5629..a34279706f 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -1931,4 +1931,7 @@ extern struct peer *peer_new(struct bgp *bgp);
extern struct peer *peer_lookup_in_view(struct vty *vty, struct bgp *bgp,
const char *ip_str, bool use_json);
+/* Hooks */
+DECLARE_HOOK(peer_status_changed, (struct peer * peer), (peer))
+
#endif /* _QUAGGA_BGPD_H */