📄 ospf_link_state_database.c
字号:
OSPF_ROUTING_TABLE_NODE * sptr_routing_table_node = NULL; ULONG ls_id; ULONG hash_id; char print_buffer[PRINT_BUFFER_SIZE]; OSPF_LS_DATABASE_HEAD *sptr_database_head; enum OSPF_LS_TYPE type; OSPF_LS_DATABASE_ENTRY *sptr_database_entry_head;#if defined (__OPAQUE_LSA__) OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *sptr_type_9_link_advertisement; OSPF_TYPE_10_LINK_ADVERTISEMENT_HEADER *sptr_type_10_link_advertisement; OSPF_TYPE_11_LINK_ADVERTISEMENT_HEADER *sptr_type_11_link_advertisement; USHORT length = 0;#endif enum OSPF_ROUTE_TABLE_TYPE table_type; GENERIC_ARGUMENT key; OSPF_AVL_LSDB_KEY lsdb_entry_key; OSPF_AVL_LSDB_NODE * sptr_database_entry_node = NULL; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_free_database_entry\r\n"); /* SPR 88619 start */ /* before database entry is deleted, deallocate its timestamps */ ospf_free_timestamps_for_lsdb_entry(sptr_database_entry); /* SPR 88619 end */ OSPF_PRINTF_MEMORY (OSPF_MEMORY_PRINTF, "OSPF: freeing database entry\r\n"); sptr_database_entry_head = NULL; PARAMETER_NOT_USED (sptr_database_entry_head); sptr_area = sptr_database_entry->sptr_ls_database_area; if (sptr_area != NULL) { ospf_remove_mib_database_entry_from_list ( sptr_database_entry, sptr_area); } if (sptr_database_entry->advertisement.sptr_router != NULL) { ls_id = sptr_database_entry->advertisement.sptr_router->ls_header.id; ls_id = net_to_host_long (ls_id); OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_DEBUG (print_buffer, ls_id); OSPF_PRINTF_MEMORY (OSPF_MEMORY_PRINTF, "OSPF: id = %s\r\n", print_buffer); hash_id = ls_id & OSPF_RT_HASH_MASK; /* SPR#76812 -- Begin */ for (table_type = OSPF_ROUTE_TABLE_NETWORK; table_type < OSPF_ROUTE_TABLE_MAX; table_type++) { for (sptr_routing_table_node = ospf.sptr_routing_table_head[table_type][hash_id]; sptr_routing_table_node != NULL; sptr_routing_table_node = sptr_routing_table_node->sptr_forward_link) { if (sptr_routing_table_node->sptr_routing_table_entry->destination_id == ls_id) { break; } } if(sptr_routing_table_node != NULL) { break; } } /* SPR#76812 -- End */ if (sptr_routing_table_node != NULL) { sptr_routing_table_node->sptr_routing_table_entry->sptr_link_state_origin = NULL; } type = (enum OSPF_LS_TYPE) sptr_database_entry->advertisement.sptr_router->ls_header.type; OSPF_PRINTF_MEMORY ( OSPF_MEMORY_PRINTF, "OSPF: type = %s\r\n", cptr_ls_type_string[type]); } /* opaque lsa free up opaque lsa from database */ if (sptr_database_entry->ls_database_type == OSPF_LS_AS_EXTERNAL) { sptr_database_head = &ospf.external_database_hash_table[LS_EXTERNAL_LSA][sptr_database_entry->ls_database_hash]; }#if defined (__OPAQUE_LSA__) else if (sptr_database_entry->ls_database_type == OSPF_LS_TYPE_9) { sptr_database_head = &sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][sptr_database_entry->ls_database_hash]; } else if (sptr_database_entry->ls_database_type == OSPF_LS_TYPE_10) { sptr_database_head = &sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][sptr_database_entry->ls_database_hash]; } /* Check for type 11 lsdb */ else if (sptr_database_entry->ls_database_type == OSPF_LS_TYPE_11) { sptr_database_head = &ospf.type_11_database_hash_table[LS_TYPE_11_LSA][sptr_database_entry->ls_database_hash]; }#endif /* __OPAQUE_LSA__ */ else { sptr_database_head = &sptr_area->ls_database_hash_table[sptr_database_entry->ls_database_type][sptr_database_entry->ls_database_hash]; } sptr_database_entry->vptr_route = NULL; sptr_database_entry->sptr_database_autonomous_system_border_router = NULL; sptr_database_entry->sptr_database_border_router = NULL; sptr_database_entry->sptr_ls_database_area = NULL; sptr_database_entry->sptr_next_hop = NULL; /* SPR#76812 -- Begin */ lsdb_entry_key.id = sptr_database_entry->advertisement.sptr_router->ls_header.id; lsdb_entry_key.router = sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router; lsdb_entry_key.type = sptr_database_entry->advertisement.sptr_router->ls_header.type; key.p = (void*)&lsdb_entry_key; sptr_database_entry_node = (OSPF_AVL_LSDB_NODE*)avlDelete(&sptr_database_head->sptr_avl_database_entry, key, ospfAvlLsdbCompare); if(sptr_database_entry_node != NULL) { table_free((void*)sptr_database_entry_node); } ospf_remove_node_from_list ( (OSPF_GENERIC_NODE **) &(sptr_database_head->sptr_linear_database_entry), (OSPF_GENERIC_NODE *) sptr_database_entry); /* SPR#76812 -- End */#if defined (__OPAQUE_LSA__) if (sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_TYPE_9) { sptr_type_9_link_advertisement = (OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *)sptr_database_entry->advertisement.sptr_type_9; length = sptr_type_9_link_advertisement->ls_header.length; length = net_to_host_short(length); if (length > OSPF_LS_HEADER_SIZE) { table_free(sptr_type_9_link_advertisement->data); sptr_type_9_link_advertisement->data = NULL; } table_free (sptr_database_entry->advertisement.sptr_type_9); sptr_database_entry->advertisement.sptr_type_9 = NULL; } else if (sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_TYPE_10) { sptr_type_10_link_advertisement = (OSPF_TYPE_10_LINK_ADVERTISEMENT_HEADER *)sptr_database_entry->advertisement.sptr_type_10; length = sptr_type_10_link_advertisement->ls_header.length; length = net_to_host_short(length); if (length > OSPF_LS_HEADER_SIZE) { table_free(sptr_type_10_link_advertisement->data); sptr_type_10_link_advertisement->data = NULL; } table_free (sptr_database_entry->advertisement.sptr_type_10); sptr_database_entry->advertisement.sptr_type_10 = NULL; } else if (sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_TYPE_11) { sptr_type_11_link_advertisement = (OSPF_TYPE_11_LINK_ADVERTISEMENT_HEADER *)sptr_database_entry->advertisement.sptr_type_11; length = sptr_type_11_link_advertisement->ls_header.length; length = net_to_host_short(length); if (length > OSPF_LS_HEADER_SIZE) { table_free(sptr_type_11_link_advertisement->data); sptr_type_11_link_advertisement->data = NULL; } table_free (sptr_database_entry->advertisement.sptr_type_11); sptr_database_entry->advertisement.sptr_type_11 = NULL; } else { table_free (sptr_database_entry->advertisement.sptr_router); sptr_database_entry->advertisement.sptr_router = NULL; }#else /* __OPAQUE_LSA__ */ table_free (sptr_database_entry->advertisement.sptr_router); sptr_database_entry->advertisement.sptr_router = NULL;#endif /* __OPAQUE_LSA__ */ table_free ((void *) sptr_database_entry); sptr_database_entry = NULL; return (NULL);}/****************************************************************************************/static void ospf_remove_mib_database_entry_from_list (OSPF_LS_DATABASE_ENTRY *sptr_database_entry_to_remove,OSPF_AREA_ENTRY *sptr_area){ enum OSPF_LS_TYPE ls_type; USHORT checksum; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_remove_mib_database_entry_from_list\r\n"); if (sptr_database_entry_to_remove == NULL) return; ls_type = sptr_database_entry_to_remove->advertisement.sptr_router->ls_header.type; checksum = sptr_database_entry_to_remove->advertisement.sptr_router->ls_header.checksum; switch(ls_type) {#if defined(__OPAQUE_LSA__) case OSPF_LS_TYPE_9: if (ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas > 0) ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas--; if (ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCount > 0) ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCount--; if ( ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCount == 0 ) ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCksumSum = 0; else ospf.wrnOspfGeneralGroupEntry.wrnOspfType9LsaCksumSum -= checksum;#if defined(__OSPF_MIB__) ospf2Mapi_request( (void *)&ospf.wrnOspfGeneralGroupEntry, wrnOspfGenGroupUpdateReqType ); ospf2Mapi_request( (void *)sptr_database_entry_to_remove, wrnOspfLocalLsdbDeleteReqType );#endif /* __OSPF_MIB__ */ break; case OSPF_LS_TYPE_11: if ( ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCount > 0 ) --ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCount; if ( ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas > 0 ) --ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas; if ( ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCount == 0 ) ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCksumSum = 0; else ospf.wrnOspfGeneralGroupEntry.wrnOspfType11LsaCksumSum -= checksum;#if defined(__OSPF_MIB__) ospf2Mapi_request( (void *)&ospf.wrnOspfGeneralGroupEntry, wrnOspfGenGroupUpdateReqType ); ospf2Mapi_request( (void *)sptr_database_entry_to_remove, wrnOspfExtLsdbDeleteReqType );#endif /* __OSPF_MIB__ */ break; case OSPF_LS_TYPE_10: if (ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas > 0) ospf.wrnOspfGeneralGroupEntry.wrnOspfRxNewOpaqueLsas--; if ( sptr_area->mib_number_of_type10_lsa > 0 ) sptr_area->mib_number_of_type10_lsa--; if ( sptr_area->mib_number_of_type10_lsa == 0 ) sptr_area->mib_type10_checksum_sum = 0; else sptr_area->mib_type10_checksum_sum -= checksum;#if defined(__OSPF_MIB__) ospf2Mapi_request( (void *)&ospf.wrnOspfGeneralGroupEntry, wrnOspfGenGroupUpdateReqType ); ospf2Mapi_request( (void *)sptr_area, wrnOspfAreaUpdateReqType ); ospf2Mapi_request( (void *)sptr_database_entry_to_remove, wrnOspfLsdbDeleteReqType );#endif /* __OSPF_MIB__ */ break;#endif /* __OPAQUE_LSA__ */ case OSPF_LS_AS_EXTERNAL: if ( ospf.ospfGeneralGroupEntry.ospfExternLsaCount > 0 ) --ospf.ospfGeneralGroupEntry.ospfExternLsaCount; /*SPR 74782 Fix*/ if (ospf.ospf_external_lsa_count > 0) { -- ospf.ospf_external_lsa_count; } if ( ospf.ospfGeneralGroupEntry.ospfRxNewLsas > 0 ) --ospf.ospfGeneralGroupEntry.ospfRxNewLsas; if ( ospf.ospfGener
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -