⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ospf_opaque.c

📁 router source code for the ospdf.
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -