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

📄 ier.pr.c

📁 实验室前辈用OPNET做的光突发交换网络的仿真实验
💻 C
📖 第 1 页 / 共 3 页
字号:
							{
								difference_time = temp_difference_time;
								cur_channel = i;
								reservation_flag = 2;
							//	printf("IER->control_access re_2; userid=%d,i=%d,h_time=%e,s_time=%e\n",userid,i,node_for_schedule.port[cur_port].channel[i].horizon,start_time);
							}	
						}
					}	
					//printf("IER->control_access 3; userid=%d,channel=%d\n",userid,cur_channel);
					//getchar();
					if(reservation_flag == 1)
					{
						op_pk_nfd_set (pkptr, "wave_num", cur_channel);
						op_pk_nfd_set (pkptr, "prev userid", userid);
						node_for_schedule.port[cur_port].channel[cur_channel].horizon = (double)start_time +(double)dtime_time;
						
						//printf("IER->control_access 3.1; userid=%d\n",userid);
						temp_channel_infor  = (CHANNEL_INFOR *)op_prg_mem_alloc(sizeof(CHANNEL_INFOR));
						temp_channel_infor->start_time = start_time;
						temp_channel_infor->duration_time = dtime_time;
						temp_channel_infor->source = source_address;
						temp_channel_infor->destination = destination_address;
						temp_channel_infor->instrm_num = -1;  // becasue of ER node
						
						strm_objid = op_topo_assoc(node_for_schedule.port[cur_port].tx_objid,OPC_TOPO_ASSOC_IN,OPC_OBJTYPE_STRM,cur_channel);
						op_ima_obj_attr_get(strm_objid,"src stream", &temp_outstrm_num);
						temp_channel_infor->outstrm_num = temp_outstrm_num;
						op_prg_list_insert(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list,temp_channel_infor,OPC_LISTPOS_TAIL);
										
						
						
						
						j=0;
						//temp_flag_loop=1;
						temp_occupy_count = op_prg_list_size(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list);
						//printf("IER->CTrl_forwarding;userid=%d,occupy_count=%d\n",userid,temp_occupy_count);
						while(j<temp_occupy_count)// & temp_flag_loop == 1)	
						{
							temp_channel_infor = op_prg_list_access(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list, j);
							if(op_sim_time() > temp_channel_infor->start_time + temp_channel_infor->duration_time)
							{	
								temp_channel_infor = op_prg_list_remove(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list, j);
								op_prg_mem_free(temp_channel_infor);
								//temp_flag_loop = 0;
								temp_occupy_count = op_prg_list_size(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list);
							}
							else
				    			j++;
						}
						//printf("IER->control_access 4; userid=%d\n",userid);
						
						
						op_pk_nfd_set (pkptr, "source address", source_address);
						op_pk_nfd_set (pkptr, "destination address", destination_address);
						op_pk_nfd_set (pkptr, "offset_time", offset_time);
						op_pk_nfd_set (pkptr, "burst size", pk_size);
						op_pk_nfd_set (pkptr, "type", 0);
								
						sub_queue_index = destination_address-6;
						
						pkptr_burst = op_subq_pk_remove (temp_sub_queue_index, OPC_QPOS_HEAD);
						op_subq_pk_insert (sub_queue_index, pkptr_burst, OPC_QPOS_TAIL);
						
						op_intrpt_schedule_self(start_time,sub_queue_index);
						
						op_pk_send(pkptr,routing_table[destination_address].strm_control);
						total_bcp_send_count++;
						total_bcp_notdelayed_sned_count++;
					}
					else if(reservation_flag == 2)
					{
						temp_delay_time = node_for_schedule.port[cur_port].channel[cur_channel].horizon - start_time;
						start_time = node_for_schedule.port[cur_port].channel[cur_channel].horizon;
						op_pk_nfd_set (pkptr, "wave_num", cur_channel);
						op_pk_nfd_set (pkptr, "prev userid", userid);
						node_for_schedule.port[cur_port].channel[cur_channel].horizon = (double)start_time +(double)dtime_time;
						temp_channel_infor  = (CHANNEL_INFOR *)op_prg_mem_alloc(sizeof(CHANNEL_INFOR));
						temp_channel_infor->start_time = start_time;
						temp_channel_infor->duration_time = dtime_time;
						temp_channel_infor->source = source_address;
						temp_channel_infor->destination = destination_address;
						temp_channel_infor->instrm_num = -1;  // becasue of ER node
						
						strm_objid = op_topo_assoc(node_for_schedule.port[cur_port].tx_objid,OPC_TOPO_ASSOC_IN,OPC_OBJTYPE_STRM,cur_channel);
						op_ima_obj_attr_get(strm_objid,"src stream", &temp_outstrm_num);
						temp_channel_infor->outstrm_num = temp_outstrm_num;
						op_prg_list_insert(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list,temp_channel_infor,OPC_LISTPOS_TAIL);
						
						
						
						
						j=0;
						//temp_flag_loop=1;
						temp_occupy_count = op_prg_list_size(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list);
						while(j<temp_occupy_count)// & temp_flag_loop == 1)	
						{
							temp_channel_infor = op_prg_list_access(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list, j);
							if(op_sim_time() > temp_channel_infor->start_time + temp_channel_infor->duration_time)
							{	
								temp_channel_infor = op_prg_list_remove(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list, j);
								op_prg_mem_free(temp_channel_infor);
								//temp_flag_loop = 0;
								temp_occupy_count = op_prg_list_size(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list);
							}
							else
				    			j++;
						}
						
						
						
						op_pk_nfd_set (pkptr, "source address", source_address);
						op_pk_nfd_set (pkptr, "destination address", destination_address);
						op_pk_nfd_set (pkptr, "offset_time", offset_time);
						op_pk_nfd_set (pkptr, "burst size", pk_size);
						op_pk_nfd_set (pkptr, "type", 0);
						
						
						sub_queue_index = destination_address-6;
						
						pkptr_burst = op_subq_pk_remove (temp_sub_queue_index, OPC_QPOS_HEAD);
						op_subq_pk_insert (sub_queue_index, pkptr_burst, OPC_QPOS_TAIL);
						
						op_intrpt_schedule_self(start_time,sub_queue_index);
						
						
						op_pk_send_delayed(pkptr,routing_table[destination_address].strm_control, temp_delay_time);
						total_bcp_delaysend_count++;
						total_bcp_send_count++;	
						if(total_bcp_send_count == 23700)
							total_s_time = start_time;
					}
					else
					{
					
					}
					
					//printf("IER:CTRl;uerid=%d,d_a=%d,sub_q=%d,bcp s_time=%e,op_sim=%e\n",userid,destination_address,sub_queue_index,start_time,op_sim_time());
					//getchar();
					
					
					
				}
				
				
				
				
				
				
				
				}


			/** state (Ctrl_Forwarding&Schduing) exit executives **/
			FSM_STATE_EXIT_FORCED (2, "Ctrl_Forwarding&Schduing", "IER () [Ctrl_Forwarding&Schduing exit execs]")
				{
				}


			/** state (Ctrl_Forwarding&Schduing) transition processing **/
			FSM_TRANSIT_FORCE (1, state1_enter_exec, ;, "default", "", "Ctrl_Forwarding&Schduing", "wait")
				/*---------------------------------------------------------*/



			/** state (Data_Forwarding) enter executives **/
			FSM_STATE_ENTER_FORCED (3, state3_enter_exec, "Data_Forwarding", "IER () [Data_Forwarding enter execs]")
				{
				self_objid = op_id_self ();
				node_objid = op_topo_parent (self_objid);
				//subnet_objid = op_topo_parent (node_objid);
				//topo_objid = op_rte_topo_from_objids();
				
				//temp_sub_queue_index = sub_queue_index;
				temp_sub_queue_index = op_intrpt_code();
				
				
				if(op_subq_empty(temp_sub_queue_index) == OPC_FALSE)
				{
					pkptr_burst = op_subq_pk_remove (temp_sub_queue_index, OPC_QPOS_HEAD);
					
					op_pk_nfd_get (pkptr_burst, "source address", &source_address);
					op_pk_nfd_get (pkptr_burst, "destination address", &destination_address); 
				
					//printf("IER->data_access1,userid=%d,d_a=%d,sub_q=%d,op_time=%e\n",userid,destination_address,temp_sub_queue_index,op_sim_time());
					//getchar();
				
					temp_tx_objid = routing_table[destination_address].output_tx;
					for(i=0; i<link_num; i++)
					{
						if(node_for_schedule.port[i].tx_objid == temp_tx_objid)
						{
							cur_port = i;
						}		
					}
					reservation_flag = 0;
					for(i=1; i<channel_count; i++)
					{
						temp_occupy_count = op_prg_list_size(node_for_schedule.port[cur_port].channel[i].occupy_list);
						for(j=0; j<temp_occupy_count; j++)
						{
							temp_channel_infor = op_prg_list_access(node_for_schedule.port[cur_port].channel[i].occupy_list, j);
				
							if( ( (op_sim_time() == temp_channel_infor->start_time) )//||  
								//  (op_sim_time() - temp_channel_infor->start_time <= 0.0000000001)  )
								&& temp_channel_infor->source == source_address && temp_channel_infor->destination == destination_address)
							{
								reservation_flag = 1;
								output_strm = temp_channel_infor->outstrm_num;
								//printf("IER->data forwarding;userid=%d,channel=%d,op_time=%e\n",userid,i,op_sim_time());
								//getchar();
							}	
						}
					
						//j=0;
						//temp_flag_loop = 1;
						//while(j<temp_occupy_count & temp_flag_loop == 1)
						//printf("IER->data_forwarding;userid=%d,occupy_count=%d\n",userid,temp_occupy_count);
						for(j=0;j<temp_occupy_count;j++)
						{
							temp_channel_infor = op_prg_list_access(node_for_schedule.port[cur_port].channel[i].occupy_list, j);
							if(op_sim_time() > temp_channel_infor->start_time + temp_channel_infor->duration_time)
							{	
								temp_channel_infor = op_prg_list_remove(node_for_schedule.port[cur_port].channel[i].occupy_list, j);
								op_prg_mem_free(temp_channel_infor);
								j--;
								temp_occupy_count--;	
								//temp_flag_loop = 0;
							}
							//j++;
						}
					}
					
					if(reservation_flag == 1)
					{
						next_stime = start_time + PDTime_EC;
						op_pk_send(pkptr_burst, output_strm);
						total_burst_send_cound++;
						//printf("IER->data forwarding;userid=%d,channel=%d,op_time=%e\n",userid,op_sim_time());
					}
					else
					{
					    op_pk_destroy(pkptr_burst );
						total_burst_not_send_count++;
						printf("IER->data_access;not find\n");
					}
				}
				else
				{
					//printf("IER->data_access1,subq is empty;userid=%d,d_a=%d,sub_q=%d,op_time=%e\n",userid,destination_address,temp_sub_queue_index,op_sim_time());
					//getchar();
				
				}	
					
					
					
				}


			/** state (Data_Forwarding) exit executives **/
			FSM_STATE_EXIT_FORCED (3, "Data_Forwarding", "IER () [Data_Forwarding exit execs]")
				{
				}


			/** state (Data_Forwarding) transition processing **/
			FSM_TRANSIT_FORCE (1, state1_enter_exec, ;, "default", "", "Data_Forwarding", "wait")
				/*---------------------------------------------------------*/



			/** state (Data_Buffering) enter executives **/
			FSM_STATE_ENTER_FORCED (4, state4_enter_exec, "Data_Buffering", "IER () [Data_Buffering enter execs]")
				{
				self_objid = op_id_self ();
				node_objid = op_topo_parent (self_objid);
				//subnet_objid = op_topo_parent (node_objid);
				//topo_objid = op_rte_topo_from_objids();
				op_ima_obj_attr_get(node_objid, "user id", &userid);	
				
				//if(userid != 8)
				{	
				if(op_test_count < 20)
				{
				//op_test_count++;
				
				
				//printf("IER->data_recieve, userid=%d\n",userid);
				pkptr_burst = op_pk_get(op_intrpt_strm());
				//printf("userid=%d,pk_size=%e\n",userid,op_pk_total_size_get(pkptr_burst));
				//getchar();
				
				
				while(1)
				{
					destination_address = op_dist_uniform(node_num);
					if(destination_address >= 6 && destination_address <= 11)
					{	
						if(userid != destination_address)	
						{	
							source_address = userid;
							op_pk_nfd_set (pkptr_burst, "source address", source_address);
							op_pk_nfd_set (pkptr_burst, "destination address", destination_address);
							//op_pk_nfd_set (pkptr_burst, "destination address", 8);
							op_pk_nfd_set (pkptr_burst, "type", 1);
							
							//num_pks = op_subq_stat(userid-6, OPC_QSTAT_PKSIZE);
							//printf("userid=%d,num_pks=%d\n",userid,num_pks);
							//if(num_pks > 10)
							//{
							//	op_pk_destroy(pkptr_burst);
							//	printf("overflow subqueue\n");
							//	getchar();
							//}
							//else
							//{	
								op_subq_pk_insert (userid-6, pkptr_burst, OPC_QPOS_TAIL);
								total_gen_burst_count++;
							//	num_pks = op_subq_stat(userid-6, OPC_QSTAT_PKSIZE);
							//	printf("userid=%d,num_pks=%d\n",userid,num_pks);
							
							//}
							break;
						}
					}
				}
				op_intrpt_schedule_self(op_sim_time(), 444);
				
				
				}
				}
				
				
				
				}


			/** state (Data_Buffering) exit executives **/
			FSM_STATE_EXIT_FORCED (4, "Data_Buffering", "IER () [Data_Buffering exit execs]")
				{
				}


			/** state (Data_Buffering) transition processing **/
			FSM_TRANSIT_FORCE (1, state1_enter_exec, ;, "default", "", "Data_Buffering", "wait")
				/*---------------------------------------------------------*/



			/** state (end) enter executives **/
			FSM_STATE_ENTER_UNFORCED (5, state5_enter_exec, "end", "IER () [end enter execs]")
				{
				self_objid = op_id_self ();
				node_objid = op_topo_parent (self_objid);
				op_ima_obj_attr_get(self_objid, "filename", &filename);
				
				
				if(userid==6)
				{	
				
				strcpy(temp_file_name,"D:/result/");
				strcat(temp_file_name,filename);
				
				in = fopen(temp_file_name,"a");
				fprintf(in,"total_burst_send_cound = %d \n",total_burst_send_cound);
				fprintf(in,"total_burst_not_send_cound = %d \n",total_burst_not_send_count);
				fprintf(in,"total_bcp_send_count = %d \n",total_bcp_send_count);
				fprintf(in,"total_bcp_notdelayed_sned_count = %d \n",total_bcp_notdelayed_sned_count);
				fprintf(in,"total_bcp_delaysend_count = %d \n",total_bcp_delaysend_count);
				fprintf(in,"total_gen_burst_count = %d \n",total_gen_burst_count);
				
				fclose(in);	
				
				
				printf("total_burst_send_cound=%d,userid=%d\n",total_burst_send_cound,userid);
				printf("total_burst_not_send_cound=%d,userid=%d\n",total_burst_not_send_count,userid);
				printf("total_bcp_send_count=%d,userid=%d\n",total_bcp_send_count,userid);
				printf("total_bcp_notdelayed_sned_count=%d\n",total_bcp_notdelayed_sned_count);
				printf("total_bcp_delaysend_count=%d\n",total_bcp_delaysend_count);
				printf("total_s_time=%e\n",total_s_time);
				}
				}


			/** blocking after enter executives of unforced state. **/
			FSM_EXIT (11,IER)


			/** state (end) exit executives **/
			FSM_STATE_EXIT_UNFORCED (5, "end", "IER () [end exit execs]")
				{
				}


			/** state (end) transition processing **/
			FSM_TRANSIT_MISSING ("end")
				/*---------------------------------------------------------*/



			/** state (R_T_init) enter executives **/
			FSM_STATE_ENTER_FORCED (6, state6_enter_exec, "R_T_init", "IER () [R_T_init enter execs]")
				{
				self_objid = op_id_self ();
				node_objid = op_topo_parent (self_objid);
				subnet_objid = op_topo_parent (node_objid);
				topo_objid = op_rte_topo_from_objids();
				//start of initilize the routing table
				
				routing_table = (ROUTING_TABLE *)malloc(sizeof(ROUTING_TABLE)*node_num);
				
				//printf("IER->R_T_init;node_num=%d,userid=%d\n",node_num,userid);
				for (i = 0; i < node_num; i++)
				{	
					routing_table[i].source = userid;
					routing_table[i].destination = i;
					if(userid == i)
					{	
						routing_table[i].hop_count = 0;
						routing_table[i].output_link = OPC_NIL;    
						routing_table[i].strm_control =-1;   
					}	
					else
					{	
						temp_src_objid = op_id_from_userid (subnet_objid, OPC_OBJTYPE_NDFIX,userid);
						temp_dest_objid = op_id_from_userid (subnet_objid, OPC_OBJTYPE_NDFIX, i);
						temp_routeset = op_rte_routeset_create (topo_objid, subnet_objid, temp_src_objid, subnet_objid, temp_dest_objid, 15);
						temp_min_route = op_rte_routeset_mincost(temp_routeset);
						
						routing_table[i].hop_count = op_rte_route_num_nodes(temp_min_route);
						
						op_rte_route_node_n(temp_min_route,1,&subnet_id_ptr,&node_id_ptr);
						op_ima_obj_attr_get(node_id_ptr, "user id",&temp_userid);
						
						temp_flag_tx=0;
						
						temp_src_objid = op_id_from_userid (subnet_objid, OPC_OBJTYPE_NDFIX,userid);
						temp_dest_objid = op_id_from_userid (subnet_objid, OPC_OBJTYPE_NDFIX, temp_userid);
						//printf("R_T;userid=%d,temp_userid=%d\n",userid,temp_userid);
						if(op_topo_connect_count (temp_src_objid, temp_dest_objid,OPC_OBJMTYPE_LINK)==1)
						{	
							//printf("IER->R_T_init;finding link,userid=%d\n",userid);
							link_objid = op_topo_connect (temp_src_objid, temp_dest_objid,OPC_OBJTYPE_LKDUP, 0);
							
							op_ima_obj_attr_get(node_objid,"name",temp_char);			
							
							op_ima_obj_attr_get(link_objid,"transmitter a",temp_char1);
							op_ima_obj_attr_get(link_objid,"transmitter b",temp_char2);
							
							if(temp_char[0] == temp_char1[0] && temp_char[5] == temp_char1[5])
							{
								link_objid = op_topo_connect (temp_src_objid, temp_dest_objid,OPC_OBJTYPE_LKDUP, 0);

⌨️ 快捷键说明

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