📄 ospf_opaque_lsa.c
字号:
else if ((sptr_database_entry->sptr_ls_database_retrans == NULL) && (ospf.number_of_neighbors_in_exchange_state == ospf.number_of_neighbors_in_full_state)) { ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (sptr_database_entry); (void) ospf_free_database_entry (sptr_database_entry); sptr_database_entry = NULL; } } } } } semGive (ospf_global_mutex ); return 0; } else { semGive (ospf_global_mutex ); return -1; }}/***********************************************************************************************************************************//* Function: ospfRemoveType11 Input: ULONG - opaque_lsid ULONG - opaque_advertising_router RETURNS: int - 0|-1 Description: This function finds the opaque lsa in the opaque lsdb using the link state id and the advertising router as keys. The link state advertisement is prematurely aged by setting the opaque lsa's age to MAXIMUM_AGE and floods it out its interfaces. It then removes the opaque lsa from the appropriate lists.*/int ospfRemoveType11(ULONG opaque_lsid, ULONG opaque_advertising_router) { OSPF_LS_DATABASE_HEAD *sptr_ls_database_head = NULL ; OSPF_LS_DATABASE_ENTRY *sptr_database_entry = NULL; OSPF_LS_DATABASE_ENTRY *sptr_next_database_entry = NULL; USHORT age =0; enum TEST test_return_type; ULONG index; ULONG advertising_router; ULONG lsid; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRemoveType11 \r\n"); semTake (ospf_global_mutex , WAIT_FOREVER); if (ospf.opaque_capability == TRUE) { /* Check for type 11 lsdb */ for (index = 0x00000000L, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index])) { if (sptr_ls_database_head == NULL) { continue; } /* SPR#76812 */ for (sptr_database_entry = sptr_ls_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; advertising_router = sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router; advertising_router = net_to_host_long (advertising_router); lsid = sptr_database_entry->advertisement.sptr_router->ls_header.id; lsid = net_to_host_long(lsid); if ((lsid == opaque_lsid) && (advertising_router == opaque_advertising_router)) { age = OSPF_MAXIMUM_AGE; age = host_to_net_short (age); sptr_database_entry->advertisement.sptr_router->ls_header.age = age; test_return_type = ospf_check_if_advertisements_link_state_id_is_equal_to_one_of_the_routers_own_IP_interface_addresses ( sptr_database_entry->advertisement.sptr_router); if ((sptr_database_entry->ls_database_freeme == FALSE) && ((advertising_router == ospf.router_id) || ((sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_NETWORK) && (test_return_type == PASS)) ) ) { (void) ospf_flood_advertisement_out_some_subset_of_the_routers_interfaces (sptr_database_entry->advertisement.sptr_router, ospf.sptr_area_list, NULL, NULL, TRUE); sptr_database_entry->ls_database_freeme = TRUE; ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (sptr_database_entry); (void) ospf_free_database_entry (sptr_database_entry); sptr_database_entry = NULL; } else if ((sptr_database_entry->sptr_ls_database_retrans == NULL) && (ospf.number_of_neighbors_in_exchange_state == ospf.number_of_neighbors_in_full_state)) { ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (sptr_database_entry); (void) ospf_free_database_entry (sptr_database_entry); sptr_database_entry = NULL; } } } } semGive (ospf_global_mutex ); return 0; } else { semGive (ospf_global_mutex ); return -1; }}/***********************************************************************************************************************************//* Function: ospfRefreshOpaqueLsa Input: ULONG - ip_address ULONG - netmask BYTE - lsa_type ULONG - opaque_lsid ULONG advertising_router RETURNS: int - 0|-1 Description: This function finds the opaque lsa in the opaque lsdb using the link state id and the advertising router as keys. The link state advertisement is prematurely aged by setting the opaque lsa's age to MAXIMUM_AGE and floods it out its interfaces. The link state advertisement's age is then set to 0 and flooded out its interfaces.*/int ospfRefreshOpaqueLsa ( ULONG ip_address, ULONG netmask, BYTE lsa_type, ULONG opaque_lsid, ULONG opaque_advertising_router ) { OSPF_AREA_ENTRY *sptr_area = ospf.sptr_area_list; OSPF_LS_DATABASE_HEAD *sptr_ls_database_head = NULL; OSPF_LS_DATABASE_ENTRY *sptr_database_entry = NULL; OSPF_LS_DATABASE_ENTRY *sptr_next_database_entry = NULL; ULONG index; OSPF_INTERFACE *sptr_interface = NULL; OSPF_INTERFACE *sptr_next_interface = NULL; ULONG lsid = 0x00000000; ULONG advertising_router = 0x00000000; enum BOOLEAN first_pass_external = TRUE; int return_code = -1; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRefreshOpaqueLsa\r\n"); semTake (ospf_global_mutex , WAIT_FOREVER); if (ospf.opaque_capability == TRUE) { for (sptr_interface = ospf.sptr_interface_list; sptr_interface != NULL; sptr_interface = sptr_next_interface) { sptr_next_interface = sptr_interface->sptr_forward_link; if ((sptr_interface->address & sptr_interface->netmask) == (ip_address & netmask)) { break; } } switch (lsa_type) { case OSPF_LS_TYPE_9: while (sptr_area != NULL) { for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][index])) { /* SPR#76812 */ for (sptr_database_entry = sptr_ls_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; if ( sptr_database_entry->advertisement.sptr_type_9 != NULL ) { lsid = sptr_database_entry->advertisement.sptr_type_9->ls_header.id.lsid; lsid = net_to_host_long(lsid); advertising_router = sptr_database_entry->advertisement.sptr_type_9->ls_header.advertising_router; advertising_router = net_to_host_long(advertising_router); if ((lsid == opaque_lsid) && (advertising_router == opaque_advertising_router)) { ospf_originate_new_instance_of_the_link_state_advertisement (sptr_database_entry, sptr_area, FALSE); semGive (ospf_global_mutex ); return_code = 0; return return_code; } } } } sptr_area = sptr_area->sptr_forward_link; } break; case OSPF_LS_TYPE_10: while (sptr_area != NULL) { for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][index])) { /* SPR#76812 */ for (sptr_database_entry = sptr_ls_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; if ( sptr_database_entry->advertisement.sptr_type_10 != NULL ) { lsid = sptr_database_entry->advertisement.sptr_type_10->ls_header.id.lsid; lsid = net_to_host_long(lsid); advertising_router = sptr_database_entry->advertisement.sptr_type_10->ls_header.advertising_router; advertising_router = net_to_host_long(advertising_router); if ((lsid == opaque_lsid) && (advertising_router == opaque_advertising_router)) { ospf_originate_new_instance_of_the_link_state_advertisement (sptr_database_entry, sptr_area, FALSE); semGive (ospf_global_mutex ); return_code = 0; return return_code; } } } } sptr_area = sptr_area->sptr_forward_link; } break; case OSPF_LS_TYPE_11: /* Check for type 11 lsdb */ while (sptr_area != NULL) { for (index = 0x00000000L, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index])) { if (sptr_ls_database_head == NULL) { continue; } /* SPR#76812 */ for (sptr_database_entry = sptr_ls_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; if ( sptr_database_entry->advertisement.sptr_type_11 != NULL ) { lsid = sptr_database_entry->advertisement.sptr_type_11->ls_header.id.lsid; lsid = net_to_host_long(lsid); advertising_router = sptr_database_entry->advertisement.sptr_type_11->ls_header.advertising_router; advertising_router = net_to_host_long(advertising_router); if ((lsid == opaque_lsid) && (advertising_router == opaque_advertising_router)) { ospf_originate_new_instance_of_the_link_state_advertisement (sptr_database_entry, ospf.sptr_area_list, first_pass_external); first_pass_external = FALSE; return_code = 0; } } } } sptr_area = sptr_area->sptr_forward_link; } break; } semGive (ospf_global_mutex ); return return_code; } else { semGive (ospf_global_mutex ); return -1; } }/***********************************************************************************************************************************//* Function: ospfRetrieveNumOpaqueLsa Input: BYTE - lsa flooding type RETURNS: ULONG - number of opaque lsas Description: This function finds the number of opaque lsas in the opaque lsdb using the link state flooding type as the key.*/ULONG ospfRetrieveNumOpaqueLsa(BYTE lsa_flooding_type) { OSPF_AREA_ENTRY *sptr_area = ospf.sptr_area_list; OSPF_LS_DATABASE_HEAD *sptr_ls_database_head = NULL; OSPF_LS_DATABASE_ENTRY *sptr_database_entry = NULL; OSPF_LS_DATABASE_ENTRY *sptr_next_database_entry = NULL; ULONG index; ULONG opaque_lsa_count = 0; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRetrieveNumOpaqueLsa\r\n"); semTake (ospf_global_mutex , WAIT_FOREVER); if (ospf.opaque_capability == TRUE) { switch (lsa_flooding_type) { case OSPF_LS_TYPE_9: while (sptr_area != NULL) { for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][index])) { /* SPR#76812 */ for (sptr_database_entry = sptr_ls_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; if ( sptr_database_entry->advertisement.sptr_type_9 != NULL ) { opaque_lsa_count++; } } } sptr_area = sptr_area->sptr_forward_link; } break; case OSPF_LS_TYPE_10: sptr_area = ospf.sptr_area_list; sptr_ls_database_head = NULL; sptr_database_entry = NULL; index =0; while (sptr_area != NULL) { for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][index])) { /* SPR#76812 */ for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry; sptr_database_entry != NULL; sptr_database_entry = sptr_next_database_entry) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -