@@ -21,7 +21,7 @@ void handle_alarm(int sig){
21
21
* Reset current packet to the beginning of window
22
22
* thus resending all paeckets in the window */
23
23
printf ("RETRY: %d\n" ,state .retry );
24
- if (state .retry <= 5 ){
24
+ if (state .retry < MAX_RETRY_ATTEMPTS ){
25
25
state .seq_curr = state .seq_base ;
26
26
state .retry ++ ;
27
27
state .win_size = 1 ;
@@ -36,6 +36,24 @@ void handle_alarm(int sig){
36
36
return ;
37
37
}
38
38
39
+ void handle_close_alarm (int sig ){
40
+ /*Signal handler for when a data packet times out.
41
+ * Reset current packet to the beginning of window
42
+ * thus resending all paeckets in the window */
43
+ printf ("CONNECTION TEARDOWN RETRY: %d\n" ,state .retry );
44
+ if (state .retry < MAX_RETRY_ATTEMPTS ){
45
+ if (state .state == FIN_SENT ){
46
+ state .state = ESTABLISHED ;
47
+ }
48
+ state .retry ++ ;
49
+ }
50
+ else {
51
+ printf ("ERROR: Exceeded retry limit. Check for connection error!\n" );
52
+ return ;
53
+ }
54
+ return ;
55
+ }
56
+
39
57
ssize_t gbn_send (int sockfd , const void * buf , size_t len , int flags ){
40
58
state .win_size = 1 ;
41
59
state .retry = 0 ;
@@ -68,20 +86,25 @@ ssize_t gbn_send(int sockfd, const void *buf, size_t len, int flags){
68
86
reset_alrm = false;
69
87
}
70
88
if (state .seq_curr - 1 == packet_num && len %DATALEN > 0 ){
71
- data_packet -> checksum = checksum (data_packet , (len %DATALEN + sizeof (data_packet -> type )+ sizeof (data_packet -> seqnum )+ sizeof (data_packet -> checksum ) )/ sizeof (uint16_t ));
72
- }else {
89
+ uint8_t temp [DATALEN ];
90
+ memset (temp ,0 ,DATALEN );
91
+ memcpy (temp ,data_packet -> data ,len %DATALEN );
92
+ memcpy (data_packet -> data ,temp ,DATALEN );
93
+ //data_packet->checksum = checksum(data_packet, (len%DATALEN + sizeof(data_packet->type)+ sizeof(data_packet->seqnum)+ sizeof(data_packet->checksum) )/ sizeof(uint16_t));
94
+ data_packet -> checksum = checksum (data_packet , sizeof (* data_packet ) / sizeof (uint16_t ));
95
+ }else {
73
96
data_packet -> checksum = checksum (data_packet , sizeof (* data_packet ) / sizeof (uint16_t ));
74
97
}
75
98
printf ("INFO: Checksum of packet: %d\n" ,data_packet -> checksum );
76
99
77
100
if (state .seq_curr - 1 == packet_num ){
78
101
if (len %DATALEN > 0 )
79
- status = maybe_sendto (sockfd ,data_packet ,5 + len %DATALEN ,0 ,state .address ,state .socklen );
102
+ status = sendto (sockfd ,data_packet ,5 + len %DATALEN ,0 ,state .address ,state .socklen );
80
103
else
81
- status = maybe_sendto (sockfd ,data_packet ,sizeof (* data_packet ),0 ,state .address ,state .socklen );
104
+ status = sendto (sockfd ,data_packet ,sizeof (* data_packet ),0 ,state .address ,state .socklen );
82
105
state .win_size = 1 ;
83
106
}else if (state .seq_curr - 1 < packet_num )
84
- status = maybe_sendto (sockfd ,data_packet ,sizeof (* data_packet ),0 ,state .address ,state .socklen );
107
+ status = sendto (sockfd ,data_packet ,sizeof (* data_packet ),0 ,state .address ,state .socklen );
85
108
86
109
if (status == -1 ){
87
110
printf ("ERROR: DATA packet %d send failed.\n" ,state .seq_curr - 1 );
@@ -114,6 +137,7 @@ ssize_t gbn_send(int sockfd, const void *buf, size_t len, int flags){
114
137
115
138
116
139
}
140
+
117
141
return (0 );
118
142
}
119
143
@@ -163,7 +187,7 @@ ssize_t gbn_recv(int sockfd, void *buf, size_t len, int flags){
163
187
is_seq = false;
164
188
}
165
189
/* Sending ACK / duplicate ACK */
166
- if (maybe_sendto (sockfd , ack_packet , sizeof (* ack_packet ), 0 , state .address , state .socklen ) == -1 ) {
190
+ if (sendto (sockfd , ack_packet , sizeof (* ack_packet ), 0 , state .address , state .socklen ) == -1 ) {
167
191
printf ("ERROR: ACK sending failed.\n" );
168
192
state .state = CLOSED ;
169
193
break ;
@@ -176,7 +200,7 @@ ssize_t gbn_recv(int sockfd, void *buf, size_t len, int flags){
176
200
printf ("INFO: Duplicate ACK has been sent.\n" );
177
201
}
178
202
}
179
- else if (packet -> type == FIN ){
203
+ else if (packet -> type == FIN ){
180
204
state .state = FIN_INIT ;
181
205
return 0 ;
182
206
}
@@ -195,15 +219,15 @@ ssize_t gbn_recv(int sockfd, void *buf, size_t len, int flags){
195
219
196
220
int gbn_close (int sockfd ){
197
221
198
- int retryCount = 1 ;
222
+ state . retry = 1 ;
199
223
int status = 0 ;
200
224
201
225
gbnhdr * fin_init_packet = malloc (sizeof (* fin_init_packet ));
202
226
gbnhdr * fin_packet = malloc (sizeof (* fin_packet ));
203
227
gbnhdr * fin_ack_packet = malloc (sizeof (* fin_ack_packet ));
204
228
205
- while (retryCount <= MAX_RETRY_ATTEMPTS && state .state != CLOSED ){
206
-
229
+ while (state . retry <= MAX_RETRY_ATTEMPTS && state .state != CLOSED ){
230
+ signal ( SIGALRM , handle_close_alarm );
207
231
if (state .state == ESTABLISHED ){
208
232
/* Sender to initiate connection teardown with FIN packet */
209
233
fin_packet -> type = FIN ;
@@ -214,12 +238,11 @@ int gbn_close(int sockfd){
214
238
if (status == -1 ){
215
239
printf ("ERROR: FIN send failed.Retrying ...\n" );
216
240
state .state = ESTABLISHED ;
217
- retryCount ++ ;
218
241
}else {
219
242
printf ("INFO: Connection teardown initiated ...\n" );
220
243
printf ("INFO: FIN successfully sent.\n" );
221
244
state .state = FIN_SENT ;
222
- retryCount = 1 ;
245
+ state . retry = 0 ;
223
246
}
224
247
}else if (state .state == FIN_INIT ){
225
248
printf ("INFO: Sender initiated FIN.\n" );
@@ -231,11 +254,10 @@ int gbn_close(int sockfd){
231
254
if (status == -1 ){
232
255
printf ("ERROR: FINACK send failed.Retrying ...\n" );
233
256
state .state = FIN_INIT ;
234
- retryCount ++ ;
235
257
}else {
236
258
printf ("INFO: FINACK successfully sent.\n" );
237
259
state .state = FIN_ACKED ;
238
- retryCount = 1 ;
260
+ state . retry = 1 ;
239
261
}
240
262
}else if (state .state == FIN_ACKED ){
241
263
/* receiver sends sender FIN packet */
@@ -247,11 +269,10 @@ int gbn_close(int sockfd){
247
269
if (status == -1 ){
248
270
printf ("ERROR: FIN send failed.Retrying ...\n" );
249
271
state .state = FIN_ACKED ;
250
- retryCount ++ ;
251
272
}else {
252
273
printf ("INFO: FIN successfully sent.\n" );
253
274
state .state = FIN_CONF ;
254
- retryCount = 1 ;
275
+ state . retry = 1 ;
255
276
}
256
277
}else if (state .state == FIN_CONF ){
257
278
/*Receiver waits for FINACK from Sender*/
@@ -271,7 +292,6 @@ int gbn_close(int sockfd){
271
292
}else {
272
293
printf ("ERROR: FINACK wasn't received. Retrying ...\n" );
273
294
state .state = FIN_CONF ;
274
- retryCount ++ ;
275
295
}
276
296
277
297
}else if (state .state == FIN_SENT ){
@@ -282,12 +302,8 @@ int gbn_close(int sockfd){
282
302
/*Sender gets FINACK from receiver*/
283
303
printf ("INFO: FINACK received successfully.\n" );
284
304
state .state = FIN_RCVD ;
285
- retryCount = 1 ;
305
+ state . retry = 1 ;
286
306
}
287
- }else {
288
- printf ("ERROR: FINACK wasn't received. Retrying ...\n" );
289
- state .state = FIN_SENT ;
290
- retryCount ++ ;
291
307
}
292
308
}else if (state .state == FIN_RCVD ){
293
309
/* Receiver sends a FIN */
@@ -304,7 +320,6 @@ int gbn_close(int sockfd){
304
320
if (status == -1 ){
305
321
printf ("ERROR: FINACK send failed.Retrying ...\n" );
306
322
state .state = FIN_RCVD ;
307
- retryCount ++ ;
308
323
}else {
309
324
printf ("INFO: FINACK successfully sent.\n" );
310
325
printf ("INFO: Connection terminated.\n" );
@@ -318,15 +333,15 @@ int gbn_close(int sockfd){
318
333
}else {
319
334
printf ("ERROR: FIN wasn't received. Retrying ...\n" );
320
335
state .state = FIN_RCVD ;
321
- retryCount ++ ;
322
336
}
323
337
}
324
338
}
339
+ alarm (5 );
325
340
}
326
341
327
342
free (fin_packet );
328
343
free (fin_ack_packet );
329
- if (retryCount <= MAX_RETRY_ATTEMPTS && state .state == CLOSED )
344
+ if (state . retry <= MAX_RETRY_ATTEMPTS && state .state == CLOSED )
330
345
return SUCCESS ;
331
346
332
347
printf ("ERROR: Maximum retries reached.\n" );
@@ -349,7 +364,7 @@ int gbn_connect(int sockfd, const struct sockaddr *server, socklen_t socklen){
349
364
syn_packet -> seqnum = 0 ;
350
365
syn_packet -> checksum = (uint16_t ) 0 ;
351
366
syn_packet -> checksum = checksum (syn_packet , sizeof (* syn_packet ) / sizeof (uint16_t ));
352
- status = maybe_sendto (sockfd , syn_packet , sizeof (* syn_packet ), 0 , server , socklen );
367
+ status = sendto (sockfd , syn_packet , sizeof (* syn_packet ), 0 , server , socklen );
353
368
if (status == -1 ){
354
369
printf ("ERROR: SYN send failed.Retrying ...\n" );
355
370
state .state = CLOSED ;
@@ -374,7 +389,7 @@ int gbn_connect(int sockfd, const struct sockaddr *server, socklen_t socklen){
374
389
ack_packet -> seqnum = 1 ;
375
390
ack_packet -> checksum = (uint16_t ) 0 ;
376
391
ack_packet -> checksum = checksum (ack_packet , sizeof (* ack_packet ) / sizeof (uint16_t ));
377
- status = maybe_sendto (sockfd , ack_packet , sizeof (* ack_packet ), 0 , server , socklen );
392
+ status = sendto (sockfd , ack_packet , sizeof (* ack_packet ), 0 , server , socklen );
378
393
if (status != -1 ){
379
394
state .state = ESTABLISHED ;
380
395
state .seqnum = ack_packet -> seqnum ;
@@ -465,7 +480,7 @@ int gbn_accept(int sockfd, struct sockaddr *client, socklen_t *socklen){
465
480
syn_ack_packet -> seqnum = 1 ;
466
481
syn_ack_packet -> checksum = (uint16_t ) 0 ;
467
482
syn_ack_packet -> checksum = checksum (syn_ack_packet , sizeof (* syn_ack_packet ) / sizeof (uint16_t ));
468
- status = maybe_sendto (sockfd , syn_ack_packet , sizeof (* syn_ack_packet ), 0 , client , * socklen );
483
+ status = sendto (sockfd , syn_ack_packet , sizeof (* syn_ack_packet ), 0 , client , * socklen );
469
484
if (status != -1 ){
470
485
printf ("INFO: SYN_ACK sent successfully.\n" );
471
486
free (syn_ack_packet );
0 commit comments