// Place global declarations here.
const int HOSTS = 2;
// TIMEOUT Bounds
const int UBOUND = 600;
const int LBOUND = 10;
const int TTL = 600;
// sequence bounds
const int MAX_SEQ = 3;
chan Packet[HOSTS+1];
int target_address; //Global variable to pass the target address to the network
typedef struct {
bool syn;
bool ack;
int win;
int seqNr;
int ackNr;
} TCP_segment;
void initialize(TCP_segment& p)
{
p.win := 0;
p.seqNr := 0;
p.ackNr := 0;
p.syn := false;
p.ack := false;
}
meta TCP_segment to_network;
meta TCP_segment from_network;Networkconst int networkint target; // the target for the current network packet
meta TCP_segment transfer;
clock c;
void set_target() {
target = target_address;
}
void receive_packet(){
transfer := to_network;
initialize(to_network);
}
void send_packet(){
from_network := transfer;
}
PacketLostPacketInTransitReadyToReceiveHost_Handshakeconst int local, const int remote, const int networkclock c;
meta int una = 0;
meta int snd_nxt = 0;
meta int len = 0;
meta int rcv_nxt = 0;
meta TCP_segment retrans;
meta TCP_segment received;
void receive_packet(){
received := from_network;
initialize(from_network);
}
int update_seq(bool syn){
last_seq = (last_seq % MAX_SEQ) +1;
return last_seq;
}
int update_ack(bool ack){
if(!ack)
return 0;
last_ack = received.seqNr;
return last_ack;
}
void reset()
{
last_seq := 0;
last_ack := 0;
initialize(retrans);
initialize(received);
}
void send(bool syn, bool ack) {
target_address = remote;
retrans.syn := syn;
retrans.ack := ack;
retrans.seqNr := update_seq(syn);
retrans.ackNr := update_ack(ack);
to_network := retrans;
}
void retransmit() {
target_address = remote;
to_network := retrans;
}EstablishedSynRcvdSynSentListenClosedNetwork1 = Network(0);
Network2 = Network(0);
Network3 = Network(0);
Network4 = Network(0);
Host1Handshake = Host_Handshake(1,2,0);
Host2Handshake = Host_Handshake(2,1,0);
system Network1, Network2, Network3, Host1Handshake,Host2Handshake;