📄 ospf_opaque_lsa.c
字号:
semGive (ospf_global_mutex ); return NULL; } else { memcpy(((BYTE *)(type_10_lsa)+size_of_link_list_pointers), sptr_database_entry->advertisement.sptr_type_10, size_of_opaque_lsa); if (type_10_lsa_head == NULL) { type_10_lsa_head = type_10_lsa; } else { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) type_10_lsa, (OSPF_GENERIC_NODE *) type_10_lsa_head); } } } } } } } sptr_area = sptr_area->sptr_forward_link; } semGive (ospf_global_mutex ); return type_10_lsa_head; } else { semGive (ospf_global_mutex ); return NULL; } }/***********************************************************************************************************************************//* Function: ospfRetrieveType11 Input: enum OSPF_SEARCH_TYPE - OSPF_SEARCH_LSA_TYPE|OSPF_SEARCH_LSA_ID|OSPF_SEARCH_ADVERTISING_ROUTER ULONG - key_value RETURNS: OSPF_TYPE_11_LSA_LINK * - link list of type 11 link state advertisements Description: This function retrieves the type 11 opaque lsas from the opaque lsdb.*/OSPF_TYPE_11_LSA_LINK * ospfRetrieveType11 ( enum OSPF_SEARCH_TYPE key, ULONG key_value ) { 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_TYPE_11_LSA_LINK *type_11_lsa_head = NULL; OSPF_TYPE_11_LSA_LINK *type_11_lsa = NULL; USHORT size_of_opaque_lsa = 0; USHORT size_of_type_11_lsa = 0; USHORT size_of_link_list_pointers = 0; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRetrieveType11\r\n"); key_value = net_to_host_long(key_value); semTake (ospf_global_mutex , WAIT_FOREVER); if (ospf.opaque_capability == TRUE) { size_of_link_list_pointers = sizeof(OSPF_TYPE_11_LSA_LINK *) + sizeof(OSPF_TYPE_11_LSA_LINK *); /* 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; if ( sptr_database_entry->advertisement.sptr_type_11 != NULL ) { if (key == OSPF_SEARCH_ADVERTISING_ROUTER) { if (sptr_database_entry->advertisement.sptr_type_11->ls_header.advertising_router == key_value) { size_of_opaque_lsa = sptr_database_entry->advertisement.sptr_type_11->ls_header.length; size_of_opaque_lsa = net_to_host_short(size_of_opaque_lsa); /* Add forward and backward pointer length */ size_of_type_11_lsa = (USHORT)(size_of_opaque_lsa + size_of_link_list_pointers); type_11_lsa = table_malloc(1, size_of_type_11_lsa); if (type_11_lsa == NULL) { if (type_11_lsa_head != NULL) { ospf_free_entire_list ((OSPF_GENERIC_NODE*) type_11_lsa_head); } type_11_lsa_head = NULL; semGive (ospf_global_mutex ); return NULL; } else { memcpy(((BYTE *)(type_11_lsa)+size_of_link_list_pointers), sptr_database_entry->advertisement.sptr_type_11, size_of_opaque_lsa); if (type_11_lsa_head == NULL) { type_11_lsa_head = type_11_lsa; } else { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) type_11_lsa, (OSPF_GENERIC_NODE *) type_11_lsa_head); } } } } else if (key == OSPF_SEARCH_LSA_ID) { if (sptr_database_entry->advertisement.sptr_type_11->ls_header.id.lsid == key_value) { size_of_opaque_lsa = sptr_database_entry->advertisement.sptr_type_11->ls_header.length; size_of_opaque_lsa = net_to_host_short(size_of_opaque_lsa); /* Add forward and backward pointer length */ size_of_type_11_lsa = (USHORT)(size_of_opaque_lsa + size_of_link_list_pointers); type_11_lsa = table_malloc(1, size_of_type_11_lsa); if (type_11_lsa == NULL) { if (type_11_lsa_head != NULL) { ospf_free_entire_list ((OSPF_GENERIC_NODE*) type_11_lsa_head); } type_11_lsa_head = NULL; semGive (ospf_global_mutex ); return NULL; } else { memcpy(((BYTE *)(type_11_lsa)+size_of_link_list_pointers), sptr_database_entry->advertisement.sptr_type_11, size_of_opaque_lsa); if (type_11_lsa_head == NULL) { type_11_lsa_head = type_11_lsa; } else { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) type_11_lsa, (OSPF_GENERIC_NODE *) type_11_lsa_head); } } } } else { size_of_opaque_lsa = sptr_database_entry->advertisement.sptr_type_11->ls_header.length; size_of_opaque_lsa = net_to_host_short(size_of_opaque_lsa); /* Add forward and backward pointer length */ size_of_type_11_lsa = (USHORT)(size_of_opaque_lsa + size_of_link_list_pointers); type_11_lsa = table_malloc(1, size_of_type_11_lsa); if (type_11_lsa == NULL) { if (type_11_lsa_head != NULL) { ospf_free_entire_list ((OSPF_GENERIC_NODE*) type_11_lsa_head); } type_11_lsa_head = NULL; semGive (ospf_global_mutex ); return NULL; } else { memcpy(((BYTE *)(type_11_lsa)+size_of_link_list_pointers), sptr_database_entry->advertisement.sptr_type_11, size_of_opaque_lsa); if (type_11_lsa_head == NULL) { type_11_lsa_head = type_11_lsa; } else { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) type_11_lsa, (OSPF_GENERIC_NODE *) type_11_lsa_head); } } } } } } semGive (ospf_global_mutex ); return type_11_lsa_head; } else { semGive (ospf_global_mutex ); return NULL; }}/***********************************************************************************************************************************//* Function: ospfRemoveAllType9 Input: None RETURNS: int - 0|-1 Description: This function removes all the type 9 opaque lsas from the opaque lsdb.*/int ospfRemoveAllType9() { 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_AREA_ENTRY *sptr_area = NULL; OSPF_AREA_ENTRY *sptr_next_area = NULL; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRemoveAllType9 \r\n"); semTake (ospf_global_mutex , WAIT_FOREVER); for (sptr_area = ospf.sptr_area_list; sptr_area != NULL; sptr_area = sptr_next_area) { sptr_next_area = sptr_area->sptr_forward_link; 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])) { 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); age = sptr_database_entry->advertisement.sptr_router->ls_header.age = OSPF_MAXIMUM_AGE; age = net_to_host_short (age); lsid = sptr_database_entry->advertisement.sptr_router->ls_header.id; lsid = net_to_host_long(lsid); 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, sptr_area, 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;}/***********************************************************************************************************************************//* Function: ospfRemoveAllType10 Input: None RETURNS: int - 0|-1 Description: This function removes all the type 10 opaque lsas from the opaque lsdb.*/int ospfRemoveAllType10() { 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_AREA_ENTRY *sptr_area = NULL; OSPF_AREA_ENTRY *sptr_next_area = NULL; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRemoveAllType10 \r\n"); semTake (ospf_global_mutex , WAIT_FOREVER); for (sptr_area = ospf.sptr_area_list; sptr_area != NULL; sptr_area = sptr_next_area) { sptr_next_area = sptr_area->sptr_forward_link; 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])) { if (sptr_ls_database_head == NULL) { continue; } for (sptr_database_entry = sptr_ls_database_head->sptr_linear_database_entry; /* for each database entry */ sptr_database_entry != NULL; sptr_database_entry = sptr_next_database_entry) { advertising_router = sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router; advertising_router = net_to_host_long (advertising_router); sptr_next_database_entry = sptr_database_entry->sptr_forward_link; age = sptr_database_entry->advertisement.sptr_router->ls_header.age = OSPF_MAXIMUM_AGE; age = net_to_host_short (age); lsid = sptr_database_entry->advertisement.sptr_router->ls_header.id; lsid = net_to_host_long(lsid); 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, sptr_area, 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; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -