📄 ospf_link_state_advertisements.c
字号:
{ 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 + -