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

📄 ospf_database_summary.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ospf_database_summary.c - Sets up database summary packets in DD Exchange State */ /* Copyright 1998 - 2002 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------02e,22apr03,ram	   SPR#76812 Modifications for OSPF performance enhancements02d,17feb03,mwv    SPR 85906 use IP header size in calculation for DD fragmentation02c,19nov02,mwv    Merge TMS code SPR 8428402b,09sep02,agi    Fixed broken conditional compile for OPAQUE_LSA02a,09oct02,agi    Fixed compiler warnings01x,08aug02,kc     Zero out allocated memory in ospf_allocate_ls_database_summary().01w,06jun02,jkw    Merged in code for NSSA SPR75496.01v,16apr02,jkw    One copy of external and type 11 lsa01u,23jan02,jkw    Update database summary with opaque lsas.01t,28nov01,jkw    Virtual link updates.01s,13oct01,kc     Dynamic configuration changes.01r,11oct01,jkw    Set pointer to NULL after table_free.01q,3may01,jkw     Added checks for NULL pointers and alarm messages01p,26sep00,reshma Added WindRiver CopyRight01o,25sep00,reshma RFC-1587 implementation for OSPF NSSA Option, also tested against ANVL.01n,07jul00,reshma Unix compatibility related changes.01m,04apr00,reshma Added some MIB support (Read only).Passed all important ANVL OSPF                    tests.01l,23dec99,reshma Compatibility with VxWorks-IP and VxWorks RTM-interface01k,28dec98,jack   Compiled and added some comments01j,11nov98,jack   Config changes, linted and big endian changes01i,30oct98,jack   Incorporate changes for compilation on Vxworks01h,23aug98,jack   ANVL tested OSPF with PATRICIA tree route table and no recursion01g,10aug98,jack   PATRICIA Route Table Based OSPF Code Base01f,04jun98,jack   Integration with RTM and BGP01e,24apr98,jack   RTM changes01d,10jul97,cindy  Pre-release v1.52b01c,02oct97,cindy  Release Version 1.5201b,22oct96,cindy  Release Version 1.5001a,05jun96,cindy  First Beta Release*//*DESCRIPTIONospf_database_summary.c is used for creating the database summary list.This file is used during the database exchange process.*/#include "ospf.h"#if defined (__OSPF_VIRTUAL_STACK__)#include "ospf_vs_lib.h"#endif /* __OSPF_VIRTUAL_STACK__ *//*****************************************************************************/static enum OSPF_RETURN_FLAGS ospf_build_neighbor_database_summary_list (OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor);static OSPF_LS_DATABASE_SUMMARY *ospf_add_each_advertisement_in_the_database_to_the_appropriate_list (	OSPF_LS_DATABASE_SUMMARY **ptr_to_sptr_database_summary,OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor);static enum OSPF_LS_TYPE ospf_get_maximum_ls_type (OSPF_INTERFACE *sptr_interface);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 **prt_to_sptr_previous_database_summary,OSPF_LS_HEADER **ptr_to_sptr_ls_header);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);/**************************************************************************************** ospf_build_ls_database_summary - initializes summary and request lists.** This routine frees up all the neighbor database summary lists and the neighbor* request list.  Once this is finished it calls the function to build the* database summary list.** <sptr_interface> OSPF interface** <sptr_neighbor> Associated neighbor to OSPF interface** RETURNS: 	OSPF_NO_PROBLEM or OSPF_NO_BUFFERS or OSPF_BAD_REQUEST** ERRNO: N/A** NOMANUAL*/enum OSPF_RETURN_FLAGS ospf_build_ls_database_summary (OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor){	enum OSPF_RETURN_FLAGS return_flag;	OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_build_ls_database_summary\r\n");	ospf_free_neighbor_database_summary_list (sptr_neighbor);	ospf_free_neighbor_ls_request_list (sptr_neighbor);	return_flag = ospf_build_neighbor_database_summary_list (sptr_interface, sptr_neighbor);	return (return_flag);}/**************************************************************************************** ospf_build_neighbor_database_summary_list - builds link state database summary list** This routine calls the function to allocate memory and adds link state* advertisement headers to the database summary list** <sptr_interface> OSPF interface** <sptr_neighbor> Associated neighbor to OSPF interface** RETURNS: 	OSPF_NO_PROBLEM or OSPF_NO_BUFFERS or OSPF_BAD_REQUEST** ERRNO: N/A** NOMANUAL*/static enum OSPF_RETURN_FLAGS ospf_build_neighbor_database_summary_list (OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor){	OSPF_LS_DATABASE_SUMMARY *sptr_database_summary =NULL;	OSPF_LS_DATABASE_SUMMARY *sptr_previous_database_summary =NULL;	OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_build_neighbor_database_summary_list\r\n");	sptr_database_summary = ospf_allocate_ls_database_summary (sptr_interface);	if (sptr_database_summary == NULL)		{		return (OSPF_NO_BUFFERS);		}	sptr_database_summary->size_of_packet = OSPF_PACKET_SIZE + OSPF_DATABASE_HEADER_SIZE;	sptr_neighbor->sptr_database_summary = sptr_database_summary;									/* this is the first packet in the list */	sptr_previous_database_summary = ospf_add_each_advertisement_in_the_database_to_the_appropriate_list (&sptr_database_summary,		sptr_interface, sptr_neighbor);	if (sptr_database_summary == NULL)		{		return (OSPF_NO_BUFFERS);		}	if (sptr_database_summary->size_of_packet == (OSPF_PACKET_SIZE + OSPF_DATABASE_HEADER_SIZE))		{																												/* check if the last formed packet is empty */		if (sptr_database_summary == sptr_neighbor->sptr_database_summary)			{																											/* check if it's the only packet in the list */			sptr_neighbor->sptr_database_summary = NULL;													/* it is, so make it an empty list */			}		ospf_free_ls_database_summary (sptr_database_summary);		sptr_database_summary = sptr_previous_database_summary;		}	if (sptr_database_summary != NULL)		{		if (sptr_neighbor->mode == OSPF_SLAVE)																	/* leave more bit on if OSPF_MASTER */			{			sptr_database_summary->sptr_ospf_header->rest_of_packet.database.flags._bit.more = FALSE;			}		sptr_database_summary->sptr_forward_link = NULL;		}	return (OSPF_NO_PROBLEM);}/**************************************************************************************** ospf_allocate_ls_database_summary - allocate memory for database summary** This routine allocates for the database summary.** <sptr_interface> OSPF interface** RETURNS: 	OSPF_LS_DATABASE_SUMMARY * or NULL** ERRNO: N/A** NOMANUAL*/OSPF_LS_DATABASE_SUMMARY *ospf_allocate_ls_database_summary (OSPF_INTERFACE *sptr_interface){    OSPF_LS_DATABASE_SUMMARY *sptr_database_summary = NULL;	ULONG interface_mtu =0;	OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_allocate_ls_database_summary\r\n");	sptr_database_summary = (OSPF_LS_DATABASE_SUMMARY *) table_malloc (1, sizeof (OSPF_LS_DATABASE_SUMMARY));	if (sptr_database_summary != NULL)		{		memset (sptr_database_summary, 0x00, sizeof (OSPF_LS_DATABASE_SUMMARY));		interface_mtu = ospf_get_interface_mtu (sptr_interface);		sptr_database_summary->sptr_ospf_header = table_malloc (1, interface_mtu); /* WAS ospf_get_an_ospf_send_packet (interface_mtu); */		if (sptr_database_summary->sptr_ospf_header != NULL)			{            memset( sptr_database_summary->sptr_ospf_header, 0x00, interface_mtu );            sptr_database_summary->size_of_packet = (USHORT) (OSPF_PACKET_SIZE + OSPF_DATABASE_HEADER_SIZE);            }		else			{			ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *)sptr_database_summary , "OSPF_LS_DATABASE_SUMMARY");			}        }		else			{            ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *)NULL , "OSPF_HEADER");			}	return (sptr_database_summary);}/********************************************************************************* ospf_add_each_advertisement_in_the_database_to_the_appropriate_list - * adds advertisement header to the appropriate list** This routine adds advertisement headers to the database summary list** <ptr_to_sptr_database_summary> pointer to the database summary list to be * modified** <sptr_interface> OSPF interface** <sptr_neighbor> OSPF neighbor associated with interface** RETURNS: 	OSPF_LS_DATABASE_SUMMARY * or NULL** ERRNO: N/A** NOMANUAL*/static OSPF_LS_DATABASE_SUMMARY *ospf_add_each_advertisement_in_the_database_to_the_appropriate_list     (    OSPF_LS_DATABASE_SUMMARY **ptr_to_sptr_database_summary,    OSPF_INTERFACE *sptr_interface,    OSPF_NEIGHBOR *sptr_neighbor    )    {    OSPF_LS_DATABASE_SUMMARY *sptr_previous_database_summary =NULL;    OSPF_LS_HEADER *sptr_ls_header =NULL;    enum OSPF_LS_TYPE maximum_ls_type;    enum OSPF_LS_TYPE ls_type;    ULONG index =0;    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;    enum BOOLEAN found_lsa = TRUE;    enum BOOLEAN found_external_lsa = TRUE;#if defined (__OPAQUE_LSA__)    enum BOOLEAN found_opaque_lsa = TRUE;    enum BOOLEAN found_type_11_lsa = TRUE;#endif    OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_add_each_advertisement_in_the_database_to_the_appropriate_list\r\n");    sptr_previous_database_summary = NULL;    sptr_ls_header = &((*ptr_to_sptr_database_summary)->sptr_ospf_header->rest_of_packet.database.link_state_advertisement_header);    maximum_ls_type = ospf_get_maximum_ls_type (sptr_interface);    /* for each type of advertisement */    for (ls_type = OSPF_LS_ROUTER; ls_type <= maximum_ls_type; ++ls_type)        {        /* for each hash list */        for (index = 0x00000000L, sptr_ls_database_head = &(sptr_interface->sptr_area->ls_database_hash_table[ls_type][index]);             index < OSPF_HASH_TABLE_SIZE;             ++index, sptr_ls_database_head = &(sptr_interface->sptr_area->ls_database_hash_table[ls_type][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;                *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_lsa = FALSE;                    break;                    }                }            if (found_lsa == FALSE)                {                break;                }            }            if (found_lsa == FALSE)                {                break;                }        }    /* Check for external lsdb */    /* for each hash list */    for (index = 0x00000000L, sptr_ls_database_head = &(ospf.external_database_hash_table[LS_EXTERNAL_LSA][index]);         index < OSPF_HASH_TABLE_SIZE;         ++index, sptr_ls_database_head = &(ospf.external_database_hash_table[LS_EXTERNAL_LSA][index]))        {        if (sptr_ls_database_head == NULL)            {            continue;            }        /* for each database entry */        /* 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 defined (__NSSA__)#if defined (__NSSA_FIXES__)            if(sptr_interface->sptr_area->flags._bit.nssa == TRUE)				{                continue;				}#endif /*__NSSA_FIXES__*/#endif /* __NSSA__ */				   																										/* for each database entry */            *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)                {

⌨️ 快捷键说明

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