📄 ospf_timer.c
字号:
test_return_type = ospf_check_if_advertisements_link_state_id_is_equal_to_one_of_the_routers_own_IP_interface_addresses ( sptr_database_entry->advertisement.sptr_router); advertising_router = sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router; advertising_router = net_to_host_long (advertising_router); if ((age == OSPF_MAXIMUM_AGE) && (ospf.ospf_maxaged_lsas_removed_this_tick < ospf.ospf_maxaged_lsas_removed_per_tick )) { ospf.ospf_maxaged_lsas_removed_this_tick++; /* SPR 85432 -- Begin */ if ((advertising_router == ospf.router_id) || ((sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_NETWORK) && (test_return_type == PASS)) ) { ospf_flood_advertisement_out_some_subset_of_the_routers_interfaces ( sptr_database_entry->advertisement.sptr_router, sptr_area, NULL, NULL, TRUE); } else if ((sptr_database_entry->ls_database_freeme == FALSE) && (sptr_database_entry->sptr_ls_database_retrans == NULL) && (ospf.number_of_neighbors_in_exchange_state == ospf.number_of_neighbors_in_full_state)) { sptr_database_entry->ls_database_freeme = TRUE; ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (sptr_database_entry); ospf_free_database_entry (sptr_database_entry); sptr_database_entry = NULL; } /* SPR#87019 */ if (sptr_database_entry != NULL) { /* * Max age entry has been checked make it non maximum * so that the cleanup interval can take effect */ ++age; sptr_database_entry->advertisement.sptr_router->ls_header.age = age; sptr_database_entry->advertisement.sptr_router->ls_header.age = host_to_net_short (sptr_database_entry->advertisement.sptr_router->ls_header.age); } } /* This is a saftey net in case we never receive an ack from a * neighbor concerning the deletion of the route. It is unlikely * that this scenario will happen however, it is always good to make * sure we do not carry a deleted route forever. The cleanup interval * is set to fairly high value to avoid deletion of routes that have * not been acknowledged due to heavy traffic loads */ else if ((age >= (OSPF_MAXIMUM_AGE + OSPF_CLEANUP_INTERVAL+1)) && (sptr_database_entry->ls_database_freeme == FALSE)) { sptr_database_entry->ls_database_freeme = TRUE; ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (sptr_database_entry); (void) ospf_free_database_entry (sptr_database_entry); } /* SPR 85432 -- End */ else { /* section 12.4, item (1) - (page 114-115) */ /* Section of code from here moved up */ if (((advertising_router == ospf.router_id) || ((sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_NETWORK) && (test_return_type == PASS))) && (age == OSPF_LSRefreshTime)) /* Refresh self originated advertisements */ { ospf_originate_new_instance_of_the_link_state_advertisement (sptr_database_entry, sptr_area, FALSE); } } } } }#if defined (__OPAQUE_LSA__) first_pass_external = TRUE; for (ls_type = TYPE_9_LSA; ls_type <= TYPE_11_LSA; ++ls_type) /* for each type of advertisement */ { for (index = 0x00000000L, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[ls_type][index]); /* for each hash list */ index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_area->opaque_ls_database_hash_table[ls_type][index])) { /* 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; age = sptr_database_entry->advertisement.sptr_router->ls_header.age; age = net_to_host_short (age); if (age < OSPF_MAXIMUM_AGE) { ++age; sptr_database_entry->advertisement.sptr_router->ls_header.age = age; sptr_database_entry->advertisement.sptr_router->ls_header.age = host_to_net_short (sptr_database_entry->advertisement.sptr_router->ls_header.age);#if defined (__OSPF_MIB__) if (ls_type == TYPE_9_LSA) { ospf2Mapi_request((void *)sptr_database_entry, wrnOspfLocalLsdbUpdateReqType); } else if (ls_type == TYPE_10_LSA) { ospf2Mapi_request((void *)sptr_database_entry, wrnOspfLsdbUpdateReqType); }#endif /* __OSPF_MIB__ */ } div_result = div ((int) age, (int) OSPF_CheckAge); if (div_result.rem == (int) NULL) /* advertisement's LS age is a multiple of OSPF_CheckAge, so verify the LS checksum */ { age = sptr_database_entry->advertisement.sptr_router->ls_header.age; sptr_database_entry->advertisement.sptr_router->ls_header.age = 0x0000; test_return_type = ospf_verify_LS_checksum ((void *) sptr_database_entry->advertisement.sptr_router, sptr_database_entry->advertisement.sptr_router->ls_header.length /* in network order */, sptr_database_entry->advertisement.sptr_router->ls_header.checksum); sptr_database_entry->advertisement.sptr_router->ls_header.age = age; } age = sptr_database_entry->advertisement.sptr_router->ls_header.age; age = net_to_host_short (age); test_return_type = ospf_check_if_advertisements_link_state_id_is_equal_to_one_of_the_routers_own_IP_interface_addresses ( sptr_database_entry->advertisement.sptr_router); advertising_router = sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router; advertising_router = net_to_host_long (advertising_router); if ((age == OSPF_MAXIMUM_AGE) && (ospf.ospf_maxaged_lsas_removed_this_tick < ospf.ospf_maxaged_lsas_removed_per_tick )) { ospf.ospf_maxaged_lsas_removed_this_tick++; if ( (sptr_database_entry->ls_database_freeme == FALSE) && ( (advertising_router == ospf.router_id) || ((sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_NETWORK) && (test_return_type == PASS)) ) ) { (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_freeme = TRUE; } else if ((sptr_database_entry->sptr_ls_database_retrans == NULL) && (ospf.number_of_neighbors_in_exchange_state == ospf.number_of_neighbors_in_full_state)) { (void) ospf_free_database_entry (sptr_database_entry); } } else { /* section 12.4, item (1) - (page 114-115) */ /* Section of code from here moved up */ if (((advertising_router == ospf.router_id) || ((sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_NETWORK) && (test_return_type == PASS))) && (age == OSPF_LSRefreshTime)) /* Refresh self originated advertisements */ { ospf_originate_new_instance_of_the_link_state_advertisement (sptr_database_entry, sptr_area, FALSE); } } } } }#endif /* __OPAQUE_LSA__ */ }/***************************************************************************************************//* section 14, (page 145) */static void ospf_age_the_external_link_state_database ( OSPF_AREA_ENTRY *sptr_area, enum BOOLEAN first_pass_external ) { OSPF_LS_DATABASE_HEAD *sptr_ls_database_head; OSPF_LS_DATABASE_ENTRY *sptr_database_entry; OSPF_LS_DATABASE_ENTRY *sptr_next_database_entry = NULL; div_t div_result; USHORT age; enum TEST test_return_type; ULONG index; ULONG advertising_router; /* Check for external lsdb */ for (index = 0x00000000L, sptr_ls_database_head = &(ospf.external_database_hash_table[LS_EXTERNAL_LSA][index]); /* for each hash list */ 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; } /* 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; age = sptr_database_entry->advertisement.sptr_router->ls_header.age; age = net_to_host_short (age); if (first_pass_external == TRUE) { /* SPR 85432 -- Begin */ if (age != OSPF_MAXIMUM_AGE) /* SPR 85432 -- End */ { ++age; sptr_database_entry->advertisement.sptr_router->ls_header.age = age; sptr_database_entry->advertisement.sptr_router->ls_header.age = host_to_net_short (sptr_database_entry->advertisement.sptr_router->ls_header.age);#if defined (__OSPF_MIB__) /* tell MIB API to update this link state advertisement */ ospf2Mapi_request( (void *)sptr_database_entry, ospfExtLsdbUpdateReqType );#endif /* __OSPF_MIB__ */ } div_result = div ((int) age, (int) OSPF_CheckAge); if (div_result.rem == (int) NULL) /* advertisement's LS age is a multiple of OSPF_CheckAge, so verify the LS checksum */ { age = sptr_database_entry->advertisement.sptr_router->ls_header.age; sptr_database_entry->advertisement.sptr_router->ls_header.age = 0x0000; test_return_type = ospf_verify_LS_checksum ((void *) sptr_database_entry->advertisement.sptr_router, sptr_database_entry->advertisement.sptr_router->ls_header.length /* in network order */, sptr_database_entry->advertisement.sptr_router->ls_header.checksum); sptr_database_entry->advertisement.sptr_router->ls_header.age = age; } age = sptr_database_entry->advertisement.sptr_router->ls_header.age; age = net_to_host_short (age); test_return_type = ospf_check_if_advertisements_link_state_id_is_equal_to_one_of_the_routers_own_IP_interface_addresses ( sptr_database_entry->advertisement.sptr_router); advertising_router = sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router; advertising_router = net_to_host_long (advertising_router); if ((age == OSPF_MAXIMUM_AGE) && (ospf.ospf_maxaged_lsas_removed_this_tick < ospf.ospf_maxaged_lsas_removed_per_tick )) { ospf.ospf_maxaged_lsas_removed_this_tick++; /* SPR 85432 -- Begin */ if ((advertising_router == ospf.router_id) || ((sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_NETWORK) && (test_return_type == PASS)) ) { (void) ospf_flood_advertisement_out_some_subset_of_the_routers_interfaces (sptr_database_entry->advertisement.sptr_router, sptr_area, NULL, NULL, TRUE); /*SPR 85893 --Begin */ /* This LSA is marked for deletion, and should only be visible */ /* to reTransmission queue only */ sptr_database_entry->ls_database_pending_delete = TRUE; /*SPR 85893 --End */ } else if ((sptr_database_entry->ls_database_freeme == FALSE) && (sptr_database_entry->sptr_ls_database_retrans == NULL) && (ospf.number_of_neighbors_in_exchange_state == ospf.number_of_neighbors_in_full_state)) { sptr_database_entry->ls_database_freeme = TRUE; ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (sptr_database_entry); (void) ospf_free_database_entry (sptr_database_entry); sptr_database_entry = NULL; } /* SPR#87019 */ if (sptr_database_entry != NULL) { /* * Max age entry has been checked make it non maximum * so that the cleanup interval can take effect */ ++age; sptr_database_entry->advertisement.sptr_router->ls_header.age = age; sptr_database_entry->advertisement.sptr_router->ls_header.age = host_to_net_short (sptr_database_entry->advertisement.sptr_router->ls_header.age); } } else if ((age >= (OSPF_MAXIMUM_AGE + OSPF_CLEANUP_INTERVAL+1)) && (sptr_database_entry->ls_database_freeme == FALSE)) { sptr_database_entry->ls_database_freeme = TRUE; ospf_clean_up_retransmit_lists_affiliated_with_this_advertisement (sptr_database_entry); (void) ospf_free_database_entry (sptr_database_entry); } /* SPR 85432 -- End */ else { if (((advertising_router == ospf.router_id) || ((sptr_database_entry->advertisement.sptr_router->ls_header.type == OSPF_LS_NETWORK) && (test_return_type == PASS))) && (age == OSPF_LSRefreshTime)) /* Refresh self originated advertisements */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -