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

📄 ospf_link_state_advertisements.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
    length = OSPF_NETWORK_LINK_ADVERTISEMENT_HEADER_SIZE;    sptr_link->link_id = sptr_interface->designated_router.id;          /* The Designated Router includes itself in the list. */    sptr_link->link_id = host_to_net_long (sptr_link->link_id);    length += OSPF_NETWORK_LINK_PIECE_SIZE;    ++sptr_link;    for (sptr_neighbor = sptr_interface->sptr_neighbor; sptr_neighbor != NULL;  sptr_neighbor = sptr_next_neighbor)        {        sptr_next_neighbor = sptr_neighbor->sptr_forward_link;        if (sptr_neighbor->state == OSPF_NEIGHBOR_FULL)            {            sptr_link->link_id = sptr_neighbor->id;            sptr_link->link_id = host_to_net_long (sptr_link->link_id);            length += OSPF_NETWORK_LINK_PIECE_SIZE;            ++sptr_link;            }        }    sptr_network_link_advertisement->ls_header.length = length;    sptr_network_link_advertisement->ls_header.length = host_to_net_short (sptr_network_link_advertisement->ls_header.length);    sptr_advertisement = (UNION_OSPF_LINK_STATE_ADVERTISEMENT *) table_malloc (1, sizeof (ULONG));    if (sptr_advertisement == NULL)        {        ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) sptr_network_link_advertisement, "UNION_OSPF_LINK_STATE_ADVERTISEMENT");        return;        }    else        {        memset (sptr_advertisement, 0x0, sizeof (ULONG));        }    sptr_advertisement->sptr_network = sptr_network_link_advertisement;    /* SPR#76812 -- Begin */    sptr_database_entry = ospf_find_LSA (        sptr_interface->sptr_area,        sptr_interface->designated_router.address,        ospf.router_id,        OSPF_LS_NETWORK);    /* SPR#76812 -- End */    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF,"OSPF  ORIGINATING NETWORK LINK ADVERTISEMENTS for interface with address (HEX) %lx\r\n", sptr_interface->address);    ospf_install_and_flood_originated_advertisement (        sptr_advertisement,        sptr_database_entry,        length,        sptr_interface->sptr_area);   }/***************************************************************************************************//* section 12.4.3 (page 125-128) */void ospf_originate_summary_links_advertisement (OSPF_AREA_ENTRY *sptr_area){    OSPF_ROUTING_TABLE_NODE *sptr_routing_table_node;    ULONG index;    enum OSPF_ROUTE_TABLE_TYPE table_type;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_originate_summary_links_advertisement\r\n");    sptr_routing_table_node = NULL;    PARAMETER_NOT_USED (sptr_area);    PARAMETER_NOT_USED (sptr_routing_table_node);    /* 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++)            {            for (sptr_routing_table_node = ospf.sptr_routing_table_head[table_type][index];                 sptr_routing_table_node != NULL;                 sptr_routing_table_node = sptr_routing_table_node->sptr_forward_link)                {                if (((sptr_area->area_id == OSPF_BACKBONE) &&                    (sptr_routing_table_node->sptr_routing_table_entry->path_type == OSPF_ROUTE_PATH_TYPE_INTRA)) ||                    ((sptr_area->area_id != OSPF_BACKBONE) &&                    ((sptr_routing_table_node->sptr_routing_table_entry->path_type == OSPF_ROUTE_PATH_TYPE_INTRA) || (sptr_routing_table_node->sptr_routing_table_entry->path_type == OSPF_ROUTE_PATH_TYPE_INTER))))                    {                    ospf_originate_a_single_summary_links_advertisement (                        sptr_routing_table_node->sptr_routing_table_entry,                        sptr_area,                        FALSE);                    }                }            }        }    /* SPR#76812 -- End */    }/**************************************************************************************************************************************/void ospf_originate_a_single_summary_links_advertisement (OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry,OSPF_AREA_ENTRY *sptr_area,    enum BOOLEAN prematurely_age_advertisement){    char print_buffer[PRINT_BUFFER_SIZE];    OSPF_ADDRESS_RANGE_LIST_ENTRY *sptr_address_range;    enum TEST test_return_type;    ULONG old_cost;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_originate_a_single_summary_links_advertisement\r\n");    if (sptr_area == NULL)        {        return;        }        /* SPR 78381 Do not propagate summary lsa if noAreaSummary */        /* SPR#86319 - the variable inject_summary_lsa_into_stub_area controls the import         * of summary LSAs into stub areas.  It has no effect on other areas.         */    else if ((sptr_area->flags._bit.stub == TRUE) &&        (sptr_area->inject_summary_lsa_into_stub_area == FALSE))        {        return;        }    else if ( (sptr_area->area_id != OSPF_BACKBONE) && (sptr_area->sptr_interfaces != NULL) && (sptr_area->sptr_interfaces->type == OSPF_VIRTUAL_LINK) )        {        if (sptr_routing_table_entry->sptr_area != NULL)            {            /* SPR 86153 Start - Don't use source_area_id_for_virtual_link since the concept of source area id               is not used any where in RFC 2328 */            /*if (sptr_routing_table_entry->sptr_area->area_id != sptr_area->sptr_interfaces->source_area_id_for_virtual_link)                {                return;                }*/            /* SPR 86153 End */            }        else if (sptr_routing_table_entry->path_type != OSPF_ROUTE_PATH_TYPE_INTRA)            {            /* summarize only INTRA area summary info if I am not physicall adjacent to Backbone */            return;            }        }    OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_DEBUG (print_buffer, sptr_area->area_id);    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Originating a single summary links advertisement into area %s\r\n", print_buffer);    OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_DEBUG (print_buffer, sptr_routing_table_entry->destination_id);    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF:    route to %s\r\n", print_buffer);    if ((sptr_routing_table_entry->destination_type == OSPF_DESTINATION_TYPE_ABR) ||        (sptr_routing_table_entry->destination_type == OSPF_DESTINATION_TYPE_VIRTUAL) ||        (sptr_routing_table_entry->destination_type == OSPF_DESTINATION_TYPE_ASE))        {        OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF:    destination type is not NETWORK or ASBR\r\n");        return;                             /* section 12.4.3, first bullet item (page 125) */        }    if ((sptr_routing_table_entry->path_type == OSPF_ROUTE_PATH_TYPE_1_EXTERNAL) ||        (sptr_routing_table_entry->path_type == OSPF_ROUTE_PATH_TYPE_2_EXTERNAL))        {        OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF:    path type = External\r\n");        return;                             /* section 12.4.3, second bullet item (page 126) */        }    else if (sptr_routing_table_entry->sptr_area == sptr_area)        {        OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF:    same area\r\n");        return;                             /* section 12.4.3, third bullet item (page 126) */        }    else        {        if (sptr_area->flags._bit.transit == TRUE)            {            if ( (sptr_routing_table_entry->sptr_next_hop != NULL) && (sptr_routing_table_entry->sptr_next_hop->next_hop_router == 0x00000000L) ) /*#$-NOTE:note26-$#*/                {                test_return_type = FAIL;                }            else                {                test_return_type = ospf_check_if_next_hops_belong_to_the_area (                    sptr_routing_table_entry->sptr_next_hop, sptr_area);                }            if (test_return_type == PASS)                {                OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF:    next hops belong to area\r\n");                return;                         /* section 12.4.3, forth bullet item (page 126) */                }            }        if ((sptr_routing_table_entry->path_cost & OSPF_LSInfinity) >= OSPF_LSInfinity)            {            OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF:    path cost (%d) >= OSPF_LSInfinity (%d)\r\n", sptr_routing_table_entry->path_cost, \                OSPF_LSInfinity);            return;                             /* section 12.4.3, fifth bullet item (page 126) */            }        else if (sptr_routing_table_entry->destination_type == OSPF_DESTINATION_TYPE_ASBR)            {            if ((sptr_area->flags._bit.stub == FALSE) && (sptr_area->flags._bit.nssa == FALSE))                {                /* section 12.4.3, sixth bullet item (page 126) */                ospf_generate_a_type_4_link_state_advertisement (sptr_area, sptr_routing_table_entry, prematurely_age_advertisement);                }            }        else            {            if (sptr_routing_table_entry->path_type == OSPF_ROUTE_PATH_TYPE_INTER)                {                    /* section 12.4.3, seventh bullet item (page 126) */                    /* ANVL 27.15 start */                    /* Before originating LSA, verify if new Routing Table entry is same as old Routing Table entry.                       If it is the same, then there was no route change based on this LSA, do not reissue the LSA */                /* SPR# 87382 - Begin */                /*                 * Check prematurely_age_advertisement, if it is TRUE then it                 * means this RT entry is old and so it shouldn't be compared                 * against the old routing table. Just age it.                 */                if ((prematurely_age_advertisement == TRUE) ||                /* SPR# 87382 - End */                    (ospf_verify_if_route_is_old(sptr_routing_table_entry) == FALSE))                    /* ANVL 27.15 end */                    {                        ospf_generate_a_type_3_link_state_advertisement (sptr_area, sptr_routing_table_entry, prematurely_age_advertisement);                    }                }            else                {/* SPR 88613 Begin */                if (sptr_routing_table_entry->sptr_area->sptr_address_ranges != NULL) /* address range is configured */                    {                    if ((sptr_routing_table_entry->sptr_area->area_id == 0x0) /* looking at backbone ranges */                        && (sptr_area->flags._bit.transit == TRUE) )/* destination area is transit */                        {                        /* ignore configured address ranges - do NOT summarize/suppress */                        ospf_generate_a_type_3_intra_area_link_state_advertisement (sptr_area, sptr_routing_table_entry->destination_id,                            sptr_routing_table_entry->address_mask,sptr_routing_table_entry->path_cost, prematurely_age_advertisement);                        return;                        }                    for (sptr_address_range = sptr_routing_table_entry->sptr_area->sptr_address_ranges;                         sptr_address_range != NULL;                         sptr_address_range = sptr_address_range->sptr_forward_link)                        {                        test_return_type = ospf_check_if_ip_destination_falls_into_address_range (sptr_routing_table_entry->destination_id,                            sptr_address_range->network, sptr_address_range->mask);                        if (test_return_ty

⌨️ 快捷键说明

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