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