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

📄 ospf_transmit_database.c

📁 vxworks下ospf协议栈
💻 C
字号:
/* ospf_transmit_database.c *//* Copyright 2000 Wind River Systems, Inc. *//*modification history___________________02c,19feb03,mwv     SPR 86272 - DD with the more bit enabled will wait until an acknowledgement is                    received before sending the next DD.02b,13feb03,mwv     SPR 85993 - enable M-bit on DD packets that span > MTU size02a,26nov02,kkz     SPR 75761 - ANVL 13.10 include Network LSA in DD packet01r,24jun02,jkw     SPR 77461 Need to traverse through database summary list01q,11may01,aos     Added null pointer checks01p,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_transmit_database.c is used for transmitting database description packets.This file is used whenever a new OSPF database description packet needs to be transmitted.*/#include "ospf.h"#if defined (__OSPF_VIRTUAL_STACK__)#include "ospf_vs_lib.h"#endif /* __OSPF_VIRTUAL_STACK__ *//*******************************************************************************************************************************/static void ospf_new_empty_database_description (OSPF_HEADER **ptr_to_sptr_packet,OSPF_DATABASE_HEADER **ptr_to_sptr_database_header,	ULONG authentication_size);static void ospf_initialize_database_header (OSPF_DATABASE_HEADER *sptr_database_header,OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor);/********************************************************************************//* section 10.8 of OSPF specification (page 93) */void ospf_send_an_empty_database_description_packet (OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor){	ULONG authentication_size;	OSPF_HEADER *sptr_packet;	OSPF_DATABASE_HEADER *sptr_database_header;	ULONG destination_router;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_send_an_empty_database_description_packet\r\n");	authentication_size = ospf_get_authentication_size (sptr_interface);	ospf_new_empty_database_description (&sptr_packet, &sptr_database_header, authentication_size);    /* Added change as per TMS PR # 1583.	   To make sure the sptr_packet will not be referenced if NULL*/    if ( sptr_packet == NULL )		{		OSPF_PRINTF_DEBUG (OSPF_ALARM_PRINTF, "OSPF: ospf_send_an_empty_database_description_packet::ospf_new_empty_database_description() failed!\r\n");        return;  /* don't send */		}	ospf_initialize_database_header (sptr_database_header, sptr_interface, sptr_neighbor);	destination_router = sptr_neighbor->address; /* DDs are always unicast */	ospf_tx_packet (sptr_packet, sptr_interface, OSPF_DATABASE_DESCRIPTION_PACKET, (ULONG) (OSPF_DATABASE_HEADER_SIZE + OSPF_PACKET_SIZE),		destination_router, TRUE);	return;}/**********************************************************************************************************************************/static void ospf_new_empty_database_description (OSPF_HEADER **ptr_to_sptr_packet,OSPF_DATABASE_HEADER **ptr_to_sptr_database_header,	ULONG authentication_size){	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_new_empty_database_description\r\n");	*ptr_to_sptr_packet = ospf_get_an_ospf_send_packet (OSPF_PACKET_SIZE + OSPF_DATABASE_HEADER_SIZE + authentication_size);	/* Added changes as per TMS PR # 1583	   To make sure the ptr_to_sptr_packet will only be referenced if	   ospf_get_an_ospf_send_packet() is ok! */    if ( *ptr_to_sptr_packet != NULL )    {        *ptr_to_sptr_database_header = (OSPF_DATABASE_HEADER *) &((*ptr_to_sptr_packet)->rest_of_packet.database);    }	return;}/********************************************************************************//* section 10.8 of OSPF specification (page 93) */void ospf_send_database_summary (OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor){	OSPF_HEADER *sptr_packet;	OSPF_HEADER *sptr_sending_packet;	OSPF_DATABASE_HEADER *sptr_database_header;	OSPF_LS_DATABASE_SUMMARY *sptr_database_summary;	OSPF_LS_DATABASE_SUMMARY *sptr_next_database_summary;	ULONG destination_router;	ULONG interface_mtu;	ULONG size_of_ads;	ULONG size_of_packet;	ULONG address;	OSPF_DATABASE_HEADER *sptr_temp_database_header1;	OSPF_DATABASE_HEADER *sptr_temp_database_header2;	OSPF_LS_HEADER *sptr_temp_ls_header1;	OSPF_LS_HEADER *sptr_temp_ls_header2;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_send_database_summary\r\n");	sptr_packet = NULL;	sptr_sending_packet = NULL;	sptr_database_header  = NULL;	sptr_database_summary  = NULL;	sptr_next_database_summary  = NULL;	size_of_ads = 0x00000000L;	size_of_packet = 0x00000000L;	address = 0x00000000L;	sptr_temp_database_header1 = NULL;	sptr_temp_database_header2 = NULL;	sptr_temp_ls_header1 = NULL;	sptr_temp_ls_header2 = NULL;	if (sptr_neighbor->sptr_database_summary == NULL)		{		sptr_database_summary = ospf_allocate_ls_database_summary (sptr_interface);		if (sptr_database_summary == NULL)			{			return;			}		sptr_neighbor->sptr_database_summary = sptr_database_summary;		sptr_packet = (OSPF_HEADER *) sptr_database_summary->sptr_ospf_header;		sptr_database_header = (OSPF_DATABASE_HEADER *) &sptr_packet->rest_of_packet.database;		ospf_initialize_database_header (sptr_database_header, sptr_interface, sptr_neighbor);		destination_router =  sptr_neighbor->address;		interface_mtu = ospf_get_interface_mtu (sptr_interface);		sptr_sending_packet = (OSPF_HEADER*) ospf_get_an_ospf_send_packet (interface_mtu );		if (sptr_sending_packet == NULL)			{			OSPF_PRINTF_DEBUG (OSPF_ALARM_PRINTF, "OSPF: ospf_send_database_summary::ospf_get_an_ospf_send_packet() failed!\r\n");			return;			}		memcpy ((BYTE*) sptr_sending_packet, (BYTE*) sptr_packet, (sizeof (OSPF_HEADER) - sizeof (UNION_OSPF_PACKET_TYPES)) );		size_of_ads = sptr_database_summary->size_of_packet - (sizeof (OSPF_HEADER) - sizeof (UNION_OSPF_PACKET_TYPES)) ;		sptr_temp_database_header2 =   (OSPF_DATABASE_HEADER*) ((BYTE *) sptr_sending_packet +   (sizeof (OSPF_HEADER) - sizeof (UNION_OSPF_PACKET_TYPES)) ) ;		sptr_temp_database_header1 =   (OSPF_DATABASE_HEADER*)  ((BYTE*) sptr_packet + (sizeof (OSPF_HEADER) - sizeof (UNION_OSPF_PACKET_TYPES)) );		memcpy ((BYTE*) sptr_temp_database_header2, (BYTE*) sptr_temp_database_header1, ( sizeof (OSPF_DATABASE_HEADER) - sizeof (OSPF_LS_HEADER) ) );		sptr_temp_ls_header2 =   (OSPF_LS_HEADER*) ((BYTE *) sptr_temp_database_header2 +   (sizeof (OSPF_DATABASE_HEADER) - sizeof (OSPF_LS_HEADER)) ) ;		sptr_temp_ls_header1 =   (OSPF_LS_HEADER*) ((BYTE*) sptr_temp_database_header1 + ( sizeof (OSPF_DATABASE_HEADER) - sizeof (OSPF_LS_HEADER)) );		size_of_packet = sptr_database_summary->size_of_packet;		for ( ; size_of_ads >= sizeof (OSPF_LS_HEADER) ; size_of_ads = size_of_ads - sizeof (OSPF_LS_HEADER) )			{			/*opaque lsa check for opaque enabled before sending database summary jkw*/#if defined		(__OPAQUE_LSA__)			if ((sptr_temp_ls_header1->type == OSPF_LS_TYPE_9) &&				(sptr_neighbor->opaque_capability == FALSE))				{				continue;				}			else if ((sptr_temp_ls_header1->type == OSPF_LS_TYPE_10) &&				(sptr_neighbor->opaque_capability == FALSE))				{				continue;				}			else if ((sptr_temp_ls_header1->type == OSPF_LS_TYPE_11) &&				(sptr_neighbor->opaque_capability == FALSE))				{				continue;				}#endif /* __OPAQUE_LSA__ */			address = host_to_net_long (sptr_interface->address);			/* SPR 75761 - remove code which prevents sending of network LSA,			 * when link state ID = interface address.  We should send all			 * LSAs which are in the LSDB.			 */			memcpy ((BYTE*) sptr_temp_ls_header2, (BYTE*) sptr_temp_ls_header1, sizeof (OSPF_LS_HEADER) );			sptr_temp_ls_header1 =  (OSPF_LS_HEADER*) ( (BYTE*) sptr_temp_ls_header1 + sizeof (OSPF_LS_HEADER)) ;			sptr_temp_ls_header2 =  (OSPF_LS_HEADER*) ( (BYTE*) sptr_temp_ls_header2 + sizeof (OSPF_LS_HEADER)) ;			}		ospf_tx_packet (sptr_sending_packet, sptr_interface, OSPF_DATABASE_DESCRIPTION_PACKET, size_of_packet,			destination_router, FALSE);		ospf_free_an_ospf_send_packet ((void*) sptr_sending_packet );		sptr_sending_packet = NULL;		}	else		{		        /* SPR 86272 -- Begin                                                                        */        /* this fix nulls SPR 77461                                                                  */        /* Send the data in the currenly pointed to database summay.  Each DD packet must recieve an */        /* acknowledgement before the next is sent                                                   */                 /* (sptr_database_summary = sptr_neighbor->sptr_database_summary; sptr_database_summary != NULL; sptr_database_summary = sptr_next_database_summary)*/        /*	{ */				sptr_database_summary = sptr_neighbor->sptr_database_summary;                if ( sptr_database_summary != NULL )            {					sptr_packet = (OSPF_HEADER *) sptr_database_summary->sptr_ospf_header;			sptr_database_header = (OSPF_DATABASE_HEADER *) &sptr_packet->rest_of_packet.database;			ospf_initialize_database_header (sptr_database_header, sptr_interface, sptr_neighbor);			destination_router =  sptr_neighbor->address;			interface_mtu = ospf_get_interface_mtu (sptr_interface);			sptr_sending_packet = (OSPF_HEADER*) ospf_get_an_ospf_send_packet (interface_mtu );			if (sptr_sending_packet == NULL)				{				OSPF_PRINTF_DEBUG (OSPF_ALARM_PRINTF, "OSPF: ospf_send_database_summary::ospf_get_an_ospf_send_packet() failed!\r\n");				return;				}			memcpy ((BYTE*) sptr_sending_packet, (BYTE*) sptr_packet, (sizeof (OSPF_HEADER) - sizeof (UNION_OSPF_PACKET_TYPES)) );			size_of_ads = sptr_database_summary->size_of_packet - (sizeof (OSPF_HEADER) - sizeof (UNION_OSPF_PACKET_TYPES)) ;			sptr_temp_database_header2 =   (OSPF_DATABASE_HEADER*) ((BYTE *) sptr_sending_packet +   (sizeof (OSPF_HEADER) - sizeof (UNION_OSPF_PACKET_TYPES)) ) ;			sptr_temp_database_header1 =   (OSPF_DATABASE_HEADER*)  ((BYTE*) sptr_packet + (sizeof (OSPF_HEADER) - sizeof (UNION_OSPF_PACKET_TYPES)) );			memcpy ((BYTE*) sptr_temp_database_header2, (BYTE*) sptr_temp_database_header1, ( sizeof (OSPF_DATABASE_HEADER) - sizeof (OSPF_LS_HEADER) ) );			sptr_temp_ls_header2 =   (OSPF_LS_HEADER*) ((BYTE *) sptr_temp_database_header2 +   (sizeof (OSPF_DATABASE_HEADER) - sizeof (OSPF_LS_HEADER)) ) ;			sptr_temp_ls_header1 =   (OSPF_LS_HEADER*) ((BYTE*) sptr_temp_database_header1 + ( sizeof (OSPF_DATABASE_HEADER) - sizeof (OSPF_LS_HEADER)) );			size_of_packet = sptr_database_summary->size_of_packet;			for ( ; size_of_ads >= sizeof (OSPF_LS_HEADER) ; size_of_ads = size_of_ads - sizeof (OSPF_LS_HEADER) )				{				/*opaque lsa check for opaque enabled before sending database summary jkw*/#if defined		(__OPAQUE_LSA__)				if ((sptr_temp_ls_header1->type == OSPF_LS_TYPE_9) &&					(sptr_neighbor->opaque_capability == FALSE))					{					continue;					}				else if ((sptr_temp_ls_header1->type == OSPF_LS_TYPE_10) &&					(sptr_neighbor->opaque_capability == FALSE))					{					continue;					}				else if ((sptr_temp_ls_header1->type == OSPF_LS_TYPE_11) &&					(sptr_neighbor->opaque_capability == FALSE))					{					continue;					}#endif /* __OPAQUE_LSA__ */				address = host_to_net_long (sptr_interface->address);				/* SPR 75761 - remove code which prevents sending of network LSA,				 * when link state ID = interface address.  We should send all				 * LSAs which are in the LSDB.				 */				memcpy ((BYTE*) sptr_temp_ls_header2, (BYTE*) sptr_temp_ls_header1, sizeof (OSPF_LS_HEADER) );				sptr_temp_ls_header1 =  (OSPF_LS_HEADER*) ( (BYTE*) sptr_temp_ls_header1 + sizeof (OSPF_LS_HEADER)) ;				sptr_temp_ls_header2 =  (OSPF_LS_HEADER*) ( (BYTE*) sptr_temp_ls_header2 + sizeof (OSPF_LS_HEADER)) ;                }            /* send the current DD */            ospf_tx_packet (sptr_sending_packet, sptr_interface, OSPF_DATABASE_DESCRIPTION_PACKET, size_of_packet,                             destination_router, FALSE);	                        /* free the current DD */            ospf_free_an_ospf_send_packet ((void*) sptr_sending_packet );            sptr_sending_packet = NULL;            }        /* SPR 86272 -- End */        }	return;}/***********************************************************************************************************************************/static void ospf_initialize_database_header (OSPF_DATABASE_HEADER *sptr_database_header,OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor){	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_initialize_database_header\r\n");	/* RFC 2178 */	if (sptr_interface->type == OSPF_VIRTUAL_LINK)		{		sptr_database_header->interface_mtu = 0x0000;		}	else		{		sptr_database_header->interface_mtu = (USHORT)ospf_get_interface_mtu(sptr_interface);		sptr_database_header->interface_mtu = host_to_net_short(sptr_database_header->interface_mtu);		}	if ((sptr_interface->type != OSPF_VIRTUAL_LINK && sptr_interface->sptr_area->flags._bit.stub == TRUE ) ||		(sptr_interface->type != OSPF_VIRTUAL_LINK && sptr_interface->sptr_area->flags._bit.nssa == TRUE))		{		if (sptr_interface->sptr_area->flags._bit.nssa == TRUE)			{			sptr_database_header->options._bit.nssa = TRUE;			}		}	else		{		sptr_database_header->options._bit.externals = TRUE;		}    /*opaque lsa set DD packet options with opaque capability on jkw*/#if defined (__OPAQUE_LSA__)	if (ospf.opaque_capability == TRUE)		{		sptr_database_header->options._bit.opaque = TRUE;		}#endif /* __OPAQUE_LSA__ */	/* SPR 85993 -- Begin */	sptr_database_header->flags._byte = (sptr_database_header->flags._byte | sptr_neighbor->flags._byte);	/* SPR 85993 -- End */	sptr_database_header->sequence = sptr_neighbor->database_description_sequence_number;	sptr_database_header->sequence = host_to_net_long (sptr_database_header->sequence);	return;}

⌨️ 快捷键说明

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