Skip to content

Commit 7296496

Browse files
committed
Giant 1 and Large 3 fail
1 parent 7d68f5f commit 7296496

File tree

5 files changed

+44
-29
lines changed

5 files changed

+44
-29
lines changed

go-back-n/gbn.c

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ void handle_alarm(int sig){
2121
* Reset current packet to the beginning of window
2222
* thus resending all paeckets in the window */
2323
printf("RETRY: %d\n",state.retry);
24-
if(state.retry<=5){
24+
if(state.retry<MAX_RETRY_ATTEMPTS){
2525
state.seq_curr=state.seq_base;
2626
state.retry++;
2727
state.win_size=1;
@@ -36,6 +36,24 @@ void handle_alarm(int sig){
3636
return;
3737
}
3838

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+
3957
ssize_t gbn_send(int sockfd, const void *buf, size_t len, int flags){
4058
state.win_size=1;
4159
state.retry=0;
@@ -68,20 +86,25 @@ ssize_t gbn_send(int sockfd, const void *buf, size_t len, int flags){
6886
reset_alrm=false;
6987
}
7088
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{
7396
data_packet->checksum = checksum(data_packet, sizeof(*data_packet) / sizeof(uint16_t));
7497
}
7598
printf("INFO: Checksum of packet: %d\n",data_packet->checksum);
7699

77100
if(state.seq_curr-1==packet_num){
78101
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);
80103
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);
82105
state.win_size=1;
83106
}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);
85108

86109
if(status==-1){
87110
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){
114137

115138

116139
}
140+
117141
return(0);
118142
}
119143

@@ -163,7 +187,7 @@ ssize_t gbn_recv(int sockfd, void *buf, size_t len, int flags){
163187
is_seq = false;
164188
}
165189
/* 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) {
167191
printf("ERROR: ACK sending failed.\n");
168192
state.state = CLOSED;
169193
break;
@@ -176,7 +200,7 @@ ssize_t gbn_recv(int sockfd, void *buf, size_t len, int flags){
176200
printf("INFO: Duplicate ACK has been sent.\n");
177201
}
178202
}
179-
else if (packet->type==FIN){
203+
else if (packet->type==FIN ){
180204
state.state=FIN_INIT;
181205
return 0;
182206
}
@@ -195,15 +219,15 @@ ssize_t gbn_recv(int sockfd, void *buf, size_t len, int flags){
195219

196220
int gbn_close(int sockfd){
197221

198-
int retryCount = 1;
222+
state.retry = 1;
199223
int status = 0;
200224

201225
gbnhdr *fin_init_packet=malloc(sizeof(*fin_init_packet));
202226
gbnhdr *fin_packet = malloc(sizeof(*fin_packet));
203227
gbnhdr *fin_ack_packet = malloc(sizeof(*fin_ack_packet));
204228

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);
207231
if(state.state == ESTABLISHED){
208232
/* Sender to initiate connection teardown with FIN packet */
209233
fin_packet->type = FIN;
@@ -214,12 +238,11 @@ int gbn_close(int sockfd){
214238
if(status == -1){
215239
printf("ERROR: FIN send failed.Retrying ...\n");
216240
state.state = ESTABLISHED;
217-
retryCount++;
218241
}else{
219242
printf("INFO: Connection teardown initiated ...\n");
220243
printf("INFO: FIN successfully sent.\n");
221244
state.state = FIN_SENT;
222-
retryCount = 1;
245+
state.retry = 0;
223246
}
224247
}else if(state.state==FIN_INIT){
225248
printf("INFO: Sender initiated FIN.\n");
@@ -231,11 +254,10 @@ int gbn_close(int sockfd){
231254
if(status == -1){
232255
printf("ERROR: FINACK send failed.Retrying ...\n");
233256
state.state = FIN_INIT;
234-
retryCount++;
235257
}else{
236258
printf("INFO: FINACK successfully sent.\n");
237259
state.state = FIN_ACKED;
238-
retryCount=1;
260+
state.retry=1;
239261
}
240262
}else if(state.state==FIN_ACKED){
241263
/* receiver sends sender FIN packet */
@@ -247,11 +269,10 @@ int gbn_close(int sockfd){
247269
if(status == -1){
248270
printf("ERROR: FIN send failed.Retrying ...\n");
249271
state.state = FIN_ACKED;
250-
retryCount++;
251272
}else{
252273
printf("INFO: FIN successfully sent.\n");
253274
state.state = FIN_CONF;
254-
retryCount = 1;
275+
state.retry = 1;
255276
}
256277
}else if(state.state==FIN_CONF){
257278
/*Receiver waits for FINACK from Sender*/
@@ -271,7 +292,6 @@ int gbn_close(int sockfd){
271292
}else{
272293
printf("ERROR: FINACK wasn't received. Retrying ...\n");
273294
state.state = FIN_CONF;
274-
retryCount++;
275295
}
276296

277297
}else if(state.state == FIN_SENT){
@@ -282,12 +302,8 @@ int gbn_close(int sockfd){
282302
/*Sender gets FINACK from receiver*/
283303
printf("INFO: FINACK received successfully.\n");
284304
state.state = FIN_RCVD;
285-
retryCount = 1;
305+
state.retry = 1;
286306
}
287-
}else{
288-
printf("ERROR: FINACK wasn't received. Retrying ...\n");
289-
state.state = FIN_SENT;
290-
retryCount++;
291307
}
292308
}else if(state.state == FIN_RCVD){
293309
/* Receiver sends a FIN */
@@ -304,7 +320,6 @@ int gbn_close(int sockfd){
304320
if(status == -1){
305321
printf("ERROR: FINACK send failed.Retrying ...\n");
306322
state.state = FIN_RCVD;
307-
retryCount++;
308323
}else{
309324
printf("INFO: FINACK successfully sent.\n");
310325
printf("INFO: Connection terminated.\n");
@@ -318,15 +333,15 @@ int gbn_close(int sockfd){
318333
}else{
319334
printf("ERROR: FIN wasn't received. Retrying ...\n");
320335
state.state = FIN_RCVD;
321-
retryCount++;
322336
}
323337
}
324338
}
339+
alarm(5);
325340
}
326341

327342
free(fin_packet);
328343
free(fin_ack_packet);
329-
if(retryCount <= MAX_RETRY_ATTEMPTS && state.state == CLOSED)
344+
if(state.retry <= MAX_RETRY_ATTEMPTS && state.state == CLOSED)
330345
return SUCCESS;
331346

332347
printf("ERROR: Maximum retries reached.\n");
@@ -349,7 +364,7 @@ int gbn_connect(int sockfd, const struct sockaddr *server, socklen_t socklen){
349364
syn_packet->seqnum = 0;
350365
syn_packet->checksum = (uint16_t) 0;
351366
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);
353368
if(status == -1){
354369
printf("ERROR: SYN send failed.Retrying ...\n");
355370
state.state = CLOSED;
@@ -374,7 +389,7 @@ int gbn_connect(int sockfd, const struct sockaddr *server, socklen_t socklen){
374389
ack_packet->seqnum = 1;
375390
ack_packet->checksum = (uint16_t) 0;
376391
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);
378393
if(status != -1){
379394
state.state = ESTABLISHED;
380395
state.seqnum=ack_packet->seqnum;
@@ -465,7 +480,7 @@ int gbn_accept(int sockfd, struct sockaddr *client, socklen_t *socklen){
465480
syn_ack_packet->seqnum = 1;
466481
syn_ack_packet->checksum = (uint16_t) 0;
467482
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);
469484
if(status != -1){
470485
printf("INFO: SYN_ACK sent successfully.\n");
471486
free(syn_ack_packet);

go-back-n/gbn.o

1.13 KB
Binary file not shown.

go-back-n/output

-9.95 MB
Binary file not shown.

go-back-n/receiver

48 Bytes
Binary file not shown.

go-back-n/sender

40 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)