From 6491f22ec5e41c4d6e03a0f41972f72e002cc977 Mon Sep 17 00:00:00 2001
From: Teodor Adrian Miron <teodormiron75@gmail.com>
Date: Wed, 19 Mar 2025 10:23:25 +0200
Subject: [PATCH] lab2 and 3 finished

---
 common/link_emulator/link | Bin 0 -> 54664 bytes
 lab2/common.h             |   4 +-
 lab2/recv.c               | 113 +++++++++++++++++++++-----------------
 lab2/send.c               |  53 ++++++++++--------
 lab3/common.c             |  27 +++++----
 lab3/link_emulator.err    |   0
 lab3/link_emulator.out    |   0
 lab3/recv.c               |  31 +++++++++--
 lab3/send.c               |  31 +++++++++--
 9 files changed, 165 insertions(+), 94 deletions(-)
 create mode 100755 common/link_emulator/link
 create mode 100644 lab3/link_emulator.err
 create mode 100644 lab3/link_emulator.out

diff --git a/common/link_emulator/link b/common/link_emulator/link
new file mode 100755
index 0000000000000000000000000000000000000000..84cca1b8ed57ab973d6eeb5bcc1cd92ed980a4e4
GIT binary patch
literal 54664
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

literal 0
HcmV?d00001

diff --git a/lab2/common.h b/lab2/common.h
index 94b55bd..53e8c5c 100644
--- a/lab2/common.h
+++ b/lab2/common.h
@@ -6,8 +6,8 @@
 /* DELIM | DATE | DELIM */
 struct __attribute__((packed)) Frame {
     char frame_delim_start[2]; /* DLE STX */
-
-    /* TODO 2: Add source and destination */
+    int source;
+    int dest;
     char payload[30];  /* Datele pe care vrem sa le transmitem */
     char frame_delim_end[2]; /* DLE ETX */
 };
diff --git a/lab2/recv.c b/lab2/recv.c
index 3e6d72d..041fb58 100644
--- a/lab2/recv.c
+++ b/lab2/recv.c
@@ -16,68 +16,83 @@
 #define PORT 10001
 
 #include "common.h"
+#define BUFFER_SIZE 32
 
 /* Our unique layer 2 ID */
 static int ID = 123131;
 
+int recv_bytes(char *buffer, int length) {
+    int i = 0;
+    while (i < length) {
+        char c = recv_byte();
+        if (c == DLE) {
+            char next = recv_byte();
+            if (next == DLE) {
+                buffer[i++] = DLE;
+            } else {
+                return -1;
+            }
+        } else {
+            buffer[i++] = c;
+        }
+    }
+    return i; 
+}
+
 /* Function which our protocol implementation will provide to the upper layer. */
 int recv_frame(char *buf, int size)
 {
-	/* TODO 1.1: Call recv_byte() until we receive the frame start
-	 * delimitator. This operation makes this function blocking until it
-	 * receives a frame. */
-
-	/* TODO 2.1: The first two 2 * sizeof(int) bytes represent sender and receiver ID */
-
-	/* TODO 2.2: Check that the frame was sent to me */
-
-	/* TODO 1.2: Read bytes and copy them to buff until we receive the end of the frame */
+	char frame;
+	char frame2;
+
+	fprintf(stderr, "1\n");
+	frame = recv_byte();
+	fprintf(stderr, "2\n");
+	frame2 = recv_byte();
+	fprintf(stderr, "3\n");
+
+	while( ((frame != DLE) && (frame2 != STX)) || (frame == DLE && frame2 != STX)
+        || (frame != DLE && frame2 == STX)) {
+		frame = frame2;
+		frame2 = recv_byte();
+	}
 
-	/* If everything went well return the number of bytes received */
-	return 0;
+	int source;
+	int dest;
+	(void) source;
+	recv_bytes((char *)&source, sizeof(int));
+    recv_bytes((char *)&dest, sizeof(int));
+	if (dest != ID) {
+        fprintf(stderr, "skipping\n");
+        return -1;
+    }
+
+	int i;
+	for (i = 0; i < size; i++) {
+		char byte = recv_byte();
+		if (byte == DLE) {
+			char next = recv_byte();
+			if (next == ETX) {
+				buf[i] = '\0';
+				break;
+			} else if (next == DLE) {
+				buf[i] = DLE;
+			} else {
+				return -1;
+			}
+		} else {
+			buf[i] = byte;
+		}
+	}
+	return i;
 }
 
 int main(int argc,char** argv){
-	/* Don't modify this */
 	init(HOST,PORT);
 
-        // TODO remove these recives, whih are hardcoded to receive a "Hello"
-	// message, and replace them with code that can receive any message.
-	char c;
-
-	/* Wait for the start of a frame */
-	char c1,c2;
-	c1 = recv_byte();
-	c2 = recv_byte();
-
-	/* Cat timp nu am primit DLE STX citim bytes */
-	while((c1 != DLE) && (c2 != STX)) {
-		c1 = c2;
-		c2 = recv_byte();
-	}
-
-
-	printf("%d ## %d\n",c1, c2);
-	c = recv_byte();
-	printf("%c\n", c);
-
-	c = recv_byte();
-	printf("%c\n", c);
-
-	c = recv_byte();
-	printf("%c\n", c);
-
-	c = recv_byte();
-	printf("%c\n", c);
-
-	c = recv_byte();
-	printf("%c\n", c);
-
-	c = recv_byte();
-	printf("%c\n", c);
-
-	/* TODO 1.0: Allocate a buffer and call recv_frame */
-
+	char buffer[BUFFER_SIZE];
+	recv_frame(buffer, BUFFER_SIZE);
+	printf("%s\n", buffer);
 
 	/* TODO 3: Measure latency in a while loop for any frame that contains
 	 * a timestamp we receive, print frame_size and latency */
diff --git a/lab2/send.c b/lab2/send.c
index 7e70a31..e817e30 100644
--- a/lab2/send.c
+++ b/lab2/send.c
@@ -22,21 +22,38 @@
 
 /* Our unqiue layer 2 ID */
 static int ID = 123131;
+#define BUFFER_SIZE 32
 
 /* Function which our protocol implementation will provide to the upper layer. */
 int send_frame(char *buf, int size)
 {
 
 	/* TODO 1.1: Create a new frame. */
-
+	struct Frame *new_frame = (struct Frame *)malloc(sizeof(struct Frame));
+	new_frame->frame_delim_start[0] = DLE;
+	new_frame->frame_delim_start[1] = STX;
 	/* TODO 1.2: Copy the data from buffer to our frame structure */
-
-	/* TODO 2.1: Set the destination and source */
-
-	/* TODO 1.3: We can cast the frame to a char *, and iterate through sizeof(struct Frame) bytes
-	 calling send_bytes. */
-
-	/* if all went all right, return 0 */
+	if (size > sizeof(new_frame->payload)) {
+        fprintf(stderr, "buffer size exceeds payload size\n");
+        free(new_frame);
+        return -1;
+    }
+	memcpy(new_frame->payload, buf, size);
+	new_frame->frame_delim_end[0] = DLE;
+	new_frame->frame_delim_end[1] = ETX;	
+	
+	new_frame->source = ID;
+	new_frame->dest = ID;
+
+	char *frame = (char *)new_frame;
+	int size_of_frame = sizeof(struct Frame);
+	for (int i = 0; i < size_of_frame; i++) {
+		if (frame[i] == DLE) {
+			send_byte(DLE);
+		}
+		send_byte(frame[i]);
+	}
+	free(new_frame);
 	return 0;
 }
 
@@ -44,22 +61,10 @@ int main(int argc,char** argv){
 	// Don't touch this
 	init(HOST,PORT);
 
-	// TODO remove these sends, whih are hardcoded to send a "Hello"
-	// message, and replace them with code that can send any message.
-	/* Send Hello */
-	send_byte(DLE);
-	send_byte(STX);
-	send_byte('H');
-	send_byte('e');
-	send_byte('l');
-	send_byte('l');
-	send_byte('o');
-	send_byte('!');
-	send_byte(DLE);
-	send_byte(ETX);
-
-	/* TODO 1.0: Get some input in a buffer and call send_frame with it */
-
+	char buffer[BUFFER_SIZE];
+	fgets(buffer, BUFFER_SIZE, stdin);
+	int length = strlen(buffer);
+	send_frame(buffer, length - 1);
 	/* TODO 3.1: Get a timestamp of the current time copy it in the the payload */
 
 	/* TODO 3.0: Update the maximum size of the payload in Frame to 100 (in common.h), send the frame */
diff --git a/lab3/common.c b/lab3/common.c
index 6ace0f1..81fe35c 100644
--- a/lab3/common.c
+++ b/lab3/common.c
@@ -1,26 +1,33 @@
 #include "common.h"
+#include <arpa/inet.h>
 
 uint8_t simple_csum(uint8_t *buf, size_t len) {
 
 	/* TODO 1.1: Implement the simple checksum algorithm */
 	uint8_t sum = 0;
-
-	for (int i = 0; i < len; i++) {
+	
+	for (size_t i = 0; i < len; i++) {
 		sum += buf[i];
 	}
-
 	return sum;
 }
 
 uint32_t crc32(uint8_t *buf, size_t len)
 {
 	/* TODO 2.1: Implement the CRC 32 algorithm */
+	uint32_t crc = ~0;
+	const uint32_t POLY = 0xEDB88320;
 
-	/* Iterate through each byte of buff */
-	
-		/* Iterate through each bit */
-		/* If the bit is 1, compute the new reminder */
-
-	/* By convention, we negate the crc */
-	return 0;
+	for (size_t i = 0; i < len; i++) {
+		crc = crc ^ buf[i];
+		for (size_t j = 0; j < 8; j++) {
+			if (crc & 1) {
+				crc = (crc >> 1) ^ POLY;
+			} else {
+				crc = (crc >> 1);
+			}
+		}
+	}
+	crc = ~crc;
+	return crc;
 }
diff --git a/lab3/link_emulator.err b/lab3/link_emulator.err
new file mode 100644
index 0000000..e69de29
diff --git a/lab3/link_emulator.out b/lab3/link_emulator.out
new file mode 100644
index 0000000..e69de29
diff --git a/lab3/recv.c b/lab3/recv.c
index 84f3e99..7be817a 100644
--- a/lab3/recv.c
+++ b/lab3/recv.c
@@ -7,6 +7,7 @@
 #include "common.h"
 #include "link_emulator/lib.h"
 #include "include/utils.h"
+#include <inttypes.h>
 
 /**
  * You can change these to communicate with another colleague.
@@ -27,21 +28,41 @@ int main(int argc,char** argv) {
 	/* Receive the frame from the link */
 	int len = link_recv(&t, sizeof(struct l3_msg));
 	DIE(len < 0, "Receive message");
-
 	/* We have to convert it to host order */
+	uint32_t temp = t.hdr.sum;
 	uint32_t recv_sum = ntohl(t.hdr.sum);
-	t.hdr.sum = 0;
-	int sum_ok = (simple_csum((void *) &t, sizeof(struct l3_msg)) == recv_sum);
+	//int sum_ok = (simple_csum((void *) &t, sizeof(struct l3_msg)) == recv_sum);
 	/* TODO 2: Change to crc32 */
-
+	t.hdr.sum = 0;
+	int ok_sum = (crc32((uint8_t *) &t, sizeof(struct l3_msg)) == recv_sum);
 	/* Since we are sending messages with a payload of 1500 - sizeof(header), most of the times the bytes from
 	 * 30 - 1500 will be corrupted and thus when we are printing or string message "Hello world" we see no probems.
 	 * This will be visible when we will be sending a file */
 
-	printf("[RECV] len=%d; sum(%s)=0x%04hx; payload=\"%s\";\n", t.hdr.len, sum_ok ? "GOOD" : "BAD", recv_sum, t.payload);
+	printf("[RECV] len=%d; sum(%s)=0x%04x; payload=\"%s\";\n", t.hdr.len, ok_sum ? "GOOD" : "BAD", recv_sum, t.payload);
 
 	/* TODO 3.1: In a loop, recv a frame and check if the CRC is good */
+	while (true) {
+		link_recv(&t, sizeof(struct l3_msg));
+		uint32_t recieved_sum = ntohl(t.hdr.sum);
+		t.hdr.sum = 0;
+		int sum_good = (crc32((uint8_t *) &t, sizeof(struct l3_msg)) == recieved_sum);
+		if (!sum_good) {
+			struct l3_msg nack_msg;
+			memset(&nack_msg, 0, sizeof(struct l3_msg));
+			strcpy(nack_msg.payload, "NACK");
+			nack_msg.hdr.len = strlen(nack_msg.payload);
+			nack_msg.hdr.sum = htonl(crc32((uint8_t *)&nack_msg, sizeof(struct l3_msg)));
+			link_send(&nack_msg, sizeof(struct l3_msg));
+		} else {
+			printf("[RECV] len=%d; sum(%s)=0x%04hx; payload=\"%s\";\n", t.hdr.len, sum_good ? "GOOD" : "BAD", recieved_sum, t.payload);
+			FILE *file = fopen("recv.data", "a");
+			DIE(file == NULL, "Failed to open recv.data");
 
+			fwrite(t.payload, 1, t.hdr.len, file);
+			fclose(file);
+		}
+	}
 	/* TODO 3.2: If the crc is bad, send a NACK frame */
 
 	/* TODO 3.2: Otherwise, write the frame payload to a file recv.data */
diff --git a/lab3/send.c b/lab3/send.c
index c9f4e5b..dd7c8d7 100644
--- a/lab3/send.c
+++ b/lab3/send.c
@@ -30,17 +30,40 @@ int main(int argc,char** argv) {
 	t.hdr.sum = 0;
 
 	/* Since sum is on 32 bits, we have to convert it to network order */
-	t.hdr.sum = htonl(simple_csum((void *) &t, sizeof(struct l3_msg)));
-
+	//t.hdr.sum = htonl(simple_csum((void *) &t, sizeof(struct l3_msg)));
+	uint32_t temp = crc32((uint8_t *) &t, sizeof(struct l3_msg));
+	printf("[SEND] len=%d; sum=0x%04x; payload=\"%s\";\n", t.hdr.len, temp, t.payload);
 	/* TODO 2.0: Call crc32 function */
-
+	t.hdr.sum = htonl(temp);
+	
 	/* Send the message */
 	link_send(&t, sizeof(struct l3_msg));
 
 	/* TODO 3.1: Receive the confirmation */
-
 	/* TODO 3.2: If we received a NACK, retransmit the previous frame */
+	struct l3_msg recv;
+	link_recv(&recv, sizeof(struct l3_msg));
+	while (strcmp(recv.payload, "NACK") == 0) {
+		link_send(&t, sizeof(struct l3_msg));
+		link_recv(&recv, sizeof(struct l3_msg));
+	}
+	
+	FILE *f;
+	f = fopen("input.txt", "rb");
+	size_t bytes_read;
+	while ((bytes_read = fread(t.payload, 1, 1500, f)) > 0) {
+		t.hdr.len = bytes_read;
+		t.hdr.sum = 0;
+		t.hdr.sum = htonl(crc32((uint8_t *) &t, sizeof(struct l3_msg)));
+		link_send(&t, sizeof(struct l3_msg));
+		link_recv(&recv, sizeof(struct l3_msg));
+		while (strcmp(recv.payload, "NACK") == 0) {
+			link_send(&t, sizeof(struct l3_msg));
+			link_recv(&recv, sizeof(struct l3_msg));
+		}
 
+	}
+	fclose(f);
 	/* TODO 3.3: Update this to read the content of a file and send it as
 	 * chunks of that file given a MTU of 1500 bytes */
 
-- 
GitLab