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

📄 ospf_database_summary.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 2 页
字号:
                found_external_lsa = FALSE;                break;                }            }        if (found_external_lsa == FALSE)            {            break;            }        }	/*opaque lsa add each advertisement in the database to the appropriate list jkw*/#if defined (__OPAQUE_LSA__)	for (ls_type = TYPE_9_LSA; ls_type <= TYPE_11_LSA; ++ls_type)										/* for each type of advertisement */		{        for (index = 0x00000000L, sptr_ls_database_head = &(sptr_interface->sptr_area->opaque_ls_database_hash_table[ls_type][index]);			index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_interface->sptr_area->opaque_ls_database_hash_table[ls_type][index]))			{																													/* for each hash list */            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;				*ptr_to_sptr_database_summary = ospf_add_advertisement_to_appropriate_list (sptr_interface, sptr_neighbor, sptr_database_entry,					*ptr_to_sptr_database_summary, &sptr_previous_database_summary, &sptr_ls_header);				if (*ptr_to_sptr_database_summary == NULL)					{					found_opaque_lsa = FALSE;					break;					}				}			if (found_opaque_lsa == FALSE)				{				break;				}			}		if (found_opaque_lsa == FALSE)			{			break;			}		}	/* Check for type 11 lsdb */    for (index = 0x00000000L, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index]);		index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index]))		{																													/* for each hash list */        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;			*ptr_to_sptr_database_summary = ospf_add_advertisement_to_appropriate_list (sptr_interface, sptr_neighbor, sptr_database_entry,				*ptr_to_sptr_database_summary, &sptr_previous_database_summary, &sptr_ls_header);			if (*ptr_to_sptr_database_summary == NULL)				{				found_type_11_lsa = FALSE;				break;				}			}		if (found_type_11_lsa == FALSE)			{			break;			}		}	if ((found_lsa == FALSE) &&		(found_external_lsa == FALSE) &&		(found_opaque_lsa == FALSE) &&		(found_type_11_lsa == FALSE))		{		return NULL;		}	else		{		return (sptr_previous_database_summary);		}#else /* __OPAQUE_LSA__ */	if ((found_lsa == FALSE) &&		(found_external_lsa == FALSE))		{		return NULL;		}	else		{		return (sptr_previous_database_summary);		}#endif /* __OPAQUE_LSA__ */}/**************************************************************************************** ospf_get_maximum_ls_type - gets the maximum link state advertisement type** This routine finds the maximum link state advertisement type** <sptr_interface> OSPF interface** RETURNS:	OSPF_LS_ROUTER or OSPF_LS_NETWORK or OSPF_LS_SUMMARY_NETWORK or*	OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER or OSPF_LS_AS_EXTERNAL or*	OSPF_LS_MULTICAST or OSPF_LS_TYPE_7 or OSPF_LS_TYPE_9 or*	OSPF_LS_TYPE_10 or OSPF_LS_TYPE_11 or OSPF_LS_MAX or*	or OSPF_LS_ROUTER_ABR or OSPF_LS_ROUTER_ASBR.** ERRNO: N/A** NOMANUAL*/static enum OSPF_LS_TYPE ospf_get_maximum_ls_type (OSPF_INTERFACE *sptr_interface){	OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_get_maximum_ls_type\r\n");#if !defined (__NSSA__)	if ((sptr_interface->sptr_area->flags._bit.stub == TRUE) || (sptr_interface->type == OSPF_VIRTUAL_LINK))#else /*  */__NSSA__#if defined (__NSSA_FIXES__)	if ((sptr_interface->sptr_area->flags._bit.stub == TRUE) || (sptr_interface->type == OSPF_VIRTUAL_LINK))#else /* __NSSA_FIXES__ */	if ((sptr_interface->sptr_area->flags._bit.stub == TRUE) || (sptr_interface->type == OSPF_VIRTUAL_LINK) || (sptr_interface->sptr_area->flags._bit.nssa == TRUE))#endif /* __NSSA_FIXES__ */#endif /*__NSSA__*/		{		return (OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER);	/* do not flood autonomous system external advertisements out this interface */		}	else		{	/***********SPR 75496**************/#if defined (__NSSA__)#if defined (__NSSA_FIXES__)		 if (sptr_interface->sptr_area->flags._bit.nssa == TRUE)		 	{            return (OSPF_LS_TYPE_7);			}#endif/*__NSSA_FIXES__*/#endif /* __NSSA__ */		return (OSPF_LS_AS_EXTERNAL);						/* ok to flood autonomous system external advertisements out this interface */		}}/**************************************************************************************** ospf_add_advertisement_to_appropriate_list - add advertisement to appropriate list** This routine adds the database entry to the neighbor retransmit list and the* neighbor to the database retransmit list.** <sptr_interface> OSPF interface** <sptr_neighbor> OSPF neighbor associated with the interface** <sptr_database_entry> Database entry to be added** <sptr_database_summary> Database summary to be added** <ptr_to_sptr_previous_database_summary> Pointer to previous database summary** <ptr_to_sptr_ls_header> Pointer to link state header** RETURNS:	OSPF_LS_DATABASE_SUMMARY * or NULL** ERRNO: N/A** NOMANUAL*/static OSPF_LS_DATABASE_SUMMARY *ospf_add_advertisement_to_appropriate_list (OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor,	OSPF_LS_DATABASE_ENTRY *sptr_database_entry,OSPF_LS_DATABASE_SUMMARY *sptr_database_summary,	OSPF_LS_DATABASE_SUMMARY **ptr_to_sptr_previous_database_summary,OSPF_LS_HEADER **ptr_to_sptr_ls_header){	USHORT advertisement_age =0;	OSPF_LS_DATABASE_ENTRY *sptr_database_entry_of_neighbor =NULL;	OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_add_advertisement_to_appropriate_list\r\n");	advertisement_age = sptr_database_entry->advertisement.sptr_router->ls_header.age;	advertisement_age = net_to_host_short (advertisement_age);	if (advertisement_age >= OSPF_MAXIMUM_AGE)														/* section 10.3, State: ExStart (p. 83) */		{   		sptr_database_entry_of_neighbor = (OSPF_LS_DATABASE_ENTRY *) table_malloc (1, sizeof (OSPF_LS_DATABASE_ENTRY));		if (sptr_database_entry_of_neighbor == NULL)			{			ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_LS_DATABASE_ENTRY");			return (NULL);			}		memset (sptr_database_entry_of_neighbor, 0x00, sizeof (OSPF_LS_DATABASE_ENTRY));		sptr_database_entry_of_neighbor->advertisement.sptr_router = sptr_database_entry->advertisement.sptr_router;		ospf_add_database_entry_to_neighbor_retransmit_list (sptr_neighbor, sptr_database_entry_of_neighbor);		ospf_add_neighbor_to_database_retransmit_list (sptr_database_entry, sptr_neighbor);		}	else		{		sptr_database_summary = ospf_add_advertisement_to_neighbor_database_summary_list (sptr_database_summary,			ptr_to_sptr_previous_database_summary, sptr_interface, sptr_neighbor, sptr_database_entry,			advertisement_age, ptr_to_sptr_ls_header);		}	return (sptr_database_summary);}/**************************************************************************************** ospf_add_advertisement_to_neighbor_database_summary_list - add advertisement to appropriate list** This routine adds the link state advertisement to the neighbor database summary list.** <sptr_database_summary> Database summary to be added** <ptr_to_sptr_previous_database_summary> Pointer to previous database summary** <sptr_interface> OSPF interface** <sptr_neighbor> OSPF neighbor associated with the interface** <sptr_database_entry> Database entry to be added** <advertisement_age> Link state advertisement age** <ptr_to_sptr_ls_header> Pointer to link state header** RETURNS:	OSPF_LS_DATABASE_SUMMARY * or NULL** ERRNO: N/A** NOMANUAL*/static OSPF_LS_DATABASE_SUMMARY *ospf_add_advertisement_to_neighbor_database_summary_list (OSPF_LS_DATABASE_SUMMARY *sptr_database_summary,	OSPF_LS_DATABASE_SUMMARY **ptr_to_sptr_previous_database_summary,OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor,	OSPF_LS_DATABASE_ENTRY *sptr_database_entry,USHORT advertisement_age,OSPF_LS_HEADER **ptr_to_sptr_ls_header){	ULONG interface_mtu =0;	ULONG authentication_size =0;	OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_add_advertisement_to_neighbor_database_summary_list\r\n");	interface_mtu = ospf_get_interface_mtu (sptr_interface);	authentication_size = ospf_get_authentication_size (sptr_interface);	/* SPR 85906 -- Begin */    /* Test the current packet size with the MTU size. If we are larger than MTU, set more-bit and    */	/* allocate a new packet                                                                          */	if ((sptr_database_summary->size_of_packet + OSPF_MAXIMUM_IP_HEADER_SIZE + OSPF_DB_PIECE_SIZE + authentication_size) >= interface_mtu )	/* packet is full, so allocate a new one and continue */    /* SPR 85906 -- End  */		{		sptr_database_summary->sptr_ospf_header->rest_of_packet.database.flags._byte = 0x0000;		sptr_database_summary->sptr_ospf_header->rest_of_packet.database.flags._bit.more = TRUE;		*ptr_to_sptr_previous_database_summary = sptr_database_summary;		sptr_database_summary = ospf_allocate_ls_database_summary (sptr_interface);		if (sptr_database_summary == NULL)			{			ospf_free_neighbor_database_summary_list (sptr_neighbor);			ospf_remove_all_database_pointers_from_neighbor_retransmit_list (sptr_neighbor);			return (NULL);			}		else			{			sptr_database_summary->size_of_packet = OSPF_PACKET_SIZE + OSPF_DATABASE_HEADER_SIZE;			*ptr_to_sptr_ls_header = &(sptr_database_summary->sptr_ospf_header->rest_of_packet.database.link_state_advertisement_header);			(*ptr_to_sptr_previous_database_summary)->sptr_forward_link = sptr_database_summary;			}		}	memcpy ((void *) *ptr_to_sptr_ls_header, (const void *) &sptr_database_entry->advertisement.sptr_router->ls_header,		(size_t) sizeof (OSPF_LS_HEADER));	(*ptr_to_sptr_ls_header)->age = advertisement_age;	(*ptr_to_sptr_ls_header)->age = host_to_net_short ((*ptr_to_sptr_ls_header)->age);	sptr_database_summary->size_of_packet += OSPF_DB_PIECE_SIZE;	++sptr_neighbor->database_summary_queue_count;	++sptr_database_summary->number_of_database_entries;	*ptr_to_sptr_ls_header = (OSPF_LS_HEADER *) ((ULONG) (*ptr_to_sptr_ls_header) + OSPF_DB_PIECE_SIZE);	return (sptr_database_summary);}/**************************************************************************************** ospf_free_ls_database_summary - frees memory from the database summary** This routine frees memory from the database summary.** <sptr_database_summary> Database summary structure** RETURNS: 	N/A** ERRNO: N/A** NOMANUAL*/void ospf_free_ls_database_summary (OSPF_LS_DATABASE_SUMMARY *sptr_database_summary){	OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_free_ls_database_summary\r\n");    if ( sptr_database_summary == NULL )        return;	if (sptr_database_summary->sptr_ospf_header != NULL)		{		table_free ((void *) sptr_database_summary->sptr_ospf_header);		sptr_database_summary->sptr_ospf_header = NULL;		}	table_free ((void *) sptr_database_summary);	sptr_database_summary = NULL;	return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -