Skip to content

Commit 7094931

Browse files
ARQ Protocol Implementation
1 parent c64f23f commit 7094931

13 files changed

+250
-1
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.vscode
2+
run_code

ARQ Protocol/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6_19114018.zip

ARQ Protocol/Code/ARQ.c

+177
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <unistd.h>
4+
#include <stdbool.h>
5+
6+
#include "events.h"
7+
#include "interface_functions.h"
8+
9+
// for simulating different testcases include different testcase file headers. (testcase_1.h, testcase_2.h , etc)
10+
// for running custom testcases, you can change the values in the testcase_1.h file
11+
#include "testcase_3.h"
12+
13+
// Utility function to increment the frame number
14+
#define increment_frame_no(k) k = (1 - k);
15+
16+
void receiver();
17+
void sender();
18+
19+
/*
20+
For simulation purpose
21+
turn = true : receiver's turn
22+
turn = false : sender's turn
23+
*/
24+
bool turn;
25+
bool DISCONNECT = false;
26+
27+
int main()
28+
{
29+
srand(seed);
30+
while (DISCONNECT == false)
31+
{
32+
sender();
33+
usleep(800000);
34+
receiver();
35+
}
36+
return 0;
37+
}
38+
39+
void sender()
40+
{
41+
static int next_frame_to_send = 0;
42+
static frame s;
43+
static int flag = 0;
44+
45+
packet buffer;
46+
event_type event;
47+
48+
if (!flag)
49+
{
50+
from_network_layer(&buffer);
51+
s.packet_data = buffer;
52+
s.seq_no = next_frame_to_send;
53+
54+
printf("Sender : Info = %d Seq No = %d\n", s.packet_data.data, s.seq_no);
55+
turn = true;
56+
to_physical_layer(&s);
57+
flag = true;
58+
}
59+
60+
wait_for_event_sender(&event);
61+
62+
if (!turn)
63+
{
64+
switch (event)
65+
{
66+
case frame_arrival:
67+
from_physical_layer(&s);
68+
if (s.ack_no == next_frame_to_send)
69+
{
70+
printf("Sender : Ack No = %d Acknowledgement received Successfully\n", s.ack_no);
71+
if (data > TOT_PACKETS)
72+
{
73+
DISCONNECT = true;
74+
printf("\nProgram executed successfully!!\n"); // when all cases are completed.
75+
return;
76+
}
77+
from_network_layer(&buffer);
78+
increment_frame_no(next_frame_to_send);
79+
80+
s.seq_no = next_frame_to_send;
81+
s.packet_data = buffer;
82+
printf("-------------------------------------------------------------\n");
83+
printf("Sender : Info = %d Seq No = %d\n", s.packet_data.data, s.seq_no);
84+
85+
turn = true;
86+
}
87+
to_physical_layer(&s);
88+
89+
break;
90+
91+
case time_out:
92+
printf("Sender : Resending Frame\n");
93+
94+
turn = true;
95+
to_physical_layer(&s);
96+
97+
break;
98+
99+
default:
100+
break;
101+
}
102+
}
103+
}
104+
105+
void receiver()
106+
{
107+
static int frame_expected = 0;
108+
frame r, s;
109+
event_type event;
110+
111+
wait_for_event_receiver(&event);
112+
if (turn == true)
113+
{
114+
switch (event)
115+
{
116+
case frame_arrival:
117+
from_physical_layer(&r);
118+
if (r.seq_no == frame_expected)
119+
{
120+
to_network_layer(&r.packet_data);
121+
increment_frame_no(frame_expected);
122+
}
123+
else
124+
printf("Receiver : Acknowledgement Resent\n");
125+
126+
s.ack_no = 1 - frame_expected;
127+
turn = 0;
128+
129+
to_physical_layer(&s);
130+
131+
break;
132+
133+
case err:
134+
turn = false; // if frame was damaged during transmission, sender should send it again
135+
printf("Receiver : Damaged Frame Received\n");
136+
break;
137+
138+
default:
139+
break;
140+
}
141+
}
142+
}
143+
144+
void wait_for_event_sender(event_type *e)
145+
{
146+
static int timer = 0;
147+
148+
if (turn == false)
149+
{
150+
timer++;
151+
if (timer == TIMEOUT)
152+
{
153+
printf("Sender : Ack not received => TIMEOUT event occurred\n");
154+
timer = 0;
155+
*e = time_out;
156+
return;
157+
}
158+
if (DATA.err == 0)
159+
*e = err;
160+
else
161+
{
162+
*e = frame_arrival;
163+
timer = 0;
164+
}
165+
}
166+
}
167+
168+
void wait_for_event_receiver(event_type *e)
169+
{
170+
if (turn == true)
171+
{
172+
if (DATA.err == 0)
173+
*e = err;
174+
else
175+
*e = frame_arrival;
176+
}
177+
}

ARQ Protocol/Code/data_struct.h

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
typedef struct
2+
{
3+
int data;
4+
} packet;
5+
6+
typedef struct
7+
{
8+
int kind;
9+
int seq_no;
10+
int ack_no;
11+
packet packet_data;
12+
int err;
13+
} frame;

ARQ Protocol/Code/events.h

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
typedef enum
2+
{
3+
frame_arrival,
4+
err,time_out,
5+
no_event
6+
} event_type;
7+
8+
9+
void wait_for_event_sender(event_type *);
10+
void wait_for_event_receiver(event_type *);
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
#include "data_struct.h"
5+
6+
7+
frame DATA;
8+
int data = 1;
9+
10+
void from_network_layer(packet *buffer)
11+
{
12+
(*buffer).data = data;
13+
data++;
14+
}
15+
16+
17+
void to_physical_layer(frame *s)
18+
{
19+
s->err = rand() % 4; // 0 is for error, otherwise no error occurred in transmission
20+
DATA = *s;
21+
}
22+
23+
void to_network_layer(packet *buffer)
24+
{
25+
printf("Receiver : Packet %d received , Ack Sent\n", (*buffer).data);
26+
}
27+
28+
void from_physical_layer(frame *buffer)
29+
{
30+
*buffer = DATA;
31+
}

ARQ Protocol/Code/testcase_1.h

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// parameters of simulation
2+
const int seed = 9;
3+
#define TOT_PACKETS 10
4+
#define TIMEOUT 3
5+
6+
7+

ARQ Protocol/Code/testcase_2.h

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// parameters of simulation
2+
const int seed = 2;
3+
#define TOT_PACKETS 12
4+
#define TIMEOUT 2

ARQ Protocol/Code/testcase_3.h

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// parameters of simulation
2+
const int seed = 400;
3+
#define TOT_PACKETS 8
4+
#define TIMEOUT 4
78.7 KB
Loading
81.3 KB
Loading
61.1 KB
Loading

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# Computer-Networks-Lab
2-
Lab Project for Computer Networks Laboratory (CSN-361) Course
2+
Lab Project(s) for Computer Networks Laboratory (CSN-361) Course

0 commit comments

Comments
 (0)