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

📄 ospf_link_state_database.c

📁 vxworks下ospf协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
						(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) &&						(data_size > 0) &&						(sptr_old_instance->advertisement.sptr_type_10->data != NULL) &&						(old_data_size > 0) &&						(old_data_size == data_size))						{                        if ((memcmp ((const void *) sptr_old_instance->advertisement.sptr_type_10->data,							(const void *) sptr_advertisement->sptr_type_10->data, data_size ) != (int) NULL))							{							return (PASS);							}						}                    break;                    }                case OSPF_LS_TYPE_11:                    {					old_data_size = sptr_old_instance->advertisement.sptr_type_11->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_11->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_11->ls_header.id.lsid != sptr_advertisement->sptr_type_11->ls_header.id.lsid)						{						return (PASS);						}					else if ((sptr_advertisement->sptr_type_11->data != NULL) &&						(data_size > 0) &&						(sptr_old_instance->advertisement.sptr_type_11->data == NULL) &&						(old_data_size == 0))						{						return (PASS);						}					else if ((sptr_advertisement->sptr_type_11->data == NULL) &&						(data_size == 0) &&						(sptr_old_instance->advertisement.sptr_type_11->data != NULL) &&						(old_data_size > 0))						{						return (PASS);						}					else if ((sptr_advertisement->sptr_type_11->data != NULL) &&						(data_size > 0) &&						(sptr_old_instance->advertisement.sptr_type_11->data != NULL) &&						(old_data_size > 0) &&						(old_data_size == data_size))						{                        if ((memcmp ((const void *) sptr_old_instance->advertisement.sptr_type_11->data,							(const void *) sptr_advertisement->sptr_type_11->data, data_size ) != (int) NULL))							{							return (PASS);							}						}                    break;            }#endif /* __OPAQUE_LSA__ */                default:                        {                        break;                        }                }        return (FAIL);}/***************************************************************************** ospf_add_entry_to_link_state_database -- adds a new entry to an LS database** This function first checks to see if a previous instance of the* advertisement exists, and if it does, removes it.* It then places the newer instance of the advertisement in the database* passed in to it.** RETURNS: static OSPF_LS_DATABASE_ENTRY *** ERRNO:**/static OSPF_LS_DATABASE_ENTRY *ospf_add_entry_to_link_state_database    (    OSPF_LS_DATABASE_ENTRY              *sptr_old_database_entry,    OSPF_AREA_ENTRY                     *sptr_area,    UNION_OSPF_LINK_STATE_ADVERTISEMENT *sptr_advertisement,    int 								route_protocol    )    {    OSPF_LS_DATABASE_HEAD * sptr_database_head;    ULONG                   hash_id;	OSPF_LS_DATABASE_ENTRY *    sptr_new_database_entry;    OSPF_LS_DATABASE_ENTRY *    sptr_database_entry = NULL;    OSPF_LS_DATABASE_ENTRY *    sptr_next_database_entry = NULL;	ULONG                   current_time;	BOOLEAN                 checkNetMask = FALSE;	BOOLEAN                 maskIsIdentical = FALSE;	ULONG                   dbEntryNetMask;	ULONG                   netMask = 0x0L;	enum TEST               difference_found;    GENERIC_ARGUMENT 		key;	OSPF_AVL_LSDB_KEY 		lsdb_entry_key;	OSPF_AVL_LSDB_NODE		*sptr_database_entry_node = NULL;    OSPF_PRINTF_DEBUG (OSPF_DEBUG_PRINTF,        "OSPF: Entering ospf_add_entry_to_link_state_database\r\n");    hash_id = sptr_advertisement->sptr_router->ls_header.id;    hash_id = net_to_host_long (hash_id);    hash_id = hash_id & OSPF_HASH_MASK;    PARAMETER_NOT_USED (sptr_old_database_entry);    if ((sptr_advertisement->sptr_router->ls_header.type ==         OSPF_LS_SUMMARY_NETWORK) ||	    (sptr_advertisement->sptr_router->ls_header.type ==	     OSPF_LS_SUMMARY_AS_BOUNDARY_ROUTER))        {        if (sptr_advertisement->sptr_summary->tos0_metric == OSPF_LSInfinity)			{            sptr_advertisement->sptr_summary->ls_header.age =                host_to_net_short (OSPF_MAXIMUM_AGE);            }        }    else if ((sptr_advertisement->sptr_router->ls_header.type ==              OSPF_LS_AS_EXTERNAL) &&             (sptr_advertisement->sptr_external->tos0_metric ==              OSPF_LSInfinity))        {        sptr_advertisement->sptr_external->ls_header.age =            host_to_net_short (OSPF_MAXIMUM_AGE);        }	/* SPR 78250 Start */	switch (sptr_advertisement->sptr_router->ls_header.type)		{#if defined (__OPAQUE_LSA__)		case OSPF_LS_TYPE_9:	        sptr_database_head =	            &(sptr_area->opaque_ls_database_hash_table[TYPE_9_LSA][hash_id]);			checkNetMask = FALSE;			break;		case OSPF_LS_TYPE_10:		    sptr_database_head =	            &(sptr_area->opaque_ls_database_hash_table[TYPE_10_LSA][hash_id]);			checkNetMask = FALSE;			break;		case OSPF_LS_TYPE_11:			sptr_database_head =			    &(ospf.type_11_database_hash_table[LS_TYPE_11_LSA][hash_id]);			checkNetMask = FALSE;			break;#endif /* __OPAQUE_LSA__ */		case OSPF_LS_AS_EXTERNAL:		    sptr_database_head =			    &(ospf.external_database_hash_table[LS_EXTERNAL_LSA][hash_id]);			netMask = sptr_advertisement->sptr_network->network_mask;			netMask = net_to_host_long (netMask);			checkNetMask = TRUE;			break;		case OSPF_LS_ROUTER:			sptr_database_head =	            &(sptr_area->ls_database_hash_table[	            sptr_advertisement->sptr_router->ls_header.type][hash_id]);			checkNetMask = FALSE;			break;		default:	        sptr_database_head =	            &(sptr_area->ls_database_hash_table[	            sptr_advertisement->sptr_router->ls_header.type][hash_id]);			netMask = sptr_advertisement->sptr_network->network_mask;				netMask = net_to_host_long (netMask);				checkNetMask = TRUE;		}    /* SPR#76812 */    for (sptr_database_entry = sptr_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;        /*         * We only access the <sptr_network->network_mask> in the cases from		 * the above switch statement that are known to have a <network_mask>		 * variable associated with the packet type. All other cases we set		 * the maskIsIdentical variable to TRUE so the logic isn't affected.		 */        if (checkNetMask)        	{            dbEntryNetMask =                sptr_database_entry->advertisement.sptr_network->network_mask;            dbEntryNetMask = net_to_host_long (dbEntryNetMask);            maskIsIdentical = dbEntryNetMask == netMask ? TRUE : FALSE;        	}        if ((sptr_advertisement->sptr_router->ls_header.id ==             sptr_database_entry->advertisement.sptr_router->ls_header.id) &&			 maskIsIdentical)			{			if ((sptr_advertisement->sptr_router->ls_header.advertising_router			    ==                sptr_database_entry->advertisement.sptr_router->ls_header.advertising_router)                || (sptr_advertisement->sptr_router->ls_header.type ==                OSPF_LS_NETWORK) ||                (sptr_advertisement->sptr_router->ls_header.type ==                 OSPF_LS_ROUTER)#if defined (__NSSA__)			    || (sptr_advertisement->sptr_router->ls_header.type ==                 OSPF_LS_TYPE_7)#endif /*__NSSA__*/				)				{				difference_found =				    ospf_check_if_new_advertisement_is_different_from_its_previous_instance (				    sptr_advertisement,	sptr_database_entry);				if (difference_found == PASS)					{					/* SPR 84312 -- Begin */					current_time = ospf_get_system_elapsed_time_second ();					/* SPR 84312 -- End */					sptr_database_entry->ls_database_time_stamp = current_time;					ospf_free_database_entry (sptr_database_entry);					break;					}				else				    {					return sptr_database_entry;					}				}			}		}	/* SPR 78250 End */    /*     * If we're here, we haven't found it in the database, or we have     * removed the previous entry because of differences found -- add it     */	sptr_new_database_entry = (OSPF_LS_DATABASE_ENTRY *)table_malloc (        1, sizeof (OSPF_LS_DATABASE_ENTRY));    if (sptr_new_database_entry == NULL)        {        ospf_print_memory_error_message_and_free_buffer_if_necessary (            (void *)NULL, "OSPF_LS_DATABASE_ENTRY");        return (NULL);        }    memset (sptr_new_database_entry, 0x00, sizeof (OSPF_LS_DATABASE_ENTRY));#if defined (__OPAQUE_LSA__)    if (sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_TYPE_9)        {        sptr_new_database_entry->advertisement.sptr_type_9 =            sptr_advertisement->sptr_type_9;        }    else if (sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_TYPE_10)        {        sptr_new_database_entry->advertisement.sptr_type_10 =            sptr_advertisement->sptr_type_10;        }    else if (sptr_advertisement->sptr_router->ls_header.type == OSPF_LS_TYPE_11)        {        sptr_new_database_entry->advertisement.sptr_type_11 =            sptr_advertisement->sptr_type_11;        }    else        {        sptr_new_database_entry->advertisement.sptr_router =            sptr_advertisement->sptr_router;        }#else /* __OPAQUE_LSA__ */    sptr_new_database_entry->advertisement.sptr_router =        sptr_advertisement->sptr_router;#endif /* __OPAQUE_LSA__ */    /* SPR 85893 --Begin */    sptr_new_database_entry->ls_database_pending_delete = FALSE;    /* SPR 85893 --End */    sptr_new_database_entry->ls_database_sequence_state = OSPF_NORMAL;    sptr_new_database_entry->ls_database_freeme = FALSE;    sptr_new_database_entry->sptr_ls_database_area = sptr_area;    sptr_new_database_entry->ls_database_hash = (USHORT) hash_id;    sptr_new_database_entry->ls_database_type =        (enum OSPF_LS_TYPE) sptr_advertisement->sptr_router->ls_header.type;    /* SPR 84312 -- Begin */	current_time = ospf_get_system_elapsed_time_second ();	/* SPR 84312 -- End */	sptr_new_database_entry->ls_database_time_stamp = current_time;	/* SPR 85050 -- Begin */	sptr_new_database_entry->route_protocol = route_protocol;	/* SPR 85050 -- End */    /* SPR#76812 -- Begin */    sptr_database_entry_node = (OSPF_AVL_LSDB_NODE *) table_malloc (        1, sizeof (OSPF_AVL_LSDB_NODE));    if (sptr_database_entry_node == NULL)        {

⌨️ 快捷键说明

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