📄 ospf_link_state_database.c
字号:
(data_size == 0) && (sptr_old_instance->advertisement.sptr_type_10->data != NULL) && (old_data_size > 0)) { return (PASS); } else if ((sptr_advertisement->sptr_type_10->data != NULL) && (data_size > 0) && (sptr_old_instance->advertisement.sptr_type_10->data != NULL) && (old_data_size > 0) && (old_data_size == data_size)) { if ((memcmp ((const void *) sptr_old_instance->advertisement.sptr_type_10->data, (const void *) sptr_advertisement->sptr_type_10->data, data_size ) != (int) NULL)) { return (PASS); } } break; } case OSPF_LS_TYPE_11: { old_data_size = sptr_old_instance->advertisement.sptr_type_11->ls_header.length; old_data_size = net_to_host_short(old_data_size); old_data_size = (USHORT)(old_data_size - OSPF_LS_HEADER_SIZE); data_size = sptr_advertisement->sptr_type_11->ls_header.length; data_size = net_to_host_short(data_size); data_size = (USHORT)(data_size - OSPF_LS_HEADER_SIZE); if (sptr_old_instance->advertisement.sptr_type_11->ls_header.id.lsid != sptr_advertisement->sptr_type_11->ls_header.id.lsid) { return (PASS); } else if ((sptr_advertisement->sptr_type_11->data != NULL) && (data_size > 0) && (sptr_old_instance->advertisement.sptr_type_11->data == NULL) && (old_data_size == 0)) { return (PASS); } else if ((sptr_advertisement->sptr_type_11->data == NULL) && (data_size == 0) && (sptr_old_instance->advertisement.sptr_type_11->data != NULL) && (old_data_size > 0)) { return (PASS); } else if ((sptr_advertisement->sptr_type_11->data != NULL) && (data_size > 0) && (sptr_old_instance->advertisement.sptr_type_11->data != NULL) && (old_data_size > 0) && (old_data_size == data_size)) { if ((memcmp ((const void *) sptr_old_instance->advertisement.sptr_type_11->data, (const void *) sptr_advertisement->sptr_type_11->data, data_size ) != (int) NULL)) { return (PASS); } } break; }#endif /* __OPAQUE_LSA__ */ default: { break; } } return (FAIL);}/***************************************************************************** ospf_add_entry_to_link_state_database -- adds a new entry to an LS database** This function first checks to see if a previous instance of the* advertisement exists, and if it does, removes it.* It then places the newer instance of the advertisement in the database* passed in to it.** RETURNS: static OSPF_LS_DATABASE_ENTRY *** ERRNO:**/static OSPF_LS_DATABASE_ENTRY *ospf_add_entry_to_link_state_database ( OSPF_LS_DATABASE_ENTRY *sptr_old_database_entry, OSPF_AREA_ENTRY *sptr_area, UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement, int route_protocol ) { OSPF_LS_DATABASE_HEAD * sptr_database_head; ULONG hash_id; OSPF_LS_DATABASE_ENTRY * sptr_new_database_entry; OSPF_LS_DATABASE_ENTRY * sptr_database_entry = NULL; OSPF_LS_DATABASE_ENTRY * sptr_next_database_entry = NULL; ULONG current_time; BOOLEAN checkNetMask = FALSE; BOOLEAN maskIsIdentical = FALSE; ULONG dbEntryNetMask; ULONG netMask = 0x0L; enum TEST difference_found; 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_add_entry_to_link_state_database\r\n"); hash_id = sptr_advertisement->sptr_router->ls_header.id; hash_id = net_to_host_long (hash_id); hash_id = hash_id & OSPF_HASH_MASK; PARAMETER_NOT_USED (sptr_old_database_entry); if ((sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_SUMMARY_NETWORK) || (sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER)) { if (sptr_advertisement->sptr_summary->tos0_metric == OSPF_LSInfinity) { sptr_advertisement->sptr_summary->ls_header.age = host_to_net_short (OSPF_MAXIMUM_AGE); } } else if ((sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_AS_EXTERNAL) && (sptr_advertisement->sptr_external->tos0_metric == OSPF_LSInfinity)) { sptr_advertisement->sptr_external->ls_header.age = host_to_net_short (OSPF_MAXIMUM_AGE); } /* SPR 78250 Start */ switch (sptr_advertisement->sptr_router->ls_header.type) {#if defined (__OPAQUE_LSA__) case OSPF_LS_TYPE_9: sptr_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][hash_id]); checkNetMask = FALSE; break; case OSPF_LS_TYPE_10: sptr_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][hash_id]); checkNetMask = FALSE; break; case OSPF_LS_TYPE_11: sptr_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][hash_id]); checkNetMask = FALSE; break;#endif /* __OPAQUE_LSA__ */ case OSPF_LS_AS_EXTERNAL: sptr_database_head = &(ospf.external_database_hash_table[LS_EXTERNAL_LSA][hash_id]); netMask = sptr_advertisement->sptr_network->network_mask; netMask = net_to_host_long (netMask); checkNetMask = TRUE; break; case OSPF_LS_ROUTER: sptr_database_head = &(sptr_area->ls_database_hash_table[ sptr_advertisement->sptr_router->ls_header.type][hash_id]); checkNetMask = FALSE; break; default: sptr_database_head = &(sptr_area->ls_database_hash_table[ sptr_advertisement->sptr_router->ls_header.type][hash_id]); netMask = sptr_advertisement->sptr_network->network_mask; netMask = net_to_host_long (netMask); checkNetMask = TRUE; } /* SPR#76812 */ for (sptr_database_entry = sptr_database_head->sptr_linear_database_entry; sptr_database_entry != NULL; sptr_database_entry = sptr_next_database_entry) { sptr_next_database_entry = sptr_database_entry->sptr_forward_link; /* * We only access the <sptr_network->network_mask> in the cases from * the above switch statement that are known to have a <network_mask> * variable associated with the packet type. All other cases we set * the maskIsIdentical variable to TRUE so the logic isn't affected. */ if (checkNetMask) { dbEntryNetMask = sptr_database_entry->advertisement.sptr_network->network_mask; dbEntryNetMask = net_to_host_long (dbEntryNetMask); maskIsIdentical = dbEntryNetMask == netMask ? TRUE : FALSE; } if ((sptr_advertisement->sptr_router->ls_header.id == sptr_database_entry->advertisement.sptr_router->ls_header.id) && maskIsIdentical) { if ((sptr_advertisement->sptr_router->ls_header.advertising_router == sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router) || (sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_NETWORK) || (sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_ROUTER)#if defined (__NSSA__) || (sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_TYPE_7)#endif /*__NSSA__*/ ) { difference_found = ospf_check_if_new_advertisement_is_different_from_its_previous_instance ( sptr_advertisement, sptr_database_entry); if (difference_found == PASS) { /* SPR 84312 -- Begin */ current_time = ospf_get_system_elapsed_time_second (); /* SPR 84312 -- End */ sptr_database_entry->ls_database_time_stamp = current_time; ospf_free_database_entry (sptr_database_entry); break; } else { return sptr_database_entry; } } } } /* SPR 78250 End */ /* * If we're here, we haven't found it in the database, or we have * removed the previous entry because of differences found -- add it */ sptr_new_database_entry = (OSPF_LS_DATABASE_ENTRY *)table_malloc ( 1, sizeof (OSPF_LS_DATABASE_ENTRY)); if (sptr_new_database_entry == NULL) { ospf_print_memory_error_message_and_free_buffer_if_necessary ( (void *)NULL, "OSPF_LS_DATABASE_ENTRY"); return (NULL); } memset (sptr_new_database_entry, 0x00, sizeof (OSPF_LS_DATABASE_ENTRY));#if defined (__OPAQUE_LSA__) if (sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_TYPE_9) { sptr_new_database_entry->advertisement.sptr_type_9 = sptr_advertisement->sptr_type_9; } else if (sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_TYPE_10) { sptr_new_database_entry->advertisement.sptr_type_10 = sptr_advertisement->sptr_type_10; } else if (sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_TYPE_11) { sptr_new_database_entry->advertisement.sptr_type_11 = sptr_advertisement->sptr_type_11; } else { sptr_new_database_entry->advertisement.sptr_router = sptr_advertisement->sptr_router; }#else /* __OPAQUE_LSA__ */ sptr_new_database_entry->advertisement.sptr_router = sptr_advertisement->sptr_router;#endif /* __OPAQUE_LSA__ */ /* SPR 85893 --Begin */ sptr_new_database_entry->ls_database_pending_delete = FALSE; /* SPR 85893 --End */ sptr_new_database_entry->ls_database_sequence_state = OSPF_NORMAL; sptr_new_database_entry->ls_database_freeme = FALSE; sptr_new_database_entry->sptr_ls_database_area = sptr_area; sptr_new_database_entry->ls_database_hash = (USHORT) hash_id; sptr_new_database_entry->ls_database_type = (enum OSPF_LS_TYPE) sptr_advertisement->sptr_router->ls_header.type; /* SPR 84312 -- Begin */ current_time = ospf_get_system_elapsed_time_second (); /* SPR 84312 -- End */ sptr_new_database_entry->ls_database_time_stamp = current_time; /* SPR 85050 -- Begin */ sptr_new_database_entry->route_protocol = route_protocol; /* SPR 85050 -- End */ /* SPR#76812 -- Begin */ sptr_database_entry_node = (OSPF_AVL_LSDB_NODE *) table_malloc ( 1, sizeof (OSPF_AVL_LSDB_NODE)); if (sptr_database_entry_node == NULL) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -