diff --git a/headers/sender_utils.h b/headers/sender_utils.h index a723d245440bc831096379cfc46d89167bee1116..e6b3359794dfac3951c913b9bfcb3ca6102e1623 100644 --- a/headers/sender_utils.h +++ b/headers/sender_utils.h @@ -30,7 +30,7 @@ typedef struct state { pkt_t *buffer[WINDOW_SIZE]; uint8_t head; // place last element insert +1 in the buffer (free place) uint8_t tail; // place oldest element insert in the buffer - uint8_t last_sent_seqnum; + uint8_t next_seqnum; uint8_t map_seqnum_to_buffer_place[SEQNUM_RANGE]; } sender_state_t; diff --git a/log.tx b/log.tx new file mode 100644 index 0000000000000000000000000000000000000000..bd306f91425c0a9be3415d5a8a4f3b700c4c5784 Binary files /dev/null and b/log.tx differ diff --git a/log.txt b/log.txt new file mode 100644 index 0000000000000000000000000000000000000000..c46e8c3e7e45a68de72ac17adf3281936e3f1060 Binary files /dev/null and b/log.txt differ diff --git a/src/sender.c b/src/sender.c index 7e908b9c3a8564219dc3ac30ebf956e0d2c10eb6..d8751fd976a4b2f645108478c95caba3d839ae33 100644 --- a/src/sender.c +++ b/src/sender.c @@ -126,6 +126,7 @@ int main(int argc, char **argv) { if (pfd->revents & POLLIN) { + DEBUG("The sender is reading from the socket"); ack_received_done = handle_returning_ack_nack(state, socket_fd); rvalue = loop_over_timers(state, socket_fd); if ((ack_received_done == -1) || (rvalue == -1)) @@ -138,6 +139,7 @@ int main(int argc, char **argv) { } else if ( !(sending_file_read_done) && (pfd->revents & POLLOUT) ) { + DEBUG("The sender will send a pkt on the socket"); sending_file_read_done = read_and_send(state, sending_fd, socket_fd); if (sending_file_read_done == -1) { diff --git a/src/sender_utils.c b/src/sender_utils.c index 1c7531e81f1ae2e2b344f0f811aeb07f63f2d8e9..e30695c3f25b6bf0ef67a1338515dd4f9c5e31c0 100644 --- a/src/sender_utils.c +++ b/src/sender_utils.c @@ -45,22 +45,22 @@ int handle_returning_ack_nack(sender_state_t *state, int socket_fd) return 0; } // From here we consider a valid ack - DEBUG("The ACK of: %d has been received", pkt_get_seqnum(pkt)); + DEBUG("The ACK with the seqnum: %d has been received", pkt_get_seqnum(pkt)); uint8_t place = state->map_seqnum_to_buffer_place[pkt_get_seqnum(pkt)]; pkt_del(state->buffer[place]); state->buffer[place] = NULL; + state->r_window_size = pkt_get_window(pkt); if (place == state->tail) { - for (uint8_t i = place; (state->buffer[i] == NULL) && place != state->head; i++) + for (uint8_t i = place; (state->buffer[i] == NULL) && i != state->head; i++) { state->tail++; state->s_window_size++; } - } pkt_del(pkt); - return 0; + return state->s_window_size == MAX_WINDOW_SIZE; } int loop_over_timers(sender_state_t *state, int socket_fd) @@ -98,7 +98,6 @@ int read_and_send(sender_state_t *state, int sending_fd, int socket_fd) if ((state->r_window_size == 0) || (state->s_window_size == 0)) return 0; state->s_window_size--; - state->last_sent_seqnum = (uint8_t) (((uint16_t) state->last_sent_seqnum) + 1) % SEQNUM_RANGE; // Careful we need to convert to uint16_t to avoid overflow pkt_t *pkt = pkt_new(); ssize_t nbr_byte_read = read(sending_fd, pkt->payload, MAX_PAYLOAD_SIZE); @@ -106,7 +105,7 @@ int read_and_send(sender_state_t *state, int sending_fd, int socket_fd) pkt_set_tr(pkt, 0); pkt_set_window(pkt, state->s_window_size); pkt_set_length(pkt, nbr_byte_read); - pkt_set_seqnum(pkt, state->last_sent_seqnum); + pkt_set_seqnum(pkt, state->next_seqnum); pkt_set_timestamp(pkt, 0); // We're free to use as we want // We set the TR to 0 in order to calculcate the CRC on the header @@ -134,6 +133,7 @@ int read_and_send(sender_state_t *state, int sending_fd, int socket_fd) state->map_seqnum_to_buffer_place[pkt_get_seqnum(pkt)] = state->head; state->head = (state->head + 1) % WINDOW_SIZE; + state->next_seqnum = (uint8_t) (((uint16_t) state->next_seqnum) + 1) % SEQNUM_RANGE; // Careful we need to convert to uint16_t to avoid overflow DEBUG("The pkt with seqnum: %d has been sent", pkt_get_seqnum(pkt)); // Checking if we're at the end of the file