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

📄 ospf_external_route_calculation.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 4 页
字号:
** <sptr_external> External link state advertisement** RETURNS: N/A** ERRNO: N/A** NOMANUAL*/static void ospf_invalidate_external_route_entry (OSPF_EXTERNAL_LINK_ADVERTISEMENT_HEADER *sptr_external){    ULONG destination_N =0;    ULONG   tos0_metric =0;    OSPF_ROUTING_TABLE_NODE *sptr_routing_table_node =NULL;    ULONG advertising_router_from_rxed_advertisement =0;    OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_invalidate_external_route_entry\r\n");    destination_N = net_to_host_long (sptr_external->ls_header.id);    tos0_metric = net_to_host_long (sptr_external->tos0_metric);    advertising_router_from_rxed_advertisement = net_to_host_long (sptr_external->ls_header.advertising_router);    if ( (tos0_metric & OSPF_ASE_bit_E) == OSPF_ASE_bit_E)        {        sptr_routing_table_node = ospf_find_routing_table_node  (destination_N, (enum OSPF_LS_TYPE) sptr_external->ls_header.type,            OSPF_ROUTE_PATH_TYPE_2_EXTERNAL, NULL);  /* NEWRT LOOKUP */        }    else        {        sptr_routing_table_node = ospf_find_routing_table_node (destination_N, (enum OSPF_LS_TYPE) sptr_external->ls_header.type,            OSPF_ROUTE_PATH_TYPE_1_EXTERNAL, NULL); /* NEWRT LOOKUP */        }    if ( (sptr_routing_table_node != NULL) &&        (advertising_router_from_rxed_advertisement == sptr_routing_table_node->sptr_routing_table_entry->advertising_router) )        {        ospf_invalidate_routing_table_entry (sptr_routing_table_node, sptr_external->network_mask, destination_N, NULL);        }}/*************************************************************************** ospf_get_forwarding_address - get forwarding address** This routine will get the forwarding address for the external link state* advertisement.** <advertisement> External advertisement** <sptr_distance_X> Distance of the path** <sptr_routing_table_entry_for_ASBR> Routing table entry for ASBR** RETURNS: OSPF_ROUTING_TABLE_ENTRY * or NULL** ERRNO: N/A** NOMANUAL*//* This function modified to be also used by NSSA type-7 AS External route calculation */static OSPF_ROUTING_TABLE_ENTRY *ospf_get_forwarding_address (UNION_OSPF_LINK_STATE_ADVERTISEMENT *advertisement,ULONG *sptr_distance_X, OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_ASBR){    ULONG tos0_forwarding_address=0;    ULONG network_mask=0;    OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_forwarding_address =NULL;    OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_get_forwarding_address\r\n");    if ((advertisement == NULL ) ||        (advertisement->sptr_external == NULL ) )        return( NULL );    if (advertisement->sptr_external->tos0_forwarding_address != 0x00000000L)        {        if ( advertisement->sptr_router == NULL )            return( NULL );        if (advertisement->sptr_router->ls_header.type == OSPF_LS_AS_EXTERNAL)            {            tos0_forwarding_address = net_to_host_long (advertisement->sptr_external->tos0_forwarding_address);            network_mask = net_to_host_long (advertisement->sptr_external->network_mask);            }/* SPR64092 */#if defined (__NSSA__)        else if (advertisement->sptr_router->ls_header.type == OSPF_LS_TYPE_7)            {            tos0_forwarding_address = net_to_host_long (advertisement->sptr_type_7->tos0_forwarding_address);            network_mask = net_to_host_long (advertisement->sptr_type_7->network_mask);            }#endif /*__NSSA__*//* SPR64092 */        sptr_routing_table_entry_for_forwarding_address = ospf_find_routing_table_entry (tos0_forwarding_address,            OSPF_DESTINATION_TYPE_WILDCARD, OSPF_ROUTE_PATH_TYPE_WILDCARD, NULL);        tos0_forwarding_address = tos0_forwarding_address & network_mask;        if (sptr_routing_table_entry_for_forwarding_address == NULL)            {            *sptr_distance_X = 0x00000000L;            return (NULL);            }        else if ((sptr_routing_table_entry_for_forwarding_address->path_type != OSPF_ROUTE_PATH_TYPE_INTRA) &&  /* an intra area path must therefore exist to this forwarding adress */            (sptr_routing_table_entry_for_forwarding_address->path_type != OSPF_ROUTE_PATH_TYPE_INTER))            {            *sptr_distance_X = 0x00000000L;            return (NULL);            }        else            {            *sptr_distance_X = sptr_routing_table_entry_for_forwarding_address->path_cost;            return (sptr_routing_table_entry_for_forwarding_address);            }        }    else        {        *sptr_distance_X = sptr_routing_table_entry_for_ASBR->path_cost;        return (NULL);        }}/*************************************************************************** ospf_create_and_install_a_new_external_area_path_to_N - create new external path** This routine will create and install a new external path into* the routing table.** <destination_N> External advertisement destination** <sptr_routing_table_entry_for_N> Routing table entry for destination** <advertisement> Advertisement to be installed** <sptr_routing_table_entry_for_forwarding_address> Routing table entry for forwarding address** <sptr_routing_table_entry_for_ASBR> Routing table entry for ASBR** <distance_X> Distance of path** <cost_Y> Cost of link** <on_new_external_lsa_received_path> Boolean to see if new path for external lsa** RETURNS: N/A** ERRNO: N/A** NOMANUAL*/static void ospf_create_and_install_a_new_external_area_path_to_N (ULONG destination_N,OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_N,    UNION_OSPF_LINK_STATE_ADVERTISEMENT *advertisement,OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_forwarding_address,    OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_ASBR,ULONG distance_X,ULONG cost_Y,    enum BOOLEAN on_new_external_lsa_received_path){    OSPF_ROUTING_TABLE_NODE *sptr_routing_table_node =NULL;    OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_create_and_install_a_new_external_area_path_to_N\r\n");    sptr_routing_table_entry_for_N = (OSPF_ROUTING_TABLE_ENTRY *) table_malloc (1, sizeof (OSPF_ROUTING_TABLE_ENTRY));    if (sptr_routing_table_entry_for_N != NULL)        {        memset (sptr_routing_table_entry_for_N, 0x00, sizeof (OSPF_ROUTING_TABLE_ENTRY));        ospf_install_the_external_area_path_to_N (destination_N, sptr_routing_table_entry_for_N, advertisement,            sptr_routing_table_entry_for_forwarding_address, sptr_routing_table_entry_for_ASBR, distance_X, cost_Y);        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->discard_entry */            sptr_routing_table_node->sptr_routing_table_entry = sptr_routing_table_entry_for_N;            PARAMETER_NOT_USED (on_new_external_lsa_received_path);			/* SPR#76812 -- Begin */             ospf_add_routing_table_node (sptr_routing_table_node);            /* Do not write this route to RTM here, it is done by routing table build */            /* SPR#76812 -- End */            }        else            {            ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *)sptr_routing_table_entry_for_N, "OSPF_ROUTING_TABLE_ENTRY");            }        }    else        {        ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *)NULL, "OSPF_ROUTING_TABLE_ENTRY");        }    return;}/*************************************************************************** ospf_install_the_external_area_path_to_N - install new external path** This routine will install a new external path into* the routing table.** <destination_N> External advertisement destination** <sptr_routing_table_entry_for_N> Routing table entry for destination** <advertisement> Advertisement to be installed** <sptr_routing_table_entry_for_forwarding_address> Routing table entry for forwarding address** <sptr_routing_table_entry_for_ASBR> Routing table entry for ASBR** <distance_X> Distance of path** <cost_Y> Cost of link** RETURNS: N/A** ERRNO: N/A** NOMANUAL*//* This function is modified to be also used by type-7 advertisements */static void ospf_install_the_external_area_path_to_N (ULONG destination_N,OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_N,    UNION_OSPF_LINK_STATE_ADVERTISEMENT *advertisement,OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_forwarding_address,    OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry_for_ASBR,ULONG distance_X,ULONG cost_Y){    ULONG tos0_metric = 0x00000000;    ULONG tos0_forwarding_address = 0x00000000;    ULONG forwarding_address = 0x00000000;	OSPF_INTERFACE *sptr_interface;	OSPF_INTERFACE *sptr_next_interface;	bool interface_found = FALSE;    OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_install_the_external_area_path_to_N\r\n");    if ((sptr_routing_table_entry_for_N == NULL) ||        (advertisement == NULL) ||        (advertisement->sptr_router == NULL) ||        (advertisement->sptr_external == NULL))        return;    sptr_routing_table_entry_for_N->destination_type = OSPF_DESTINATION_TYPE_ASE;    sptr_routing_table_entry_for_N->destination_id = destination_N;    sptr_routing_table_entry_for_N->link_type = advertisement->sptr_router->ls_header.type;    if (sptr_routing_table_entry_for_N->link_type == OSPF_LS_AS_EXTERNAL)        {        sptr_routing_table_entry_for_N->address_mask = net_to_host_long (        advertisement->sptr_external->network_mask);        sptr_routing_table_entry_for_N->optional_capabilities = advertisement->sptr_external->ls_header.options;        sptr_routing_table_entry_for_N->advertising_router = net_to_host_long (        advertisement->sptr_external->ls_header.advertising_router);        tos0_metric = net_to_host_long (advertisement->sptr_external->tos0_metric);        tos0_forwarding_address = advertisement->sptr_external->tos0_forwarding_address;        }#if defined (__NSSA__)    else if (sptr_routing_table_entry_for_N->link_type == OSPF_LS_TYPE_7)        {        sptr_routing_table_entry_for_N->address_mask = net_to_host_long (        advertisement->sptr_type_7->network_mask);        sptr_routing_table_entry_for_N->optional_capabilities = advertisement->sptr_type_7->ls_header.options;        sptr_routing_table_entry_for_N->advertising_router = net_to_host_long (        advertisement->sptr_type_7->ls_header.advertising_router);        tos0_metric = net_to_host_long (advertisement->sptr_type_7->tos0_metric);        tos0_forwarding_address = advertisement->sptr_type_7->tos0_forwarding_address;        }#endif /*__NSSA__*/    sptr_routing_table_entry_for_N->type_of_service._byte = 0x00;    /*sptr_routing_table_entry_for_N->sptr_area = NULL;*/	/* Fixing the page fault in the function ospf_translate_type_7_routes_into_type_5_lsa() */    sptr_routing_table_entry_for_N->sptr_area = sptr_routing_table_entry_for_ASBR->sptr_area;    sptr_routing_table_entry_for_N->type_5_route_originated = (BYTE_ENUM (BOOLEAN))FALSE;    sptr_routing_table_entry_for_N->sptr_link_state_origin = advertisement;    sptr_routing_table_entry_for_N->link_state_id = net_to_host_long (            advertisement->sptr_router->ls_header.id);    if ((tos0_forwarding_address != 0x00000000L) && (sptr_routing_table_entry_for_forwarding_address != NULL))        {        if (sptr_routing_table_entry_for_N->sptr_next_hop != NULL)            {            ospf_free_entire_list ((OSPF_GENERIC_NODE *) sptr_routing_table_entry_for_N->sptr_next_hop); /* ### inher rt_entry not mallocked */            }        sptr_routing_table_entry_for_N->sptr_next_hop =            ospf_inherit_the_set_of_next_hops_from_node_X (sptr_routing_table_entry_for_forwarding_address->sptr_next_hop);		if (sptr_routing_table_entry_for_N->sptr_next_hop == NULL) /* this was probably a memory allocation failure */			return;		forwarding_address = tos0_forwarding_address;		forwarding_address = net_to_host_long(forwarding_address);		/* if the forwarding address is on a network we are directly connected, only then do we change the next		hop router to be the forwarding address, otherwise we leave the next hop router to be the inherited value		from routing table entry*/		for (sptr_interface = ospf.sptr_interface_list; sptr_interface != NULL; sptr_interface = sptr_next_interface)			{			sptr_next_interface = sptr_interface->sptr_forward_link;			if( (sptr_interface->address & sptr_interface->netmask) == (forwarding_address & sptr_interface->netmask))				{				interface_found = TRUE;				break;				}			}		if (interface_found == TRUE)			{			sptr_routing_table_entry_for_N->sptr_next_hop->next_hop_router = forwarding_address;			}        }    else        {        if (sptr_routing_table_entry_for_N->sptr_next_hop != NULL)            {            ospf_free_entire_list ((OSPF_GENERIC_NODE *) sptr_routing_table_entry_for_N->sptr_next_hop); /*  ### inher rt_entry not mallocked */            }        if (sptr_routing_table_entry_for_ASBR)            {            sptr_routing_table_entry_for_N->sptr_next_hop =                ospf_inherit_the_set_of_next_hops_from_node_X (sptr_routing_table_entry_for_ASBR->sptr_next_hop);            }        }    if ((tos0_metric & OSPF_ASE_bit_E) == OSPF_ASE_bit_E)        {        sptr_routing_table_entry_for_N->path_type = OSPF_ROUTE_PATH_TYPE_2_EXTERNAL;        sptr_routing_table_entry_for_N->path_cost = distance_X;        /* SPR 85050 -- Begin */        sptr_routing_table_entry_for_N->type2_cost = cost_Y;        /* SPR 85050 -- End */        }    else        {

⌨️ 快捷键说明

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