📄 ospf6_lsdb.c
字号:
lsdb = as->lsdb; break; default: zlog_warn ("LSDB: Can't install: scope unknown: %s", new->str); return; } /* whether schedule calculation or not */ old = ospf6_lsdb_lookup_lsdb (new->header->type, new->header->id, new->header->adv_router, lsdb); if (! old || ospf6_lsa_differ (old, new)) need_hook++; /* log */ if (IS_OSPF6_DUMP_LSDB) zlog_info ("LSDB: Install: %s %s", new->str, ((IS_LSA_MAXAGE (new)) ? "(MaxAge)" : "")); if (old) ospf6_lsa_lock (old); ospf6_lsdb_add (new, lsdb); gettimeofday (&new->installed, NULL); hook = ospf6_lsdb_hook[ntohs (new->header->type) & OSPF6_LSTYPE_CODE_MASK].hook; if (need_hook && hook) (*hook) (old, new); /* old LSA should be freed here */ if (old) ospf6_lsa_unlock (old);}voidospf6_lsdb_remove_all (struct ospf6_lsdb *lsdb){ struct ospf6_lsdb_node node; for (ospf6_lsdb_head (&node, lsdb); ! ospf6_lsdb_is_end (&node); ospf6_lsdb_next (&node)) ospf6_lsdb_remove (node.lsa, lsdb);}voidospf6_lsdb_remove_maxage (struct ospf6_lsdb *lsdb){ struct ospf6_lsdb_node node; struct ospf6_lsa *lsa; for (ospf6_lsdb_head (&node, lsdb); ! ospf6_lsdb_is_end (&node); ospf6_lsdb_next (&node)) { lsa = node.lsa; /* contiue if it's not MaxAge */ if (! IS_LSA_MAXAGE (lsa)) continue; /* continue if it's referenced by some retrans-lists */ if (lsa->lock != 1) continue; if (IS_OSPF6_DUMP_LSDB) zlog_info ("Remove MaxAge LSA: %s", lsa->str); ospf6_lsdb_remove (lsa, lsdb); }}/* vty functions */static intospf6_lsdb_match (int flag, u_int16_t type, u_int32_t id, u_int32_t adv_router, struct ospf6_lsa *lsa){ if (CHECK_FLAG (flag, OSPF6_LSDB_MATCH_TYPE) && lsa->header->type != type) return 0; if (CHECK_FLAG (flag, OSPF6_LSDB_MATCH_ID) && lsa->header->id != id) return 0; if (CHECK_FLAG (flag, OSPF6_LSDB_MATCH_ADV_ROUTER) && lsa->header->adv_router != adv_router) return 0; return 1;}intshow_ipv6_ospf6_lsdb (struct vty *vty, int argc, char **argv, struct ospf6_lsdb *lsdb){ u_int flag; u_int16_t type = 0; u_int32_t id, adv_router; int ret; struct ospf6_lsdb_node node; char invalid[32], *invalidp; int l_argc = argc; char **l_argv = argv; flag = 0; memset (invalid, 0, sizeof (invalid)); invalidp = invalid; /* chop tail if the words is 'dump' or 'summary' */ if (l_argc > 0 && ! strcmp (l_argv[l_argc - 1], "dump")) { SET_FLAG (flag, OSPF6_LSDB_SHOW_DUMP); l_argc --; } else if (l_argc > 0 && ! strcmp (l_argv[l_argc - 1], "detail")) { SET_FLAG (flag, OSPF6_LSDB_SHOW_DETAIL); l_argc --; } if (l_argc > 0) { SET_FLAG (flag, OSPF6_LSDB_MATCH_TYPE); if (! strncmp (l_argv[0], "r", 1)) type = htons (OSPF6_LSA_TYPE_ROUTER); if (! strncmp (l_argv[0], "n", 1)) type = htons (OSPF6_LSA_TYPE_NETWORK); if (! strncmp (l_argv[0], "a", 1)) type = htons (OSPF6_LSA_TYPE_AS_EXTERNAL); if (! strcmp (l_argv[0], "intra-prefix")) type = htons (OSPF6_LSA_TYPE_INTRA_PREFIX); if (! strcmp (l_argv[0], "inter-router")) type = htons (OSPF6_LSA_TYPE_INTER_ROUTER); if (! strcmp (l_argv[0], "inter-prefix")) type = htons (OSPF6_LSA_TYPE_INTER_PREFIX); if (! strncmp (l_argv[0], "l", 1)) type = htons (OSPF6_LSA_TYPE_LINK); if (! strncmp (l_argv[0], "0x", 2) && strlen (l_argv[0]) == 6) type = htons ((short) strtol (l_argv[0], (char **)NULL, 16)); if (! strncmp (l_argv[0], "*", 1)) UNSET_FLAG (flag, OSPF6_LSDB_MATCH_TYPE); } if (l_argc > 1) { SET_FLAG (flag, OSPF6_LSDB_MATCH_ID); if (! strncmp (l_argv[1], "*", 1)) UNSET_FLAG (flag, OSPF6_LSDB_MATCH_ID); else { ret = inet_pton (AF_INET, l_argv[1], &id); if (ret != 1) { id = htonl (strtoul (l_argv[1], &invalidp, 10)); if (invalid[0] != '\0') { vty_out (vty, "Link State ID is not parsable: %s%s", l_argv[1], VTY_NEWLINE); return CMD_SUCCESS; } } } } if (l_argc > 2) { SET_FLAG (flag, OSPF6_LSDB_MATCH_ADV_ROUTER); if (! strncmp (l_argv[2], "*", 1)) UNSET_FLAG (flag, OSPF6_LSDB_MATCH_ADV_ROUTER); else { ret = inet_pton (AF_INET, l_argv[2], &adv_router); if (ret != 1) { adv_router = htonl (strtoul (l_argv[2], &invalidp, 10)); if (invalid[0] != '\0') { vty_out (vty, "Advertising Router is not parsable: %s%s", l_argv[2], VTY_NEWLINE); return CMD_SUCCESS; } } } } if (! CHECK_FLAG (flag, OSPF6_LSDB_SHOW_DETAIL)) ospf6_lsa_show_summary_header (vty); for (ospf6_lsdb_head (&node, lsdb); ! ospf6_lsdb_is_end (&node); ospf6_lsdb_next (&node)) { if (! ospf6_lsdb_match (flag, type, id, adv_router, node.lsa)) continue; if (CHECK_FLAG (flag, OSPF6_LSDB_SHOW_DUMP)) ospf6_lsa_show_dump (vty, node.lsa); else if (CHECK_FLAG (flag, OSPF6_LSDB_SHOW_DETAIL)) ospf6_lsa_show (vty, node.lsa); else ospf6_lsa_show_summary (vty, node.lsa); } return CMD_SUCCESS;}DEFUN (show_ipv6_ospf6_database, show_ipv6_ospf6_database_cmd, "show ipv6 ospf6 database", SHOW_STR IP6_STR OSPF6_STR "LSA Database\n" ){ struct ospf6_area *o6a; struct ospf6_interface *o6i; listnode i, j; /* call show function for each of LSAs in the LSDBs */ for (i = listhead (ospf6->area_list); i; nextnode (i)) { o6a = (struct ospf6_area *) getdata (i); /* LinkLocal LSDBs */ for (j = listhead (o6a->if_list); j; nextnode (j)) { o6i = (struct ospf6_interface *) getdata (j); vty_out (vty, "%s", VTY_NEWLINE); vty_out (vty, " Interface %s (Area: %s):%s", o6i->interface->name, o6a->str, VTY_NEWLINE); vty_out (vty, "%s", VTY_NEWLINE); show_ipv6_ospf6_lsdb (vty, argc, argv, o6i->lsdb); } /* Area LSDBs */ vty_out (vty, "%s", VTY_NEWLINE); vty_out (vty, " Area %s:%s", o6a->str, VTY_NEWLINE); vty_out (vty, "%s", VTY_NEWLINE); show_ipv6_ospf6_lsdb (vty, argc, argv, o6a->lsdb); } /* AS LSDBs */ vty_out (vty, "%s", VTY_NEWLINE); vty_out (vty, " AS:%s", VTY_NEWLINE); vty_out (vty, "%s", VTY_NEWLINE); show_ipv6_ospf6_lsdb (vty, argc, argv, ospf6->lsdb); return CMD_SUCCESS;}ALIAS (show_ipv6_ospf6_database, show_ipv6_ospf6_database_type_cmd, "show ipv6 ospf6 database (router|network|as-external|intra-prefix|inter-prefix|inter-router|link|*|HEX|dump|detail)", SHOW_STR IP6_STR OSPF6_STR "LSA Database\n" "Router-LSA\n" "Network-LSA\n" "AS-External-LSA\n" "Intra-Area-Prefix-LSA\n" "Inter-Area-Router-LSA\n" "Inter-Area-Prefix-LSA\n" "Link-LSA\n" "All LS Type\n" "Specify LS Type by Hex\n" "Dump raw LSA data in Hex\n" "show detail of LSAs\n" );ALIAS (show_ipv6_ospf6_database, show_ipv6_ospf6_database_type_id_cmd, "show ipv6 ospf6 database (router|network|as-external|intra-prefix|inter-prefix|inter-router|link|*|HEX) (A.B.C.D|*|dump|detail)", SHOW_STR IP6_STR OSPF6_STR "LSA Database\n" "Router-LSA\n" "Network-LSA\n" "AS-External-LSA\n" "Intra-Area-Prefix-LSA\n" "Inter-Area-Router-LSA\n" "Inter-Area-Prefix-LSA\n" "Link-LSA\n" "All LS Type\n" "Specify LS Type by Hex\n" "Link State ID\n" "All Link State ID\n" "Dump raw LSA data in Hex\n" "show detail of LSAs\n" );ALIAS (show_ipv6_ospf6_database, show_ipv6_ospf6_database_type_id_adv_router_cmd, "show ipv6 ospf6 database (router|network|as-external|intra-prefix|inter-prefix|inter-router|link|*|HEX) (A.B.C.D|*) (A.B.C.D|*|dump|detail)", SHOW_STR IP6_STR OSPF6_STR "LSA Database\n" "Router-LSA\n" "Network-LSA\n" "AS-External-LSA\n" "Intra-Area-Prefix-LSA\n" "Inter-Area-Router-LSA\n" "Inter-Area-Prefix-LSA\n" "Link-LSA\n" "All LS Type\n" "Specify LS Type by Hex\n" "Link State ID\n" "All Link State ID\n" "Advertising Router\n" "All Advertising Router\n" "Dump raw LSA data in Hex\n" "show detail of LSAs\n" );ALIAS (show_ipv6_ospf6_database, show_ipv6_ospf6_database_type_id_adv_router_dump_cmd, "show ipv6 ospf6 database (router|network|as-external|intra-prefix|inter-prefix|inter-router|link|*|HEX) (A.B.C.D|*) (A.B.C.D|*) (dump|detail|)", SHOW_STR IP6_STR OSPF6_STR "LSA Database\n" "Router-LSA\n" "Network-LSA\n" "AS-External-LSA\n" "Intra-Area-Prefix-LSA\n" "Inter-Area-Router-LSA\n" "Inter-Area-Prefix-LSA\n" "Link-LSA\n" "All LS Type\n" "Specify LS Type by Hex\n" "Link State ID\n" "All Link State ID\n" "Advertising Router\n" "All Advertising Router\n" "Dump raw LSA data in Hex\n" "show detail of LSAs\n" );voidospf6_lsdb_init (){ install_element (VIEW_NODE, &show_ipv6_ospf6_database_cmd); install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_cmd); install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_id_cmd); install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_id_adv_router_cmd); install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_id_adv_router_dump_cmd); install_element (ENABLE_NODE, &show_ipv6_ospf6_database_cmd); install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_cmd); install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_id_cmd); install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_id_adv_router_cmd); install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_id_adv_router_dump_cmd);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -