📄 ospf_database_summary.c
字号:
found_external_lsa = FALSE; break; } } if (found_external_lsa == FALSE) { break; } } /*opaque lsa add each advertisement in the database to the appropriate list jkw*/#if defined (__OPAQUE_LSA__) 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_interface->sptr_area->opaque_ls_database_hash_table[ls_type][index]); index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(sptr_interface->sptr_area->opaque_ls_database_hash_table[ls_type][index])) { /* for each hash list */ 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; *ptr_to_sptr_database_summary = ospf_add_advertisement_to_appropriate_list (sptr_interface, sptr_neighbor, sptr_database_entry, *ptr_to_sptr_database_summary, &sptr_previous_database_summary, &sptr_ls_header); if (*ptr_to_sptr_database_summary == NULL) { found_opaque_lsa = FALSE; break; } } if (found_opaque_lsa == FALSE) { break; } } if (found_opaque_lsa == FALSE) { break; } } /* Check for type 11 lsdb */ for (index = 0x00000000L, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index]); index < OSPF_HASH_TABLE_SIZE; ++index, sptr_ls_database_head = &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][index])) { /* for each hash list */ 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; *ptr_to_sptr_database_summary = ospf_add_advertisement_to_appropriate_list (sptr_interface, sptr_neighbor, sptr_database_entry, *ptr_to_sptr_database_summary, &sptr_previous_database_summary, &sptr_ls_header); if (*ptr_to_sptr_database_summary == NULL) { found_type_11_lsa = FALSE; break; } } if (found_type_11_lsa == FALSE) { break; } } if ((found_lsa == FALSE) && (found_external_lsa == FALSE) && (found_opaque_lsa == FALSE) && (found_type_11_lsa == FALSE)) { return NULL; } else { return (sptr_previous_database_summary); }#else /* __OPAQUE_LSA__ */ if ((found_lsa == FALSE) && (found_external_lsa == FALSE)) { return NULL; } else { return (sptr_previous_database_summary); }#endif /* __OPAQUE_LSA__ */}/**************************************************************************************** ospf_get_maximum_ls_type - gets the maximum link state advertisement type** This routine finds the maximum link state advertisement type** <sptr_interface> OSPF interface** RETURNS: OSPF_LS_ROUTER or OSPF_LS_NETWORK or OSPF_LS_SUMMARY_NETWORK or* OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER or OSPF_LS_AS_EXTERNAL or* OSPF_LS_MULTICAST or OSPF_LS_TYPE_7 or OSPF_LS_TYPE_9 or* OSPF_LS_TYPE_10 or OSPF_LS_TYPE_11 or OSPF_LS_MAX or* or OSPF_LS_ROUTER_ABR or OSPF_LS_ROUTER_ASBR.** ERRNO: N/A** NOMANUAL*/static enum OSPF_LS_TYPE ospf_get_maximum_ls_type (OSPF_INTERFACE *sptr_interface){ OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_get_maximum_ls_type\r\n");#if !defined (__NSSA__) if ((sptr_interface->sptr_area->flags._bit.stub == TRUE) || (sptr_interface->type == OSPF_VIRTUAL_LINK))#else /* */__NSSA__#if defined (__NSSA_FIXES__) if ((sptr_interface->sptr_area->flags._bit.stub == TRUE) || (sptr_interface->type == OSPF_VIRTUAL_LINK))#else /* __NSSA_FIXES__ */ if ((sptr_interface->sptr_area->flags._bit.stub == TRUE) || (sptr_interface->type == OSPF_VIRTUAL_LINK) || (sptr_interface->sptr_area->flags._bit.nssa == TRUE))#endif /* __NSSA_FIXES__ */#endif /*__NSSA__*/ { return (OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER); /* do not flood autonomous system external advertisements out this interface */ } else { /***********SPR 75496**************/#if defined (__NSSA__)#if defined (__NSSA_FIXES__) if (sptr_interface->sptr_area->flags._bit.nssa == TRUE) { return (OSPF_LS_TYPE_7); }#endif/*__NSSA_FIXES__*/#endif /* __NSSA__ */ return (OSPF_LS_AS_EXTERNAL); /* ok to flood autonomous system external advertisements out this interface */ }}/**************************************************************************************** ospf_add_advertisement_to_appropriate_list - add advertisement to appropriate list** This routine adds the database entry to the neighbor retransmit list and the* neighbor to the database retransmit list.** <sptr_interface> OSPF interface** <sptr_neighbor> OSPF neighbor associated with the interface** <sptr_database_entry> Database entry to be added** <sptr_database_summary> Database summary to be added** <ptr_to_sptr_previous_database_summary> Pointer to previous database summary** <ptr_to_sptr_ls_header> Pointer to link state header** RETURNS: OSPF_LS_DATABASE_SUMMARY * or NULL** ERRNO: N/A** NOMANUAL*/static OSPF_LS_DATABASE_SUMMARY *ospf_add_advertisement_to_appropriate_list (OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor, OSPF_LS_DATABASE_ENTRY *sptr_database_entry,OSPF_LS_DATABASE_SUMMARY *sptr_database_summary, OSPF_LS_DATABASE_SUMMARY **ptr_to_sptr_previous_database_summary,OSPF_LS_HEADER **ptr_to_sptr_ls_header){ USHORT advertisement_age =0; OSPF_LS_DATABASE_ENTRY *sptr_database_entry_of_neighbor =NULL; OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_add_advertisement_to_appropriate_list\r\n"); advertisement_age = sptr_database_entry->advertisement.sptr_router->ls_header.age; advertisement_age = net_to_host_short (advertisement_age); if (advertisement_age >= OSPF_MAXIMUM_AGE) /* section 10.3, State: ExStart (p. 83) */ { sptr_database_entry_of_neighbor = (OSPF_LS_DATABASE_ENTRY *) table_malloc (1, sizeof (OSPF_LS_DATABASE_ENTRY)); if (sptr_database_entry_of_neighbor == NULL) { ospf_print_memory_error_message_and_free_buffer_if_necessary ((void *) NULL, "OSPF_LS_DATABASE_ENTRY"); return (NULL); } memset (sptr_database_entry_of_neighbor, 0x00, sizeof (OSPF_LS_DATABASE_ENTRY)); sptr_database_entry_of_neighbor->advertisement.sptr_router = sptr_database_entry->advertisement.sptr_router; ospf_add_database_entry_to_neighbor_retransmit_list (sptr_neighbor, sptr_database_entry_of_neighbor); ospf_add_neighbor_to_database_retransmit_list (sptr_database_entry, sptr_neighbor); } else { sptr_database_summary = ospf_add_advertisement_to_neighbor_database_summary_list (sptr_database_summary, ptr_to_sptr_previous_database_summary, sptr_interface, sptr_neighbor, sptr_database_entry, advertisement_age, ptr_to_sptr_ls_header); } return (sptr_database_summary);}/**************************************************************************************** ospf_add_advertisement_to_neighbor_database_summary_list - add advertisement to appropriate list** This routine adds the link state advertisement to the neighbor database summary list.** <sptr_database_summary> Database summary to be added** <ptr_to_sptr_previous_database_summary> Pointer to previous database summary** <sptr_interface> OSPF interface** <sptr_neighbor> OSPF neighbor associated with the interface** <sptr_database_entry> Database entry to be added** <advertisement_age> Link state advertisement age** <ptr_to_sptr_ls_header> Pointer to link state header** RETURNS: OSPF_LS_DATABASE_SUMMARY * or NULL** ERRNO: N/A** NOMANUAL*/static OSPF_LS_DATABASE_SUMMARY *ospf_add_advertisement_to_neighbor_database_summary_list (OSPF_LS_DATABASE_SUMMARY *sptr_database_summary, OSPF_LS_DATABASE_SUMMARY **ptr_to_sptr_previous_database_summary,OSPF_INTERFACE *sptr_interface,OSPF_NEIGHBOR *sptr_neighbor, OSPF_LS_DATABASE_ENTRY *sptr_database_entry,USHORT advertisement_age,OSPF_LS_HEADER **ptr_to_sptr_ls_header){ ULONG interface_mtu =0; ULONG authentication_size =0; OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_add_advertisement_to_neighbor_database_summary_list\r\n"); interface_mtu = ospf_get_interface_mtu (sptr_interface); authentication_size = ospf_get_authentication_size (sptr_interface); /* SPR 85906 -- Begin */ /* Test the current packet size with the MTU size. If we are larger than MTU, set more-bit and */ /* allocate a new packet */ if ((sptr_database_summary->size_of_packet + OSPF_MAXIMUM_IP_HEADER_SIZE + OSPF_DB_PIECE_SIZE + authentication_size) >= interface_mtu ) /* packet is full, so allocate a new one and continue */ /* SPR 85906 -- End */ { sptr_database_summary->sptr_ospf_header->rest_of_packet.database.flags._byte = 0x0000; sptr_database_summary->sptr_ospf_header->rest_of_packet.database.flags._bit.more = TRUE; *ptr_to_sptr_previous_database_summary = sptr_database_summary; sptr_database_summary = ospf_allocate_ls_database_summary (sptr_interface); if (sptr_database_summary == NULL) { ospf_free_neighbor_database_summary_list (sptr_neighbor); ospf_remove_all_database_pointers_from_neighbor_retransmit_list (sptr_neighbor); return (NULL); } else { sptr_database_summary->size_of_packet = OSPF_PACKET_SIZE + OSPF_DATABASE_HEADER_SIZE; *ptr_to_sptr_ls_header = &(sptr_database_summary->sptr_ospf_header->rest_of_packet.database.link_state_advertisement_header); (*ptr_to_sptr_previous_database_summary)->sptr_forward_link = sptr_database_summary; } } memcpy ((void *) *ptr_to_sptr_ls_header, (const void *) &sptr_database_entry->advertisement.sptr_router->ls_header, (size_t) sizeof (OSPF_LS_HEADER)); (*ptr_to_sptr_ls_header)->age = advertisement_age; (*ptr_to_sptr_ls_header)->age = host_to_net_short ((*ptr_to_sptr_ls_header)->age); sptr_database_summary->size_of_packet += OSPF_DB_PIECE_SIZE; ++sptr_neighbor->database_summary_queue_count; ++sptr_database_summary->number_of_database_entries; *ptr_to_sptr_ls_header = (OSPF_LS_HEADER *) ((ULONG) (*ptr_to_sptr_ls_header) + OSPF_DB_PIECE_SIZE); return (sptr_database_summary);}/**************************************************************************************** ospf_free_ls_database_summary - frees memory from the database summary** This routine frees memory from the database summary.** <sptr_database_summary> Database summary structure** RETURNS: N/A** ERRNO: N/A** NOMANUAL*/void ospf_free_ls_database_summary (OSPF_LS_DATABASE_SUMMARY *sptr_database_summary){ OSPF_PRINTF_PROLOGUE (OSPF_PROLOGUE_PRINTF, "OSPF: Entering ospf_free_ls_database_summary\r\n"); if ( sptr_database_summary == NULL ) return; if (sptr_database_summary->sptr_ospf_header != NULL) { table_free ((void *) sptr_database_summary->sptr_ospf_header); sptr_database_summary->sptr_ospf_header = NULL; } table_free ((void *) sptr_database_summary); sptr_database_summary = NULL; return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -