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

📄 ospf_flood.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 3 页
字号:
    OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_advertisement,    OSPF_NEIGHBOR *sptr_neighbor_advertisement_received_from,    enum BOOLEAN advertisement_installed    )    {    OSPF_NEIGHBOR *sptr_neighbor = NULL;    OSPF_NEIGHBOR *sptr_next_neighbor = NULL;    enum BOOLEAN advertisement_was_added_to_a_retransmission_list = FALSE;    enum BOOLEAN done_processing_this_neighbor;    enum BOOLEAN found_lsa = TRUE;    OSPF_PRINTF_PROLOGUE (        OSPF_PROLOGUE_PRINTF,        "OSPF: Entering ospf_examine_each_neighbor_and_add_advertisement_to_the_retransmission_list_if_necessary\r\n");    for (sptr_neighbor = sptr_interface->sptr_neighbor;         sptr_neighbor != NULL;         sptr_neighbor = sptr_next_neighbor)        {        sptr_next_neighbor = sptr_neighbor->sptr_forward_link;        /* section 13.3, item (1a) - (page 139) */        if (sptr_neighbor->state < OSPF_NEIGHBOR_EXCHANGE)            {            continue;            }        /* section 13.3, item (1b) - (page 139) */        if ((sptr_neighbor->state == OSPF_NEIGHBOR_EXCHANGE) ||            (sptr_neighbor->state == OSPF_NEIGHBOR_LOADING))            {            done_processing_this_neighbor = ospf_update_ls_request_list_for_this_adjacency (sptr_advertisement, sptr_neighbor);            if (done_processing_this_neighbor == TRUE)                {                continue;                }            }        /*         * If the advertisement was learned from the this neighbor skip         * to next neighbor on the interface list         */        if (sptr_neighbor_advertisement_received_from != NULL)            {        if (sptr_neighbor->address == sptr_neighbor_advertisement_received_from->address)            {            continue;            }            }       /*opaque lsa examine each neighbor retransmission list jkw*/        /*RFC 2370 Section 3.1 item 4*/#if defined (__OPAQUE_LSA__)        if ((sptr_advertisement->ls_header.type == OSPF_LS_TYPE_9) ||            (sptr_advertisement->ls_header.type == OSPF_LS_TYPE_10) ||            (sptr_advertisement->ls_header.type == OSPF_LS_TYPE_11))            {            if (sptr_neighbor->opaque_capability == FALSE)                {                continue;                }            }#endif (__OPAQUE_LSA__)        /* section 13.3, item (1d) - (page 139) */        *ptr_to_sptr_database_list = ospf_add_advertisement_to_the_link_state_retransmission_list_for_the_adjacency (sptr_advertisement,            sptr_neighbor, *ptr_to_sptr_database_list, advertisement_was_added_to_a_retransmission_list, &found_lsa, advertisement_installed);        /* Added change as per TMS PR #1590               Return FALSE if failed to add advertisement to retransmission list*/        if (( *ptr_to_sptr_database_list == NULL ) && (found_lsa == TRUE))            {            advertisement_was_added_to_a_retransmission_list = FALSE;            }        else            {            advertisement_was_added_to_a_retransmission_list = TRUE;            }        }    return (advertisement_was_added_to_a_retransmission_list);    }/*************************************************************************** ospf_update_ls_request_list_for_this_adjacency - update link state request list for adjacency** This routine will update the link state request list* for the adjacency for a particular neighbor.** <sptr_advertisement> Advertisement to be added to retransmit list** <sptr_neighbor> OSPF neighbor** RETURNS: TRUE or FALSE** ERRNO: N/A** NOMANUAL*//*************************************************************************************//* section 13.3, item (1b) - (page 139) */static enum BOOLEAN ospf_update_ls_request_list_for_this_adjacency (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_advertisement,    OSPF_NEIGHBOR *sptr_neighbor){    OSPF_LS_DATABASE_ENTRY database_entry;    OSPF_LS_REQUEST *sptr_ls_request =NULL;    OSPF_LS_HEADER ls_header;    enum TEST return_test_type;    enum BOOLEAN done_processing_this_neighbor;    OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_update_ls_request_list_for_this_adjacency\r\n");    done_processing_this_neighbor = FALSE;    database_entry.advertisement.sptr_router = sptr_advertisement;    sptr_ls_request = ospf_find_advertisement_on_neighbors_ls_request_list (sptr_neighbor, &database_entry);    if (sptr_ls_request != NULL)        {        /*         * ospf_check_if_more_recent () requires two variables of type OSPF_LS_HEADER as input.  So transfer the necessary fields from         * the OSPF_LS_REQUEST structure to a temporary OSPF_LS_HEADER structure so we can call the routine properly.         */        ospf_transfer_fields_from_ls_request_structure_to_ls_header_structure (sptr_ls_request, &ls_header);        /* section 13.3, item (1b), bullet #1 - (page 139) */        return_test_type = ospf_check_if_more_recent (&ls_header, &(sptr_advertisement->ls_header), 0x00000000L);        if (return_test_type == PASS)            {            OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Advertisement is less recent\r\n");            done_processing_this_neighbor = TRUE;            }        else            {            /* section 13.3, item (1b), bullet #2 and #3 - (page 139) */            OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Deleting advertisement from Link state request list\r\n");            ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &(sptr_neighbor->sptr_ls_request[sptr_advertisement->ls_header.type]),                (OSPF_GENERIC_NODE *) sptr_ls_request);            table_free ((void *) sptr_ls_request);            sptr_ls_request = NULL;            --sptr_neighbor->ls_request_queue_count;            if ((sptr_neighbor->ls_request_queue_count == 0x0000) && (sptr_neighbor->state == OSPF_NEIGHBOR_LOADING))                {                ospf_execute_neighbor_state_machine (OSPF_LOADING_DONE, sptr_neighbor->state, sptr_neighbor->sptr_interface, sptr_neighbor);                }            sptr_neighbor->ls_request_list_has_changed = TRUE;            /* section 13.3, item (1b), bullet #2 - (page 139) */            return_test_type = ospf_check_if_same_instance (&ls_header, &(sptr_advertisement->ls_header), 0x00000000L);            if (return_test_type == PASS)                {                OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Advertisement is the same instance\r\n");                done_processing_this_neighbor = TRUE;                }            }        }    return (done_processing_this_neighbor);}/*************************************************************************** ospf_add_advertisement_to_the_link_state_retransmission_list_for_the_adjacency - add advertisement to retransmission list** This routine will update the retransmission list* for the adjacency for a particular neighbor.** <sptr_advertisement> Advertisement to be added to retransmit list** <sptr_neighbor> OSPF neighbor** <sptr_database_list> Database list** <advertisement_was_added_to_a_retransmission_list> Boolean if advertisement was added to retransmission list** <advertisement_installed> Boolean to check if advertisement is installed** RETURNS: OSPF_LS_DATABASE_NODE * or NULL** ERRNO: N/A** NOMANUAL*/static OSPF_LS_DATABASE_NODE *ospf_add_advertisement_to_the_link_state_retransmission_list_for_the_adjacency (    OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_advertisement,OSPF_NEIGHBOR *sptr_neighbor,OSPF_LS_DATABASE_NODE *sptr_database_list,    enum BOOLEAN advertisement_was_added_to_a_retransmission_list, enum BOOLEAN *found_lsa, enum BOOLEAN advertisement_installed){    OSPF_LS_DATABASE_ENTRY *sptr_database_entry =NULL;    OSPF_LS_DATABASE_ENTRY *sptr_database_entry_fill_retrans_info =NULL;    OSPF_LS_DATABASE_NODE *sptr_database_node =NULL;    OSPF_LS_DATABASE_NODE *sptr_lsdb_node =NULL;    OSPF_NEIGHBOR_LIST *sptr_neighbor_retrans_info =NULL;    ULONG link_state_id =0;    ULONG advertising_router =0;    USHORT age = 0x0000;    OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_add_advertisement_to_the_link_state_retransmission_list_for_the_adjacency\r\n");    sptr_database_node = NULL;    sptr_lsdb_node = NULL;    sptr_neighbor_retrans_info = NULL;    PARAMETER_NOT_USED (sptr_database_node);    PARAMETER_NOT_USED (sptr_lsdb_node);    PARAMETER_NOT_USED (sptr_neighbor_retrans_info);    link_state_id = sptr_advertisement->ls_header.id;    link_state_id = net_to_host_long (link_state_id);    advertising_router = sptr_advertisement->ls_header.advertising_router;    advertising_router = net_to_host_long (advertising_router);    if (advertisement_installed == TRUE)    {        /* SPR#76812 */        sptr_database_entry_fill_retrans_info = ospf_find_LSA(sptr_neighbor->sptr_interface->sptr_area,                                                              link_state_id, advertising_router,                                                              sptr_advertisement->ls_header.type);    }    if (sptr_database_entry_fill_retrans_info == NULL)        {        *found_lsa = FALSE;        }    sptr_database_entry = (OSPF_LS_DATABASE_ENTRY *) table_malloc (1, sizeof (OSPF_LS_DATABASE_ENTRY));    if (sptr_database_entry == NULL)        {        ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_LS_DATABASE_ENTRY");        *found_lsa = TRUE;        return (NULL);        }    memset (sptr_database_entry, 0x00, sizeof (OSPF_LS_DATABASE_ENTRY));    if (sptr_database_entry_fill_retrans_info == NULL)        {        sptr_database_entry->advertisement.sptr_router = sptr_advertisement;        }    else        {        sptr_database_entry->advertisement.sptr_router = sptr_database_entry_fill_retrans_info->advertisement.sptr_router;        }    age = sptr_advertisement->ls_header.age;    age = net_to_host_short(age);    if (age == OSPF_MAXIMUM_AGE)        {        sptr_database_entry->advertisement.sptr_router->ls_header.age = sptr_advertisement->ls_header.age;        }    if (sptr_database_entry_fill_retrans_info != NULL)        {        ospf_add_database_entry_to_neighbor_retransmit_list (sptr_neighbor, sptr_database_entry );        ospf_add_neighbor_to_database_retransmit_list (sptr_database_entry_fill_retrans_info, sptr_neighbor);        }    if (advertisement_was_added_to_a_retransmission_list == FALSE)      /* first time, so initialize database list */        {        sptr_database_list = (OSPF_LS_DATABASE_NODE *) table_malloc (1, sizeof (OSPF_LS_DATABASE_NODE));        if (sptr_database_list == NULL)            {            ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) sptr_database_entry, "OSPF_LS_DATABASE_NODE");            *found_lsa = TRUE;            return (NULL);            }        memset (sptr_database_list, 0x00, sizeof (OSPF_LS_DATABASE_NODE));        sptr_database_list->sptr_forward_link = NULL;        sptr_database_list->sptr_backward_link = NULL;        sptr_database_list->sptr_ls_database_entry = sptr_database_entry;        sptr_database_list->flood = TRUE;        sptr_database_list->periodic_retransmit_time_counter = 0x00000000L;        }    *found_lsa = TRUE;    return (sptr_database_list);}

⌨️ 快捷键说明

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