summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_route.c35
-rw-r--r--bgpd/bgp_rpki.c1
-rw-r--r--bgpd/bgpd.h5
3 files changed, 41 insertions, 0 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index ea6bf95d14..a753b7ef60 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -97,6 +97,11 @@ DEFINE_HOOK(bgp_snmp_update_stats,
(struct bgp_node *rn, struct bgp_path_info *pi, bool added),
(rn, pi, added))
+DEFINE_HOOK(bgp_rpki_prefix_status,
+ (struct peer *peer, struct attr *attr,
+ const struct prefix *prefix),
+ (peer, attr, prefix))
+
/* Extern from bgp_dump.c */
extern const char *bgp_origin_str[];
extern const char *bgp_origin_long_str[];
@@ -7554,6 +7559,21 @@ static const char *bgp_origin2str(uint8_t origin)
return "n/a";
}
+static const char *bgp_rpki_validation2str(int v_state)
+{
+ switch (v_state) {
+ case 1:
+ return "valid";
+ case 2:
+ return "not found";
+ case 3:
+ return "invalid";
+ default:
+ break;
+ }
+ return "ERROR";
+}
+
int bgp_aggregate_unset(struct bgp *bgp, struct prefix *prefix, afi_t afi,
safi_t safi, char *errmsg, size_t errmsg_len)
{
@@ -9568,6 +9588,7 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
int i;
char *nexthop_hostname =
bgp_nexthop_hostname(path->peer, path->nexthop);
+ int rpki_validation_state = 0;
if (json_paths) {
json_path = json_object_new_object();
@@ -10166,6 +10187,20 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp,
}
}
+ const struct prefix *p = bgp_dest_get_prefix(bn);
+ if (p->family == AF_INET || p->family == AF_INET6)
+ rpki_validation_state = hook_call(bgp_rpki_prefix_status,
+ path->peer, path->attr, p);
+ if (rpki_validation_state) {
+ if (json_paths)
+ json_object_string_add(
+ json_path, "rpkiValidationState",
+ bgp_rpki_validation2str(rpki_validation_state));
+ else
+ vty_out(vty, ", validation-state: %s",
+ bgp_rpki_validation2str(rpki_validation_state));
+ }
+
if (json_bestpath)
json_object_object_add(json_path, "bestpath", json_bestpath);
diff --git a/bgpd/bgp_rpki.c b/bgpd/bgp_rpki.c
index 6bb33ff859..42951efb01 100644
--- a/bgpd/bgp_rpki.c
+++ b/bgpd/bgp_rpki.c
@@ -562,6 +562,7 @@ static int bgp_rpki_module_init(void)
{
lrtr_set_alloc_functions(malloc_wrapper, realloc_wrapper, free_wrapper);
+ hook_register(bgp_rpki_prefix_status, rpki_validate_prefix);
hook_register(frr_late_init, bgp_rpki_init);
hook_register(frr_early_fini, &bgp_rpki_fini);
diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h
index 23d0e9dfb1..3f5ec07796 100644
--- a/bgpd/bgpd.h
+++ b/bgpd/bgpd.h
@@ -2371,6 +2371,11 @@ DECLARE_HOOK(bgp_snmp_update_last_changed, (struct bgp *bgp), (bgp))
DECLARE_HOOK(bgp_snmp_update_stats,
(struct bgp_node *rn, struct bgp_path_info *pi, bool added),
(rn, pi, added))
+DECLARE_HOOK(bgp_rpki_prefix_status,
+ (struct peer * peer, struct attr *attr,
+ const struct prefix *prefix),
+ (peer, attr, prefix))
+
void peer_nsf_stop(struct peer *peer);
#endif /* _QUAGGA_BGPD_H */