📄 ospf_flood.c
字号:
interface_type_received_on = (enum OSPF_INTERFACE_TYPE) 0x00; if (sptr_interface_advertisement_received_on != NULL) { interface_type_received_on = sptr_interface_advertisement_received_on->type; } /* SPR 78381 Do not propagate summary lsa if noAreaSummary */ /* SPR#86319 - the variable inject_summary_lsa_into_stub_area controls the import * of summary LSAs into stub areas. It has no effect on other areas. */ if ((sptr_area->flags._bit.stub == TRUE) && ((sptr_advertisement->ls_header.type == OSPF_LS_SUMMARY_NETWORK) || (sptr_advertisement->ls_header.type == OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER)) && (sptr_area->inject_summary_lsa_into_stub_area == FALSE)) { return; } for (sptr_interface = ospf.sptr_interface_list; sptr_interface != NULL; sptr_interface = sptr_next_interface) { sptr_next_interface = sptr_interface->sptr_forward_link; if (sptr_interface->area_id == sptr_area->area_id) { if ( (sptr_area->area_id == OSPF_BACKBONE) || (sptr_interface->type != OSPF_VIRTUAL_LINK) ) { ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on, sptr_neighbor_advertisement_received_from, advertisement_installed); } else if ( (sptr_interface->type == OSPF_VIRTUAL_LINK) && (sptr_interface_advertisement_received_on == NULL) ) /* originating on the other end of VL which doesn't have area 0.0.0.0 */ { ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on, sptr_neighbor_advertisement_received_from, advertisement_installed); } else if ( (interface_type_received_on == OSPF_VIRTUAL_LINK) && (sptr_interface_advertisement_received_on != sptr_interface) ) { ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on, sptr_neighbor_advertisement_received_from, advertisement_installed); /*#$-NOTE:note17-$#*/ } } } return;}/*opaque lsa flood throughout a link-local scope jkw RFC 2370 Section 3.1 item 1*/#if defined (__OPAQUE_LSA__)/*************************************************************************** ospf_flood_advertisement_throughout_a_link_local_scope - flood advertisements throughout a link local scope** This routine will the advertisement throughout the link local* scope.** <sptr_advertisement> Advertisement header** <sptr_area> Area associated with the advertisement** <sptr_interface_advertisement_received_on> Interface advertisement was received on** <sptr_neighbor_advertisement_received_from> Neighbor advertisement was received on** <advertisement_installed> Boolean to tell if advertisement is already installed** RETURNS: N/A** ERRNO: N/A** NOMANUAL*/static void ospf_flood_advertisement_throughout_a_link_local_scope (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_advertisement,OSPF_AREA_ENTRY *sptr_area, OSPF_INTERFACE *sptr_interface_advertisement_received_on,OSPF_NEIGHBOR *sptr_neighbor_advertisement_received_from, enum BOOLEAN advertisement_installed){ OSPF_INTERFACE *sptr_interface = NULL; OSPF_INTERFACE *sptr_next_interface = NULL; enum OSPF_INTERFACE_TYPE interface_type_received_on; OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *type_9_lsa = NULL; OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_flood_advertisement_throughout_a_link_local_scope\r\n"); type_9_lsa = (OSPF_TYPE_9_LINK_ADVERTISEMENT_HEADER *)sptr_advertisement; interface_type_received_on = (enum OSPF_INTERFACE_TYPE) 0x00; if (sptr_interface_advertisement_received_on != NULL) { interface_type_received_on = sptr_interface_advertisement_received_on->type; } for (sptr_interface = sptr_area->sptr_interfaces; sptr_interface != NULL; sptr_interface = sptr_next_interface) { sptr_next_interface = sptr_interface->sptr_forward_link; if (sptr_interface->area_id == sptr_area->area_id) { if (sptr_interface_advertisement_received_on == NULL) { if ( (sptr_area->area_id == OSPF_BACKBONE) || (sptr_interface->type != OSPF_VIRTUAL_LINK) ) { ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on, sptr_neighbor_advertisement_received_from, advertisement_installed); } else if ( sptr_interface->type == OSPF_VIRTUAL_LINK ) /* originating on the other end of VL which doesn't have area 0.0.0.0 */ { ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on, sptr_neighbor_advertisement_received_from, advertisement_installed); } else if ( (interface_type_received_on == OSPF_VIRTUAL_LINK) && (sptr_interface_advertisement_received_on != sptr_interface) ) { ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on, sptr_neighbor_advertisement_received_from, advertisement_installed); /*#$-NOTE:note17-$#*/ } } else { if (type_9_lsa->opaque_interface == sptr_interface) { if ( (sptr_area->area_id == OSPF_BACKBONE) || (sptr_interface->type != OSPF_VIRTUAL_LINK) ) { ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on, sptr_neighbor_advertisement_received_from, advertisement_installed); } else if ( (interface_type_received_on == OSPF_VIRTUAL_LINK) && (sptr_interface_advertisement_received_on != sptr_interface) ) { ospf_flood_advertisement_out_eligible_interface (sptr_advertisement, sptr_interface, sptr_interface_advertisement_received_on, sptr_neighbor_advertisement_received_from, advertisement_installed); /*#$-NOTE:note17-$#*/ } } } } } return;}#endif /* __OPAQUE_LSA__ *//*************************************************************************** ospf_flood_advertisement_out_eligible_interface - flood out eligible interface** This routine will add the advertisement to the retransmit list and* call the function to build an link state update.** <sptr_advertisement> Advertisement header** <sptr_interface_advertisement_received_on> Interface advertisement was received on** <sptr_neighbor_advertisement_received_from> Neighbor advertisement was received on** <advertisement_installed> Boolean to tell if advertisement is already installed** RETURNS: N/A** ERRNO: N/A** NOMANUAL*//**********************************************************************//* section 13.3 of OSPF specification (page 139 - 140) */static void ospf_flood_advertisement_out_eligible_interface (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_advertisement, OSPF_INTERFACE *sptr_interface,OSPF_INTERFACE *sptr_interface_advertisement_received_on, OSPF_NEIGHBOR *sptr_neighbor_advertisement_received_from, enum BOOLEAN advertisement_installed){ OSPF_LS_DATABASE_NODE *sptr_database_list =NULL; enum BOOLEAN advertisement_was_added_to_a_retransmission_list; char print_buffer[PRINT_BUFFER_SIZE]; /* HME Fix SPR#75796 ANVL 37.1 Begin*/ OSPF_LS_DATABASE_ENTRY *sptr_database_entry = NULL; ULONG lock_time_MinLSInterval = 0; /* HME Fix SPR#75796 ANVL 37.1 End*/ BYTE_ENUM (OSPF_LS_TYPE) type; ULONG advertising_router; ULONG link_state_id; advertisement_was_added_to_a_retransmission_list = TRUE; OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_flood_advertisement_out_eligible_interface\r\n"); /* section 13.3, item (1-5) - (page 148-149) */ if (sptr_interface_advertisement_received_on != NULL) { if ((sptr_interface == sptr_interface_advertisement_received_on) && ((sptr_interface_advertisement_received_on->designated_router.address == sptr_neighbor_advertisement_received_from->address) || (sptr_interface_advertisement_received_on->backup_designated_router.address == sptr_neighbor_advertisement_received_from->address) || (sptr_interface->state == OSPF_INTERFACE_BACKUP_DESIGNATED_ROUTER) || ( sptr_interface->state != OSPF_INTERFACE_DESIGNATED_ROUTER ))) { return; } } advertisement_was_added_to_a_retransmission_list = ospf_examine_each_neighbor_and_add_advertisement_to_the_retransmission_list_if_necessary ( sptr_interface, &sptr_database_list, sptr_advertisement, sptr_neighbor_advertisement_received_from, advertisement_installed); /* * Shouldn't the three following ifs come before section 13.3, item (1) */ /* section 13.3, item (2) - (page 139) */ if (advertisement_was_added_to_a_retransmission_list == FALSE) { return; } /* section 13.3, item (5) - (page 140) */ type = sptr_advertisement->ls_header.type; if (type > OSPF_LS_MAX) { type = OSPF_LS_MAX; } OSPF_CONVERT_IP_ADDRESS_TO_DOT_FORMAT_FOR_DEBUG (print_buffer, sptr_interface->address); OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Flooding %s advertisement out interface %s\r\n", cptr_ls_type_string[type], print_buffer); /* SPR#76812 -- Begin */ link_state_id = sptr_advertisement->ls_header.id; link_state_id = net_to_host_long (link_state_id); advertising_router = sptr_advertisement->ls_header.advertising_router; advertising_router = net_to_host_long (advertising_router); if(type == OSPF_LS_NETWORK) { sptr_database_entry = ospf_find_network_LSA(sptr_interface->sptr_area,link_state_id); } else { sptr_database_entry = ospf_find_LSA(sptr_interface->sptr_area,link_state_id,advertising_router,type); } /* SPR#76812 -- End */ if (sptr_database_entry == NULL) { OSPF_PRINTF_ALARM (OSPF_ALARM_PRINTF, "OSPF: Could not find the advertisemnt in the LSDB\r\n"); } else { lock_time_MinLSInterval = sptr_database_entry->lock_time_MinLSInterval; sptr_database_entry->lock_time_MinLSInterval = 0; } /* SPR88613 */ if (lock_time_MinLSInterval < OSPF_MinLSInterval) { /* Do not send the update right now, we should wait for at least MinLSInterval before distinct origination of any particular LSA. The LSA-retransimition mechanism will re-send the LSA after RxntInterval */ } else { ospf_send_ls_update (sptr_database_list, NULL, sptr_interface, FALSE, advertisement_installed); } /* HME Fix SPR#75796 ANVL 37.1 End*/ /* * The neighbor's retransmit db pointers are pointing to this. Don't free it here * Free it only after receiving an ACK */ /* * We are only freeing the outer OSPF_LS_DATABASE_NODE but not the OSPF_LS_DATABASE_ENTRY inside, which is on the * neighbor's retransmission lists. */ if (sptr_database_list != NULL) { sptr_database_list = (OSPF_LS_DATABASE_NODE *) ospf_free_entire_list ((OSPF_GENERIC_NODE *) sptr_database_list); } if (sptr_interface == sptr_interface_advertisement_received_on) { advertisement_was_flooded_back_out_receiving_interface = TRUE; } return;}/*************************************************************************** ospf_examine_each_neighbor_and_add_advertisement_to_the_retransmission_list_if_necessary - add advertisement to neighbor retransmit list** This routine will examine each neighbor and add the* advertisement to the retransmit list.** <sptr_interface> OSPF interface** <ptr_to_sptr_database_list> Link state database list** <sptr_advertisement> Advertisement to be added to retransmit list** <sptr_interface_advertisement_received_on> Interface advertisement was received on** <sptr_neighbor_advertisement_received_from> Neighbor advertisement was received on** <advertisement_installed> Boolean to tell if advertisement is already installed** RETURNS: TRUE or FALSE** ERRNO: N/A** NOMANUAL*//**************************************************************************************//* section 13.3, item (1) - (page 139) */static enum BOOLEAN ospf_examine_each_neighbor_and_add_advertisement_to_the_retransmission_list_if_necessary ( OSPF_INTERFACE *sptr_interface, OSPF_LS_DATABASE_NODE **ptr_to_sptr_database_list,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -