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

📄 gpr_route_layer.pr.c

📁 opnet Ad hoc仿真源程序,自己构建的路由协议和网络模型
💻 C
📖 第 1 页 / 共 5 页
字号:
	AddItemToQ(iSeq,& q_request_list);//see this request


	//queue the request
	iItem.pkt_id=iSeq;
	iItem.pkt=pk_ptr;
	iItem.iStale=0;
	Pkt_AddItemToQ(iItem,&q_pkt_req_list);
	//send ns for the request
	gpr_send_NS_for_route(ND_REQEST);	


	printf("Node %s will issue a request\n",my_name);//

	sprintf(msg,"Node %d will issue a request\n",my_gpr_address);//reply proxyly
	//GPR_message(msg,10);
	
}	


void gpr_transmit_request_repeat(int destination_gpr_address)
{
Packet* pk_ptr;
sPkBuff iItem;
int iSeq;
	
	pk_ptr=op_pk_create_fmt("GPR_Request");
	op_pk_nfd_set(pk_ptr,"Type",REQUET_PACKET_TYPE);
	op_pk_nfd_set(pk_ptr,"SRC",my_gpr_address);


	op_pk_nfd_set(pk_ptr,"DEST",destination_gpr_address);
	op_pk_nfd_set(pk_ptr,"GP_0",my_group_id);
	op_pk_nfd_set(pk_ptr,"Size_Route",1);
	op_pk_nfd_set(pk_ptr,"SRC_GP",my_group_id);	

	op_pk_nfd_set(pk_ptr,"Seq_number",++g_pkt_id);
	op_pk_nfd_set(pk_ptr,"TTL",0);

	iSeq=g_pkt_id;
	AddItemToQ(iSeq,& q_request_list);//see this request


	//queue the request
	iItem.pkt_id=iSeq;
	iItem.pkt=pk_ptr;
	iItem.iStale=0;
	Pkt_AddItemToQ(iItem,&q_pkt_req_list);
		
	sprintf(msg,"Node %d will issue a request proxy\n",my_gpr_address);//reply proxyly
//	GPR_message(msg,10);
}	


void gpr_send_reply_proxy(Packet* pk_ptr)
{

int request_source_gpr_address;
int size_route,iSeq;
int i;
char field[10];
int iGP_id;
sPkBuff iItem;
int iTTL;



int dest_address,iDest_gp;


op_pk_nfd_get(pk_ptr,"SRC",&request_source_gpr_address);
op_pk_nfd_get(pk_ptr,"SRC_GP",&iGP_id);
op_pk_nfd_get(pk_ptr,"DEST",&dest_address);
op_pk_nfd_get(pk_ptr,"DEST_GP",&iDest_gp); 

iSeq=++g_pkt_id;	//set the new seq for reply
op_pk_nfd_set(pk_ptr,"Seq_number",iSeq);

op_pk_nfd_set(pk_ptr,"Type",REPLY_PACKET_TYPE);
op_pk_nfd_set(pk_ptr,"SRC",dest_address);
op_pk_nfd_set(pk_ptr,"SRC_GP",iDest_gp);

op_pk_nfd_get(pk_ptr,"Size_Route",&size_route);
op_pk_nfd_set(pk_ptr,"DEST",request_source_gpr_address);
op_pk_nfd_set(pk_ptr,"DEST_GP",&iGP_id); 

iTTL=GP_route_cache[dest_address].iDistance;
op_pk_nfd_set (pk_ptr, "TTL",iTTL);//fordge the ttl

	size_route=GP_route_cache[dest_address].size_route;
						if (size_route!=0)
						{
							for (i=0;i<size_route;i++)
							{
									sprintf(field,"GP_%d",i);
									op_pk_nfd_set(pk_ptr,field,GP_route_cache[dest_address].Gp_route[i] );

							}
				
							op_pk_nfd_set (pk_ptr,"Size_Route",size_route); 					
						
			
						}

		  



					
			
	AddItemToQ(iSeq,& q_reply_list);//see this request


	//queue the reply
	iItem.pkt_id=iSeq;
	iItem.pkt=pk_ptr;
	iItem.iStale=0;
	Pkt_AddItemToQ(iItem,&q_pkt_reply_list);
	//send ns for the request
	gpr_send_NS_for_route(ND_REPLY);	
	

	sprintf(msg,"Node %d will reply proxyly\n",my_gpr_address);//reply proxyly
//	GPR_message(msg,10);
	
}


void gpr_send_reply(Packet* pk_ptr)
{

int request_source_gpr_address;
int size_route,iSeq;
int i;
char field[10];
int bAppear,iGP_id;
sPkBuff iItem;
int iPos;

bAppear=0;

op_pk_nfd_get(pk_ptr,"SRC",&request_source_gpr_address);
op_pk_nfd_get(pk_ptr,"SRC_GP",&iGP_id);

iSeq=++g_pkt_id;	//set the new seq for reply
op_pk_nfd_set(pk_ptr,"Seq_number",iSeq);

op_pk_nfd_set(pk_ptr,"Type",REPLY_PACKET_TYPE);
op_pk_nfd_set(pk_ptr,"SRC",my_gpr_address);
op_pk_nfd_set(pk_ptr,"SRC_GP",my_group_id);

op_pk_nfd_get(pk_ptr,"Size_Route",&size_route);
op_pk_nfd_set(pk_ptr,"DEST",request_source_gpr_address);
op_pk_nfd_set(pk_ptr,"DEST_GP",&iGP_id); 
op_pk_nfd_set (pk_ptr, "TTL",0);//resume the ttl


	AddItemToQ(iSeq,& q_reply_list);//see this request

for (i=0;i<size_route;i++)
	{
		
		sprintf(field,"GP_%d",i);
		op_pk_nfd_get (pk_ptr,field,&iGP_id);	
		if (iGP_id==my_group_id)
			{
				bAppear=1;
				break;
			}
	
	}

//if diff group, add its group name to the gp link
if (bAppear==0)
	{
	
		if (size_route< MAX_SIZE_GROUP_LINK-1)
			{
			
		sprintf(field,"GP_%d",size_route);
		op_pk_nfd_set (pk_ptr,field,my_group_id);
	   // increment by one the Size_Route field of the packet
		op_pk_nfd_set(pk_ptr,"Size_Route",++size_route);
		}
		else
			{
			
			sprintf(field,"GP_%d",MAX_SIZE_GROUP_LINK-1);
			op_pk_nfd_set (pk_ptr,field,my_group_id);
			// increment by one the Size_Route field of the packet
			op_pk_nfd_set(pk_ptr,"Size_Route",MAX_SIZE_GROUP_LINK);		
			}
		

	 }

		//learn the route

			//gpr_update_route(pk_ptr,destination_gpr_address);
			//route 2
			if ( GP_route_cache[request_source_gpr_address].size_route!=0)//better one?
				{
					//no chg
					sprintf(msg,"old route to %d,len is %d(%d)!\n",request_source_gpr_address,size_route,GP_route_cache[request_source_gpr_address].size_route);
					//GPR_message(msg,5);	
				}
			else
				{
				
					
					iPos=-1;
					//printf("node %d learn path len %d from the request:",my_gpr_address,size_route);
					//better one,wrtie the route cache
					for (i=0;i<size_route;i++)
						{
							sprintf(field,"GP_%d",i);
							op_pk_nfd_get(pk_ptr,field,&iGP_id);
							GP_route_cache[request_source_gpr_address].Gp_route[i] = iGP_id ;
							printf("%d->",iGP_id);	
							if (iGP_id==my_group_id)
								iPos=i;										   
					   	}	
					printf("Node %s Echo a reply,time:%.2f\n",my_name,op_sim_time());
					
					GP_route_cache[request_source_gpr_address].size_route=size_route;
					GP_route_cache[request_source_gpr_address].iTimeStamp=op_sim_time();
					
				 }			
		///////////////
			




	//queue the reply
	iItem.pkt_id=iSeq;
	iItem.pkt=pk_ptr;
	iItem.iStale=0;
	Pkt_AddItemToQ(iItem,&q_pkt_reply_list);
	//send ns for the request
	gpr_send_NS_for_route(ND_REPLY);	
	

	//gpr_send_to_mac(pk_ptr,GPR_BROADCAST_ADDR);
}


/////////////
void  gpr_handle_reply(Packet* pk_ptr)
{
int source_gpr_address;
int destination_gpr_address;
int size_route,iGP_id;
int iSeq;
char field[10];
int iPos;
int iNext_hop,iRelay,iTTL;
int i;


// read the different fields of the packet
op_pk_nfd_get (pk_ptr,"SRC",&source_gpr_address);
op_pk_nfd_get (pk_ptr,"DEST",&destination_gpr_address); 
op_pk_nfd_get (pk_ptr,"Size_Route",&size_route); 
op_pk_nfd_get(pk_ptr,"Seq_number",&iSeq);
op_pk_nfd_get(pk_ptr,"RELAY",&iRelay);
op_pk_nfd_get(pk_ptr,"TTL",&iTTL);
	op_pk_nfd_get(pk_ptr,"Next_hop",&iNext_hop);

	//have ever seen it
	iPos=IsInQueue(iSeq, & q_reply_list);
	if (iPos==-1)
	{//never seen it then see it
	//if (iNext_hop==my_gpr_address)
		AddItemToQ(iSeq,& q_reply_list);
		op_ima_obj_attr_set(my_node_id,"Conceived",1);
		
				
	}
	else
		{
			return;
		
		
		}
	
	if (source_gpr_address==my_gpr_address)
		return;




	printf("%s hear a reply..\n",my_name);
	if ( (GP_route_cache[source_gpr_address].iDistance==-1)||(GP_route_cache[source_gpr_address].iDistance>=iTTL) )
		GP_route_cache[source_gpr_address].iDistance=iTTL;//move to gpr_update_route
	else
		return;
	
	if (GP_route_cache[source_gpr_address].iExpectedVal==0)
		{
		GP_route_cache[source_gpr_address].iExpectedVal= (MAX_SIZE_TTL-GP_route_cache[source_gpr_address].iDistance)*1000;
		
		}
	
	sprintf(msg,"hear reply %d from %d,TTL %d(%d) to %d",
		iSeq,iRelay,
		iTTL,GP_route_cache[source_gpr_address].iDistance,	
		iNext_hop);
	GPR_message(msg,10);	
	
	printf("%s fwd the reply..\n",my_name);
	
		////////////////
		//node on the path will learn the group link infor in the reply
			//update the route cache, intermidiate node will learn 2 route to 2 end of link
			//gpr_update_route(pk_ptr,source_gpr_address);
			//route 1
			if ( GP_route_cache[source_gpr_address].size_route!=0)//better one?
				{
					//no chg
					sprintf(msg,"old route to %d,len is %d(%d)!\n",source_gpr_address,size_route,GP_route_cache[source_gpr_address].size_route);
					//GPR_message(msg,5);	
				}
			else
				{
				
//					printf("node %d learn path1 len %d from the reply:",my_gpr_address,size_route);
					iPos=-1;
					//better one,wrtie the route cache
					for (i=0;i<size_route;i++)
						{
							sprintf(field,"GP_%d",i);
							op_pk_nfd_get(pk_ptr,field,&iGP_id);
							GP_route_cache[source_gpr_address].Gp_route[i] = iGP_id ;
							//printf("%d->",iGP_id);	
							if (iGP_id==my_group_id)
								iPos=i;
										   
					   	}	
					//printf("..\n");
					op_prg_odb_bkpt("reply");
					
					GP_route_cache[source_gpr_address].size_route=size_route;//size_route-iPos;
					
				 }
			//gpr_update_route(pk_ptr,destination_gpr_address);
			//route 2
			if ( GP_route_cache[destination_gpr_address].size_route!=0)//better one?
				{
					//no chg
					
				
						
				}
			else
				{
				
					//printf("Node %d learn from reply,route to %d is:.!\n",my_group_id,source_gpr_address);
					iPos=-1;
					//printf("node %d learn path2 len %d from the reply:",my_gpr_address,size_route);
					//better one,wrtie the route cache
					for (i=0;i<size_route;i++)
						{
							sprintf(field,"GP_%d",i);
							op_pk_nfd_get(pk_ptr,field,&iGP_id);
							GP_route_cache[destination_gpr_address].Gp_route[i] = iGP_id ;
							//printf("%d->",iGP_id);	
							if (iGP_id==my_group_id)
								iPos=i;										   
					   	}	
			
					
					GP_route_cache[destination_gpr_address].size_route=size_route;//iPos+1;
					
				 }			
		///////////////
		

	if (my_gpr_address==destination_gpr_address)
		{

			printf("node %d got the reply,time:%.2f\n",my_gpr_address,op_sim_time());
			op_prg_odb_bkpt("route");			
								
			for (i=0;i<size_route;i++)
						{
							sprintf(field,"GP_%d",i);
							op_pk_nfd_get(pk_ptr,field,&iGP_id);
							GP_route_cache[destination_gpr_address].Gp_route[i] = iGP_id ;
							printf("%d->",iGP_id);	
							if (iGP_id==my_group_id)
								iPos=i;										   
					   	}	
			printf("..\n");
			
			op_pk_destroy (pk_ptr);
		

			
		
		}
	else
		{
		

			if (iNext_hop==my_gpr_address)//
				{
				
							
					gpr_forward_reply(pk_ptr);
				}
			else
				{
					
					
				}
		
		}
	
	
	
	
	
	


}

void gpr_forward_reply(Packet* pk_ptr)
{	

int i;
char field[10];
int bAppear;
sPkBuff iItem;


int destination_gpr_address;
int size_route,iGP_id;
int iSeq;


// read the different fields of the packet

op_pk_nfd_get (pk_ptr,"DEST",&destination_gpr_address); 
op_pk_nfd_get (pk_ptr,"Size_Route",&size_route); 
op_pk_nfd_get(pk_ptr,"Seq_number",&iSeq);

bAppear=0;


op_pk_nfd_get(pk_ptr,"Size_Route",&size_route);

for (i=0;i<size_route;i++)
	{
		
		sprintf(field,"GP_%d",i);
		op_pk_nfd_get (pk_ptr,field,&iGP_id);	
		if (iGP_id==my_group_id)
			{
				bAppear=1;
				break;
			}
	
	}


if (bAppear==0)
	{
		//out of scope, need not fwd it


	 }
else
	{
	
		//has see this reply in handle fun


		//queue the reply
		iItem.pkt_id=iSeq;
		iItem.pkt=pk_ptr;
		iItem.iStale=0;
		Pkt_AddItemToQ(iItem,&q_pkt_reply_list);
		//send ns for the reply
		
		gpr_send_NS_for_route(ND_REPLY);	

	}


}


void gpr_update_route(Packet * pk_ptr,int destination_gpr_address)
{

int size_route,i;
int iGP_id;
char field[10];
int iPos;

		op_pk_nfd_get (pk_ptr,"Size_Route",&size_route); 
		
			
		if (size_route==0)
			{
				return;
			}

					
		iPos=-1;
					//better one,wrtie the route cache
	for (i=0;i<size_route;i++)
	{
		sprintf(field,"GP_%d",i);
		op_pk_nfd_get(pk_ptr,field,&iGP_id);
		GP_route_cache[destination_gpr_address].Gp_route[i] = iGP_id ;
		if (iGP_id==my_group_id)
				iPos=i;
										   
	}	

					
	GP_route_cache[destination_gpr_address].size_route=size_route;//size_route-iPos;
	GP_route_cache[destination_gpr_address].iTimeStamp=op_sim_time();
					
}

/* End of Function Block */

/* Undefine optional tracing in FIN/FOUT/FRET */
/* The FSM has its own tracing code and the other */
/* functions should not have any tracing.		  */
#undef FIN_TRACING
#define FIN_TRACING

#undef FOUTRET_TRACING
#define FOUTRET_TRACING

#if defined (__cplusplus)
extern "C" {
#endif
	void gpr_route_layer (OP_SIM_CONTEXT_ARG_OPT);
	VosT_Obtype gpr_route_layer_init (int * init_block_ptr);
	VosT_Address gpr_route_layer_alloc (VOS_THREAD_INDEX_ARG_COMMA VosT_Obtype, int);
	void gpr_route_layer_diag (OP_SIM_CONTEXT_ARG_OPT);
	void gpr_route_layer_terminate (OP_SIM_CONTEXT_ARG_OPT);
	void gpr_route_layer_svar (void *, const char *, void **);


	VosT_Fun_Status Vos_Define_Object (VosT_Obtype * obst_ptr, const char * name, unsigned int size, unsigned int init_obs, unsigned int inc_obs);
	VosT_Address Vos_Alloc_Object_MT (VOS_THREAD_INDEX_ARG_COMMA VosT_Obtype ob_hndl);
	VosT_Fun_Status Vos_Poolmem_Dealloc_MT (VOS_THREAD_INDEX_ARG_COMMA VosT_Address ob_ptr);
#if defined (__cplusplus)
} /* end of 'extern "C"' */
#endif




/* Process model interrupt handling procedure */


void
gpr_route_layer (OP_SIM_CONTEXT_ARG_OPT)
	{

#if !defined (VOSD_NO_FIN)
	int _op_block_origin = 0;
#endif
	FIN_MT (gpr_route_layer ());
	if (1)
		{
		Packet * pk_ptr;
		Ici* ici_dest_address;
		int packet_type;
		
		List*				proc_record_handle_list_ptr;
		int					record_handle_list_size;
		OmsT_Pr_Handle		process_record_handle;
		Objid				mac_module_objid;
		double				ne_address = OPC_DBL_UNDEF;
		


		FSM_ENTER ("gpr_route_layer")

		FSM_BLOCK_SWITCH
			{
			/*---------------------------------------------------------*/
			/** state (pre_ini) enter executives **/
			FSM_STATE_ENTER_UNFORCED_NOLABEL (0, "pre_ini", "gpr_route_layer [pre_ini enter execs]")
				FSM_PROFILE_SECTION_IN (gpr_route_layer [pre_ini enter execs], state0_enter_exec)
				{
				
					char msg[50];
					int i,iPos;
				
				
				
				
				
				
				// ensure that each node has finised its pre-initialization before going in the init sate
				
				
					my_module_id=op_id_self();

⌨️ 快捷键说明

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