📄 ospf_shortest_path_calculation.c
字号:
{ return (PASS); }}/*************************************************************************************//* section 16.1, stage 2, item (1) (p 154) */static enum TEST ospf_examine_distance_of_stub_network (OSPF_ROUTER_LINK_PIECE *sptr_link,OSPF_SHORTEST_PATH_NODE *sptr_vertex_V, ULONG *ulptr_cost_D,OSPF_ROUTING_TABLE_NODE **ptr_to_sptr_routing_table_node){ USHORT tos0_metric; ULONG link_id; OSPF_ROUTING_TABLE_ENTRY* sptr_routing_table_entry; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_examine_distance_of_stub_network\r\n"); tos0_metric = sptr_link->tos0_metric; tos0_metric = net_to_host_short (tos0_metric); *ulptr_cost_D = sptr_vertex_V->cost + tos0_metric; link_id = sptr_link->link_id; link_id = net_to_host_long (link_id); OSPF_PRINTF_ROUTING_TABLE (OSPF_DEBUG_PRINTF, "-------->>>>>>>>>>>> (Fn ospf_examine_distance_of_stub_network ) Examining stub link: link_id:%lx \n", link_id); /* Fix for TSR 297651 (SPR# 83274) */ *ptr_to_sptr_routing_table_node = ospf_find_router_or_network_routing_table_node (link_id, OSPF_LS_NETWORK, OSPF_ROUTE_PATH_TYPE_WILDCARD, NULL); if (*ptr_to_sptr_routing_table_node != NULL) { sptr_routing_table_entry = (*ptr_to_sptr_routing_table_node)->sptr_routing_table_entry; } else { sptr_routing_table_entry = NULL; } if (sptr_routing_table_entry != NULL) { if (*ulptr_cost_D > sptr_routing_table_entry->path_cost) { return (FAIL); } } return (PASS);}/**********************************************************************************************************************************/static OSPF_SHORTEST_PATH_NODE *ospf_create_stub_vertex (ULONG vertex,OSPF_LS_DATABASE_ENTRY *sptr_database_entry,ULONG cost_D, OSPF_SHORTEST_PATH_NODE *sptr_vertex_V, OSPF_AREA_ENTRY *sptr_area){ OSPF_SHORTEST_PATH_NODE *sptr_vertex_stub; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_create_stub_vertex\r\n"); sptr_vertex_stub = (OSPF_SHORTEST_PATH_NODE *) table_malloc (1, sizeof (OSPF_SHORTEST_PATH_NODE)); if (sptr_vertex_stub == NULL) { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_SHORTEST_PATH_NODE"); return (NULL); } memset (sptr_vertex_stub, 0x00, sizeof (OSPF_SHORTEST_PATH_NODE)); sptr_vertex_stub->sptr_forward_link = NULL; sptr_vertex_stub->sptr_backward_link = NULL; sptr_vertex_stub->vertex = vertex; sptr_vertex_stub->vertex = net_to_host_long (sptr_vertex_stub->vertex); sptr_vertex_stub->sptr_database_entry = sptr_database_entry; sptr_vertex_stub->cost = cost_D; ospf_set_intervening_router (sptr_vertex_V, sptr_vertex_stub, sptr_area, NULL); OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Setting intervening router for stub vertex:%lx \n", vertex); return (sptr_vertex_stub);}/*************************************************************************************//* section 16.1, stage 2, item (2) (p 154) */static OSPF_ROUTING_TABLE_ENTRY *ospf_set_routing_table_entry_for_stub_network (OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry, OSPF_SHORTEST_PATH_NODE *sptr_vertex_stub,OSPF_AREA_ENTRY *sptr_area,OSPF_SHORTEST_PATH_NODE *sptr_vertex_V, OSPF_ROUTER_LINK_PIECE *sptr_link){ OSPF_ROUTING_TABLE_NODE *sptr_routing_table_node; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_set_routing_table_entry_for_stub_network\r\n"); sptr_routing_table_entry = ospf_create_routing_table_entry_for_stub_network (sptr_vertex_stub, sptr_vertex_V, sptr_area, sptr_link); if (sptr_routing_table_entry != NULL) { OSPF_PRINTF_ROUTING_TABLE (OSPF_ROUTING_TABLE_PRINTF, "----->>>>> Adding intra stub network (ospf_set_routing_table_entry_for_stub_network ): %lx, vertex V:%lx \n", sptr_routing_table_entry->destination_id, sptr_vertex_V->vertex); sptr_routing_table_node = (OSPF_ROUTING_TABLE_NODE *) table_malloc (1, sizeof (OSPF_ROUTING_TABLE_NODE)); if (sptr_routing_table_node != NULL) { memset (sptr_routing_table_node, 0x00, sizeof (OSPF_ROUTING_TABLE_NODE)); sptr_routing_table_node->sptr_forward_link = NULL; sptr_routing_table_node->sptr_backward_link = NULL; sptr_routing_table_node->active_areas_discarded_entry = FALSE; sptr_routing_table_node->sptr_routing_table_entry = sptr_routing_table_entry; /* SPR#76812 -- Begin */ ospf_add_routing_table_node (sptr_routing_table_node); /* SPR#76812 -- End */ } else { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_ROUTING_TABLE_NODE"); } } else { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_ROUTING_TABLE_ENTRY"); } return (sptr_routing_table_entry);}/**********************************************************************************************************************************/static OSPF_ROUTING_TABLE_ENTRY *ospf_update_routing_table_entry_for_stub_network (OSPF_ROUTING_TABLE_NODE *sptr_routing_table_node, OSPF_SHORTEST_PATH_NODE *sptr_vertex_stub,OSPF_AREA_ENTRY *sptr_area,OSPF_SHORTEST_PATH_NODE *sptr_vertex_V,ULONG cost_D){ OSPF_NEXT_HOP_BLOCK *sptr_next_hop; OSPF_ROUTING_TABLE_ENTRY* sptr_routing_table_entry; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_update_routing_table_entry_for_stub_network\r\n"); sptr_routing_table_entry = sptr_routing_table_node->sptr_routing_table_entry; OSPF_PRINTF_ROUTING_TABLE (OSPF_ROUTING_TABLE_PRINTF, "----->>>>> Adding intra area stub network (ospf_update_routing_table_entry_for_stub_network): %lx, vertex_V:%lx \n", sptr_routing_table_entry->destination_id, sptr_vertex_V->vertex); sptr_next_hop = NULL; if (cost_D == sptr_routing_table_entry->path_cost) { OSPF_PRINTF_ROUTING_TABLE (OSPF_ROUTING_TABLE_PRINTF, "OSPF: Updating stub network (ospf_update_routing_table_entry_for_stub_network ): %lx (equal cost next hops)\n", sptr_routing_table_entry->destination_id); if (ospf_get_new_next_hop_blocks_and_mark_ospf_rt_node_new (sptr_routing_table_node, sptr_vertex_stub->sptr_next_hop, &sptr_next_hop) == TRUE) { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) sptr_next_hop, ((OSPF_GENERIC_NODE *) (sptr_routing_table_node->sptr_routing_table_entry->sptr_next_hop)) ); } if ((sptr_routing_table_entry->link_type == OSPF_LS_ROUTER) && (sptr_vertex_V->vertex > sptr_routing_table_entry->link_state_id)) { if (sptr_vertex_V->vertex != ospf.router_id) { sptr_routing_table_entry->sptr_link_state_origin = &sptr_vertex_V->sptr_database_entry->advertisement; sptr_routing_table_entry->link_state_id = net_to_host_long ( sptr_vertex_V->sptr_database_entry->advertisement.sptr_router->ls_header.id); sptr_routing_table_entry->link_type = sptr_vertex_V->sptr_database_entry->advertisement.sptr_router->ls_header.type; } else { sptr_routing_table_entry->sptr_link_state_origin = NULL; sptr_routing_table_entry->link_state_id = host_to_net_long (ospf.router_id); sptr_routing_table_entry->link_type = OSPF_LS_ROUTER; } } } else if (cost_D < sptr_routing_table_entry->path_cost) /* cost_D < sptr_routing_table_entry->path_cost */ { if (sptr_routing_table_entry->sptr_next_hop != NULL) { ospf_free_entire_list ((OSPF_GENERIC_NODE *) sptr_routing_table_entry->sptr_next_hop); /* Jack July 7/31 ### inher rt_entry not mallocked */ } sptr_routing_table_entry->sptr_next_hop = ospf_inherit_the_set_of_next_hops_from_node_X (sptr_vertex_stub->sptr_next_hop); if (sptr_routing_table_entry->sptr_next_hop == NULL) { sptr_routing_table_entry->sptr_next_hop = ospf_set_outgoing_interface_for_a_locally_attached_stub_network (sptr_routing_table_entry, sptr_area); if (sptr_routing_table_entry->sptr_next_hop == NULL) { table_free (sptr_routing_table_entry); sptr_routing_table_entry = NULL; return (NULL); } } sptr_routing_table_entry->path_cost = cost_D; if (sptr_vertex_V->vertex != ospf.router_id) { sptr_routing_table_entry->sptr_link_state_origin = &sptr_vertex_V->sptr_database_entry->advertisement; sptr_routing_table_entry->link_state_id = net_to_host_long ( sptr_vertex_V->sptr_database_entry->advertisement.sptr_router->ls_header.id); sptr_routing_table_entry->link_type = sptr_vertex_V->sptr_database_entry->advertisement.sptr_router->ls_header.type; } else { sptr_routing_table_entry->sptr_link_state_origin = NULL; sptr_routing_table_entry->link_state_id = host_to_net_long (ospf.router_id); sptr_routing_table_entry->link_type = OSPF_LS_ROUTER; } } /* sptr_routing_table_entry->sptr_area ; ### JACK ----- was about to add this on 7/8/1998 why */ sptr_routing_table_entry->sptr_area = sptr_area; sptr_routing_table_entry->path_type = OSPF_ROUTE_PATH_TYPE_INTRA; sptr_routing_table_entry->abr = ospf_check_if_area_border_router(); return (sptr_routing_table_entry);}/**********************************************************************************************************************************/static OSPF_ROUTING_TABLE_ENTRY *ospf_create_routing_table_entry_for_stub_network (OSPF_SHORTEST_PATH_NODE *sptr_vertex_stub, OSPF_SHORTEST_PATH_NODE *sptr_vertex_V,OSPF_AREA_ENTRY *sptr_area, OSPF_ROUTER_LINK_PIECE *sptr_link){ OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_create_routing_table_entry_for_stub_network\r\n"); sptr_routing_table_entry = (OSPF_ROUTING_TABLE_ENTRY *) table_malloc (1, sizeof (OSPF_ROUTING_TABLE_ENTRY)); if (sptr_routing_table_entry != NULL) { memset (sptr_routing_table_entry, 0x00, sizeof (OSPF_ROUTING_TABLE_ENTRY)); sptr_routing_table_entry->destination_type = OSPF_DESTINATION_TYPE_NETWORK; sptr_routing_table_entry->destination_id = sptr_link->link_id; sptr_routing_table_entry->destination_id = net_to_host_long (sptr_routing_table_entry->destination_id); sptr_routing_table_entry->address_mask = net_to_host_long (sptr_link->link_data); sptr_routing_table_entry->optional_capabilities = sptr_vertex_stub->sptr_database_entry->advertisement.sptr_router->ls_header.options; sptr_routing_table_entry->type_of_service._byte = 0x00; sptr_routing_table_entry->sptr_area = sptr_area; sptr_routing_table_entry->path_type = OSPF_ROUTE_PATH_TYPE_INTRA; sptr_routing_table_entry->path_cost = sptr_vertex_stub->cost; sptr_routing_table_entry->abr = ospf_check_if_area_border_router(); sptr_routing_table_entry->type2_cost = 0x00; if (sptr_vertex_V->vertex != ospf.router_id) { sptr_routing_table_entry->sptr_link_state_origin = &sptr_vertex_V->sptr_database_entry->advertisement; sptr_routing_table_entry->link_state_id = net_to_host_long ( sptr_vertex_V->sptr_database_entry->advertisement.sptr_router->ls_header.id); sptr_routing_table_entry->link_type = sptr_vertex_V->sptr_database_entry->advertisement.sptr_router->ls_header.type; } else { sptr_routing_table_entry->sptr_link_state_origin = NULL; sptr_routing_table_entry->link_state_id = host_to_net_long (ospf.router_id); /*#$-NOTE:lcomeback-$#*/ sptr_routing_table_entry->link_type = OSPF_LS_ROUTER; } sptr_routing_table_entry->sptr_next_hop = ospf_inherit_the_set_of_next_hops_from_node_X (sptr_vertex_stub->sptr_next_hop); if (sptr_routing_table_entry->sptr_next_hop == NULL) { sptr_routing_table_entry->sptr_next_hop = ospf_set_outgoing_interface_for_a_locally_attached_stub_network (sptr_routing_table_entry, sptr_area); } if (sptr_routing_table_entry->sptr_next_hop == NULL) /* NOT LOCALLY ATTACHED BUT STILL NEXT_HOP is NULL - something is wrong ### JACK 6/29 PARICIA FIXES*/ { table_free (sptr_routing_table_entry); sptr_routing_table_entry = NULL; return (NULL); } if (sptr_vertex_V->sptr_database_entry == NULL) /* this is the root vertex */ { sptr_routing_table_entry->advertising_router = sptr_vertex_V->vertex; } else { sptr_routing_table_entry->advertising_router = sptr_vertex_V->sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router; sptr_routing_table_entry->advertising_router = net_to_host_long (sptr_routing_table_entry->advertising_router); } } else { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_ROUTING_TABLE_ENTRY"); } return (sptr_routing_table_entry);}/**********************************************************************************************************************************/enum TEST ospf_check_if_link_exists (UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement,ULONG vertex,OSPF_AREA_ENTRY *sptr_area){ char print_buffer[PRINT_BUFFER_SIZE]; OSPF_NETWORK_LINK_PIECE *sptr_network_link;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -