📄 ospf_database_summary.c
字号:
/* 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 + -