📄 ospf_list_utilities.c
字号:
for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->ls_database_hash_table[ls_type][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->ls_database_hash_table[ls_type][index])) { if (sptr_ls_database_head->sptr_linear_database_entry != NULL) { /* SPR#76812 */ for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry; sptr_database_entry != NULL; sptr_database_entry = sptr_next_database_entry) { sptr_next_database_entry = sptr_database_entry->sptr_forward_link; for (sptr_interface = sptr_area->sptr_interfaces; sptr_interface != NULL; sptr_interface = sptr_next_interface) { sptr_next_interface = sptr_interface->sptr_forward_link; if (sptr_interface->area_id == sptr_area->area_id) { ospf_remove_current_database_copy_from_all_neighbors_retransmission_lists (sptr_database_entry, sptr_interface); } } /* sptr_interface */ ospf_free_database_entry (sptr_database_entry); /* defined in ospf_link_state_database.c */ } /* for sptr_database_entry */ } /* if */ sptr_ls_database_head->sptr_linear_database_entry = NULL; } /* for index */ } /* for OSPF_LS_ROUTER */ /* opaque lsa free opaque lsa type 9 jkw */#if defined (__OPAQUE_LSA__) for (ls_type = TYPE_9_LSA; ls_type <= TYPE_11_LSA; ++ls_type) /* for each type of advertisement */ { for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[ls_type][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[ls_type][index])) { if (sptr_ls_database_head->sptr_linear_database_entry != NULL) { /* SPR#76812 */ for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry; sptr_database_entry != NULL; sptr_database_entry = sptr_next_database_entry) { sptr_next_database_entry = sptr_database_entry->sptr_forward_link; for (sptr_interface = sptr_area->sptr_interfaces; sptr_interface != NULL; sptr_interface = sptr_next_interface) { sptr_next_interface = sptr_interface->sptr_forward_link; if (sptr_interface->area_id == sptr_area->area_id) { ospf_remove_current_database_copy_from_all_neighbors_retransmission_lists (sptr_database_entry, sptr_interface); } } /* sptr_interface */ ospf_free_database_entry (sptr_database_entry); /* defined in ospf_link_state_database.c */ } /* for sptr_database_entry */ } /* if */ sptr_ls_database_head->sptr_linear_database_entry = NULL; } /* for index */ }#endif /* __OPAQUE_LSA__ */ return;}/********************************************************************************************************************************/void ospf_free_interfaces (){ OSPF_INTERFACE *sptr_next_interface = NULL; OSPF_INTERFACE *sptr_interface = NULL; OSPF_NEIGHBOR *sptr_neighbor = NULL; OSPF_NEIGHBOR *sptr_next_neighbor = NULL; OSPF_AREA_ENTRY *sptr_area = NULL; OSPF_AREA_ENTRY *sptr_next_area = NULL; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_free_interfaces\r\n"); /* SPR#76812 */ semTake (ospf_config_mutex, WAIT_FOREVER); for (sptr_area = ospf.sptr_area_list; sptr_area != NULL; sptr_area = sptr_next_area) { sptr_next_area = sptr_area->sptr_forward_link; for (sptr_interface = sptr_area->sptr_interfaces; sptr_interface != NULL; sptr_interface = sptr_next_interface ) { sptr_next_interface = sptr_interface->sptr_forward_link; if (sptr_interface->area_id == sptr_area->area_id) { for ( sptr_neighbor = sptr_interface->sptr_neighbor; sptr_neighbor != NULL; sptr_neighbor = sptr_next_neighbor ) { /* * Free interfaces neighbors */ sptr_next_neighbor = sptr_neighbor->sptr_forward_link; ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_interface->sptr_neighbor), (OSPF_GENERIC_NODE *) sptr_neighbor); ospf_free_neighbor (sptr_neighbor); } ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_area->sptr_interfaces), (OSPF_GENERIC_NODE*) sptr_interface); ospf_free_interface_acknowledgement_list (sptr_interface, FALSE /* free all no matter what */); if (sptr_interface->sptr_authentication_key != NULL) { ospf_free_entire_list ((OSPF_GENERIC_NODE*) sptr_interface->sptr_authentication_key); } table_free ( (void*) sptr_interface); sptr_interface = NULL; } } sptr_area->sptr_interfaces = NULL; } semGive (ospf_config_mutex);}/********************************************************************************************************************************/void ospf_free_neighbor (OSPF_NEIGHBOR* sptr_neighbor){ OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_free_neighbor\r\n"); if (sptr_neighbor->state == OSPF_NEIGHBOR_DOWN) { ospf_search_ls_database_and_remove_neighbor_from_that_lsas_neighbor_retx_list_on_event_neighbor_down (sptr_neighbor); } ospf_remove_all_database_pointers_from_neighbor_retransmit_list (sptr_neighbor); ospf_free_neighbor_database_summary_list (sptr_neighbor); ospf_free_neighbor_ls_request_list (sptr_neighbor); /* At this point in time neighbor must be already removed from list */ table_free ((void*) sptr_neighbor); sptr_neighbor = NULL; return;}/********************************************************************************************************************************/void ospf_search_ls_database_and_remove_neighbor_from_that_lsas_neighbor_retx_list_on_event_neighbor_down (OSPF_NEIGHBOR* sptr_neighbor){ ULONG ls_type; ULONG index; OSPF_LS_DATABASE_ENTRY *sptr_ls_database_entry; OSPF_LS_DATABASE_ENTRY *sptr_next_ls_database_entry; OSPF_LS_DATABASE_HEAD *sptr_ls_database_head; OSPF_NEIGHBOR_LIST *sptr_neighbor_node; OSPF_NEIGHBOR_LIST *sptr_next_neighbor_node; OSPF_NEIGHBOR *sptr_neighbor_on_retrans_list; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_search_ls_database_and_remove_neighbor_from_that_lsas_neighbor_retx_list_on_event_neighbor_down\r\n");#if !defined (__NSSA__) for (ls_type = OSPF_LS_ROUTER; ls_type <= OSPF_LS_AS_EXTERNAL; ++ls_type) /* for each type of advertisement */#else for (ls_type = OSPF_LS_ROUTER; ls_type <= OSPF_LS_TYPE_7; ++ls_type) /* for each type of advertisement */#endif /*__NSSA__*/ {#if defined (__NSSA__) if (ls_type == OSPF_LS_MULTICAST ) continue;#endif /*__NSSA__*/ for (index = 0x00000000L, sptr_ls_database_head = &(sptr_neighbor->sptr_interface->sptr_area->ls_database_hash_table[ls_type][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_neighbor->sptr_interface->sptr_area->ls_database_hash_table[ls_type][index])) { /* SPR#76812 */ for (sptr_ls_database_entry = sptr_ls_database_head->sptr_linear_database_entry; sptr_ls_database_entry != NULL; sptr_ls_database_entry = sptr_next_ls_database_entry) { sptr_next_ls_database_entry = sptr_ls_database_entry->sptr_forward_link; for (sptr_neighbor_node = sptr_ls_database_entry->sptr_ls_database_retrans; sptr_neighbor_node != NULL; sptr_neighbor_node = sptr_next_neighbor_node ) { sptr_next_neighbor_node = sptr_neighbor_node->sptr_forward_link; sptr_neighbor_on_retrans_list = sptr_neighbor_node->sptr_neighbor; if ( sptr_neighbor_on_retrans_list == sptr_neighbor) { ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_ls_database_entry->sptr_ls_database_retrans), (OSPF_GENERIC_NODE *) sptr_neighbor_node); table_free ((void *) sptr_neighbor_node); sptr_neighbor_node = NULL; } } } } } /* Check for external lsdb */ for (index = 0x00000000L, sptr_ls_database_head = &(ospf.external_database_hash_table[LS_EXTERNAL_LSA][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(ospf.external_database_hash_table[LS_EXTERNAL_LSA][index])) { if (sptr_ls_database_head == NULL) { continue; } /* SPR#76812 */ for (sptr_ls_database_entry = sptr_ls_database_head->sptr_linear_database_entry; sptr_ls_database_entry != NULL; sptr_ls_database_entry = sptr_next_ls_database_entry) { sptr_next_ls_database_entry = sptr_ls_database_entry->sptr_forward_link; for (sptr_neighbor_node = sptr_ls_database_entry->sptr_ls_database_retrans; sptr_neighbor_node != NULL; sptr_neighbor_node = sptr_next_neighbor_node ) { sptr_next_neighbor_node = sptr_neighbor_node->sptr_forward_link; sptr_neighbor_on_retrans_list = sptr_neighbor_node->sptr_neighbor; if ( sptr_neighbor_on_retrans_list == sptr_neighbor) { ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_ls_database_entry->sptr_ls_database_retrans), (OSPF_GENERIC_NODE *) sptr_neighbor_node); table_free ((void *) sptr_neighbor_node); sptr_neighbor_node = NULL; } } } } /* opaque lsa scan through opaque lsdb jkw */#if defined (__OPAQUE_LSA__) for (ls_type = TYPE_9_LSA; ls_type <= TYPE_11_LSA; ++ls_type) /* for each type of advertisement */ { for (index = 0x00000000L, sptr_ls_database_head = &(sptr_neighbor->sptr_interface->sptr_area->opaque_ls_database_hash_table[ls_type][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_neighbor->sptr_interface->sptr_area->opaque_ls_database_hash_table[ls_type][index])) { /* SPR#76812 */ for (sptr_ls_database_entry = sptr_ls_database_head->sptr_linear_database_entry; sptr_ls_database_entry != NULL; sptr_ls_database_entry = sptr_next_ls_database_entry) { sptr_next_ls_database_entry = sptr_ls_database_entry->sptr_forward_link; for (sptr_neighbor_node = sptr_ls_database_entry->sptr_ls_database_retrans; sptr_neighbor_node != NULL; sptr_neighbor_node = sptr_next_neighbor_node ) { sptr_next_neighbor_node = sptr_neighbor_node->sptr_forward_link; sptr_neighbor_on_retrans_list = sptr_neighbor_node->sptr_neighbor; if ( sptr_neighbor_on_retrans_list == sptr_neighbor) { ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_ls_database_entry->sptr_ls_database_retrans), (OSPF_GENERIC_NODE *) sptr_neighbor_node); table_free ((void *) sptr_neighbor_node); sptr_neighbor_node = NULL; } } } } } /* Check for type 11 lsdb */ for (index = 0x00000000L, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index])) { if (sptr_ls_database_head == NULL) { continue; } /* SPR#76812 */ for (sptr_ls_database_entry = sptr_ls_database_head->sptr_linear_database_entry; sptr_ls_database_entry != NULL; sptr_ls_database_entry = sptr_next_ls_database_entry) { sptr_next_ls_database_entry = sptr_ls_database_entry->sptr_forward_link; for (sptr_neighbor_node = sptr_ls_database_entry->sptr_ls_database_retrans; sptr_neighbor_node != NULL; sptr_neighbor_node = sptr_next_neighbor_node ) { sptr_next_neighbor_node = sptr_neighbor_node->sptr_forward_link; sptr_neighbor_on_retrans_list = sptr_neighbor_node->sptr_neighbor; if ( sptr_neighbor_on_retrans_list == sptr_neighbor) { ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_ls_database_entry->sptr_ls_database_retrans), (OSPF_GENERIC_NODE *) sptr_neighbor_node); table_free ((void *) sptr_neighbor_node); sptr_neighbor_node = NULL; } } } }#endif /* __OPAQUE_LSA__ */ return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -