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

📄 ospfd.c

📁 router source code for the ospdf.
💻 C
📖 第 1 页 / 共 3 页
字号:
    }  return 1;}intospf_area_nssa_unset (struct ospf *ospf, struct in_addr area_id){  struct ospf_area *area;  area = ospf_area_lookup_by_area_id (ospf, area_id);  if (area == NULL)    return 0;  if (area->external_routing == OSPF_AREA_NSSA)    {      ospf->anyNSSA--;      ospf_area_type_set (area, OSPF_AREA_DEFAULT);    }  ospf_area_check_free (ospf, area_id);  return 1;}intospf_area_nssa_translator_role_set (struct ospf *ospf, struct in_addr area_id,				    int role){  struct ospf_area *area;  area = ospf_area_lookup_by_area_id (ospf, area_id);  if (area == NULL)    return 0;  area->NSSATranslator = role;  return 1;}intospf_area_nssa_translator_role_unset (struct ospf *ospf,				      struct in_addr area_id){  struct ospf_area *area;  area = ospf_area_lookup_by_area_id (ospf, area_id);  if (area == NULL)    return 0;  area->NSSATranslator = OSPF_NSSA_ROLE_CANDIDATE;  ospf_area_check_free (ospf, area_id);  return 1;}intospf_area_export_list_set (struct ospf *ospf,			   struct ospf_area *area, char *list_name){  struct access_list *list;  list = access_list_lookup (AFI_IP, list_name);  EXPORT_LIST (area) = list;  if (EXPORT_NAME (area))    free (EXPORT_NAME (area));  EXPORT_NAME (area) = strdup (list_name);  ospf_schedule_abr_task (ospf);  return 1;}intospf_area_export_list_unset (struct ospf *ospf, struct ospf_area * area){  EXPORT_LIST (area) = 0;  if (EXPORT_NAME (area))    free (EXPORT_NAME (area));  EXPORT_NAME (area) = NULL;  ospf_area_check_free (ospf, area->area_id);    ospf_schedule_abr_task (ospf);  return 1;}intospf_area_import_list_set (struct ospf *ospf,			   struct ospf_area *area, char *name){  struct access_list *list;  list = access_list_lookup (AFI_IP, name);  IMPORT_LIST (area) = list;  if (IMPORT_NAME (area))    free (IMPORT_NAME (area));  IMPORT_NAME (area) = strdup (name);  ospf_schedule_abr_task (ospf);  return 1;}intospf_area_import_list_unset (struct ospf *ospf, struct ospf_area * area){  IMPORT_LIST (area) = 0;  if (IMPORT_NAME (area))    free (IMPORT_NAME (area));  IMPORT_NAME (area) = NULL;  ospf_area_check_free (ospf, area->area_id);  ospf_schedule_abr_task (ospf);  return 1;}intospf_timers_spf_set (struct ospf *ospf, u_int32_t delay, u_int32_t hold){  ospf->spf_delay = delay;  ospf->spf_holdtime = hold;  return 1;}intospf_timers_spf_unset (struct ospf *ospf){  ospf->spf_delay = OSPF_SPF_DELAY_DEFAULT;  ospf->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;  return 1;}intospf_timers_refresh_set (struct ospf *ospf, int interval){  int time_left;  if (ospf->lsa_refresh_interval == interval)    return 1;  time_left = ospf->lsa_refresh_interval -    (time (NULL) - ospf->lsa_refresher_started);    if (time_left > interval)    {      OSPF_TIMER_OFF (ospf->t_lsa_refresher);      ospf->t_lsa_refresher =	thread_add_timer (master, ospf_lsa_refresh_walker, ospf, interval);    }  ospf->lsa_refresh_interval = interval;  return 1;}intospf_timers_refresh_unset (struct ospf *ospf){  int time_left;  time_left = ospf->lsa_refresh_interval -    (time (NULL) - ospf->lsa_refresher_started);  if (time_left > OSPF_LSA_REFRESH_INTERVAL_DEFAULT)    {      OSPF_TIMER_OFF (ospf->t_lsa_refresher);      ospf->t_lsa_refresher =	thread_add_timer (master, ospf_lsa_refresh_walker, ospf,			  OSPF_LSA_REFRESH_INTERVAL_DEFAULT);    }  ospf->lsa_refresh_interval = OSPF_LSA_REFRESH_INTERVAL_DEFAULT;  return 1;}struct ospf_nbr_nbma *ospf_nbr_nbma_new (){  struct ospf_nbr_nbma *nbr_nbma;  nbr_nbma = XMALLOC (MTYPE_OSPF_NEIGHBOR_STATIC,		      sizeof (struct ospf_nbr_nbma));  memset (nbr_nbma, 0, sizeof (struct ospf_nbr_nbma));  nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;  nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;  return nbr_nbma;}voidospf_nbr_nbma_free (struct ospf_nbr_nbma *nbr_nbma){  XFREE (MTYPE_OSPF_NEIGHBOR_STATIC, nbr_nbma);}voidospf_nbr_nbma_delete (struct ospf *ospf, struct ospf_nbr_nbma *nbr_nbma){  struct route_node *rn;  struct prefix_ipv4 p;  p.family = AF_INET;  p.prefix = nbr_nbma->addr;  p.prefixlen = IPV4_MAX_BITLEN;  rn = route_node_lookup (ospf->nbr_nbma, (struct prefix *)&p);  if (rn)    {      ospf_nbr_nbma_free (rn->info);      rn->info = NULL;      route_unlock_node (rn);      route_unlock_node (rn);    }}voidospf_nbr_nbma_down (struct ospf_nbr_nbma *nbr_nbma){  OSPF_TIMER_OFF (nbr_nbma->t_poll);  if (nbr_nbma->nbr)    {      nbr_nbma->nbr->nbr_nbma = NULL;      OSPF_NSM_EVENT_EXECUTE (nbr_nbma->nbr, NSM_KillNbr);    }  if (nbr_nbma->oi)    listnode_delete (nbr_nbma->oi->nbr_nbma, nbr_nbma);}voidospf_nbr_nbma_add (struct ospf_nbr_nbma *nbr_nbma,		   struct ospf_interface *oi){  struct ospf_neighbor *nbr;  struct route_node *rn;  struct prefix p;  if (oi->type != OSPF_IFTYPE_NBMA)    return;  if (nbr_nbma->nbr != NULL)    return;  if (IPV4_ADDR_SAME (&oi->nbr_self->address.u.prefix4, &nbr_nbma->addr))    return;        nbr_nbma->oi = oi;  listnode_add (oi->nbr_nbma, nbr_nbma);  /* Get neighbor information from table. */  p.family = AF_INET;  p.prefixlen = IPV4_MAX_BITLEN;  p.u.prefix4 = nbr_nbma->addr;  rn = route_node_get (oi->nbrs, (struct prefix *)&p);  if (rn->info)    {      nbr = rn->info;      nbr->nbr_nbma = nbr_nbma;      nbr_nbma->nbr = nbr;      route_unlock_node (rn);    }  else    {      nbr = rn->info = ospf_nbr_new (oi);      nbr->state = NSM_Down;      nbr->src = nbr_nbma->addr;      nbr->nbr_nbma = nbr_nbma;      nbr->priority = nbr_nbma->priority;      nbr->address = p;      nbr_nbma->nbr = nbr;      OSPF_NSM_EVENT_EXECUTE (nbr, NSM_Start);    }}voidospf_nbr_nbma_if_update (struct ospf *ospf, struct ospf_interface *oi){  struct ospf_nbr_nbma *nbr_nbma;  struct route_node *rn;  struct prefix_ipv4 p;  if (oi->type != OSPF_IFTYPE_NBMA)    return;  for (rn = route_top (ospf->nbr_nbma); rn; rn = route_next (rn))    if ((nbr_nbma = rn->info))      if (nbr_nbma->oi == NULL && nbr_nbma->nbr == NULL)	{	  p.family = AF_INET;	  p.prefix = nbr_nbma->addr;	  p.prefixlen = IPV4_MAX_BITLEN;	  if (prefix_match (oi->address, (struct prefix *)&p))	    ospf_nbr_nbma_add (nbr_nbma, oi);	}}struct ospf_nbr_nbma *ospf_nbr_nbma_lookup (struct ospf *ospf, struct in_addr nbr_addr){  struct route_node *rn;  struct prefix_ipv4 p;  p.family = AF_INET;  p.prefix = nbr_addr;  p.prefixlen = IPV4_MAX_BITLEN;  rn = route_node_lookup (ospf->nbr_nbma, (struct prefix *)&p);  if (rn)    {      route_unlock_node (rn);      return rn->info;    }  return NULL;}struct ospf_nbr_nbma *ospf_nbr_nbma_lookup_next (struct ospf *ospf, struct in_addr *addr, int first){#if 0  struct ospf_nbr_nbma *nbr_nbma;  listnode node;#endif  if (ospf == NULL)    return NULL;#if 0  for (node = listhead (ospf->nbr_nbma); node; nextnode (node))    {      nbr_nbma = getdata (node);      if (first)	{	  *addr = nbr_nbma->addr;	  return nbr_nbma;	}      else if (ntohl (nbr_nbma->addr.s_addr) > ntohl (addr->s_addr))	{	  *addr = nbr_nbma->addr;	  return nbr_nbma;	}    }#endif  return NULL;}intospf_nbr_nbma_set (struct ospf *ospf, struct in_addr nbr_addr){  struct ospf_nbr_nbma *nbr_nbma;  struct ospf_interface *oi;  struct prefix_ipv4 p;  struct route_node *rn;  listnode node;  nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);  if (nbr_nbma)    return 0;  nbr_nbma = ospf_nbr_nbma_new ();  nbr_nbma->addr = nbr_addr;  p.family = AF_INET;  p.prefix = nbr_addr;  p.prefixlen = IPV4_MAX_BITLEN;  rn = route_node_get (ospf->nbr_nbma, (struct prefix *)&p);  rn->info = nbr_nbma;  for (node = listhead (ospf->oiflist); node; nextnode (node))    {      oi = getdata (node);      if (oi->type == OSPF_IFTYPE_NBMA)	if (prefix_match (oi->address, (struct prefix *)&p))	  {	    ospf_nbr_nbma_add (nbr_nbma, oi);	    break;	  }    }  return 1;}intospf_nbr_nbma_unset (struct ospf *ospf, struct in_addr nbr_addr){  struct ospf_nbr_nbma *nbr_nbma;  nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);  if (nbr_nbma == NULL)    return 0;  ospf_nbr_nbma_down (nbr_nbma);  ospf_nbr_nbma_delete (ospf, nbr_nbma);  return 1;}intospf_nbr_nbma_priority_set (struct ospf *ospf, struct in_addr nbr_addr,			    u_char priority){  struct ospf_nbr_nbma *nbr_nbma;  nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);  if (nbr_nbma == NULL)    return 0;  if (nbr_nbma->priority != priority)    nbr_nbma->priority = priority;  return 1;}intospf_nbr_nbma_priority_unset (struct ospf *ospf, struct in_addr nbr_addr){  struct ospf_nbr_nbma *nbr_nbma;  nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);  if (nbr_nbma == NULL)    return 0;  if (nbr_nbma != OSPF_NEIGHBOR_PRIORITY_DEFAULT)    nbr_nbma->priority = OSPF_NEIGHBOR_PRIORITY_DEFAULT;  return 1;}intospf_nbr_nbma_poll_interval_set (struct ospf *ospf, struct in_addr nbr_addr,				 int interval){  struct ospf_nbr_nbma *nbr_nbma;  nbr_nbma = ospf_nbr_nbma_lookup (ospf, nbr_addr);  if (nbr_nbma == NULL)    return 0;  if (nbr_nbma->v_poll != interval)    {      nbr_nbma->v_poll = interval;      if (nbr_nbma->oi && ospf_if_is_up (nbr_nbma->oi))	{	  OSPF_TIMER_OFF (nbr_nbma->t_poll);	  OSPF_POLL_TIMER_ON (nbr_nbma->t_poll, ospf_poll_timer,			      nbr_nbma->v_poll);	}    }  return 1;}intospf_nbr_nbma_poll_interval_unset (struct ospf *ospf, struct in_addr addr){  struct ospf_nbr_nbma *nbr_nbma;  nbr_nbma = ospf_nbr_nbma_lookup (ospf, addr);  if (nbr_nbma == NULL)    return 0;  if (nbr_nbma->v_poll != OSPF_POLL_INTERVAL_DEFAULT)    nbr_nbma->v_poll = OSPF_POLL_INTERVAL_DEFAULT;  return 1;}voidospf_prefix_list_update (struct prefix_list *plist){  struct ospf *ospf;  struct ospf_area *area;  listnode node;  int abr_inv = 0;  /* If OSPF instatnce does not exist, return right now. */  ospf = ospf_lookup ();  if (ospf == NULL)    return;  /* Update Area prefix-list. */  for (node = listhead (ospf->areas); node; nextnode (node))    {      area = getdata (node);      /* Update filter-list in. */      if (PREFIX_NAME_IN (area))	if (strcmp (PREFIX_NAME_IN (area), plist->name) == 0)	  {	    PREFIX_LIST_IN (area) = 	      prefix_list_lookup (AFI_IP, PREFIX_NAME_IN (area));	    abr_inv++;	  }      /* Update filter-list out. */      if (PREFIX_NAME_OUT (area))	if (strcmp (PREFIX_NAME_OUT (area), plist->name) == 0)	  {	    PREFIX_LIST_IN (area) = 	      prefix_list_lookup (AFI_IP, PREFIX_NAME_OUT (area));	    abr_inv++;	  }    }  /* Schedule ABR tasks. */  if (IS_OSPF_ABR (ospf) && abr_inv)    ospf_schedule_abr_task (ospf);}voidospf_master_init (){  memset (&ospf_master, 0, sizeof (struct ospf_master));  om = &ospf_master;  om->ospf = list_new ();  om->master = thread_master_create ();  om->start_time = time (NULL);}voidospf_init (){  prefix_list_add_hook (ospf_prefix_list_update);  prefix_list_delete_hook (ospf_prefix_list_update);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -