⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ospf_link_state_database.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -