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

📄 ospf_flood.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 3 页
字号:
    interface_type_received_on = (enum  OSPF_INTERFACE_TYPE) 0x00;    if (sptr_interface_advertisement_received_on != NULL)        {        interface_type_received_on = sptr_interface_advertisement_received_on->type;        }    /* 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.     */    if ((sptr_area->flags._bit.stub == TRUE) &&        ((sptr_advertisement->ls_header.type == OSPF_LS_SUMMARY_NETWORK) || (sptr_advertisement->ls_header.type == OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER))        && (sptr_area->inject_summary_lsa_into_stub_area == FALSE))        {        return;        }    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->area_id == sptr_area->area_id)            {            if ( (sptr_area->area_id == OSPF_BACKBONE) || (sptr_interface->type != OSPF_VIRTUAL_LINK)  )                {                ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on,                    sptr_neighbor_advertisement_received_from, advertisement_installed);                }            else if ( (sptr_interface->type == OSPF_VIRTUAL_LINK) && (sptr_interface_advertisement_received_on == NULL) )  /* originating on the other end of VL which doesn't have area 0.0.0.0 */                {                ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on,                    sptr_neighbor_advertisement_received_from, advertisement_installed);                }            else if ( (interface_type_received_on == OSPF_VIRTUAL_LINK) && (sptr_interface_advertisement_received_on != sptr_interface) )                {                ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on,                    sptr_neighbor_advertisement_received_from, advertisement_installed);  /*#$-NOTE:note17-$#*/                }            }        }    return;}/*opaque lsa flood throughout a link-local scope jkw  RFC 2370 Section 3.1 item 1*/#if defined (__OPAQUE_LSA__)/*************************************************************************** ospf_flood_advertisement_throughout_a_link_local_scope - flood advertisements throughout a link local scope** This routine will the advertisement throughout the link local* scope.** <sptr_advertisement> Advertisement header** <sptr_area> Area associated with the advertisement** <sptr_interface_advertisement_received_on> Interface advertisement was received on** <sptr_neighbor_advertisement_received_from> Neighbor advertisement was received on** <advertisement_installed> Boolean to tell if advertisement is already installed** RETURNS: N/A** ERRNO: N/A** NOMANUAL*/static void ospf_flood_advertisement_throughout_a_link_local_scope (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_advertisement,OSPF_AREA_ENTRY *sptr_area,    OSPF_INTERFACE *sptr_interface_advertisement_received_on,OSPF_NEIGHBOR *sptr_neighbor_advertisement_received_from, enum BOOLEAN advertisement_installed){    OSPF_INTERFACE *sptr_interface = NULL;    OSPF_INTERFACE *sptr_next_interface = NULL;    enum OSPF_INTERFACE_TYPE interface_type_received_on;    OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *type_9_lsa = NULL;    OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_flood_advertisement_throughout_a_link_local_scope\r\n");    type_9_lsa = (OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *)sptr_advertisement;    interface_type_received_on = (enum  OSPF_INTERFACE_TYPE) 0x00;    if (sptr_interface_advertisement_received_on != NULL)        {        interface_type_received_on = sptr_interface_advertisement_received_on->type;        }    for (sptr_interface = sptr_area->sptr_interfaces; sptr_interface != NULL; sptr_interface = sptr_next_interface)        {        sptr_next_interface = sptr_interface->sptr_forward_link;        if (sptr_interface->area_id == sptr_area->area_id)            {            if (sptr_interface_advertisement_received_on == NULL)                {                if ( (sptr_area->area_id == OSPF_BACKBONE) || (sptr_interface->type != OSPF_VIRTUAL_LINK)  )                    {                    ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on,                        sptr_neighbor_advertisement_received_from, advertisement_installed);                    }                else if ( sptr_interface->type == OSPF_VIRTUAL_LINK )  /* originating on the other end of VL which doesn't have area 0.0.0.0 */                    {                    ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on,                        sptr_neighbor_advertisement_received_from, advertisement_installed);                    }                else if ( (interface_type_received_on == OSPF_VIRTUAL_LINK) && (sptr_interface_advertisement_received_on != sptr_interface) )                    {                    ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on,                        sptr_neighbor_advertisement_received_from, advertisement_installed);  /*#$-NOTE:note17-$#*/                    }                }            else                {                if (type_9_lsa->opaque_interface == sptr_interface)                    {                    if ( (sptr_area->area_id == OSPF_BACKBONE) || (sptr_interface->type != OSPF_VIRTUAL_LINK)  )                        {                        ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on,                            sptr_neighbor_advertisement_received_from, advertisement_installed);                        }                    else if ( (interface_type_received_on == OSPF_VIRTUAL_LINK) && (sptr_interface_advertisement_received_on != sptr_interface) )                        {                        ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on,                            sptr_neighbor_advertisement_received_from, advertisement_installed);  /*#$-NOTE:note17-$#*/                        }                    }                }            }        }    return;}#endif /* __OPAQUE_LSA__ *//*************************************************************************** ospf_flood_advertisement_out_eligible_interface - flood out eligible interface** This routine will add the advertisement to the retransmit list and* call the function to build an link state update.** <sptr_advertisement> Advertisement header** <sptr_interface_advertisement_received_on> Interface advertisement was received on** <sptr_neighbor_advertisement_received_from> Neighbor advertisement was received on** <advertisement_installed> Boolean to tell if advertisement is already installed** RETURNS: N/A** ERRNO: N/A** NOMANUAL*//**********************************************************************//* section 13.3 of OSPF specification (page 139 - 140) */static void ospf_flood_advertisement_out_eligible_interface (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_advertisement,    OSPF_INTERFACE *sptr_interface,OSPF_INTERFACE *sptr_interface_advertisement_received_on,    OSPF_NEIGHBOR *sptr_neighbor_advertisement_received_from, enum BOOLEAN advertisement_installed){    OSPF_LS_DATABASE_NODE *sptr_database_list =NULL;    enum BOOLEAN advertisement_was_added_to_a_retransmission_list;    char print_buffer[PRINT_BUFFER_SIZE];    /* HME Fix SPR#75796 ANVL 37.1 Begin*/    OSPF_LS_DATABASE_ENTRY *sptr_database_entry = NULL;    ULONG lock_time_MinLSInterval = 0;    /* HME Fix SPR#75796 ANVL 37.1 End*/    BYTE_ENUM (OSPF_LS_TYPE) type;    ULONG advertising_router;    ULONG link_state_id;    advertisement_was_added_to_a_retransmission_list = TRUE;    OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_flood_advertisement_out_eligible_interface\r\n");    /* section 13.3, item (1-5) - (page 148-149) */    if (sptr_interface_advertisement_received_on != NULL)        {        if ((sptr_interface == sptr_interface_advertisement_received_on) &&           ((sptr_interface_advertisement_received_on->designated_router.address == sptr_neighbor_advertisement_received_from->address) ||           (sptr_interface_advertisement_received_on->backup_designated_router.address == sptr_neighbor_advertisement_received_from->address) ||           (sptr_interface->state == OSPF_INTERFACE_BACKUP_DESIGNATED_ROUTER) ||           ( sptr_interface->state != OSPF_INTERFACE_DESIGNATED_ROUTER )))              {              return;              }        }    advertisement_was_added_to_a_retransmission_list = ospf_examine_each_neighbor_and_add_advertisement_to_the_retransmission_list_if_necessary (        sptr_interface, &sptr_database_list, sptr_advertisement, sptr_neighbor_advertisement_received_from, advertisement_installed);    /*     * Shouldn't the three following ifs come before section 13.3, item (1)     */    /* section 13.3, item (2) - (page 139) */    if (advertisement_was_added_to_a_retransmission_list == FALSE)        {        return;        }    /* section 13.3, item (5) - (page 140) */    type = sptr_advertisement->ls_header.type;    if (type > OSPF_LS_MAX)        {        type = OSPF_LS_MAX;        }    OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_DEBUG (print_buffer, sptr_interface->address);    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Flooding %s advertisement out interface %s\r\n", cptr_ls_type_string[type], print_buffer);    /* SPR#76812 -- Begin */    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(type == OSPF_LS_NETWORK)    {        sptr_database_entry = ospf_find_network_LSA(sptr_interface->sptr_area,link_state_id);    }    else    {        sptr_database_entry = ospf_find_LSA(sptr_interface->sptr_area,link_state_id,advertising_router,type);    }    /* SPR#76812 -- End */    if (sptr_database_entry == NULL)        {        OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: Could not find the advertisemnt in the LSDB\r\n");        }        else        {         lock_time_MinLSInterval =  sptr_database_entry->lock_time_MinLSInterval;         sptr_database_entry->lock_time_MinLSInterval = 0;        }    /* SPR88613 */    if (lock_time_MinLSInterval < OSPF_MinLSInterval)        {        /* Do not send the update right now, we should wait for at least MinLSInterval before           distinct origination of any particular LSA.           The LSA-retransimition mechanism will re-send the LSA after RxntInterval        */        }    else        {        ospf_send_ls_update (sptr_database_list, NULL, sptr_interface, FALSE, advertisement_installed);        }    /* HME Fix SPR#75796 ANVL 37.1  End*/    /*     * The neighbor's retransmit db pointers are pointing to this. Don't free it here     * Free it only after receiving an ACK     */    /*     * We are only freeing the outer OSPF_LS_DATABASE_NODE but not the OSPF_LS_DATABASE_ENTRY inside, which is on the     * neighbor's retransmission lists.     */    if (sptr_database_list != NULL)        {        sptr_database_list = (OSPF_LS_DATABASE_NODE *) ospf_free_entire_list ((OSPF_GENERIC_NODE *) sptr_database_list);        }    if (sptr_interface == sptr_interface_advertisement_received_on)        {        advertisement_was_flooded_back_out_receiving_interface = TRUE;        }    return;}/*************************************************************************** ospf_examine_each_neighbor_and_add_advertisement_to_the_retransmission_list_if_necessary - add advertisement to neighbor retransmit list** This routine will examine each neighbor and add the* advertisement to the retransmit list.** <sptr_interface> OSPF interface** <ptr_to_sptr_database_list> Link state database list** <sptr_advertisement> Advertisement to be added to retransmit list** <sptr_interface_advertisement_received_on> Interface advertisement was received on** <sptr_neighbor_advertisement_received_from> Neighbor advertisement was received on** <advertisement_installed> Boolean to tell if advertisement is already installed** RETURNS: TRUE or FALSE** ERRNO: N/A** NOMANUAL*//**************************************************************************************//* section 13.3, item (1) - (page 139) */static enum BOOLEAN ospf_examine_each_neighbor_and_add_advertisement_to_the_retransmission_list_if_necessary    (    OSPF_INTERFACE *sptr_interface,    OSPF_LS_DATABASE_NODE **ptr_to_sptr_database_list,

⌨️ 快捷键说明

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