From ccba889757d4f5bd7a4261fa63774aa4bd09d7b0 Mon Sep 17 00:00:00 2001
From: sdemeesterde <samuel.demeester@student.uclouvain.be>
Date: Thu, 17 Mar 2022 20:01:17 +0100
Subject: [PATCH] sender handling crc now

---
 headers/packet_interface.h | 11 +++++++++++
 src/packet_interface.c     |  7 -------
 src/sender.c               | 30 +++++++++++++++++++++++++++---
 3 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/headers/packet_interface.h b/headers/packet_interface.h
index 0e66828..c4d5583 100644
--- a/headers/packet_interface.h
+++ b/headers/packet_interface.h
@@ -94,6 +94,17 @@ pkt_t* pkt_new();
  * ressources associées */
 void pkt_del(pkt_t*);
 
+
+/**
+ * @brief Calculates the CRC32
+ * 
+ * @param buffer    : The buffer on which to calculate CRC32.
+ * @param len       : The number of bytes of the buffer.
+ * @return uint32_t 
+ */
+uint32_t calculate_crc(const char * buffer, uint32_t len);
+
+
 /*
  * Retourne la longueur du header en bytes.
  */
diff --git a/src/packet_interface.c b/src/packet_interface.c
index 098ba94..6ca0328 100644
--- a/src/packet_interface.c
+++ b/src/packet_interface.c
@@ -13,13 +13,6 @@ void pkt_del(pkt_t *pkt)
     free(pkt);
 }
 
-/**
- * @brief Calculates the CRC32
- * 
- * @param buffer    : The buffer on which to calculate CRC32.
- * @param len       : The number of bytes of the buffer.
- * @return uint32_t 
- */
 uint32_t calculate_crc(const char * buffer, uint32_t len)
 {
     return (uint32_t) crc32(0L, (const void *) buffer, len);
diff --git a/src/sender.c b/src/sender.c
index 9073275..cffb22b 100644
--- a/src/sender.c
+++ b/src/sender.c
@@ -86,7 +86,11 @@ int main(int argc, char **argv) {
     }
 
     
-    // *** Step : Time for sending ***
+    // *** Step: Time for sending ***
+    pkt_t buffer[MAX_WINDOW_SIZE];
+    int buffer_space = MAX_WINDOW_SIZE;
+    int seqnum = 0;
+
     pkt_t *pkt = pkt_new();
     ssize_t nbr_byte_read = read(fd, pkt->payload, MAX_PAYLOAD_SIZE);
     while (nbr_byte_read > 0)
@@ -95,9 +99,29 @@ int main(int argc, char **argv) {
         pkt_set_type(pkt, PTYPE_DATA);
         pkt_set_length(pkt, nbr_byte_read);
         
-        ssize_t sent = send(socket_fd, pkt, PKT_MAX_LEN, 0);
+        // We set the TR to 0 in order to calculcate the CRC on the header
+        char modified_header[8];
+        memcpy((void *) &modified_header, (void *) &pkt->header, 8);
+        modified_header[0] = modified_header[0] & TR_SETTER_TO_ZERO;
+        uint32_t crc1 = htonl(calculate_crc(modified_header, 8));
+        pkt_set_crc1(pkt, crc1);
+
+        uint32_t crc2 = htonl(calculate_crc(pkt->payload, (uint32_t) pkt_get_length(pkt)));
+        pkt_set_crc2(pkt, crc2);
+
+        char paquet_to_be_sent[PKT_MAX_LEN];
+        if (pkt_encode(pkt, paquet_to_be_sent, PKT_MAX_LEN) != PKT_OK)
+        {
+            close(fd);
+            close(socket_fd);
+            ERROR("An error occured when trying to encode a paquet\n");
+            return EXIT_FAILURE;
+        }
+        
+        ssize_t sent = send(socket_fd, paquet_to_be_sent, PKT_MAX_LEN, 0);
         if (sent == -1)
         {
+            close(fd);
             close(socket_fd);
             ERROR("An error occured when trying to send a paquet\n");
             return EXIT_FAILURE;
@@ -108,7 +132,7 @@ int main(int argc, char **argv) {
         nbr_byte_read = read(fd, pkt->payload, MAX_PAYLOAD_SIZE);
     }
     pkt_del(pkt);
-    
+
     close(fd);
     close(socket_fd);
     return EXIT_SUCCESS;
-- 
GitLab