📄 ospf_link_state_database.c
字号:
return (sptr_new_instance);}/*****************************************************************************************************//* section 13.2 (p. 137) */enum TEST ospf_check_if_previous_instance_exists (OSPF_LS_DATABASE_ENTRY *sptr_old_instance){ OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_check_if_previous_instance_exists\r\n"); if ((sptr_old_instance == NULL) || (sptr_old_instance->advertisement.sptr_router == NULL)) /* no previous instance, so return PASS to indicate that the routing table must be recalculated */ { return (FAIL); } return (PASS);}/*****************************************************************************************************//* section 13.2 (p. 137) */enum TEST ospf_check_if_new_advertisement_is_different_from_its_previous_instance (UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement, OSPF_LS_DATABASE_ENTRY *sptr_old_instance){ enum TEST difference_found; USHORT age; USHORT old_age; OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_check_if_new_advertisement_is_different_from_its_previous_instance\r\n"); if ((sptr_old_instance == NULL) || (sptr_old_instance->advertisement.sptr_router == NULL)) /* no previous instance, so return PASS to indicate that the routing table must be recalculated */ { return (PASS); } else { age = sptr_advertisement->sptr_router->ls_header.age; age = net_to_host_short (age); old_age = sptr_old_instance->advertisement.sptr_router->ls_header.age; old_age = net_to_host_short (old_age); /* first bullet item */ if (sptr_advertisement->sptr_router->ls_header.options._byte != sptr_old_instance->advertisement.sptr_router->ls_header.options._byte) { return (PASS); } /* second bullet item */ else if (((age >= OSPF_MAXIMUM_AGE) && (old_age < OSPF_MAXIMUM_AGE)) || ((age < OSPF_MAXIMUM_AGE) && (old_age >= OSPF_MAXIMUM_AGE))) { return (PASS); } /* third bullet item */ else if (sptr_advertisement->sptr_router->ls_header.length != sptr_old_instance->advertisement.sptr_router->ls_header.length) { return (PASS); } else { /* fourth bullet item */ difference_found = ospf_check_body_of_advertisements_for_differences (sptr_advertisement, sptr_old_instance); if (difference_found == PASS) { return (PASS); } else { return (FAIL); } } }}/*********************************************************************************//* section 13.2, fourth bullet item (p. 137) */static enum TEST ospf_check_body_of_advertisements_for_differences (UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement, OSPF_LS_DATABASE_ENTRY *sptr_old_instance){ USHORT length; USHORT number_of_links; USHORT old_number_of_links; OSPF_ROUTER_LINK_PIECE *sptr_router_link; OSPF_ROUTER_LINK_PIECE *sptr_old_router_link; OSPF_NETWORK_LINK_PIECE *sptr_network_link; OSPF_NETWORK_LINK_PIECE *sptr_old_network_link; USHORT number_of_network_links; USHORT number_of_old_network_links; enum BOOLEAN found_matching_link;#if defined (__OPAQUE_LSA__) USHORT data_size = 0x0000; USHORT old_data_size = 0x0000;#endif /* __OPAQUE_LSA__ */ OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_check_body_of_advertisements_for_differences\r\n"); length = sptr_advertisement->sptr_router->ls_header.length; length = net_to_host_short (length); switch (sptr_advertisement->sptr_router->ls_header.type) { case OSPF_LS_ROUTER: { number_of_links = sptr_advertisement->sptr_router->number_of_links; number_of_links = net_to_host_short (number_of_links); old_number_of_links = sptr_old_instance->advertisement.sptr_router->number_of_links; old_number_of_links = net_to_host_short (old_number_of_links); if ((sptr_advertisement->sptr_router->bit_options._ushort != sptr_old_instance->advertisement.sptr_router->bit_options._ushort) || (number_of_links != old_number_of_links)) { return (PASS); } else { for (sptr_router_link = &sptr_advertisement->sptr_router->link; number_of_links != 0x0000; --number_of_links, sptr_router_link = (OSPF_ROUTER_LINK_PIECE *) ((ULONG) sptr_router_link + OSPF_ROUTER_LINK_PIECE_SIZE + (sptr_router_link->number_of_metrics * OSPF_ROUTER_LINK_METRIC_PIECE_SIZE))) { found_matching_link = FALSE; for (sptr_old_router_link = &sptr_old_instance->advertisement.sptr_router->link; old_number_of_links != 0x0000; --old_number_of_links, sptr_old_router_link = (OSPF_ROUTER_LINK_PIECE *) ((ULONG) sptr_old_router_link + OSPF_ROUTER_LINK_PIECE_SIZE + (sptr_old_router_link->number_of_metrics * OSPF_ROUTER_LINK_METRIC_PIECE_SIZE))) { if (memcmp ((const void *) sptr_router_link, (const void *) sptr_old_router_link, (size_t) (OSPF_ROUTER_LINK_PIECE_SIZE + (sptr_old_router_link->number_of_metrics * OSPF_ROUTER_LINK_METRIC_PIECE_SIZE))) == (int) NULL) { found_matching_link = TRUE; break; } } if (found_matching_link == FALSE) { return (PASS); } } } break; } case OSPF_LS_NETWORK: { number_of_network_links = sptr_advertisement->sptr_network->ls_header.length; number_of_network_links = net_to_host_short (number_of_network_links); number_of_network_links = (USHORT) ((number_of_network_links - OSPF_NETWORK_LINK_ADVERTISEMENT_HEADER_SIZE) / OSPF_NETWORK_LINK_PIECE_SIZE); number_of_old_network_links = sptr_old_instance->advertisement.sptr_network->ls_header.length; number_of_old_network_links = net_to_host_short (number_of_old_network_links); number_of_old_network_links = (USHORT) ((number_of_old_network_links - OSPF_NETWORK_LINK_ADVERTISEMENT_HEADER_SIZE) / OSPF_NETWORK_LINK_PIECE_SIZE); if ((sptr_advertisement->sptr_network->network_mask != sptr_old_instance->advertisement.sptr_network->network_mask) || (number_of_network_links != number_of_old_network_links)) { return (PASS); } else { for (sptr_network_link = &sptr_advertisement->sptr_network->attached_router; number_of_network_links != 0x0000; --number_of_network_links, sptr_network_link = (OSPF_NETWORK_LINK_PIECE *) ((ULONG) sptr_network_link + OSPF_NETWORK_LINK_PIECE_SIZE)) { found_matching_link = FALSE; for (sptr_old_network_link = &sptr_old_instance->advertisement.sptr_network->attached_router; number_of_old_network_links != 0x0000; --number_of_old_network_links, sptr_old_network_link = (OSPF_NETWORK_LINK_PIECE *) ((ULONG) sptr_old_network_link + OSPF_NETWORK_LINK_PIECE_SIZE)) { if (memcmp ((const void *) sptr_network_link, (const void *) sptr_old_network_link, (size_t) (OSPF_NETWORK_LINK_PIECE_SIZE)) == (int) NULL) { found_matching_link = TRUE; break; } } if (found_matching_link == FALSE) { return (PASS); } } } break; } case OSPF_LS_SUMMARY_NETWORK: case OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER: { if ((sptr_advertisement->sptr_summary->network_mask != sptr_old_instance->advertisement.sptr_summary->network_mask) || (sptr_advertisement->sptr_summary->tos0_metric != sptr_old_instance->advertisement.sptr_summary->tos0_metric)) { return (PASS); } break; } case OSPF_LS_AS_EXTERNAL: { if (sptr_advertisement->sptr_external->network_mask != sptr_old_instance->advertisement.sptr_external->network_mask) { return (PASS); } else if ((sptr_old_instance->advertisement.sptr_external->tos0_metric != sptr_advertisement->sptr_external->tos0_metric) || (sptr_old_instance->advertisement.sptr_external->tos0_forwarding_address != sptr_advertisement->sptr_external->tos0_forwarding_address) || (sptr_old_instance->advertisement.sptr_external->tos0_external_route_tag != sptr_advertisement->sptr_external->tos0_external_route_tag)) { return (PASS); } break; }#if defined (__NSSA__) case OSPF_LS_TYPE_7 : { if (sptr_advertisement->sptr_type_7->network_mask != sptr_old_instance->advertisement.sptr_type_7->network_mask) { return (PASS); } else if ((sptr_old_instance->advertisement.sptr_type_7->tos0_metric != sptr_advertisement->sptr_type_7->tos0_metric) || (sptr_old_instance->advertisement.sptr_type_7->tos0_forwarding_address != sptr_advertisement->sptr_type_7->tos0_forwarding_address) || (sptr_old_instance->advertisement.sptr_type_7->tos0_external_route_tag != sptr_advertisement->sptr_type_7->tos0_external_route_tag)) { return (PASS); } break; }#endif /*__NSSA__*/ /*opaque lsa check for differences in the lsa jkw*/#if defined (__OPAQUE_LSA__) case OSPF_LS_TYPE_9: { old_data_size = sptr_old_instance->advertisement.sptr_type_9->ls_header.length; old_data_size = net_to_host_short(old_data_size); old_data_size = (USHORT)(old_data_size - OSPF_LS_HEADER_SIZE); data_size = sptr_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_old_instance->advertisement.sptr_type_9->ls_header.id.lsid != sptr_advertisement->sptr_type_9->ls_header.id.lsid) { return (PASS); } else if ((sptr_advertisement->sptr_type_9->data != NULL) && (data_size > 0) && (sptr_old_instance->advertisement.sptr_type_9->data == NULL) && (old_data_size == 0)) { return (PASS); } else if ((sptr_advertisement->sptr_type_9->data == NULL) && (data_size == 0) && (sptr_old_instance->advertisement.sptr_type_9->data != NULL) && (old_data_size > 0)) { return (PASS); } else if ((sptr_advertisement->sptr_type_9->data != NULL) && (data_size > 0) && (sptr_old_instance->advertisement.sptr_type_9->data != NULL) && (old_data_size > 0) && (old_data_size == data_size)) { if ((memcmp ((const void *) sptr_old_instance->advertisement.sptr_type_9->data, (const void *) sptr_advertisement->sptr_type_9->data, data_size ) != (int) NULL)) { return (PASS); } } break; } case OSPF_LS_TYPE_10: { old_data_size = sptr_old_instance->advertisement.sptr_type_10->ls_header.length; old_data_size = net_to_host_short(old_data_size); old_data_size = (USHORT)(old_data_size - OSPF_LS_HEADER_SIZE); data_size = sptr_advertisement->sptr_type_10->ls_header.length; data_size = net_to_host_short(data_size); data_size = (USHORT)(data_size - OSPF_LS_HEADER_SIZE); if (sptr_old_instance->advertisement.sptr_type_10->ls_header.id.lsid != sptr_advertisement->sptr_type_10->ls_header.id.lsid) { return (PASS); } else if ((sptr_advertisement->sptr_type_10->data != NULL) && (data_size > 0) && (sptr_old_instance->advertisement.sptr_type_10->data == NULL) && (old_data_size == 0)) { return (PASS); } else if ((sptr_advertisement->sptr_type_10->data == NULL) &&
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -