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

📄 ospf_receive_update.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 4 页
字号:
	if (sptr_direct_acknowledgement == NULL)		{		ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_LS_HEADER_QUEUE");		return;		}	memset (sptr_direct_acknowledgement, 0x00, sizeof (OSPF_LS_HEADER_QUEUE));	sptr_direct_acknowledgement->ls_header.age = sptr_advertisement->ls_header.age;	sptr_direct_acknowledgement->ls_header.options._byte = sptr_advertisement->ls_header.options._byte;	sptr_direct_acknowledgement->ls_header.type = sptr_advertisement->ls_header.type;	sptr_direct_acknowledgement->ls_header.id = sptr_advertisement->ls_header.id;	sptr_direct_acknowledgement->ls_header.advertising_router = sptr_advertisement->ls_header.advertising_router;	sptr_direct_acknowledgement->ls_header.sequence_number = sptr_advertisement->ls_header.sequence_number;	sptr_direct_acknowledgement->ls_header.checksum = sptr_advertisement->ls_header.checksum;	sptr_direct_acknowledgement->ls_header.length = sptr_advertisement->ls_header.length;	(void) ospf_send_acknowledgement (sptr_interface, sptr_neighbor, &sptr_direct_acknowledgement);	return;}/*******************************************************************************************************************************/static enum TEST ospf_make_a_copy_of_new_advertisement_from_rx_update (	UNION_OSPF_LINK_STATE_ADVERTISEMENT **ptr_sptr_union_new_advertisement,	OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER **ptr_sptr_advertisement_to_be_installed_in_lsdb,	OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_advertisement_in_rxed_packet, OSPF_INTERFACE *sptr_interface){#if defined (__OPAQUE_LSA__)	OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *sptr_type_9_lsa = NULL;	OSPF_TYPE_10_LINK_ADVERTISEMENT_HEADER *sptr_type_10_lsa = NULL;	OSPF_TYPE_11_LINK_ADVERTISEMENT_HEADER *sptr_type_11_lsa = NULL;	USHORT data_size = 0x0000;	USHORT length_of_opaque_advertisement = 0x0000;	OSPF_LS_OPAQUE_HEADER *opaque_lsa = NULL;	USHORT opaque_ls_header_size = 0x0000;#endif /* __OPAQUE_LSA__ */	USHORT length_of_advertisement_to_be_installed_in_lsdb;	PARAMETER_NOT_USED(sptr_interface);	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_make_a_copy_of_new_advertisement_from_rx_update\r\n");	length_of_advertisement_to_be_installed_in_lsdb = sptr_advertisement_in_rxed_packet->ls_header.length;	length_of_advertisement_to_be_installed_in_lsdb = net_to_host_short (length_of_advertisement_to_be_installed_in_lsdb );    if ( length_of_advertisement_to_be_installed_in_lsdb <= 0 )        return( FAIL );	if (*ptr_sptr_union_new_advertisement != NULL)		{		return (FAIL);		}	*ptr_sptr_union_new_advertisement = (UNION_OSPF_LINK_STATE_ADVERTISEMENT *)	table_malloc (1, sizeof (UNION_OSPF_LINK_STATE_ADVERTISEMENT));	if (*ptr_sptr_union_new_advertisement == NULL )		{		ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "UNION_OSPF_LINK_STATE_ADVERTISEMENT");		return (FAIL);		}	if (*ptr_sptr_advertisement_to_be_installed_in_lsdb != NULL)		{		return (FAIL);		}#if defined (__OPAQUE_LSA__)	if (sptr_advertisement_in_rxed_packet->ls_header.type == OSPF_LS_TYPE_9)		{		opaque_ls_header_size = sizeof(OSPF_LS_OPAQUE_HEADER);		data_size = (USHORT)(length_of_advertisement_to_be_installed_in_lsdb - opaque_ls_header_size);		length_of_opaque_advertisement = (USHORT)(sizeof(OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER) + data_size);		*ptr_sptr_advertisement_to_be_installed_in_lsdb = (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *)table_malloc(1, length_of_opaque_advertisement);		}	else if (sptr_advertisement_in_rxed_packet->ls_header.type == OSPF_LS_TYPE_10)		{		opaque_ls_header_size = sizeof(OSPF_LS_OPAQUE_HEADER);		data_size = (USHORT)(length_of_advertisement_to_be_installed_in_lsdb - opaque_ls_header_size);		length_of_opaque_advertisement = (USHORT)(sizeof(OSPF_TYPE_10_LINK_ADVERTISEMENT_HEADER) + data_size);		*ptr_sptr_advertisement_to_be_installed_in_lsdb = (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *) table_malloc(1, length_of_opaque_advertisement);		}	else if (sptr_advertisement_in_rxed_packet->ls_header.type == OSPF_LS_TYPE_11)		{		opaque_ls_header_size = sizeof(OSPF_LS_OPAQUE_HEADER);		data_size = (USHORT)(length_of_advertisement_to_be_installed_in_lsdb - opaque_ls_header_size);		length_of_opaque_advertisement = (USHORT)(sizeof(OSPF_TYPE_11_LINK_ADVERTISEMENT_HEADER) + data_size);		*ptr_sptr_advertisement_to_be_installed_in_lsdb = (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *) table_malloc(1, length_of_opaque_advertisement);		}	else		{		*ptr_sptr_advertisement_to_be_installed_in_lsdb = (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *) table_malloc (1, length_of_advertisement_to_be_installed_in_lsdb);		}#else /* __OPAQUE_LSA__ */		*ptr_sptr_advertisement_to_be_installed_in_lsdb = (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *) table_malloc (1, length_of_advertisement_to_be_installed_in_lsdb);#endif /* __OPAQUE_LSA__ */	if (*ptr_sptr_advertisement_to_be_installed_in_lsdb == NULL )		{        ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER");		return (FAIL);		}	memset (*ptr_sptr_union_new_advertisement, 0x00, sizeof (UNION_OSPF_LINK_STATE_ADVERTISEMENT) );#if defined (__OPAQUE_LSA__)	memset (*ptr_sptr_advertisement_to_be_installed_in_lsdb, 0x00, length_of_opaque_advertisement );	if (sptr_advertisement_in_rxed_packet->ls_header.type == OSPF_LS_TYPE_9)		{		opaque_lsa = (OSPF_LS_OPAQUE_HEADER *)sptr_advertisement_in_rxed_packet;		sptr_type_9_lsa = (OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *)*ptr_sptr_advertisement_to_be_installed_in_lsdb;		memcpy (&(sptr_type_9_lsa->ls_header), opaque_lsa, opaque_ls_header_size);		if (data_size > 0)			{			sptr_type_9_lsa->data = table_malloc(1, data_size);			if (sptr_type_9_lsa->data == NULL)				{				ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) *ptr_sptr_union_new_advertisement, "UNION_OSPF_LINK_STATE_ADVERTISEMENT");				return (FAIL);				}			memset(sptr_type_9_lsa->data, 0x00, data_size);			memcpy (sptr_type_9_lsa->data, ((BYTE *)(opaque_lsa)+opaque_ls_header_size), data_size);			}		}	else if (sptr_advertisement_in_rxed_packet->ls_header.type == OSPF_LS_TYPE_10)		{		opaque_lsa = (OSPF_LS_OPAQUE_HEADER *)sptr_advertisement_in_rxed_packet;		sptr_type_10_lsa = (OSPF_TYPE_10_LINK_ADVERTISEMENT_HEADER *)*ptr_sptr_advertisement_to_be_installed_in_lsdb;		memcpy (&(sptr_type_10_lsa->ls_header), opaque_lsa, opaque_ls_header_size);		if (data_size > 0)			{			sptr_type_10_lsa->data = table_malloc(1, data_size);			if (sptr_type_10_lsa->data == NULL)				{				ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) *ptr_sptr_union_new_advertisement, "UNION_OSPF_LINK_STATE_ADVERTISEMENT");				return (FAIL);				}			memset(sptr_type_10_lsa->data, 0x00, data_size);			memcpy (sptr_type_10_lsa->data, ((BYTE *)(opaque_lsa)+opaque_ls_header_size), data_size);			}		}	else if (sptr_advertisement_in_rxed_packet->ls_header.type == OSPF_LS_TYPE_11)		{		opaque_lsa = (OSPF_LS_OPAQUE_HEADER *)sptr_advertisement_in_rxed_packet;		sptr_type_11_lsa = (OSPF_TYPE_11_LINK_ADVERTISEMENT_HEADER *)*ptr_sptr_advertisement_to_be_installed_in_lsdb;		memcpy (&(sptr_type_11_lsa->ls_header), opaque_lsa, opaque_ls_header_size);		if (data_size > 0)			{			sptr_type_11_lsa->data = table_malloc(1, data_size);			if (sptr_type_11_lsa->data == NULL)				{				ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) *ptr_sptr_union_new_advertisement, "UNION_OSPF_LINK_STATE_ADVERTISEMENT");				return (FAIL);				}			memset(sptr_type_11_lsa->data, 0x00, data_size);			memcpy (sptr_type_11_lsa->data, ((BYTE *)(opaque_lsa)+opaque_ls_header_size), data_size);			}		}	else		{		memcpy (*ptr_sptr_advertisement_to_be_installed_in_lsdb, sptr_advertisement_in_rxed_packet, length_of_advertisement_to_be_installed_in_lsdb );		}#else /* __OPAQUE_LSA__ */	memset (*ptr_sptr_advertisement_to_be_installed_in_lsdb, 0x00, length_of_advertisement_to_be_installed_in_lsdb );	memcpy (*ptr_sptr_advertisement_to_be_installed_in_lsdb, sptr_advertisement_in_rxed_packet, length_of_advertisement_to_be_installed_in_lsdb );#endif /* __OPAQUE_LSA__ */	(*ptr_sptr_union_new_advertisement)->sptr_router = *ptr_sptr_advertisement_to_be_installed_in_lsdb;	return (PASS);}/*opaque lsa install a received type 11 in rest of the areas jkw*/#if defined (__OPAQUE_LSA__)/*******************************************************************************************************************************/static void ospf_install_a_received_type_11_lsa_in_rest_of_the_areas (UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_union_new_advertisement, OSPF_AREA_ENTRY* sptr_area_received_in, OSPF_INTERFACE* sptr_interface){	OSPF_DATABASE_INFORMATION_STRUCTURE database_information;	BYTE_ENUM (OSPF_LS_TYPE) type;	ULONG link_state_id;	ULONG advertising_router;	OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_advertisement_to_be_installed_in_lsdb = NULL;	UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_union_new_advertisements_copy;	OSPF_AREA_ENTRY *sptr_area = NULL;	OSPF_AREA_ENTRY *sptr_next_area = NULL;	enum TEST status_of_advertisements_copy_for_installation_in_lsdb;	enum TEST different_lsa;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_install_a_received_type_11_lsa_in_rest_of_the_areas\r\n");	PARAMETER_NOT_USED(sptr_area_received_in);	type = sptr_union_new_advertisement->sptr_router->ls_header.type;	link_state_id = sptr_union_new_advertisement->sptr_router->ls_header.id;	link_state_id = net_to_host_long (link_state_id);	advertising_router = sptr_union_new_advertisement->sptr_router->ls_header.advertising_router;	advertising_router = net_to_host_long (advertising_router);	for (sptr_area = ospf.sptr_area_list; sptr_area != NULL; sptr_area = sptr_next_area)		{		sptr_next_area = sptr_area->sptr_forward_link;        /* Fix SPR# 83420 Starts.  */        if (sptr_area == sptr_area_received_in) {            continue;        }        /* Fix SPR# 83420 Ends.  */        if (sptr_area->flags._bit.stub == TRUE)			{			continue;			}		/* opaque lsa install an external lsa jkw */		/* Check for type 11 lsdb */		/* SPR#76812 -- Begin */		database_information.sptr_database_entry = ospf_find_LSA (NULL, link_state_id, advertising_router, type);		/* SPR#76812 -- End */		if (database_information.sptr_database_entry != NULL)			{			ospf_remove_current_database_copy_from_all_neighbors_retransmission_lists (database_information.sptr_database_entry,				sptr_area->sptr_interfaces);			}		sptr_advertisement_to_be_installed_in_lsdb = NULL;		sptr_union_new_advertisements_copy = NULL;		status_of_advertisements_copy_for_installation_in_lsdb = ospf_make_a_copy_of_new_advertisement_from_rx_update  (			&sptr_union_new_advertisements_copy, &sptr_advertisement_to_be_installed_in_lsdb,			sptr_union_new_advertisement->sptr_router, sptr_interface);		database_information.new_advertisement.sptr_router = sptr_advertisement_to_be_installed_in_lsdb;		/* SPR 85050 */		database_information.sptr_database_entry = ospf_install_a_new_advertisement_in_the_link_state_database (			database_information.sptr_database_entry, sptr_union_new_advertisements_copy, sptr_area,			&different_lsa, 0);		}	return;}#endif /* __OPAQUE_LSA__ */#if defined (__RFC_2328__)/*******************************************************************************************************************************/static bool ospf_is_lsa_self_originated (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_advertisement){	bool self_originated;	enum TEST test_return_type;	ULONG advertising_router;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_is_lsa_self_originated\r\n");	self_originated = false;	test_return_type = ospf_check_if_advertisements_link_state_id_is_equal_to_one_of_the_routers_own_IP_interface_addresses (			sptr_advertisement);	advertising_router = sptr_advertisement->ls_header.advertising_router;	advertising_router = net_to_host_long (advertising_router);	if ((advertising_router == ospf.router_id) ||		((sptr_advertisement->ls_header.type == OSPF_LS_NETWORK) &&	(test_return_type == PASS)))		{		self_originated = true;		}	return (self_originated);}static bool ospf_check_if_neighbor_exchange_or_loading(OSPF_NEIGHBOR *sptr_neighbor){	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_check_if_neighbor_exchange_or_loading\r\n");	if ((sptr_neighbor->state == OSPF_NEIGHBOR_EXCHANGE) || (sptr_neighbor->state == OSPF_NEIGHBOR_LOADING))		{		return false;		}	return true;}#endif /*__RFC_2328__*/

⌨️ 快捷键说明

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