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

📄 ospf_receive_database.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 3 页
字号:
		}#endif /* __OPAQUE_LSA__ */	ospf_execute_neighbor_state_machine (OSPF_NEGOTIATION_DONE, sptr_neighbor->state, sptr_interface, sptr_neighbor);	if (sptr_neighbor->state != OSPF_NEIGHBOR_EXCHANGE)				/* check to make sure the state transitioned to Exchange */		{		sptr_neighbor->flags._bit.initialize = TRUE;		sptr_neighbor->flags._bit.more = TRUE;		sptr_neighbor->flags._bit.master = TRUE;		sptr_neighbor->mode = OSPF_CLEAR_MODE;		return_type.exit_routine = FALSE;		return_type.packet_state = STOP_PROCESSING_PACKET;		/* it didn't - probably out of buffers */		return (return_type);		}	/* See ExStart state actions in 10.6 */	return_type.packet_state = ospf_accept_as_next_in_sequence (sptr_database_packet_header, size_of_packet, sptr_neighbor, sptr_interface);	if (return_type.packet_state == STOP_PROCESSING_PACKET)		{		return_type.exit_routine = TRUE;		return_type.packet_state = GOOD_RECEIVE;		return (return_type);		}	/* if we're the slave, this is a Database Description Packet in reply; if we're the master, this is a new Database Description Packet */	ospf_send_database_summary (sptr_interface, sptr_neighbor);	return_type.exit_routine = FALSE;	return_type.packet_state = GOOD_RECEIVE;	return (return_type);}/******************************************************************************************************************************/static void ospf_neighbor_exchange_process_database_packet (OSPF_DATABASE_HEADER *sptr_database_packet_header,ULONG size_of_packet,	OSPF_NEIGHBOR *sptr_neighbor,OSPF_INTERFACE *sptr_interface){	enum OSPF_PACKET_STATE	return_type;	char print_buffer[PRINT_BUFFER_SIZE];	char print_buffer_1[PRINT_BUFFER_SIZE];	seq_t database_description_sequence_number;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_neighbor_exchange_process_database_packet\r\n");	database_description_sequence_number = sptr_database_packet_header->sequence;	database_description_sequence_number = net_to_host_long (database_description_sequence_number);	    if (((sptr_database_packet_header->flags._bit.master == TRUE) && (sptr_neighbor->mode != OSPF_SLAVE)) ||		((sptr_database_packet_header->flags._bit.master == FALSE) && (sptr_neighbor->mode != OSPF_MASTER)) ||		(sptr_database_packet_header->flags._bit.initialize == TRUE)      )   /* first bullet item under Exchange, section 10.6 of spec. (p 91) */		{		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer, sptr_neighbor->id);		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer_1, sptr_neighbor->address);		if (sptr_neighbor->mode == OSPF_MASTER)			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 1 Lost Master Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}		else			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 1 Lost Slave Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: MASTER BIT %d SLAVE MODE %d INITIALIZE %d\r\n", sptr_database_packet_header->flags._bit.master,sptr_neighbor->mode,				sptr_database_packet_header->flags._bit.initialize);			}		ospf_execute_neighbor_state_machine (OSPF_SEQUENCE_NUMBER_MISMATCH, sptr_neighbor->state, sptr_interface, sptr_neighbor);		}	/* second bullet item under Exchange, (p 91) */	else if (check_database_packet_header_options(sptr_database_packet_header, sptr_neighbor, sptr_interface, database_description_sequence_number))		{		return;		}	else if ((sptr_neighbor->mode == OSPF_MASTER) && (sptr_neighbor->database_description_sequence_number == database_description_sequence_number)) /* third bullet,(p 91)*/		{		return_type = ospf_accept_as_next_in_sequence (sptr_database_packet_header, size_of_packet, sptr_neighbor, sptr_interface);		if (return_type == STOP_PROCESSING_PACKET)			{			return;			}		if ((sptr_database_packet_header->flags._bit.more == FALSE) &&	(sptr_neighbor->sptr_database_summary != NULL) &&			(sptr_neighbor->sptr_database_summary->sptr_ospf_header->rest_of_packet.database.flags._bit.more == FALSE))			{			ospf_execute_neighbor_state_machine (OSPF_EXCHANGE_DONE, sptr_neighbor->state, sptr_interface, sptr_neighbor);/* more bit is not set */			return;			}		else			{			if ((sptr_neighbor->sptr_database_summary != NULL) && (sptr_neighbor->sptr_database_summary->sptr_ospf_header->rest_of_packet.database.flags._bit.more == TRUE))				{				ospf_remove_last_sent_database_summary (sptr_neighbor);				}			ospf_send_database_summary (sptr_interface, sptr_neighbor);	 	/* more bit is set, so send a new Database Description Packet to the slave */			}		}	else if ((sptr_neighbor->mode == OSPF_MASTER) && (sptr_neighbor->database_description_sequence_number - database_description_sequence_number == 0x00000001))	/* forth bullet */		{		return;																			/* discard duplicate packet */		}	else if ((sptr_neighbor->mode == OSPF_SLAVE) && (database_description_sequence_number - sptr_neighbor->database_description_sequence_number == 0x00000001))	/* fifth bullet */		{		return_type = ospf_accept_as_next_in_sequence (sptr_database_packet_header, size_of_packet, sptr_neighbor, sptr_interface);		if (return_type == STOP_PROCESSING_PACKET)			{			return;			}		if (sptr_neighbor->sptr_database_summary != NULL)			{			ospf_remove_last_sent_database_summary (sptr_neighbor);			}		ospf_send_database_summary (sptr_interface, sptr_neighbor);			/* we're the slave, so send a Database Description Packet in reply */		if ((sptr_database_packet_header->flags._bit.more == FALSE) && ((sptr_neighbor->sptr_database_summary == NULL) || /* check if the received packet */			(sptr_neighbor->sptr_database_summary->sptr_ospf_header->rest_of_packet.database.flags._bit.more == FALSE)))				  /* has the more bit set to 0 */			{			ospf_execute_neighbor_state_machine (OSPF_EXCHANGE_DONE, sptr_neighbor->state, sptr_interface, sptr_neighbor);		/* it does */			}		}	else if ((sptr_neighbor->mode == OSPF_SLAVE) && (database_description_sequence_number == sptr_neighbor->database_description_sequence_number))			/* sixth bullet */		{		ospf_send_database_summary (sptr_interface, sptr_neighbor);			/* duplicate packet, so repeat last Database Description packet that was sent */		}	else																																					 /* seventh bullet */		{		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer, sptr_neighbor->id);		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer_1, sptr_neighbor->address);		if (sptr_neighbor->mode == OSPF_MASTER)			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 3 Lost Master Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}		else			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 3 Lost Slave Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}		ospf_execute_neighbor_state_machine (OSPF_SEQUENCE_NUMBER_MISMATCH, sptr_neighbor->state, sptr_interface, sptr_neighbor); /* stop processing packet */		}	return;}static int check_database_packet_header_options(OSPF_DATABASE_HEADER *sptr_database_packet_header, OSPF_NEIGHBOR *sptr_neighbor, OSPF_INTERFACE *sptr_interface, seq_t database_description_sequence_number){	char print_buffer[PRINT_BUFFER_SIZE];	char print_buffer_1[PRINT_BUFFER_SIZE];	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering check_database_packet_header_options\r\n");	if (sptr_database_packet_header->options._bit.externals != sptr_neighbor->options._bit.externals)		{		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer, sptr_neighbor->id);		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer_1, sptr_neighbor->address);		if (sptr_neighbor->mode == OSPF_MASTER)			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: External Option Mismatch\n");			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 2 Lost Master Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}		else			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: External Option Mismatch\n");			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 2 Lost Slave Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}			ospf_execute_neighbor_state_machine (OSPF_SEQUENCE_NUMBER_MISMATCH, sptr_neighbor->state, sptr_interface, sptr_neighbor);			return 1;		}	if (sptr_database_packet_header->options._bit.multicast != sptr_neighbor->options._bit.multicast)		{		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer, sptr_neighbor->id);		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer_1, sptr_neighbor->address);		if (sptr_neighbor->mode == OSPF_MASTER)			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: Multicast Option Mismatch\n");			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 2 Lost Master Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}		else			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: Multicast Option Mismatch\n");			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 2 Lost Slave Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}			ospf_execute_neighbor_state_machine (OSPF_SEQUENCE_NUMBER_MISMATCH, sptr_neighbor->state, sptr_interface, sptr_neighbor);			return 1;		}#if defined (__NSSA__)	if (sptr_database_packet_header->options._bit.nssa != sptr_neighbor->options._bit.nssa)		{		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer, sptr_neighbor->id);		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer_1, sptr_neighbor->address);		if (sptr_neighbor->mode == OSPF_MASTER)			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: NSSA Option Mismatch\n");			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 2 Lost Master Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}		else			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: NSSA Option Mismatch\n");			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 2 Lost Slave Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}			ospf_execute_neighbor_state_machine (OSPF_SEQUENCE_NUMBER_MISMATCH, sptr_neighbor->state, sptr_interface, sptr_neighbor);			return 1;		}#endif /* __NSSA__ */	if (sptr_database_packet_header->options._bit.dont_propagate != sptr_neighbor->options._bit.dont_propagate)		{		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer, sptr_neighbor->id);		OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_ALARM (print_buffer_1, sptr_neighbor->address);		if (sptr_neighbor->mode == OSPF_MASTER)			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: Do Not Propagate Option Mismatch\n");			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 2 Lost Master Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}		else			{			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: Do Not Propagate Option Mismatch\n");			OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 2 Lost Slave Neighbor %s with address %s due to sequence number mismatch (%d vs %d)\r\n",				print_buffer, print_buffer_1, sptr_neighbor->database_description_sequence_number, database_description_sequence_number);			}			ospf_execute_neighbor_state_machine (OSPF_SEQUENCE_NUMBER_MISMATCH, sptr_neighbor->state, sptr_interface, sptr_neighbor);			return 1;		}#if defined (__OPAQUE_LSA__)

⌨️ 快捷键说明

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