]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: add as notation support for bgp rpki service
authorPhilippe Guibert <philippe.guibert@6wind.com>
Fri, 25 Nov 2022 16:51:33 +0000 (17:51 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Fri, 10 Feb 2023 09:27:23 +0000 (10:27 +0100)
Rpki service uses AS number:
- some show commands use the as number as paramter.
use asnotation support.
- the as number of entries is displayed based on the
asnotation mode of the chose bgp instance.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
bgpd/bgp_rpki.c

index 73c6fe0c4757fa27549e850a7822dfe38eaf17e9..50bbfc14651ac3f14cb398b469dd4e999f9e7521 100644 (file)
@@ -96,6 +96,7 @@ struct rpki_for_each_record_arg {
        unsigned int *prefix_amount;
        as_t as;
        json_object *json;
+       enum asnotation_mode asnotation;
 };
 
 static int start(void);
@@ -120,7 +121,7 @@ static void rpki_delete_all_cache_nodes(void);
 static int add_tcp_cache(const char *host, const char *port,
                         const uint8_t preference, const char *bindaddr);
 static void print_record(const struct pfx_record *record, struct vty *vty,
-                        json_object *json);
+                        json_object *json, enum asnotation_mode asnotation);
 static bool is_synchronized(void);
 static bool is_running(void);
 static bool is_stopping(void);
@@ -285,7 +286,7 @@ static void rpki_delete_all_cache_nodes(void)
 }
 
 static void print_record(const struct pfx_record *record, struct vty *vty,
-                        json_object *json)
+                        json_object *json, enum asnotation_mode asnotation)
 {
        char ip[INET6_ADDRSTRLEN];
        json_object *json_record = NULL;
@@ -293,8 +294,10 @@ static void print_record(const struct pfx_record *record, struct vty *vty,
        lrtr_ip_addr_to_str(&record->prefix, ip, sizeof(ip));
 
        if (!json) {
-               vty_out(vty, "%-40s   %3u - %3u   %10u\n", ip, record->min_len,
-                       record->max_len, record->asn);
+               vty_out(vty, "%-40s   %3u - %3u   ", ip, record->min_len,
+                       record->max_len);
+               vty_out(vty, ASN_FORMAT(asnotation), &record->asn);
+               vty_out(vty, "\n");
        } else {
                json_record = json_object_new_object();
                json_object_string_add(json_record, "prefix", ip);
@@ -302,7 +305,7 @@ static void print_record(const struct pfx_record *record, struct vty *vty,
                                    record->min_len);
                json_object_int_add(json_record, "prefixLenMax",
                                    record->max_len);
-               json_object_int_add(json_record, "asn", record->asn);
+               asn_asn2json(json_record, "asn", record->asn, asnotation);
                json_object_array_add(json, json_record);
        }
 }
@@ -314,7 +317,7 @@ static void print_record_by_asn(const struct pfx_record *record, void *data)
 
        if (record->asn == arg->as) {
                (*arg->prefix_amount)++;
-               print_record(record, vty, arg->json);
+               print_record(record, vty, arg->json, arg->asnotation);
        }
 }
 
@@ -325,7 +328,7 @@ static void print_record_cb(const struct pfx_record *record, void *data)
 
        (*arg->prefix_amount)++;
 
-       print_record(record, vty, arg->json);
+       print_record(record, vty, arg->json, arg->asnotation);
 }
 
 static struct rtr_mgr_group *get_groups(void)
@@ -743,6 +746,7 @@ static void print_prefix_table_by_asn(struct vty *vty, as_t as,
        arg.vty = vty;
        arg.as = as;
        arg.json = NULL;
+       arg.asnotation = bgp_get_asnotation(bgp_lookup_by_vrf_id(VRF_DEFAULT));
 
        if (!group) {
                if (!json)
@@ -795,6 +799,7 @@ static void print_prefix_table(struct vty *vty, json_object *json)
 
        arg.vty = vty;
        arg.json = NULL;
+       arg.asnotation = bgp_get_asnotation(bgp_lookup_by_vrf_id(VRF_DEFAULT));
 
        if (!group) {
                if (!json)
@@ -1352,7 +1357,7 @@ DEFPY (show_rpki_prefix_table,
 
 DEFPY (show_rpki_as_number,
        show_rpki_as_number_cmd,
-       "show rpki as-number (1-4294967295)$by_asn [json$uj]",
+       "show rpki as-number ASNUM$by_asn [json$uj]",
        SHOW_STR
        RPKI_OUTPUT_STRING
        "Lookup by ASN in prefix table\n"
@@ -1360,23 +1365,28 @@ DEFPY (show_rpki_as_number,
        JSON_STR)
 {
        struct json_object *json = NULL;
+       as_t as;
 
        if (!is_synchronized()) {
                if (!uj)
                        vty_out(vty, "No Connection to RPKI cache server.\n");
                return CMD_WARNING;
        }
-
+       if (!asn_str2asn(by_asn, &as)) {
+               if (!uj)
+                       vty_out(vty, "Invalid AS value: %s.\n", by_asn);
+               return CMD_WARNING;
+       }
        if (uj)
                json = json_object_new_object();
 
-       print_prefix_table_by_asn(vty, by_asn, json);
+       print_prefix_table_by_asn(vty, as, json);
        return CMD_SUCCESS;
 }
 
 DEFPY (show_rpki_prefix,
        show_rpki_prefix_cmd,
-       "show rpki prefix <A.B.C.D/M|X:X::X:X/M> [(1-4294967295)$asn] [json$uj]",
+       "show rpki prefix <A.B.C.D/M|X:X::X:X/M> [ASNUM$asn] [json$uj]",
        SHOW_STR
        RPKI_OUTPUT_STRING
        "Lookup IP prefix and optionally ASN in prefix table\n"
@@ -1387,6 +1397,8 @@ DEFPY (show_rpki_prefix,
 {
        json_object *json = NULL;
        json_object *json_records = NULL;
+       as_t as;
+       enum asnotation_mode asnotation;
 
        if (!is_synchronized()) {
                if (!uj)
@@ -1407,13 +1419,19 @@ DEFPY (show_rpki_prefix,
                return CMD_WARNING;
        }
 
+       if (asn && !asn_str2asn(asn, &as)) {
+               if (!uj)
+                       vty_out(vty, "Invalid AS value: %s.\n", asn);
+               return CMD_WARNING;
+       }
+
        struct pfx_record *matches = NULL;
        unsigned int match_count = 0;
        enum pfxv_state result;
 
        if (pfx_table_validate_r(rtr_config->pfx_table, &matches, &match_count,
-                                asn, &addr, prefix->prefixlen, &result)
-           != PFX_SUCCESS) {
+                                as, &addr, prefix->prefixlen,
+                                &result) != PFX_SUCCESS) {
                if (!json)
                        vty_out(vty, "Prefix lookup failed\n");
                return CMD_WARNING;
@@ -1430,13 +1448,14 @@ DEFPY (show_rpki_prefix,
                json_object_object_add(json, "prefixes", json_records);
        }
 
+       asnotation = bgp_get_asnotation(bgp_lookup_by_vrf_id(VRF_DEFAULT));
        for (size_t i = 0; i < match_count; ++i) {
                const struct pfx_record *record = &matches[i];
 
-               if (record->max_len >= prefix->prefixlen
-                   && ((asn != 0 && (uint32_t)asn == record->asn)
-                       || asn == 0)) {
-                       print_record(&matches[i], vty, json_records);
+               if (record->max_len >= prefix->prefixlen &&
+                   ((as != 0 && (uint32_t)as == record->asn) || as == 0)) {
+                       print_record(&matches[i], vty, json_records,
+                                    asnotation);
                }
        }