From 2a443c48bde3ad11c17e31cbf66aff9e04acc7f2 Mon Sep 17 00:00:00 2001
From: fdai7354 <alan.muhemad@informatik.hs-fulda.de>
Date: Wed, 12 Feb 2025 11:30:31 +0100
Subject: [PATCH] CRC32 added

---
 Kernel/kernel_M.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/Kernel/kernel_M.c b/Kernel/kernel_M.c
index fcd60ec..67a1fa5 100644
--- a/Kernel/kernel_M.c
+++ b/Kernel/kernel_M.c
@@ -6,6 +6,7 @@
 #include <linux/cdev.h>       // For cdev
 #include <linux/device.h>     // For device_create, class_create
 #include <linux/slab.h>       // For kmalloc, kfree
+#include <linux/crc32.h>      // Include CRC32
 
 #define DEVICE_NAME "packet_receiver"
 #define CLASS_NAME  "packet_class"
@@ -51,6 +52,11 @@ static struct file_operations fops = {
     .release = packet_release,  //not used
 };
 
+// CRC32 Calculation Function
+static u32 calculate_crc32(const char *data, size_t len) {
+    return crc32(0, data, len);
+}
+
 // ====================== Device Open ======================
 static int packet_open(struct inode *inode, struct file *file) {
     printk(KERN_INFO "packet_receiver: Device opened.\n");
@@ -124,6 +130,17 @@ static ssize_t packet_write(struct file *filp, const char __user *buf, size_t le
     printk(KERN_INFO "  value_id_1=%d  value_1=\"%s\"\n", value_id_1, value_str_1);
     printk(KERN_INFO "  crc=0x%lX\n", crc_val);
 
+    // Calculate CRC32 for the received data excluding the CRC field
+    size_t crc_len = strrchr(recv_buffer, 'C') - recv_buffer;
+    u32 calculated_crc = calculate_crc32(recv_buffer, crc_len);
+
+    if (calculated_crc == received_crc) {
+        printk(KERN_INFO "packet_receiver: CRC check passed!\n");
+    } else {
+        printk(KERN_ERR "packet_receiver: CRC mismatch! Expected: 0x%08X, Received: 0x%08lX\n",
+               calculated_crc, received_crc);
+    }
+
     // Return the number of bytes written
     return len;
 }
-- 
GitLab