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

📄 ospf_link_state_advertisements.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
                {                continue;                }            /* section 12.4.1, third bullet item (page 119) */            if (sptr_interface->state == OSPF_INTERFACE_LOOPBACK)                {                if ((sptr_interface->type != OSPF_POINT_TO_POINT) || (sptr_interface->address != 0x00000000L))                    {                    sptr_link = ospf_add_a_link_description_to_the_router_advertisement (sptr_link, sptr_interface->address, OSPF_HOST_NET_MASK,                        OSPF_ROUTER_LINK_TYPE_STUB_NETWORK, 0x00, 0x0000, &(sptr_router_link_advertisement->number_of_links), sptr_length);                    }                }            else                {                /* section 12.4.1, fourth bullet item (page 119) */                switch (sptr_interface->type)                    {                    case OSPF_POINT_TO_POINT:                                                           /* section 12.4.1.1 (page 119-120) */                        {                        if (sptr_interface->sptr_neighbor != NULL)                            {                            if (sptr_interface->sptr_neighbor->state == OSPF_NEIGHBOR_FULL)                                {                                /* section 12.4.1.1, first bullet item (page 119-120) */                                if (sptr_interface->address != 0x00000000L)                                    {                                    link_data = sptr_interface->address;                                    }                                else                                    {                                    /* this field is supposed to be set to the MIB-II ifIndex value for unnumbered links RFC 1583 Appendix A4.2 */#if defined (__UNNUMBERED_LINK__)                                    link_data = sptr_interface->port_number;#else /* __UNNUMBERED_LINK__ */                                    link_data = sptr_interface->address;#endif /* __UNNUMBERED_LINK__ */                                    }                                sptr_link = ospf_add_a_link_description_to_the_router_advertisement (sptr_link, sptr_interface->sptr_neighbor->id, link_data,                                    OSPF_ROUTER_LINK_TYPE_PPP, 0x00, sptr_interface->cost, &(sptr_router_link_advertisement->number_of_links),                                    sptr_length);                                }                            }                            /* section 12.4.1.1, second bullet item (page 120) */#if !defined (__UNNUMBERED_LINK__)#if defined (__RFC_2328__)                        switch (ospf.ospf_point_to_point_router_lsa_option)                            {                            case 1:                                if (sptr_interface->sptr_neighbor != NULL)                                    {                                    if (sptr_interface->sptr_neighbor->address != 0x00000000L)                  /* Option 1 */                                        {                                        sptr_link = ospf_add_a_link_description_to_the_router_advertisement (sptr_link, sptr_interface->sptr_neighbor->address,                                            OSPF_HOST_NET_MASK, OSPF_ROUTER_LINK_TYPE_STUB_NETWORK, 0x00, sptr_interface->cost,                                            &(sptr_router_link_advertisement->number_of_links), sptr_length);                                        }                                    }                                break;                            case 2:                                /* RFC 2178 G.6 */                                sptr_link = ospf_add_a_link_description_to_the_router_advertisement (sptr_link,                                    (sptr_interface->address & sptr_interface->netmask), sptr_interface->netmask, OSPF_ROUTER_LINK_TYPE_STUB_NETWORK, 0x00,                                    sptr_interface->cost, &(sptr_router_link_advertisement->number_of_links), sptr_length);                                    break;                            default:                                break;                            }#else /* __RFC_2328__ */                        if (sptr_interface->sptr_neighbor != NULL)                            {                            if (sptr_interface->sptr_neighbor->address != 0x00000000L)                  /* Option 1 */                                {                                sptr_link = ospf_add_a_link_description_to_the_router_advertisement (sptr_link, sptr_interface->sptr_neighbor->address,                                    OSPF_HOST_NET_MASK, OSPF_ROUTER_LINK_TYPE_STUB_NETWORK, 0x00, sptr_interface->cost,                                    &(sptr_router_link_advertisement->number_of_links), sptr_length);                                }                            }#endif /* __RFC_2328__ */#endif /* __UNNUMBERED_LINK__ */                        break;                        }                    case OSPF_BROADCAST:                                                                /* section 12.4.1.2 (page 120-121) */                    case OSPF_NBMA:                        {                        if ((sptr_interface->state != OSPF_INTERFACE_WAITING) && (sptr_interface->designated_router.address != 0x00000000L) &&                            (((sptr_interface->state != OSPF_INTERFACE_DESIGNATED_ROUTER) && (sptr_interface->designated_router.state == OSPF_NEIGHBOR_FULL)) ||                            ((sptr_interface->state == OSPF_INTERFACE_DESIGNATED_ROUTER) && (sptr_interface->number_of_neighbors_in_full_state > 0x0000))))                            {                            /* section 12.4.1.2, second bullet item, except for last sentence (page 120) */                            sptr_link = ospf_add_a_link_description_to_the_router_advertisement (sptr_link, sptr_interface->designated_router.address,                                sptr_interface->address, OSPF_ROUTER_LINK_TYPE_TRANSIT_NETWORK, 0x00, sptr_interface->cost,                                &(sptr_router_link_advertisement->number_of_links), sptr_length);                            }                        else                            {                            /* section 12.4.1.2, first bullet item and last sentence of second bullet item (page 120-121) */                            sptr_link = ospf_add_a_link_description_to_the_router_advertisement (sptr_link,                                (sptr_interface->address & sptr_interface->netmask), sptr_interface->netmask, OSPF_ROUTER_LINK_TYPE_STUB_NETWORK, 0x00,                                sptr_interface->cost, &(sptr_router_link_advertisement->number_of_links), sptr_length);                            }                        break;                        }                    case OSPF_VIRTUAL_LINK:                                                     /* section 12.4.1.3 (page 121) */                        {                        if (sptr_interface->sptr_neighbor != NULL)                            {                            if (sptr_interface->sptr_neighbor->state == OSPF_NEIGHBOR_FULL)                                {                                sptr_link = ospf_add_a_link_description_to_the_router_advertisement (sptr_link, sptr_interface->sptr_neighbor->id,                                sptr_interface->address, OSPF_ROUTER_LINK_TYPE_VIRTUAL, 0x00,                                sptr_interface->cost, &(sptr_router_link_advertisement->number_of_links), sptr_length);                                }                            }                        break;                        }                    case OSPF_POINT_TO_MULTIPOINT:                                              /* section 12.4.1.4 (page 121) */                        {                        sptr_link = ospf_add_a_link_description_to_the_router_advertisement (sptr_link,                            sptr_interface->address, OSPF_HOST_NET_MASK, OSPF_ROUTER_LINK_TYPE_STUB_NETWORK, 0x00, 0x0000,                            &(sptr_router_link_advertisement->number_of_links), sptr_length);                        for (sptr_neighbor = sptr_interface->sptr_neighbor; sptr_neighbor != NULL;                            sptr_neighbor = sptr_next_neighbor)                            {                            sptr_next_neighbor = sptr_neighbor->sptr_forward_link;                            if (sptr_neighbor->state == OSPF_NEIGHBOR_FULL)                                {                                sptr_link = ospf_add_a_link_description_to_the_router_advertisement (sptr_link, sptr_neighbor->id,                                    sptr_interface->address, OSPF_ROUTER_LINK_TYPE_PPP, 0x00, sptr_interface->cost,                                    &(sptr_router_link_advertisement->number_of_links), sptr_length);                                }                            }                        break;                        }                    default:                        {                        break;                        }                    }                }            }        }        return;}/**************************************************************************************************************************************/static OSPF_ROUTER_LINK_PIECE *ospf_add_a_link_description_to_the_router_advertisement (OSPF_ROUTER_LINK_PIECE *sptr_link,    ULONG link_id,ULONG link_data,BYTE_ENUM (OSPF_ROUTER_LINK_TYPE) type,BYTE number_of_metrics,USHORT tos0_metric,    USHORT *sptr_number_of_links,USHORT *sptr_length){    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_add_a_link_description_to_the_router_advertisement\r\n");    sptr_link->link_id = link_id;    sptr_link->link_id = host_to_net_long (sptr_link->link_id);    sptr_link->link_data = link_data;    sptr_link->link_data = host_to_net_long (sptr_link->link_data);    sptr_link->type = type;    sptr_link->number_of_metrics = number_of_metrics;    sptr_link->tos0_metric = tos0_metric;    sptr_link->tos0_metric = host_to_net_short (sptr_link->tos0_metric);    ++(*sptr_number_of_links);    *sptr_length += OSPF_ROUTER_LINK_PIECE_SIZE;    sptr_link = (OSPF_ROUTER_LINK_PIECE *) ((ULONG) sptr_link + OSPF_ROUTER_LINK_PIECE_SIZE +   ((sptr_link->number_of_metrics) * OSPF_ROUTER_LINK_METRIC_PIECE_SIZE));    return (sptr_link);}/*******************************************************************************************************//* section 12.4.2 (page 124) */void ospf_originate_network_links_advertisement (OSPF_INTERFACE *sptr_interface){    OSPF_NETWORK_LINK_ADVERTISEMENT_HEADER *sptr_network_link_advertisement;    UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement;    OSPF_NETWORK_LINK_PIECE *sptr_link;    OSPF_NEIGHBOR *sptr_neighbor = NULL;    OSPF_NEIGHBOR *sptr_next_neighbor = NULL;    USHORT length;    USHORT allocated_size_for_lsa;    OSPF_LS_DATABASE_ENTRY *sptr_database_entry;    bool is_neighbor_full = FALSE;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF, "OSPF: Entering ospf_originate_network_links_advertisement\r\n");    /* Originate only if the Designated Router is fully adjacent to at least one other router on the network */    if (sptr_interface != NULL)        {        for (sptr_neighbor = sptr_interface->sptr_neighbor; sptr_neighbor != NULL;  sptr_neighbor = sptr_next_neighbor)            {            sptr_next_neighbor = sptr_neighbor->sptr_forward_link;            if (sptr_neighbor->state == OSPF_NEIGHBOR_FULL)                {                is_neighbor_full = TRUE;                break;                }            }        }    if (is_neighbor_full == FALSE)        {        return;        }    sptr_network_link_advertisement = (OSPF_NETWORK_LINK_ADVERTISEMENT_HEADER *) create_buffer_for_lsa (sptr_interface, &allocated_size_for_lsa);    if (sptr_network_link_advertisement == NULL)        {        ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_NETWORK_LINK_ADVERTISEMENT_HEADER");        return;        }    sptr_network_link_advertisement->ls_header.age = 0x0000;    if ((sptr_interface->sptr_area->area_id == 0x00000000L || sptr_interface->sptr_area->flags._bit.stub != TRUE) &&        (sptr_interface->sptr_area->area_id == 0x00000000L || sptr_interface->sptr_area->flags._bit.nssa != TRUE))        {        sptr_network_link_advertisement->ls_header.options._byte = OSPF_ENABLE_EXTERNAL_ROUTING;        }    else        {        sptr_network_link_advertisement->ls_header.options._byte = OSPF_NOT_ENABLE_EXTERNAL_ROUTING;        if (sptr_interface->sptr_area->flags._bit.nssa == TRUE)            {            sptr_network_link_advertisement->ls_header.options._bit.nssa = TRUE;            }        }    sptr_network_link_advertisement->ls_header.type = OSPF_LS_NETWORK;    sptr_network_link_advertisement->ls_header.id = sptr_interface->designated_router.address;    sptr_network_link_advertisement->ls_header.id = host_to_net_long (sptr_network_link_advertisement->ls_header.id);    sptr_network_link_advertisement->ls_header.advertising_router = ospf.router_id;    sptr_network_link_advertisement->ls_header.advertising_router =        host_to_net_long (sptr_network_link_advertisement->ls_header.advertising_router);    sptr_network_link_advertisement->network_mask = sptr_interface->netmask;    sptr_network_link_advertisement->network_mask = host_to_net_long (sptr_network_link_advertisement->network_mask);    sptr_link = &(sptr_network_link_advertisement->attached_router);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -