📄 ospf_receive_database.c
字号:
}#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 + -