📄 ospfd.c
字号:
} 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 + -