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