📄 ospf_opaque_lsa.c
字号:
} } semGive (ospf_global_mutex ); return 0; }/***********************************************************************************************************************************//* Function: ospfRemoveAllType11 Input: None RETURNS: int - 0|-1 Description: This function removes all the type 11 opaque lsas from the opaque lsdb.*/int ospfRemoveAllType11() { 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 ospfRemoveAllType11 \r\n"); semTake (ospf_global_mutex , WAIT_FOREVER); /* Check 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 */ /* 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, 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;}/***********************************************************************************************************************************//* Function: ospfRemoveAllTypes Input: None RETURNS: int - 0|-1 Description: This function removes all the type opaque lsas from the opaque lsdb.*/int ospfRemoveAllTypes(){ ospfRemoveAllType9(); ospfRemoveAllType10(); ospfRemoveAllType11(); return 0;}/***********************************************************************************************************************************//* Function: ospfRegisterOpaqueCallback Input: BYTE - lsa_type BYTE - opaque_type int (* new_interface_hook)(struct OSPF_INTERFACE *interface) - Function pointer to new interface int (* delete_interface_hook)(struct OSPF_INTERFACE *interface) - Function pointer to delete interface void (* interface_state_machine_change_hook)(enum OSPF_INTERFACE_EVENT event,enum OSPF_INTERFACE_STATE state,struct OSPF_INTERFACE *interface) - Function pointer to interface state machine change void (* neighbor_state_machine_change_hook)(enum OSPF_NEIGHBOR_EVENT event,enum OSPF_NEIGHBOR_STATE state,struct OSPF_INTERFACE *sptr_interface, struct OSPF_NEIGHBOR *neighbor) - Function pointer to neighbor state machine change int (* opaque_lsa_originate_hook)(void *arg, BYTE lsa_type, BYTE opaque_type, USHORT age) - Function pointer to originate an opaque lsa void (* opaque_lsa_refresh_hook)(void *arg, BYTE lsa_type, ULONG opaque_lsid, USHORT age) - Function pointer to refresh an opaque lsa void (* opaque_lsa_received_hook)(UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement) - - Function pointer to receive an opaque lsa RETURNS: int - 0|-1 Description: This function registers the callback functions to traffic engineering extensions.*/int ospfRegisterOpaqueCallback(BYTE lsa_type, BYTE opaque_type, int (* new_interface_hook)(struct OSPF_INTERFACE *interface), int (* delete_interface_hook)(struct OSPF_INTERFACE *interface), void (* interface_state_machine_change_hook)(enum OSPF_INTERFACE_EVENT event,enum OSPF_INTERFACE_STATE state,struct OSPF_INTERFACE *interface), void (* neighbor_state_machine_change_hook)(enum OSPF_NEIGHBOR_EVENT event,enum OSPF_NEIGHBOR_STATE state,struct OSPF_INTERFACE *sptr_interface, struct OSPF_NEIGHBOR *neighbor), int (* opaque_lsa_originate_hook)(void *arg, BYTE lsa_type, BYTE opaque_type, USHORT age), void (* opaque_lsa_refresh_hook)(void *arg, BYTE lsa_type, ULONG opaque_lsid, USHORT age), void (* opaque_lsa_received_hook)(UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement)){ OSPF_OPAQUE_CALLBACK *sptr_opaque_callback; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRegisterOpaqueCallback\r\n"); semTake (ospf_global_mutex , WAIT_FOREVER); if (ospf.opaque_capability == TRUE) { sptr_opaque_callback = (OSPF_OPAQUE_CALLBACK *)table_malloc(1, sizeof(OSPF_OPAQUE_CALLBACK)); if (sptr_opaque_callback == NULL) { semGive (ospf_global_mutex ); return -1; } sptr_opaque_callback->lsa_type = lsa_type; sptr_opaque_callback->opaque_type = opaque_type; sptr_opaque_callback->new_interface_hook = new_interface_hook; sptr_opaque_callback->delete_interface_hook = delete_interface_hook; sptr_opaque_callback->interface_state_machine_change_hook = interface_state_machine_change_hook; sptr_opaque_callback->neighbor_state_machine_change_hook = neighbor_state_machine_change_hook; sptr_opaque_callback->opaque_lsa_originate_hook = opaque_lsa_originate_hook; sptr_opaque_callback->opaque_lsa_refresh_hook = opaque_lsa_refresh_hook; sptr_opaque_callback->opaque_lsa_received_hook = opaque_lsa_received_hook; switch (lsa_type) { case OSPF_LS_TYPE_9: if (ospf.sptr_type_9_callback_list_head == NULL) { ospf.sptr_type_9_callback_list_head = sptr_opaque_callback; } else { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) sptr_opaque_callback, (OSPF_GENERIC_NODE *) ospf.sptr_type_9_callback_list_head); } break; case OSPF_LS_TYPE_10: if (ospf.sptr_type_10_callback_list_head == NULL) { ospf.sptr_type_10_callback_list_head = sptr_opaque_callback; } else { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) sptr_opaque_callback, (OSPF_GENERIC_NODE *) ospf.sptr_type_10_callback_list_head); } break; case OSPF_LS_TYPE_11: if (ospf.sptr_type_11_callback_list_head == NULL) { ospf.sptr_type_11_callback_list_head = sptr_opaque_callback; } else { ospf_add_node_to_end_of_list ((OSPF_GENERIC_NODE *) sptr_opaque_callback, (OSPF_GENERIC_NODE *) ospf.sptr_type_11_callback_list_head); } break; default: semGive (ospf_global_mutex ); return -1; } semGive (ospf_global_mutex ); return 0; } else { semGive (ospf_global_mutex ); return -1; }}/***********************************************************************************************************************************//* Function: ospfDeregisterOpaqueCallback Input: BYTE - lsa_type BYTE - opaque_type RETURNS: int - 0|-1 Description: This function deregisters the callback functions to traffic engineering extensions.*/int ospfDeregisterOpaqueCallback(BYTE lsa_type, BYTE opaque_type){ OSPF_OPAQUE_CALLBACK *sptr_opaque_callback; OSPF_OPAQUE_CALLBACK *sptr_next_node; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfDeregisterOpaqueCallback\r\n"); semTake (ospf_global_mutex , WAIT_FOREVER); if (ospf.opaque_capability == TRUE) { switch (lsa_type) { case OSPF_LS_TYPE_9: for (sptr_opaque_callback = ospf.sptr_type_9_callback_list_head; sptr_opaque_callback != NULL; sptr_opaque_callback = sptr_next_node) { sptr_next_node = sptr_opaque_callback->sptr_forward_link; if ((sptr_opaque_callback->lsa_type == lsa_type) && (sptr_opaque_callback->opaque_type == opaque_type)) { ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &ospf.sptr_type_9_callback_list_head, (OSPF_GENERIC_NODE *)sptr_opaque_callback); table_free ((void *) sptr_opaque_callback); sptr_opaque_callback = NULL; semGive (ospf_global_mutex ); return 0; } } break; case OSPF_LS_TYPE_10: for (sptr_opaque_callback = ospf.sptr_type_10_callback_list_head; sptr_opaque_callback != NULL; sptr_opaque_callback = sptr_next_node) { sptr_next_node = sptr_opaque_callback->sptr_forward_link; if ((sptr_opaque_callback->lsa_type == lsa_type) && (sptr_opaque_callback->opaque_type == opaque_type)) { ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &ospf.sptr_type_10_callback_list_head, (OSPF_GENERIC_NODE *)sptr_opaque_callback); table_free ((void *) sptr_opaque_callback); sptr_opaque_callback = NULL; semGive (ospf_global_mutex ); return 0; } } break; case OSPF_LS_TYPE_11: for (sptr_opaque_callback = ospf.sptr_type_11_callback_list_head; sptr_opaque_callback != NULL; sptr_opaque_callback = sptr_next_node) { sptr_next_node = sptr_opaque_callback->sptr_forward_link; if ((sptr_opaque_callback->lsa_type == lsa_type) && (sptr_opaque_callback->opaque_type == opaque_type)) { ospf_remove_node_from_list ((OSPF_GENERIC_NODE **) &ospf.sptr_type_11_callback_list_head, (OSPF_GENERIC_NODE *)sptr_opaque_callback); table_free ((void *) sptr_opaque_callback); sptr_opaque_callback = NULL; semGive (ospf_global_mutex ); return 0; } } break; default: semGive (ospf_global_mutex ); return -1; } semGive (ospf_global_mutex ); return -1; } else { semGive (ospf_global_mutex ); return -1; }}/***********************************************************************************************************************************//* Function: ospfDeregAllOpqCallback Input: None RETURNS: int - 0|-1 Description: This function deregisters all the callback functions to traffic engineering extensions.*/int ospfDeregAllOpqCallback(){ OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfDeregAllOpqCallback\r\n"); semTake (ospf_global_mutex , WAIT_FOREVER); if (ospf.opaque_capability == TRUE) { if (ospf.sptr_type_9_callback_list_head != NULL) { ospf_free_entire_list ((OSPF_GENERIC_NODE*) ospf.sptr_type_9_callback_list_head); } ospf.sptr_type_9_callback_list_head = NULL; if (ospf.sptr_type_10_callback_list_head != NULL) { ospf_free_entire_list ((OSPF_GENERIC_NODE*) ospf.sptr_type_10_callback_list_head); } ospf.sptr_type_10_callback_list_head = NULL; if (ospf.sptr_type_11_callback_list_head != NULL) { ospf_free_entire_list ((OSPF_GENERIC_NODE*) ospf.sptr_type_11_callback_list_head); } ospf.sptr_type_11_callback_list_head = NULL; semGive (ospf_global_mutex ); return 0; } else { semGive (ospf_global_mutex ); return -1; }}/***********************************************************************************************************************************//* Function: ospfRetrieveOpaqueCallback Input: BYTE - lsa_type BYTE - opaque_type RETURNS: int - 0|-1 Description: This function retrieves the callback functions to traffic engineering extensions.*/OSPF_OPAQUE_CALLBACK *ospfRetrieveOpaqueCallback(BYTE lsa_type, BYTE opaque_type){ OSPF_OPAQUE_CALLBACK *sptr_opaque_callback; OSPF_OPAQUE_CALLBACK *sptr_next_node; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospfRetrieveOpaqueCallback\r\n"); semTake (ospf_global_mutex , WAIT_FOREVER); if (ospf.opaque_capability == TRUE) { switch (lsa_type) { case OSPF_LS_TYPE_9: for (sptr_opaque_callback = ospf.sptr_type_9_callback_list_head; sptr_opaque_callback != NULL; sptr_opaque_callback = sptr_next_node) { sptr_next_node = sptr_opaque_callback->sptr_forward_link; if ((sptr_opaque_callback->lsa_type == lsa_type) && (sptr_opaque_callback->opaque_type == opaque_type)) { semGive (ospf_global_mutex ); return sptr_opaque_callback; } } break; case OSPF_LS_TYPE_10: for (sptr_opaque_callback = ospf.sptr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -