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

📄 ospf_opaque_lsa.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
						else if ((sptr_database_entry->sptr_ls_database_retrans == NULL) &&							(ospf.number_of_neighbors_in_exchange_state == ospf.number_of_neighbors_in_full_state))							{							ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (sptr_database_entry);							(void) ospf_free_database_entry (sptr_database_entry);							sptr_database_entry = NULL;							}						}					}				}			}		semGive (ospf_global_mutex );		return 0;		}	else		{		semGive (ospf_global_mutex );		return -1;		}}/***********************************************************************************************************************************//*	Function: ospfRemoveType11	Input: ULONG - opaque_lsid		   ULONG - opaque_advertising_router	RETURNS: int - 0|-1	Description: This function finds the opaque lsa in the opaque lsdb using the link state id	and the advertising router as keys.  The link state advertisement is prematurely aged	by setting the opaque lsa's age to MAXIMUM_AGE and floods it out its interfaces.	It then removes the opaque lsa from the appropriate lists.*/int ospfRemoveType11(ULONG opaque_lsid, ULONG opaque_advertising_router)    {	OSPF_LS_DATABASE_HEAD *sptr_ls_database_head = NULL ;	OSPF_LS_DATABASE_ENTRY *sptr_database_entry = NULL;	OSPF_LS_DATABASE_ENTRY *sptr_next_database_entry = NULL;	USHORT age =0;	enum TEST test_return_type;	ULONG index;	ULONG advertising_router;	ULONG lsid;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRemoveType11 \r\n");	semTake (ospf_global_mutex , WAIT_FOREVER);	    if (ospf.opaque_capability == TRUE)		{		/* Check for type 11 lsdb */		for (index = 0x00000000L, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index]);	/* for each hash list */			index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index]))			{			if (sptr_ls_database_head == NULL)				{				continue;				}			/* SPR#76812 */	       	for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry;	       		sptr_database_entry != NULL; 	      	    sptr_database_entry = sptr_next_database_entry)				{				sptr_next_database_entry = sptr_database_entry->sptr_forward_link;				advertising_router = sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router;				advertising_router = net_to_host_long (advertising_router);				lsid = sptr_database_entry->advertisement.sptr_router->ls_header.id;				lsid = net_to_host_long(lsid);				if ((lsid == opaque_lsid) && (advertising_router == opaque_advertising_router))					{					age = OSPF_MAXIMUM_AGE;					age = host_to_net_short (age);					sptr_database_entry->advertisement.sptr_router->ls_header.age = age;					test_return_type = ospf_check_if_advertisements_link_state_id_is_equal_to_one_of_the_routers_own_IP_interface_addresses (						sptr_database_entry->advertisement.sptr_router);					if ((sptr_database_entry->ls_database_freeme == FALSE) && ((advertising_router == ospf.router_id) ||						((sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_NETWORK) && (test_return_type == PASS)) ) )						{						(void) ospf_flood_advertisement_out_some_subset_of_the_routers_interfaces (sptr_database_entry->advertisement.sptr_router,						ospf.sptr_area_list, NULL, NULL, TRUE);						sptr_database_entry->ls_database_freeme = TRUE;						ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (sptr_database_entry);						(void) ospf_free_database_entry (sptr_database_entry);						sptr_database_entry = NULL;						}					else if ((sptr_database_entry->sptr_ls_database_retrans == NULL) &&						(ospf.number_of_neighbors_in_exchange_state == ospf.number_of_neighbors_in_full_state))						{						ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (sptr_database_entry);						(void) ospf_free_database_entry (sptr_database_entry);						sptr_database_entry = NULL;						}					}				}			}		semGive (ospf_global_mutex );		return 0;		}	else		{		semGive (ospf_global_mutex );		return -1;		}}/***********************************************************************************************************************************//*	Function: ospfRefreshOpaqueLsa	Input: ULONG - ip_address		   ULONG - netmask		   BYTE - lsa_type		   ULONG - opaque_lsid		   ULONG advertising_router	RETURNS: int - 0|-1	Description: This function finds the opaque lsa in the opaque lsdb using the link state id	and the advertising router as keys.  The link state advertisement is prematurely aged	by setting the opaque lsa's age to MAXIMUM_AGE and floods it out its interfaces.  The	link state advertisement's age is then set to 0 and flooded out its interfaces.*/int ospfRefreshOpaqueLsa    (    ULONG ip_address,     ULONG netmask,     BYTE lsa_type,	ULONG opaque_lsid,     ULONG opaque_advertising_router    )    {	OSPF_AREA_ENTRY *sptr_area = ospf.sptr_area_list;	OSPF_LS_DATABASE_HEAD *sptr_ls_database_head = NULL;	OSPF_LS_DATABASE_ENTRY *sptr_database_entry = NULL;	OSPF_LS_DATABASE_ENTRY *sptr_next_database_entry = NULL;    ULONG index;	OSPF_INTERFACE *sptr_interface = NULL;	OSPF_INTERFACE *sptr_next_interface = NULL;	ULONG lsid = 0x00000000;	ULONG advertising_router = 0x00000000;	enum BOOLEAN first_pass_external = TRUE;	int return_code = -1;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRefreshOpaqueLsa\r\n");	semTake (ospf_global_mutex , WAIT_FOREVER);	    if (ospf.opaque_capability == TRUE)		{    	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->address & sptr_interface->netmask) == (ip_address & netmask))        		{    	        break;        		}    		}		switch (lsa_type)			{			case OSPF_LS_TYPE_9:				while (sptr_area != NULL)					{					for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][index]);	/* for each hash list */						index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][index]))						{						/* SPR#76812 */				       	for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry;				       		sptr_database_entry != NULL;				       	    sptr_database_entry = sptr_next_database_entry)							{							sptr_next_database_entry = sptr_database_entry->sptr_forward_link;														if ( sptr_database_entry->advertisement.sptr_type_9 != NULL )								{								lsid = sptr_database_entry->advertisement.sptr_type_9->ls_header.id.lsid;								lsid = net_to_host_long(lsid);								advertising_router = sptr_database_entry->advertisement.sptr_type_9->ls_header.advertising_router;								advertising_router = net_to_host_long(advertising_router);								if ((lsid == opaque_lsid) && (advertising_router == opaque_advertising_router))									{									ospf_originate_new_instance_of_the_link_state_advertisement (sptr_database_entry, sptr_area, FALSE);									semGive (ospf_global_mutex );									return_code = 0;									return return_code;									}								}							}						}					sptr_area = sptr_area->sptr_forward_link;					}				break;			case OSPF_LS_TYPE_10:				while (sptr_area != NULL)					{					for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][index]);	/* for each hash list */						index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][index]))						{						/* SPR#76812 */				       	for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry;				       		sptr_database_entry != NULL;				       	    sptr_database_entry = sptr_next_database_entry)							{							sptr_next_database_entry = sptr_database_entry->sptr_forward_link;							if ( sptr_database_entry->advertisement.sptr_type_10 != NULL )								{								lsid = sptr_database_entry->advertisement.sptr_type_10->ls_header.id.lsid;								lsid = net_to_host_long(lsid);								advertising_router = sptr_database_entry->advertisement.sptr_type_10->ls_header.advertising_router;								advertising_router = net_to_host_long(advertising_router);								if ((lsid == opaque_lsid) && (advertising_router == opaque_advertising_router))									{									ospf_originate_new_instance_of_the_link_state_advertisement (sptr_database_entry, sptr_area, FALSE);									semGive (ospf_global_mutex );									return_code = 0;									return return_code;									}								}							}						}					sptr_area = sptr_area->sptr_forward_link;					}				break;			case OSPF_LS_TYPE_11:				/* Check for type 11 lsdb */				while (sptr_area != NULL)					{					for (index = 0x00000000L, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index]);	/* for each hash list */						index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index]))						{						if (sptr_ls_database_head == NULL)							{							continue;							}						/* SPR#76812 */				       	for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry;				       		sptr_database_entry != NULL;				       	    sptr_database_entry = sptr_next_database_entry)							{							sptr_next_database_entry = sptr_database_entry->sptr_forward_link;							if ( sptr_database_entry->advertisement.sptr_type_11 != NULL )								{								lsid = sptr_database_entry->advertisement.sptr_type_11->ls_header.id.lsid;								lsid = net_to_host_long(lsid);								advertising_router = sptr_database_entry->advertisement.sptr_type_11->ls_header.advertising_router;								advertising_router = net_to_host_long(advertising_router);								if ((lsid == opaque_lsid) && (advertising_router == opaque_advertising_router))									{									ospf_originate_new_instance_of_the_link_state_advertisement (sptr_database_entry, ospf.sptr_area_list, first_pass_external);									first_pass_external = FALSE;									return_code = 0;									}								}							}						}						sptr_area = sptr_area->sptr_forward_link;					}				break;			}		semGive (ospf_global_mutex );		return return_code;		}	else		{		semGive (ospf_global_mutex );		return -1;		}    }/***********************************************************************************************************************************//*	Function: ospfRetrieveNumOpaqueLsa	Input: BYTE - lsa flooding type	RETURNS: ULONG - number of opaque lsas	Description: This function finds the number of opaque lsas in the opaque lsdb using	the link state flooding type as the key.*/ULONG ospfRetrieveNumOpaqueLsa(BYTE lsa_flooding_type)    {	OSPF_AREA_ENTRY *sptr_area = ospf.sptr_area_list;	OSPF_LS_DATABASE_HEAD *sptr_ls_database_head = NULL;	OSPF_LS_DATABASE_ENTRY *sptr_database_entry = NULL;	OSPF_LS_DATABASE_ENTRY *sptr_next_database_entry = NULL;    ULONG index;	ULONG opaque_lsa_count = 0;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRetrieveNumOpaqueLsa\r\n");	semTake (ospf_global_mutex , WAIT_FOREVER);	    if (ospf.opaque_capability == TRUE)		{		switch (lsa_flooding_type)			{			case OSPF_LS_TYPE_9:				while (sptr_area != NULL)					{					for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][index]);	/* for each hash list */						index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][index]))						{						/* SPR#76812 */				       	for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry;				       		sptr_database_entry != NULL;				       	    sptr_database_entry = sptr_next_database_entry)							{							sptr_next_database_entry = sptr_database_entry->sptr_forward_link;														if ( sptr_database_entry->advertisement.sptr_type_9 != NULL )								{								opaque_lsa_count++;								}							}						}					sptr_area = sptr_area->sptr_forward_link;					}				break;			case OSPF_LS_TYPE_10:				sptr_area = ospf.sptr_area_list;				sptr_ls_database_head = NULL;				sptr_database_entry = NULL;				index =0;				while (sptr_area != NULL)					{					for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][index]);	/* for each hash list */						index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][index]))						{						/* SPR#76812 */	 			      	for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry;				       		sptr_database_entry != NULL;				       	    sptr_database_entry = sptr_next_database_entry)							{

⌨️ 快捷键说明

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