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

📄 restoration_rte_bak.pr.c

📁 实验室前辈用OPNET做的光突发交换网络的仿真实验
💻 C
📖 第 1 页 / 共 4 页
字号:
								back_fail++;
								}
							fail[source_address][destination_address]++;
							}
						op_pk_destroy(pkptr);
						s_f_flag = 1;
						}
					}
				
					//************************* sub  *************************
				
					
					
					
					//************************* link **************************
					if(restoration_flag == LINK) 
						{
						
						if(old_offset_time > 0)
							{
							//rev_pk_count++;
							//op_stat_write(rev_pk_cnt_stathandle, rev_pk_count);
								
							if(userid != source_address)
								{
								op_pk_nfd_get (pkptr, "bef", &bef_address);
								link_receive[userid][bef_address]++;
								//node_pk_count++;
								}	
					
							if(dest_objid != node_objid)		//No destination
								{
								op_rte_pk_dst_node (pkptr, &subnet_id, &dst_node_id);
								op_ima_obj_attr_get (dst_node_id, "user id", &dst_address);	
				
								if(dst_address == userid)		//downstream node change routing again
									{
									min_rptr_copy = op_rte_route_copy (min_rptr[userid][destination_address]);
									current_rptr = min_rptr_copy;
									pk_rptr = op_rte_route_copy (current_rptr);
									op_rte_pk_route_insert (pkptr, pk_rptr);
									}	
				
								op_rte_pk_next_node (pkptr, &subnet_id, &next_node_id);
								op_ima_obj_attr_get (next_node_id, "user id", &next_address);	
								
								if (
									(userid == notification_message->fail_link_node1 && next_address == notification_message->fail_link_node2) ||
									(userid == notification_message->fail_link_node2 && next_address == notification_message->fail_link_node1)
								   )
									{
									min_rptr_copy = op_rte_route_copy (min_rptr[userid][next_address]);
									current_rptr = min_rptr_copy;
									pk_rptr = op_rte_route_copy (current_rptr);
									op_rte_pk_route_insert (pkptr, pk_rptr);
									/*
									num_nodes = op_rte_route_num_nodes (pk_rptr);
									n_start_time = (PROC_TIME + LINK_DELAY)*(num_nodes-1);
									op_pk_nfd_get (pkptr, "start", &o_start_time);
									start_time = o_start_time + n_start_time;					   
									op_pk_nfd_set (pkptr, "start", start_time);
									*/
									op_pk_nfd_set (pkptr, "flag", 1);
									op_pk_nfd_set (pkptr, "route_flag", 1);
									gen_backup_bcp++;
									
									//printf("link\n");
									//getchar();
									}	
				
								//****** need schedule **********
								need_schedule = 1;
								//****** need schedule **********
							
								}
							
							else if(dest_objid == node_objid) //this node is the packet's destination
								{
								s_f_flag = 1;
								
								op_pk_nfd_get(pkptr, "route_flag", &route_flag);
								if(route_flag==1)
									{
									back_succ++;
									}
								op_pk_send (pkptr, PK_OUT_STRM); //sink		
								}
				
							}
					
						else if(old_offset_time <= 0)
							{
							if(op_sim_time() >= s_time)
								{	
								op_pk_nfd_get(pkptr, "route_flag", &route_flag);
								if(route_flag==1)
									{
									back_fail++;
									}
								fail[source_address][destination_address]++;
								}
							op_pk_destroy(pkptr);
							s_f_flag = 1;
							}
						
						}
					//**************************** link *****************************
				
					
					
					
					//**************************** normal ***************************
					if(restoration_flag == NORMAL) 
					{
					
					if(old_offset_time > 0)
					{
					//rev_pk_count++;
					//op_stat_write(rev_pk_cnt_stathandle, rev_pk_count);
				
					if(userid != source_address)
						{	
						op_pk_nfd_get (pkptr, "bef", &bef_address);
						link_receive[userid][bef_address]++;
				
						//node_pk_count++;
						}	
					
					else
						{
						if(FIS_GET[userid] == 1 && FIS_TYPE[userid] == PATH)
							{
							backup_flag = 0;
							
							for(k=0; k<primary_num_nodes[source_address][destination_address]-1; k++)
								{
								if(
									((Primary_path[userid][destination_address][k] == FIS_NODE1[userid]) &&
									 (Primary_path[userid][destination_address][k+1] == FIS_NODE2[userid]))
										||
									((Primary_path[userid][destination_address][k] == FIS_NODE2[userid]) &&
									 (Primary_path[userid][destination_address][k+1] == FIS_NODE1[userid]))
								  )
									{
									backup_flag = 1;
									}
								if(backup_flag == 1) break;
								}
							
							if(backup_flag == 1)
								{
								min_rptr_copy = op_rte_route_copy (min_rptr[userid][destination_address]);
								current_rptr = min_rptr_copy;
								pk_rptr = op_rte_route_copy (current_rptr);
								op_rte_pk_route_insert (pkptr, pk_rptr);
								
								op_pk_nfd_set (pkptr, "route_flag", 1);  		 //backup path flag
								gen_backup_bcp++;
								}
							}
						}//if(userid == source_address)		
						
					
					if (dest_objid == node_objid) 			//this node is the packet's destination
						{
						op_pk_nfd_get(pkptr, "route_flag", &route_flag);
						if(route_flag==1)
							{
							back_succ++;
							}
						op_pk_send (pkptr, PK_OUT_STRM); 	//sink
						s_f_flag = 1;	
						}
				
					else
						{		
						op_rte_pk_next_node (pkptr, &subnet_id, &next_node_id);
						op_ima_obj_attr_get (next_node_id, "user id", &next_address);
						
						if(
							(notification_message->fail_type == 3) &&
							((userid == notification_message->fail_link_node1 && next_address == notification_message->fail_link_node2) ||
							 (userid == notification_message->fail_link_node2 && next_address == notification_message->fail_link_node1))
						  )
							{
							if(op_sim_time() >= s_time)
								{
								fis_fail[source_address][destination_address]++;
								gen_backup_bcp++;
								back_fail++;
								}
							op_pk_destroy(pkptr);
							s_f_flag = 1;
							}	
						
						else 
							{
							//****** need schedule **********
							need_schedule = 1;
							//****** need schedule **********
							}
						} //else if (dest_objid != node_objid)
					}
				
					else if(old_offset_time <= 0)
						{
						if(op_sim_time() >= s_time)
							{	
							op_pk_nfd_get(pkptr, "route_flag", &route_flag);
							if(route_flag==1)
								{
								back_fail++;
								}
							fail[source_address][destination_address]++;
							}
						op_pk_destroy(pkptr);
						s_f_flag = 1;
						}
						
				
					}
					//************************** normal **************************
					
				
				
				
				//**************************** need schedule ************************************
				if(need_schedule == 1)
					{
					send_check = 1;
					
					op_rte_pk_next_node (pkptr, &subnet_id, &next_node_id);
					op_ima_obj_attr_get (next_node_id, "user id", &next_address);
						
					cur_time = op_sim_time();
					op_pk_nfd_get (pkptr, "start", &start_time);
					op_pk_nfd_get (pkptr, "dtime", &dtime_time);
							
					start_time = cur_time + start_time;
					dtime_time = start_time + dtime_time;
							
					wave_info_table = (wave_info *) op_prg_mem_alloc (sizeof (wave_info));
							
					/*
					if(op_sim_time() > s_time)
						{
						if(userid == 2 && next_address == 4)
							{
							printf("start_time = %f\tdtime_time = %f\n",start_time,dtime_time);
							getchar();
							}
						}
					*/ 
							
					//**************************************** wave arrival update based on time **********************************************
					/*
					if ( (op_sim_time() >= s_time) ) 
						{
						
						if(userid == 2 && next_address == 4)
							{
							printf("\n*****************************************************");
							printf("\nOne PK Pass:\narrival = %f\tfinish = %f\tcurrent = %d\tnext = %d",start_time,dtime_time,userid,next_address);
							printf("\nold wave list:");
							}
						
						}	
					*/	
					
					for(wave_count=0;wave_count<WAVE_NUM;wave_count++)
						{
						num = op_prg_list_size(wave_lptr[userid][next_address][wave_count]);
						/*
						if ( (op_sim_time() >= s_time) )
							{
							if(userid == 2 && next_address == 4)
								{
								printf("\nwave_index = %d\tlist_size = %d", wave_count, num);
								}
							}
						*/
						for(i=0;i<num;i++) 
							{
							wave = (wave_info *)op_prg_list_access (wave_lptr[userid][next_address][wave_count], i);
							list_table[i][0] = wave->start;
							list_table[i][1] = wave->dtime;
							/*
							if ( (op_sim_time() >= s_time) )
								{
								if(userid == 2 && next_address == 4)
									{
									printf("\nlist_index = %d\tnow = %f\tstart = %f\tdtime = %f", 
										i, 		  cur_time, list_table[i][0], list_table[i][1]);
									}
							   	}
							*/	
							}
									
						delete_num = 999; // list size check
								
						num = op_prg_list_size(wave_lptr[userid][next_address][wave_count]);
						for(i=0;i<num;i++) 
							{
							if(cur_time > list_table[i][1]) 
								{
								delete_num = i;
								}
							}
						
						if(delete_num != 999) 
							{
							if(delete_num == 0)
								{
								wave_free = op_prg_list_remove (wave_lptr[userid][next_address][wave_count], OPC_LISTPOS_HEAD);
								op_prg_mem_free(wave_free);
								}
							else
								{
								for(i=0;i<=delete_num;i++) 
									{
									wave_free = op_prg_list_remove (wave_lptr[userid][next_address][wave_count], OPC_LISTPOS_HEAD);
									op_prg_mem_free(wave_free);
									}
								}
							}
						}//for(wave_count=0;wave_count<WAVE_NUM;wave_count++)		
					
							
							
					//******************************************* insert ***************************************************************
							
					//************************** get gap[userid][next_address][wave_count] ******************************
					for(wave_count=0;wave_count<WAVE_NUM;wave_count++)
						{
						
						if(start_time < cur_time)
							{
							gap[userid][next_address][wave_count] = -1;
							}
						
						else
							{	
							num1 = op_prg_list_size(wave_lptr[userid][next_address][wave_count]); // original list table
							
							for(i=0;i<num1;i++) 
								{
								wave = (wave_info *)op_prg_list_access (wave_lptr[userid][next_address][wave_count], i);
								list_table[i][0] = wave->start;
								list_table[i][1] = wave->dtime;
								}
							
							if(num1 == 0)  				//Original list table is empty
								{ 
								gap[userid][next_address][wave_count] = 100;
								}
							
							else 						//Original list table is not empty
								{ 
								loop_stop = 0;
								
								for(i=0;i<num1;i++) 	//every list table check 
									{
									if(i==num1-1) 		//list table tail
										{ 
										start_time_1 = list_table[i][0];
										dtime_time_1 = list_table[i][1];
										
										if(start_time > dtime_time_1) 	//insert PK to this list tail
											{ 
											gap[userid][next_address][wave_count] = (double) (start_time - dtime_time_1);
											loop_stop = 1;
											}
										
										else 							//insert failure
											{ 
											gap[userid][next_address][wave_count] = -1;
											}
										}	
				
									if(i!=num1-1) 		//list table head and body
										{ 
										start_time_1 = list_table[i][0];
										dtime_time_1 = list_table[i][1];
				
										start_time_2 = list_table[i+1][0];
										dtime_time_2 = list_table[i+1][1];
												
												
										if( (start_time > dtime_time_1) && (dtime_time < start_time_2) )
											{
											gap[userid][next_address][wave_count] = (double) (start_time - dtime_time_1);
											loop_stop = 1;
											}
										else 						
											{ 
											gap[userid][next_address][wave_count] = -1;
											}
										}
									if(loop_stop == 1) break;
									} //for(i=0;i<num2;i++)
								} // else
							}
						
						/*
						if ( (op_sim_time() >= s_time) )
							{
							if(userid == 2 && next_address == 4)
								{
								printf("\ngap[%d][%d][%d] =  %f",userid,next_address, wave_count,gap[userid][next_address][wave_count]);
								}
							}
						*/	
						} //for(wave_count=0;wave_count<WAVE_NUM;wave_count++)
								
					temp_gap = 999;
					temp_wave = -1;
										
					for(wave_count=0;wave_count<WAVE_NUM;wave_count++)
						{
						if(gap[userid][next_address][wave_count] != -1)
							{
							if(gap[userid][next_address][wave_count]<temp_gap)
								{
								temp_gap = gap[userid][next_address][wave_count];
								temp_wave = wave_count;
								}
							}
						}
					/*		
					if ( (op_sim_time() >= s_time) )
						{
						if(userid == 2 && next_address == 4)
							{
							printf("\nMIN_gap[%d][%d][%d] =  %f",userid, next_address,temp_wave,temp_gap);
							getchar();
							}
						}
					*/			
							
					//************************** insert or fail ********************************************
					if(temp_wave != -1)
						{
						wave_count = temp_wave;
						send_check = 0;
						
						wave_info_table->start = start_time;
						wave_info_table->dtime = dtime_time;
						
						num1 = op_prg_list_size(wave_lptr[userid][next_address][wave_count]); // original list table
						
						for(i=0;i<num1;i++) 
							{
							list_table[i][0] = 0;
							list_table[i][1] = 0;

⌨️ 快捷键说明

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