You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							153 lines
						
					
					
						
							6.2 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							153 lines
						
					
					
						
							6.2 KiB
						
					
					
				| // IPv4: PTA model with digitial clocks | |
| // multi-objective model of the host | |
| // gxn/dxp 28/09/09 | |
| 
 | |
| mdp | |
| 
 | |
| //------------------------------------------------------------- | |
| // VARIABLES | |
| const int N=20; // number of abstract hosts | |
| const int K=4; // number of probes to send | |
| 
 | |
| // PROBABILITIES | |
| const double old = N/65024; // probability pick an ip address being used | |
| //const double old = 0.5; // probability pick an ip address being used | |
| const double new = (1-old); // probability pick a new ip address | |
| 
 | |
| // TIMING CONSTANTS | |
| const int CONSEC = 2;  // time interval between sending consecutive probles  | |
| const int TRANSTIME = 1; // upper bound on transmission time delay | |
| const int LONGWAIT = 60; // minimum time delay after a high number of address collisions | |
| const int DEFEND = 10; | |
| 
 | |
| const int TIME_MAX_X = 60; // max value of clock x | |
| const int TIME_MAX_Y = 10; // max value of clock y | |
| const int TIME_MAX_Z = 1;  // max value of clock z | |
| 
 | |
| // OTHER CONSTANTS | |
| const int MAXCOLL = 10;  // maximum number of collisions before long wait | |
| const int M=1; // time between sending and receiving a message | |
| 
 | |
| 
 | |
| //------------------------------------------------------------- | |
| // CONCRETE HOST | |
| module host0 | |
| 	 | |
| 	x : [0..TIME_MAX_X]; // first clock of the host | |
| 	y : [0..TIME_MAX_Y]; // second clock of the host | |
| 	 | |
| 	coll : [0..MAXCOLL]; // number of address collisions | |
| 	probes : [0..K]; // counter (number of probes sent) | |
| 	mess : [0..1]; // need to send a message or not | |
| 	defend : [0..1]; // defend (if =1, try to defend IP address) | |
| 	 | |
| 	ip : [1..2]; // ip address (1 - in use & 2 - fresh) | |
| 	 | |
| 	l : [0..4] init 1; // location | |
| 	// 0 : RECONFIGURE  | |
| 	// 1 : RANDOM | |
| 	// 2 : WAITSP | |
| 	// 3 : WAITSG  | |
| 	// 4 : USE | |
| 	 | |
| 	// RECONFIGURE | |
| 	[reset] l=0 -> (l'=1); | |
| 	 | |
| 	// RANDOM (choose IP address) | |
| 	[rec0] (l=1) -> true; // get message (ignore since have no ip address) | |
| 	[rec1] (l=1) -> true; // get message (ignore since have no ip address) | |
| 	// small number of collisions (choose straight away) | |
| 	[] l=1 & coll<MAXCOLL -> 1/3*old : (l'=2) & (ip'=1) & (x'=0)  | |
| 		                     + 1/3*old : (l'=2) & (ip'=1) & (x'=1)  | |
| 		                     + 1/3*old : (l'=2) & (ip'=1) & (x'=2)  | |
| 		                     + 1/3*new : (l'=2) & (ip'=2) & (x'=0)  | |
| 		                     + 1/3*new : (l'=2) & (ip'=2) & (x'=1)  | |
| 		                     + 1/3*new : (l'=2) & (ip'=2) & (x'=2);  | |
| 	// large number of collisions: (wait for LONGWAIT) | |
| 	[time] l=1 & coll=MAXCOLL & x<LONGWAIT -> (x'=min(x+1,TIME_MAX_X)); | |
| 	[]     l=1 & coll=MAXCOLL & x=LONGWAIT -> 1/3*old : (l'=2) & (ip'=1) & (x'=0)  | |
| 			                                   + 1/3*old : (l'=2) & (ip'=1) & (x'=1)  | |
| 			                                   + 1/3*old : (l'=2) & (ip'=1) & (x'=2)  | |
| 			                                   + 1/3*new : (l'=2) & (ip'=2) & (x'=0)  | |
| 			                                   + 1/3*new : (l'=2) & (ip'=2) & (x'=1)  | |
| 			                                   + 1/3*new : (l'=2) & (ip'=2) & (x'=2); | |
| 	 | |
| 	// WAITSP  | |
| 	// let time pass | |
| 	[time]  l=2 & x<2 -> (x'=min(x+1,2)); | |
| 	// send probe | |
| 	[send1] l=2 & ip=1 & x=2  & probes<K -> (x'=0) & (probes'=probes+1); | |
| 	[send2] l=2 & ip=2 & x=2  & probes<K -> (x'=0) & (probes'=probes+1); | |
| 	// sent K probes and waited 2 seconds | |
| 	[] l=2 & x=2 & probes=K -> (l'=3) & (probes'=0) & (coll'=0) & (x'=0); | |
| 	// get message and ip does not match: ignore | |
| 	[rec0] l=2 & ip!=0 -> (l'=l); | |
| 	[rec1] l=2 & ip!=1 -> (l'=l); | |
| 	// get a message with matching ip: reconfigure | |
| 	[rec1] l=2 & ip=1 -> (l'=0) & (coll'=min(coll+1,MAXCOLL)) & (x'=0) & (probes'=0); | |
| 	 | |
| 	// WAITSG (sends two gratuitious arp probes) | |
| 	// time passage | |
| 	[time] l=3 & mess=0 & defend=0 & x<CONSEC -> (x'=min(x+1,TIME_MAX_X));  | |
| 	[time] l=3 & mess=0 & defend=1 & x<CONSEC -> (x'=min(x+1,TIME_MAX_X)) & (y'=min(y+1,DEFEND)); | |
| 	 | |
| 	// receive message and same ip: defend | |
| 	[rec1] l=3 & mess=0 & ip=1 & (defend=0 | y>=DEFEND) -> (defend'=1) & (mess'=1) & (y'=0); | |
| 	// receive message and same ip: defer | |
| 	[rec1] l=3 & mess=0 & ip=1 & (defend=0 | y<DEFEND) -> (l'=0) & (probes'=0) & (defend'=0) & (x'=0) & (y'=0); | |
| 	// receive message and different ip | |
| 	[rec0] l=3 & mess=0 & ip!=0 -> (l'=l); | |
| 	[rec1] l=3 & mess=0 & ip!=1 -> (l'=l); | |
| 	 | |
| 		 | |
| 	// send probe reply or message for defence | |
| 	[send1] l=3 & ip=1 & mess=1 -> (mess'=0); | |
| 	[send2] l=3 & ip=2 & mess=1 -> (mess'=0); | |
| 	// send first gratuitous arp message | |
| 	[send1] l=3 & ip=1 & mess=0 & x=CONSEC & probes<1 -> (x'=0) & (probes'=probes+1); | |
| 	[send2] l=3 & ip=2 & mess=0 & x=CONSEC & probes<1 -> (x'=0) & (probes'=probes+1); | |
| 	// send second gratuitous arp message (move to use) | |
| 	[send1] l=3 & ip=1 & mess=0 & x=CONSEC & probes=1 -> (l'=4) & (x'=0) & (y'=0) & (probes'=0); | |
| 	[send2] l=3 & ip=2 & mess=0 & x=CONSEC & probes=1 -> (l'=4) & (x'=0) & (y'=0) & (probes'=0); | |
| 	 | |
| 	// USE (only interested in reaching this state so do not need to add anything here) | |
| 	[] l=4 -> true; | |
| 	 | |
| endmodule | |
| 
 | |
| //------------------------------------------------------------- | |
| // error automaton for the environment assumption | |
| // do not get a reply when K probes are sent | |
| 
 | |
| module env_error4 | |
| 
 | |
| 	env : [0..1]; // 0 active and 1 done | |
| 	k : [0..4]; // counts the number of messages sent | |
| 	c1 : [0..M+1]; // time since first message | |
| 	c2 : [0..M+1]; // time since second message | |
| 	c3 : [0..M+1]; // time since third message | |
| 	c4 : [0..M+1]; // time since fourth message | |
| 	error : [0..1]; | |
| 
 | |
| 	// message with new ip address arrives so done | |
| 	[send2] error=0 & env=0 -> (env'=1); | |
| 	// message with old ip address arrives so count | |
| 	[send1] error=0 & env=0 -> (k'=min(k+1,K)); | |
| 	// time passgae so update relevant clocks | |
| 	[time] error=0 & env=0 & k=0 -> true; | |
| 	[time] error=0 & env=0 & k=1 & min(c1,c2,c3,c4)<M -> (c1'=min(c1+1,M+1)); | |
| 	[time] error=0 & env=0 & k=2 & min(c1,c2,c3,c4)<M -> (c1'=min(c1+1,M+1)) & (c2'=min(c2+1,M+1)); | |
| 	[time] error=0 & env=0 & k=3 & min(c1,c2,c3,c4)<M -> (c1'=min(c1+1,M+1)) & (c2'=min(c2+1,M+1)) & (c3'=min(c3+1,M+1)); | |
| 	[time] error=0 & env=0 & k=4 & min(c1,c2,c3,c4)<M -> (c1'=min(c1+1,M+1)) & (c2'=min(c2+1,M+1)) & (c3'=min(c3+1,M+1)) & (c4'=min(c4+1,M+1)); | |
| 	// all clocks reached their bound so an error | |
| 	[time] error=0 & env=0 & min(c1,c2,c3,c4)=M -> (error'=1);  | |
| 	// send a reply (then done) | |
| 	[rec1] error=0 & env=0 & k>0 & min(c1,c2,c3,c4)<=M -> (env'=1); | |
| 	// finished so any action can be performed | |
| 	[time]  error=1 | env=1 -> true; | |
| 	[send1]  error=1 | env=1 -> true; | |
| 	[send2]  error=1 | env=1 -> true; | |
| 	[send2]  error=1 | env=1 -> true; | |
| 	[rec1]  error=1 | env=1 -> true; | |
| 
 | |
| endmodule
 |