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

📄 gpr_route_layer.pr.c

📁 opnet Ad hoc仿真源程序,自己构建的路由协议和网络模型
💻 C
📖 第 1 页 / 共 5 页
字号:

				
														if (!EPIDEMIC)
																{
				//filter the ns,if not fit the route,then ignore it


				iWaitValue=IsIn_Right_Direction_NS(pkt_dest_gpr_address,src_gp,iCode);

					

				
																  }
																	else 
																		{
																		iWaitValue=1;
																		}
																	
							
																	
				
							

							if (iCode!=ND_REQEST)
							{

							sprintf(msg,"33333)Rcv mac %d_NS for %d from %d,echo a NA,metirc is %d\n",iCode,pk_id,
								source_gpr_address,iWaitValue);
						GPR_message(msg,10);								

							}
					
		
							if (EPIDEMIC)
								iWaitValue =1;							
				
				if (iWaitValue>-1)
					{

				// Create the NA echo
				pk_NA_ptr=op_pk_create_fmt("GPR_NA");
				op_pk_nfd_set(pk_NA_ptr,"Type",NA_PACKET_TYPE);
				op_pk_nfd_set(pk_NA_ptr,"Code",iCode);
		
				// set the DEST field

				op_pk_nfd_set(pk_NA_ptr,"DEST",source_gpr_address);		
				op_pk_nfd_set(pk_NA_ptr,"DEST_GP",src_gp);	
				op_pk_nfd_set(pk_NA_ptr,"SRC",my_gpr_address);		
				op_pk_nfd_set(pk_NA_ptr,"SRC_GP",my_group_id);	

				op_pk_nfd_set(pk_NA_ptr,"PKT_DEST",pkt_dest_gpr_address);	
				op_pk_nfd_set(pk_NA_ptr,"PKT_DEST_GP",dest_gp_id);					
				op_pk_nfd_set(pk_NA_ptr,"packet_ID",pk_id);	
				

				
				op_pk_nfd_set(pk_NA_ptr,"GP_Metrics",iWaitValue);

				gpr_send_to_mac(pk_NA_ptr,source_gpr_address);



				}
				
				
	}
		else //has seen it
			{
				if (iCode==1)
					{
				sprintf(msg,"mac rcv type %d NS for %d from %d,I have seen it ....................................\n",iCode,pk_id,source_gpr_address);
				//GPR_message(msg,10);
				}	
				}
			

		
		}
	

	//op_pk_destroy (pk_ptr);
	
	
}


void mac_data_arrival(Packet* pk_ptr)
{


//dencap the app data from gpr route packet

int source_gpr_address,destination_gpr_address,pk_id;
int pk_TTL;
Packet * data_pk_ptr;
int size_route,i;
int bAppear,iGP_id;
char field[10];
int iRelay,iNext_hop;




	// extract some usefull information from the data 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, "packet_ID",&pk_id );
	op_pk_nfd_get (pk_ptr, "TTL",&pk_TTL );
	op_pk_nfd_get(pk_ptr,"RELAY",&iRelay);
	op_pk_nfd_get(pk_ptr,"Next_hop",&iNext_hop);




if (my_gpr_address==0&&iRelay==40)
	printf("back flow of a data\n");

//	if (pk_id==SeenPkt[0])
		if ( IsInQueue(pk_id, & my_SeenQueue)!=-1   )
		{

	   	op_pk_destroy(pk_ptr);

	sprintf(msg,"drop a data %d from %d,has seen it\n",pk_id,source_gpr_address);
	GPR_message(msg,10);	
		
		
		return;
		}
	else 
		{
		SeenPkt[0]=pk_id;
		AddItemToQ(pk_id,& my_SeenQueue);
		if (pk_id==0)
			{

			}
		
		}
	



	// if the current node is the destination and the final relay of the packet
	if (my_gpr_address==destination_gpr_address|| destination_gpr_address==GPR_BROADCAST_ADDR )
	{
			
		//decapulate the app data
		op_pk_nfd_get (pk_ptr, "data", &data_pk_ptr);
		op_pk_send( data_pk_ptr,TO_UPPER_LAYER_STRM);
		
		op_stat_write (stat_hop_per_pkt,pk_TTL);
		op_stat_write(stat_total_data_successfully_transmitted,++total_data_successfully_transmitted);

		
		


		
	}
	else//foreward data
	{
		// insert to buffer as its own spawned data . send ns
		//if never seen it

		//set the data flag
		op_ima_obj_attr_set(my_node_id,"Conceived",1);
	
		op_pk_nfd_get (pk_ptr,"Size_Route",&size_route); 	
		if (size_route>0)
		{
		//check if data carry route info
		//route 1
		gpr_update_route(pk_ptr,source_gpr_address);
		//route 2
		gpr_update_route(pk_ptr,destination_gpr_address);
	
		//then check if i was in the group link of the data packect

					bAppear=0;


					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 not within the same group,add the group ,if within,then just fwd without midify
					if (bAppear==0)
						{
						//out of scope, need not fwd it
							sprintf(msg,"drop a data %d from %d,on the wrong way\n",pk_id,source_gpr_address);
							GPR_message(msg,10);		
						   op_pk_destroy(pk_ptr);
						   
						}
					else
						{
	
							//fwd it
	sprintf(msg,"got a data %d from %d,distance %d,histroy %d\n",pk_id,iRelay,
		GP_route_cache[destination_gpr_address].iDistance ,GP_route_cache[destination_gpr_address].iHistory);
	//GPR_message(msg,10);
								op_pk_nfd_set (pk_ptr, "TTL",pk_TTL+1 );	
								GPR_insert_buffer(pk_ptr,destination_gpr_address);
								//send a ns for this pack
								gpr_send_NS_for_route( ND_DATA);
						}

			
			
			
			
			}
		else
			{
			//no route yet
								//buffer it
	sprintf(msg,"got a data %d from %d,no route\n",pk_id,source_gpr_address);
	GPR_message(msg,10);
								op_pk_nfd_set (pk_ptr, "TTL",pk_TTL+1 );	
								GPR_insert_buffer(pk_ptr,destination_gpr_address);
								//send a ns for this pack
								gpr_send_NS_for_route( ND_DATA);
			
								}
	

		
	
		}




}

/*************************************************************/
/*                  Node BUFFER  operation                   */ 
/*************************************************************/
/* This function inserts a data packet waiting to be transmitted
/* in the node buffer (queue) corresponding to its destination
/* 		Packet* pk_ptr: a pointer to the data packet to store 
/* in the buffer
/* 		int destination_GPR_address: the gpr address of the data 
/* packet destination
/*************************************************************/
void GPR_insert_buffer(Packet* pk_ptr, int destination_GPR_address)
{
// enqueue packet in the destination subqueue
if (op_subq_pk_insert(destination_GPR_address,pk_ptr,OPC_QPOS_TAIL)!=OPC_QINS_OK)
	{
	// if there is an error the packet is destroyed
	GPR_message("Error, Can not insert packet in subqueue \n",0);
	op_pk_destroy(pk_ptr);
	}
else
	{
	



	}
}

void GPR_restore_buffer(Packet* pk_ptr, int destination_GPR_address)
{
// enqueue packet in the destination subqueue
if (op_subq_pk_insert(destination_GPR_address,pk_ptr,OPC_QPOS_HEAD)!=OPC_QINS_OK)
	{
	// if there is an error the packet is destroyed
	GPR_message("Error, Can not insert packet in subqueue \n",0);
	op_pk_destroy(pk_ptr);
	}
else
	{
	



	}
}


Packet* gpr_extract_buffer(int destination_gpr_address)
{
Packet* pk_ptr;
// if there is at list one packet in the destination suqueue 
if (op_subq_empty(destination_gpr_address)==OPC_FALSE)
	{
	// extract the first packet from this queue
		GPR_message("extract a pack",1);

	pk_ptr=op_subq_pk_remove(destination_gpr_address,OPC_QPOS_HEAD);

	}
// if there is no packet in the destination subqueue
else
	{
	// will return OPC_NIL
	pk_ptr=OPC_NIL;
	}
// return the packet pointer
return(pk_ptr);
}

int gpr_buffer_empty(int destination_gpr_address)
{
return (op_subq_empty(destination_gpr_address));
}





