⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ospf_opaque_lsa.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
            }        }    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 + -