summaryrefslogtreecommitdiff
path: root/ospf6d/ospf6_lsa.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospf6d/ospf6_lsa.c')
-rw-r--r--ospf6d/ospf6_lsa.c90
1 files changed, 73 insertions, 17 deletions
diff --git a/ospf6d/ospf6_lsa.c b/ospf6d/ospf6_lsa.c
index bab5fdaae8..1bc1ce9cdf 100644
--- a/ospf6d/ospf6_lsa.c
+++ b/ospf6d/ospf6_lsa.c
@@ -29,6 +29,7 @@
#include "memory.h"
#include "thread.h"
#include "checksum.h"
+#include "frrstr.h"
#include "ospf6_proto.h"
#include "ospf6_lsa.h"
@@ -45,6 +46,10 @@
#include "ospf6_flood.h"
#include "ospf6d.h"
+#ifndef VTYSH_EXTRACT_PL
+#include "ospf6d/ospf6_lsa_clippy.c"
+#endif
+
DEFINE_MTYPE_STATIC(OSPF6D, OSPF6_LSA, "OSPF6 LSA");
DEFINE_MTYPE_STATIC(OSPF6D, OSPF6_LSA_HEADER, "OSPF6 LSA header");
DEFINE_MTYPE_STATIC(OSPF6D, OSPF6_LSA_SUMMARY, "OSPF6 LSA summary");
@@ -76,7 +81,6 @@ static int ospf6_unknown_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
json_object *json_obj, bool use_json)
{
uint8_t *start, *end, *current;
- char byte[4];
start = (uint8_t *)lsa->header + sizeof(struct ospf6_lsa_header);
end = (uint8_t *)lsa->header + ntohs(lsa->header->length);
@@ -91,8 +95,7 @@ static int ospf6_unknown_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
else if ((current - start) % 4 == 0)
vty_out(vty, " ");
- snprintf(byte, sizeof(byte), "%02x", *current);
- vty_out(vty, "%s", byte);
+ vty_out(vty, "%02x", *current);
}
vty_out(vty, "\n\n");
@@ -549,29 +552,51 @@ void ospf6_lsa_show_summary(struct vty *vty, struct ospf6_lsa *lsa,
void ospf6_lsa_show_dump(struct vty *vty, struct ospf6_lsa *lsa,
json_object *json_array, bool use_json)
{
- uint8_t *start, *end, *current;
+ uint8_t *start = NULL;
+ uint8_t *end = NULL;
+ uint8_t *current = NULL;
char byte[4];
+ char *header_str = NULL;
+ char adv_router[INET6_ADDRSTRLEN];
+ char id[INET6_ADDRSTRLEN];
+ json_object *json = NULL;
start = (uint8_t *)lsa->header;
end = (uint8_t *)lsa->header + ntohs(lsa->header->length);
- if (use_json)
- return;
+ if (use_json) {
+ json = json_object_new_object();
+ size_t header_str_sz = (2 * (end - start)) + 1;
- vty_out(vty, "\n");
- vty_out(vty, "%s:\n", lsa->name);
+ header_str = XMALLOC(MTYPE_TMP, header_str_sz);
- for (current = start; current < end; current++) {
- if ((current - start) % 16 == 0)
- vty_out(vty, "\n ");
- else if ((current - start) % 4 == 0)
- vty_out(vty, " ");
+ inet_ntop(AF_INET, &lsa->header->id, id, sizeof(id));
+ inet_ntop(AF_INET, &lsa->header->adv_router, adv_router,
+ sizeof(adv_router));
- snprintf(byte, sizeof(byte), "%02x", *current);
- vty_out(vty, "%s", byte);
- }
+ frrstr_hex(header_str, header_str_sz, start, end - start);
+
+ json_object_string_add(json, "linkStateId", id);
+ json_object_string_add(json, "advertisingRouter", adv_router);
+ json_object_string_add(json, "header", header_str);
+ json_object_array_add(json_array, json);
+
+ XFREE(MTYPE_TMP, header_str);
+ } else {
+ vty_out(vty, "\n%s:\n", lsa->name);
+
+ for (current = start; current < end; current++) {
+ if ((current - start) % 16 == 0)
+ vty_out(vty, "\n ");
+ else if ((current - start) % 4 == 0)
+ vty_out(vty, " ");
- vty_out(vty, "\n\n");
+ snprintf(byte, sizeof(byte), "%02x", *current);
+ vty_out(vty, "%s", byte);
+ }
+
+ vty_out(vty, "\n\n");
+ }
return;
}
@@ -822,6 +847,8 @@ int ospf6_lsa_expire(struct thread *thread)
if (CHECK_FLAG(lsa->flag, OSPF6_LSA_HEADERONLY))
return 0; /* dbexchange will do something ... */
ospf6 = ospf6_get_by_lsdb(lsa);
+ assert(ospf6);
+
/* reinstall lsa */
ospf6_install_lsa(lsa);
@@ -994,6 +1021,30 @@ static char *ospf6_lsa_handler_name(const struct ospf6_lsa_handler *h)
return buf;
}
+DEFPY (debug_ospf6_lsa_aggregation,
+ debug_ospf6_lsa_aggregation_cmd,
+ "[no] debug ospf6 lsa aggregation",
+ NO_STR
+ DEBUG_STR
+ OSPF6_STR
+ "Debug Link State Advertisements (LSAs)\n"
+ "External LSA Aggregation\n")
+{
+
+ struct ospf6_lsa_handler *handler;
+
+ handler = ospf6_get_lsa_handler(OSPF6_LSTYPE_AS_EXTERNAL);
+ if (handler == NULL)
+ return CMD_WARNING_CONFIG_FAILED;
+
+ if (no)
+ UNSET_FLAG(handler->lh_debug, OSPF6_LSA_DEBUG_AGGR);
+ else
+ SET_FLAG(handler->lh_debug, OSPF6_LSA_DEBUG_AGGR);
+
+ return CMD_SUCCESS;
+}
+
DEFUN (debug_ospf6_lsa_type,
debug_ospf6_lsa_hex_cmd,
"debug ospf6 lsa <router|network|inter-prefix|inter-router|as-external|link|intra-prefix|unknown> [<originate|examine|flooding>]",
@@ -1105,6 +1156,9 @@ void install_element_ospf6_debug_lsa(void)
install_element(ENABLE_NODE, &no_debug_ospf6_lsa_hex_cmd);
install_element(CONFIG_NODE, &debug_ospf6_lsa_hex_cmd);
install_element(CONFIG_NODE, &no_debug_ospf6_lsa_hex_cmd);
+
+ install_element(ENABLE_NODE, &debug_ospf6_lsa_aggregation_cmd);
+ install_element(CONFIG_NODE, &debug_ospf6_lsa_aggregation_cmd);
}
int config_write_ospf6_debug_lsa(struct vty *vty)
@@ -1128,6 +1182,8 @@ int config_write_ospf6_debug_lsa(struct vty *vty)
if (CHECK_FLAG(handler->lh_debug, OSPF6_LSA_DEBUG_FLOOD))
vty_out(vty, "debug ospf6 lsa %s flooding\n",
ospf6_lsa_handler_name(handler));
+ if (CHECK_FLAG(handler->lh_debug, OSPF6_LSA_DEBUG_AGGR))
+ vty_out(vty, "debug ospf6 lsa aggregation\n");
}
return 0;