void GPR_message(const char* message,int iType)
{
	switch (iType)
		{
		case 27:
			if (op_prg_odb_ltrace_active ("debugfwd") == OPC_TRUE)
				{
					printf("%s: ",my_name);
					printf(message);
					printf("\n");
				}		
		break;
		case 10:
			if (op_prg_odb_ltrace_active ("rr") == OPC_TRUE)
				{
					printf("%s: ",my_name);
					printf(message);
					printf("\n");		
				}
		
			break;
		case 2:
			if (op_prg_odb_ltrace_active ("ns") == OPC_TRUE)
				{
					printf("%s: ",my_name);
					printf(message);
					printf("\n");
				}				
		break;
		
		case 3:
			if (op_prg_odb_ltrace_active ("stat") == OPC_TRUE)
				{
					printf("%s: ",my_name);
					printf(message);
					printf("\n");
				}				
		break;
		
		case 4:
			if (op_prg_odb_ltrace_active ("data") == OPC_TRUE)
				{
					printf("%s: ",my_name);
					printf(message);
					printf("\n");
					
				}				
		break;		
		
		case 5:
			if (op_prg_odb_ltrace_active ("request") == OPC_TRUE)
				{
					printf("%s,group %d: ",my_name,my_group_id);
					printf(message);
					printf("\n");
				
				}				
		break;				
		}
	
		
		

}

void gpr_forward_request(Packet* pk_ptr)
{
	
int size_route;
char field[10];
int  bAppear;
int  iGP_id,i;
int destination_gpr_address,pk_id;
sPkBuff iItem;
int iNext_hop,iTTL;
int iPos;

bAppear=0;
iPos=-1;

// read the Size_Route and Seg_Left fields from the request packet
	op_pk_nfd_get (pk_ptr,"Size_Route",&size_route); 
	op_pk_nfd_get(pk_ptr,"DEST",&destination_gpr_address);
	op_pk_nfd_get(pk_ptr,"Seq_number",&pk_id);
	op_pk_nfd_get(pk_ptr,"Next_hop",&iNext_hop);
	op_pk_nfd_get(pk_ptr,"TTL",&iTTL);

// the current node insert its own gorup id to the group link

//check if it appear in the sequence of groups
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;
				iPos=i;
				break;
			}
	
	}

//if not within .the same group,add the group ,if within,then just fwd without midify
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);		
			}



	 }
else
	{
	
	if (iPos<size_route-1)
		return;
	}


	
	//queue the request
	iItem.pkt_id=pk_id;
	iItem.pkt=pk_ptr;
	iItem.iStale=0;
   if ( (iPos=Pkt_Fulsh_Depul_Queue_by_dest(iItem,destination_gpr_address,&q_pkt_req_list) )!=-1 )
		{
		q_pkt_req_list.queue[iPos]=iItem;
		}
	else
		{
		
			Pkt_AddItemToQ(iItem,&q_pkt_req_list);
		}
	
	
	//send ns for the request
	if (iNext_hop==my_gpr_address)
		gpr_send_NS_for_route(ND_REQEST);	
	
	
	

}

void gpr_handle_request(Packet * pk_ptr)
{
int source_gpr_address;
int destination_gpr_address;
int size_route;
int iSequ;
int iPos,iTimeStamp;
Packet * cp_pkptr;
int iNext_hop,iTTL;


// 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,"Seq_number",&iSequ);
op_pk_nfd_get(pk_ptr,"Next_hop",&iNext_hop);
op_pk_nfd_get(pk_ptr,"TTL",&iTTL);

	cp_pkptr = op_pk_copy (pk_ptr);

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

	



	if (my_gpr_address==destination_gpr_address)
		{
			//send a reply

			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

			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;
		
					}
					
			gpr_send_reply(cp_pkptr);
				
		
		}
	else
		{
		

				
					
			//gpr_update_route(pk_ptr,source_gpr_address);	



			size_route=GP_route_cache[destination_gpr_address].size_route;
			iTimeStamp=GP_route_cache[destination_gpr_address].iTimeStamp;
			if (size_route!=0)//has route to the dest then reply proxyly
				{
				//if (op_sim_time()-iTimeStamp<VAL_ROUTE_STALE_TIME)
					gpr_send_reply_proxy(cp_pkptr);
				
				}
			else
				{
					//lable the gp in the request and fwd the request
			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 request %d,current TTL(%d) to %d \n",iSequ,GP_route_cache[source_gpr_address].iDistance,source_gpr_address);
			GPR_message(msg,10);
											
					gpr_forward_request(cp_pkptr);

					
				}
		
		}
	
	
	
	
	
}

void gpr_transmit_request(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;

⌨️ 快捷键说明

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