📄 ospf_link_state_advertisements.c
字号:
case OSPF_LS_MAX: break; } /* SPR#75796, ANVL 37.1 Begin*/ lock_time_MinLSInterval = ospf_get_system_elapsed_time_second () - sptr_database_entry->ls_database_time_stamp; /* SPR#75796, ANVL 37.1 End*/ /* SPR 85050 */ sptr_database_entry = ospf_install_a_new_advertisement_in_the_link_state_database ( sptr_database_entry, sptr_advertisement, sptr_area, &different_lsa, sptr_database_entry->route_protocol); /* SPR#75796, ANVL 37.1 Begin*/ sptr_database_entry->lock_time_MinLSInterval = lock_time_MinLSInterval; /* SPR#75796, ANVL 37.1 End*/ (void) ospf_flood_advertisement_out_some_subset_of_the_routers_interfaces (sptr_new_router_link_advertisement, sptr_area, NULL, NULL, TRUE); table_free ((void*) sptr_advertisement); sptr_advertisement = NULL; } return;}/***************************************************************************************************//* section 12.4.1 (page 116-123) */void ospf_originate_router_links_advertisement (OSPF_AREA_ENTRY *sptr_area){ OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *sptr_router_link_advertisement; UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement; USHORT length; USHORT allocated_size_for_lsa; enum BOOLEAN I_am_an_area_border_router; OSPF_LS_DATABASE_ENTRY *sptr_database_entry; enum BOOLEAN this_is_a_transit_area;#if defined (__OSPF_VIRTUAL_LINK__) OSPF_INTERFACE_NODE* sptr_virtual_interface_node = NULL; OSPF_INTERFACE* sptr_interface = NULL; OSPF_NEIGHBOR* sptr_neighbor = NULL; enum BOOLEAN set_v_flag = FALSE;#endif /* __OSPF_VIRTUAL_LINK__ */ OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_originate_router_links_advertisement\r\n"); /* only generate the router link advertisement for the area if there is at least * one active interface in the area */ if (sptr_area->number_of_interfaces_in_up_state == 0) return; sptr_router_link_advertisement = (OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER *) create_buffer_for_lsa (sptr_area->sptr_interfaces, &allocated_size_for_lsa); if (sptr_router_link_advertisement == NULL) { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER"); return; } sptr_router_link_advertisement->ls_header.age = 0x0000; if ((sptr_area->area_id == 0x00000000L || sptr_area->flags._bit.stub != TRUE) && (sptr_area->area_id == 0x00000000L || sptr_area->flags._bit.nssa != TRUE)) { sptr_router_link_advertisement->ls_header.options._byte = OSPF_ENABLE_EXTERNAL_ROUTING; } else { sptr_router_link_advertisement->ls_header.options._byte = OSPF_NOT_ENABLE_EXTERNAL_ROUTING ; if ( sptr_area->flags._bit.nssa == TRUE) { sptr_router_link_advertisement->ls_header.options._bit.nssa = TRUE; } } sptr_router_link_advertisement->ls_header.type = OSPF_LS_ROUTER; sptr_router_link_advertisement->ls_header.id = ospf.router_id; sptr_router_link_advertisement->ls_header.id = host_to_net_long (sptr_router_link_advertisement->ls_header.id); sptr_router_link_advertisement->ls_header.advertising_router = ospf.router_id; sptr_router_link_advertisement->ls_header.advertising_router = host_to_net_long (sptr_router_link_advertisement->ls_header.advertising_router); /* sequence number increment moved down */ I_am_an_area_border_router = ospf_check_if_area_border_router (); sptr_router_link_advertisement->bit_options._ushort = 0x0000; if (I_am_an_area_border_router == TRUE) { sptr_router_link_advertisement->bit_options._bit.bit_B = TRUE; } else { sptr_router_link_advertisement->bit_options._bit.bit_B = FALSE; }#if !defined (__NSSA__) /* SPR 78253 stub area cannot have E bit turned on */ if ((ospf.autonomous_system_border_router == TRUE) && (sptr_area->flags._bit.stub == FALSE)) { sptr_router_link_advertisement->bit_options._bit.bit_E = TRUE; }#else if (sptr_area->flags._bit.nssa != TRUE) { /* SPR 78253 stub area cannot have E bit turned on */ if ((ospf.autonomous_system_border_router == TRUE) && (sptr_area->flags._bit.stub == FALSE)) { sptr_router_link_advertisement->bit_options._bit.bit_E = TRUE; } }#endif /*__NSSA__*/#if !defined (__OSPF_VIRTUAL_LINK__) this_is_a_transit_area = ospf_check_if_area_is_a_transit_area (sptr_area); if (this_is_a_transit_area == TRUE) { sptr_router_link_advertisement->bit_options._bit.bit_V = TRUE; }#else /*__OSPF_VIRTUAL_LINK__*/ this_is_a_transit_area = ospf_check_if_area_is_a_transit_area (sptr_area); if (this_is_a_transit_area == TRUE) { for ( sptr_virtual_interface_node = ospf.sptr_configured_virtual_links; sptr_virtual_interface_node != NULL; sptr_virtual_interface_node = sptr_virtual_interface_node->sptr_forward_link) { if((sptr_virtual_interface_node->sptr_interface->sptr_transit_area != NULL) && (sptr_virtual_interface_node->sptr_interface->sptr_transit_area->area_id == sptr_area->area_id)) { sptr_interface = sptr_virtual_interface_node->sptr_interface; break; } } if(sptr_interface != NULL) { for (sptr_neighbor = sptr_interface->sptr_neighbor; sptr_neighbor != NULL; sptr_neighbor = sptr_neighbor->sptr_forward_link) { if(sptr_neighbor->state == OSPF_NEIGHBOR_FULL) set_v_flag = TRUE; } } } if (set_v_flag == TRUE) { sptr_router_link_advertisement->bit_options._bit.bit_V = TRUE; }#endif /* __OSPF_VIRTUAL_LINK__ */ sptr_router_link_advertisement->number_of_links = 0x0000; length = OSPF_ROUTER_LINK_ADVERTISEMENT_HEADER_SIZE; /* section 12.4.1, first bullet item (page 119) - only examine those interfaces with attached networks belonging to this area */ ospf_build_a_router_link_advertisement (sptr_area, sptr_router_link_advertisement, &length); sptr_router_link_advertisement->ls_header.length = length; sptr_router_link_advertisement->ls_header.length = host_to_net_short (sptr_router_link_advertisement->ls_header.length); sptr_router_link_advertisement->number_of_links = host_to_net_short (sptr_router_link_advertisement->number_of_links); /* seq # calc and cheksum calc moved down */ sptr_advertisement = (UNION_OSPF_LINK_STATE_ADVERTISEMENT *) table_malloc (1, sizeof (ULONG)); if (sptr_advertisement == NULL) { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) sptr_router_link_advertisement, "UNION_OSPF_LINK_STATE_ADVERTISEMENT"); return; } else { memset (sptr_advertisement, 0x0, sizeof (ULONG)); } sptr_advertisement->sptr_router = sptr_router_link_advertisement; /* SPR#76812 -- Begin */ sptr_database_entry = ospf_find_LSA ( sptr_area, ospf.router_id, ospf.router_id, OSPF_LS_ROUTER); /* SPR#76812 -- End */ OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF,"OSPF ORIGNATE ROUTERLINK ADVERTISEMENTS for interface with address: %lx\r\n", sptr_area->sptr_interfaces->address); ospf_install_and_flood_originated_advertisement (sptr_advertisement, sptr_database_entry, length, sptr_area); return;}/**************************************************************************************************************************************/static enum BOOLEAN ospf_check_if_area_is_a_transit_area (OSPF_AREA_ENTRY *sptr_area){ OSPF_INTERFACE_NODE *sptr_virtual_interface_node; OSPF_INTERFACE *sptr_virtual_interface; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_check_if_area_is_a_transit_area\r\n"); if ((sptr_area->flags._bit.transit == TRUE) && (sptr_area->flags._bit.virtual_up == TRUE)) { return (TRUE); } for (sptr_virtual_interface_node = ospf.sptr_configured_virtual_links; sptr_virtual_interface_node != NULL; sptr_virtual_interface_node = sptr_virtual_interface_node->sptr_forward_link) { sptr_virtual_interface = sptr_virtual_interface_node->sptr_interface; if (sptr_virtual_interface == NULL) { continue; } if ( (sptr_virtual_interface->sptr_transit_area->area_id == sptr_area->area_id) ) { return (TRUE); } } return (FALSE);}/**************************************************************************************************************************************/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){ ULONG link_data; OSPF_ROUTER_LINK_PIECE *sptr_link; OSPF_INTERFACE *sptr_interface = NULL; OSPF_INTERFACE *sptr_next_interface = NULL; OSPF_NEIGHBOR *sptr_neighbor = NULL; OSPF_NEIGHBOR *sptr_next_neighbor = NULL; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_build_a_router_link_advertisement\r\n"); sptr_link = &(sptr_router_link_advertisement->link); 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) { /* section 12.4.1, second bullet item (page 119) */ if (sptr_interface->state == OSPF_INTERFACE_IS_DOWN)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -