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

📄 ospf_routing_table.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
    if (I_am_an_area_border_router == TRUE)        {        for (sptr_area = ospf.sptr_area_list; sptr_area != NULL; sptr_area = sptr_next_area)            {            sptr_next_area = sptr_area->sptr_forward_link;            if (sptr_area->flags._bit.nssa == TRUE)                if ( ospf.router_id >= sptr_area->nssa_abr_to_convert_type_7_to_type_5)                    ospf_translate_type_7_routes_into_type_5_lsa ();            }        }#endif /*__NSSA__*/    ospf_display_routing_table ();    ospf_generate_events_due_to_routing_table_changes (sptr_old_routing_table_head);                    /* section 16.7 (page 163-164) */    /* SPR#76812 -- Begin */	for(table_type = OSPF_ROUTE_TABLE_NETWORK; table_type < OSPF_ROUTE_TABLE_MAX; table_type++)	{		for(index = 0x00000000L; index < OSPF_RT_HASH_TABLE_SIZE; index++)		{			if(sptr_old_routing_table_head[table_type][index] != NULL)			{		    	ospf_free_routing_table_nodes (sptr_old_routing_table_head[table_type][index]);		    	ospf.sptr_old_routing_table[table_type][index] = NULL;			}		}	}    /* SPR#76812 -- End */    for (sptr_area = ospf.sptr_area_list; sptr_area != NULL; sptr_area = sptr_next_area)        {        sptr_next_area = sptr_area->sptr_forward_link;        if (sptr_area->bring_up_virtual_links == TRUE  )            {            ospf_bring_up_virtual_links_if_necessary (sptr_area);            sptr_area->bring_up_virtual_links = FALSE;            }        }    OSPF_PRINTF_ROUTING_TABLE (OSPF_ROUTING_TABLE_PRINTF, "OSPF: ----->>>>> Completed building the Routing Table And generated Appropriate events ---------------------\r\n");#if defined __OSPF_DEBUG__    ospf_print_areas_and_lsas ();#endif    return;    }/**********************************************************************************************************************************/static OSPF_TRANSIT_AREA_ENTRY *ospf_create_transit_area_list (void)    {    OSPF_TRANSIT_AREA_ENTRY *sptr_transit_list;    OSPF_AREA_ENTRY *sptr_area = NULL;    OSPF_AREA_ENTRY *sptr_next_area = NULL;    OSPF_TRANSIT_AREA_ENTRY *sptr_transit_entry;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_create_transit_area_list\r\n");    sptr_transit_list = NULL;    for (sptr_area = ospf.sptr_area_list; sptr_area != NULL; sptr_area = sptr_next_area)        {        sptr_next_area = sptr_area->sptr_forward_link;        if (sptr_area->flags._bit.transit == TRUE)            {            sptr_transit_entry = (OSPF_TRANSIT_AREA_ENTRY *) table_malloc (1, sizeof (OSPF_TRANSIT_AREA_ENTRY));            if (sptr_transit_entry == NULL)                {                ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_TRANSIT_AREA_ENTRY");                continue;                }            memset (sptr_transit_entry, 0x00, sizeof (OSPF_TRANSIT_AREA_ENTRY));            sptr_transit_entry->sptr_forward_link = NULL;            sptr_transit_entry->sptr_backward_link = NULL;            sptr_transit_entry->sptr_area = sptr_area;            if (sptr_transit_list == NULL)                {                sptr_transit_list = sptr_transit_entry;                }            else                {                ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) sptr_transit_entry, (OSPF_GENERIC_NODE *) sptr_transit_list);                }            }        }    return(sptr_transit_list);    }/*******************************************************************************//* section 16.3 of OSPF specification (page 158) */static void ospf_examine_transit_areas_for_better_paths (OSPF_TRANSIT_AREA_ENTRY *sptr_transit_list, OSPF_AREA_ENTRY *sptr_area)    {    OSPF_TRANSIT_AREA_ENTRY *sptr_transit_entry;    OSPF_ADVERTISEMENT_NODE *sptr_advertisement_node;    OSPF_AREA_ENTRY *sptr_transit_area;    PARAMETER_NOT_USED (sptr_area);    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_examine_transit_areas_for_better_paths\r\n");    for (sptr_transit_entry = sptr_transit_list; sptr_transit_entry != NULL; sptr_transit_entry = sptr_transit_entry->sptr_forward_link)        {        for (sptr_advertisement_node = sptr_transit_entry->sptr_area->sptr_summary_advertisement_list_head;            sptr_advertisement_node != NULL;    sptr_advertisement_node = sptr_advertisement_node->sptr_forward_link)            {            sptr_transit_area = sptr_transit_entry->sptr_area;            ospf_examine_a_single_destination_for_a_better_path (sptr_advertisement_node, sptr_transit_area /*#$-NOTE:note41-$# */ );            }        }    return;    }void ospf_examine_a_single_destination_for_a_better_path     (    OSPF_ADVERTISEMENT_NODE *sptr_advertisement_node,    OSPF_AREA_ENTRY *sptr_area    )    {    ULONG tos0_metric;    USHORT age;    ULONG advertising_router;    ULONG destination_N;    OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_N;    OSPF_ROUTING_TABLE_NODE *sptr_routing_table_node_for_N;    OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_N_saved;    ULONG area_border_router_BR;    OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_BR;    ULONG cost_IAC;    ULONG area_id;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_examine_a_single_destination_for_a_better_path\r\n");    sptr_routing_table_entry_for_N = NULL;    sptr_routing_table_entry_for_N_saved = NULL;    tos0_metric = net_to_host_long (sptr_advertisement_node->advertisement.sptr_summary->tos0_metric);    tos0_metric = tos0_metric & OSPF_LSInfinity;    age = net_to_host_short (sptr_advertisement_node->advertisement.sptr_summary->ls_header.age);    advertising_router = net_to_host_long (sptr_advertisement_node->advertisement.sptr_summary->ls_header.advertising_router);    if ((tos0_metric == OSPF_LSInfinity) || (age == OSPF_MAXIMUM_AGE) || (advertising_router == ospf.router_id))        {        return;                                             /* section 16.3, items (1 & 2) (page 158) */        }    destination_N = net_to_host_long (sptr_advertisement_node->advertisement.sptr_summary->ls_header.id);    /* sptr_routing_table_entry_for_N = ospf_find_routing_table_entry (destination_N, OSPF_DESTINATION_TYPE_WILDCARD,        OSPF_ROUTE_PATH_TYPE_WILDCARD, NULL); */    /* Fix for TSR# 297651 (SPR# 83274). Mainly search for any network route with the desired path type which matches       the specified path type. This execludes searching for any network or router route to avoid       the bug that a network/host IP address matches a router ID which causes the new network/host       route not to be installed in ospf routing table*/    sptr_routing_table_node_for_N = ospf_find_router_or_network_routing_table_node (destination_N, sptr_advertisement_node->advertisement.sptr_summary->ls_header.type,                                                                                     OSPF_ROUTE_PATH_TYPE_WILDCARD, NULL);    if (sptr_routing_table_node_for_N != NULL)        {        sptr_routing_table_entry_for_N = sptr_routing_table_node_for_N->sptr_routing_table_entry;        }    if (sptr_advertisement_node->advertisement.sptr_summary->ls_header.type == OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER)        {        sptr_routing_table_entry_for_N_saved = sptr_routing_table_entry_for_N;        sptr_routing_table_entry_for_N = ospf_find_routing_table_entry (destination_N, OSPF_DESTINATION_TYPE_ASBR,                                                                        OSPF_ROUTE_PATH_TYPE_WILDCARD, NULL);        if (sptr_routing_table_entry_for_N == NULL)            {            ospf_calculate_inter_area_routes_for_a_single_summary_advertisement (sptr_advertisement_node, sptr_area, FALSE);            }        sptr_routing_table_entry_for_N = sptr_routing_table_entry_for_N_saved;        if (sptr_routing_table_entry_for_N == NULL)            {            return;            }        }    /*     * If section 16.5 Case 2, (pages 162-163) FAILS because there is no ABR entry at that point and the hack here is necessary.     * Need this here to process Transit areas summary links properly.     */    if (sptr_routing_table_entry_for_N == NULL)        {        ospf_calculate_inter_area_routes_for_a_single_summary_advertisement (sptr_advertisement_node, sptr_area, FALSE);        return;        }    if (sptr_routing_table_entry_for_N->sptr_area != NULL)        {        area_id = sptr_routing_table_entry_for_N->sptr_area->area_id;        }    else        {        area_id = 0xffffffff;        }    if ((sptr_routing_table_entry_for_N == NULL) || ((sptr_routing_table_entry_for_N->path_type != OSPF_ROUTE_PATH_TYPE_INTRA) &&                                                     (sptr_routing_table_entry_for_N->path_type != OSPF_ROUTE_PATH_TYPE_INTER)) ||        (area_id != OSPF_BACKBONE))        {        return;                                             /* section 16.3, item (3) (page 158) */        }    area_border_router_BR = advertising_router;    /* UNH 4.2 start */    /* For an ABR, there are several ABR routing table entries, one ABR routing table     entry for each area the router is attached to.    The function "ospf_find_routing_table_entry" called here for an ABR in a given area     fails to return the proper entry, it returns the ABR entry in another area than the area     passed as parameter. The function is also not optimal for ABR entries as it searches for     longest fit (as appropriate for IP subnets entries) instead of for exact fit     (as appropriate for router entries)    Use "ospf_find_routing_table_entry_for_ABR" function instead, which searches for     ABR entry of a given area (exact fit) */    /*    sptr_routing_table_entry_for_BR = ospf_find_routing_table_entry (area_border_router_BR, OSPF_DESTINATION_TYPE_ABR, OSPF_ROUTE_PATH_TYPE_WILDCARD, sptr_area);    */    sptr_routing_table_entry_for_BR = ospf_find_routing_table_entry_for_ABR( advertising_router, sptr_area->area_id);    /* UNH 4.2 end */    if (sptr_routing_table_entry_for_BR == NULL)        {

⌨️ 快捷键说明

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