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

📄 ospf_link_state_database.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
    OSPF_ROUTING_TABLE_NODE *   sptr_routing_table_node = NULL;    ULONG ls_id;    ULONG hash_id;    char print_buffer[PRINT_BUFFER_SIZE];    OSPF_LS_DATABASE_HEAD *sptr_database_head;    enum OSPF_LS_TYPE type;    OSPF_LS_DATABASE_ENTRY *sptr_database_entry_head;#if defined (__OPAQUE_LSA__)    OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *sptr_type_9_link_advertisement;    OSPF_TYPE_10_LINK_ADVERTISEMENT_HEADER *sptr_type_10_link_advertisement;    OSPF_TYPE_11_LINK_ADVERTISEMENT_HEADER *sptr_type_11_link_advertisement;    USHORT length = 0;#endif    enum OSPF_ROUTE_TABLE_TYPE table_type;    GENERIC_ARGUMENT key;    OSPF_AVL_LSDB_KEY lsdb_entry_key;    OSPF_AVL_LSDB_NODE *    sptr_database_entry_node = NULL;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_free_database_entry\r\n");    /* SPR 88619 start */    /* before database entry is deleted, deallocate its timestamps */    ospf_free_timestamps_for_lsdb_entry(sptr_database_entry);    /* SPR 88619 end */    OSPF_PRINTF_MEMORY (OSPF_MEMORY_PRINTF, "OSPF: freeing database entry\r\n");    sptr_database_entry_head = NULL;    PARAMETER_NOT_USED (sptr_database_entry_head);    sptr_area = sptr_database_entry->sptr_ls_database_area;    if (sptr_area != NULL)        {        ospf_remove_mib_database_entry_from_list (            sptr_database_entry,            sptr_area);        }    if (sptr_database_entry->advertisement.sptr_router != NULL)        {        ls_id = sptr_database_entry->advertisement.sptr_router->ls_header.id;        ls_id = net_to_host_long (ls_id);        OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_DEBUG (print_buffer, ls_id);        OSPF_PRINTF_MEMORY (OSPF_MEMORY_PRINTF, "OSPF:    id = %s\r\n", print_buffer);        hash_id = ls_id & OSPF_RT_HASH_MASK;        /* SPR#76812 -- Begin */        for (table_type = OSPF_ROUTE_TABLE_NETWORK;             table_type < OSPF_ROUTE_TABLE_MAX;             table_type++)            { 	        for (sptr_routing_table_node = ospf.sptr_routing_table_head[table_type][hash_id]; 	             sptr_routing_table_node != NULL;                 sptr_routing_table_node = sptr_routing_table_node->sptr_forward_link)                {                if (sptr_routing_table_node->sptr_routing_table_entry->destination_id == ls_id)				    {                    break;                    }			    }            if(sptr_routing_table_node != NULL)				   {					   break;				   }            }        /* SPR#76812 -- End */        if (sptr_routing_table_node != NULL)            {            sptr_routing_table_node->sptr_routing_table_entry->sptr_link_state_origin = NULL;            }        type = (enum OSPF_LS_TYPE) sptr_database_entry->advertisement.sptr_router->ls_header.type;        OSPF_PRINTF_MEMORY (            OSPF_MEMORY_PRINTF,            "OSPF:    type = %s\r\n", cptr_ls_type_string[type]);        }        /* opaque lsa free up opaque lsa from database */        if (sptr_database_entry->ls_database_type == OSPF_LS_AS_EXTERNAL)            {            sptr_database_head =                &ospf.external_database_hash_table[LS_EXTERNAL_LSA][sptr_database_entry->ls_database_hash];            }#if defined (__OPAQUE_LSA__)        else if (sptr_database_entry->ls_database_type == OSPF_LS_TYPE_9)            {            sptr_database_head =                    &sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][sptr_database_entry->ls_database_hash];            }        else if (sptr_database_entry->ls_database_type == OSPF_LS_TYPE_10)            {            sptr_database_head =                    &sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][sptr_database_entry->ls_database_hash];            }		/* Check for type 11 lsdb */        else if (sptr_database_entry->ls_database_type == OSPF_LS_TYPE_11)            {            sptr_database_head =                    &ospf.type_11_database_hash_table[LS_TYPE_11_LSA][sptr_database_entry->ls_database_hash];            }#endif /* __OPAQUE_LSA__ */        else            {            sptr_database_head =                    &sptr_area->ls_database_hash_table[sptr_database_entry->ls_database_type][sptr_database_entry->ls_database_hash];            }        sptr_database_entry->vptr_route = NULL;        sptr_database_entry->sptr_database_autonomous_system_border_router = NULL;        sptr_database_entry->sptr_database_border_router = NULL;        sptr_database_entry->sptr_ls_database_area = NULL;        sptr_database_entry->sptr_next_hop = NULL;        /* SPR#76812 -- Begin */        lsdb_entry_key.id = sptr_database_entry->advertisement.sptr_router->ls_header.id;        lsdb_entry_key.router = sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router;        lsdb_entry_key.type = sptr_database_entry->advertisement.sptr_router->ls_header.type;        key.p = (void*)&lsdb_entry_key;        sptr_database_entry_node = (OSPF_AVL_LSDB_NODE*)avlDelete(&sptr_database_head->sptr_avl_database_entry,		                                                          key, ospfAvlLsdbCompare);        if(sptr_database_entry_node != NULL)            {            table_free((void*)sptr_database_entry_node);            }        ospf_remove_node_from_list (            (OSPF_GENERIC_NODE **) &(sptr_database_head->sptr_linear_database_entry),            (OSPF_GENERIC_NODE *) sptr_database_entry);        /* SPR#76812 -- End */#if defined (__OPAQUE_LSA__)        if (sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_TYPE_9)                {                sptr_type_9_link_advertisement = (OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *)sptr_database_entry->advertisement.sptr_type_9;				length = sptr_type_9_link_advertisement->ls_header.length;				length = net_to_host_short(length);				if (length > OSPF_LS_HEADER_SIZE)                    {                    table_free(sptr_type_9_link_advertisement->data);                    sptr_type_9_link_advertisement->data = NULL;                    }                table_free (sptr_database_entry->advertisement.sptr_type_9);                sptr_database_entry->advertisement.sptr_type_9 = NULL;                }        else if (sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_TYPE_10)                {                sptr_type_10_link_advertisement = (OSPF_TYPE_10_LINK_ADVERTISEMENT_HEADER *)sptr_database_entry->advertisement.sptr_type_10;				length = sptr_type_10_link_advertisement->ls_header.length;				length = net_to_host_short(length);				if (length > OSPF_LS_HEADER_SIZE)                    {                    table_free(sptr_type_10_link_advertisement->data);                    sptr_type_10_link_advertisement->data = NULL;                    }                table_free (sptr_database_entry->advertisement.sptr_type_10);                sptr_database_entry->advertisement.sptr_type_10 = NULL;                }        else if (sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_TYPE_11)                {                sptr_type_11_link_advertisement = (OSPF_TYPE_11_LINK_ADVERTISEMENT_HEADER *)sptr_database_entry->advertisement.sptr_type_11;				length = sptr_type_11_link_advertisement->ls_header.length;				length = net_to_host_short(length);				if (length > OSPF_LS_HEADER_SIZE)                    {                    table_free(sptr_type_11_link_advertisement->data);                    sptr_type_11_link_advertisement->data = NULL;                    }                table_free (sptr_database_entry->advertisement.sptr_type_11);                sptr_database_entry->advertisement.sptr_type_11 = NULL;                }		else			{	        table_free (sptr_database_entry->advertisement.sptr_router);		    sptr_database_entry->advertisement.sptr_router = NULL;			}#else /* __OPAQUE_LSA__ */        table_free (sptr_database_entry->advertisement.sptr_router);        sptr_database_entry->advertisement.sptr_router = NULL;#endif /* __OPAQUE_LSA__ */        table_free ((void *) sptr_database_entry);        sptr_database_entry = NULL;        return (NULL);}/****************************************************************************************/static void ospf_remove_mib_database_entry_from_list (OSPF_LS_DATABASE_ENTRY *sptr_database_entry_to_remove,OSPF_AREA_ENTRY *sptr_area){    enum OSPF_LS_TYPE ls_type;    USHORT checksum;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_remove_mib_database_entry_from_list\r\n");    if (sptr_database_entry_to_remove == NULL)        return;    ls_type = sptr_database_entry_to_remove->advertisement.sptr_router->ls_header.type;    checksum = sptr_database_entry_to_remove->advertisement.sptr_router->ls_header.checksum;    switch(ls_type)    {#if defined(__OPAQUE_LSA__)        case OSPF_LS_TYPE_9:            if (ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas > 0)                ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas--;            if (ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCount > 0)                ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCount--;            if ( ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCount == 0 )                ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCksumSum = 0;            else                ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCksumSum -= checksum;#if defined(__OSPF_MIB__)            ospf2Mapi_request( (void *)&ospf.wrnOspfGeneralGroupEntry,                                wrnOspfGenGroupUpdateReqType );            ospf2Mapi_request( (void *)sptr_database_entry_to_remove,                               wrnOspfLocalLsdbDeleteReqType );#endif /* __OSPF_MIB__ */            break;        case OSPF_LS_TYPE_11:            if ( ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCount > 0 )                --ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCount;            if ( ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas > 0 )                --ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas;            if ( ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCount == 0 )                ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCksumSum = 0;            else                ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCksumSum -= checksum;#if defined(__OSPF_MIB__)            ospf2Mapi_request( (void *)&ospf.wrnOspfGeneralGroupEntry,                                wrnOspfGenGroupUpdateReqType );            ospf2Mapi_request( (void *)sptr_database_entry_to_remove,                               wrnOspfExtLsdbDeleteReqType );#endif /* __OSPF_MIB__ */            break;        case OSPF_LS_TYPE_10:            if (ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas > 0)                ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas--;            if ( sptr_area->mib_number_of_type10_lsa > 0 )                sptr_area->mib_number_of_type10_lsa--;            if ( sptr_area->mib_number_of_type10_lsa == 0 )                sptr_area->mib_type10_checksum_sum = 0;            else                sptr_area->mib_type10_checksum_sum -= checksum;#if defined(__OSPF_MIB__)            ospf2Mapi_request( (void *)&ospf.wrnOspfGeneralGroupEntry,                               wrnOspfGenGroupUpdateReqType );            ospf2Mapi_request( (void *)sptr_area, wrnOspfAreaUpdateReqType );            ospf2Mapi_request( (void *)sptr_database_entry_to_remove,                               wrnOspfLsdbDeleteReqType );#endif /* __OSPF_MIB__ */            break;#endif /* __OPAQUE_LSA__ */        case OSPF_LS_AS_EXTERNAL:            if ( ospf.ospfGeneralGroupEntry.ospfExternLsaCount > 0 )                --ospf.ospfGeneralGroupEntry.ospfExternLsaCount;				/*SPR 74782 Fix*/				if (ospf.ospf_external_lsa_count > 0)				{					-- ospf.ospf_external_lsa_count;				}            if ( ospf.ospfGeneralGroupEntry.ospfRxNewLsas > 0 )                --ospf.ospfGeneralGroupEntry.ospfRxNewLsas;            if ( ospf.ospfGener

⌨️ 快捷键说明

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