📄 ospf_list_utilities.c
字号:
sptr_retransmission_node->sptr_ls_database_entry->advertisement.sptr_router->ls_header.age = sptr_advertisement->advertisement.sptr_router->ls_header.age; length = net_to_host_short (sptr_advertisement->advertisement.sptr_router->ls_header.length); result = memcmp ( sptr_retransmission_node->sptr_ls_database_entry->advertisement.sptr_router, sptr_advertisement->advertisement.sptr_router, (size_t) length); if ( result == 0 ) { sptr_retransmission_node->sptr_ls_database_entry->advertisement.sptr_router->ls_header.age = old_age; return (sptr_retransmission_node); } sptr_retransmission_node->sptr_ls_database_entry->advertisement.sptr_router->ls_header.age = old_age; } return (NULL);}/**********************************************************************************************************************************/void ospf_remove_node_from_neighbors_retransmit_queue (OSPF_NEIGHBOR *sptr_neighbor,OSPF_LS_DATABASE_NODE *sptr_retransmission_node){ OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_remove_node_from_neighbors_retransmit_queue\r\n"); if (sptr_retransmission_node != NULL) { ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_neighbor->sptr_retransmit), (OSPF_GENERIC_NODE *) sptr_retransmission_node); table_free ( (void*) sptr_retransmission_node->sptr_ls_database_entry); sptr_retransmission_node->sptr_ls_database_entry = NULL; /* * A copy of the node wass made; when it was out on the neighbor's retransmit que. * So OK to call free. (See ospf_flood.c) */ table_free ((void *) sptr_retransmission_node); sptr_retransmission_node = NULL; --sptr_neighbor->retransmit_queue_count; } return;}/**********************************************************************************************************************************/void ospf_remove_neighbor_from_advertisements_retransmit_list (OSPF_LS_DATABASE_ENTRY *sptr_advertisement,OSPF_NEIGHBOR *sptr_neighbor){ OSPF_NEIGHBOR_LIST *sptr_neighbor_list; OSPF_NEIGHBOR_LIST *sptr_next_neighbor_list; seq_t sequence_number; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_remove_neighbor_from_advertisements_retransmit_list\r\n"); for (sptr_neighbor_list = sptr_advertisement->sptr_ls_database_retrans; sptr_neighbor_list != NULL; sptr_neighbor_list = sptr_next_neighbor_list) { sptr_next_neighbor_list = sptr_neighbor_list->sptr_forward_link; if (sptr_neighbor_list->sptr_neighbor == sptr_neighbor) { ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_advertisement->sptr_ls_database_retrans), (OSPF_GENERIC_NODE *) sptr_neighbor_list); table_free ((void *) sptr_neighbor_list); sptr_neighbor_list = NULL; /* section 12.1.6 (page 109-110) */ if ((sptr_advertisement->ls_database_sequence_state == OSPF_WAITING_FOR_MAXIMUM_SEQUENCE_INSTANCE_TO_BE_FLUSHED) && (sptr_advertisement->sptr_ls_database_retrans == NULL)) { sptr_advertisement->ls_database_sequence_state = OSPF_DONE_FLUSHING_MAXIMUM_SEQUENCE_INSTANCE; /* Fix TSR# 287037 Start */ sequence_number = OSPFMAXLSSEQ; /* was OSPFINVALDLSSEQ */ /* Fix TSR# 287037 End */ sequence_number = host_to_net_long(sequence_number); sptr_advertisement->advertisement.sptr_router->ls_header.sequence_number = sequence_number; ospf_originate_new_instance_of_the_link_state_advertisement (sptr_advertisement, sptr_neighbor->sptr_interface->sptr_area, FALSE); sptr_advertisement->ls_database_sequence_state = OSPF_NORMAL; } return; } } return;}/***********************************************************************************************************************************/void ospf_add_database_entry_to_neighbor_retransmit_list (OSPF_NEIGHBOR *sptr_neighbor,OSPF_LS_DATABASE_ENTRY *sptr_database_entry){ OSPF_LS_DATABASE_NODE *sptr_ls_database_node; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_add_database_entry_to_neighbor_retransmit_list\r\n"); sptr_ls_database_node = (OSPF_LS_DATABASE_NODE *) table_malloc (1, sizeof (OSPF_LS_DATABASE_NODE)); if (sptr_ls_database_node == NULL) { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_LS_DATABASE_NODE"); return; } memset (sptr_ls_database_node, 0x00, sizeof (OSPF_LS_DATABASE_NODE)); sptr_ls_database_node->sptr_ls_database_entry = sptr_database_entry; sptr_ls_database_node->flood = TRUE; sptr_ls_database_node->periodic_retransmit_time_counter = 0x00000000L; if (sptr_neighbor->sptr_retransmit == NULL) { sptr_neighbor->sptr_retransmit = sptr_ls_database_node; sptr_neighbor->sptr_retransmit->sptr_forward_link = NULL; sptr_neighbor->sptr_retransmit->sptr_backward_link = NULL; } else { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) sptr_ls_database_node, (OSPF_GENERIC_NODE *) sptr_neighbor->sptr_retransmit); } ++sptr_neighbor->retransmit_queue_count; return;}/**********************************************************************************************************************************/void ospf_add_neighbor_to_database_retransmit_list (OSPF_LS_DATABASE_ENTRY *sptr_database_entry,OSPF_NEIGHBOR *sptr_neighbor){ OSPF_NEIGHBOR_LIST *sptr_neighbor_list; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_add_neighbor_to_database_retransmit_list\r\n"); sptr_neighbor_list = (OSPF_NEIGHBOR_LIST *) table_malloc (1, sizeof (OSPF_NEIGHBOR_LIST)); if (sptr_neighbor_list == NULL) { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_NEIGHBOR_LIST"); return; } memset (sptr_neighbor_list, 0x00, sizeof (OSPF_NEIGHBOR_LIST)); sptr_neighbor_list->sptr_neighbor = sptr_neighbor; if (sptr_database_entry->sptr_ls_database_retrans == NULL) { sptr_database_entry->sptr_ls_database_retrans = sptr_neighbor_list; sptr_database_entry->sptr_ls_database_retrans->sptr_forward_link = NULL; sptr_database_entry->sptr_ls_database_retrans->sptr_backward_link = NULL; } else { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) sptr_neighbor_list, (OSPF_GENERIC_NODE *) sptr_database_entry->sptr_ls_database_retrans); } return;}/**********************************************************************************************************************************/void ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (OSPF_LS_DATABASE_ENTRY *sptr_advertisement){ OSPF_NEIGHBOR_LIST *sptr_neighbor_list; OSPF_NEIGHBOR_LIST *sptr_next_neighbor_list; OSPF_LS_DATABASE_NODE *sptr_retransmission_node; /* remove from all neighbors' lists */ OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement\r\n"); for (sptr_neighbor_list = sptr_advertisement->sptr_ls_database_retrans; sptr_neighbor_list != NULL; sptr_neighbor_list = sptr_next_neighbor_list) { sptr_next_neighbor_list = sptr_neighbor_list->sptr_forward_link; /* remove from neighbor list */ sptr_retransmission_node = ospf_find_advertisement_on_neighbors_retransmit_list (sptr_neighbor_list->sptr_neighbor, sptr_advertisement); if (sptr_retransmission_node != NULL) { ospf_remove_node_from_neighbors_retransmit_queue (sptr_neighbor_list->sptr_neighbor, sptr_retransmission_node); } ospf_neighbors_remove_all_advertisement_from_transmit_list (sptr_neighbor_list->sptr_neighbor, sptr_advertisement); /* remove from ls_database's neighbor list */ ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_advertisement->sptr_ls_database_retrans), (OSPF_GENERIC_NODE *) sptr_neighbor_list); table_free ((void *) sptr_neighbor_list); sptr_neighbor_list = NULL; } sptr_advertisement->sptr_ls_database_retrans = NULL; return;}/**********************************************************************************************************************************/static void ospf_neighbors_remove_all_advertisement_from_transmit_list (OSPF_NEIGHBOR *sptr_neighbor, OSPF_LS_DATABASE_ENTRY *sptr_advertisement){ OSPF_LS_DATABASE_NODE *sptr_retransmission_node; OSPF_LS_DATABASE_NODE *sptr_next_retransmission_node; int result; int count; USHORT saved_age; USHORT length; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_neighbors_remove_all_advertisement_from_transmit_list\r\n"); sptr_retransmission_node = NULL; sptr_next_retransmission_node = NULL; result = 0x0000; saved_age = 0x0000; length = 0x0000; count = 0x0000; for (sptr_retransmission_node = sptr_neighbor->sptr_retransmit; sptr_retransmission_node != NULL; sptr_retransmission_node = sptr_next_retransmission_node) { sptr_next_retransmission_node =sptr_retransmission_node->sptr_forward_link; saved_age = sptr_retransmission_node->sptr_ls_database_entry->advertisement.sptr_router->ls_header.age; sptr_retransmission_node->sptr_ls_database_entry->advertisement.sptr_router->ls_header.age = sptr_advertisement->advertisement.sptr_router->ls_header.age; length = sptr_advertisement->advertisement.sptr_router->ls_header.length; length = (USHORT)(net_to_host_short ((USHORT)length)); result = memcmp ( sptr_retransmission_node->sptr_ls_database_entry->advertisement.sptr_router, sptr_advertisement->advertisement.sptr_router, (size_t) length); sptr_retransmission_node->sptr_ls_database_entry->advertisement.sptr_router->ls_header.age = saved_age; if ( result == 0 ) { ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_neighbor->sptr_retransmit), (OSPF_GENERIC_NODE *) sptr_retransmission_node); /* remove from neighbor's retransmit list */ table_free ( (void*) sptr_retransmission_node->sptr_ls_database_entry); sptr_retransmission_node->sptr_ls_database_entry = NULL; table_free ((void *) sptr_retransmission_node); sptr_retransmission_node = NULL; ++count; } } /*for*/ return ;}/***************************************************************************************//* section 13, item (5c) - (page 134) */void ospf_remove_current_database_copy_from_all_neighbors_retransmission_lists (OSPF_LS_DATABASE_ENTRY *sptr_database_entry, OSPF_INTERFACE *sptr_interface){ OSPF_NEIGHBOR *sptr_neighbor_to_act_on = NULL; OSPF_NEIGHBOR *sptr_next_neighbor_to_act_on = NULL; OSPF_LS_DATABASE_NODE *sptr_retransmission_node = NULL; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_remove_current_database_copy_from_all_neighbors_retransmission_lists\r\n"); if (sptr_interface == NULL) { return; } for (sptr_neighbor_to_act_on = sptr_interface->sptr_neighbor; sptr_neighbor_to_act_on != NULL; sptr_neighbor_to_act_on = sptr_next_neighbor_to_act_on) { sptr_next_neighbor_to_act_on = sptr_neighbor_to_act_on->sptr_forward_link; ospf_remove_neighbor_from_advertisements_retransmit_list (sptr_database_entry, sptr_neighbor_to_act_on); sptr_retransmission_node = ospf_find_advertisement_on_neighbors_retransmit_list (sptr_neighbor_to_act_on, sptr_database_entry); if (sptr_retransmission_node != NULL) { ospf_remove_node_from_neighbors_retransmit_queue (sptr_neighbor_to_act_on, sptr_retransmission_node); } } return;}/**********************************************************************************************************************************/void ospf_remove_all_database_pointers_from_neighbor_retransmit_list (OSPF_NEIGHBOR *sptr_neighbor){ OSPF_LS_DATABASE_NODE *sptr_retransmission_node; OSPF_LS_DATABASE_NODE *sptr_next_retransmission_node; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_remove_all_database_pointers_from_neighbor_retransmit_list\r\n"); if ( sptr_neighbor == NULL ) return; for (sptr_retransmission_node = sptr_neighbor->sptr_retransmit; sptr_retransmission_node != NULL; sptr_retransmission_node = sptr_next_retransmission_node) { sptr_next_retransmission_node = sptr_retransmission_node->sptr_forward_link; ospf_remove_neighbor_from_advertisements_retransmit_list (sptr_retransmission_node->sptr_ls_database_entry, sptr_neighbor); /* remove from ls_database */ ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_neighbor->sptr_retransmit), (OSPF_GENERIC_NODE *) sptr_retransmission_node); /* remove from neighbor's retransmit list */ table_free ( (void*) sptr_retransmission_node->sptr_ls_database_entry); sptr_retransmission_node->sptr_ls_database_entry = NULL; table_free ((void *) sptr_retransmission_node); sptr_retransmission_node = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -