📄 ospf_receive_update.c
字号:
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 + -