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

📄 scu.pr.c

📁 实验室前辈用OPNET做的光突发交换网络的仿真实验
💻 C
📖 第 1 页 / 共 3 页
字号:
				
				printf("scu;userid=%d,node_objid=%d,pt_objid=%d\n",userid,self_objid, op_id_from_name(node_objid,OPC_OBJTYPE_PTTX,"pt_0"));
				printf("scu;userid=%d,node_objid=%d,pt_objid=%d\n",userid,self_objid, op_id_from_name(node_objid,OPC_OBJTYPE_PTTX,"pt_1"));
				printf("scu;userid=%d,node_objid=%d,pt_objid=%d\n",userid,self_objid, op_id_from_name(node_objid,OPC_OBJTYPE_PTTX,"pt_2"));
				printf("scu;userid=%d,node_objid=%d,pt_objid=%d\n",userid,self_objid, op_id_from_name(node_objid,OPC_OBJTYPE_PTTX,"pt_3"));
				printf("scu;userid=%d,node_objid=%d,pt_objid=%d\n\n",userid,self_objid, op_id_from_name(node_objid,OPC_OBJTYPE_PTTX,"pt_4"));
				
				
				printf("scu;userid=%d,node_objid=%d,pt_objid=%d\n",userid,topo_objid, op_id_from_name(node_objid,OPC_OBJTYPE_PTTX,"pt_0"));
				printf("scu;userid=%d,node_objid=%d,pt_objid=%d\n",userid,topo_objid, op_id_from_name(node_objid,OPC_OBJTYPE_PTTX,"pt_1"));
				printf("scu;userid=%d,node_objid=%d,pt_objid=%d\n",userid,topo_objid, op_id_from_name(node_objid,OPC_OBJTYPE_PTTX,"pt_2"));
				printf("scu;userid=%d,node_objid=%d,pt_objid=%d\n",userid,topo_objid, op_id_from_name(node_objid,OPC_OBJTYPE_PTTX,"pt_3"));
				printf("scu;userid=%d,node_objid=%d,pt_objid=%d\n\n",userid,topo_objid, op_id_from_name(node_objid,OPC_OBJTYPE_PTTX,"pt_4"));
				
				*/
				}


			/** state (init) exit executives **/
			FSM_STATE_EXIT_FORCED (0, "init", "scu () [init exit execs]")
				{
				}


			/** state (init) transition processing **/
			FSM_TRANSIT_ONLY ((BEG_SIM), 1, state1_enter_exec, ;, "init", "BEG_SIM", "", "init", "wait")
				/*---------------------------------------------------------*/



			/** state (wait) enter executives **/
			FSM_STATE_ENTER_UNFORCED (1, state1_enter_exec, "wait", "scu () [wait enter execs]")
				{
				//printf("Core->wait, userid=%d\n",userid);
				//getchar();
				}


			/** blocking after enter executives of unforced state. **/
			FSM_EXIT (3,scu)


			/** state (wait) exit executives **/
			FSM_STATE_EXIT_UNFORCED (1, "wait", "scu () [wait exit execs]")
				{
				}


			/** state (wait) transition processing **/
			FSM_INIT_COND (CONTROL_ACCESS)
			FSM_TEST_COND (END_SIM)
			FSM_TEST_COND (R_T_INIT)
			FSM_TEST_COND (R_T_UPDATE)
			FSM_TEST_COND (SCHUDING_INIT)
			FSM_TEST_LOGIC ("wait")

			FSM_TRANSIT_SWITCH
				{
				FSM_CASE_TRANSIT (0, 2, state2_enter_exec, ;, "CONTROL_ACCESS", "", "wait", "Ctrl_Forwarding&Schuding")
				FSM_CASE_TRANSIT (1, 3, state3_enter_exec, ;, "END_SIM", "", "wait", "end")
				FSM_CASE_TRANSIT (2, 4, state4_enter_exec, ;, "R_T_INIT", "", "wait", "R_T_init")
				FSM_CASE_TRANSIT (3, 5, state5_enter_exec, ;, "R_T_UPDATE", "", "wait", "R_T_Update")
				FSM_CASE_TRANSIT (4, 6, state6_enter_exec, ;, "SCHUDING_INIT", "", "wait", "Schuding_init")
				}
				/*---------------------------------------------------------*/



			/** state (Ctrl_Forwarding&Schuding) enter executives **/
			FSM_STATE_ENTER_FORCED (2, state2_enter_exec, "Ctrl_Forwarding&Schuding", "scu () [Ctrl_Forwarding&Schuding 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();
				
				bcp_intrup_strum = op_intrpt_strm();
				pkptr = op_pk_get(bcp_intrup_strum);
				op_ima_obj_attr_get(node_objid, "user id", &userid);
				//printf("SCU->control_access 1, userid=%d\n",userid);
				
				op_pk_nfd_get (pkptr, "source address", &source_address);
				op_pk_nfd_get (pkptr, "destination address", &destination_address);
				op_pk_nfd_get (pkptr, "offset_time", &offset_time);
				op_pk_nfd_get (pkptr, "burst size", &pk_size);
				//start_time = (double)( PROC_TIME* ((double)routing_table[destination_address].hop_count-1) + op_sim_time() );
				//cur_offset_time = offset_time - PROC_TIME;
				//start_time = cur_offset_time + op_sim_time();
				
				temp_tx_objid = routing_table[destination_address].output_tx;
				//printf("SCU->control_access 3, userid=%d\n",userid);
				for(i=0; i<link_num; i++)
				{
					if(node_for_schedule.port[i].tx_objid == temp_tx_objid)
					{
						cur_port = i;
					}		
				}	
				
				
				start_time = (double)( PROC_TIME* ((double)routing_table[destination_address].hop_count) + op_sim_time() );
				dtime_time = (double)pk_size/(double)node_for_schedule.port[cur_port].data_rate ;
				
				//printf("SCU->control_access 4, userid=%d\n",userid);
				//difference_time = 9999;
				//reservation_flag = 0;
				//for(i=1; i<channel_count; i++)
				//{
					/*
					if(node_for_schedule.port[cur_port].channel[i].horizon > start_time)
					{
						//failed reservation
						//total_bcp_drop_count++;
					}
					else
					{
						//succcessed reservation
						temp_difference_time = start_time - node_for_schedule.port[cur_port].channel[i].horizon ;
						if(difference_time > temp_difference_time)
						{
							difference_time = temp_difference_time;
							cur_channel = i;
							reservation_flag = 1;			
						}			
					}
					
				}
					*/
				////////////////////////////////////////////////////////////////////////////////////////
				////////////////////////////////START of LAUC_VF////////////////////////////////////////		
				////////////////////////////////////////////////////////////////////////////////////////
								finsh_time = start_time + dtime_time;
					
								//channel_infor  = (CHANNEL_INFOR *)op_prg_mem_alloc(sizeof(CHANNEL_INFOR));
								//channel_infor2 = (CHANNEL_INFOR *)op_prg_mem_alloc(sizeof(CHANNEL_INFOR));
								//channel_infor4 = (CHANNEL_INFOR *)op_prg_mem_alloc(sizeof(CHANNEL_INFOR));
				
								selected_channel = -1;
								difference_time = (double)-1;		// -1 : list 狼 夸家啊 0老锭 , -2 : list 狼 盖第俊 嘿老版快 difference_time捞 公茄洒努锭 
								temp_difference_time = (double)-1;	// -1 : list 狼 夸家啊 0老锭 , -2 : list 狼 盖第俊 嘿老版快 difference_time捞 公茄洒努锭
										
								for(i = 1; i < channel_count; i++)
								{
									list_element_num = op_prg_list_size(node_for_schedule.port[cur_port].channel[i].occupy_list);
								//	printf("scu;d_t=%d,t_d_t=%d,s_ch=%d,cur_ch=%d\n",difference_time,temp_difference_time,selected_channel,i);
									if(list_element_num == 0)
									{
										temp_difference_time = (double)-1;
										difference_fuction(&difference_time,&temp_difference_time,&selected_channel,&i);
								//		printf("list_num=0;selected_ch=%d\n",selected_channel);
								//		getchar();
									}
									else if(list_element_num >= 2)
									{
										for(j=0;j<list_element_num-1;j++)
										{
											channel_infor = (CHANNEL_INFOR *)op_prg_list_access(node_for_schedule.port[cur_port].channel[i].occupy_list,j);
											channel_infor2 = (CHANNEL_INFOR *)op_prg_list_access(node_for_schedule.port[cur_port].channel[i].occupy_list,j+1);
								//			printf("list_num >=2;s_time=%e,f_time=%e,ch1->s_time=%e,ch1->d_time=%e,ch2->s_time=%e,ch2->d_time=%e\n",
								//				start_time,finsh_time,channel_infor->start_time,channel_infor->duration_time,
								//				channel_infor2->start_time,channel_infor2->duration_time);
								//			getchar();
											if(channel_infor->duration_time <= start_time && finsh_time <= channel_infor2->start_time)
											{
												temp_difference_time = channel_infor2->start_time - finsh_time;
												difference_fuction(&difference_time,&temp_difference_time,&selected_channel,&i);
											}							
										}
									}
									if(list_element_num >= 1)
									{	
								//		printf("list_num >=1\n");
								//		getchar();
										channel_infor = (CHANNEL_INFOR *)op_prg_list_access(node_for_schedule.port[cur_port].channel[i].occupy_list,list_element_num-1);
										if(channel_infor->duration_time <= start_time)
										{
											temp_difference_time = (double)-2;
											difference_fuction(&difference_time,&temp_difference_time,&selected_channel,&i);
										}
										channel_infor = (CHANNEL_INFOR *)op_prg_list_access(node_for_schedule.port[cur_port].channel[i].occupy_list,0);
										if(channel_infor->start_time > start_time && channel_infor->start_time >= finsh_time)
										{
											temp_difference_time = channel_infor->start_time - finsh_time;
											difference_fuction(&difference_time,&temp_difference_time,&selected_channel,&i);
										}
									}
							
								}	
				////////////////////////////////////////////////////////////////////////////////////////
				////////////////////////////////END of LAUC_VF//////////////////////////////////////////		
				////////////////////////////////////////////////////////////////////////////////////////
				
				// printf("SCU;1\n");		
								
				if(selected_channel > -1)//reservation_flag == 1)
				{
					op_pk_nfd_get (pkptr, "wave_num", &temp_prev_wave_num);
					op_pk_nfd_get (pkptr, "prev userid", &temp_prev_userid);
					
					//op_pk_nfd_set (pkptr, "wave_num", cur_channel);
					op_pk_nfd_set (pkptr, "wave_num", selected_channel);
					op_pk_nfd_set (pkptr, "prev userid", userid);
					op_pk_nfd_set (pkptr, "offset_time",cur_offset_time);
					
				//	printf("SCU;2\n");getchar();
					//node_for_schedule.port[cur_port].channel[cur_channel].horizon = start_time + dtime_time;
					node_for_schedule.port[cur_port].channel[selected_channel].horizon = start_time + dtime_time;
					temp_channel_infor  = (CHANNEL_INFOR *)op_prg_mem_alloc(sizeof(CHANNEL_INFOR));
				//	printf("SCU;2\n");getchar();
					temp_channel_infor->start_time = start_time;
					temp_channel_infor->duration_time = finsh_time;
					temp_channel_infor->source = source_address;
					temp_channel_infor->destination = destination_address;
					//temp_channel_infor->instrm_num = -1;  // becasue of ER node
					
				//	printf("SCU;2,selec_ch=%d\n",selected_channel);getchar();					
					//strm_objid = op_topo_assoc(node_for_schedule.port[cur_port].tx_objid,OPC_TOPO_ASSOC_IN,OPC_OBJTYPE_STRM,cur_channel);
					strm_objid = op_topo_assoc(node_for_schedule.port[cur_port].tx_objid,OPC_TOPO_ASSOC_IN,OPC_OBJTYPE_STRM,selected_channel);
				//	printf("SCU;2\n");getchar();
					op_ima_obj_attr_get(strm_objid,"src stream", &temp_outstrm_num);
				//	printf("SCU;2\n");getchar();
					temp_channel_infor->outstrm_num = temp_outstrm_num;
					
				//	printf("SCU;2\n");getchar();
					op_prg_list_insert(node_for_schedule.port[cur_port].channel[selected_channel].occupy_list,temp_channel_infor,OPC_LISTPOS_TAIL);
					op_prg_list_sort (node_for_schedule.port[cur_port].channel[selected_channel].occupy_list, list_compare);
								
					
						
					//strm_objid = op_topo_assoc(node_for_schedule.port[cur_port].tx_objid,OPC_TOPO_ASSOC_IN,OPC_OBJTYPE_STRM,cur_channel);
					strm_objid = op_topo_assoc(node_for_schedule.port[cur_port].tx_objid,OPC_TOPO_ASSOC_IN,OPC_OBJTYPE_STRM,selected_channel);
					op_ima_obj_attr_get(strm_objid,"src stream", &temp_output_strm_num);
						
					temp_src_objid = op_id_from_userid (subnet_objid, OPC_OBJTYPE_NDFIX,temp_prev_userid);
					temp_dest_objid = op_id_from_userid (subnet_objid, OPC_OBJTYPE_NDFIX, userid);
					link_objid = op_topo_connect (temp_src_objid, temp_dest_objid,OPC_OBJTYPE_LKDUP, 0);
					
				//	printf("SCU;3\n");getchar();
					
					op_ima_obj_attr_get(node_objid,"name",temp_char);			
							
					op_ima_obj_attr_get(link_objid,"receiver a",temp_char1);
					op_ima_obj_attr_get(link_objid,"receiver b",temp_char2);
							
					
					if(temp_char[0] == temp_char1[0] && temp_char[5] == temp_char1[5])
					{
						rx_objid = op_topo_assoc ( link_objid, OPC_TOPO_ASSOC_OUT, OPC_OBJTYPE_PTRX, 0);			
					}	
					else if(temp_char[0] == temp_char2[0] && temp_char[5] == temp_char2[5])
					{
						rx_objid = op_topo_assoc (link_objid, OPC_TOPO_ASSOC_OUT,OPC_OBJTYPE_PTRX, 1);			
					}
					else
					{
				//		printf("not find the tx_objid\n");
					}
							
				//	printf("SCU;4\n");getchar();
					output_strm_objid = op_topo_assoc (rx_objid, OPC_TOPO_ASSOC_OUT,OPC_OBJTYPE_STRM, temp_prev_wave_num);
					op_ima_obj_attr_get (output_strm_objid, "dest stream", &temp_input_strm_num);
				//	printf("SCU;5\n");getchar();
					
					/*
					iciptr = op_ici_create("S_METRIX");
					op_ici_attr_set(iciptr,"s_time",start_time);
					op_ici_attr_set(iciptr,"d_time",dtime_time);
					op_ici_attr_set(iciptr,"input_strum",temp_input_strm_num);
					op_ici_attr_set(iciptr,"output_strum",temp_output_strm_num);
					op_ici_install(iciptr);
					*/
					
					s_metrix_pkptr = op_pk_create_fmt("S_METRIX");
					op_pk_nfd_set (s_metrix_pkptr, "s_time", start_time);	
					op_pk_nfd_set (s_metrix_pkptr, "d_time",dtime_time);
					op_pk_nfd_set (s_metrix_pkptr, "input_strum",temp_input_strm_num);
					op_pk_nfd_set (s_metrix_pkptr, "output_strum",temp_output_strm_num);
					op_pk_send(s_metrix_pkptr,0);
				//	printf("SCU;6\n");getchar();	
					op_pk_send_delayed(pkptr,routing_table[destination_address].strm_control,PROC_TIME);
				//	printf("SCU;7\n");getchar();
					//op_pk_send(pkptr,routing_table[destination_address].strm_control);
					
					//printf("link_id=%e,rx=%e,tx=%e\n",link_objid,op_topo_connect (temp_src_objid, temp_dest_objid,OPC_OBJTYPE_LKDUP, 0),op_topo_connect (temp_dest_objid, temp_src_objid,OPC_OBJTYPE_LKDUP, 0));
					
					//printf("SCU-->Ctrl;in_strm=%d,out_strm=%d,userid=%d,prev_userid=%d\n",temp_input_strm_num,temp_output_strm_num,userid,temp_prev_userid);
					//getchar();
					/*
					temp_occupy_count = op_prg_list_size(node_for_schedule.port[cur_port].channel[cur_channel].occupy_list);
					j=0;
					//printf("SCU->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++;
					}
					*/
					for(i=1;i<channel_count;i++)
					{
						j=0;
						list_element_num = op_prg_list_size(node_for_schedule.port[cur_port].channel[i].occupy_list);
						while( list_element_num > 0 && j < list_element_num)
						{
							channel_infor4 = (CHANNEL_INFOR *)op_prg_list_access(node_for_schedule.port[cur_port].channel[i].occupy_list,j);
							if(cur_time > channel_infor4->duration_time)
							{
								channel_infor4 = op_prg_list_remove(node_for_schedule.port[cur_port].channel[i].occupy_list,j);
								op_prg_mem_free(channel_infor4);
								op_prg_list_sort(node_for_schedule.port[cur_port].channel[i].occupy_list,list_compare);
								list_element_num = op_prg_list_size(node_for_schedule.port[cur_port].channel[i].occupy_list);
								j = 0;
							}
							else
								j++;
						}
					}
				//	printf("SCU-->control_access\n");
				//	getchar();				
				}
				else if(selected_channel == -1)//(reservation_flag == 0)
				{
				//	printf("SCU-->control_access2; failed reservation\n");
					total_bcp_drop_count++;
					op_pk_destroy(pkptr);
					
				//	getchar();
				}	
				else
				{}	
				
				
				//printf("SCU->control_access 2, userid=%d,d_ad=%d,s_time=%e,d_time=%e,op_time=%e,input_strum=%d,link_ojb=%d,rx=%d\n",userid,destination_address,start_time,dtime_time,op_sim_time(),temp_input_strm_num,link_objid,rx_objid);
				//getchar();
				
				
				
				
				
				}


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


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



			/** state (end) enter executives **/
			FSM_STATE_ENTER_UNFORCED (3, state3_enter_exec, "end", "scu () [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 == 0)
				{
				printf("total_bcp_drop_count=%d,userid=%d\n",total_bcp_drop_count,userid);
				strcpy(temp_file_name,"D:/result/");
				strcat(temp_file_name,filename);
				
				in = fopen(temp_file_name,"a");
				fprintf(in,"total_bcp_drop_count = %d \n",total_bcp_drop_count);	
				fclose(in);	 
				}	
				}


			/** blocking after enter executives of unforced state. **/
			FSM_EXIT (7,scu)


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


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



			/** state (R_T_init) enter executives **/
			FSM_STATE_ENTER_FORCED (4, state4_enter_exec, "R_T_init", "scu () [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);
				
				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);
						
						if(op_rte_route_node_n(temp_min_route,1,&subnet_id_ptr,&node_id_ptr)== OPC_COMPCODE_FAILURE)
						{}
						else
						{
							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);
						
						if(op_topo_connect_count (temp_src_objid, temp_dest_objid,OPC_OBJMTYPE_LINK)==1)
						{
							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])
							{
								tx_objid = op_topo_assoc ( link_objid, OPC_TOPO_ASSOC_IN, OPC_OBJTYPE_PTTX, 0);			
							}	
							else if(temp_char[0] == temp_char2[0] && temp_char[5] == temp_char2[5])
							{
								tx_objid = op_topo_assoc (link_objid, OPC_TOPO_ASSOC_IN,OPC_OBJTYPE_PTTX, 1);			
							}
							else
							{
								printf("not find the tx_objid\n");
							}	
							
							/* get the stream id connecting to the transmitter for control channel*/
							strm_objid = op_topo_assoc (tx_objid, OPC_TOPO_ASSOC_IN,OPC_OBJTYPE_STRM, 0);
							/* get the stream number */
							op_ima_obj_attr_get (strm_objid, "src stream", &strm_num);
							temp_flag_tx=1;

⌨️ 快捷键说明

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