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

📄 ospf_link_state_advertisements.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
            case OSPF_LS_MAX:                 break;        }        /* SPR#75796, ANVL 37.1 Begin*/        lock_time_MinLSInterval = ospf_get_system_elapsed_time_second () - sptr_database_entry->ls_database_time_stamp;        /* SPR#75796, ANVL 37.1 End*/        /* SPR 85050 */        sptr_database_entry = ospf_install_a_new_advertisement_in_the_link_state_database (            sptr_database_entry,            sptr_advertisement,            sptr_area,            &different_lsa,            sptr_database_entry->route_protocol);        /* SPR#75796, ANVL 37.1 Begin*/        sptr_database_entry->lock_time_MinLSInterval = lock_time_MinLSInterval;        /* SPR#75796, ANVL 37.1 End*/        (void) ospf_flood_advertisement_out_some_subset_of_the_routers_interfaces (sptr_new_router_link_advertisement, sptr_area,            NULL, NULL, TRUE);        table_free ((void*) sptr_advertisement);        sptr_advertisement = NULL;        }    return;}/***************************************************************************************************//* section 12.4.1 (page 116-123) */void ospf_originate_router_links_advertisement (OSPF_AREA_ENTRY *sptr_area){    OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_router_link_advertisement;    UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement;    USHORT length;    USHORT allocated_size_for_lsa;    enum BOOLEAN I_am_an_area_border_router;    OSPF_LS_DATABASE_ENTRY *sptr_database_entry;    enum BOOLEAN this_is_a_transit_area;#if defined (__OSPF_VIRTUAL_LINK__)    OSPF_INTERFACE_NODE* sptr_virtual_interface_node =  NULL;    OSPF_INTERFACE* sptr_interface = NULL;    OSPF_NEIGHBOR* sptr_neighbor = NULL;    enum BOOLEAN set_v_flag = FALSE;#endif /* __OSPF_VIRTUAL_LINK__ */    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_originate_router_links_advertisement\r\n");    /* only generate the router link advertisement for the area if there is at least     * one active interface in the area     */    if (sptr_area->number_of_interfaces_in_up_state == 0)        return;    sptr_router_link_advertisement = (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *) create_buffer_for_lsa (sptr_area->sptr_interfaces, &allocated_size_for_lsa);    if (sptr_router_link_advertisement == NULL)        {        ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER");        return;        }    sptr_router_link_advertisement->ls_header.age = 0x0000;    if ((sptr_area->area_id == 0x00000000L || sptr_area->flags._bit.stub != TRUE) &&        (sptr_area->area_id == 0x00000000L || sptr_area->flags._bit.nssa != TRUE))        {        sptr_router_link_advertisement->ls_header.options._byte = OSPF_ENABLE_EXTERNAL_ROUTING;        }    else        {        sptr_router_link_advertisement->ls_header.options._byte = OSPF_NOT_ENABLE_EXTERNAL_ROUTING ;        if ( sptr_area->flags._bit.nssa == TRUE)            {            sptr_router_link_advertisement->ls_header.options._bit.nssa = TRUE;            }                }    sptr_router_link_advertisement->ls_header.type = OSPF_LS_ROUTER;    sptr_router_link_advertisement->ls_header.id = ospf.router_id;    sptr_router_link_advertisement->ls_header.id = host_to_net_long (sptr_router_link_advertisement->ls_header.id);    sptr_router_link_advertisement->ls_header.advertising_router = ospf.router_id;    sptr_router_link_advertisement->ls_header.advertising_router =        host_to_net_long (sptr_router_link_advertisement->ls_header.advertising_router);    /* sequence number increment moved down */    I_am_an_area_border_router = ospf_check_if_area_border_router ();    sptr_router_link_advertisement->bit_options._ushort = 0x0000;    if (I_am_an_area_border_router == TRUE)        {        sptr_router_link_advertisement->bit_options._bit.bit_B = TRUE;        }   else {        sptr_router_link_advertisement->bit_options._bit.bit_B = FALSE;        }#if !defined (__NSSA__)    /* SPR 78253 stub area cannot have E bit turned on */    if ((ospf.autonomous_system_border_router == TRUE) && (sptr_area->flags._bit.stub == FALSE))        {        sptr_router_link_advertisement->bit_options._bit.bit_E = TRUE;        }#else    if (sptr_area->flags._bit.nssa != TRUE)        {        /* SPR 78253 stub area cannot have E bit turned on */        if ((ospf.autonomous_system_border_router == TRUE) && (sptr_area->flags._bit.stub == FALSE))            {            sptr_router_link_advertisement->bit_options._bit.bit_E = TRUE;            }        }#endif /*__NSSA__*/#if !defined (__OSPF_VIRTUAL_LINK__)    this_is_a_transit_area = ospf_check_if_area_is_a_transit_area (sptr_area);    if (this_is_a_transit_area == TRUE)        {        sptr_router_link_advertisement->bit_options._bit.bit_V = TRUE;        }#else /*__OSPF_VIRTUAL_LINK__*/    this_is_a_transit_area = ospf_check_if_area_is_a_transit_area (sptr_area);    if (this_is_a_transit_area == TRUE)        {        for ( sptr_virtual_interface_node = ospf.sptr_configured_virtual_links; sptr_virtual_interface_node != NULL;       sptr_virtual_interface_node = sptr_virtual_interface_node->sptr_forward_link)       {                if((sptr_virtual_interface_node->sptr_interface->sptr_transit_area != NULL) &&                    (sptr_virtual_interface_node->sptr_interface->sptr_transit_area->area_id == sptr_area->area_id))                    {                    sptr_interface =  sptr_virtual_interface_node->sptr_interface;                    break;                    }                }        if(sptr_interface != NULL)            {            for (sptr_neighbor = sptr_interface->sptr_neighbor; sptr_neighbor != NULL; sptr_neighbor = sptr_neighbor->sptr_forward_link)                {                if(sptr_neighbor->state == OSPF_NEIGHBOR_FULL)                    set_v_flag = TRUE;                }            }        } if (set_v_flag == TRUE)     {  sptr_router_link_advertisement->bit_options._bit.bit_V = TRUE;     }#endif /* __OSPF_VIRTUAL_LINK__ */    sptr_router_link_advertisement->number_of_links = 0x0000;    length = OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER_SIZE;    /* section 12.4.1, first bullet item (page 119) - only examine those interfaces with attached networks belonging to this area */    ospf_build_a_router_link_advertisement (sptr_area, sptr_router_link_advertisement, &length);    sptr_router_link_advertisement->ls_header.length = length;    sptr_router_link_advertisement->ls_header.length = host_to_net_short (sptr_router_link_advertisement->ls_header.length);    sptr_router_link_advertisement->number_of_links = host_to_net_short (sptr_router_link_advertisement->number_of_links);    /* seq # calc and cheksum calc moved down */    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_router_link_advertisement, "UNION_OSPF_LINK_STATE_ADVERTISEMENT");        return;        }    else        {        memset (sptr_advertisement, 0x0, sizeof (ULONG));        }    sptr_advertisement->sptr_router = sptr_router_link_advertisement;    /* SPR#76812 -- Begin */    sptr_database_entry = ospf_find_LSA (        sptr_area,        ospf.router_id,        ospf.router_id,        OSPF_LS_ROUTER);    /* SPR#76812 -- End */    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF,"OSPF ORIGNATE ROUTERLINK ADVERTISEMENTS for interface with address: %lx\r\n", sptr_area->sptr_interfaces->address);    ospf_install_and_flood_originated_advertisement (sptr_advertisement, sptr_database_entry, length, sptr_area);    return;}/**************************************************************************************************************************************/static enum BOOLEAN ospf_check_if_area_is_a_transit_area (OSPF_AREA_ENTRY *sptr_area){    OSPF_INTERFACE_NODE *sptr_virtual_interface_node;    OSPF_INTERFACE *sptr_virtual_interface;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_check_if_area_is_a_transit_area\r\n");    if ((sptr_area->flags._bit.transit == TRUE) && (sptr_area->flags._bit.virtual_up == TRUE))        {        return (TRUE);        }    for (sptr_virtual_interface_node  = ospf.sptr_configured_virtual_links; sptr_virtual_interface_node  != NULL;        sptr_virtual_interface_node  =  sptr_virtual_interface_node->sptr_forward_link)        {        sptr_virtual_interface = sptr_virtual_interface_node->sptr_interface;        if (sptr_virtual_interface == NULL)            {            continue;            }        if ( (sptr_virtual_interface->sptr_transit_area->area_id == sptr_area->area_id) )            {            return (TRUE);            }        }    return (FALSE);}/**************************************************************************************************************************************/static void ospf_build_a_router_link_advertisement (OSPF_AREA_ENTRY *sptr_area, OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER   *sptr_router_link_advertisement, USHORT *sptr_length){    ULONG link_data;    OSPF_ROUTER_LINK_PIECE *sptr_link;    OSPF_INTERFACE *sptr_interface = NULL;    OSPF_INTERFACE *sptr_next_interface = NULL;    OSPF_NEIGHBOR *sptr_neighbor = NULL;    OSPF_NEIGHBOR *sptr_next_neighbor = NULL;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_build_a_router_link_advertisement\r\n");    sptr_link = &(sptr_router_link_advertisement->link);    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)            {            /* section 12.4.1, second bullet item (page 119) */            if (sptr_interface->state == OSPF_INTERFACE_IS_DOWN)

⌨️ 快捷键说明

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