📄 ospf_receive_database.c
字号:
if (sptr_database_packet_header->options._bit.opaque != sptr_neighbor->options._bit.opaque) { /*opaque lsa ignore unrecognized option bits in DD packet jkw*/ /*If routers encounter unrecognized Option bits ignore the capability and process the packet/advertisement normally.*/ if ((sptr_database_packet_header->options._bit.opaque == TRUE) && (ospf.opaque_capability == TRUE)) { sptr_neighbor->opaque_capability = TRUE; } } if (sptr_database_packet_header->options._bit.opaque == sptr_neighbor->options._bit.opaque) { if ((sptr_database_packet_header->options._bit.opaque == TRUE) && (ospf.opaque_capability == TRUE)) { sptr_neighbor->opaque_capability = TRUE; } }#endif /* __OPAQUE_LSA__ */ return 0;}/******************************************************************************************************************************/static void ospf_remove_last_sent_database_summary (OSPF_NEIGHBOR *sptr_neighbor){ OSPF_LS_DATABASE_SUMMARY *sptr_next_database_summary; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_remove_last_sent_database_summary\r\n"); sptr_neighbor->database_summary_queue_count = (USHORT) (sptr_neighbor->database_summary_queue_count - sptr_neighbor->sptr_database_summary->number_of_database_entries); sptr_next_database_summary = sptr_neighbor->sptr_database_summary->sptr_forward_link; ospf_free_ls_database_summary (sptr_neighbor->sptr_database_summary); sptr_neighbor->sptr_database_summary = sptr_next_database_summary;}/****************************************************************************************************************************** * accept as next in sequence and process packet further as follows: * (1) call ospf_parse_database_packet () here if the size_of_packet > 0 * (2) (a) if we're the slave, set the sequence number to the sequence number appearing in the received packet * (b) if we're the master, increment the sequence number * ******************************************************************************************************************************/static enum OSPF_PACKET_STATE ospf_accept_as_next_in_sequence (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; seq_t database_description_sequence_number; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_accept_as_next_in_sequence\r\n"); database_description_sequence_number = sptr_database_packet_header->sequence; database_description_sequence_number = net_to_host_long (database_description_sequence_number); if (size_of_packet > 0x00000000L) { return_type = ospf_parse_database_packet (sptr_database_packet_header, sptr_neighbor, sptr_interface, size_of_packet); if (return_type == STOP_PROCESSING_PACKET) { return (STOP_PROCESSING_PACKET); } } if (sptr_neighbor->mode == OSPF_SLAVE) { sptr_neighbor->database_description_sequence_number = database_description_sequence_number; } else { ++sptr_neighbor->database_description_sequence_number; } return (GOOD_RECEIVE);}/****************************************************************************//* section 10.6 of OSPF specification (page 92) */static enum OSPF_PACKET_STATE ospf_parse_database_packet (OSPF_DATABASE_HEADER *sptr_database_header,OSPF_NEIGHBOR *sptr_neighbor, OSPF_INTERFACE *sptr_interface,ULONG size_of_packet){ OSPF_LS_HEADER *sptr_database_packet; OSPF_LS_DATABASE_ENTRY *sptr_advertisement; OSPF_AREA_ENTRY *sptr_area; OSPF_LS_REQUEST *sptr_ls_request; ULONG elapsed_time; enum TEST test_return_type; char print_buffer[PRINT_BUFFER_SIZE]; char print_buffer_1[PRINT_BUFFER_SIZE]; ULONG current_time; ULONG id; seq_t database_description_sequence_number; ULONG advertising_router; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_parse_database_packet\r\n"); sptr_database_packet = &sptr_database_header->link_state_advertisement_header; for (; size_of_packet > 0x00000000L; size_of_packet -= OSPF_DB_PIECE_SIZE) { /* If we don't have a copy or if neighbors info is newer */ test_return_type = ospf_check_for_valid_ls_type (sptr_interface, sptr_database_packet, OSPF_DATABASE_DESCRIPTION_PACKET); if (test_return_type == FAIL) { 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); database_description_sequence_number = sptr_database_header->sequence; database_description_sequence_number = net_to_host_long (database_description_sequence_number); if (sptr_neighbor->mode == OSPF_MASTER) { OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: 4 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: 4 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 (STOP_PROCESSING_PACKET); } sptr_area = sptr_interface->sptr_area; id = sptr_database_packet->id; id = net_to_host_long (id); advertising_router = sptr_database_packet->advertising_router; advertising_router = net_to_host_long (advertising_router); /* SPR#76812 */ sptr_advertisement = ospf_find_LSA (sptr_area, id, advertising_router, sptr_database_packet->type); /* SPR 84312 -- Begin */ current_time = ospf_get_system_elapsed_time_second (); /* SPR 84312 -- End */ if (sptr_advertisement != NULL) { elapsed_time = current_time - sptr_advertisement->ls_database_time_stamp; } else { elapsed_time = 0x00000000L; } if ((sptr_advertisement == NULL) || ospf_check_if_more_recent (sptr_database_packet, &sptr_advertisement->advertisement.sptr_router->ls_header, elapsed_time)) { /* add piece to list since piece is newer or we don't have it */ sptr_ls_request = (OSPF_LS_REQUEST *) table_malloc (1, sizeof (OSPF_LS_REQUEST)); if (sptr_ls_request == NULL) { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_LS_REQUEST"); continue; } memset (sptr_ls_request, 0x00, sizeof (OSPF_LS_REQUEST)); sptr_ls_request->id = sptr_database_packet->id; sptr_ls_request->advertising_router = sptr_database_packet->advertising_router; sptr_ls_request->sequence_number = sptr_database_packet->sequence_number; sptr_ls_request->checksum = sptr_database_packet->checksum; sptr_ls_request->age = sptr_database_packet->age; if (sptr_neighbor->sptr_ls_request[sptr_database_packet->type] == NULL) { sptr_neighbor->sptr_ls_request[sptr_database_packet->type] = sptr_ls_request; sptr_neighbor->sptr_ls_request[sptr_database_packet->type]->sptr_forward_link = NULL; sptr_neighbor->sptr_ls_request[sptr_database_packet->type]->sptr_backward_link = NULL; } else { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) sptr_ls_request, (OSPF_GENERIC_NODE *) sptr_neighbor->sptr_ls_request[sptr_database_packet->type]); } ++sptr_neighbor->ls_request_queue_count; sptr_neighbor->ls_request_list_has_changed = TRUE; } ++sptr_database_packet; } return (GOOD_RECEIVE);}/*********************************************************************************************/static void ospf_neighbor_full_process_database_packet ( OSPF_DATABASE_HEADER *sptr_database_packet_header, OSPF_NEIGHBOR *sptr_neighbor, OSPF_INTERFACE *sptr_interface ) { 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_full_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_neighbor->mode == OSPF_SLAVE_HOLD) || (sptr_neighbor->mode == OSPF_SLAVE)) && (sptr_neighbor->database_description_sequence_number == database_description_sequence_number) && /* SPR#75769 - begin */ ((ospf_get_system_elapsed_time_second () - sptr_neighbor->last_exchange) < sptr_interface->router_dead_interval)) /* SPR#75769 - end */ { ospf_send_database_summary (sptr_interface, sptr_neighbor); } else if ((sptr_neighbor->mode == OSPF_MASTER) && (sptr_neighbor->database_description_sequence_number - database_description_sequence_number == 0x00000001L)) { return; } else { if (sptr_neighbor->state == OSPF_NEIGHBOR_FULL) { 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: 5 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: 5 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; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -