📄 ospf_opaque.c
字号:
static voidopaque_lsa_config_write_debug_callback (list funclist, struct vty *vty){ listnode node; struct ospf_opaque_functab *functab; for (node = listhead (funclist); node; nextnode (node)) if ((functab = getdata (node)) != NULL) if (functab->config_write_debug != NULL) (* functab->config_write_debug)(vty); return;}static intopaque_lsa_originate_callback (list funclist, void *lsa_type_dependent){ listnode node; struct ospf_opaque_functab *functab; int rc = -1; for (node = listhead (funclist); node; nextnode (node)) if ((functab = getdata (node)) != NULL) if (functab->lsa_originator != NULL) if ((* functab->lsa_originator)(lsa_type_dependent) != 0) goto out; rc = 0;out: return rc;}static intnew_lsa_callback (list funclist, struct ospf_lsa *lsa){ listnode node; struct ospf_opaque_functab *functab; int rc = -1; /* This function handles ALL types of LSAs, not only opaque ones. */ for (node = listhead (funclist); node; nextnode (node)) if ((functab = getdata (node)) != NULL) if (functab->new_lsa_hook != NULL) if ((* functab->new_lsa_hook)(lsa) != 0) goto out; rc = 0;out: return rc;}static intdel_lsa_callback (list funclist, struct ospf_lsa *lsa){ listnode node; struct ospf_opaque_functab *functab; int rc = -1; /* This function handles ALL types of LSAs, not only opaque ones. */ for (node = listhead (funclist); node; nextnode (node)) if ((functab = getdata (node)) != NULL) if (functab->del_lsa_hook != NULL) if ((* functab->del_lsa_hook)(lsa) != 0) goto out; rc = 0;out: return rc;}/*------------------------------------------------------------------------* * Followings are glue functions to call Opaque-LSA specific processing. *------------------------------------------------------------------------*/intospf_opaque_new_if (struct interface *ifp){ list funclist; int rc = -1; funclist = ospf_opaque_wildcard_funclist; if (opaque_lsa_new_if_callback (funclist, ifp) != 0) goto out; funclist = ospf_opaque_type9_funclist; if (opaque_lsa_new_if_callback (funclist, ifp) != 0) goto out; funclist = ospf_opaque_type10_funclist; if (opaque_lsa_new_if_callback (funclist, ifp) != 0) goto out; funclist = ospf_opaque_type11_funclist; if (opaque_lsa_new_if_callback (funclist, ifp) != 0) goto out; rc = 0;out: return rc;}intospf_opaque_del_if (struct interface *ifp){ list funclist; int rc = -1; funclist = ospf_opaque_wildcard_funclist; if (opaque_lsa_del_if_callback (funclist, ifp) != 0) goto out; funclist = ospf_opaque_type9_funclist; if (opaque_lsa_del_if_callback (funclist, ifp) != 0) goto out; funclist = ospf_opaque_type10_funclist; if (opaque_lsa_del_if_callback (funclist, ifp) != 0) goto out; funclist = ospf_opaque_type11_funclist; if (opaque_lsa_del_if_callback (funclist, ifp) != 0) goto out; rc = 0;out: return rc;}voidospf_opaque_ism_change (struct ospf_interface *oi, int old_status){ list funclist; funclist = ospf_opaque_wildcard_funclist; opaque_lsa_ism_change_callback (funclist, oi, old_status); funclist = ospf_opaque_type9_funclist; opaque_lsa_ism_change_callback (funclist, oi, old_status); funclist = ospf_opaque_type10_funclist; opaque_lsa_ism_change_callback (funclist, oi, old_status); funclist = ospf_opaque_type11_funclist; opaque_lsa_ism_change_callback (funclist, oi, old_status); return;}voidospf_opaque_nsm_change (struct ospf_neighbor *nbr, int old_state){ struct ospf *top; list funclist; if ((top = oi_to_top (nbr->oi)) == NULL) goto out; if (old_state != NSM_Full && nbr->state == NSM_Full) { if (CHECK_FLAG (nbr->options, OSPF_OPTION_O)) { if (! CHECK_FLAG (top->opaque, OPAQUE_OPERATION_READY_BIT)) { if (IS_DEBUG_OSPF_EVENT) zlog_info ("Opaque-LSA: Now get operational!"); SET_FLAG (top->opaque, OPAQUE_OPERATION_READY_BIT); } ospf_opaque_lsa_originate_schedule (nbr->oi, NULL); } } else if (old_state == NSM_Full && nbr->state != NSM_Full) {#ifdef NOTYET /* * If no more opaque-capable full-state neighbor remains in the * flooding scope which corresponds to Opaque-LSA type, periodic * LS flooding should be stopped. */#endif /* NOTYET */ ; } funclist = ospf_opaque_wildcard_funclist; opaque_lsa_nsm_change_callback (funclist, nbr, old_state); funclist = ospf_opaque_type9_funclist; opaque_lsa_nsm_change_callback (funclist, nbr, old_state); funclist = ospf_opaque_type10_funclist; opaque_lsa_nsm_change_callback (funclist, nbr, old_state); funclist = ospf_opaque_type11_funclist; opaque_lsa_nsm_change_callback (funclist, nbr, old_state);out: return;}voidospf_opaque_config_write_router (struct vty *vty, struct ospf *ospf){ list funclist; if (CHECK_FLAG (ospf->config, OSPF_OPAQUE_CAPABLE)) vty_out (vty, " capability opaque%s", VTY_NEWLINE); funclist = ospf_opaque_wildcard_funclist; opaque_lsa_config_write_router_callback (funclist, vty); funclist = ospf_opaque_type9_funclist; opaque_lsa_config_write_router_callback (funclist, vty); funclist = ospf_opaque_type10_funclist; opaque_lsa_config_write_router_callback (funclist, vty); funclist = ospf_opaque_type11_funclist; opaque_lsa_config_write_router_callback (funclist, vty); return;}voidospf_opaque_config_write_if (struct vty *vty, struct interface *ifp){ list funclist; funclist = ospf_opaque_wildcard_funclist; opaque_lsa_config_write_if_callback (funclist, vty, ifp); funclist = ospf_opaque_type9_funclist; opaque_lsa_config_write_if_callback (funclist, vty, ifp); funclist = ospf_opaque_type10_funclist; opaque_lsa_config_write_if_callback (funclist, vty, ifp); funclist = ospf_opaque_type11_funclist; opaque_lsa_config_write_if_callback (funclist, vty, ifp); return;}voidospf_opaque_config_write_debug (struct vty *vty){ list funclist; funclist = ospf_opaque_wildcard_funclist; opaque_lsa_config_write_debug_callback (funclist, vty); funclist = ospf_opaque_type9_funclist; opaque_lsa_config_write_debug_callback (funclist, vty); funclist = ospf_opaque_type10_funclist; opaque_lsa_config_write_debug_callback (funclist, vty); funclist = ospf_opaque_type11_funclist; opaque_lsa_config_write_debug_callback (funclist, vty); return;}voidshow_opaque_info_detail (struct vty *vty, struct ospf_lsa *lsa){ struct lsa_header *lsah = (struct lsa_header *) lsa->data; u_int32_t lsid = ntohl (lsah->id.s_addr); u_char opaque_type = GET_OPAQUE_TYPE (lsid); u_int32_t opaque_id = GET_OPAQUE_ID (lsid); struct ospf_opaque_functab *functab; /* Switch output functionality by vty address. */ if (vty != NULL) { vty_out (vty, " Opaque-Type %u (%s)%s", opaque_type, ospf_opaque_type_name (opaque_type), VTY_NEWLINE); vty_out (vty, " Opaque-ID 0x%x%s", opaque_id, VTY_NEWLINE); vty_out (vty, " Opaque-Info: %u octets of data%s%s", ntohs (lsah->length) - OSPF_LSA_HEADER_SIZE, VALID_OPAQUE_INFO_LEN(lsah) ? "" : "(Invalid length?)", VTY_NEWLINE); } else { zlog_info (" Opaque-Type %u (%s)", opaque_type, ospf_opaque_type_name (opaque_type)); zlog_info (" Opaque-ID 0x%x", opaque_id); zlog_info (" Opaque-Info: %u octets of data%s", ntohs (lsah->length) - OSPF_LSA_HEADER_SIZE, VALID_OPAQUE_INFO_LEN(lsah) ? "" : "(Invalid length?)"); } /* Call individual output functions. */ if ((functab = ospf_opaque_functab_lookup (lsa)) != NULL) if (functab->show_opaque_info != NULL) (* functab->show_opaque_info)(vty, lsa); return;}voidospf_opaque_lsa_dump (struct stream *s, u_int16_t length){ struct ospf_lsa lsa; lsa.data = (struct lsa_header *) STREAM_PNT (s); show_opaque_info_detail (NULL, &lsa); return;}static intospf_opaque_lsa_install_hook (struct ospf_lsa *lsa){ list funclist; int rc = -1; /* * Some Opaque-LSA user may want to monitor every LSA installation * into the LSDB, regardless with target LSA type. */ funclist = ospf_opaque_wildcard_funclist; if (new_lsa_callback (funclist, lsa) != 0) goto out; funclist = ospf_opaque_type9_funclist; if (new_lsa_callback (funclist, lsa) != 0) goto out; funclist = ospf_opaque_type10_funclist; if (new_lsa_callback (funclist, lsa) != 0) goto out; funclist = ospf_opaque_type11_funclist; if (new_lsa_callback (funclist, lsa) != 0) goto out; rc = 0;out: return rc;}static intospf_opaque_lsa_delete_hook (struct ospf_lsa *lsa){ list funclist; int rc = -1; /* * Some Opaque-LSA user may want to monitor every LSA deletion * from the LSDB, regardless with target LSA type. */ funclist = ospf_opaque_wildcard_funclist; if (del_lsa_callback (funclist, lsa) != 0) goto out; funclist = ospf_opaque_type9_funclist; if (del_lsa_callback (funclist, lsa) != 0) goto out; funclist = ospf_opaque_type10_funclist; if (del_lsa_callback (funclist, lsa) != 0) goto out; funclist = ospf_opaque_type11_funclist; if (del_lsa_callback (funclist, lsa) != 0) goto out; rc = 0;out: return rc;}/*------------------------------------------------------------------------* * Followings are Opaque-LSA origination/refresh management functions. *------------------------------------------------------------------------*/static int ospf_opaque_type9_lsa_originate (struct thread *t);static int ospf_opaque_type10_lsa_originate (struct thread *t);static int ospf_opaque_type11_lsa_originate (struct thread *t);static void ospf_opaque_lsa_reoriginate_resume (list listtop, void *arg);voidospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, int *delay0){ struct ospf *top; struct ospf_area *area; listnode node; struct opaque_info_per_type *oipt; int delay = 0; if ((top = oi_to_top (oi)) == NULL || (area = oi->area) == NULL) { zlog_warn ("ospf_opaque_lsa_originate_schedule: Invalid argument?"); goto out; } /* It may not a right time to schedule origination now. */ if (! CHECK_FLAG (top->opaque, OPAQUE_OPERATION_READY_BIT)) { if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_opaque_lsa_originate_schedule: Not operational."); goto out; /* This is not an error. */ } if (IS_OPAQUE_LSA_ORIGINATION_BLOCKED (top->opaque)) { if (IS_DEBUG_OSPF_EVENT) zlog_info ("ospf_opaque_lsa_originate_schedule: Under blockade."); goto out; /* This is not an error, too. */ } if (delay0 != NULL) delay = *delay0; /* * There might be some entries that have been waiting for triggering * of per opaque-type re-origination get resumed. */ ospf_opaque_lsa_reoriginate_resume ( oi->opaque_lsa_self, (void *) oi); ospf_opaque_lsa_reoriginate_resume (area->opaque_lsa_self, (void *) area); ospf_opaque_lsa_reoriginate_resume ( top->opaque_lsa_self, (void *) top); /* * Now, schedule origination of all Opaque-LSAs per opaque-type. */ if (! list_isempty (ospf_opaque_type9_funclist) && list_isempty (oi->opaque_lsa_self) && oi->t_opaque_lsa_self == NULL) { if (IS_DEBUG_OSPF_EVENT) zlog_info ("Schedule Type-9 Opaque-LSA origination in %d sec later.", delay); oi->t_opaque_lsa_self = thread_add_timer (master, ospf_opaque_type9_lsa_originate, oi, delay); delay += OSPF_MIN_LS_INTERVAL; } if (! list_isempty (ospf_opaque_type10_funclist) && list_isempty (area->opaque_lsa_self) && area->t_opaque_lsa_self == NULL) { /* * One AREA may contain multiple OIs, but above 2nd and 3rd * conditions prevent from scheduling the originate function * again and again. */ if (IS_DEBUG_OSPF_EVENT) zlog_info ("Schedule Type-10 Opaque-LSA origination in %d sec later.", delay);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -