@@ -86,25 +86,20 @@ ssize_t gbn_send(int sockfd, const void *buf, size_t len, int flags){
86
86
reset_alrm = false;
87
87
}
88
88
if (state .seq_curr - 1 == packet_num && len %DATALEN > 0 ){
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 ));
89
+ data_packet -> checksum = checksum (data_packet , (len %DATALEN + sizeof (data_packet -> type )+ sizeof (data_packet -> seqnum )+ sizeof (data_packet -> checksum ) )/ sizeof (uint16_t ));
95
90
}else {
96
91
data_packet -> checksum = checksum (data_packet , sizeof (* data_packet ) / sizeof (uint16_t ));
97
92
}
98
93
printf ("INFO: Checksum of packet: %d\n" ,data_packet -> checksum );
99
94
100
95
if (state .seq_curr - 1 == packet_num ){
101
96
if (len %DATALEN > 0 )
102
- status = sendto (sockfd ,data_packet ,5 + len %DATALEN ,0 ,state .address ,state .socklen );
97
+ status = maybe_sendto (sockfd ,data_packet ,5 + len %DATALEN ,0 ,state .address ,state .socklen );
103
98
else
104
- status = sendto (sockfd ,data_packet ,sizeof (* data_packet ),0 ,state .address ,state .socklen );
99
+ status = maybe_sendto (sockfd ,data_packet ,sizeof (* data_packet ),0 ,state .address ,state .socklen );
105
100
state .win_size = 1 ;
106
101
}else if (state .seq_curr - 1 < packet_num )
107
- status = sendto (sockfd ,data_packet ,sizeof (* data_packet ),0 ,state .address ,state .socklen );
102
+ status = maybe_sendto (sockfd ,data_packet ,sizeof (* data_packet ),0 ,state .address ,state .socklen );
108
103
109
104
if (status == -1 ){
110
105
printf ("ERROR: DATA packet %d send failed.\n" ,state .seq_curr - 1 );
@@ -156,7 +151,7 @@ ssize_t gbn_recv(int sockfd, void *buf, size_t len, int flags){
156
151
if (status != -1 ){
157
152
uint16_t checksum_actual = packet -> checksum ;
158
153
packet -> checksum = (uint16_t ) 0 ;
159
- uint16_t checksum_expected = checksum (packet , sizeof ( * packet ) / sizeof (uint16_t ));
154
+ uint16_t checksum_expected = checksum (packet , status / sizeof (uint16_t ));
160
155
printf ("INFO: Expected checksum value : %d . Actual checksum value : %d\n" ,checksum_expected ,checksum_actual );
161
156
if (packet -> type == DATA ){
162
157
/* Sender has sent a DATA packet */
@@ -187,7 +182,7 @@ ssize_t gbn_recv(int sockfd, void *buf, size_t len, int flags){
187
182
is_seq = false;
188
183
}
189
184
/* Sending ACK / duplicate ACK */
190
- if (sendto (sockfd , ack_packet , sizeof (* ack_packet ), 0 , state .address , state .socklen ) == -1 ) {
185
+ if (maybe_sendto (sockfd , ack_packet , sizeof (* ack_packet ), 0 , state .address , state .socklen ) == -1 ) {
191
186
printf ("ERROR: ACK sending failed.\n" );
192
187
state .state = CLOSED ;
193
188
break ;
@@ -364,7 +359,7 @@ int gbn_connect(int sockfd, const struct sockaddr *server, socklen_t socklen){
364
359
syn_packet -> seqnum = 0 ;
365
360
syn_packet -> checksum = (uint16_t ) 0 ;
366
361
syn_packet -> checksum = checksum (syn_packet , sizeof (* syn_packet ) / sizeof (uint16_t ));
367
- status = sendto (sockfd , syn_packet , sizeof (* syn_packet ), 0 , server , socklen );
362
+ status = maybe_sendto (sockfd , syn_packet , sizeof (* syn_packet ), 0 , server , socklen );
368
363
if (status == -1 ){
369
364
printf ("ERROR: SYN send failed.Retrying ...\n" );
370
365
state .state = CLOSED ;
@@ -389,7 +384,7 @@ int gbn_connect(int sockfd, const struct sockaddr *server, socklen_t socklen){
389
384
ack_packet -> seqnum = 1 ;
390
385
ack_packet -> checksum = (uint16_t ) 0 ;
391
386
ack_packet -> checksum = checksum (ack_packet , sizeof (* ack_packet ) / sizeof (uint16_t ));
392
- status = sendto (sockfd , ack_packet , sizeof (* ack_packet ), 0 , server , socklen );
387
+ status = maybe_sendto (sockfd , ack_packet , sizeof (* ack_packet ), 0 , server , socklen );
393
388
if (status != -1 ){
394
389
state .state = ESTABLISHED ;
395
390
state .seqnum = ack_packet -> seqnum ;
@@ -480,7 +475,7 @@ int gbn_accept(int sockfd, struct sockaddr *client, socklen_t *socklen){
480
475
syn_ack_packet -> seqnum = 1 ;
481
476
syn_ack_packet -> checksum = (uint16_t ) 0 ;
482
477
syn_ack_packet -> checksum = checksum (syn_ack_packet , sizeof (* syn_ack_packet ) / sizeof (uint16_t ));
483
- status = sendto (sockfd , syn_ack_packet , sizeof (* syn_ack_packet ), 0 , client , * socklen );
478
+ status = maybe_sendto (sockfd , syn_ack_packet , sizeof (* syn_ack_packet ), 0 , client , * socklen );
484
479
if (status != -1 ){
485
480
printf ("INFO: SYN_ACK sent successfully.\n" );
486
481
free (syn_ack_packet );
0 commit comments