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

📄 ospf_transmit_acknowledgement.c

📁 vxworks下ospf协议栈
💻 C
字号:
/* ospf_transmit_acknowledgement.c *//* Copyright 2000 Wind River Systems, Inc. *//*modification history___________________02a,17feb03,mwv     SPR 85906 - Use IP header size in calculations for packet fragmentation01q,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.52b  01c,02oct97,cindy   Release Version 1.5201b,22oct96,cindy   Release Version 1.5001a,05jun96,cindy   First Beta Release*//* DESCRIPTIONospf_transmit_acknowledgement.c is used for tramsitting link state acknowledgement packets.This file is used whenever a new OSPF link state acknowledgement packet needs to be transmitted.*/#include "ospf.h"#if defined (__OSPF_VIRTUAL_STACK__)#include "ospf_vs_lib.h"#endif /* __OSPF_VIRTUAL_STACK__ *//*******************************************************************************************************************************/static OSPF_HEADER *ospf_new_acknowledgement (OSPF_LS_ACKNOWLEDGEMENT_HEADER **ptr_to_sptr_acknowledgement_header,	OSPF_LS_HEADER **ptr_to_sptr_acknowledgement,OSPF_INTERFACE *sptr_interface);/*******************************************************************************//* section 13.5 of OSPF specification (page 141) */enum OSPF_ACKNOWLEDGEMENT_RETURN_TYPE ospf_send_acknowledgement (OSPF_INTERFACE *sptr_interface, OSPF_NEIGHBOR *sptr_neighbor,	OSPF_LS_HEADER_QUEUE **ptr_to_sptr_header_queue){	OSPF_HEADER *sptr_packet;	OSPF_LS_ACKNOWLEDGEMENT_HEADER *sptr_acknowledgement_header;	OSPF_LS_HEADER *sptr_acknowledgement;	OSPF_LS_HEADER_QUEUE *sptr_acknowledgement_list;	ULONG packet_length;	ULONG interface_mtu;	ULONG authentication_size;	ULONG destination_router;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_send_acknowledgement\r\n");	sptr_packet = NULL;	sptr_acknowledgement_header = NULL;	sptr_acknowledgement = NULL;	sptr_acknowledgement_list = NULL;	packet_length = 0x00000000L;	interface_mtu = 0x00000000L;	authentication_size = 0x00000000L;	destination_router = 0x00000000L;	sptr_packet = ospf_new_acknowledgement (&sptr_acknowledgement_header, &sptr_acknowledgement, sptr_interface);	if (sptr_packet == NULL)		{		OSPF_PRINTF_DEBUG (OSPF_ALARM_PRINTF, "OSPF: ospf_send_acknowledgement::ospf_new_acknowledgement() failed!\r\n");		return (OSPF_NO_ACKNOWLEDGEMENTS_LEFT);		}	packet_length = OSPF_PACKET_SIZE;	destination_router = ospf_determine_packet_destination (sptr_interface, sptr_neighbor);	interface_mtu = ospf_get_interface_mtu (sptr_interface);	authentication_size = ospf_get_authentication_size (sptr_interface);	for (sptr_acknowledgement_list = *ptr_to_sptr_header_queue; sptr_acknowledgement_list != NULL; sptr_acknowledgement_list = *ptr_to_sptr_header_queue)		{        /* SPR 85906 -- Begin */        if ((packet_length + OSPF_LS_HEADER_SIZE + authentication_size + OSPF_MAXIMUM_IP_HEADER_SIZE) >= interface_mtu)        /* SPR 85906 -- End */			{			ospf_tx_packet (sptr_packet, sptr_interface, OSPF_LINK_STATE_ACKNOWLEDGEMENT_PACKET, packet_length, destination_router, FALSE);            /* SPR 85906 -- Begin */            if ((sptr_neighbor == NULL) &&				((((sptr_interface->number_of_acknowledgements_on_delayed_acknowledgement_list + 1) * OSPF_LS_HEADER_SIZE) +				OSPF_PACKET_SIZE + OSPF_MAXIMUM_IP_HEADER_SIZE) <= interface_mtu))                /* SPR 85906 -- End */				{				/*				 * There are not enough acknowledgements left in the list to fill a packet to the rim so return with an indication to start				 * the acknowledgement timer.  Since we had a full packet we know that we were not being called by the acknowledgement timer.				 */				ospf_free_an_ospf_send_packet (sptr_packet);				return (OSPF_ACKNOWLEDGEMENTS_LEFT);				}			packet_length = OSPF_PACKET_SIZE;			sptr_acknowledgement_header = (OSPF_LS_ACKNOWLEDGEMENT_HEADER *) &sptr_packet->rest_of_packet.ls_acknowledgement;			sptr_acknowledgement = &sptr_acknowledgement_header->ls_advertisement_header;			}		memcpy ((void *) sptr_acknowledgement, (const void *) &sptr_acknowledgement_list->ls_header, (size_t) sizeof (OSPF_LS_HEADER));		packet_length += OSPF_LS_HEADER_SIZE;		sptr_acknowledgement = (OSPF_LS_HEADER *) ((ULONG) sptr_acknowledgement + OSPF_LS_HEADER_SIZE);		*ptr_to_sptr_header_queue = sptr_acknowledgement_list->sptr_forward_link;		table_free ((void *) sptr_acknowledgement_list);		sptr_acknowledgement_list = NULL;		if (sptr_neighbor == NULL)			{			--(sptr_interface->number_of_acknowledgements_on_delayed_acknowledgement_list);			}		}	if (packet_length > OSPF_PACKET_SIZE)		{		ospf_tx_packet (sptr_packet, sptr_interface, OSPF_LINK_STATE_ACKNOWLEDGEMENT_PACKET, packet_length, destination_router, TRUE);		}	else		{		/*		 * else the packet is still around free it		 */		ospf_free_an_ospf_send_packet (sptr_packet);		}	return (OSPF_NO_ACKNOWLEDGEMENTS_LEFT);}/***********************************************************************************************************************************/static OSPF_HEADER *ospf_new_acknowledgement (OSPF_LS_ACKNOWLEDGEMENT_HEADER **ptr_to_sptr_acknowledgement_header,	OSPF_LS_HEADER **ptr_to_sptr_acknowledgement,OSPF_INTERFACE *sptr_interface){	ULONG interface_mtu;	OSPF_HEADER *sptr_packet;	OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_new_acknowledgement\r\n");	interface_mtu = ospf_get_interface_mtu (sptr_interface);	sptr_packet = ospf_get_an_ospf_send_packet (interface_mtu);	/* Added change as per TMS PR # 1583	   To make sure sptr_packet will not be referenced if	   ospf_get_an_ospf_send_packet() request failed.*/	if (sptr_packet == NULL)		{		OSPF_PRINTF_DEBUG (OSPF_ALARM_PRINTF, "OSPF: ospf_new_acknowledgement::ospf_get_an_ospf_send_packet() failed!\r\n");		return (NULL);		}	*ptr_to_sptr_acknowledgement_header = (OSPF_LS_ACKNOWLEDGEMENT_HEADER *) &(sptr_packet->rest_of_packet.ls_acknowledgement);	*ptr_to_sptr_acknowledgement = (OSPF_LS_HEADER *) &((*ptr_to_sptr_acknowledgement_header)->ls_advertisement_header);	return (sptr_packet);}

⌨️ 快捷键说明

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