📄 ospf_link_state_advertisements.c
字号:
/* ospf_link_state_advertisements.c *//* Copyright 2000-2003 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------03w,11sep03,kkz Fixed compiler warning for sfgnu03v,22jul03,agi Fixed compiler warning03u,11jun03,ram SPR#88965 Separate route table and LSDB hash parameters03t,09june03,htm Fix for SPR# 87382, ANVL 4.203s,26may03,agi Changed rwos_get_system_elapsed_time_second() to ospf_get_system_elapsed_time_second()03s,12may03,asr Changes to make OSPF virtual stack compatible.03r,22may03,kkz SPR 88613 Area Aggregation - section 12.4.3, final item - ignore backbone configured area address ranges when originating sumary LSAs into transit areas - added 2 new functions for handling area address range changes - use "active" flag for address ranges, to track active links fix to ospf_originate_a_single_summary_links_advertisement ()03q,27may03,kc Fixed SPR#86625 - added prematurely_age_advertisement argument to ospf_originate_default_summary_link_into_the_area().03p,21may03,htm Fixed SPR 86153 - Commented usage of source_area_id_for_virtual_link() since the concept of source area is not mentioned in RFC 2328.03o,14may03,agi Changed RWOS semaphores to vxWorks semaphores03n,15may03,ram SPR#88410 Fix for setting external LSDB route_proto to zero after refresh03m,14may03,ram SPR#88431 Fix for infinite loop in install and flood external routes03l,22apr03,ram SPR#76812 Modifications for OSPF performance enhancements03k,22apr03,ram SPR#87522 Modifications for correct redistribution of external routes03j,20feb03,kc Fixed SPR#86319 - renamed the inject_default_route_if_stub_area variable to inject_summary_lsa_into_stub_area in ospf_originate_a_single_summary_links_advertisement().03i,19feb03,mwv SPR 85906 - include IP header size into computation for LSA buffer creation.03h,17feb02,ram SPR 81808 Added OSPF memory partition support03g,11feb03,kkz SPR 76419, ANVL 27.3103f,28jan03,ram SPR 85050 Added support for external route redistribution based on OSPF external metric values03e,22jan03,kkz Fixed SPR#85856 - crash in ospf_install_and_flood_originated_advertisement0cd,16jan03,smr SPR 78250 Changes to pass UNH 3.21 test.03c,06jan03,ram SPR 85432 Changes to allow more OSPF external route processing03b,24dec02,dsk Fixed SPR#75194, ANVL 27.1502c,09dec02,hme Fixed SPR#75796, ANVL 37.1Sequence Number wrap is not happening smoothly.02q,18sep02,agi Propogated latest fix02p,18jul02,jkw Fix SPR 72230 and 7213502o,05jun02,kc Fixed ospf_originate_external_links_advertisement() so that it will not originate any non-default AS-external-LSAs if in overflow state.02n,28jun02,jkw Fix SPR 77140.02m,22apr02,ark Added in fixes for virtual links02l,18apr02,kc Don't originate any router links advertisement if there is no active interface in that area.02k,19apr02,jkw Fix memory leak for external lsas.02j,16apr02,jkw One copy of external and type 11 lsa02i,09apr02,jkw Sequence number wrap.02h,04mar02,bt Fix metric cost for address range02g,07feb02,jkw Fix forwarding address for external lsa02f,20dec01,jkw Removed sptr_area->sptr_interfaces structure.02e,10dec01,kc Explicitly initialize opaque_interface pointer in ospf_originate_type_9_links_advertisement()02d,28nov01,jkw Virtual link update fixes.02c,15nov01,jkw Virtual link updates02b,09nov01,jkw Fix null pointer check.02a,13oct01,kc Dynamic configuration changes.01z,13oct01,br Update virtual links code01y,11oct01,jkw Set pointer to NULL after table_free.01x,03sep01,jkw Added Mistral changes for 2178 updates.01w,22aug01,jkw Added more support for opaque lsas.01v,20jun01,jkw Added unnumbered link support01u,03may01,jkw Added checks for NULL pointers and alarm messages01t,26sep00,reshma Added WindRiver CopyRight01s,25sep00,reshma RFC-1587 implementation for OSPF NSSA Option, also tested against ANVL.01r,07jul00,reshma Unix compatibility related changes.01q,04apr00,reshma Added some MIB support (Read only).Passed all important ANVL OSPF tests.01p,23dec99,reshma Compatibility with VxWorks-IP and VxWorks RTM-interface01o,18jan99,jack fix in area range summarizations01n,06jan99,jack Added another NULL pointer check in ospf_build_a_router_link_advertisement on sptr_interface->sptr_neighbor01m,06jan99,jack Added NULL pointer check in ospf_build_a_router_link_advertisement on sptr_interface->sptr_neighbor01l,05jan99,jack Updated a comment in the function ospf_build_a_router_link_advertisement01k,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_link_state_advertisements.c is used for originating link stateadvertisements. This file is used for retrieving link state advertisements.This file is used whenever a link state advertisement needs to be created.*/#include "ospf.h"#include <time.h>#if defined (__OSPF_VIRTUAL_STACK__)#include "ospf_vs_lib.h"#endif /* __OSPF_VIRTUAL_STACK__ *//******************************************************************************/static enum BOOLEAN ospf_check_if_area_is_a_transit_area (OSPF_AREA_ENTRY *sptr_area);static OSPF_ROUTER_LINK_PIECE *ospf_add_a_link_description_to_the_router_advertisement (OSPF_ROUTER_LINK_PIECE *sptr_link, ULONG link_id,ULONG link_data,BYTE_ENUM (OSPF_ROUTER_LINK_TYPE) type,BYTE number_of_metrics,USHORT tos0_metric, USHORT *sptr_number_of_links,USHORT *sptr_length);static enum TEST ospf_check_if_next_hops_belong_to_the_area (OSPF_NEXT_HOP_BLOCK *sptr_next_hops_list_head,OSPF_AREA_ENTRY *sptr_area);static void ospf_generate_a_type_4_link_state_advertisement (OSPF_AREA_ENTRY *sptr_area,OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry, enum BOOLEAN prematurely_age_advertisement);static void ospf_generate_a_type_3_link_state_advertisement (OSPF_AREA_ENTRY *sptr_area,OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry, enum BOOLEAN prematurely_age_advertisement);static void ospf_generate_a_type_3_intra_area_link_state_advertisement (OSPF_AREA_ENTRY *sptr_area,ULONG network,ULONG mask,ULONG cost, enum BOOLEAN prematurely_age_advertisement);static void ospf_build_a_router_link_advertisement (OSPF_AREA_ENTRY *sptr_area, OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_router_link_advertisement, USHORT *sptr_length);static void ospf_install_and_flood_originated_advertisement (UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement, OSPF_LS_DATABASE_ENTRY *sptr_database_entry, USHORT length, OSPF_AREA_ENTRY *sptr_area);static void ospf_install_and_flood_external_advertisements_through_all_area (OSPF_EXTERNAL_ROUTE *sptr_external_route, UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement, OSPF_EXTERNAL_LINK_ADVERTISEMENT_HEADER *sptr_external_link_advertisement, USHORT length);static void *create_buffer_for_lsa (OSPF_INTERFACE *sptr_interface, USHORT *usptr_allocated_size_for_lsa);/* SPR 78250 Start */static STATUS ospfAssignLinkStateIDs (UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement, OSPF_EXTERNAL_ROUTE *sptr_external_route, OSPF_LS_DATABASE_ENTRY *sptr_database_entry);/* SPR 78250 End *//* SPR 85050 -- Begin */static void ospf_check_for_replacement_external_route_to_same_destination(OSPF_EXTERNAL_ROUTE *sptr_external_route);/* SPR 85050 -- End *//*opaque lsa prototype jkw*/#if defined (__OPAQUE_LSA__)static void ospf_install_and_flood_type_11_advertisements_through_all_area (OSPF_INTERFACE *sptr_interface, UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement, OSPF_TYPE_11_LINK_ADVERTISEMENT_HEADER *sptr_type_11_link_advertisement, USHORT length);#endif /* __OPAQUE_LSA__ */extern BOOLEAN ospf_verify_if_route_is_old(OSPF_ROUTING_TABLE_ENTRY *sptr_routing_table_entry);/******************************************************************************//* section 12.4 (page 114) */void ospf_originate_new_instance_of_the_link_state_advertisement (OSPF_LS_DATABASE_ENTRY *sptr_database_entry,OSPF_AREA_ENTRY *sptr_area, enum BOOLEAN first_pass_external){ OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_new_router_link_advertisement; UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement; seq_t sequence_number; USHORT length; enum TEST different_lsa;#if defined (__OPAQUE_LSA__) OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *sptr_type_9_link_advertisement = NULL; OSPF_TYPE_10_LINK_ADVERTISEMENT_HEADER *sptr_type_10_link_advertisement = NULL; OSPF_TYPE_11_LINK_ADVERTISEMENT_HEADER *sptr_type_11_link_advertisement = NULL; OSPF_LS_OPAQUE_HEADER *opaque_lsa = NULL; USHORT opaque_lsa_size = 0x0000; USHORT opaque_ls_header_size = 0x0000; OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_old_router_link_advertisement = NULL; USHORT checksum = 0x0000; USHORT data_size = 0x0000;#endif /* __OPAQUE_LSA__ */ /* HME Fix SPR#75796, ANVL 37.1 Begin */ ULONG lock_time_MinLSInterval = 0; /* HME Fix SPR#75796, ANVL 37.1 End */ OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_originate_new_instance_of_the_link_state_advertisement\r\n"); sequence_number = sptr_database_entry->advertisement.sptr_router->ls_header.sequence_number; sequence_number = net_to_host_long (sequence_number); OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "------------------------>>>>>>>>>>>>>>>>??????? NEW ospf_link_state_advertisements: In Fn ospf_originate_new_instance_of_the_link_state_advertisement \r\n"); if ((sequence_number == OSPFMAXLSSEQ) && ((sptr_database_entry->ls_database_sequence_state == OSPF_NORMAL) || (sptr_database_entry->ls_database_sequence_state == OSPF_WAITING_FOR_MAXIMUM_SEQUENCE_INSTANCE_TO_BE_FLUSHED))) { /* section 12.1.6 (page 109-110) */ sptr_database_entry->advertisement.sptr_router->ls_header.age = OSPF_MAXIMUM_AGE; sptr_database_entry->advertisement.sptr_router->ls_header.age = host_to_net_short (sptr_database_entry->advertisement.sptr_router->ls_header.age); (void) ospf_flood_advertisement_out_some_subset_of_the_routers_interfaces (sptr_database_entry->advertisement.sptr_router, sptr_area, NULL, NULL, TRUE); sptr_database_entry->ls_database_sequence_state = OSPF_WAITING_FOR_MAXIMUM_SEQUENCE_INSTANCE_TO_BE_FLUSHED; return; } else { length = sptr_database_entry->advertisement.sptr_router->ls_header.length; length = net_to_host_short (length); sptr_new_router_link_advertisement = (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *) table_malloc (1, length); if (sptr_new_router_link_advertisement == NULL) { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER"); return; } else { memset (sptr_new_router_link_advertisement, 0x0, length); }#if defined (__OPAQUE_LSA__) if (sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_TYPE_9) { sptr_type_9_link_advertisement = (OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *)sptr_new_router_link_advertisement; /* save the interface to which this opaque is going to send to */ sptr_type_9_link_advertisement->opaque_interface = sptr_database_entry->advertisement.sptr_type_9->opaque_interface; sptr_type_9_link_advertisement->ls_header.sequence_number = ospf_increment_sequence_number ( sptr_database_entry->advertisement.sptr_type_9->ls_header.sequence_number); sptr_type_9_link_advertisement->ls_header.age = 0x0000; sptr_type_9_link_advertisement->ls_header.options._byte = sptr_database_entry->advertisement.sptr_type_9->ls_header.options._byte; sptr_type_9_link_advertisement->ls_header.type = sptr_database_entry->advertisement.sptr_type_9->ls_header.type; sptr_type_9_link_advertisement->ls_header.id.lsid = sptr_database_entry->advertisement.sptr_type_9->ls_header.id.lsid; data_size = sptr_database_entry->advertisement.sptr_type_9->ls_header.length; data_size = net_to_host_short(data_size); data_size = (USHORT)(data_size - OSPF_LS_HEADER_SIZE); if ((sptr_database_entry->advertisement.sptr_type_9->data != NULL) && (data_size > 0)) { sptr_type_9_link_advertisement->data = table_malloc(1, data_size); if (sptr_type_9_link_advertisement->data == NULL) { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) sptr_new_router_link_advertisement, "OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER"); return; } memcpy(sptr_type_9_link_advertisement->data,sptr_database_entry->advertisement.sptr_type_9->data, data_size); } sptr_type_9_link_advertisement->ls_header.advertising_router = sptr_database_entry->advertisement.sptr_type_9->ls_header.advertising_router; sptr_type_9_link_advertisement->ls_header.length = sptr_database_entry->advertisement.sptr_type_9->ls_header.length; opaque_ls_header_size = sizeof(OSPF_LS_OPAQUE_HEADER); opaque_lsa_size = (USHORT)(data_size + opaque_ls_header_size); opaque_lsa = (OSPF_LS_OPAQUE_HEADER *) table_malloc(1, opaque_lsa_size); if (opaque_lsa != NULL) { memset(opaque_lsa, 0x00, opaque_lsa_size); memcpy(opaque_lsa, &(sptr_type_9_link_advertisement->ls_header), opaque_ls_header_size); if ((sptr_type_9_link_advertisement->data != NULL) && (data_size > 0)) { memcpy(((BYTE *)(opaque_lsa)+opaque_ls_header_size), sptr_type_9_link_advertisement->data, data_size);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -