From 0cafa5947d0fee3cea802d5c88c0689bc67097d5 Mon Sep 17 00:00:00 2001 From: sdemeesterde <samuel.demeester@student.uclouvain.be> Date: Sun, 20 Mar 2022 23:13:49 +0100 Subject: [PATCH] version without fec almost done (sender) --- headers/sender_utils.h | 4 +--- src/sender.c | 18 +++++++++--------- src/sender_utils.c | 39 +++++++++++++++++++++++++++++---------- 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/headers/sender_utils.h b/headers/sender_utils.h index 69e99e1..a723d24 100644 --- a/headers/sender_utils.h +++ b/headers/sender_utils.h @@ -30,8 +30,8 @@ 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_ack_seqnum; uint8_t last_sent_seqnum; + uint8_t map_seqnum_to_buffer_place[SEQNUM_RANGE]; } sender_state_t; sender_state_t *state_new(); @@ -44,7 +44,5 @@ int loop_over_timers(sender_state_t *state, int socket_fd); int read_and_send(); -int handle_returning_pkt(); - #endif \ No newline at end of file diff --git a/src/sender.c b/src/sender.c index 7bad395..7e908b9 100644 --- a/src/sender.c +++ b/src/sender.c @@ -49,7 +49,7 @@ int main(int argc, char **argv) { DEBUG_DUMP("Some bytes", 11); // You can use it with any pointer type // This is not an error per-se. - ERROR("Sender has following arguments: \n\tfilename is %s,\n\t stats_filename is %s,\n\t fec_enabled is %d,\n\t receiver_ip is %s,\n\t receiver_port is %u\n", + ERROR("Sender has following arguments: \n\t\tfilename is %s,\n\t\tstats_filename is %s,\n\t\tfec_enabled is %d,\n\t\treceiver_ip is %s,\n\t\treceiver_port is %u", filename, stats_filename, fec_enabled, receiver_ip, receiver_port); DEBUG("You can only see me if %s", "you built me using `make debug`"); @@ -64,7 +64,7 @@ int main(int argc, char **argv) { struct sockaddr_in6 receiver_addr; if (real_address(receiver_ip, &receiver_addr) != NULL) { - ERROR("An error occured when computing the real address from ip\n"); + ERROR("An error occured when computing the real address from ip"); return EXIT_FAILURE; } @@ -73,7 +73,7 @@ int main(int argc, char **argv) { if (socket_fd == -1) { close(socket_fd); - ERROR("An error occured when sender trying to create its connecting socket\n"); + ERROR("An error occured when sender trying to create its connecting socket"); return EXIT_FAILURE; } @@ -82,7 +82,7 @@ int main(int argc, char **argv) { if (sending_fd == -1) { close(socket_fd); - ERROR("An error occured while trying to open the file\n"); + ERROR("An error occured while trying to open the file"); return EXIT_FAILURE; } @@ -93,7 +93,7 @@ int main(int argc, char **argv) { { close(socket_fd); close(sending_fd); - ERROR("Calloc failed for pfd\n"); + ERROR("Calloc failed for pfd"); return EXIT_FAILURE; } @@ -106,7 +106,7 @@ int main(int argc, char **argv) { { close(socket_fd); close(sending_fd); - ERROR("Calloc failed for state\n"); + ERROR("Calloc failed for state"); return EXIT_FAILURE; } @@ -120,7 +120,7 @@ int main(int argc, char **argv) { { close(socket_fd); close(sending_fd); - ERROR("poll function failed\n"); + ERROR("poll function failed"); return EXIT_FAILURE; } @@ -132,7 +132,7 @@ int main(int argc, char **argv) { { close(socket_fd); close(sending_fd); - ERROR("handle_returning_pkt or loop_over_timers function failed\n"); + ERROR("handle_returning_pkt or loop_over_timers function failed"); return EXIT_FAILURE; } } @@ -143,7 +143,7 @@ int main(int argc, char **argv) { { close(socket_fd); close(sending_fd); - ERROR("read_and_send function failed\n"); + ERROR("read_and_send function failed"); return EXIT_FAILURE; } } diff --git a/src/sender_utils.c b/src/sender_utils.c index 79856b6..1c7531e 100644 --- a/src/sender_utils.c +++ b/src/sender_utils.c @@ -35,8 +35,29 @@ int handle_returning_ack_nack(sender_state_t *state, int socket_fd) pkt_status_code pkt_status = pkt_decode(buffer, read_bytes, pkt); if (pkt_status != PKT_OK) { - DEBUG("Decode function on a received pkt failed with status: %d", pkt_status); - return -1; + DEBUG("Decode function on a received pkt failed with status: %d so we discard the pkt", pkt_status); + return 0; + } + // TODO: what about the nack ?? + if (pkt_get_type(pkt) == PTYPE_NACK) + { + DEBUG("Discard a NACK"); + return 0; + } + // From here we consider a valid ack + DEBUG("The ACK of: %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; + + if (place == state->tail) + { + for (uint8_t i = place; (state->buffer[i] == NULL) && place != state->head; i++) + { + state->tail++; + state->s_window_size++; + } + } pkt_del(pkt); return 0; @@ -52,10 +73,9 @@ int loop_over_timers(sender_state_t *state, int socket_fd) // The slot contains a sended packet if (state->buffer[i] != NULL) { - // When timer is over, we send back the packet + // When the timer is over, we send the packet back if ((curr_time - state->timers[i]) >= TIMER_LIMIT) { - DEBUG("A packet is sent back"); pkt_t *pkt = state->buffer[i]; char packet_to_be_sent[PKT_MAX_LEN]; size_t len = PKT_MAX_LEN; @@ -65,6 +85,7 @@ int loop_over_timers(sender_state_t *state, int socket_fd) if (sent == -1) return -1; state->timers[i] = curr_time; + DEBUG("The pkt with seqnum: %d has been sent back", pkt_get_seqnum(pkt)); } } } @@ -73,7 +94,7 @@ int loop_over_timers(sender_state_t *state, int socket_fd) int read_and_send(sender_state_t *state, int sending_fd, int socket_fd) { - + // Checking if both the sender and receiver buffer has some room left if ((state->r_window_size == 0) || (state->s_window_size == 0)) return 0; state->s_window_size--; @@ -110,8 +131,11 @@ int read_and_send(sender_state_t *state, int sending_fd, int socket_fd) struct timeval time; gettimeofday(&time, NULL); state->timers[state->head] = time.tv_usec; + state->map_seqnum_to_buffer_place[pkt_get_seqnum(pkt)] = state->head; state->head = (state->head + 1) % WINDOW_SIZE; + DEBUG("The pkt with seqnum: %d has been sent", pkt_get_seqnum(pkt)); + // Checking if we're at the end of the file off_t old_position = lseek(sending_fd, 0, SEEK_CUR); off_t end_position = lseek(sending_fd, 0, SEEK_END); @@ -119,8 +143,3 @@ int read_and_send(sender_state_t *state, int sending_fd, int socket_fd) lseek(sending_fd, 0, SEEK_SET); return old_position == end_position; } - -int handle_returning_pkt() -{ - return 0; -} \ No newline at end of file -- GitLab