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

📄 ospf_link_state_database.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
        ospf_print_memory_error_message_and_free_buffer_if_necessary (            (void *)NULL, "OSPF_AVL_LSDB_NODE");        table_free((void*)sptr_new_database_entry);        return (NULL);        }    memset (sptr_database_entry_node, 0x00, sizeof (OSPF_AVL_LSDB_NODE));    sptr_database_entry_node->sptr_database_entry = sptr_new_database_entry;	lsdb_entry_key.id = sptr_new_database_entry->advertisement.sptr_router->ls_header.id;	lsdb_entry_key.router = sptr_new_database_entry->advertisement.sptr_router->ls_header.advertising_router;	lsdb_entry_key.type = sptr_new_database_entry->advertisement.sptr_router->ls_header.type;	key.p = (void*)&lsdb_entry_key;	if(avlInsert(&sptr_database_head->sptr_avl_database_entry,				 sptr_database_entry_node, key, ospfAvlLsdbCompare) == ERROR)        {		OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: Failed to add LSDB entry with id (HEX) = %lx, advertising router (HEX) = %lx\r\n",						   net_to_host_long(lsdb_entry_key.id), net_to_host_long(lsdb_entry_key.router));        }	if (sptr_database_head->sptr_linear_database_entry == NULL)        {        sptr_database_head->sptr_linear_database_entry = (void*)sptr_new_database_entry;        }    else        {        ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *)sptr_new_database_entry,	            (OSPF_GENERIC_NODE *)(sptr_database_head->sptr_linear_database_entry));        }    /* SPR#76812 -- End */    ospf_add_new_mib_database_entry (sptr_new_database_entry, sptr_area);	return (sptr_new_database_entry);    }/**************************************************************************/static void ospf_add_new_mib_database_entry (OSPF_LS_DATABASE_ENTRY *sptr_new_database_entry,OSPF_AREA_ENTRY *sptr_area){    enum OSPF_LS_TYPE ls_type;    USHORT age;    USHORT checksum;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_add_new_mib_database_entry\r\n");    ls_type = sptr_new_database_entry->advertisement.sptr_router->ls_header.type;    checksum = sptr_new_database_entry->advertisement.sptr_router->ls_header.checksum;        /* opaque lsa add new opaque lsa to mib database jkw */        switch(ls_type)    {#if defined(__OPAQUE_LSA__)        case OSPF_LS_TYPE_9:            ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas++;            ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCount++;            ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCksumSum += checksum;#if defined(__OSPF_MIB__)            ospf2Mapi_request( (void *)&ospf.wrnOspfGeneralGroupEntry,                                wrnOspfGenGroupUpdateReqType );            ospf2Mapi_request( (void *)sptr_new_database_entry,                               wrnOspfLocalLsdbCreateReqType );#endif /* __OSPF_MIB__ */            break;        case OSPF_LS_TYPE_10:            ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas++;            sptr_area->mib_number_of_type10_lsa++;            sptr_area->mib_type10_checksum_sum += checksum;#if defined(__OSPF_MIB__)            ospf2Mapi_request( (void *)&ospf.wrnOspfGeneralGroupEntry,                                wrnOspfGenGroupUpdateReqType );            ospf2Mapi_request( (void *)sptr_new_database_entry,                               wrnOspfLsdbCreateReqType);            ospf2Mapi_request( (void *)sptr_area, wrnOspfAreaUpdateReqType );#endif /* __OSPF_MIB__ */            break;        case OSPF_LS_TYPE_11:            ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas++;            ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCount++;            ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCksumSum += checksum;#if defined(__OSPF_MIB__)            ospf2Mapi_request( (void *)&ospf.wrnOspfGeneralGroupEntry,                                wrnOspfGenGroupUpdateReqType );            ospf2Mapi_request((void *)sptr_new_database_entry,                               wrnOspfExtLsdbCreateReqType );#endif /* __OSPF_MIB__ */            break;#endif /* __OPAQUE_LSA__ */        case OSPF_LS_AS_EXTERNAL:            ospf.ospfGeneralGroupEntry.ospfRxNewLsas++;            ospf.ospfGeneralGroupEntry.ospfExternLsaCount++;				/*SPR 74782 Fix*/			age = sptr_new_database_entry->advertisement.sptr_router->ls_header.age;			age = host_to_net_short(age);			if (age != OSPF_MAXIMUM_AGE)			{			ospf.ospf_external_lsa_count ++;			}            ospf.ospfGeneralGroupEntry.ospfExternLsaCksumSum += checksum;#if defined(__OSPF_MIB__)            ospf2Mapi_request( (void *)&ospf.ospfGeneralGroupEntry,                                ospfGenGroupUpdateReqType );            ospf2Mapi_request( (void *)sptr_new_database_entry,                               ospfExtLsdbCreateReqType );#endif /* __OSPF_MIB__ */            break;        case OSPF_LS_ROUTER:        case OSPF_LS_NETWORK:        case OSPF_LS_SUMMARY_NETWORK:        case OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER:#if defined(__NSSA__)        case OSPF_LS_MULTICAST:        case OSPF_LS_TYPE_7:#endif /* __NSSA__ */            ospf.ospfGeneralGroupEntry.ospfRxNewLsas++;            sptr_area->mib_number_of_link_state_advertisements++;            sptr_area->mib_checksum_sum += checksum;#if defined(__OSPF_MIB__)            ospf2Mapi_request( (void *)&ospf.ospfGeneralGroupEntry,                                ospfGenGroupUpdateReqType );            ospf2Mapi_request( (void *)sptr_area, ospfAreaUpdateReqType );            ospf2Mapi_request((void *)sptr_new_database_entry, ospfLsdbCreateReqType);#endif /* __OSPF_MIB__*/            break;        case OSPF_LS_ROUTER_ABR:        case OSPF_LS_ROUTER_ASBR:        case OSPF_LS_MAX:            return;    }        return;}/* SPR#76812 -- Begin *//******************************************************************************** ospf_find_LSA - find LSA** See section 12.2, (page 111-112)** RETURNS: database entry if LSA is found, NULL otherwise** NOMANUAL*/OSPF_LS_DATABASE_ENTRY *    ospf_find_LSA    (    OSPF_AREA_ENTRY *sptr_area,    ULONG id,    ULONG advertising_router,    BYTE_ENUM (OSPF_LS_TYPE) type    )    {    ULONG hash_id;    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_find_LSA\r\n");    hash_id = id;    hash_id = hash_id & OSPF_HASH_MASK;    lsdb_entry_key.id = host_to_net_long(id);    lsdb_entry_key.router = host_to_net_long(advertising_router);    lsdb_entry_key.type = type;    key.p = (void*)&lsdb_entry_key;    switch(type)        {#if defined (__OPAQUE_LSA__)		case OSPF_LS_TYPE_9:			sptr_database_entry_node = (OSPF_AVL_LSDB_NODE*)avlSearch(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][hash_id].sptr_avl_database_entry,							 						  				 key, ospfAvlLsdbCompare);			break;		case OSPF_LS_TYPE_10:			sptr_database_entry_node = (OSPF_AVL_LSDB_NODE*)avlSearch(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][hash_id].sptr_avl_database_entry,											 						 key, ospfAvlLsdbCompare);			break;		case OSPF_LS_TYPE_11:			sptr_database_entry_node = (OSPF_AVL_LSDB_NODE*)avlSearch(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][hash_id].sptr_avl_database_entry,							 						  				 key, ospfAvlLsdbCompare);#endif /* #if defined (__OPAQUE_LSA__) */		case OSPF_LS_AS_EXTERNAL:			sptr_database_entry_node = (OSPF_AVL_LSDB_NODE*)avlSearch(ospf.external_database_hash_table[LS_EXTERNAL_LSA][hash_id].sptr_avl_database_entry,											 						 key, ospfAvlLsdbCompare);			break;		default:			sptr_database_entry_node = (OSPF_AVL_LSDB_NODE*)avlSearch(sptr_area->ls_database_hash_table[type][hash_id].sptr_avl_database_entry,											 						 key, ospfAvlLsdbCompare);			break;        }    if(sptr_database_entry_node != NULL)        {        return(sptr_database_entry_node->sptr_database_entry);	    }    return(NULL);    }/**********************************************************************************************//* section 12.2, (page 111-112) *//**************************************************************************************************************************this function is added to find specifically network LSAs into the database to see if router ID has changed or notadded for ANVL 27.27 SPR# 75793..***************************************************************************************************************************/OSPF_LS_DATABASE_ENTRY *ospf_find_network_LSA    (    OSPF_AREA_ENTRY *sptr_area,    ULONG id    )    {    OSPF_LS_DATABASE_ENTRY *sptr_database_entry;    ULONG database_entry_link_state_id;    ULONG database_entry_advertising_router;    ULONG hash_id;    OSPF_PRINTF_DEBUG (        OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_find_network_LSA\r\n");    hash_id = id;    hash_id = hash_id & OSPF_HASH_MASK;    id = host_to_net_long (id);    /* SPR#76812 */	for (sptr_database_entry = sptr_area->ls_database_hash_table[OSPF_LS_NETWORK][hash_id].sptr_linear_database_entry;	     sptr_database_entry != NULL;	     sptr_database_entry = sptr_database_entry->sptr_forward_link)        {	    if ( sptr_database_entry->advertisement.sptr_router != NULL )       		{            database_entry_link_state_id =                sptr_database_entry->advertisement.sptr_router->ls_header.id;            if (id == database_entry_link_state_id)        	  	{				/* SPR 84312 -- Begin */				database_entry_advertising_router= sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router;				/* SPR 84312 -- End */				database_entry_advertising_router= net_to_host_long (database_entry_advertising_router);/**************************************************************************************************************************   		When a router's Router ID has changed, any network-LSAs that were	    originated with the router's previous Router ID must be flushed. !=ANVL 27.27=! SPR# 75793*************************************************************************************************************************/                if (ospf.router_id == database_entry_advertising_router)                    {                    return (sptr_database_entry);		            }/* FIX for TSR #291001 & TSR #293548   Begin */                if (ospf_check_if_advertisements_link_state_id_is_equal_to_one_of_the_routers_own_IP_interface_addresses (                    sptr_database_entry->advertisement.sptr_router) == FAIL)                    {                    return (sptr_database_entry);                    }                /* LSA is a network-LSA whose link state ID is one of the router's own IP interface addresses                but whose Advertising Router is not equal to the router's own Router ID.                This case should be rare, and it indicates that the router's Router ID has changed since originating the LSA).                In this case, instead of updating the LSA, the LSA should be flushed from the routing domain by incrementing                the received LSA's LS age to MAxAge and reflooding. [RFC 2328, Section 13.4 page 151]                *//* FIX for TSR #291001 & TSR #293548  End */                }		    }        }    return (NULL);    }/* SPR#76812 -- End *//********************************************************************************************************************************/OSPF_LS_DATABASE_ENTRY *ospf_free_database_entry (OSPF_LS_DATABASE_ENTRY *sptr_database_entry)    {    OSPF_AREA_ENTRY *sptr_area;

⌨️ 快捷键说明

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