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

📄 ospf_opaque_lsa.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
									semGive (ospf_global_mutex );									return NULL;									}								else									{									memcpy(((BYTE *)(type_10_lsa)+size_of_link_list_pointers), sptr_database_entry->advertisement.sptr_type_10, size_of_opaque_lsa);									if (type_10_lsa_head == NULL)										{										type_10_lsa_head = type_10_lsa;										}									else										{										ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) type_10_lsa, (OSPF_GENERIC_NODE *) type_10_lsa_head);										}									}								}							}						}					}				}			sptr_area = sptr_area->sptr_forward_link;			}		semGive (ospf_global_mutex );		return type_10_lsa_head;		}	else		{		semGive (ospf_global_mutex );		return NULL;		}    }/***********************************************************************************************************************************//*	Function: ospfRetrieveType11	Input: enum OSPF_SEARCH_TYPE - OSPF_SEARCH_LSA_TYPE|OSPF_SEARCH_LSA_ID|OSPF_SEARCH_ADVERTISING_ROUTER		   ULONG - key_value	RETURNS: OSPF_TYPE_11_LSA_LINK * - link list of type 11 link state advertisements	Description: This function retrieves the type 11 opaque lsas from the opaque lsdb.*/OSPF_TYPE_11_LSA_LINK * ospfRetrieveType11    (    enum OSPF_SEARCH_TYPE key,     ULONG key_value    )    {	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_TYPE_11_LSA_LINK *type_11_lsa_head = NULL;	OSPF_TYPE_11_LSA_LINK *type_11_lsa = NULL;	USHORT size_of_opaque_lsa = 0;	USHORT size_of_type_11_lsa = 0;	USHORT size_of_link_list_pointers = 0;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRetrieveType11\r\n");	key_value = net_to_host_long(key_value);	semTake (ospf_global_mutex , WAIT_FOREVER);	    if (ospf.opaque_capability == TRUE)		{		size_of_link_list_pointers = sizeof(OSPF_TYPE_11_LSA_LINK *) + sizeof(OSPF_TYPE_11_LSA_LINK *);		/* 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;								if ( sptr_database_entry->advertisement.sptr_type_11 != NULL )					{					if (key == OSPF_SEARCH_ADVERTISING_ROUTER)						{						if (sptr_database_entry->advertisement.sptr_type_11->ls_header.advertising_router == key_value)							{							size_of_opaque_lsa = sptr_database_entry->advertisement.sptr_type_11->ls_header.length;							size_of_opaque_lsa = net_to_host_short(size_of_opaque_lsa);							/* Add forward and backward pointer length */							size_of_type_11_lsa = (USHORT)(size_of_opaque_lsa + size_of_link_list_pointers);							type_11_lsa = table_malloc(1, size_of_type_11_lsa);							if (type_11_lsa == NULL)								{								if (type_11_lsa_head != NULL)									{									ospf_free_entire_list ((OSPF_GENERIC_NODE*) type_11_lsa_head);									}								type_11_lsa_head = NULL;								semGive (ospf_global_mutex );								return NULL;								}							else								{								memcpy(((BYTE *)(type_11_lsa)+size_of_link_list_pointers), sptr_database_entry->advertisement.sptr_type_11, size_of_opaque_lsa);								if (type_11_lsa_head == NULL)									{									type_11_lsa_head = type_11_lsa;									}								else									{									ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) type_11_lsa, (OSPF_GENERIC_NODE *) type_11_lsa_head);									}								}							}						}					else if (key == OSPF_SEARCH_LSA_ID)						{						if (sptr_database_entry->advertisement.sptr_type_11->ls_header.id.lsid == key_value)							{							size_of_opaque_lsa = sptr_database_entry->advertisement.sptr_type_11->ls_header.length;							size_of_opaque_lsa = net_to_host_short(size_of_opaque_lsa);							/* Add forward and backward pointer length */							size_of_type_11_lsa = (USHORT)(size_of_opaque_lsa + size_of_link_list_pointers);							type_11_lsa = table_malloc(1, size_of_type_11_lsa);							if (type_11_lsa == NULL)								{								if (type_11_lsa_head != NULL)									{									ospf_free_entire_list ((OSPF_GENERIC_NODE*) type_11_lsa_head);									}								type_11_lsa_head = NULL;								semGive (ospf_global_mutex );								return NULL;								}							else								{								memcpy(((BYTE *)(type_11_lsa)+size_of_link_list_pointers), sptr_database_entry->advertisement.sptr_type_11, size_of_opaque_lsa);								if (type_11_lsa_head == NULL)									{									type_11_lsa_head = type_11_lsa;									}								else									{									ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) type_11_lsa, (OSPF_GENERIC_NODE *) type_11_lsa_head);									}								}							}						}					else						{						size_of_opaque_lsa = sptr_database_entry->advertisement.sptr_type_11->ls_header.length;						size_of_opaque_lsa = net_to_host_short(size_of_opaque_lsa);						/* Add forward and backward pointer length */						size_of_type_11_lsa = (USHORT)(size_of_opaque_lsa + size_of_link_list_pointers);						type_11_lsa = table_malloc(1, size_of_type_11_lsa);						if (type_11_lsa == NULL)							{							if (type_11_lsa_head != NULL)								{								ospf_free_entire_list ((OSPF_GENERIC_NODE*) type_11_lsa_head);								}							type_11_lsa_head = NULL;							semGive (ospf_global_mutex );							return NULL;							}						else							{							memcpy(((BYTE *)(type_11_lsa)+size_of_link_list_pointers), sptr_database_entry->advertisement.sptr_type_11, size_of_opaque_lsa);							if (type_11_lsa_head == NULL)								{								type_11_lsa_head = type_11_lsa;								}							else								{								ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) type_11_lsa, (OSPF_GENERIC_NODE *) type_11_lsa_head);								}							}						}					}				}			}		semGive (ospf_global_mutex );		return type_11_lsa_head;		}	else		{		semGive (ospf_global_mutex );		return NULL;		}}/***********************************************************************************************************************************//*	Function: ospfRemoveAllType9	Input: None	RETURNS: int - 0|-1	Description: This function removes all the type 9 opaque lsas from the opaque lsdb.*/int ospfRemoveAllType9()    {	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_AREA_ENTRY *sptr_area = NULL;	OSPF_AREA_ENTRY *sptr_next_area = NULL;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRemoveAllType9 \r\n");	semTake (ospf_global_mutex , WAIT_FOREVER);	for (sptr_area = ospf.sptr_area_list; sptr_area != NULL; sptr_area = sptr_next_area)		{		sptr_next_area = sptr_area->sptr_forward_link;		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]))			{			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);				age = sptr_database_entry->advertisement.sptr_router->ls_header.age = OSPF_MAXIMUM_AGE;				age = net_to_host_short (age);				lsid = sptr_database_entry->advertisement.sptr_router->ls_header.id;				lsid = net_to_host_long(lsid);				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,						sptr_area, 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;}/***********************************************************************************************************************************//*	Function: ospfRemoveAllType10	Input: None	RETURNS: int - 0|-1	Description: This function removes all the type 10 opaque lsas from the opaque lsdb.*/int ospfRemoveAllType10()    {    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_AREA_ENTRY *sptr_area = NULL;    OSPF_AREA_ENTRY *sptr_next_area = NULL;        OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRemoveAllType10 \r\n");        semTake (ospf_global_mutex , WAIT_FOREVER);        for (sptr_area = ospf.sptr_area_list; sptr_area != NULL; sptr_area = sptr_next_area)        {        sptr_next_area = sptr_area->sptr_forward_link;        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]))            {            if (sptr_ls_database_head == NULL)                {                continue;                }            for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry;				/* for each database entry */                 sptr_database_entry != NULL;                  sptr_database_entry = sptr_next_database_entry)                {                advertising_router = sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router;                advertising_router = net_to_host_long (advertising_router);                sptr_next_database_entry = sptr_database_entry->sptr_forward_link;                age = sptr_database_entry->advertisement.sptr_router->ls_header.age = OSPF_MAXIMUM_AGE;                age = net_to_host_short (age);                lsid = sptr_database_entry->advertisement.sptr_router->ls_header.id;                lsid = net_to_host_long(lsid);                                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,                        sptr_area, 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;                    }                }

⌨️ 快捷键说明

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